summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--build/f_isoroot/f_odlpluginbuild/Makefile4
-rw-r--r--deploy/config/labs/devel-pipeline/elx/fuel/config/dha.yaml48
-rw-r--r--deploy/deploy-config.py51
-rw-r--r--deploy/dha_adapters/hardware_adapter.py8
-rw-r--r--deploy/environments/execution_environment.py31
-rw-r--r--deploy/environments/libvirt_environment.py7
-rw-r--r--deploy/environments/virtual_fuel.py5
7 files changed, 131 insertions, 23 deletions
diff --git a/build/f_isoroot/f_odlpluginbuild/Makefile b/build/f_isoroot/f_odlpluginbuild/Makefile
index 5e563ff33..e8afd4a9b 100644
--- a/build/f_isoroot/f_odlpluginbuild/Makefile
+++ b/build/f_isoroot/f_odlpluginbuild/Makefile
@@ -13,8 +13,8 @@ ODL_REPO="https://github.com/openstack/fuel-plugin-opendaylight.git"
export USE_JAVA8=true
export JAVA8_URL=https://launchpad.net/~openjdk-r/+archive/ubuntu/ppa/+files/openjdk-8-jre-headless_8u72-b15-1~trusty1_amd64.deb
-export ODL_TARBALL_LOCATION=https://nexus.opendaylight.org/content/repositories/opendaylight.release/org/opendaylight/integration/distribution-karaf/0.4.0-Beryllium/distribution-karaf-0.4.0-Beryllium.tar.gz
-
+export ODL_TARBALL_LOCATION=https://nexus.opendaylight.org/content/repositories/opendaylight.release/org/opendaylight/integration/distribution-karaf/0.4.1-Beryllium-SR1/distribution-karaf-0.4.1-Beryllium-SR1.tar.gz
+export ODL_VERSION_NUMBER=0.4.1
.PHONY: all
all: .odlbuild
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):