fix ssh-keys passed from NSI to NSR
[osm/NBI.git] / osm_nbi / instance_topics.py
index 48503a9..ce9a3c6 100644 (file)
@@ -31,6 +31,7 @@ __author__ = "Alfonso Tierno <alfonso.tiernosepulveda@telefonica.com>"
 class NsrTopic(BaseTopic):
     topic = "nsrs"
     topic_msg = "ns"
+    schema_new = ns_instantiate
 
     def __init__(self, db, fs, msg):
         BaseTopic.__init__(self, db, fs, msg)
@@ -180,6 +181,7 @@ class NsrTopic(BaseTopic):
         """
 
         try:
+            step = "validating input parameters"
             ns_request = self._remove_envelop(indata)
             # Override descriptor with query string kwargs
             self._update_input_with_kwargs(ns_request, kwargs)
@@ -226,7 +228,7 @@ class NsrTopic(BaseTopic):
                 "id": nsr_id,
                 "_id": nsr_id,
                 # "input-parameter": xpath, value,
-                "ssh-authorized-key": ns_request.get("key-pair-ref"),  # TODO remove
+                "ssh-authorized-key": ns_request.get("ssh_keys"),  # TODO remove
             }
             ns_request["nsr_id"] = nsr_id
             # Create vld
@@ -763,6 +765,15 @@ class NsLcmOpTopic(BaseTopic):
         :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)
@@ -776,6 +787,8 @@ class NsLcmOpTopic(BaseTopic):
             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
@@ -976,12 +989,12 @@ class NsiTopic(BaseTopic):
         """
 
         try:
+            step = ""
             slice_request = self._remove_envelop(indata)
             # Override descriptor with query string kwargs
             self._update_input_with_kwargs(slice_request, kwargs)
             self._validate_input_new(slice_request, session["force"])
 
-            step = ""
             # look for nstd
             step = "getting nstd id='{}' from database".format(slice_request.get("nstId"))
             _filter = self._get_project_filter(session)
@@ -1090,7 +1103,8 @@ class NsiTopic(BaseTopic):
                     indata_ns["nsName"] = slice_request.get("nsiName") + "." + service["id"]
                     indata_ns["vimAccountId"] = slice_request.get("vimAccountId")
                     indata_ns["nsDescription"] = service["description"]
-                    indata_ns["key-pair-ref"] = slice_request.get("key-pair-ref")
+                    if slice_request.get("ssh_keys"):
+                        indata_ns["ssh_keys"] = slice_request.get("ssh_keys")
 
                     if ns_params:
                         for ns_param in ns_params:
@@ -1281,8 +1295,7 @@ class NsiLcmOpTopic(BaseTopic):
                     indata_ns["nsInstanceId"] = service["_id"]
                     # Including netslice_id in the ns instantiate Operation
                     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 
+                    # 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, 
                                                         slice_object=True)