Feature shared network slice subnet
[osm/LCM.git] / osm_lcm / ns.py
index d7277e7..5d34b05 100644 (file)
@@ -69,9 +69,9 @@ def populate_dict(target_dict, key_list, value):
 
 class NsLcm(LcmBase):
     timeout_vca_on_error = 5 * 60   # Time for charm from first time at blocked,error status to mark as failed
-    total_deploy_timeout = 30 * 60   # global timeout for deployment
-    timeout_charm_delete = 5 * 60
-    timeout_primitive = 5 * 60  # timeout for primitive execution
+    total_deploy_timeout = 2 * 3600   # global timeout for deployment
+    timeout_charm_delete = 10 * 60
+    timeout_primitive = 10 * 60  # timeout for primitive execution
 
     def __init__(self, db, msg, fs, lcm_tasks, ro_config, vca_config, loop):
         """
@@ -242,6 +242,7 @@ class NsLcm(LcmBase):
         :return: The RO ns descriptor
         """
         vim_2_RO = {}
+        wim_2_RO = {}
         # TODO feature 1417: Check that no instantiation is set over PDU
         # check if PDU forces a concrete vim-network-id and add it
         # check if PDU contains a SDN-assist info (dpid, switch, port) and pass it to RO
@@ -258,6 +259,21 @@ class NsLcm(LcmBase):
             vim_2_RO[vim_account] = RO_vim_id
             return RO_vim_id
 
+        def wim_account_2_RO(wim_account):
+            if isinstance(wim_account, str):
+                if wim_account in wim_2_RO:
+                    return wim_2_RO[wim_account]
+
+                db_wim = self.db.get_one("wim_accounts", {"_id": wim_account})
+                if db_wim["_admin"]["operationalState"] != "ENABLED":
+                    raise LcmException("WIM={} is not available. operationalState={}".format(
+                        wim_account, db_wim["_admin"]["operationalState"]))
+                RO_wim_id = db_wim["_admin"]["deployed"]["RO-account"]
+                wim_2_RO[wim_account] = RO_wim_id
+                return RO_wim_id
+            else:
+                return wim_account
+
         def ip_profile_2_RO(ip_profile):
             RO_ip_profile = deepcopy((ip_profile))
             if "dns-server" in RO_ip_profile:
@@ -281,6 +297,7 @@ class NsLcm(LcmBase):
             # "name": ns_params["nsName"],
             # "description": ns_params.get("nsDescription"),
             "datacenter": vim_account_2_RO(ns_params["vimAccountId"]),
+            "wim_account": wim_account_2_RO(ns_params.get("wimAccountId")),
             # "scenario": ns_params["nsdId"],
         }
         if n2vc_key_list:
@@ -402,6 +419,10 @@ class NsLcm(LcmBase):
             if "ip-profile" in vld_params:
                 populate_dict(RO_ns_params, ("networks", vld_params["name"], "ip-profile"),
                               ip_profile_2_RO(vld_params["ip-profile"]))
+
+            if "wimAccountId" in vld_params and vld_params["wimAccountId"] is not None:
+                populate_dict(RO_ns_params, ("networks", vld_params["name"], "wim_account"),
+                              wim_account_2_RO(vld_params["wimAccountId"])),
             if vld_params.get("vim-network-name"):
                 RO_vld_sites = []
                 if isinstance(vld_params["vim-network-name"], dict):
@@ -426,6 +447,12 @@ class NsLcm(LcmBase):
                     RO_vld_sites.append({"netmap-use": vld_params["vim-network-id"]})
                 if RO_vld_sites:
                     populate_dict(RO_ns_params, ("networks", vld_params["name"], "sites"), RO_vld_sites)
+            if vld_params.get("ns-net"):
+                if isinstance(vld_params["ns-net"], dict):
+                    for vld_id, instance_scenario_id in vld_params["ns-net"].items():
+                        RO_vld_ns_net = {"instance_scenario_id": instance_scenario_id, "osm_id": vld_id}
+                if RO_vld_ns_net:
+                    populate_dict(RO_ns_params, ("networks", vld_params["name"], "use-network"), RO_vld_ns_net)            
             if "vnfd-connection-point-ref" in vld_params:
                 for cp_params in vld_params["vnfd-connection-point-ref"]:
                     # look for interface
@@ -539,7 +566,7 @@ class NsLcm(LcmBase):
                     continue
                 vnfr_update = {}
                 if vnf_RO.get("ip_address"):
-                    db_vnfr["ip-address"] = vnfr_update["ip-address"] = vnf_RO["ip_address"]
+                    db_vnfr["ip-address"] = vnfr_update["ip-address"] = vnf_RO["ip_address"].split(";")[0]
                 elif not db_vnfr.get("ip-address"):
                     raise LcmExceptionNoMgmtIP("ns member_vnf_index '{}' has no IP address".format(vnf_index))
 
@@ -554,7 +581,10 @@ class NsLcm(LcmBase):
                             vdur_RO_count_index += 1
                             continue
                         vdur["vim-id"] = vdur_RO.get("vim_vm_id")
-                        vdur["ip-address"] = vdur_RO.get("ip_address")
+                        if vdur_RO.get("ip_address"):
+                            vdur["ip-address"] = vdur_RO["ip_address"].split(";")[0]
+                        else:
+                            vdur["ip-address"] = None
                         vdur["vdu-id-ref"] = vdur_RO.get("vdu_osm_id")
                         vdur["name"] = vdur_RO.get("vim_name")
                         vdur["status"] = vdur_RO.get("status")
@@ -1425,7 +1455,7 @@ class NsLcm(LcmBase):
             )
             while time() - start_primitive_time < self.timeout_primitive:
                 primitive_result_ = await self.n2vc.GetPrimitiveStatus(model_name, primitive_id)
-                if primitive_result_ == "running":
+                if primitive_result_ in ("running", "pending"):
                     pass
                 elif primitive_result_ in ("completed", "failed"):
                     primitive_result = "COMPLETED" if primitive_result_ == "completed" else "FAILED"