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
topic_msg = "ns"
schema_new = ns_instantiate
- def __init__(self, db, fs, msg):
- BaseTopic.__init__(self, db, fs, msg)
+ def __init__(self, db, fs, msg, auth):
+ BaseTopic.__init__(self, db, fs, msg, auth)
def _check_descriptor_dependencies(self, session, descriptor):
"""
"""
try:
+ step = "checking quotas"
+ self.check_quota(session)
+
step = "validating input parameters"
ns_request = self._remove_envelop(indata)
# Override descriptor with query string kwargs
topic = "vnfrs"
topic_msg = None
- def __init__(self, db, fs, msg):
- BaseTopic.__init__(self, db, fs, msg)
+ def __init__(self, db, fs, msg, auth):
+ BaseTopic.__init__(self, db, fs, msg, auth)
def delete(self, session, _id, dry_run=False):
raise EngineException("Method delete called directly", HTTPStatus.INTERNAL_SERVER_ERROR)
"terminate": None,
}
- def __init__(self, db, fs, msg):
- BaseTopic.__init__(self, db, fs, msg)
+ def __init__(self, db, fs, msg, auth):
+ BaseTopic.__init__(self, db, fs, msg, auth)
def _check_ns_operation(self, session, nsr, operation, indata):
"""
: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):
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
topic = "nsis"
topic_msg = "nsi"
- def __init__(self, db, fs, msg):
- BaseTopic.__init__(self, db, fs, msg)
- self.nsrTopic = NsrTopic(db, fs, msg)
+ def __init__(self, db, fs, msg, auth):
+ BaseTopic.__init__(self, db, fs, msg, auth)
+ self.nsrTopic = NsrTopic(db, fs, msg, auth)
@staticmethod
def _format_ns_request(ns_request):
"""
try:
+ step = "checking quotas"
+ self.check_quota(session)
+
step = ""
slice_request = self._remove_envelop(indata)
# Override descriptor with query string kwargs
# Is the nss shared and instantiated?
_filter["_admin.nsrs-detailed-list.ANYINDEX.shared"] = True
_filter["_admin.nsrs-detailed-list.ANYINDEX.nsd-id"] = service["nsd-ref"]
+ _filter["_admin.nsrs-detailed-list.ANYINDEX.nss-id"] = service["id"]
nsi = self.db.get_one("nsis", _filter, fail_on_empty=False, fail_on_more=False)
-
if nsi and service.get("is-shared-nss"):
nsrs_detailed_list = nsi["_admin"]["nsrs-detailed-list"]
for nsrs_detailed_item in nsrs_detailed_list:
if nsrs_detailed_item["nsd-id"] == service["nsd-ref"]:
- _id_nsr = nsrs_detailed_item["nsrId"]
- break
+ if nsrs_detailed_item["nss-id"] == service["id"]:
+ _id_nsr = nsrs_detailed_item["nsrId"]
+ break
for netslice_subnet in nsi["_admin"]["netslice-subnet"]:
if netslice_subnet["nss-id"] == service["id"]:
indata_ns = netslice_subnet
# Creates Nsr objects
_id_nsr, _ = self.nsrTopic.new(rollback, session, indata_ns, kwargs, headers)
nsrs_item = {"nsrId": _id_nsr, "shared": service.get("is-shared-nss"), "nsd-id": service["nsd-ref"],
- "nslcmop_instantiate": None}
+ "nss-id": service["id"], "nslcmop_instantiate": None}
indata_ns["nss-id"] = service["id"]
nsrs_list.append(nsrs_item)
nsi_netslice_subnet.append(indata_ns)
"terminate": None
}
- def __init__(self, db, fs, msg):
- BaseTopic.__init__(self, db, fs, msg)
- self.nsi_NsLcmOpTopic = NsLcmOpTopic(self.db, self.fs, self.msg)
+ def __init__(self, db, fs, msg, auth):
+ BaseTopic.__init__(self, db, fs, msg, auth)
+ self.nsi_NsLcmOpTopic = NsLcmOpTopic(self.db, self.fs, self.msg, self.auth)
def _check_nsi_operation(self, session, nsir, operation, indata):
"""