2 from cloud import common
3 from ssh_client import SSHClient
5 exec_cmd = common.exec_cmd
10 class LibvirtAdapter(object):
12 def __init__(self, mgmt_ip, username, password):
13 self.mgmt_ip = mgmt_ip
14 self.username = username
15 self.password = password
16 self.parser = etree.XMLParser(remove_blank_text=True)
18 def power_off_blades(self, shelf, blade_list):
19 ssh = SSHClient(self.mgmt_ip, self.username, self.password)
21 for blade in blade_list:
22 LOG.debug('Power off blade %s in shelf %s' % (blade, shelf))
23 vm_name = 's%s_b%s' % (shelf, blade)
24 resp = ssh.execute('virsh destroy %s' % vm_name)
25 LOG.debug('response: %s' % resp)
28 def power_on_blades(self, shelf, blade_list):
29 ssh = SSHClient(self.mgmt_ip, self.username, self.password)
31 for blade in blade_list:
32 LOG.debug('Power on blade %s in shelf %s' % (blade, shelf))
33 vm_name = 's%s_b%s' % (shelf, blade)
34 resp = ssh.execute('virsh start %s' % vm_name)
35 LOG.debug('response: %s' % resp)
38 def set_boot_order_blades(self, shelf, blade_list, boot_dev_list=None):
40 boot_dev_list = ['network', 'hd']
41 ssh = SSHClient(self.mgmt_ip, self.username, self.password)
43 temp_dir= ssh.execute('mktemp -d').strip()
44 for blade in blade_list:
45 LOG.debug('Set boot order %s on blade %s in shelf %s'
46 % (boot_dev_list, blade, shelf))
47 vm_name = 's%s_b%s' % (shelf, blade)
48 resp = ssh.execute('virsh dumpxml %s' % vm_name)
49 xml_dump = etree.fromstring(resp, self.parser)
50 os = xml_dump.xpath('/domain/os')
52 for bootelem in ['boot', 'bootmenu']:
53 boot = o.xpath(bootelem)
55 b.getparent().remove(b)
56 for dev in boot_dev_list:
57 b = etree.Element('boot')
60 bmenu = etree.Element('bootmenu')
61 bmenu.set('enable', 'no')
63 tree = etree.ElementTree(xml_dump)
64 xml_file = temp_dir + '/%s.xml' % vm_name
65 with open(xml_file, 'w') as f:
66 tree.write(f, pretty_print=True, xml_declaration=True)
67 ssh.execute('virsh define %s' % xml_file)
68 ssh.execute('rm -fr %s' % temp_dir)
71 def get_blades_mac_addresses(self, shelf, blade_list):
72 LOG.debug('Get the MAC addresses of blades %s in shelf %s'
73 % (blade_list, shelf))
74 macs_per_blade_dict = {}
75 ssh = SSHClient(self.mgmt_ip, self.username, self.password)
77 for blade in blade_list:
78 vm_name = 's%s_b%s' % (shelf, blade)
79 mac_list = macs_per_blade_dict[blade] = []
80 resp = ssh.execute('virsh dumpxml %s' % vm_name)
81 xml_dump = etree.fromstring(resp)
82 interfaces = xml_dump.xpath('/domain/devices/interface')
83 for interface in interfaces:
84 macs = interface.xpath('mac')
86 mac_list.append(mac.get('address'))
88 return macs_per_blade_dict
90 def load_image_file(self, shelf=None, blade=None, vm=None,
93 vm_name = 's%s_b%s' % (shelf, blade)
97 LOG.debug('Load media file %s into %s '
98 % (image_path, 'vm %s' % vm if vm else 'blade %s in shelf %s'
101 ssh = SSHClient(self.mgmt_ip, self.username, self.password)
103 temp_dir= ssh.execute('mktemp -d').strip()
104 resp = ssh.execute('virsh dumpxml %s' % vm_name)
105 xml_dump = etree.fromstring(resp)
107 disks = xml_dump.xpath('/domain/devices/disk')
109 if disk.get('device') == 'cdrom':
110 disk.set('type', 'file')
111 sources = disk.xpath('source')
112 for source in sources:
114 source = etree.SubElement(disk, 'source')
115 source.set('file', image_path)
116 tree = etree.ElementTree(xml_dump)
117 xml_file = temp_dir + '/%s.xml' % vm_name
118 with open(xml_file, 'w') as f:
119 tree.write(f, pretty_print=True, xml_declaration=True)
120 ssh.execute('virsh define %s' % xml_file)
121 ssh.execute('rm -fr %s' % temp_dir)
124 def eject_image_file(self, shelf=None, blade=None, vm=None):
126 vm_name = 's%s_b%s' % (shelf, blade)
130 LOG.debug('Eject media file from %s '
131 % 'vm %s' % vm if vm else 'blade %s in shelf %s'
134 ssh = SSHClient(self.mgmt_ip, self.username, self.password)
136 temp_dir= ssh.execute('mktemp -d').strip()
137 resp = ssh.execute('virsh dumpxml %s' % vm_name)
138 xml_dump = etree.fromstring(resp)
140 disks = xml_dump.xpath('/domain/devices/disk')
142 if disk.get('device') == 'cdrom':
143 disk.set('type', 'block')
144 sources = disk.xpath('source')
145 for source in sources:
147 tree = etree.ElementTree(xml_dump)
148 xml_file = temp_dir + '/%s.xml' % vm_name
149 with open(xml_file, 'w') as f:
150 tree.write(f, pretty_print=True, xml_declaration=True)
151 ssh.execute('virsh define %s' % xml_file)
152 ssh.execute('rm -fr %s' % temp_dir)