LWB increase deployment timeout. Check vnf management ip is returned
[osm/RO.git] / lcm / osm_lcm / lcm.py
index 6e0f8ab..666d3cd 100644 (file)
@@ -158,7 +158,7 @@ class Lcm:
         exc = None
         try:
             step = "Getting vim from db"
-            db_vim = self.db.get_one("vims", {"_id": vim_id})
+            db_vim = self.db.get_one("vim_accounts", {"_id": vim_id})
             if "_admin" not in db_vim:
                 db_vim["_admin"] = {}
             if "deployed" not in db_vim["_admin"]:
@@ -179,7 +179,7 @@ class Lcm:
             desc = await RO.create("vim", descriptor=vim_RO)
             RO_vim_id = desc["uuid"]
             db_vim["_admin"]["deployed"]["RO"] = RO_vim_id
-            self.update_db("vims", vim_id, db_vim)
+            self.update_db("vim_accounts", vim_id, db_vim)
 
             step = "Attach vim to RO tenant"
             vim_RO = {"vim_tenant_name": vim_content["vim_tenant_name"],
@@ -189,7 +189,7 @@ class Lcm:
             }
             desc = await RO.attach_datacenter(RO_vim_id , descriptor=vim_RO)
             db_vim["_admin"]["operationalState"] = "ENABLED"
-            self.update_db("vims", vim_id, db_vim)
+            self.update_db("vim_accounts", vim_id, db_vim)
 
             self.logger.debug(logging_text + "Exit Ok RO_vim_id".format(RO_vim_id))
             return RO_vim_id
@@ -204,7 +204,7 @@ class Lcm:
             if exc and db_vim:
                 db_vim["_admin"]["operationalState"] = "ERROR"
                 db_vim["_admin"]["detailed-status"] = "ERROR {}: {}".format(step , exc)
-                self.update_db("vims", vim_id, db_vim)
+                self.update_db("vim_accounts", vim_id, db_vim)
 
     async def vim_edit(self, vim_content, order_id):
         vim_id = vim_content["_id"]
@@ -214,7 +214,7 @@ class Lcm:
         exc = None
         step = "Getting vim from db"
         try:
-            db_vim = self.db.get_one("vims", {"_id": vim_id})
+            db_vim = self.db.get_one("vim_accounts", {"_id": vim_id})
             if db_vim.get("_admin") and db_vim["_admin"].get("deployed") and db_vim["_admin"]["deployed"].get("RO"):
                 RO_vim_id = db_vim["_admin"]["deployed"]["RO"]
                 step = "Editing vim at RO"
@@ -241,7 +241,7 @@ class Lcm:
                 if vim_RO:
                     desc = await RO.edit("vim_account", RO_vim_id, descriptor=vim_RO)
                 db_vim["_admin"]["operationalState"] = "ENABLED"
-                self.update_db("vims", vim_id, db_vim)
+                self.update_db("vim_accounts", vim_id, db_vim)
 
             self.logger.debug(logging_text + "Exit Ok RO_vim_id".format(RO_vim_id))
             return RO_vim_id
@@ -256,7 +256,7 @@ class Lcm:
             if exc and db_vim:
                 db_vim["_admin"]["operationalState"] = "ERROR"
                 db_vim["_admin"]["detailed-status"] = "ERROR {}: {}".format(step , exc)
-                self.update_db("vims", vim_id, db_vim)
+                self.update_db("vim_accounts", vim_id, db_vim)
 
     async def vim_delete(self, vim_id, order_id):
         logging_text = "Task vim_delete={} ".format(vim_id)
@@ -265,7 +265,7 @@ class Lcm:
         exc = None
         step = "Getting vim from db"
         try:
-            db_vim = self.db.get_one("vims", {"_id": vim_id})
+            db_vim = self.db.get_one("vim_accounts", {"_id": vim_id})
             if db_vim.get("_admin") and db_vim["_admin"].get("deployed") and db_vim["_admin"]["deployed"].get("RO"):
                 RO_vim_id = db_vim["_admin"]["deployed"]["RO"]
                 RO = ROclient.ROClient(self.loop, **self.ro_config)
