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 ###############################################################################
12 from lxml import etree
13 from hardware_adapter import HardwareAdapter
16 exec_cmd = common.exec_cmd
19 DEV = {'pxe': 'network',
24 class LibvirtAdapter(HardwareAdapter):
26 def __init__(self, yaml_path):
27 super(LibvirtAdapter, self).__init__(yaml_path)
28 self.parser = etree.XMLParser(remove_blank_text=True)
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)
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)
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)
49 def translate(self, boot_order_list):
51 for boot_dev in boot_order_list:
53 translated.append(DEV[boot_dev])
55 err('Boot device %s not recognized' % boot_dev)
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')
67 for bootelem in ['boot', 'bootmenu']:
68 boot = o.xpath(bootelem)
71 for dev in boot_order_list:
72 b = etree.Element('boot')
75 bmenu = etree.Element('bootmenu')
76 bmenu.set('enable', 'no')
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)
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')
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))
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)
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))
111 def get_node_pxe_mac(self, node_id):
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')
120 mac_list.append(mac.get('address').lower())
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')
128 if disk.get('device') == device_type:
129 targets = disk.xpath('target')
130 for target in targets:
131 device = target.get('dev')
135 def get_virt_net_conf_dir(self):
136 return self.dha_struct['virtNetConfDir']