X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2FNBI.git;a=blobdiff_plain;f=osm_nbi%2Finstance_topics.py;h=d3a3b4162fc31d4e01e3ab26aad2459f1c8fcfa6;hp=809578ed25755dbd3f0b60fa69b77569c5743317;hb=982da4e03c39e679919c1cb36fc00e9b8bd5d450;hpb=08ddb14b077121ffced28e41c441fef31b6bb6a1 diff --git a/osm_nbi/instance_topics.py b/osm_nbi/instance_topics.py index 809578e..d3a3b41 100644 --- a/osm_nbi/instance_topics.py +++ b/osm_nbi/instance_topics.py @@ -18,8 +18,8 @@ from uuid import uuid4 from http import HTTPStatus from time import time from copy import copy, deepcopy -from validation import validate_input, ValidationError, ns_instantiate, ns_action, ns_scale, nsi_instantiate -from base_topic import BaseTopic, EngineException, get_iterable +from osm_nbi.validation import validate_input, ValidationError, ns_instantiate, ns_action, ns_scale, nsi_instantiate +from osm_nbi.base_topic import BaseTopic, EngineException, get_iterable # from descriptor_topics import DescriptorTopic from yaml import safe_dump from osm_common.dbbase import DbException @@ -426,22 +426,34 @@ class NsLcmOpTopic(BaseTopic): :param indata: descriptor with the parameters of the operation :return: None """ - vnfds = {} + vnf_member_index_to_vnfd = {} # map between vnf_member_index to vnf descriptor. vim_accounts = [] wim_accounts = [] nsd = nsr["nsd"] def check_valid_vnf_member_index(member_vnf_index): - # TODO change to vnfR - for vnf in nsd["constituent-vnfd"]: - if member_vnf_index == vnf["member-vnf-index"]: - vnfd_id = vnf["vnfd-id-ref"] - if vnfd_id not in vnfds: - vnfds[vnfd_id] = self.db.get_one("vnfds", {"id": vnfd_id}) - return vnfds[vnfd_id] - else: + # Obtain vnf descriptor. The vnfr is used to get the vnfd._id used for this member_vnf_index + if vnf_member_index_to_vnfd.get(member_vnf_index): + return vnf_member_index_to_vnfd[member_vnf_index] + vnfr = self.db.get_one("vnfrs", + {"nsr-id-ref": nsr["_id"], "member-vnf-index-ref": member_vnf_index}, + fail_on_empty=False) + if not vnfr: raise EngineException("Invalid parameter member_vnf_index='{}' is not one of the " "nsd:constituent-vnfd".format(member_vnf_index)) + vnfd = self.db.get_one("vnfds", {"_id": vnfr["vnfd-id"]}, fail_on_empty=False) + if not vnfd: + raise EngineException("vnfd id={} has been deleted!. Operation cannot be performed". + format(vnfr["vnfd-id"])) + vnf_member_index_to_vnfd[member_vnf_index] = vnfd # add to cache, avoiding a later look for + return vnfd + + def check_valid_vdu(vnfd, vdu_id): + for vdud in get_iterable(vnfd.get("vdu")): + if vdud["id"] == vdu_id: + return vdud + else: + raise EngineException("Invalid parameter vdu_id='{}' not present at vnfd:vdu:id".format(vdu_id)) def _check_vnf_instantiation_params(in_vnfd, vnfd): @@ -520,7 +532,11 @@ class NsLcmOpTopic(BaseTopic): indata["member_vnf_index"] = indata.pop("vnf_member_index") # for backward compatibility if indata.get("member_vnf_index"): vnfd = check_valid_vnf_member_index(indata["member_vnf_index"]) - descriptor_configuration = vnfd.get("vnf-configuration", {}).get("config-primitive") + if indata.get("vdu_id"): + vdud = check_valid_vdu(vnfd, indata["vdu_id"]) + descriptor_configuration = vdud.get("vdu-configuration", {}).get("config-primitive") + else: + descriptor_configuration = vnfd.get("vnf-configuration", {}).get("config-primitive") else: # use a NSD descriptor_configuration = nsd.get("ns-configuration", {}).get("config-primitive") # check primitive