@@ -289,7 +289,7 @@ class Lcm:
             else:
                 # nothing to delete
                 self.logger.error(logging_text + "Skipping. There is not RO information at database")
-            self.db.del_one("vims", {"_id": vim_id})
+            self.db.del_one("vim_accounts", {"_id": vim_id})
             self.logger.debug("vim_delete task vim_id={} Exit Ok".format(vim_id))
             return None
 
@@ -303,7 +303,7 @@ class Lcm:
             if exc and db_vim:
                 db_vim["_admin"]["operationalState"] = "ERROR"
                 db_vim["_admin"]["detailed-status"] = "ERROR {}: {}".format(step , exc)
-                self.update_db("vims", vim_id, db_vim)
+                self.update_db("vim_accounts", vim_id, db_vim)
 
     async def sdn_create(self, sdn_content, order_id):
         sdn_id = sdn_content["_id"]
@@ -581,6 +581,64 @@ class Lcm:
                 self.logger.critical("[n2vc_callback] vnf_index={} Update database Exception {}".format(
                     vnf_member_index, e), exc_info=True)
 
+    def ns_params_2_RO(self, ns_params):
+        """
+        Creates a RO ns descriptor from OSM ns_instantite params
+        :param ns_params: OSM instantiate params
+        :return: The RO ns descriptor
+        """
+        vim_2_RO = {}
+        def vim_account_2_RO(vim_account):
+            if vim_account in vim_2_RO:
+                return vim_2_RO[vim_account]
+            db_vim = self.db.get_one("vim_accounts", {"_id": vim_account})
+            # if db_vim["_admin"]["operationalState"] == "PROCESSING":
+            #     #TODO check if VIM is creating and wait
+            if db_vim["_admin"]["operationalState"] != "ENABLED":
+                raise LcmException("VIM={} is not available. operationalSstatus={}".format(
+                    vim_account, db_vim["_admin"]["operationalState"]))
+            RO_vim_id = db_vim["_admin"]["deployed"]["RO"]
+            vim_2_RO[vim_account] = RO_vim_id
+            return RO_vim_id
+
+        if not ns_params:
+            return None
+        RO_ns_params = {
+            # "name": ns_params["nsName"],
+            # "description": ns_params.get("nsDescription"),
+            "datacenter": vim_account_2_RO(ns_params["vimAccountId"]),
+            # "scenario": ns_params["nsdId"],
+            "vnfs": {},
+            "networks": {},
+        }
+        if ns_params.get("ssh-authorized-key"):
+            RO_ns_params["cloud-config"] = {"key-pairs": ns_params["ssh-authorized-key"]}
+        if ns_params.get("vnf"):
+            for vnf in ns_params["vnf"]:
+                RO_vnf = {}
+                if "vimAccountId" in vnf:
+                    RO_vnf["datacenter"] = vim_account_2_RO(vnf["vimAccountId"])
+                if RO_vnf:
+                    RO_ns_params["vnfs"][vnf["member-vnf-index"]] = RO_vnf
+        if ns_params.get("vld"):
+            for vld in ns_params["vld"]:
+                RO_vld = {}
+                if "ip-profile" in vld:
+                    RO_vld["ip-profile"] = vld["ip-profile"]
+                if "vim-network-name" in vld:
+                    RO_vld["sites"] = []
+                    if isinstance(vld["vim-network-name"], dict):
+                        for vim_account, vim_net in vld["vim-network-name"].items():
+                            RO_vld["sites"].append({
+                                "netmap-use": vim_net,
+                                "datacenter": vim_account_2_RO(vim_account)
+                            })
+                    else:  #isinstance str
+                        RO_vld["sites"].append({"netmap-use":  vld["vim-network-name"]})
+                if RO_vld:
+                    RO_ns_params["networks"][vld["name"]] = RO_vld
+        return RO_ns_params
+
     async def ns_instantiate(self, nsr_id, nslcmop_id):
         logging_text = "Task ns={} instantiate={} ".format(nsr_id, nslcmop_id)
         self.logger.debug(logging_text + "Enter")
@@ -595,14 +653,6 @@ class Lcm:
             nsd = db_nsr["nsd"]
             nsr_name = db_nsr["name"]   # TODO short-name??
 
