Bug 1538 Fixed
[osm/NBI.git] / osm_nbi / instance_topics.py
index 87b186e..94adb7b 100644 (file)
@@ -334,7 +334,7 @@ class NsrTopic(BaseTopic):
             # Create VNFRs
             needed_vnfds = {}
             # TODO: Change for multiple df support
-            vnf_profiles = nsd.get("df", [[]])[0].get("vnf-profile", ())
+            vnf_profiles = nsd.get("df", [{}])[0].get("vnf-profile", ())
             for vnfp in vnf_profiles:
                 vnfd_id = vnfp.get("vnfd-id")
                 vnf_index = vnfp.get("id")
@@ -710,9 +710,14 @@ class NsrTopic(BaseTopic):
             if kdu_params and kdu_params.get("k8s-namespace"):
                 kdu_k8s_namespace = kdu_params["k8s-namespace"]
 
+            kdu_deployment_name = ""
+            if kdu_params and kdu_params.get("kdu-deployment-name"):
+                kdu_deployment_name = kdu_params.get("kdu-deployment-name")
+
             kdur = {
                 "additionalParams": additional_params,
                 "k8s-namespace": kdu_k8s_namespace,
+                "kdu-deployment-name": kdu_deployment_name,
                 "kdu-name": kdu["name"],
                 # TODO      "name": ""     Name of the VDU in the VIM
                 "ip-address": None,  # mgmt-interface filled by LCM
@@ -933,9 +938,9 @@ class NsrTopic(BaseTopic):
             for index in range(0, count):
                 vdur = deepcopy(vdur)
                 for iface in vdur["interfaces"]:
-                    if iface.get("ip-address"):
+                    if iface.get("ip-address") and index != 0:
                         iface["ip-address"] = increment_ip_mac(iface["ip-address"])
-                    if iface.get("mac-address"):
+                    if iface.get("mac-address") and index != 0:
                         iface["mac-address"] = increment_ip_mac(iface["mac-address"])
 
                 vdur["_id"] = str(uuid4())
@@ -945,6 +950,41 @@ class NsrTopic(BaseTopic):
 
         return vnfr_descriptor
 
+    def vca_status_refresh(self, session, ns_instance_content, filter_q):
+        """
+        vcaStatus in ns_instance_content maybe stale, check if it is stale and create lcm op
+        to refresh vca status by sending message to LCM when it is stale. Ignore otherwise.
+        :param session: contains "username", "admin", "force", "public", "project_id", "set_project"
+        :param ns_instance_content:  ns instance content
+        :param filter_q: dict: query parameter containing vcaStatus-refresh as true or false
+        :return: None
+        """
+        time_now, time_delta = time(), time() - ns_instance_content["_admin"]["modified"]
+        force_refresh = isinstance(filter_q, dict) and filter_q.get('vcaStatusRefresh') == 'true'
+        threshold_reached = time_delta > 120
+        if force_refresh or threshold_reached:
+            operation, _id = "vca_status_refresh", ns_instance_content["_id"]
+            ns_instance_content["_admin"]["modified"] = time_now
+            self.db.set_one(self.topic, {"_id": _id}, ns_instance_content)
+            nslcmop_desc = NsLcmOpTopic._create_nslcmop(_id, operation, None)
+            self.format_on_new(nslcmop_desc, session["project_id"], make_public=session["public"])
+            nslcmop_desc["_admin"].pop("nsState")
+            self.msg.write("ns", operation, nslcmop_desc)
+        return
+
+    def show(self, session, _id, filter_q=None, api_req=False):
+        """
+        Get complete information on an ns instance.
+        :param session: contains "username", "admin", "force", "public", "project_id", "set_project"
+        :param _id: string, ns instance id
+        :param filter_q: dict: query parameter containing vcaStatusRefresh as true or false
+        :param api_req: True if this call is serving an external API request. False if serving internal request.
+        :return: dictionary, raise exception if not found.
+        """
+        ns_instance_content = super().show(session, _id, api_req)
+        self.vca_status_refresh(session, ns_instance_content, filter_q)
+        return ns_instance_content
+
     def edit(self, session, _id, indata=None, kwargs=None, content=None):
         raise EngineException(
             "Method edit called directly", HTTPStatus.INTERNAL_SERVER_ERROR