From ae5f52ca92fe953fd7b7448f945bf12eb2d62afc Mon Sep 17 00:00:00 2001 From: anwars Date: Mon, 22 Apr 2019 10:35:27 +0530 Subject: [PATCH] Feature 7106 : Handle additional EPA parameters for openstack VIM connector Gerrit feature request : https://osm.etsi.org/gerrit/#/c/7106/ Changes: NFVO engine to read and parse the quota descriptor and store as flavor extended properties. Openstack VIM Connector to process the new extended properties and suitably pass them as extra specs when creating flavor. Change-Id: Icdd8730f6f6de6d420027de962f0f5def0376375 Signed-off-by: anwars --- osm_ro/nfvo.py | 24 ++++++++++++++++ osm_ro/vimconn_openstack.py | 57 +++++++++++++++++++++++++------------ 2 files changed, 63 insertions(+), 18 deletions(-) diff --git a/osm_ro/nfvo.py b/osm_ro/nfvo.py index ff47fecf..1d55a3c9 100644 --- a/osm_ro/nfvo.py +++ b/osm_ro/nfvo.py @@ -877,6 +877,21 @@ def _lookfor_or_create_image(db_image, mydb, descriptor): db_image["uuid"] = image_uuid return None +def get_resource_allocation_params(quota_descriptor): + """ + read the quota_descriptor from vnfd and fetch the resource allocation properties from the descriptor object + :param quota_descriptor: cpu/mem/vif/disk-io quota descriptor + :return: quota params for limit, reserve, shares from the descriptor object + """ + quota = {} + if quota_descriptor.get("limit"): + quota["limit"] = int(quota_descriptor["limit"]) + if quota_descriptor.get("reserve"): + quota["reserve"] = int(quota_descriptor["reserve"]) + if quota_descriptor.get("shares"): + quota["shares"] = int(quota_descriptor["shares"]) + return quota + def new_vnfd_v3(mydb, tenant_id, vnf_descriptor): """ Parses an OSM IM vnfd_catalog and insert at DB @@ -1261,6 +1276,15 @@ def new_vnfd_v3(mydb, tenant_id, vnf_descriptor): numa["cores"] = max(db_flavor["vcpus"], 1) else: numa["threads"] = max(db_flavor["vcpus"], 1) + epa_vcpu_set = True + if vdu["guest-epa"].get("cpu-quota") and not epa_vcpu_set: + extended["cpu-quota"] = get_resource_allocation_params(vdu["guest-epa"].get("cpu-quota")) + if vdu["guest-epa"].get("mem-quota"): + extended["mem-quota"] = get_resource_allocation_params(vdu["guest-epa"].get("mem-quota")) + if vdu["guest-epa"].get("disk-io-quota"): + extended["disk-io-quota"] = get_resource_allocation_params(vdu["guest-epa"].get("disk-io-quota")) + if vdu["guest-epa"].get("vif-quota"): + extended["vif-quota"] = get_resource_allocation_params(vdu["guest-epa"].get("vif-quota")) if numa: extended["numas"] = [numa] if extended: diff --git a/osm_ro/vimconn_openstack.py b/osm_ro/vimconn_openstack.py index 3515ef68..1b1c6e51 100644 --- a/osm_ro/vimconn_openstack.py +++ b/osm_ro/vimconn_openstack.py @@ -794,8 +794,8 @@ class vimconnector(vimconn.vimconnector): flavor_candidate_data = (10000, 10000, 10000) flavor_target = (flavor_dict["ram"], flavor_dict["vcpus"], flavor_dict["disk"]) # numa=None - numas = flavor_dict.get("extended", {}).get("numas") - if numas: + extended = flavor_dict.get("extended", {}) + if extended: #TODO raise vimconn.vimconnNotFoundException("Flavor with EPA still not implemted") # if len(numas) > 1: @@ -819,6 +819,20 @@ class vimconnector(vimconn.vimconnector): except (nvExceptions.NotFound, nvExceptions.ClientException, ksExceptions.ClientException, ConnectionError) as e: self._format_exception(e) + def process_resource_quota(self, quota, prefix, extra_specs): + """ + :param prefix: + :param extra_specs: + :return: + """ + if 'limit' in quota: + extra_specs["quota:" + prefix + "_limit"] = quota['limit'] + if 'reserve' in quota: + extra_specs["quota:" + prefix + "_reservation"] = quota['reserve'] + if 'shares' in quota: + extra_specs["quota:" + prefix + "_shares_level"] = "custom" + extra_specs["quota:" + prefix + "_shares_share"] = quota['shares'] + def new_flavor(self, flavor_data, change_name_if_used=True): '''Adds a tenant flavor to openstack VIM if change_name_if_used is True, it will change name in case of conflict, because it is not supported name repetition @@ -846,7 +860,7 @@ class vimconnector(vimconn.vimconnector): ram = flavor_data.get('ram',64) vcpus = flavor_data.get('vcpus',1) - numa_properties=None + extra_specs={} extended = flavor_data.get("extended") if extended: @@ -855,13 +869,13 @@ class vimconnector(vimconn.vimconnector): numa_nodes = len(numas) if numa_nodes > 1: return -1, "Can not add flavor with more than one numa" - numa_properties = {"hw:numa_nodes":str(numa_nodes)} - numa_properties["hw:mem_page_size"] = "large" - numa_properties["hw:cpu_policy"] = "dedicated" - numa_properties["hw:numa_mempolicy"] = "strict" + extra_specs["hw:numa_nodes"] = str(numa_nodes) + extra_specs["hw:mem_page_size"] = "large" + extra_specs["hw:cpu_policy"] = "dedicated" + extra_specs["hw:numa_mempolicy"] = "strict" if self.vim_type == "VIO": - numa_properties["vmware:extra_config"] = '{"numa.nodeAffinity":"0"}' - numa_properties["vmware:latency_sensitivity_level"] = "high" + extra_specs["vmware:extra_config"] = '{"numa.nodeAffinity":"0"}' + extra_specs["vmware:latency_sensitivity_level"] = "high" for numa in numas: #overwrite ram and vcpus #check if key 'memory' is present in numa else use ram value at flavor @@ -871,23 +885,30 @@ class vimconnector(vimconn.vimconnector): if 'paired-threads' in numa: vcpus = numa['paired-threads']*2 #cpu_thread_policy "require" implies that the compute node must have an STM architecture - numa_properties["hw:cpu_thread_policy"] = "require" - numa_properties["hw:cpu_policy"] = "dedicated" + extra_specs["hw:cpu_thread_policy"] = "require" + extra_specs["hw:cpu_policy"] = "dedicated" elif 'cores' in numa: vcpus = numa['cores'] # cpu_thread_policy "prefer" implies that the host must not have an SMT architecture, or a non-SMT architecture will be emulated - numa_properties["hw:cpu_thread_policy"] = "isolate" - numa_properties["hw:cpu_policy"] = "dedicated" + extra_specs["hw:cpu_thread_policy"] = "isolate" + extra_specs["hw:cpu_policy"] = "dedicated" elif 'threads' in numa: vcpus = numa['threads'] # cpu_thread_policy "prefer" implies that the host may or may not have an SMT architecture - numa_properties["hw:cpu_thread_policy"] = "prefer" - numa_properties["hw:cpu_policy"] = "dedicated" + extra_specs["hw:cpu_thread_policy"] = "prefer" + extra_specs["hw:cpu_policy"] = "dedicated" # for interface in numa.get("interfaces",() ): # if interface["dedicated"]=="yes": # raise vimconn.vimconnException("Passthrough interfaces are not supported for the openstack connector", http_code=vimconn.HTTP_Service_Unavailable) # #TODO, add the key 'pci_passthrough:alias"="