Fix lock handling for virtualbox tests

This commit is contained in:
Anders Ingemann 2015-01-25 13:30:32 +01:00
parent ef37cd257f
commit 5b48ce58c5

View file

@ -1,6 +1,7 @@
from instance import Instance from instance import Instance
import virtualbox import virtualbox
from contextlib import contextmanager from contextlib import contextmanager
from ..tools import waituntil
import logging import logging
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -84,7 +85,8 @@ class VirtualBoxInstance(Instance):
def shutdown(self): def shutdown(self):
log.debug('Shutting down vbox machine `{name}\''.format(name=self.name)) log.debug('Shutting down vbox machine `{name}\''.format(name=self.name))
self.session.console.power_down().wait_for_completion(-1) self.session.console.power_down().wait_for_completion(-1)
lock(self.machine, self.session).unlock() if not waituntil(lambda: self.machine.session_state == virtualbox.library.SessionState.unlocked):
raise LockingException('Timeout while waiting for the machine to become unlocked')
def destroy(self): def destroy(self):
log.debug('Destroying vbox machine `{name}\''.format(name=self.name)) log.debug('Destroying vbox machine `{name}\''.format(name=self.name))
@ -105,15 +107,27 @@ class VirtualBoxInstance(Instance):
@contextmanager @contextmanager
def lock(machine, session): def lock(machine, session):
if machine.session_state != virtualbox.library.SessionState.unlocked:
msg = ('Acquiring lock on machine failed, state was `{state}\' '
'instead of `Unlocked\'.'.format(state=str(machine.session_state)))
raise LockingException(msg)
machine.lock_machine(session, virtualbox.library.LockType.write) machine.lock_machine(session, virtualbox.library.LockType.write)
yield session.machine yield session.machine
from ..tools import waituntil
if machine.session_state == virtualbox.library.SessionState.unlocked: if machine.session_state != virtualbox.library.SessionState.locked:
return if not waituntil(lambda: machine.session_state == virtualbox.library.SessionState.unlocked):
if machine.session_state == virtualbox.library.SessionState.unlocking: msg = ('Error before trying to release lock on machine, state was `{state}\' '
waituntil(lambda: machine.session_state == virtualbox.library.SessionState.unlocked) 'instead of `Locked\'.'.format(state=str(machine.session_state)))
return raise LockingException(msg)
if machine.session_state == virtualbox.library.SessionState.spawning:
waituntil(lambda: machine.session_state == virtualbox.library.SessionState.locked)
session.unlock_machine() session.unlock_machine()
waituntil(lambda: machine.session_state == virtualbox.library.SessionState.unlocked)
if not waituntil(lambda: machine.session_state == virtualbox.library.SessionState.unlocked):
msg = ('Timeout while trying to release lock on machine, '
'last state was `{state}\''.format(state=str(machine.session_state)))
raise LockingException(msg)
class LockingException(Exception):
pass