diff --git a/cloudcontrol/node/config.py b/cloudcontrol/node/config.py index 125a93df326512e6f85759063ad0f397833dd227..d008ae1d877c3baffedfd65af5e4b8faee680d9e 100644 --- a/cloudcontrol/node/config.py +++ b/cloudcontrol/node/config.py @@ -111,6 +111,8 @@ class NodeConfigParser(object): # Path to define script default_define_script = 'hkvm-define' self.define_script = config.get('node', 'define_script', default_define_script) + default_rescue_script = 'hkvm-rescue' + self.rescue_script = config.get('node', 'rescue_script', default_rescue_script) # RPC handler ACLs acl_section_name = 'node_handler' diff --git a/cloudcontrol/node/hypervisor/__init__.py b/cloudcontrol/node/hypervisor/__init__.py index bbbdafe000d1a43221bca4cd73cac7e311b612b6..a1a615e94ff45e5304bc888ac92e7303750aa9f2 100644 --- a/cloudcontrol/node/hypervisor/__init__.py +++ b/cloudcontrol/node/hypervisor/__init__.py @@ -246,6 +246,30 @@ class Handler(HostHandler): return vm.lv_dom.XMLDesc(0) + @libvirt_handler + def vm_rescue(self, name): + logger.debug('VM rescue %s', name) + if name in self.hypervisor.domains: + rcode, output = execute(self.main, [self.main.config.rescue_script, '-r', name]) + if rcode != 0: + raise RuntimeError(output.strip().split('\n')[-1].strip()) + else: + msg = 'Cannot rescue VM %s because it is not defined' % name + logger.error(msg) + raise UndefinedDomain(msg) + + @libvirt_handler + def vm_unrescue(self, name): + logger.debug('VM unrescue %s', name) + if name in self.hypervisor.domains: + rcode, output = execute(self.main, [self.main.config.rescue_script, '-u', name]) + if rcode != 0: + raise RuntimeError(output.strip().split('\n')[-1].strip()) + else: + msg = 'Cannot unrescue VM %s because it is not defined' % name + logger.error(msg) + raise UndefinedDomain(msg) + @libvirt_handler def vm_stop(self, name): logger.debug('VM stop %s', name)