Feature 11009 Ns Config Template as first class citizens in OSM - NBI

Change-Id: I20edf909b461edc73bebdf9bcad0d2a321b0818f
Signed-off-by: kayal2001 <kayalvizhi.v@tataelxsi.co.in>
diff --git a/osm_nbi/instance_topics.py b/osm_nbi/instance_topics.py
index 9d2da99..df4a1d1 100644
--- a/osm_nbi/instance_topics.py
+++ b/osm_nbi/instance_topics.py
@@ -119,6 +119,24 @@
                     "nsds", {"_id": used_nsd_id}, {"_admin.usageState": "NOT_IN_USE"}
                 )
 
+        # Set NS CONFIG TEMPLATE usageState
+        if nsr.get("instantiate_params", {}).get("nsConfigTemplateId"):
+            nsconfigtemplate_id = nsr.get("instantiate_params", {}).get(
+                "nsConfigTemplateId"
+            )
+            nsconfigtemplate_list = self.db.get_one(
+                "nsrs",
+                {"instantiate_params.nsConfigTemplateId": nsconfigtemplate_id},
+                fail_on_empty=False,
+                fail_on_more=False,
+            )
+            if not nsconfigtemplate_list:
+                self.db.set_one(
+                    "ns_config_template",
+                    {"_id": nsconfigtemplate_id},
+                    {"_admin.usageState": "NOT_IN_USE"},
+                )
+
         # Set VNFD usageState
         used_vnfd_id_list = nsr.get("vnfd-id")
         if used_vnfd_id_list:
@@ -324,6 +342,38 @@
             nsd = self._get_nsd_from_db(ns_request["nsdId"], session)
             ns_k8s_namespace = self._get_ns_k8s_namespace(nsd, ns_request, session)
 
+            # Uploading the instantiation parameters to ns_request from ns config template
+            if ns_request.get("nsConfigTemplateId"):
+                step = "getting ns_config_template is='{}' from database".format(
+                    ns_request.get("nsConfigTemplateId")
+                )
+                ns_config_template_db = self._get_nsConfigTemplate_from_db(
+                    ns_request.get("nsConfigTemplateId"), session
+                )
+                ns_config_params = ns_config_template_db.get("config")
+                for key, value in ns_config_params.items():
+                    if key == "vnf":
+                        ns_request["vnf"] = ns_config_params.get("vnf")
+                    elif key == "additionalParamsForVnf":
+                        ns_request["additionalParamsForVnf"] = ns_config_params.get(
+                            "additionalParamsForVnf"
+                        )
+                    elif key == "additionalParamsForNs":
+                        ns_request["additionalParamsForNs"] = ns_config_params.get(
+                            "additionalParamsForNs"
+                        )
+                    elif key == "vld":
+                        ns_request["vld"] = ns_config_params.get("vld")
+                step = "checking ns_config_templateOperationalState"
+                self._check_ns_config_template_operational_state(
+                    ns_config_template_db, ns_request
+                )
+
+                step = "Updating NSCONFIG TEMPLATE usageState"
+                update_descriptor_usage_state(
+                    ns_config_template_db, "ns_config_template", self.db
+                )
+
             step = "checking nsdOperationalState"
             self._check_nsd_operational_state(nsd, ns_request)
 
@@ -399,6 +449,14 @@
         _filter["_id"] = nsd_id
         return self.db.get_one("nsds", _filter)
 
+    def _get_nsConfigTemplate_from_db(self, nsConfigTemplate_id, session):
+        _filter = self._get_project_filter(session)
+        _filter["_id"] = nsConfigTemplate_id
+        ns_config_template_db = self.db.get_one(
+            "ns_config_template", _filter, fail_on_empty=False
+        )
+        return ns_config_template_db
+
     def _get_vnfd_from_db(self, vnfd_id, session):
         _filter = self._get_project_filter(session)
         _filter["id"] = vnfd_id
@@ -427,6 +485,16 @@
                 http_code=HTTPStatus.CONFLICT,
             )
 
+    def _check_ns_config_template_operational_state(
+        self, ns_config_template_db, ns_request
+    ):
+        if ns_config_template_db["_admin"]["operationalState"] == "DISABLED":
+            raise EngineException(
+                "ns_config_template with id '{}' is DISABLED, and thus cannot be used to create "
+                "a network service".format(ns_request["nsConfigTemplateId"]),
+                http_code=HTTPStatus.CONFLICT,
+            )
+
     def _get_ns_k8s_namespace(self, nsd, ns_request, session):
         additional_params, _ = self._format_additional_params(
             ns_request, descriptor=nsd