From 6e3194a9dfc32042de39a14647663ec7df92e204 Mon Sep 17 00:00:00 2001 From: Antoine Millet Date: Fri, 4 Mar 2016 11:21:57 +0100 Subject: [PATCH] Implemented vm_attach_disk and vm_detach_disk VM handlers --- cloudcontrol/node/config.py | 4 ++++ cloudcontrol/node/hypervisor/__init__.py | 30 ++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/cloudcontrol/node/config.py b/cloudcontrol/node/config.py index 179167a..cc326c8 100644 --- a/cloudcontrol/node/config.py +++ b/cloudcontrol/node/config.py @@ -115,6 +115,10 @@ class NodeConfigParser(object): self.rescue_script = config.get('node', 'rescue_script', default_rescue_script) default_vlan_script = 'hkvm-vlan' self.vlan_script = config.get('node', 'vlan_script', default_vlan_script) + default_attach_script = 'hkvm-attach' + self.attach_script = config.get('node', 'attach_script', default_attach_script) + default_detach_script = 'hkvm-detach' + self.detach_script = config.get('node', 'detach_script', default_detach_script) # RPC handler ACLs acl_section_name = 'node_handler' diff --git a/cloudcontrol/node/hypervisor/__init__.py b/cloudcontrol/node/hypervisor/__init__.py index 8e92dff..e089185 100644 --- a/cloudcontrol/node/hypervisor/__init__.py +++ b/cloudcontrol/node/hypervisor/__init__.py @@ -274,6 +274,36 @@ class Handler(HostHandler): logger.error(msg) raise UndefinedDomain(msg) + @libvirt_handler + def vm_attach_disk(self, name, pool, volume, driver='virtio', bps=0, iops=0): + logger.debug('VM attach disk %s/%s -> %s ', pool, volume, name) + self.hypervisor.storage.update() + if name in self.hypervisor.domains: + rcode, output = execute(self.main, [self.main.config.attach_script, + '--driver', driver, + '--bps', str(bps), + '--iops', str(iops), + name, pool, volume]) + if rcode != 0: + raise RuntimeError(output.strip().split('\n')[-1].strip()) + else: + msg = 'Cannot attach disk on VM %s because it is not defined' % name + logger.error(msg) + raise UndefinedDomain(msg) + + @libvirt_handler + def vm_detach_disk(self, name, pool, volume): + logger.debug('VM detach disk %s/%s <- %s ', pool, volume, name) + if name in self.hypervisor.domains: + rcode, output = execute(self.main, [self.main.config.detach_script, + name, pool, volume]) + if rcode != 0: + raise RuntimeError(output.strip().split('\n')[-1].strip()) + else: + msg = 'Cannot detach disk from 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) -- GitLab