1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
###############################################################################
# Copyright (c) 2015 Ericsson AB and others.
# szilard.cserey@ericsson.com
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Apache License, Version 2.0
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
###############################################################################
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)
|