From a2758e838163b47582ce3f770d7bc9e973ecd57c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Aur=C3=A9lien=20Dunand?= <aurelien.dunand@tdf.fr>
Date: Fri, 4 May 2018 16:41:00 +0200
Subject: [PATCH] Add VM install mode support

---
 cloudcontrol/node/config.py                   |  4 ++++
 cloudcontrol/node/hypervisor/__init__.py      | 24 +++++++++++++++++++
 .../node/hypervisor/domains/vm_tags.py        | 16 ++++++++-----
 3 files changed, 38 insertions(+), 6 deletions(-)

diff --git a/cloudcontrol/node/config.py b/cloudcontrol/node/config.py
index 207e90d..c251892 100644
--- a/cloudcontrol/node/config.py
+++ b/cloudcontrol/node/config.py
@@ -113,6 +113,10 @@ class NodeConfigParser(object):
         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)
+        default_install_script = 'hkvm-install'
+        self.install_script = config.get('node', 'install_script', default_install_script)
+        default_mode_script = 'hkvm-mode'
+        self.mode_script = config.get('node', 'mode_script', default_mode_script)
         default_vlan_script = 'hkvm-vlan'
         self.vlan_script = config.get('node', 'vlan_script', default_vlan_script)
         default_attach_script = 'hkvm-attach'
diff --git a/cloudcontrol/node/hypervisor/__init__.py b/cloudcontrol/node/hypervisor/__init__.py
index d5607e7..608b5f0 100644
--- a/cloudcontrol/node/hypervisor/__init__.py
+++ b/cloudcontrol/node/hypervisor/__init__.py
@@ -258,6 +258,30 @@ class Handler(HostHandler):
             logger.error(msg)
             raise UndefinedDomain(msg)
 
+    @libvirt_handler
+    def vm_install(self, name):
+        logger.debug('VM install %s', name)
+        if name in self.hypervisor.domains:
+            rcode, output = execute(self.main, [self.main.config.install_script, '-i', name])
+            if rcode != 0:
+                raise RuntimeError(output.strip().split('\n')[-1].strip())
+        else:
+            msg = 'Cannot install VM %s because it is not defined' % name
+            logger.error(msg)
+            raise UndefinedDomain(msg)
+
+    @libvirt_handler
+    def vm_uninstall(self, name):
+        logger.debug('VM uninstall %s', name)
+        if name in self.hypervisor.domains:
+            rcode, output = execute(self.main, [self.main.config.install_script, '-u', name])
+            if rcode != 0:
+                raise RuntimeError(output.strip().split('\n')[-1].strip())
+        else:
+            msg = 'Cannot uninstall VM %s because it is not defined' % name
+            logger.error(msg)
+            raise UndefinedDomain(msg)
+
     @libvirt_handler
     def vm_set_vlans(self, name, vlan_update_format, mac_address=None):
         logger.debug('VM set vlan %s', name)
diff --git a/cloudcontrol/node/hypervisor/domains/vm_tags.py b/cloudcontrol/node/hypervisor/domains/vm_tags.py
index 2bb7eff..a949f48 100644
--- a/cloudcontrol/node/hypervisor/domains/vm_tags.py
+++ b/cloudcontrol/node/hypervisor/domains/vm_tags.py
@@ -60,14 +60,18 @@ def uuid(dom):
 
 
 @background(max_concurrent=3)
-def rescue(dom):
-    """Is rescue mode enabled or not"""
-    rescue_path = dom.hypervisor.handler.main.config.rescue_script
-    rcode, output = execute(dom.hypervisor.handler.main, [rescue_path, '-s', dom.name])
+def mode(dom):
+    """Retrieve VM mode"""
+    mode_path = dom.hypervisor.handler.main.config.mode_script
+    rcode, output = execute(dom.hypervisor.handler.main, [mode_path, '-m', dom.name])
     if rcode == 0:
-        return output.strip()
+        try:
+            res = output.rsplit(':', 1)[-1].strip()
+        except IndexError:
+            res = 'error'
     else:
-        return 'error'
+        res= 'error'
+    return res
 
 
 def status(dom):
-- 
GitLab