Updates docs for SR1 with final revision
[genesis.git] / fuel / deploy / dha_adapters / libvirt_adapter.py
1 ###############################################################################
2 # Copyright (c) 2015 Ericsson AB and others.
3 # szilard.cserey@ericsson.com
4 # All rights reserved. This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 # http://www.apache.org/licenses/LICENSE-2.0
8 ###############################################################################
9
10
11 import common
12 from lxml import etree
13 from hardware_adapter import HardwareAdapter
14
15 log = common.log
16 exec_cmd = common.exec_cmd
17 err = common.err
18
19 DEV = {'pxe': 'network',
20        'disk': 'hd',
21        'iso': 'cdrom'}
22
23
24 class LibvirtAdapter(HardwareAdapter):
25
26     def __init__(self, yaml_path):
27         super(LibvirtAdapter, self).__init__(yaml_path)
28         self.parser = etree.XMLParser(remove_blank_text=True)
29
30     def node_power_off(self, node_id):
31         vm_name = self.get_node_property(node_id, 'libvirtName')
32         log('Power OFF Node %s' % vm_name)
33         state = exec_cmd('virsh domstate %s' % vm_name)
34         if state == 'running':
35             exec_cmd('virsh destroy %s' % vm_name, False)
36
37     def node_power_on(self, node_id):
38         vm_name = self.get_node_property(node_id, 'libvirtName')
39         log('Power ON Node %s' % vm_name)
40         state = exec_cmd('virsh domstate %s' % vm_name)
41         if state == 'shut off':
42             exec_cmd('virsh start %s' % vm_name)
43
44     def node_reset(self, node_id):
45         vm_name = self.get_node_property(node_id, 'libvirtName')
46         log('Reset Node %s' % vm_name)
47         exec_cmd('virsh reset %s' % vm_name)
48
49     def translate(self, boot_order_list):
50         translated = []
51         for boot_dev in boot_order_list:
52             if boot_dev in DEV:
53                 translated.append(DEV[boot_dev])
54             else:
55                 err('Boot device %s not recognized' % boot_dev)
56         return translated
57
58     def node_set_boot_order(self, node_id, boot_order_list):
59         boot_order_list = self.translate(boot_order_list)
60         vm_name = self.get_node_property(node_id, 'libvirtName')
61         temp_dir = exec_cmd('mktemp -d')
62         log('Set boot order %s on Node %s' % (boot_order_list, vm_name))
63         resp = exec_cmd('virsh dumpxml %s' % vm_name)
64         xml_dump = etree.fromstring(resp, self.parser)
65         os = xml_dump.xpath('/domain/os')
66         for o in os:
67             for bootelem in ['boot', 'bootmenu']:
68                 boot = o.xpath(bootelem)
69                 for b in boot:
70                     o.remove(b)
71             for dev in boot_order_list:
72                 b = etree.Element('boot')
73                 b.set('dev', dev)
74                 o.append(b)
75             bmenu = etree.Element('bootmenu')
76             bmenu.set('enable', 'no')
77             o.append(bmenu)
78         tree = etree.ElementTree(xml_dump)
79         xml_file = temp_dir + '/%s.xml' % vm_name
80         with open(xml_file, 'w') as f:
81             tree.write(f, pretty_print=True, xml_declaration=True)
82         exec_cmd('virsh define %s' % xml_file)
83         exec_cmd('rm -fr %s' % temp_dir)
84
85     def node_zero_mbr(self, node_id):
86         vm_name = self.get_node_property(node_id, 'libvirtName')
87         resp = exec_cmd('virsh dumpxml %s' % vm_name)
88         xml_dump = etree.fromstring(resp)
89         disks = xml_dump.xpath('/domain/devices/disk')
90         for disk in disks:
91             if disk.get('device') == 'disk':
92                 sources = disk.xpath('source')
93                 for source in sources:
94                     disk_file = source.get('file')
95                     disk_size = exec_cmd('ls -l %s' % disk_file).split()[4]
96                     exec_cmd('rm -f %s' % disk_file)
97                     exec_cmd('fallocate -l %s %s' % (disk_size, disk_file))
98
99     def node_eject_iso(self, node_id):
100         vm_name = self.get_node_property(node_id, 'libvirtName')
101         device = self.get_name_of_device(vm_name, 'cdrom')
102         exec_cmd('virsh change-media %s --eject %s --config --live'
103                  % (vm_name, device), False)
104
105     def node_insert_iso(self, node_id, iso_file):
106         vm_name = self.get_node_property(node_id, 'libvirtName')
107         device = self.get_name_of_device(vm_name, 'cdrom')
108         exec_cmd('virsh change-media %s --insert %s %s'
109                  % (vm_name, device, iso_file))
110
111     def get_node_pxe_mac(self, node_id):
112         mac_list = []
113         vm_name = self.get_node_property(node_id, 'libvirtName')
114         resp = exec_cmd('virsh dumpxml %s' % vm_name)
115         xml_dump = etree.fromstring(resp)
116         interfaces = xml_dump.xpath('/domain/devices/interface')
117         for interface in interfaces:
118             macs = interface.xpath('mac')
119             for mac in macs:
120                 mac_list.append(mac.get('address').lower())
121         return mac_list
122
123     def get_name_of_device(self, vm_name, device_type):
124         resp = exec_cmd('virsh dumpxml %s' % vm_name)
125         xml_dump = etree.fromstring(resp)
126         disks = xml_dump.xpath('/domain/devices/disk')
127         for disk in disks:
128             if disk.get('device') == device_type:
129                 targets = disk.xpath('target')
130                 for target in targets:
131                     device = target.get('dev')
132                     if device:
133                         return device
134
135     def get_virt_net_conf_dir(self):
136         return self.dha_struct['virtNetConfDir']