-            db_vim = self.db.get_one("vims", {"_id": db_nsr["datacenter"]})
-            # if db_vim["_admin"]["operationalState"] == "PROCESSING":
-            #     #TODO check if VIM is creating and wait
-            if db_vim["_admin"]["operationalState"] != "ENABLED":
-                raise LcmException("VIM={} is not available. operationalSstatus={}".format(
-                    db_nsr["datacenter"], db_vim["_admin"]["operationalState"]))
-            RO_vim_id = db_vim["_admin"]["deployed"]["RO"]
-
             needed_vnfd = {}
             for c_vnf in nsd["constituent-vnfd"]:
                 vnfd_id = c_vnf["vnfd-id-ref"]
@@ -621,9 +671,7 @@ class Lcm:
             db_nsr["detailed-status"] = "creating"
             db_nsr["operational-status"] = "init"
 
-            deloyment_timeout = 120
-
-            RO = ROclient.ROClient(self.loop, datacenter=RO_vim_id, **self.ro_config)
+            RO = ROclient.ROClient(self.loop, **self.ro_config)
 
             # get vnfds, instantiate at RO
             for vnfd_id, vnfd in needed_vnfd.items():
@@ -692,8 +740,9 @@ class Lcm:
             if not RO_nsr_id:
                 step = db_nsr["detailed-status"] = "Creating ns at RO"
                 self.logger.debug(logging_text + step)
-
-                desc = await RO.create("ns", name=db_nsr["name"], datacenter=RO_vim_id,
+                RO_ns_params = self.ns_params_2_RO(db_nsr.get("instantiate_params"))
+                desc = await RO.create("ns", descriptor=RO_ns_params,
+                                       name=db_nsr["name"],
                                        scenario=nsr_lcm["RO"]["nsd_id"])
                 RO_nsr_id = nsr_lcm["RO"]["nsr_id"] = desc["uuid"]
                 db_nsr["_admin"]["nsState"] = "INSTANTIATED"
@@ -704,8 +753,8 @@ class Lcm:
             step = ns_status_detailed = "Waiting ns ready at RO"
             db_nsr["detailed-status"] = ns_status_detailed
             self.logger.debug(logging_text + step + " RO_ns_id={}".format(RO_nsr_id))
-            deloyment_timeout = 600
-            while deloyment_timeout > 0:
+            deployment_timeout = 2*3600   # Two hours
+            while deployment_timeout > 0:
                 desc = await RO.show("ns", RO_nsr_id)
                 ns_status, ns_status_info = RO.check_ns_status(desc)
                 nsr_lcm["RO"]["nsr_status"] = ns_status
@@ -715,14 +764,15 @@ class Lcm:
                     db_nsr["detailed-status"] = ns_status_detailed + "; {}".format(ns_status_info)
                     self.update_db("nsrs", nsr_id, db_nsr)
                 elif ns_status == "ACTIVE":
+                    step = "Getting ns VNF management IP address"
                     nsr_lcm["nsr_ip"] = RO.get_ns_vnf_ip(desc)
                     break
                 else:
                     assert False, "ROclient.check_ns_status returns unknown {}".format(ns_status)
 
                 await asyncio.sleep(5, loop=self.loop)
-                deloyment_timeout -= 5
-            if deloyment_timeout <= 0:
+                deployment_timeout -= 5
+            if deployment_timeout <= 0:
                 raise ROclient.ROClientException("Timeout waiting ns to be ready")
             db_nsr["detailed-status"] = "Configuring vnfr"
             self.update_db("nsrs", nsr_id, db_nsr)
@@ -887,7 +937,7 @@ class Lcm:
             if db_nsr["_admin"]["nsState"] == "NOT_INSTANTIATED":
                 return
             # TODO ALF remove
-            # db_vim = self.db.get_one("vims", {"_id":  db_nsr["datacenter"]})
+            # db_vim = self.db.get_one("vim_accounts", {"_id":  db_nsr["datacenter"]})
             # #TODO check if VIM is creating and wait
             # RO_vim_id = db_vim["_admin"]["deployed"]["RO"]