-
- ns_config = nsd.get("ns-configuration")
- if ns_config and ns_config.get("juju"):
- proxy_charm = ns_config["juju"]["charm"]
- if ns_config["juju"].get("proxy") is False:
- # native_charm, will be deployed after VM. Skip
- proxy_charm = None
-
- if proxy_charm:
- step = "deploying proxy charm to configure ns"
- # TODO is NS magmt IP address needed?
-
- # Get additional parameters
- additional_params = {}
- if db_nsr.get("additionalParamsForNs"):
- additional_params = db_nsr["additionalParamsForNs"].copy()
- for k, v in additional_params.items():
- if isinstance(v, str) and v.startswith("!!yaml "):
- additional_params[k] = yaml.safe_load(v[7:])
-
- # additional_params["rw_mgmt_ip"] = db_nsr["ip-address"]
- charm_params = {
- "user_values": additional_params,
- # "rw_mgmt_ip": db_nsr["ip-address"],
- "initial-config-primitive": {} # ns_config.get('initial-config-primitive') or {}
- }
-
- # Login to the VCA. If there are multiple calls to login(),
- # subsequent calls will be a nop and return immediately.
- await self.n2vc.login()
- deploy_charm(None, None, None, None, charm_params, n2vc_info)
- number_to_configure += 1
-
- db_nsr_update["operational-status"] = "running"
-
- # Wait until all charms has reached blocked or active status
- step = "waiting proxy charms to be ready"
- if number_to_configure:
- # wait until all charms are configured.
- # steps are:
- # initial-deploy
- # get-ssh-public-key
- # generate-ssh-key
- # retry-get-ssh-public-key
- # ssh-public-key-obtained
- while time() <= start_deploy + self.total_deploy_timeout:
- if db_nsr_update:
- self.update_db_2("nsrs", nsr_id, db_nsr_update)
- if db_nslcmop_update:
- self.update_db_2("nslcmops", nslcmop_id, db_nslcmop_update)
-
- all_active = True
- for vca_index, vca_deployed in enumerate(vca_deployed_list):
- database_entry = "_admin.deployed.VCA.{}.".format(vca_index)
- if vca_deployed["step"] == "initial-deploy":
- if vca_deployed["operational-status"] in ("active", "blocked"):
- step = "execute charm primitive get-ssh-public-key for member_vnf_index={} vdu_id={}" \
- .format(vca_deployed["member-vnf-index"],
- vca_deployed["vdu_id"])
- self.logger.debug(logging_text + step)
- try:
- primitive_id = await self.n2vc.ExecutePrimitive(
- vca_deployed["model"],
- vca_deployed["application"],
- "get-ssh-public-key",
- None,
- )
- vca_deployed["step"] = db_nsr_update[database_entry + "step"] = "get-ssh-public-key"
- vca_deployed["primitive_id"] = db_nsr_update[database_entry + "primitive_id"] =\
- primitive_id
- db_nsr_update[database_entry + "operational-status"] =\
- vca_deployed["operational-status"]
- except PrimitiveDoesNotExist:
- ssh_public_key = None
- vca_deployed["step"] = db_nsr_update[database_entry + "step"] =\
- "ssh-public-key-obtained"
- vca_deployed["ssh-public-key"] = db_nsr_update[database_entry + "ssh-public-key"] =\
- ssh_public_key
- step = "charm ssh-public-key for member_vnf_index={} vdu_id={} not needed".format(
- vca_deployed["member-vnf-index"], vca_deployed["vdu_id"])
- self.logger.debug(logging_text + step)
-
- elif vca_deployed["step"] in ("get-ssh-public-key", "retry-get-ssh-public-key"):
- primitive_id = vca_deployed["primitive_id"]
- primitive_status = await self.n2vc.GetPrimitiveStatus(vca_deployed["model"],
- primitive_id)
- if primitive_status in ("completed", "failed"):
- primitive_result = await self.n2vc.GetPrimitiveOutput(vca_deployed["model"],
- primitive_id)
- vca_deployed["primitive_id"] = db_nsr_update[database_entry + "primitive_id"] = None
- if primitive_status == "completed" and isinstance(primitive_result, dict) and \
- primitive_result.get("pubkey"):
- ssh_public_key = primitive_result.get("pubkey")
- vca_deployed["step"] = db_nsr_update[database_entry + "step"] =\
- "ssh-public-key-obtained"
- vca_deployed["ssh-public-key"] = db_nsr_update[database_entry + "ssh-public-key"] =\
- ssh_public_key
- n2vc_key_list.append(ssh_public_key)
- step = "charm ssh-public-key for member_vnf_index={} vdu_id={} is '{}'".format(
- vca_deployed["member-vnf-index"], vca_deployed["vdu_id"], ssh_public_key)
- self.logger.debug(logging_text + step)
- else: # primitive_status == "failed":
- if vca_deployed["step"] == "get-ssh-public-key":
- step = "execute charm primitive generate-ssh-public-key for member_vnf_index="\
- "{} vdu_id={}".format(vca_deployed["member-vnf-index"],
- vca_deployed["vdu_id"])
- self.logger.debug(logging_text + step)
- vca_deployed["step"] = db_nsr_update[database_entry + "step"] =\
- "generate-ssh-key"
- primitive_id = await self.n2vc.ExecutePrimitive(
- vca_deployed["model"],
- vca_deployed["application"],
- "generate-ssh-key",
- None,
- )
- vca_deployed["primitive_id"] = db_nsr_update[database_entry + "primitive_id"] =\
- primitive_id
- else: # failed for second time
- raise LcmException(
- "error executing primitive get-ssh-public-key: {}".format(primitive_result))
-
- elif vca_deployed["step"] == "generate-ssh-key":
- primitive_id = vca_deployed["primitive_id"]
- primitive_status = await self.n2vc.GetPrimitiveStatus(vca_deployed["model"],
- primitive_id)
- if primitive_status in ("completed", "failed"):
- primitive_result = await self.n2vc.GetPrimitiveOutput(vca_deployed["model"],
- primitive_id)
- vca_deployed["primitive_id"] = db_nsr_update[
- database_entry + "primitive_id"] = None
- if primitive_status == "completed":
- step = "execute primitive get-ssh-public-key again for member_vnf_index={} "\
- "vdu_id={}".format(vca_deployed["member-vnf-index"],
- vca_deployed["vdu_id"])
- self.logger.debug(logging_text + step)
- vca_deployed["step"] = db_nsr_update[database_entry + "step"] = \
- "retry-get-ssh-public-key"
- primitive_id = await self.n2vc.ExecutePrimitive(
- vca_deployed["model"],
- vca_deployed["application"],
- "get-ssh-public-key",
- None,
- )
- vca_deployed["primitive_id"] = db_nsr_update[database_entry + "primitive_id"] =\
- primitive_id
-
- else: # primitive_status == "failed":
- raise LcmException("error executing primitive generate-ssh-key: {}"
- .format(primitive_result))
-
- if vca_deployed["step"] != "ssh-public-key-obtained":
- all_active = False
-
- if all_active:
- break
- await asyncio.sleep(5)
- else: # total_deploy_timeout
- raise LcmException("Timeout waiting charm to be initialized for member_vnf_index={} vdu_id={}"
- .format(vca_deployed["member-vnf-index"], vca_deployed["vdu_id"]))
-
- # deploy RO
- # get vnfds, instantiate at RO
- for c_vnf in nsd.get("constituent-vnfd", ()):
- member_vnf_index = c_vnf["member-vnf-index"]
- vnfd = db_vnfds_ref[c_vnf['vnfd-id-ref']]
- vnfd_ref = vnfd["id"]
- step = db_nsr_update["detailed-status"] = "Creating vnfd='{}' member_vnf_index='{}' at RO".format(
- vnfd_ref, member_vnf_index)
- # self.logger.debug(logging_text + step)
- vnfd_id_RO = "{}.{}.{}".format(nsr_id, RO_descriptor_number, member_vnf_index[:23])
- vnf_index_2_RO_id[member_vnf_index] = vnfd_id_RO
- RO_descriptor_number += 1
-
- # look position at deployed.RO.vnfd if not present it will be appended at the end
- for index, vnf_deployed in enumerate(db_nsr["_admin"]["deployed"]["RO"]["vnfd"]):
- if vnf_deployed["member-vnf-index"] == member_vnf_index:
- break
- else:
- index = len(db_nsr["_admin"]["deployed"]["RO"]["vnfd"])
- db_nsr["_admin"]["deployed"]["RO"]["vnfd"].append(None)
-
- # look if present
- RO_update = {"member-vnf-index": member_vnf_index}
- vnfd_list = await self.RO.get_list("vnfd", filter_by={"osm_id": vnfd_id_RO})
- if vnfd_list:
- RO_update["id"] = vnfd_list[0]["uuid"]
- self.logger.debug(logging_text + "vnfd='{}' member_vnf_index='{}' exists at RO. Using RO_id={}".
- format(vnfd_ref, member_vnf_index, vnfd_list[0]["uuid"]))
- else:
- vnfd_RO = self.vnfd2RO(vnfd, vnfd_id_RO, db_vnfrs[c_vnf["member-vnf-index"]].
- get("additionalParamsForVnf"), nsr_id)
- desc = await self.RO.create("vnfd", descriptor=vnfd_RO)
- RO_update["id"] = desc["uuid"]
- self.logger.debug(logging_text + "vnfd='{}' member_vnf_index='{}' created at RO. RO_id={}".format(
- vnfd_ref, member_vnf_index, desc["uuid"]))
- db_nsr_update["_admin.deployed.RO.vnfd.{}".format(index)] = RO_update
- db_nsr["_admin"]["deployed"]["RO"]["vnfd"][index] = RO_update
- self.update_db_2("nsrs", nsr_id, db_nsr_update)
-
- # create nsd at RO
- nsd_ref = nsd["id"]
- step = db_nsr_update["detailed-status"] = "Creating nsd={} at RO".format(nsd_ref)
- # self.logger.debug(logging_text + step)
-
- RO_osm_nsd_id = "{}.{}.{}".format(nsr_id, RO_descriptor_number, nsd_ref[:23])
- RO_descriptor_number += 1
- nsd_list = await self.RO.get_list("nsd", filter_by={"osm_id": RO_osm_nsd_id})
- if nsd_list:
- db_nsr_update["_admin.deployed.RO.nsd_id"] = RO_nsd_uuid = nsd_list[0]["uuid"]
- self.logger.debug(logging_text + "nsd={} exists at RO. Using RO_id={}".format(
- nsd_ref, RO_nsd_uuid))
- else:
- nsd_RO = deepcopy(nsd)
- nsd_RO["id"] = RO_osm_nsd_id
- nsd_RO.pop("_id", None)
- nsd_RO.pop("_admin", None)
- for c_vnf in nsd_RO.get("constituent-vnfd", ()):
- member_vnf_index = c_vnf["member-vnf-index"]
- c_vnf["vnfd-id-ref"] = vnf_index_2_RO_id[member_vnf_index]
- for c_vld in nsd_RO.get("vld", ()):
- for cp in c_vld.get("vnfd-connection-point-ref", ()):
- member_vnf_index = cp["member-vnf-index-ref"]
- cp["vnfd-id-ref"] = vnf_index_2_RO_id[member_vnf_index]
-
- desc = await self.RO.create("nsd", descriptor=nsd_RO)
- db_nsr_update["_admin.nsState"] = "INSTANTIATED"
- db_nsr_update["_admin.deployed.RO.nsd_id"] = RO_nsd_uuid = desc["uuid"]
- self.logger.debug(logging_text + "nsd={} created at RO. RO_id={}".format(nsd_ref, RO_nsd_uuid))
- self.update_db_2("nsrs", nsr_id, db_nsr_update)
-
- # Crate ns at RO
- # if present use it unless in error status
- RO_nsr_id = db_nsr["_admin"].get("deployed", {}).get("RO", {}).get("nsr_id")
- if RO_nsr_id:
- try:
- step = db_nsr_update["detailed-status"] = "Looking for existing ns at RO"
- # self.logger.debug(logging_text + step + " RO_ns_id={}".format(RO_nsr_id))
- desc = await self.RO.show("ns", RO_nsr_id)
- except ROclient.ROClientException as e:
- if e.http_code != HTTPStatus.NOT_FOUND:
- raise
- RO_nsr_id = db_nsr_update["_admin.deployed.RO.nsr_id"] = None
- if RO_nsr_id:
- ns_status, ns_status_info = self.RO.check_ns_status(desc)
- db_nsr_update["_admin.deployed.RO.nsr_status"] = ns_status
- if ns_status == "ERROR":
- step = db_nsr_update["detailed-status"] = "Deleting ns at RO. RO_ns_id={}".format(RO_nsr_id)
- self.logger.debug(logging_text + step)
- await self.RO.delete("ns", RO_nsr_id)
- RO_nsr_id = db_nsr_update["_admin.deployed.RO.nsr_id"] = None
- if not RO_nsr_id:
- step = db_nsr_update["detailed-status"] = "Checking dependencies"
- # self.logger.debug(logging_text + step)
-
- # check if VIM is creating and wait look if previous tasks in process
- task_name, task_dependency = self.lcm_tasks.lookfor_related("vim_account", ns_params["vimAccountId"])
- 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)
- if ns_params.get("vnf"):
- for vnf in ns_params["vnf"]:
- if "vimAccountId" in vnf:
- task_name, task_dependency = self.lcm_tasks.lookfor_related("vim_account",
- vnf["vimAccountId"])
- 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_nsr_update["detailed-status"] = "Checking instantiation parameters"
-
- # feature 1429. Add n2vc public key to needed VMs
- n2vc_key = await self.n2vc.GetPublicKey()
- n2vc_key_list.append(n2vc_key)
- RO_ns_params = self.ns_params_2_RO(ns_params, nsd, db_vnfds_ref, n2vc_key_list)
-
- step = db_nsr_update["detailed-status"] = "Deploying ns at VIM"
- desc = await self.RO.create("ns", descriptor=RO_ns_params,
- name=db_nsr["name"],
- scenario=RO_nsd_uuid)
- RO_nsr_id = db_nsr_update["_admin.deployed.RO.nsr_id"] = desc["uuid"]
- db_nsr_update["_admin.nsState"] = "INSTANTIATED"
- db_nsr_update["_admin.deployed.RO.nsr_status"] = "BUILD"
- self.logger.debug(logging_text + "ns created at RO. RO_id={}".format(desc["uuid"]))
- self.update_db_2("nsrs", nsr_id, db_nsr_update)
-
- # wait until NS is ready
- step = ns_status_detailed = detailed_status = "Waiting VIM to deploy ns. RO_id={}".format(RO_nsr_id)
- detailed_status_old = None
- self.logger.debug(logging_text + step)
-
- while time() <= start_deploy + self.total_deploy_timeout:
- desc = await self.RO.show("ns", RO_nsr_id)
- ns_status, ns_status_info = self.RO.check_ns_status(desc)
- db_nsr_update["_admin.deployed.RO.nsr_status"] = ns_status
- 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":
- step = detailed_status = "Waiting for management IP address reported by the VIM. Updating VNFRs"
- try:
- self.ns_update_vnfr(db_vnfrs, desc)
- break
- except LcmExceptionNoMgmtIP:
- pass
- else:
- assert False, "ROclient.check_ns_status returns unknown {}".format(ns_status)
- if detailed_status != detailed_status_old:
- detailed_status_old = db_nsr_update["detailed-status"] = detailed_status
- self.update_db_2("nsrs", nsr_id, db_nsr_update)
- await asyncio.sleep(5, loop=self.loop)
- else: # total_deploy_timeout
- raise ROclient.ROClientException("Timeout waiting ns to be ready")
-
- step = "Updating NSR"
- self.ns_update_nsr(db_nsr_update, db_nsr, desc)
-
- db_nsr_update["operational-status"] = "running"
- db_nsr["detailed-status"] = "Configuring vnfr"
- self.update_db_2("nsrs", nsr_id, db_nsr_update)
-
- # Configure proxy charms once VMs are up
- for vca_index, vca_deployed in enumerate(vca_deployed_list):
- vnf_index = vca_deployed.get("member-vnf-index")
- vdu_id = vca_deployed.get("vdu_id")