2011-03-09 4 views
3

J'essaie de gérer certaines machines virtuelles via la vboxapi fournie avec le SDK. Jusqu'ici, j'ai réussi à lancer la VM et à l'éteindre, mais je ne suis pas capable de restaurer l'instantané. On dirait que la mise hors tension procédure verrouille la machine virtuelle jusqu'à ce que les scripts se termine, en effet c'est l'erreur que je reçois:Instantané de restauration de l'API VirtualBox Python

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

Et suivant est les fonctions spécifiques que j'appelle successivement arrêter vm et restaurer instantané.

 
    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

Je pense que je manque probablement quelque chose, n'importe quelle idée de ce que c'est? Merci, C.

Répondre

2

Si vous POWERDOWN la machine, vous devez créer un nouvel objet iConsole pour restaurer l'instantané. Dans votre code, vous pouvez ajouter ces lignes avant de restaurer l'instantané.

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

Dans le SDK: Un objet de la console est créée lorsqu'une machine a été verrouillé pour une session particulière (processus client ) en utilisant iMachine :: lockMachine() ou iMachine :: launchVMProcess().

twitter @dsanchezlavado

0

Vous devez verrouiller la machine d'abord pour que l'objet de la console se crée pour vous.