Before creating a Network Slice, check underlying NST is not in DISABLED state
[osm/NBI.git] / osm_nbi / instance_topics.py
index e091abd..f4d4c73 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):
@@ -229,6 +230,12 @@ class NsrTopic(BaseTopic):
             nsd = self.db.get_one("nsds", _filter)
             del _filter["_id"]
 
+            # check NSD is not disabled
+            step = "checking nsdOperationalState"
+            if nsd["_admin"]["operationalState"] == "DISABLED":
+                raise EngineException("nsd with id '{}' is DISABLED, and thus cannot be used to create "
+                                      "a network service".format(ns_request["nsdId"]), http_code=HTTPStatus.CONFLICT)
+
             nsr_id = str(uuid4())
 
             now = time()
@@ -255,7 +262,8 @@ class NsrTopic(BaseTopic):
                 "deploymentStatus": None,
                 "configurationStatus": None,
                 "vcaStatus": None,
-                "nsd": {k: v for k, v in nsd.items() if k in ("vld", "_id", "id", "constituent-vnfd", "name")},
+                "nsd": {k: v for k, v in nsd.items() if k in ("vld", "_id", "id", "constituent-vnfd", "name",
+                                                              "ns-configuration")},
                 "datacenter": ns_request["vimAccountId"],
                 "resource-orchestrator": "osmopenmano",
                 "description": ns_request.get("nsDescription", ""),
@@ -283,6 +291,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"]
@@ -309,9 +320,6 @@ class NsrTopic(BaseTopic):
                 additional_params, vnf_params = self._format_additional_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"]
                 vnfr_descriptor = {
                     "id": vnfr_id,
                     "_id": vnfr_id,
@@ -327,6 +335,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"):
@@ -390,6 +404,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]
@@ -398,8 +414,8 @@ class NsrTopic(BaseTopic):
                     vnfr_descriptor["kdur"].append(kdur)
 
                 for vdu in vnfd.get("vdu", ()):
-                    additional_params, _ = self._format_additional_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
@@ -409,8 +425,13 @@ 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"]
+                        vdur["name"] = vdu["pdu-type"]
                     # TODO volumes: name, volume-id
                     for icp in vdu.get("internal-connection-point", ()):
                         vdu_icp = {
@@ -485,7 +506,7 @@ class NsrTopic(BaseTopic):
 
             return nsr_id, None
         except (ValidationError, EngineException, DbException, MsgException, FsException) as e:
-            raise type(e)("{} while '{}".format(e, step), http_code=e.http_code)
+            raise type(e)("{} while '{}'".format(e, step), http_code=e.http_code)
 
     def edit(self, session, _id, indata=None, kwargs=None, content=None):
         raise EngineException("Method edit called directly", HTTPStatus.INTERNAL_SERVER_ERROR)
@@ -1070,6 +1091,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)
@@ -1249,6 +1271,12 @@ class NsiTopic(BaseTopic):
             nstd = self.db.get_one("nsts", _filter)
             del _filter["_id"]
 
+            # check NSD is not disabled
+            step = "checking operationalState"
+            if nstd["_admin"]["operationalState"] == "DISABLED":
+                raise EngineException("nst with id '{}' is DISABLED, and thus cannot be used to create "
+                                      "a network slice".format(slice_request["nstId"]), http_code=HTTPStatus.CONFLICT)
+
             nstd.pop("_admin", None)
             nstd_id = nstd.pop("_id", None)
             nsi_id = str(uuid4())