X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2FNBI.git;a=blobdiff_plain;f=osm_nbi%2Finstance_topics.py;h=9dced30d14a643b4244878c77dcc20c0776bd4e4;hp=de5bfd13ad2d6e1438208ed14e949620d73e9805;hb=f0637057dc1be391f068c7e2b9c8f81b16f0921e;hpb=bee085cdb94d0b864af28e8db9fc333e15e86209 diff --git a/osm_nbi/instance_topics.py b/osm_nbi/instance_topics.py index de5bfd1..9dced30 100644 --- a/osm_nbi/instance_topics.py +++ b/osm_nbi/instance_topics.py @@ -192,6 +192,7 @@ class NsrTopic(BaseTopic): "nsd-name-ref": nsd["name"], "operational-events": [], # "id", "timestamp", "description", "event", "nsd-ref": nsd["id"], + "nsd-id": nsd["_id"], "instantiate_params": self._format_ns_request(ns_request), "additionalParamsForNs": self._format_addional_params(ns_request), "ns-instance-config-ref": nsr_id, @@ -771,6 +772,33 @@ class NsiTopic(BaseTopic): def __init__(self, db, fs, msg): BaseTopic.__init__(self, db, fs, msg) + self.nsrTopic = NsrTopic(db, fs, msg) + + @staticmethod + def _format_ns_request(ns_request): + formated_request = copy(ns_request) + # TODO: Add request params + return formated_request + + @staticmethod + def _format_addional_params(slice_request): + """ + Get and format user additional params for NS or VNF + :param slice_request: User instantiation additional parameters + :return: a formatted copy of additional params or None if not supplied + """ + additional_params = copy(slice_request.get("additionalParamsForNsi")) + if additional_params: + for k, v in additional_params.items(): + if not isinstance(k, str): + raise EngineException("Invalid param at additionalParamsForNsi:{}. Only string keys are allowed". + format(k)) + if "." in k or "$" in k: + raise EngineException("Invalid param at additionalParamsForNsi:{}. Keys must not contain dots or $". + format(k)) + if isinstance(v, (dict, tuple, list)): + additional_params[k] = "!!yaml " + safe_dump(v) + return additional_params def _check_descriptor_dependencies(self, session, descriptor): """ @@ -827,7 +855,7 @@ class NsiTopic(BaseTopic): _filter = {"_id": id_item} nslcmop = self.db.get_one("nslcmops", _filter) nsr_id = nslcmop["operationParams"]["nsr_id"] - NsrTopic.delete(self, session, nsr_id, force=False, dry_run=False) + self.nsrTopic.delete(session, nsr_id, force=False, dry_run=False) self._send_msg("deleted", {"_id": _id}) return v @@ -873,6 +901,7 @@ class NsiTopic(BaseTopic): "nsr-ref-list": [], "vlr-list": [], "_id": nsi_id, + "additionalParamsForNsi": self._format_addional_params(slice_request) } step = "creating nsi at database" @@ -911,7 +940,7 @@ class NsiTopic(BaseTopic): if ins_param.get("id") == netslice_vld["nss-ref"]: if ins_param.get("vimAccountId"): nsi_vld["vimAccountId"] = ins_param["vimAccountId"] - # Adding vim-network-name defined by the user to vld + # Adding vim-network-name / vim-network-id defined by the user to vld if instantiation_parameters.get("netslice-vld"): for ins_param in instantiation_parameters["netslice-vld"]: if ins_param["name"] == netslice_vlds["name"]: @@ -919,6 +948,8 @@ class NsiTopic(BaseTopic): nsi_vld["vim-network-name"] = ins_param.get("vim-network-name") if ins_param.get("vim-network-id"): nsi_vld["vim-network-id"] = ins_param.get("vim-network-id") + if netslice_vlds.get("mgmt-network"): + nsi_vld["mgmt-network"] = netslice_vlds.get("mgmt-network") nsi_vlds.append(nsi_vld) nsi_descriptor["_admin"]["netslice-vld"] = nsi_vlds @@ -945,6 +976,16 @@ class NsiTopic(BaseTopic): step = "filling nsir nsd-id='{}' constituent-nsd='{}' from database".format( member_ns["nsd-ref"], member_ns["id"]) + # check additionalParamsForSubnet contains a valid id + if slice_request.get("additionalParamsForSubnet"): + for additional_params_subnet in get_iterable(slice_request.get("additionalParamsForSubnet")): + for service in services: + if additional_params_subnet["id"] == service["id"]: + break + else: + raise EngineException("Error at additionalParamsForSubnet:id='{}' not match any " + "netslice-subnet:id".format(additional_params_subnet["id"])) + # creates Network Services records (NSRs) step = "creating nsrs at database using NsrTopic.new()" ns_params = slice_request.get("netslice-subnet") @@ -958,6 +999,13 @@ class NsiTopic(BaseTopic): indata_ns["vimAccountId"] = slice_request.get("vimAccountId") indata_ns["nsDescription"] = service["description"] indata_ns["key-pair-ref"] = None + for additional_params_subnet in get_iterable(slice_request.get("additionalParamsForSubnet")): + if additional_params_subnet["id"] == service["id"]: + if additional_params_subnet.get("additionalParamsForNs"): + indata_ns["additionalParamsForNs"] = additional_params_subnet["additionalParamsForNs"] + if additional_params_subnet.get("additionalParamsForVnf"): + indata_ns["additionalParamsForVnf"] = additional_params_subnet["additionalParamsForVnf"] + break # NsrTopic(rollback, session, indata_ns, kwargs, headers, force) # Overwriting ns_params filtering by nsName == netslice-subnet.id @@ -969,27 +1017,40 @@ class NsiTopic(BaseTopic): del copy_ns_param["id"] indata_ns.update(copy_ns_param) # TODO: Improve network selection via networkID + # Override the instantiation parameters for netslice-vld provided by user if nsi_vlds: indata_ns_list = [] for nsi_vld in nsi_vlds: nsd = self.db.get_one("nsds", {"id": nsi_vld["nsd-ref"]}) if nsd["connection-point"]: - for vld_id_ref in nsd["connection-point"]: - name = vld_id_ref["vld-id-ref"] - vnm = nsi_vld.get("vim-network-name") - if type(vnm) is not dict: - vnm = {slice_request.get("vimAccountId"): vnm} - if vld_id_ref["name"] == nsi_vld["nsd-connection-point-ref"]: - if list(vnm.values())[0] is None: - networkName = "default" + for cp_item in nsd["connection-point"]: + if cp_item["name"] == nsi_vld["nsd-connection-point-ref"]: + vld_id_ref = cp_item["vld-id-ref"] + # Mapping the vim-network-name or vim-network-id instantiation parameters + if nsi_vld.get("vim-network-id"): + vnid = nsi_vld.get("vim-network-id") + if type(vnid) is not dict: + vim_network_id = {slice_request.get("vimAccountId"): vnid} + else: # is string + vim_network_id = vnid + indata_ns_list.append({"name": vld_id_ref, "vim-network-id": vim_network_id}) + # Case not vim-network-name instantiation parameter + elif nsi_vld.get("vim-network-name"): + vnm = nsi_vld.get("vim-network-name") + if type(vnm) is not dict: + vim_network_name = {slice_request.get("vimAccountId"): vnm} + else: # is string + vim_network_name = vnm + indata_ns_list.append({"name": vld_id_ref, + "vim-network-name": vim_network_name}) + # Case neither vim-network-name nor vim-network-id provided else: - networkName = str(list(vnm.values())[0]) - # VIMNetworkName = NetSliceName-NetworkName - vimnetname = str(slice_request["nsiName"]) + "-" + networkName - indata_ns_list.append({"name": name, "vim-network-name": vimnetname}) - indata_ns["vld"] = indata_ns_list - - _id_nsr = NsrTopic.new(self, rollback, session, indata_ns, kwargs, headers, force) + indata_ns_list.append({"name": vld_id_ref}) + if indata_ns_list: + indata_ns["vld"] = indata_ns_list + + # Creates Nsr objects + _id_nsr = self.nsrTopic.new(rollback, session, indata_ns, kwargs, headers, force) nsrs_item = {"nsrId": _id_nsr} nsrs_list.append(nsrs_item) nsi_netslice_subnet.append(indata_ns)