Fuel Config Reap + Additional Refactoring for Autodeployment
[genesis.git] / fuel / deploy / environments / execution_environment.py
diff --git a/fuel/deploy/environments/execution_environment.py b/fuel/deploy/environments/execution_environment.py
new file mode 100644 (file)
index 0000000..4f612a6
--- /dev/null
@@ -0,0 +1,67 @@
+from lxml import etree
+
+import common
+from dha_adapters.libvirt_adapter import LibvirtAdapter
+
+exec_cmd = common.exec_cmd
+err = common.err
+log = common.log
+check_dir_exists = common.check_dir_exists
+check_file_exists = common.check_file_exists
+check_if_root = common.check_if_root
+
+class ExecutionEnvironment(object):
+
+    def __init__(self, storage_dir, dha_file, root_dir):
+        self.storage_dir = storage_dir
+        self.dha = LibvirtAdapter(dha_file)
+        self.root_dir = root_dir
+        self.parser = etree.XMLParser(remove_blank_text=True)
+        self.fuel_node_id = self.dha.get_fuel_node_id()
+
+    def delete_vm(self, node_id):
+        vm_name = self.dha.get_node_property(node_id, 'libvirtName')
+        r, c = exec_cmd('virsh dumpxml %s' % vm_name, False)
+        if c:
+            return
+        self.undefine_vm_delete_disk(r, vm_name)
+
+    def undefine_vm_delete_disk(self, printout, vm_name):
+        disk_files = []
+        xml_dump = etree.fromstring(printout, self.parser)
+        disks = xml_dump.xpath('/domain/devices/disk')
+        for disk in disks:
+            sources = disk.xpath('source')
+            for source in sources:
+                source_file = source.get('file')
+                if source_file:
+                    disk_files.append(source_file)
+        log('Deleting VM %s with disks %s' % (vm_name, disk_files))
+        exec_cmd('virsh destroy %s' % vm_name, False)
+        exec_cmd('virsh undefine %s' % vm_name, False)
+        for file in disk_files:
+            exec_cmd('rm -f %s' % file)
+
+    def define_vm(self, vm_name, temp_vm_file, disk_path):
+        log('Creating VM %s with disks %s' % (vm_name, disk_path))
+        with open(temp_vm_file) as f:
+            vm_xml = etree.parse(f)
+        names = vm_xml.xpath('/domain/name')
+        for name in names:
+            name.text = vm_name
+        uuids = vm_xml.xpath('/domain/uuid')
+        for uuid in uuids:
+            uuid.getparent().remove(uuid)
+        disks = vm_xml.xpath('/domain/devices/disk')
+        for disk in disks:
+            if (disk.get('type') == 'file'
+                and disk.get('device') == 'disk'):
+                sources = disk.xpath('source')
+                for source in sources:
+                    disk.remove(source)
+                source = etree.Element('source')
+                source.set('file', disk_path)
+                disk.append(source)
+        with open(temp_vm_file, 'w') as f:
+            vm_xml.write(f, pretty_print=True, xml_declaration=True)
+        exec_cmd('virsh define %s' % temp_vm_file)
\ No newline at end of file