+ # TODO: Multiple VIMs networks: datacenters
+ nets = []
+ for netslice_vld in nsir_vlds:
+ RO_ns_params = {}
+ RO_ns_params["name"] = db_nsir["name"]
+ if netslice_vld.get("vim-network-name"):
+ if not isinstance(netslice_vld["vim-network-name"], str):
+ name = netslice_vld["vim-network-name"][netslice_vld["vimAccountId"]]
+ nets.append({"name": name, "external": False, "type": "bridge"})
+ else:
+ nets.append({"name": netslice_vld["vim-network-name"], "external": False, "type": "bridge"})
+ else:
+ nets.append({"name": "default", "external": False, "type": "bridge"})
+ RO_ns_params["scenario"] = {"nets": nets}
+ RO_ns_params["datacenter"] = vim_account_2_RO(netslice_vld["vimAccountId"])
+
+ # set state to INSTANTIATED. When instantiated NBI will not delete directly
+ db_nsir_update["_admin.nsState"] = "INSTANTIATED"
+ self.update_db_2("nsis", nsir_id, db_nsir_update)
+
+ # Crate ns at RO
+ # if present use it unless in error status
+ RO_nsir_id = db_nsir["_admin"].get("deployed", {}).get("RO", {}).get("nsir_id")
+ if RO_nsir_id:
+ try:
+ step = db_nsir_update["detailed-status"] = "Looking for existing ns at RO"
+ # self.logger.debug(logging_text + step + " RO_ns_id={}".format(RO_nsir_id))
+ desc = await RO.show("ns", RO_nsir_id)
+ except ROclient.ROClientException as e:
+ if e.http_code != HTTPStatus.NOT_FOUND:
+ raise
+ RO_nsir_id = db_nsir_update["_admin.deployed.RO.nsir_id"] = None
+ if RO_nsir_id:
+ ns_status, ns_status_info = RO.check_ns_status(desc)
+ db_nsir_update["_admin.deployed.RO.nsir_status"] = ns_status
+ if ns_status == "ERROR":
+ step = db_nsir_update["detailed-status"] = "Deleting ns at RO. RO_ns_id={}".format(RO_nsir_id)
+ self.logger.debug(logging_text + step)
+ await RO.delete("ns", RO_nsir_id)
+ RO_nsir_id = db_nsir_update["_admin.deployed.RO.nsir_id"] = None
+ if not RO_nsir_id:
+ step = db_nsir_update["detailed-status"] = "Checking dependencies"
+ # self.logger.debug(logging_text + step)
+ # check if VIM is creating and wait look if previous tasks in process
+ for vimAccountId_unit in RO_ns_params["datacenter"]:
+ task_name, task_dependency = self.lcm_tasks.lookfor_related("vim_account", vimAccountId_unit)
+ if task_dependency:
+ step = "Waiting for related tasks to be completed: {}".format(task_name)
+ self.logger.debug(logging_text + step)
+ await asyncio.wait(task_dependency, timeout=3600)
+
+ step = db_nsir_update["detailed-status"] = "Creating ns at RO"
+ desc = await RO.create("ns", descriptor=RO_ns_params)
+ RO_nsir_id = db_nsir_update["_admin.deployed.RO.nsir_id"] = desc["uuid"]
+ db_nsir_update["_admin.deployed.RO.nsir_status"] = "BUILD"
+ self.logger.debug(logging_text + "ns created at RO. RO_id={}".format(desc["uuid"]))
+ self.update_db_2("nsis", nsir_id, db_nsir_update)
+
+ # wait until NS scenario for netslice-vld is ready
+ step = ns_status_detailed = detailed_status = "Waiting ns ready at RO. RO_id={}".format(RO_nsir_id)
+ detailed_status_old = None
+ self.logger.debug(logging_text + step)
+
+ while time() <= start_deploy + self.total_deploy_timeout:
+ desc = await RO.show("ns", RO_nsir_id)
+ ns_status, ns_status_info = RO.check_ns_status(desc)
+ db_nsir_update["admin.deployed.RO.nsir_status"] = ns_status
+ db_nsir_update["admin.deployed.RO.nsr_id"] = desc.get("uuid")
+ if ns_status == "ERROR":
+ raise ROclient.ROClientException(ns_status_info)
+ elif ns_status == "BUILD":
+ detailed_status = ns_status_detailed + "; {}".format(ns_status_info)
+ elif ns_status == "ACTIVE":
+ break
+ else:
+ assert False, "ROclient.check_ns_status returns unknown {}".format(ns_status)
+ if detailed_status != detailed_status_old:
+ detailed_status_old = db_nsir_update["detailed-status"] = detailed_status
+ self.update_db_2("nsis", nsir_id, db_nsir_update)
+ await asyncio.sleep(5, loop=self.loop)
+ else: # total_deploy_timeout
+ raise ROclient.ROClientException("Timeout waiting ns to be ready")
+
+ step = "Updating NSIR"
+ nsi_update_nsir(self, db_nsir_update, db_nsir, desc)
+