VirtualBox Python API восстановление снимка - PullRequest
3 голосов
/ 10 марта 2011

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

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

И ниже приведены конкретные функции, которые я последовательно вызываю, чтобы остановить vm и восстановить снимок.

    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

Я думаю, что, возможно, что-то упустил, есть хоть какой-то ключ к пониманию того, что это такое? Спасибо, C.

Ответы [ 2 ]

2 голосов
/ 19 апреля 2011

Если вы выключили питание машины, вам нужно создать новый объект 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 ().

twitter @ dsanchezlavado

0 голосов
/ 28 января 2015

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

...