diff options
author | Szilard Cserey <szilard.cserey@ericsson.com> | 2015-05-04 12:11:29 +0200 |
---|---|---|
committer | Szilard Cserey <szilard.cserey@ericsson.com> | 2015-05-19 20:15:25 +0200 |
commit | 945dca48c0b1fd93fec43513afb6680a8d828e33 (patch) | |
tree | 2023bf27393a7a1edd5a4b8178b5d20a63814bec /fuel/deploy/dha_adapters | |
parent | 2debee7a4f97a6a9d90aa55877264b3c62e3e2df (diff) |
Autodeploy inspired on Prototype #2
- setup libvirt environment
- setup vfuel environment
- patch iso
- install Fuel Master
- deploy cloud
- hardware adapter for libvirt
- hardware adapter for ipmi
- hardware adapter for hp
- README: AutoDeploy instructions
JIRA: [BGS-2] Create Fuel deployment script
Change-Id: I862d824829baaae7d21115776d13355d575a47c8
Signed-off-by: Szilard Cserey <szilard.cserey@ericsson.com>
Diffstat (limited to 'fuel/deploy/dha_adapters')
-rw-r--r-- | fuel/deploy/dha_adapters/__init__.py | 0 | ||||
-rw-r--r-- | fuel/deploy/dha_adapters/hardware_adapter.py | 51 | ||||
-rw-r--r-- | fuel/deploy/dha_adapters/hp_adapter.py | 25 | ||||
-rw-r--r-- | fuel/deploy/dha_adapters/ipmi_adapter.py | 61 | ||||
-rw-r--r-- | fuel/deploy/dha_adapters/libvirt_adapter.py | 127 |
5 files changed, 264 insertions, 0 deletions
diff --git a/fuel/deploy/dha_adapters/__init__.py b/fuel/deploy/dha_adapters/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/fuel/deploy/dha_adapters/__init__.py diff --git a/fuel/deploy/dha_adapters/hardware_adapter.py b/fuel/deploy/dha_adapters/hardware_adapter.py new file mode 100644 index 0000000..884e9ce --- /dev/null +++ b/fuel/deploy/dha_adapters/hardware_adapter.py @@ -0,0 +1,51 @@ +import yaml +import io + +class HardwareAdapter(object): + def __init__(self, yaml_path): + self.dha_struct = None + self.parse_yaml(yaml_path) + + def parse_yaml(self, yaml_path): + with io.open(yaml_path) as yaml_file: + self.dha_struct = yaml.load(yaml_file) + + def get_adapter_type(self): + return self.dha_struct['adapter'] + + def get_all_node_ids(self): + node_ids = [] + for node in self.dha_struct['nodes']: + node_ids.append(node['id']) + node_ids.sort() + return node_ids + + def get_fuel_node_id(self): + for node in self.dha_struct['nodes']: + if 'isFuel' in node and node['isFuel']: + return node['id'] + + def get_node_ids(self): + node_ids = [] + fuel_node_id = self.get_fuel_node_id() + for node in self.dha_struct['nodes']: + if node['id'] != fuel_node_id: + node_ids.append(node['id']) + node_ids.sort() + return node_ids + + def use_fuel_custom_install(self): + return self.dha_struct['fuelCustomInstall'] + + def get_node_property(self, node_id, property_name): + for node in self.dha_struct['nodes']: + if node['id'] == node_id and property_name in node: + return node[property_name] + + def node_can_zero_mbr(self, node_id): + return self.get_node_property(node_id, 'nodeCanZeroMBR') + + def get_fuel_access(self): + for node in self.dha_struct['nodes']: + if 'isFuel' in node and node['isFuel']: + return node['username'], node['password'] diff --git a/fuel/deploy/dha_adapters/hp_adapter.py b/fuel/deploy/dha_adapters/hp_adapter.py new file mode 100644 index 0000000..8fc38ad --- /dev/null +++ b/fuel/deploy/dha_adapters/hp_adapter.py @@ -0,0 +1,25 @@ +import common +from ipmi_adapter import IpmiAdapter +from ssh_client import SSHClient + +log = common.log + +DEV = {'pxe': 'bootsource5', + 'disk': 'bootsource3', + 'iso': 'bootsource1'} + +ROOT = '/system1/bootconfig1' + +class HpAdapter(IpmiAdapter): + + def __init__(self, yaml_path): + super(HpAdapter, self).__init__(yaml_path) + + def node_set_boot_order(self, node_id, boot_order_list): + log('Set boot order %s on Node %s' % (boot_order_list, node_id)) + ip, username, password = self.get_access_info(node_id) + ssh = SSHClient(ip, username, password) + for order, dev in enumerate(boot_order_list): + with ssh as s: + s.exec_cmd('set %s/%s bootorder=%s' + % (ROOT, DEV[dev], order+1)) diff --git a/fuel/deploy/dha_adapters/ipmi_adapter.py b/fuel/deploy/dha_adapters/ipmi_adapter.py new file mode 100644 index 0000000..d97fd2d --- /dev/null +++ b/fuel/deploy/dha_adapters/ipmi_adapter.py @@ -0,0 +1,61 @@ +import common +from hardware_adapter import HardwareAdapter + +log = common.log +exec_cmd = common.exec_cmd + +class IpmiAdapter(HardwareAdapter): + + def __init__(self, yaml_path): + super(IpmiAdapter, self).__init__(yaml_path) + + def get_access_info(self, node_id): + ip = self.get_node_property(node_id, 'ipmiIp') + username = self.get_node_property(node_id, 'ipmiUser') + password = self.get_node_property(node_id, 'ipmiPass') + return ip, username, password + + def ipmi_cmd(self, node_id): + ip, username, password = self.get_access_info(node_id) + cmd = 'ipmitool -I lanplus -A password' + cmd += ' -H %s -U %s -P %s' % (ip, username, password) + return cmd + + def get_node_pxe_mac(self, node_id): + mac_list = [] + mac_list.append(self.get_node_property(node_id, 'pxeMac').lower()) + return mac_list + + def node_power_on(self, node_id): + log('Power ON Node %s' % node_id) + cmd_prefix = self.ipmi_cmd(node_id) + state = exec_cmd('%s chassis power status' % cmd_prefix) + if state == 'Chassis Power is off': + exec_cmd('%s chassis power on' % cmd_prefix) + + def node_power_off(self, node_id): + log('Power OFF Node %s' % node_id) + cmd_prefix = self.ipmi_cmd(node_id) + state = exec_cmd('%s chassis power status' % cmd_prefix) + if state == 'Chassis Power is on': + exec_cmd('%s chassis power off' % cmd_prefix) + + def node_reset(self, node_id): + log('Reset Node %s' % node_id) + cmd_prefix = self.ipmi_cmd(node_id) + state = exec_cmd('%s chassis power status' % cmd_prefix) + if state == 'Chassis Power is on': + exec_cmd('%s chassis power reset' % cmd_prefix) + + def node_set_boot_order(self, node_id, boot_order_list): + log('Set boot order %s on Node %s' % (boot_order_list, node_id)) + cmd_prefix = self.ipmi_cmd(node_id) + for dev in boot_order_list: + if dev == 'pxe': + exec_cmd('%s chassis bootdev pxe options=persistent' + % cmd_prefix) + elif dev == 'iso': + exec_cmd('%s chassis bootdev cdrom' % cmd_prefix) + elif dev == 'disk': + exec_cmd('%s chassis bootdev disk options=persistent' + % cmd_prefix) diff --git a/fuel/deploy/dha_adapters/libvirt_adapter.py b/fuel/deploy/dha_adapters/libvirt_adapter.py new file mode 100644 index 0000000..dde4946 --- /dev/null +++ b/fuel/deploy/dha_adapters/libvirt_adapter.py @@ -0,0 +1,127 @@ +import common +from lxml import etree +from hardware_adapter import HardwareAdapter + +log = common.log +exec_cmd = common.exec_cmd +err = common.err + +DEV = {'pxe': 'network', + 'disk': 'hd', + 'iso': 'cdrom'} + +class LibvirtAdapter(HardwareAdapter): + + def __init__(self, yaml_path): + super(LibvirtAdapter, self).__init__(yaml_path) + self.parser = etree.XMLParser(remove_blank_text=True) + + def node_power_off(self, node_id): + vm_name = self.get_node_property(node_id, 'libvirtName') + log('Power OFF Node %s' % vm_name) + state = exec_cmd('virsh domstate %s' % vm_name) + if state == 'running': + exec_cmd('virsh destroy %s' % vm_name, False) + + def node_power_on(self, node_id): + vm_name = self.get_node_property(node_id, 'libvirtName') + log('Power ON Node %s' % vm_name) + state = exec_cmd('virsh domstate %s' % vm_name) + if state == 'shut off': + exec_cmd('virsh start %s' % vm_name) + + def node_reset(self, node_id): + vm_name = self.get_node_property(node_id, 'libvirtName') + log('Reset Node %s' % vm_name) + exec_cmd('virsh reset %s' % vm_name) + + def translate(self, boot_order_list): + translated = [] + for boot_dev in boot_order_list: + if boot_dev in DEV: + translated.append(DEV[boot_dev]) + else: + err('Boot device %s not recognized' % boot_dev) + return translated + + def node_set_boot_order(self, node_id, boot_order_list): + boot_order_list = self.translate(boot_order_list) + vm_name = self.get_node_property(node_id, 'libvirtName') + temp_dir = exec_cmd('mktemp -d') + log('Set boot order %s on Node %s' % (boot_order_list, vm_name)) + resp = exec_cmd('virsh dumpxml %s' % vm_name) + xml_dump = etree.fromstring(resp, self.parser) + os = xml_dump.xpath('/domain/os') + for o in os: + for bootelem in ['boot', 'bootmenu']: + boot = o.xpath(bootelem) + for b in boot: + o.remove(b) + for dev in boot_order_list: + b = etree.Element('boot') + b.set('dev', dev) + o.append(b) + bmenu = etree.Element('bootmenu') + bmenu.set('enable', 'no') + o.append(bmenu) + tree = etree.ElementTree(xml_dump) + xml_file = temp_dir + '/%s.xml' % vm_name + with open(xml_file, 'w') as f: + tree.write(f, pretty_print=True, xml_declaration=True) + exec_cmd('virsh define %s' % xml_file) + exec_cmd('rm -fr %s' % temp_dir) + + def node_zero_mbr(self, node_id): + vm_name = self.get_node_property(node_id, 'libvirtName') + resp = exec_cmd('virsh dumpxml %s' % vm_name) + xml_dump = etree.fromstring(resp) + disks = xml_dump.xpath('/domain/devices/disk') + for disk in disks: + if disk.get('device') == 'disk': + sources = disk.xpath('source') + for source in sources: + disk_file = source.get('file') + disk_size = exec_cmd('ls -l %s' % disk_file).split()[4] + exec_cmd('rm -f %s' % disk_file) + exec_cmd('fallocate -l %s %s' % (disk_size, disk_file)) + + def node_eject_iso(self, node_id): + vm_name = self.get_node_property(node_id, 'libvirtName') + device = self.get_name_of_device(vm_name, 'cdrom') + exec_cmd('virsh change-media %s --eject %s' % (vm_name, device), False) + + def node_insert_iso(self, node_id, iso_file): + vm_name = self.get_node_property(node_id, 'libvirtName') + device = self.get_name_of_device(vm_name, 'cdrom') + exec_cmd('virsh change-media %s --insert %s %s' + % (vm_name, device, iso_file)) + + def get_disks(self): + return self.dha_struct['disks'] + + def get_node_role(self, node_id): + return self.get_node_property(node_id, 'role') + + def get_node_pxe_mac(self, node_id): + mac_list = [] + vm_name = self.get_node_property(node_id, 'libvirtName') + resp = exec_cmd('virsh dumpxml %s' % vm_name) + xml_dump = etree.fromstring(resp) + interfaces = xml_dump.xpath('/domain/devices/interface') + for interface in interfaces: + macs = interface.xpath('mac') + for mac in macs: + mac_list.append(mac.get('address').lower()) + return mac_list + + def get_name_of_device(self, vm_name, device_type): + resp = exec_cmd('virsh dumpxml %s' % vm_name) + xml_dump = etree.fromstring(resp) + disks = xml_dump.xpath('/domain/devices/disk') + for disk in disks: + if disk.get('device') == device_type: + targets = disk.xpath('target') + for target in targets: + device = target.get('dev') + if device: + return device |