Bug 2097: Fix for flavor name
[osm/NBI.git] / osm_nbi / instance_topics.py
index 84aeda3..16bd406 100644 (file)
@@ -27,8 +27,10 @@ from osm_nbi.validation import (
     ns_action,
     ns_scale,
     ns_update,
+    ns_heal,
     nsi_instantiate,
     ns_migrate,
+    ns_verticalscale,
 )
 from osm_nbi.base_topic import (
     BaseTopic,
@@ -439,7 +441,7 @@ class NsrTopic(BaseTopic):
 
         return ns_k8s_namespace
 
-    def _add_flavor_to_nsr(self, vdu, vnfd, nsr_descriptor):
+    def _add_flavor_to_nsr(self, vdu, vnfd, nsr_descriptor, member_vnf_index, revision=None):
         flavor_data = {}
         guest_epa = {}
         # Find this vdu compute and storage descriptors
@@ -509,7 +511,8 @@ class NsrTopic(BaseTopic):
         if guest_epa:
             flavor_data["guest-epa"] = guest_epa
 
-        flavor_data["name"] = vdu["id"][:56] + "-flv"
+        revision = revision if revision is not None else 1
+        flavor_data["name"] = vdu["id"][:56] + "-" + member_vnf_index + "-" + str(revision) + "-flv"
         flavor_data["id"] = str(len(nsr_descriptor["flavor"]))
         nsr_descriptor["flavor"].append(flavor_data)
 
@@ -591,7 +594,8 @@ class NsrTopic(BaseTopic):
                 vnfd.pop("_admin")
 
                 for vdu in vnfd.get("vdu", ()):
-                    self._add_flavor_to_nsr(vdu, vnfd, nsr_descriptor)
+                    member_vnf_index = vnf_profile.get("id")
+                    self._add_flavor_to_nsr(vdu, vnfd, nsr_descriptor, member_vnf_index)
                     sw_image_id = vdu.get("sw-image-desc")
                     if sw_image_id:
                         image_data = self._get_image_data_from_vnfd(vnfd, sw_image_id)
@@ -717,6 +721,7 @@ class NsrTopic(BaseTopic):
         nsr_descriptor,
         ns_request,
         ns_k8s_namespace,
+        revision=None,
     ):
         vnfr_id = str(uuid4())
         nsr_id = nsr_descriptor["id"]
@@ -894,7 +899,10 @@ class NsrTopic(BaseTopic):
                 vdur["internal-connection-point"].append(vdu_icp)
 
                 for iface in icp.get("virtual-network-interface-requirement", ()):
-                    iface_fields = ("name", "mac-address")
+                    # Name, mac-address and interface position is taken from VNFD
+                    # and included into VNFR. By this way RO can process this information
+                    # while creating the VDU.
+                    iface_fields = ("name", "mac-address", "position")
                     vdu_iface = {
                         x: iface[x] for x in iface_fields if iface.get(x) is not None
                     }
@@ -1018,7 +1026,8 @@ class NsrTopic(BaseTopic):
                     alt_image_ids.append(nsr_sw_image_data["id"])
                 vdur["alt-image-ids"] = alt_image_ids
 
-            flavor_data_name = vdu["id"][:56] + "-flv"
+            revision = revision if revision is not None else 1
+            flavor_data_name = vdu["id"][:56] + "-" + vnf_index + "-" + str(revision) + "-flv"
             nsr_flavor_desc = utils.find_in_list(
                 nsr_descriptor["flavor"],
                 lambda flavor: flavor["name"] == flavor_data_name,
@@ -1163,8 +1172,10 @@ class NsLcmOpTopic(BaseTopic):
         "action": ns_action,
         "update": ns_update,
         "scale": ns_scale,
+        "heal": ns_heal,
         "terminate": ns_terminate,
         "migrate": ns_migrate,
+        "verticalscale": ns_verticalscale,
     }
 
     def __init__(self, db, fs, msg, auth):
@@ -1175,7 +1186,7 @@ class NsLcmOpTopic(BaseTopic):
         """
         Check that user has enter right parameters for the operation
         :param session: contains "username", "admin", "force", "public", "project_id", "set_project"
-        :param operation: it can be: instantiate, terminate, action, update. TODO: heal
+        :param operation: it can be: instantiate, terminate, action, update, heal
         :param indata: descriptor with the parameters of the operation
         :return: None
         """
@@ -1185,6 +1196,8 @@ class NsLcmOpTopic(BaseTopic):
             self._check_scale_ns_operation(indata, nsr)
         elif operation == "update":
             self._check_update_ns_operation(indata, nsr)
+        elif operation == "heal":
+            self._check_heal_ns_operation(indata, nsr)
         elif operation == "instantiate":
             self._check_instantiate_ns_operation(indata, nsr, session)
 
@@ -1387,6 +1400,9 @@ class NsLcmOpTopic(BaseTopic):
                 )
             )
 
+    def _check_heal_ns_operation(self, indata, nsr):
+        return
+
     def _check_instantiate_ns_operation(self, indata, nsr, session):
         vnf_member_index_to_vnfd = {}  # map between vnf_member_index to vnf descriptor.
         vim_accounts = []
@@ -1481,7 +1497,7 @@ class NsLcmOpTopic(BaseTopic):
                 if in_vdu["id"] == vdu["id"]:
                     for volume in get_iterable(in_vdu.get("volume")):
                         for volumed in get_iterable(vdu.get("virtual-storage-desc")):
-                            if volumed["id"] == volume["name"]:
+                            if volumed == volume["name"]:
                                 break
                         else:
                             raise EngineException(
@@ -1501,7 +1517,7 @@ class NsLcmOpTopic(BaseTopic):
                         ):
                             vdu_if_names.add(iface.get("name"))
 
-                    for in_iface in get_iterable(in_vdu["interface"]):
+                    for in_iface in get_iterable(in_vdu.get("interface")):
                         if in_iface["name"] in vdu_if_names:
                             break
                         else:
@@ -2247,7 +2263,7 @@ class NsLcmOpTopic(BaseTopic):
                         vnf_index = vnfr["member-vnf-index-ref"]
                         self.logger.info("nsr {}".format(nsr))
                         for vdu in vnfd["vdu"]:
-                            self.nsrtopic._add_flavor_to_nsr(vdu, vnfd, nsr)
+                            self.nsrtopic._add_flavor_to_nsr(vdu, vnfd, nsr, vnf_index, latest_vnfd_revision)
                             sw_image_id = vdu.get("sw-image-desc")
                             if sw_image_id:
                                 image_data = self.nsrtopic._get_image_data_from_vnfd(vnfd, sw_image_id)
@@ -2267,6 +2283,7 @@ class NsLcmOpTopic(BaseTopic):
                             nsr,
                             ns_request,
                             ns_k8s_namespace,
+                            latest_vnfd_revision,
                         )
                         indata["newVdur"] = vnfr_descriptor["vdur"]
             nslcmop_desc = self._create_nslcmop(nsInstanceId, operation, indata)