X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2FNBI.git;a=blobdiff_plain;f=osm_nbi%2Finstance_topics.py;h=6121ff2c860668cc22fe3dfd8dbcffce51882ca1;hp=d04d99b722acb2c8f911f66862bcba9979ff058a;hb=2a929042e82cf1e010da9d8ff516f96159a57efd;hpb=714954e34ba8af38c696a802c789699ae0299648 diff --git a/osm_nbi/instance_topics.py b/osm_nbi/instance_topics.py index d04d99b..6121ff2 100644 --- a/osm_nbi/instance_topics.py +++ b/osm_nbi/instance_topics.py @@ -74,13 +74,14 @@ class NsrTopic(BaseTopic): "Launch 'terminate' operation first; or force deletion".format(_id), http_code=HTTPStatus.CONFLICT) - def delete_extra(self, session, _id, db_content): + def delete_extra(self, session, _id, db_content, not_send_msg=None): """ Deletes associated nslcmops and vnfrs from database. Deletes associated filesystem. Set usageState of pdu, vnfd, nsd :param session: contains "username", "admin", "force", "public", "project_id", "set_project" :param _id: server internal id :param db_content: The database content of the descriptor + :param not_send_msg: To not send message (False) or store content (list) instead :return: None if ok or raises EngineException with the problem """ self.fs.file_delete(_id, ignore_non_exist=True) @@ -141,12 +142,14 @@ class NsrTopic(BaseTopic): item_vdu = next((x for x in item["additionalParamsForVdu"] if x["vdu_id"] == vdu_id), None) if item_vdu and item_vdu.get("additionalParams"): where_ += ".additionalParamsForVdu[vdu_id={}]".format(vdu_id) - additional_params.update(item_vdu["additionalParams"]) - if kdu_name and item.get("additionalParamsForKdu"): - item_kdu = next((x for x in item["additionalParamsForKdu"] if x["kdu_name"] == kdu_name), None) - if item_kdu and item_kdu.get("additionalParams"): - where_ += ".additionalParamsForKdu[kdu_name={}]".format(kdu_name) - additional_params.update(item_kdu["additionalParams"]) + additional_params = item_vdu["additionalParams"] + if kdu_name: + additional_params = {} + if item.get("additionalParamsForKdu"): + item_kdu = next((x for x in item["additionalParamsForKdu"] if x["kdu_name"] == kdu_name), None) + if item_kdu and item_kdu.get("additionalParams"): + where_ += ".additionalParamsForKdu[kdu_name={}]".format(kdu_name) + additional_params = item_kdu["additionalParams"] if additional_params: for k, v in additional_params.items(): @@ -229,6 +232,14 @@ class NsrTopic(BaseTopic): "name-ref": ns_request["nsName"], "short-name": ns_request["nsName"], "admin-status": "ENABLED", + "nsState": "NOT_INSTANTIATED", + "currentOperation": "IDLE", + "currentOperationID": None, + "errorDescription": None, + "errorDetail": None, + "deploymentStatus": None, + "configurationStatus": None, + "vcaStatus": None, "nsd": nsd, "datacenter": ns_request["vimAccountId"], "resource-orchestrator": "osmopenmano", @@ -348,10 +359,10 @@ class NsrTopic(BaseTopic): kdur = {x: kdu[x] for x in kdu if x in ("helm-chart", "juju-bundle")} kdur["kdu-name"] = kdu["name"] # TODO "name": "" Name of the VDU in the VIM - kdur["ip-address"] = None, # mgmt-interface filled by LCM - kdur["k8s-cluster"] = {}, + kdur["ip-address"] = None # mgmt-interface filled by LCM + kdur["k8s-cluster"] = {} kdur["additionalParams"] = self._format_addional_params(ns_request, member_vnf["member-vnf-index"], - kdu_name=kdu["name"], descriptor=vnfd), + kdu_name=kdu["name"], descriptor=vnfd) if not vnfr_descriptor.get("kdur"): vnfr_descriptor["kdur"] = [] vnfr_descriptor["kdur"].append(kdur) @@ -365,7 +376,7 @@ class NsrTopic(BaseTopic): "internal-connection-point": [], "interfaces": [], "additionalParams": self._format_addional_params(ns_request, member_vnf["member-vnf-index"], - vdu_id=vdu["id"], descriptor=vnfd), + vdu_id=vdu["id"], descriptor=vnfd) } if vdu.get("pdu-type"): vdur["pdu-type"] = vdu["pdu-type"] @@ -456,7 +467,7 @@ class VnfrTopic(BaseTopic): def __init__(self, db, fs, msg, auth): BaseTopic.__init__(self, db, fs, msg, auth) - def delete(self, session, _id, dry_run=False): + def delete(self, session, _id, dry_run=False, not_send_msg=None): raise EngineException("Method delete called directly", HTTPStatus.INTERNAL_SERVER_ERROR) def edit(self, session, _id, indata=None, kwargs=None, content=None): @@ -673,7 +684,6 @@ class NsLcmOpTopic(BaseTopic): Look for a free PDU in the catalog matching vdur type and interfaces. Fills vnfr.vdur with the interface (ip_address, ...) information. Modifies PDU _admin.usageState to 'IN_USE' - :param session: contains "username", "admin", "force", "public", "project_id", "set_project" :param rollback: list with the database modifications to rollback if needed :param vnfr: vnfr to be updated. It is modified with pdu interface info if pdu is found @@ -749,7 +759,7 @@ class NsLcmOpTopic(BaseTopic): vnfr_update[iface_text + ".{}".format(k)] = v vnfr_update_rollback[iface_text + ".{}".format(k)] = vdur_interface.get(v) if pdu_interface.get("ip-address"): - if vdur_interface.get("mgmt-interface"): + if vdur_interface.get("mgmt-interface") or vdur_interface.get("mgmt-vnf"): vnfr_update_rollback[vdu_text + ".ip-address"] = vdur.get("ip-address") vnfr_update[vdu_text + ".ip-address"] = pdu_interface["ip-address"] if vdur_interface.get("mgmt-vnf"): @@ -919,6 +929,10 @@ class NsLcmOpTopic(BaseTopic): "id": _id, "_id": _id, "operationState": "PROCESSING", # COMPLETED,PARTIALLY_COMPLETED,FAILED_TEMP,FAILED,ROLLING_BACK,ROLLED_BACK + "queuePosition": None, + "stage": None, + "errorMessage": None, + "detailedStatus": None, "statusEnteredTime": now, "nsInstanceId": nsr_id, "lcmOperationType": operation, @@ -933,6 +947,19 @@ class NsLcmOpTopic(BaseTopic): } return nslcmop + def _get_enabled_vims(self, session): + """ + Retrieve and return VIM accounts that are accessible by current user and has state ENABLE + :param session: current session with user information + """ + db_filter = self._get_project_filter(session) + db_filter["_admin.operationalState"] = "ENABLED" + vims = self.db.get_list("vim_accounts", db_filter) + vimAccounts = [] + for vim in vims: + vimAccounts.append(vim['_id']) + return vimAccounts + def new(self, rollback, session, indata=None, kwargs=None, headers=None, slice_object=False): """ Performs a new operation over a ns @@ -988,6 +1015,9 @@ class NsLcmOpTopic(BaseTopic): nslcmop_desc = self._create_nslcmop(nsInstanceId, operation, indata) _id = nslcmop_desc["_id"] self.format_on_new(nslcmop_desc, session["project_id"], make_public=session["public"]) + if indata.get("placement-engine"): + # Save valid vim accounts in lcm operation descriptor + nslcmop_desc['operationParams']['validVimAccounts'] = self._get_enabled_vims(session) self.db.create("nslcmops", nslcmop_desc) rollback.append({"topic": "nslcmops", "_id": _id}) if not slice_object: @@ -998,7 +1028,7 @@ class NsLcmOpTopic(BaseTopic): # except DbException as e: # raise EngineException("Cannot get ns_instance '{}': {}".format(e), HTTPStatus.NOT_FOUND) - def delete(self, session, _id, dry_run=False): + def delete(self, session, _id, dry_run=False, not_send_msg=None): raise EngineException("Method delete called directly", HTTPStatus.INTERNAL_SERVER_ERROR) def edit(self, session, _id, indata=None, kwargs=None, content=None): @@ -1069,13 +1099,14 @@ class NsiTopic(BaseTopic): "Launch 'terminate' operation first; or force deletion".format(_id), http_code=HTTPStatus.CONFLICT) - def delete_extra(self, session, _id, db_content): + def delete_extra(self, session, _id, db_content, not_send_msg=None): """ Deletes associated nsilcmops from database. Deletes associated filesystem. Set usageState of nst :param session: contains "username", "admin", "force", "public", "project_id", "set_project" :param _id: server internal id :param db_content: The database content of the descriptor + :param not_send_msg: To not send message (False) or store content (list) instead :return: None if ok or raises EngineException with the problem """ @@ -1091,7 +1122,7 @@ class NsiTopic(BaseTopic): if nsi: # last one using nsr continue try: - self.nsrTopic.delete(session, nsr_id, dry_run=False) + self.nsrTopic.delete(session, nsr_id, dry_run=False, not_send_msg=not_send_msg) except (DbException, EngineException) as e: if e.http_code == HTTPStatus.NOT_FOUND: pass @@ -1229,7 +1260,7 @@ class NsiTopic(BaseTopic): nsi_vlds.append(nsi_vld) nsi_descriptor["_admin"]["netslice-vld"] = nsi_vlds - # Creating netslice-subnet_record. + # Creating netslice-subnet_record. needed_nsds = {} services = [] @@ -1509,7 +1540,7 @@ class NsiLcmOpTopic(BaseTopic): except ValidationError as e: raise EngineException(e, HTTPStatus.UNPROCESSABLE_ENTITY) - def delete(self, session, _id, dry_run=False): + def delete(self, session, _id, dry_run=False, not_send_msg=None): raise EngineException("Method delete called directly", HTTPStatus.INTERNAL_SERVER_ERROR) def edit(self, session, _id, indata=None, kwargs=None, content=None):