Added coverage tests in tox
[osm/NBI.git] / osm_nbi / instance_topics.py
index 319a690..7a6397a 100644 (file)
@@ -34,6 +34,7 @@ __author__ = "Alfonso Tierno <alfonso.tiernosepulveda@telefonica.com>"
 class NsrTopic(BaseTopic):
     topic = "nsrs"
     topic_msg = "ns"
+    quota_name = "ns_instances"
     schema_new = ns_instantiate
 
     def __init__(self, db, fs, msg, auth):
@@ -121,7 +122,7 @@ class NsrTopic(BaseTopic):
         return formated_request
 
     @staticmethod
-    def _format_addional_params(ns_request, member_vnf_index=None, vdu_id=None, kdu_name=None, descriptor=None):
+    def _format_additional_params(ns_request, member_vnf_index=None, vdu_id=None, kdu_name=None, descriptor=None):
         """
         Get and format user additional params for NS or VNF
         :param ns_request: User instantiation additional parameters
@@ -144,18 +145,18 @@ class NsrTopic(BaseTopic):
                 additional_params = copy(item.get("additionalParams")) or {}
                 if vdu_id and item.get("additionalParamsForVdu"):
                     item_vdu = next((x for x in item["additionalParamsForVdu"] if x["vdu_id"] == vdu_id), None)
+                    other_params = item_vdu
                     if item_vdu and item_vdu.get("additionalParams"):
                         where_ += ".additionalParamsForVdu[vdu_id={}]".format(vdu_id)
                         additional_params = item_vdu["additionalParams"]
-                        other_params = item_vdu
                 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)
+                        other_params = item_kdu
                         if item_kdu and item_kdu.get("additionalParams"):
                             where_ += ".additionalParamsForKdu[kdu_name={}]".format(kdu_name)
                             additional_params = item_kdu["additionalParams"]
-                            other_params = item_kdu
 
         if additional_params:
             for k, v in additional_params.items():
@@ -233,7 +234,7 @@ class NsrTopic(BaseTopic):
 
             now = time()
             step = "filling nsr from input data"
-            additional_params, _ = self._format_addional_params(ns_request, descriptor=nsd)
+            additional_params, _ = self._format_additional_params(ns_request, descriptor=nsd)
 
             # use for k8s-namespace from ns_request or additionalParamsForNs. By default, the project_id
             ns_k8s_namespace = session["project_id"][0] if session["project_id"] else None
@@ -283,6 +284,9 @@ class NsrTopic(BaseTopic):
                 "ssh-authorized-key": ns_request.get("ssh_keys"),  # TODO remove
             }
             ns_request["nsr_id"] = nsr_id
+            if ns_request and ns_request.get("config-units"):
+                nsr_descriptor["config-units"] = ns_request["config-units"]
+
             # Create vld
             if nsd.get("vld"):
                 nsr_descriptor["vld"] = nsd["vld"]
@@ -306,11 +310,9 @@ class NsrTopic(BaseTopic):
                 step = "filling vnfr  vnfd-id='{}' constituent-vnfd='{}'".format(
                     member_vnf["vnfd-id-ref"], member_vnf["member-vnf-index"])
                 vnfr_id = str(uuid4())
-                additional_params, vnf_params = self._format_addional_params(ns_request, member_vnf["member-vnf-index"],
-                                                                             descriptor=vnfd)
-                vnf_k8s_namespace = ns_k8s_namespace
-                if vnf_params and vnf_params.get("k8s-namespace"):
-                    vnf_k8s_namespace = vnf_params["k8s-namespace"]
+                additional_params, vnf_params = self._format_additional_params(ns_request,
+                                                                               member_vnf["member-vnf-index"],
+                                                                               descriptor=vnfd)
                 vnfr_descriptor = {
                     "id": vnfr_id,
                     "_id": vnfr_id,
@@ -326,6 +328,12 @@ class NsrTopic(BaseTopic):
                     "connection-point": [],
                     "ip-address": None,  # mgmt-interface filled by LCM
                 }
+                vnf_k8s_namespace = ns_k8s_namespace
+                if vnf_params:
+                    if vnf_params.get("k8s-namespace"):
+                        vnf_k8s_namespace = vnf_params["k8s-namespace"]
+                    if vnf_params.get("config-units"):
+                        vnfr_descriptor["config-units"] = vnf_params["config-units"]
 
                 # Create vld
                 if vnfd.get("internal-vld"):
@@ -372,11 +380,12 @@ class NsrTopic(BaseTopic):
                                 break
                 # update kdus
                 for kdu in get_iterable(vnfd.get("kdu")):
-                    additional_params, kdu_params = self._format_addional_params(ns_request,
-                                                                                 member_vnf["member-vnf-index"],
-                                                                                 kdu_name=kdu["name"], descriptor=vnfd)
+                    additional_params, kdu_params = self._format_additional_params(ns_request,
+                                                                                   member_vnf["member-vnf-index"],
+                                                                                   kdu_name=kdu["name"],
+                                                                                   descriptor=vnfd)
                     kdu_k8s_namespace = vnf_k8s_namespace
-                    kdu_model = kdu_params.get("kdu_model")
+                    kdu_model = kdu_params.get("kdu_model") if kdu_params else None
                     if kdu_params and kdu_params.get("k8s-namespace"):
                         kdu_k8s_namespace = kdu_params["k8s-namespace"]
 
@@ -388,6 +397,8 @@ class NsrTopic(BaseTopic):
                         "ip-address": None,  # mgmt-interface filled by LCM
                         "k8s-cluster": {},
                     }
+                    if kdu_params and kdu_params.get("config-units"):
+                        kdur["config-units"] = kdu_params["config-units"]
                     for k8s_type in ("helm-chart", "juju-bundle"):
                         if kdu.get(k8s_type):
                             kdur[k8s_type] = kdu_model or kdu[k8s_type]
@@ -396,8 +407,8 @@ class NsrTopic(BaseTopic):
                     vnfr_descriptor["kdur"].append(kdur)
 
                 for vdu in vnfd.get("vdu", ()):
-                    additional_params, _ = self._format_addional_params(ns_request, member_vnf["member-vnf-index"],
-                                                                        vdu_id=vdu["id"], descriptor=vnfd)
+                    additional_params, vdu_params = self._format_additional_params(
+                        ns_request, member_vnf["member-vnf-index"], vdu_id=vdu["id"], descriptor=vnfd)
                     vdur = {
                         "vdu-id-ref": vdu["id"],
                         # TODO      "name": ""     Name of the VDU in the VIM
@@ -407,6 +418,10 @@ class NsrTopic(BaseTopic):
                         "interfaces": [],
                         "additionalParams": additional_params
                     }
+                    if vdu_params and vdu_params.get("config-units"):
+                        vdur["config-units"] = vdu_params["config-units"]
+                    if deep_get(vdu, ("supplemental-boot-data", "boot-data-drive")):
+                        vdur["boot-data-drive"] = vdu["supplemental-boot-data"]["boot-data-drive"]
                     if vdu.get("pdu-type"):
                         vdur["pdu-type"] = vdu["pdu-type"]
                     # TODO volumes: name, volume-id
@@ -594,7 +609,7 @@ class NsLcmOpTopic(BaseTopic):
 
             for in_ivld in get_iterable(in_vnfd.get("internal-vld")):
                 for ivld in get_iterable(vnfd.get("internal-vld")):
-                    if in_ivld["name"] == ivld["name"] or in_ivld["name"] == ivld["id"]:
+                    if in_ivld["name"] in (ivld["id"], ivld.get("name")):
                         for in_icp in get_iterable(in_ivld.get("internal-connection-point")):
                             for icp in ivld["internal-connection-point"]:
                                 if in_icp["id-ref"] == icp["id-ref"]:
@@ -604,7 +619,7 @@ class NsLcmOpTopic(BaseTopic):
                                                       "='{}']:internal-connection-point[id-ref:'{}'] is not present at "
                                                       "vnfd:internal-vld:name/id:internal-connection-point"
                                                       .format(in_vnf["member-vnf-index"], in_ivld["name"],
-                                                              in_icp["id-ref"], vnfd["id"]))
+                                                              in_icp["id-ref"]))
                         break
                 else:
                     raise EngineException("Invalid parameter vnf[member-vnf-index='{}']:internal-vld:name='{}'"
@@ -1068,6 +1083,7 @@ class NsLcmOpTopic(BaseTopic):
 class NsiTopic(BaseTopic):
     topic = "nsis"
     topic_msg = "nsi"
+    quota_name = "slice_instances"
 
     def __init__(self, db, fs, msg, auth):
         BaseTopic.__init__(self, db, fs, msg, auth)
@@ -1418,7 +1434,9 @@ class NsiLcmOpTopic(BaseTopic):
                 if nstId == netslice_subnet["id"]:
                     nsd_id = netslice_subnet["nsd-ref"]
                     if nsd_id not in nsds:
-                        nsds[nsd_id] = self.db.get_one("nsds", {"id": nsd_id})
+                        _filter = self._get_project_filter(session)
+                        _filter["id"] = nsd_id
+                        nsds[nsd_id] = self.db.get_one("nsds", _filter)
                     return nsds[nsd_id]
             else:
                 raise EngineException("Invalid parameter nstId='{}' is not one of the "
@@ -1535,12 +1553,15 @@ class NsiLcmOpTopic(BaseTopic):
 
                 try:
                     service = self.db.get_one("nsrs", {"_id": nsr_item["nsrId"]})
-                    indata_ns = {}
-                    indata_ns = service["instantiate_params"]
-                    indata_ns["lcmOperationType"] = operation
-                    indata_ns["nsInstanceId"] = service["_id"]
-                    # Including netslice_id in the ns instantiate Operation
-                    indata_ns["netsliceInstanceId"] = netsliceInstanceId
+                    indata_ns = {
+                        "lcmOperationType": operation,
+                        "nsInstanceId": service["_id"],
+                        # Including netslice_id in the ns instantiate Operation
+                        "netsliceInstanceId": netsliceInstanceId,
+                    }
+                    if operation == "instantiate":
+                        indata_ns.update(service["instantiate_params"])
+
                     # Creating NS_LCM_OP with the flag slice_object=True to not trigger the service instantiation
                     # message via kafka bus
                     nslcmop, _ = self.nsi_NsLcmOpTopic.new(rollback, session, indata_ns, kwargs, headers,