diff options
Diffstat (limited to 'deploy')
-rw-r--r-- | deploy/config/labs/devel-pipeline/elx/fuel/config/dha.yaml | 48 | ||||
-rw-r--r-- | deploy/deploy-config.py | 51 | ||||
-rw-r--r-- | deploy/dha_adapters/hardware_adapter.py | 8 | ||||
-rw-r--r-- | deploy/environments/execution_environment.py | 31 | ||||
-rw-r--r-- | deploy/environments/libvirt_environment.py | 7 | ||||
-rw-r--r-- | deploy/environments/virtual_fuel.py | 5 |
6 files changed, 129 insertions, 21 deletions
diff --git a/deploy/config/labs/devel-pipeline/elx/fuel/config/dha.yaml b/deploy/config/labs/devel-pipeline/elx/fuel/config/dha.yaml index 851509871..07faeb1f2 100644 --- a/deploy/config/labs/devel-pipeline/elx/fuel/config/dha.yaml +++ b/deploy/config/labs/devel-pipeline/elx/fuel/config/dha.yaml @@ -37,7 +37,47 @@ disks: controller: 100G compute: 100G -number_cpus: - # Entry is not mandatory! If it is left empty - # the default is 2 cpus per node - controller: 2 +# Here the infrastructure VMs can be defined. +# The entries are not mandatory! If it is left empty +# the default defined in deploy/templates will +# be used. +define_vms: + fuel: + vcpu: + value: 2 + memory: + attribute_equlas: + unit: KiB + value: 8388608 + currentMemory: + attribute_equlas: + unit: KiB + value: 8388608 + devices: + interface: + # With attribute_equlas someone can define which + # interface type is meant + attribute_equlas: + type: network + # This will overwrite the type of the model of + # the interface + model: + attribute: + type: e1000 + controller: + devices: + interface: + attribute_equlas: + type: network + model: + attribute: + type: e1000 + compute: + devices: + interface: + attribute_equlas: + type: network + model: + attribute: + type: e1000 + diff --git a/deploy/deploy-config.py b/deploy/deploy-config.py index a0a44c1ed..d1e9cd47a 100644 --- a/deploy/deploy-config.py +++ b/deploy/deploy-config.py @@ -78,6 +78,13 @@ def parse_arguments(): 'output_path': args.output_path} return kwargs +def warning(msg): + red = '\033[0;31m' + NC = '\033[0m' + print('%(red)s WARNING: %(msg)s %(NC)s' % {'red': red, + 'msg': msg, + 'NC': NC}) + def setup_yaml(): represent_dict_order = lambda self, data: self.represent_mapping('tag:yaml.org,2002:map', data.items()) yaml.add_representer(collections.OrderedDict, represent_dict_order) @@ -90,14 +97,52 @@ def sha_uri(uri): sha1.update(data) return sha1.hexdigest() +def merge_fuel_plugin_version_list(list1, list2): + final_list = [] + # When the plugin version in not there in list1 it will + # not be copied + for e_l1 in list1: + plugin_version = e_l1.get('metadata', + {'plugin_version', None}).get('plugin_version') + plugin_version_found = False + for e_l2 in list2: + if plugin_version == e_l2.get('metadata', + {'plugin_version', + None}).get('plugin_version'): + final_list.append(dict(mergedicts(e_l1, e_l2))) + plugin_version_found = True + if not plugin_version_found: + final_list.append(e_l1) + return final_list + +def merge_lists(list1, list2): + if list1 and list2: + if isinstance(list1[0], dict): + if 'plugin_version' in list1[0].get('metadata', {}): + return merge_fuel_plugin_version_list(list1, list2) + else: + warning("Lists with dictionary inside are not merge able! " + "List2 will overwrite List1. " + "List1: %s; List2: %s" + % (list1, list2)) + return list2 + else: + return list2 + elif list1: + return list1 + else: + return list2 + def mergedicts(dict1, dict2): for k in set(dict1.keys()).union(dict2.keys()): if k in dict1 and k in dict2: if isinstance(dict1[k], dict) and isinstance(dict2[k], dict): yield (k, dict(mergedicts(dict1[k], dict2[k]))) + elif isinstance(dict1[k], list) and isinstance(dict2[k], list): + yield (k, merge_lists(dict1[k], dict2[k])) else: - # If one of the values is not a dict, you can't continue - # merging it. + # If one of the values is not a dict nor a list, + # you can't continue merging it. # Value from second dict overrides one in first and we move on. yield (k, dict2[k]) elif k in dict1: @@ -194,7 +239,7 @@ if deploy_scenario_conf["stack-extensions"]: module_comments.append(str(module_conf['plugin-config-metadata']['comment'])) module_conf.pop('plugin-config-metadata') final_dea_conf['settings']['editable'].update(module_conf) - scenario_module_override_conf = module['module-config-override'] + scenario_module_override_conf = module.get('module-config-override') if scenario_module_override_conf: dea_scenario_module_override_conf = {} dea_scenario_module_override_conf['settings'] = {} diff --git a/deploy/dha_adapters/hardware_adapter.py b/deploy/dha_adapters/hardware_adapter.py index 55bb4002e..aa59581ee 100644 --- a/deploy/dha_adapters/hardware_adapter.py +++ b/deploy/dha_adapters/hardware_adapter.py @@ -59,7 +59,7 @@ class HardwareAdapter(object): def get_disks(self): return self.dha_struct['disks'] - def get_number_cpus(self, role): - role_cpus_dict = self.dha_struct.get('number_cpus') - if role_cpus_dict: - return role_cpus_dict.get(role) + def get_vm_definition(self, role): + vm_definition = self.dha_struct.get('define_vms') + if vm_definition: + return vm_definition.get(role) diff --git a/deploy/environments/execution_environment.py b/deploy/environments/execution_environment.py index c2e7a0b23..2a4e39e08 100644 --- a/deploy/environments/execution_environment.py +++ b/deploy/environments/execution_environment.py @@ -50,7 +50,30 @@ class ExecutionEnvironment(object): for file in disk_files: delete(file) - def define_vm(self, vm_name, temp_vm_file, disk_path, number_cpus): + def overwrite_xml(self, vm_xml, vm_definition_overwrite): + for key, value in vm_definition_overwrite.iteritems(): + if key == 'attribute_equlas': + continue + if key == 'value': + vm_xml.text = str(value) + return + if key == 'attribute': + for attr_key, attr_value in value.iteritems(): + vm_xml.set(attr_key, str(attr_value)) + return + + if isinstance(value, dict): + only_when_attribute = value.get('attribute_equlas') + for xml_element in vm_xml.xpath(key): + if only_when_attribute: + for attr_key, attr_value in \ + only_when_attribute.iteritems(): + if attr_value != xml_element.get(attr_key): + continue + self.overwrite_xml(xml_element, value) + + def define_vm(self, vm_name, temp_vm_file, disk_path, + vm_definition_overwrite): log('Creating VM %s with disks %s' % (vm_name, disk_path)) with open(temp_vm_file) as f: vm_xml = etree.parse(f) @@ -60,10 +83,8 @@ class ExecutionEnvironment(object): uuids = vm_xml.xpath('/domain/uuid') for uuid in uuids: uuid.getparent().remove(uuid) - if number_cpus: - vcpus = vm_xml.xpath('/domain/vcpu') - for vcpu in vcpus: - vcpu.text = str(number_cpus) + self.overwrite_xml(vm_xml.xpath('/domain')[0], + vm_definition_overwrite) disks = vm_xml.xpath('/domain/devices/disk') for disk in disks: if (disk.get('type') == 'file' and diff --git a/deploy/environments/libvirt_environment.py b/deploy/environments/libvirt_environment.py index 380262c7e..c9fa41fd7 100644 --- a/deploy/environments/libvirt_environment.py +++ b/deploy/environments/libvirt_environment.py @@ -49,11 +49,12 @@ class LibvirtEnvironment(ExecutionEnvironment): check_file_exists(vm_template) disk_path = '%s/%s.raw' % (self.storage_dir, vm_name) self.create_storage(node_id, disk_path, disk_sizes) - number_cpus = self.dha.get_number_cpus( - self.dea.get_node_main_role(node_id, self.fuel_node_id)) temp_vm_file = '%s/%s' % (temp_dir, vm_name) exec_cmd('cp %s %s' % (vm_template, temp_vm_file)) - self.define_vm(vm_name, temp_vm_file, disk_path, number_cpus) + vm_definition_overwrite = self.dha.get_vm_definition( + self.dea.get_node_main_role(node_id, self.fuel_node_id)) + self.define_vm(vm_name, temp_vm_file, disk_path, + vm_definition_overwrite) delete(temp_dir) def start_vms(self): diff --git a/deploy/environments/virtual_fuel.py b/deploy/environments/virtual_fuel.py index 62082185f..cb3bc6c51 100644 --- a/deploy/environments/virtual_fuel.py +++ b/deploy/environments/virtual_fuel.py @@ -55,12 +55,13 @@ class VirtualFuel(ExecutionEnvironment): disk_path = '%s/%s.raw' % (self.storage_dir, vm_name) disk_sizes = self.dha.get_disks() disk_size = disk_sizes['fuel'] - number_cpus = self.dha.get_number_cpus('fuel') exec_cmd('qemu-img create -f qcow2 %s %s' % (disk_path, disk_size)) temp_vm_file = '%s/%s' % (temp_dir, vm_name) exec_cmd('cp %s %s' % (vm_template, temp_vm_file)) self.set_vm_nic(temp_vm_file) - self.define_vm(vm_name, temp_vm_file, disk_path, number_cpus) + vm_definition_overwrite = self.dha.get_vm_definition('fuel') + self.define_vm(vm_name, temp_vm_file, disk_path, + vm_definition_overwrite) delete(temp_dir) def setup_environment(self): |