diff --git a/cloudcontrol/node/config.py b/cloudcontrol/node/config.py index 179167ad1cb97fe673f8ca8a1ba25674157944f1..cc326c893e696b764a3ade9e73378c3e78af28bf 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 8e92dffbdac389219751f16c9699fd816ff76da4..e0891857ff2e8aaac51ec39596a5bb27281496d2 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)