Bagaimana cara mengembalikan snapshot VM dengan Pyvmomi?

Saya telah bermain-main dengan pengikatan Python resmi untuk vSphere Pyvmomi (https://github.com/vmware/pyvmomi) Saya telah berhasil mendapatkan contoh kode yang berfungsi untuk menghidupkan vm, tetapi saya ingin mengembalikan vm terlebih dahulu ke snapshot tertentu sebelum dihidupkan. Ada ide bagaimana caranya mengerjakan ini? Inilah yang berhasil sejauh ini.

def main():

   args = GetArgs()
   if args.password:
      password = args.password
   else:
      password = getpass.getpass(prompt='Enter password for host %s and user %s: ' % (args.host,args.user))

   try:
      vmnames = args.vmname
      if not len(vmnames):
         print("No virtual machine specified for poweron")
         sys.exit()

      si = None
      context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
      context.verify_mode = ssl.CERT_NONE
      try:
         si = SmartConnect(host=args.host,
                           user=args.user,
                           pwd=password,
                           port=int(args.port),
                           sslContext=context)
      except IOError:
         pass
      if not si:
         print("Cannot connect to specified host using specified username and password")
         sys.exit()

      atexit.register(Disconnect, si)

      # Retreive the list of Virtual Machines from the inventory objects
      # under the rootFolder
      content = si.content
      objView = content.viewManager.CreateContainerView(content.rootFolder,
                                                        [vim.VirtualMachine],
                                                        True)
      vmList = objView.view
      objView.Destroy()

      #Code to list all available snapshots but not working
      #snap_info = [vm.snapshot for vm in vmList if vm.name in vmnames]

      #tree = snap_info.rootSnapshotList
      #while tree[0].childSnapshotList is not None:
      #    print("Snap: {0} => {1}".format(tree[0].name, tree[0].description))
      #    if len(tree[0].childSnapshotList) < 1:
      #        break
      #    tree = tree[0].childSnapshotList

      # Find the vm and power it on
      tasks = [vm.PowerOn() for vm in vmList if vm.name in vmnames]

      print("Virtual Machine(s) have been powered on successfully")
   except vmodl.MethodFault as e:
      print("Caught vmodl fault : " + e.msg)
   except Exception as e:
      print("Caught Exception : " + str(e))

# Start program
if __name__ == "__main__":
   main()

person bearaman    schedule 08.04.2016    source sumber


Jawaban (3)


Anda dapat mencoba membuat tugas seperti itu:

    snapshot_name = 'snapshot_name2' # snapshot name
    for vm in vmList:
        if vm.name in vmnames:
            snapshots = vm.snapshot.rootSnapshotList
            for snapshot in snapshots:
                    if snapshot_name == snapshot.name:
                        snap_obj = snapshot.snapshot
                        print ("Reverting snapshot ", snapshot.name)
                        task = [snap_obj.RevertToSnapshot_Task()]
                        WaitForTasks(task, si)
person Ilya Lebedev    schedule 14.04.2016
comment
Terima kasih banyak! Itulah yang saya cari - person Boris Modylevsky; 14.07.2016

Jika Anda ingin kembali ke snapshot hingga 3 level ke bawah (bukan hanya root satu), Anda dapat melakukannya seperti ini

snapshot_name = 'MySnapshot'  # snapshot name
for vm in vmList:
   if vm.name in vmnames:
      snapshots = vm.snapshot.rootSnapshotList
      for snapshot in snapshots:
         if snapshot_name == snapshot.name:
            print("Snapshot NAME L1: " + str(snapshot.name))
            snap_obj = snapshot.snapshot
            print("LEVEL1 Reverting snapshot ", snapshot.name)
            task = [snap_obj.RevertToSnapshot_Task()]
            WaitForTasks(task, si)
            break
         for subsnapshot in snapshot.childSnapshotList:
            print(subsnapshot.name)
            if snapshot_name == subsnapshot.name:
               print("Snapshot NAME L2: " + str(subsnapshot.name))
               snap_obj = subsnapshot.snapshot
               print("LEVEL2 Reverting snapshot ", subsnapshot.name)
               task = [snap_obj.RevertToSnapshot_Task()]
               WaitForTasks(task, si)
               break
            for subsnapshot2 in subsnapshot.childSnapshotList:
               print(subsnapshot2.name)
               if snapshot_name == subsnapshot2.name:
                  print("Snapshot NAME L3: " + str(subsnapshot2.name))
                  snap_obj = subsnapshot2.snapshot
                  print("LEVEL3 Reverting snapshot ", subsnapshot2.name)
                  task = [snap_obj.RevertToSnapshot_Task()]
                  WaitForTasks(task, si)
                  break
person andriyze    schedule 14.07.2016

Fungsi rekursif untuk mendapatkan semua snapshot termasuk anak-anak di vm.

  def get_all_vm_snapshots(self, snapshots=None):
    found_snapshots = []

    if not snapshots:
        snapshots = vm.snapshot.rootSnapshotList

    for snapshot in snapshots:
        if snapshot.childSnapshotList:
            found_snapshots += get_all_vm_snapshots(snapshot.childSnapshotList)
        found_snapshots += [snapshot]
    return found_snapshots
person lpiner    schedule 17.11.2016