diff --git a/tests/integration/tools/__init__.py b/tests/integration/tools/__init__.py index 32f1d50..c858563 100644 --- a/tests/integration/tools/__init__.py +++ b/tests/integration/tools/__init__.py @@ -23,6 +23,16 @@ def merge_dicts(*args): return reduce(merge, args, {}) +def waituntil(predicate, timeout=5, interval=0.05): + import time + threshhold = time.time() + timeout + while time.time() < threshhold: + if predicate(): + return True + time.sleep(interval) + return False + + def bootstrap(manifest, build_server): from bootstrapvz.remote.build_servers import LocalBuildServer if isinstance(build_server, LocalBuildServer): diff --git a/tests/integration/tools/instances.py b/tests/integration/tools/instances.py index d9dc228..87591e5 100644 --- a/tests/integration/tools/instances.py +++ b/tests/integration/tools/instances.py @@ -1,4 +1,3 @@ -from bootstrapvz.common.tools import log_check_call import virtualbox @@ -36,9 +35,9 @@ class VirtualBoxInstance(Instance): os_type = 'Debian_64' self.machine = self.vbox.create_machine(settings_file='', name=self.name, groups=[], os_type_id=os_type, flags='') - self.machine.save_settings() self.machine.cpu_count = self.cpus self.machine.memory_size = self.memory + self.machine.save_settings() # save settings, so that we can register it self.vbox.register_machine(self.machine) self.machine.lock_machine(self.session, virtualbox.library.LockType.write) strg_ctrl = self.session.machine.add_storage_controller('SATA Controller', @@ -47,22 +46,26 @@ class VirtualBoxInstance(Instance): self.session.machine.attach_device(name='SATA Controller', controller_port=0, device=0, type_p=virtualbox.library.DeviceType.hard_disk, medium=self.image.medium) - self.session.machine.save_settings() - self.session.unlock_machine() + self.session.machine.save_settings() # save changes to the controller + self._unlock_machine() def boot(self): - self.machine.launch_vm_process(self.session, 'headless') + self.machine.launch_vm_process(self.session, 'headless').wait_for_completion(-1) def shutdown(self): - self.session.console.power_down() - log_check_call(['VBoxManage', 'stopvm', self.uuid, - '--type', 'headless']) + self.session.console.power_down().wait_for_completion(-1) + self._unlock_machine() def destroy(self): if hasattr(self, 'machine'): - self.machine.lock_machine(self.session, virtualbox.library.LockType.write) + self.machine.lock_machine(self.session, virtualbox.library.LockType.shared) self.session.machine.detach_device(name='SATA Controller', controller_port=0, device=0) self.session.machine.save_settings() - self.session.unlock_machine() + self._unlock_machine() self.machine.unregister(virtualbox.library.CleanupMode.unregister_only) self.machine.remove(delete=True) + + def _unlock_machine(self): + from . import waituntil + self.session.unlock_machine() + waituntil(lambda: self.machine.session_state != virtualbox.library.SessionState.locked) diff --git a/tests/integration/virtualbox_tests.py b/tests/integration/virtualbox_tests.py index 2f00928..08b5a24 100644 --- a/tests/integration/virtualbox_tests.py +++ b/tests/integration/virtualbox_tests.py @@ -44,7 +44,10 @@ volume: try: instance = tools.instances.VirtualBoxInstance('unpartitioned_extlinux', image) instance.create() - # instance.boot() + try: + instance.boot() + finally: + instance.shutdown() # tools.test(instance)