+ # TODO: Check Multiple VIMs networks: datacenters
+
+ # Creating netslice VLDs networking before NS instantiation
+ for netslice_subnet in get_iterable(nsir_admin, "netslice-subnet"):
+ db_nsd = self.db.get_one("nsds", {"_id": netslice_subnet["nsdId"]})
+
+ # Fist operate with VLDs inside netslice_subnet
+ for vld_item in get_iterable(netslice_subnet, "vld"):
+ RO_ns_params = {}
+ RO_ns_params["name"] = vld_item["name"]
+ RO_ns_params["datacenter"] = vim_account_2_RO(db_nsir["datacenter"])
+
+ # TODO: Enable in the ns fake scenario the ip-profile
+ # if "ip-profile" in netslice-subnet:
+ # populate_dict(RO_ns_params, ("networks", vld_params["name"], "ip-profile"),
+ # ip_profile_2_RO(vld_params["ip-profile"]))
+ # TODO: Check VDU type in all descriptors finding SRIOV / PT
+ # Updating network names and datacenters from instantiation parameters for each VLD
+ mgmt_network = False
+ for nsd_vld in get_iterable(db_nsd, "vld"):
+ if nsd_vld["name"] == vld_item["name"]:
+ if nsd_vld.get("mgmt-network"):
+ mgmt_network = True
+ break
+
+ # Creating scenario if vim-network-name / vim-network-id are present as instantiation parameter
+ # Use vim-network-id instantiation parameter
+ vim_network_option = None
+ if vld_item.get("vim-network-id"):
+ vim_network_option = "vim-network-id"
+ elif vld_item.get("vim-network-name"):
+ vim_network_option = "vim-network-name"
+
+ if vim_network_option:
+ RO_vld_sites = []
+ if vld_item.get(vim_network_option):
+ if isinstance(vld_item[vim_network_option], dict):
+ for vim_account, vim_net in vld_item[vim_network_option].items():
+ RO_vld_sites.append({
+ "netmap-use": vim_net,
+ "datacenter": vim_account_2_RO(vim_account)
+ })
+ else:
+ RO_vld_sites.append({"netmap-use": vld_item[vim_network_option],
+ "datacenter": vim_account_2_RO(netslice_subnet["vimAccountId"])})
+ if RO_vld_sites:
+ populate_dict(RO_ns_params, ("networks", vld_item["name"], "sites"), RO_vld_sites)
+
+ if mgmt_network:
+ RO_ns_params["scenario"] = {"nets": [{"name": vld_item["name"],
+ "external": True, "type": "bridge"}]}
+ else:
+ RO_ns_params["scenario"] = {"nets": [{"name": vld_item["name"],
+ "external": False, "type": "bridge"}]}
+
+ # Use default netslice vim-network-name from template
+ else:
+ if mgmt_network:
+ RO_ns_params["scenario"] = {"nets": [{"name": vld_item["name"],
+ "external": True, "type": "bridge"}]}
+ else:
+ RO_ns_params["scenario"] = {"nets": [{"name": vld_item["name"],
+ "external": False, "type": "bridge"}]}
+
+ # Creating netslice-vld at RO
+ RO_nsir_id = db_nsir["_admin"].get("deployed", {}).get("RO", {}).get("nsir_id")
+
+ # if RO vlds are present use it unless in error status
+ 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 network doesn't exists then create it
+ else:
+ 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
+ # TODO: Check the case for multiple datacenters specified in instantiation parameter
+ 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 netslice-vld 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.nsState"] = "INSTANTIATED"
+ db_nsir_update["_admin.deployed.RO.nsir_status"] = "BUILD"
+ self.logger.debug(logging_text + "netslice-vld created at RO. RO_id={}".format(desc["uuid"]))
+ self.update_db_2("nsis", nsir_id, db_nsir_update)
+
+ if RO_nsir_id:
+ # wait until NS scenario for netslice-vld is ready
+ step = ns_status_detailed = detailed_status = "Waiting netslice-vld 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.netslice_scenario_id"] = desc.get("uuid")
+ netROinfo_list = []
+ name = desc.get("name")
+ 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":
+ for nets in get_iterable(desc, "nets"):
+ netROinfo = {"name": name, "vim_net_id": nets.get("vim_net_id"),
+ "datacenter_id": nets.get("datacenter_id"),
+ "vim_name": nets.get("vim_name")}
+ netROinfo_list.append(netROinfo)
+ db_nsir_update["admin.deployed.RO.vim_network_info"] = netROinfo_list
+ self.update_db_2("nsis", nsir_id, db_nsir_update)
+ 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 netslice-vld to be ready")
+
+ step = "Updating NSIR"
+ db_nsir = self.db.get_one("nsis", {"_id": nsir_id})
+ self.nsi_update_nsir(db_nsir_update, db_nsir, desc)
+