X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=osm_lcm%2Fns.py;h=d6318ad9b7222f10a4f42d9bfd2a3c7e6fc33a1b;hb=9597c29234cffe76f9ae2bd7bcaa0955e010b4b4;hp=98c9968211c2349811b016187aea4be4c0fee12c;hpb=1674de87bdfcd8548910dd379a486749daf29f5c;p=osm%2FLCM.git diff --git a/osm_lcm/ns.py b/osm_lcm/ns.py index 98c9968..d6318ad 100644 --- a/osm_lcm/ns.py +++ b/osm_lcm/ns.py @@ -29,7 +29,7 @@ from lcm_utils import LcmException, LcmExceptionNoMgmtIP, LcmBase from osm_common.dbbase import DbException from osm_common.fsbase import FsException -from n2vc.vnf import N2VC, N2VCPrimitiveExecutionFailed +from n2vc.vnf import N2VC, N2VCPrimitiveExecutionFailed, NetworkServiceDoesNotExist from copy import copy, deepcopy from http import HTTPStatus @@ -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): """ @@ -99,6 +99,8 @@ class NsLcm(LcmBase): # it unset and pass it via DeployCharms # artifacts=vca_config[''], artifacts=None, + juju_public_key=vca_config.get('pubkey'), + ca_cert=vca_config.get('cacert'), ) def vnfd2RO(self, vnfd, new_id=None, additionalParams=None, nsrId=None): @@ -197,7 +199,8 @@ class NsLcm(LcmBase): if model_name == vca_deployed["model"] and application_name == vca_deployed["application"]: break else: - self.logger.error(logging_text + " Not present at nsr._admin.deployed.VCA") + self.logger.error(logging_text + " Not present at nsr._admin.deployed.VCA. Received model_name={}". + format(model_name)) return if task: if task.cancelled(): @@ -447,6 +450,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 @@ -577,6 +586,8 @@ class NsLcm(LcmBase): vdur["vim-id"] = vdur_RO.get("vim_vm_id") 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") @@ -667,8 +678,10 @@ class NsLcm(LcmBase): # Get or generates the _admin.deployed,VCA list vca_deployed_list = None + vca_model_name = None if db_nsr["_admin"].get("deployed"): vca_deployed_list = db_nsr["_admin"]["deployed"].get("VCA") + vca_model_name = db_nsr["_admin"]["deployed"].get("VCA-model-name") if vca_deployed_list is None: vca_deployed_list = [] db_nsr_update["_admin.deployed.VCA"] = vca_deployed_list @@ -881,7 +894,7 @@ class NsLcm(LcmBase): # ns_name will be ignored in the current version of N2VC # but will be implemented for the next point release. - model_name = "default" # TODO bug 585 nsr_id + model_name = nsr_id if vdu_id: vdu_id_text = vdu_id + "-" else: @@ -956,6 +969,13 @@ class NsLcm(LcmBase): proxy_charm = vnf_config["juju"]["charm"] if proxy_charm: + if not vca_model_name: + step = "creating VCA model name '{}'".format(nsr_id) + self.logger.debug(logging_text + step) + await self.n2vc.CreateNetworkService(nsr_id) + vca_model_name = nsr_id + db_nsr_update["_admin.deployed.VCA-model-name"] = nsr_id + self.update_db_2("nsrs", nsr_id, db_nsr_update) step = "connecting to N2VC to configure vnf {}".format(vnf_index) vnfr_params["rw_mgmt_ip"] = db_vnfrs[vnf_index]["ip-address"] charm_params = { @@ -967,6 +987,7 @@ class NsLcm(LcmBase): # 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(vnf_index, None, None, None, charm_params, n2vc_info) number_to_configure += 1 @@ -979,6 +1000,12 @@ class NsLcm(LcmBase): proxy_charm = vdu_config["juju"]["charm"] if proxy_charm: + if not vca_model_name: + step = "creating VCA model name" + await self.n2vc.CreateNetworkService(nsr_id) + vca_model_name = nsr_id + db_nsr_update["_admin.deployed.VCA-model-name"] = nsr_id + self.update_db_2("nsrs", nsr_id, db_nsr_update) step = "connecting to N2VC to configure vdu {} from vnf {}".format(vdu["id"], vnf_index) await self.n2vc.login() vdur = db_vnfrs[vnf_index]["vdur"][vdu_index] @@ -1171,7 +1198,21 @@ class NsLcm(LcmBase): db_nsr_update["operational-status"] = "terminating" db_nsr_update["config-status"] = "terminating" - if nsr_deployed and nsr_deployed.get("VCA"): + if nsr_deployed and nsr_deployed.get("VCA-model-name"): + vca_model_name = nsr_deployed["VCA-model-name"] + step = "deleting VCA model name '{}' and all charms".format(vca_model_name) + self.logger.debug(logging_text + step) + try: + await self.n2vc.DestroyNetworkService(vca_model_name) + except NetworkServiceDoesNotExist: + pass + db_nsr_update["_admin.deployed.VCA-model-name"] = None + if nsr_deployed.get("VCA"): + for vca_index in range(0, len(nsr_deployed["VCA"])): + db_nsr_update["_admin.deployed.VCA.{}".format(vca_index)] = None + self.update_db_2("nsrs", nsr_id, db_nsr_update) + # for backward compatibility if charm have been created with "default" model name delete one by one + elif nsr_deployed and nsr_deployed.get("VCA"): try: step = "Scheduling configuration charms removing" db_nsr_update["detailed-status"] = "Deleting charms" @@ -1447,7 +1488,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"