# check vnf_member_index
if indata.get("vnf_member_index"):
indata["member_vnf_index"] = indata.pop("vnf_member_index") # for backward compatibility
- if not indata.get("member_vnf_index"):
- raise EngineException("Missing 'member_vnf_index' parameter")
- vnfd = check_valid_vnf_member_index(indata["member_vnf_index"])
+ 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")
+ else: # use a NSD
+ descriptor_configuration = nsd.get("ns-configuration", {}).get("config-primitive")
# check primitive
- for config_primitive in get_iterable(vnfd.get("vnf-configuration", {}).get("config-primitive")):
+ for config_primitive in get_iterable(descriptor_configuration):
if indata["primitive"] == config_primitive["name"]:
# check needed primitive_params are provided
if indata.get("primitive_params"):
paramd["name"], indata["primitive"]))
# check no extra primitive params are provided
if in_primitive_params_copy:
- raise EngineException("parameter/s '{}' not present at vnfd for primitive '{}'".format(
+ raise EngineException("parameter/s '{}' not present at vnfd /nsd for primitive '{}'".format(
list(in_primitive_params_copy.keys()), indata["primitive"]))
break
else:
- raise EngineException("Invalid primitive '{}' is not present at vnfd".format(indata["primitive"]))
+ raise EngineException("Invalid primitive '{}' is not present at vnfd/nsd".format(indata["primitive"]))
if operation == "scale":
vnfd = check_valid_vnf_member_index(indata["scaleVnfData"]["scaleByStepData"]["member-vnf-index"])
for scaling_group in get_iterable(vnfd.get("scaling-group-descriptor")):
:param headers: http request headers
:return: id of the nslcmops
"""
+ def check_if_nsr_is_not_slice_member(session, nsr_id):
+ nsis = None
+ db_filter = self._get_project_filter(session)
+ db_filter["_admin.nsrs-detailed-list.ANYINDEX.nsrId"] = nsr_id
+ nsis = self.db.get_one("nsis", db_filter, fail_on_empty=False, fail_on_more=False)
+ if nsis:
+ raise EngineException("The NS instance {} cannot be terminate because is used by the slice {}".format(
+ nsr_id, nsis["_id"]), http_code=HTTPStatus.CONFLICT)
+
try:
# Override descriptor with query string kwargs
self._update_input_with_kwargs(indata, kwargs)
nsr = self.db.get_one("nsrs", _filter)
# initial checking
+ if operation == "terminate" and slice_object is False:
+ check_if_nsr_is_not_slice_member(session, nsr["_id"])
if not nsr["_admin"].get("nsState") or nsr["_admin"]["nsState"] == "NOT_INSTANTIATED":
if operation == "terminate" and indata.get("autoremove"):
# NSR must be deleted
"isCancelPending": False,
"links": {
"self": "/osm/nsilcm/v1/nsi_lcm_op_occs/" + _id,
- "nsInstance": "/osm/nsilcm/v1/netslice_instances/" + netsliceInstanceId,
+ "netsliceInstanceId": "/osm/nsilcm/v1/netslice_instances/" + netsliceInstanceId,
}
}
return nsilcmop
:param rollback: list to append created items at database in case a rollback must to be done
:param session: contains "username", "admin", "force", "public", "project_id", "set_project"
:param indata: descriptor with the parameters of the operation. It must contains among others
- nsiInstanceId: _id of the nsir to perform the operation
+ netsliceInstanceId: _id of the nsir to perform the operation
operation: it can be: instantiate, terminate, action, TODO: update, heal
:param kwargs: used to override the indata descriptor
:param headers: http request headers
# Override descriptor with query string kwargs
self._update_input_with_kwargs(indata, kwargs)
operation = indata["lcmOperationType"]
- nsiInstanceId = indata["nsiInstanceId"]
+ netsliceInstanceId = indata["netsliceInstanceId"]
validate_input(indata, self.operation_schema[operation])
- # get nsi from nsiInstanceId
+ # get nsi from netsliceInstanceId
_filter = self._get_project_filter(session)
- _filter["_id"] = nsiInstanceId
+ _filter["_id"] = netsliceInstanceId
nsir = self.db.get_one("nsis", _filter)
del _filter["_id"]
return None # a none in this case is used to indicate not instantiated. It can be removed
if operation != "instantiate":
raise EngineException("netslice_instance '{}' cannot be '{}' because it is not instantiated".format(
- nsiInstanceId, operation), HTTPStatus.CONFLICT)
+ netsliceInstanceId, operation), HTTPStatus.CONFLICT)
else:
if operation == "instantiate" and not session["force"]:
raise EngineException("netslice_instance '{}' cannot be '{}' because it is already instantiated".
- format(nsiInstanceId, operation), HTTPStatus.CONFLICT)
+ format(netsliceInstanceId, operation), HTTPStatus.CONFLICT)
# Creating all the NS_operation (nslcmop)
# Get service list from db
for index, nsr_item in enumerate(nsrs_list):
nsi = None
if nsr_item.get("shared"):
- _filter["_admin.nsrs-detailed-list.ANYINDEX.shared"] = True,
+ _filter["_admin.nsrs-detailed-list.ANYINDEX.shared"] = True
_filter["_admin.nsrs-detailed-list.ANYINDEX.nsrId"] = nsr_item["nsrId"]
_filter["_admin.nsrs-detailed-list.ANYINDEX.nslcmop_instantiate.ne"] = None
- _filter["_id.ne"] = nsiInstanceId
-
+ _filter["_id.ne"] = netsliceInstanceId
nsi = self.db.get_one("nsis", _filter, fail_on_empty=False, fail_on_more=False)
+ if operation == "terminate":
+ _update = {"_admin.nsrs-detailed-list.{}.nslcmop_instantiate".format(index): None}
+ self.db.set_one("nsis", {"_id": nsir["_id"]}, _update)
+
# looks the first nsi fulfilling the conditions but not being the current NSIR
if nsi:
nsi_admin_shared = nsi["_admin"]["nsrs-detailed-list"]
indata_ns["lcmOperationType"] = operation
indata_ns["nsInstanceId"] = service["_id"]
# Including netslice_id in the ns instantiate Operation
- indata_ns["netsliceInstanceId"] = nsiInstanceId
+ indata_ns["netsliceInstanceId"] = netsliceInstanceId
del indata_ns["key-pair-ref"]
# Creating NS_LCM_OP with the flag slice_object=True to not trigger the service instantiation
# message via kafka bus
indata["nslcmops_ids"] = nslcmops
self._check_nsi_operation(session, nsir, operation, indata)
- nsilcmop_desc = self._create_nsilcmop(session, nsiInstanceId, operation, indata)
+ nsilcmop_desc = self._create_nsilcmop(session, netsliceInstanceId, operation, indata)
self.format_on_new(nsilcmop_desc, session["project_id"], make_public=session["public"])
_id = self.db.create("nsilcmops", nsilcmop_desc)
rollback.append({"topic": "nsilcmops", "_id": _id})