Восстановление снимка в virtualbox с помощью pyvbox - PullRequest
0 голосов
/ 19 декабря 2018

Я хочу написать код, который восстанавливает определенный снимок на определенной виртуальной машине, используя pyvbox .

У меня есть это:

def readSnap(mach_name):
  vbox = virtualbox.VirtualBox()
  vm = vbox.find_machine(mach_name)
  snap = vm.restore_snapshot()

Но последняя строчка выдает:

virtualbox.library_base.VBoxError: 0x80020009 
(Method Machine::restoreSnapshot is not implemented)

И я совершенно запутался в использовании этого модуля.Я знаю, что restore_snapshot () принимает аргумент, который должен быть экземпляром ISnapshot, но я также не знаю, как его использовать.

Спасибо за вашу помощь и время.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Я нашел решение.Проблема была в этой строке, которую я не включил в код:

snap = vm.find_snapshot(s_name)

И после восстановления снимка вам нужно разблокировать сеанс с этим:

session.unlock_machine()

И этомой окончательный код:

def read_snapshot(m_name, s_name):
    start = time.time()
    name = "read_snapshot"
    vb = virtualbox.VirtualBox()
    session = virtualbox.Session()

    try:
        vm = vb.find_machine(m_name)
        snap = vm.find_snapshot(s_name)
        vm.create_session(session=session)
    except virtualbox.library.VBoxError as e:
        return Report(name, "failed", e.msg, True)
    except Exception as e:
        return Report(name, "failed", str(e), True)

    restoring = session.machine.restore_snapshot(snap)

    while restoring.operation_percent < 100:
        time.sleep(0.5)

    session.unlock_machine()
    if restoring.completed == 1:
        return Report(name, "success", "restoring completed in {:>.4} sec".format(str(time.time() - start)), False)
    else:
        return Report(name, "failed", "restoring not completed", True)
0 голосов
/ 19 декабря 2018

IMachine документирует функцию find_snapshot.Если вы знаете имя или UUID снимка, передайте его.В противном случае он говорит, что передайте ему нулевой (None?) Аргумент для получения корневого снимка.Затем вы можете использовать атрибут children, чтобы перебирать снимки, проверяя атрибуты снимков, пока не найдете нужный.

Следует отметить, что вы сказали, что хотите «восстановить определенный снимок»».Однако ваша функция не принимает аргумент, указывающий, какой это снимок.Итак, вы собираетесь добавить параметры, чтобы можно было найти снимок.

Ваш код может выглядеть следующим образом:

def readSnap(mach_name, snapshot_name):
    vbox = virtualbox.VirtualBox()
    vm = vbox.find_machine(mach_name)
    snap = vm.find_snapshot(snapshot_name)
    vm.restore_snapshot(snap)
...