VirtualBox Python API восстанавливает моментальный снимок

Я пытаюсь управлять некоторыми виртуальными машинами через vboxapi, поставляемый с SDK. Пока мне удалось запустить виртуальную машину и выключить ее, но я не могу восстановить снимок. Похоже, что процедура отключения питания блокирует виртуальную машину до тех пор, пока сценарии не завершатся, на самом деле это ошибка, которую я получаю:

    progress = self.session.console.restoreSnapshot(self.mach.currentSnapshot)
  File "", line 3, in restoreSnapshot
xpcom.Exception: 0x80070005 (The object is not ready)

Ниже приведены конкретные функции, которые я последовательно вызываю для остановки виртуальной машины и восстановления моментального снимка.

    def stop(self):
        if self.mach:
            # Poweroff the virtual machine.
            progress = self.session.console.powerDown()
            # Wait for task to complete with a 60 seconds timeout.
            progress.waitForCompletion(VIRTUALBOX_TIMEOUT)
            # Check if poweroff was successful.
            if progress.resultCode != 0:
                log("[Virtual Machine] [PowerOff] [ERROR] Unable to poweroff virtual machine \"%s\"." % self.mach.name)
                return False
            else:
                log("[Virtual Machine] [PowerOff] Virtual machine \"%s\" powered off successfully." % self.mach.name)
        else:
            log("[Virtual Machine] [PowerOff] [ERROR] No virtual machine handle.")
            return False

        return True

    def restore_snapshot(self):
        if self.mach:
            # Restore virtual machine snapshot.
            progress = self.session.console.restoreSnapshot(self.mach.currentSnapshot)
            # Wait for task to complete with a 60 seconds timeout.
            progress.waitForCompletion(VIRTUALBOX_TIMEOUT)
            # Check if snapshot restoring was successful.
            if progress.resultCode != 0:
                log("[Virtual Machine] [Restore Snapshot] [ERROR] Unable to restore virtual machine \"%s\" snapshot." % self.mach.name)
                return False
            else:
                log("[Virtual Machine] [Restore Snapshot] Virtual machine \"%s\" successfully restored to current snashot." % self.mach.name)
        else:
            log("[Virtual Machine] [Restore Snapshot] [ERROR] No virtual machine handle.")
            return False

        return True

Я думаю, что я, вероятно, что-то упускаю, есть какие-нибудь подсказки, что это такое? Спасибо, Ц.


person Claudio    schedule 09.03.2011    source источник


Ответы (2)


Если вы выключите машину, вам придется создать новый объект IConsole для восстановления моментального снимка. В свой код вы можете добавить эти строки перед восстановлением моментального снимка.

def restore_snapshot(self):
    if self.mach:
         self.mach.lockMachine(self.session,1)
         console = self.session.console
         progress = console.restoreSnapshot(self.mach.currentSnapshot)

В SDK: объект консоли создается, когда компьютер блокируется для определенного сеанса (клиентский процесс) с помощью IMachine::lockMachine() или IMachine::launchVMProcess().

Твиттер @dsanchezlavado

person DSL    schedule 19.04.2011

Сначала вам нужно заблокировать машину, чтобы объект консоли был создан для вас.

person AhlyM    schedule 28.01.2015