Automatic Deployment
[genesis.git] / fuel / deploy / cloud_deploy / hardware_adapters / libvirt / libvirt_adapter.py
1 from lxml import etree
2 from cloud import common
3 from ssh_client import SSHClient
4
5 exec_cmd = common.exec_cmd
6 err = common.err
7 LOG = common.LOG
8
9
10 class LibvirtAdapter(object):
11
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)
17
18     def power_off_blades(self, shelf, blade_list):
19         ssh = SSHClient(self.mgmt_ip, self.username, self.password)
20         ssh.open()
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)
26         ssh.close()
27
28     def power_on_blades(self, shelf, blade_list):
29         ssh = SSHClient(self.mgmt_ip, self.username, self.password)
30         ssh.open()
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)
36         ssh.close()
37
38     def set_boot_order_blades(self, shelf, blade_list, boot_dev_list=None):
39         if not boot_dev_list:
40             boot_dev_list = ['network', 'hd']
41         ssh = SSHClient(self.mgmt_ip, self.username, self.password)
42         ssh.open()
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')
51             for o in os:
52                 for bootelem in ['boot', 'bootmenu']:
53                     boot = o.xpath(bootelem)
54                     for b in boot:
55                         b.getparent().remove(b)
56                 for dev in boot_dev_list:
57                     b = etree.Element('boot')
58                     b.set('dev', dev)
59                     o.append(b)
60                 bmenu = etree.Element('bootmenu')
61                 bmenu.set('enable', 'no')
62                 o.append(bmenu)
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)
69         ssh.close()
70
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)
76         ssh.open()
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')
85                 for mac in macs:
86                     mac_list.append(mac.get('address'))
87         ssh.close()
88         return macs_per_blade_dict
89
90     def load_image_file(self, shelf=None, blade=None, vm=None,
91                         image_path=None):
92         if shelf and blade:
93             vm_name = 's%s_b%s' % (shelf, blade)
94         else:
95             vm_name = vm
96
97         LOG.debug('Load media file %s into %s '
98                   % (image_path, 'vm %s' % vm if vm else 'blade %s in shelf %s'
99                                                          % (shelf, blade)))
100
101         ssh = SSHClient(self.mgmt_ip, self.username, self.password)
102         ssh.open()
103         temp_dir= ssh.execute('mktemp -d').strip()
104         resp = ssh.execute('virsh dumpxml %s' % vm_name)
105         xml_dump = etree.fromstring(resp)
106
107         disks = xml_dump.xpath('/domain/devices/disk')
108         for disk in disks:
109             if disk.get('device') == 'cdrom':
110                 disk.set('type', 'file')
111                 sources = disk.xpath('source')
112                 for source in sources:
113                     disk.remove(source)
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)
122         ssh.close()
123
124     def eject_image_file(self, shelf=None, blade=None, vm=None):
125         if shelf and blade:
126             vm_name = 's%s_b%s' % (shelf, blade)
127         else:
128             vm_name = vm
129
130         LOG.debug('Eject media file from %s '
131                   % 'vm %s' % vm if vm else 'blade %s in shelf %s'
132                                             % (shelf, blade))
133
134         ssh = SSHClient(self.mgmt_ip, self.username, self.password)
135         ssh.open()
136         temp_dir= ssh.execute('mktemp -d').strip()
137         resp = ssh.execute('virsh dumpxml %s' % vm_name)
138         xml_dump = etree.fromstring(resp)
139
140         disks = xml_dump.xpath('/domain/devices/disk')
141         for disk in disks:
142             if disk.get('device') == 'cdrom':
143                 disk.set('type', 'block')
144                 sources = disk.xpath('source')
145                 for source in sources:
146                     disk.remove(source)
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)
153         ssh.close()