def __init__(self, vm, delay, message, timeout, force, event): """ :param vm: Vm undergoing power-down action :param delay: Graceful timeout for the user to close his applications (in seconds). During this time no action is taken. :param message: Message to show the user. :param timeout: Timeout for each power-down method (guestAgent, acpi) until it is considered unsuccessful and the callback chain should try another alternative. :param force: Use forceful power-down if all graceful methods fail? :param event: Event object used to detect successful power-down. """ self.vm = vm self.chain = utils.CallbackChain() self.delay = delay self.message = message self.timeout = timeout self.event = event # first try agent if vm.guestAgent.isResponsive(): self.chain.addCallback(self.guestAgentCallback) # then acpi if enabled if utils.tobool(vm.conf.get('acpiEnable', 'true')): self.chain.addCallback(self.acpiCallback) if force: self.chain.addCallback(self.forceCallback)
def testArgsPassedToCallback(self): callbackArgs = ('arg', 42, 'and another') callbackKwargs = {'some': 42, 'kwargs': []} def callback(*args, **kwargs): self.assertEqual(args, callbackArgs) self.assertEqual(kwargs, callbackKwargs) chain = utils.CallbackChain() chain.addCallback(callback, *callbackArgs, **callbackKwargs) chain.start() chain.join()
def testChainStopsAfterSuccessfulCallback(self): n = 10 counter = [n] def callback(): counter[0] -= 1 return counter[0] == 5 chain = utils.CallbackChain([callback] * n) chain.start() chain.join() self.assertEquals(counter[0], 5)
def testAllCallbacksAreInvokedIfTheyReturnFalse(self): n = 10 counter = [n] def callback(): counter[0] -= 1 return False chain = utils.CallbackChain([callback] * n) chain.start() chain.join() self.assertEqual(counter[0], 0)
def testEmptyChainIsNoop(self): chain = utils.CallbackChain() self.assertFalse(chain.callbacks) chain.start() chain.join()
def testCanPassIterableOfCallbacks(self): f = lambda: False callbacks = [f] * 10 chain = utils.CallbackChain(callbacks) self.assertEqual(list(chain.callbacks), callbacks)