X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_lcm%2Fns.py;h=d538e6093092e5d41c3d65f8dd10566304ff2d93;hb=f9b04954875539994e23544d3e7c82dfddc581dc;hp=e6caced53e8a66c0358465200b5c5e042feeed9c;hpb=c2564fecb25a5238d20edd628c9cdf94569e7625;p=osm%2FLCM.git diff --git a/osm_lcm/ns.py b/osm_lcm/ns.py index e6caced..d538e60 100644 --- a/osm_lcm/ns.py +++ b/osm_lcm/ns.py @@ -242,6 +242,7 @@ class NsLcm(LcmBase): :return: The RO ns descriptor """ vim_2_RO = {} + wim_2_RO = {} # TODO feature 1417: Check that no instantiation is set over PDU # check if PDU forces a concrete vim-network-id and add it # check if PDU contains a SDN-assist info (dpid, switch, port) and pass it to RO @@ -258,6 +259,21 @@ class NsLcm(LcmBase): vim_2_RO[vim_account] = RO_vim_id return RO_vim_id + def wim_account_2_RO(wim_account): + if isinstance(wim_account, str): + if wim_account in wim_2_RO: + return wim_2_RO[wim_account] + + db_wim = self.db.get_one("wim_accounts", {"_id": wim_account}) + if db_wim["_admin"]["operationalState"] != "ENABLED": + raise LcmException("WIM={} is not available. operationalState={}".format( + wim_account, db_wim["_admin"]["operationalState"])) + RO_wim_id = db_wim["_admin"]["deployed"]["RO-account"] + wim_2_RO[wim_account] = RO_wim_id + return RO_wim_id + else: + return wim_account + def ip_profile_2_RO(ip_profile): RO_ip_profile = deepcopy((ip_profile)) if "dns-server" in RO_ip_profile: @@ -281,6 +297,7 @@ class NsLcm(LcmBase): # "name": ns_params["nsName"], # "description": ns_params.get("nsDescription"), "datacenter": vim_account_2_RO(ns_params["vimAccountId"]), + "wim_account": wim_account_2_RO(ns_params.get("wimAccountId")), # "scenario": ns_params["nsdId"], } if n2vc_key_list: @@ -402,6 +419,10 @@ class NsLcm(LcmBase): if "ip-profile" in vld_params: populate_dict(RO_ns_params, ("networks", vld_params["name"], "ip-profile"), ip_profile_2_RO(vld_params["ip-profile"])) + + if "wimAccountId" in vld_params and vld_params["wimAccountId"] is not None: + populate_dict(RO_ns_params, ("networks", vld_params["name"], "wim_account"), + wim_account_2_RO(vld_params["wimAccountId"])), if vld_params.get("vim-network-name"): RO_vld_sites = [] if isinstance(vld_params["vim-network-name"], dict): @@ -539,7 +560,7 @@ class NsLcm(LcmBase): continue vnfr_update = {} if vnf_RO.get("ip_address"): - db_vnfr["ip-address"] = vnfr_update["ip-address"] = vnf_RO["ip_address"] + db_vnfr["ip-address"] = vnfr_update["ip-address"] = vnf_RO["ip_address"].split(";")[0] elif not db_vnfr.get("ip-address"): raise LcmExceptionNoMgmtIP("ns member_vnf_index '{}' has no IP address".format(vnf_index)) @@ -554,7 +575,8 @@ class NsLcm(LcmBase): vdur_RO_count_index += 1 continue vdur["vim-id"] = vdur_RO.get("vim_vm_id") - vdur["ip-address"] = vdur_RO.get("ip_address") + if vdur_RO.get("ip_address"): + vdur["ip-address"] = vdur_RO["ip_address"].split(";")[0] vdur["vdu-id-ref"] = vdur_RO.get("vdu_osm_id") vdur["name"] = vdur_RO.get("vim_name") vdur["status"] = vdur_RO.get("status") @@ -657,6 +679,10 @@ class NsLcm(LcmBase): db_nsr_update["detailed-status"] = "creating" db_nsr_update["operational-status"] = "init" + if not db_nsr["_admin"].get("deployed") or not db_nsr["_admin"]["deployed"].get("RO") or \ + not db_nsr["_admin"]["deployed"]["RO"].get("vnfd"): + populate_dict(db_nsr, ("_admin", "deployed", "RO", "vnfd"), []) + db_nsr_update["_admin.deployed.RO.vnfd"] = [] RO = ROclient.ROClient(self.loop, **self.ro_config) @@ -667,26 +693,39 @@ class NsLcm(LcmBase): # 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={} at RO".format(vnfd_ref) + 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 RO.get_list("vnfd", filter_by={"osm_id": vnfd_id_RO}) if vnfd_list: - db_nsr_update["_admin.deployed.RO.vnfd_id.{}".format(vnfd_id)] = vnfd_list[0]["uuid"] - self.logger.debug(logging_text + "vnfd={} exists at RO. Using RO_id={}".format( - vnfd_ref, vnfd_list[0]["uuid"])) + 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 RO.create("vnfd", descriptor=vnfd_RO) - db_nsr_update["_admin.deployed.RO.vnfd_id.{}".format(vnfd_id)] = desc["uuid"] - self.logger.debug(logging_text + "vnfd={} created at RO. RO_id={}".format( - vnfd_ref, desc["uuid"])) + 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 @@ -784,7 +823,7 @@ class NsLcm(LcmBase): while time() <= start_deploy + self.total_deploy_timeout: desc = await RO.show("ns", RO_nsr_id) ns_status, ns_status_info = RO.check_ns_status(desc) - db_nsr_update["admin.deployed.RO.nsr_status"] = ns_status + db_nsr_update["_admin.deployed.RO.nsr_status"] = ns_status if ns_status == "ERROR": raise ROclient.ROClientException(ns_status_info) elif ns_status == "BUILD": @@ -1243,19 +1282,21 @@ class NsLcm(LcmBase): self.logger.error(logging_text + failed_detail[-1]) RO_fail = True - if not RO_fail and nsr_deployed and nsr_deployed.get("RO") and nsr_deployed["RO"].get("vnfd_id"): - for vnf_id, RO_vnfd_id in nsr_deployed["RO"]["vnfd_id"].items(): - if not RO_vnfd_id: + if not RO_fail and nsr_deployed and nsr_deployed.get("RO") and nsr_deployed["RO"].get("vnfd"): + for index, vnf_deployed in enumerate(nsr_deployed["RO"]["vnfd"]): + if not vnf_deployed or not vnf_deployed["id"]: continue try: + RO_vnfd_id = vnf_deployed["id"] step = db_nsr_update["detailed-status"] = db_nslcmop_update["detailed-status"] =\ - "Deleting vnfd={} at RO".format(vnf_id) + "Deleting member-vnf-index={} RO_vnfd_id={} from RO".format( + vnf_deployed["member-vnf-index"], RO_vnfd_id) await RO.delete("vnfd", RO_vnfd_id) self.logger.debug(logging_text + "RO_vnfd_id={} deleted".format(RO_vnfd_id)) - db_nsr_update["_admin.deployed.RO.vnfd_id.{}".format(vnf_id)] = None + db_nsr_update["_admin.deployed.RO.vnfd.{}.id".format(index)] = None except ROclient.ROClientException as e: if e.http_code == 404: # not found - db_nsr_update["_admin.deployed.RO.vnfd_id.{}".format(vnf_id)] = None + db_nsr_update["_admin.deployed.RO.vnfd.{}.id".format(index)] = None self.logger.debug(logging_text + "RO_vnfd_id={} already deleted ".format(RO_vnfd_id)) elif e.http_code == 409: # conflict failed_detail.append("RO_vnfd_id={} delete conflict: {}".format(RO_vnfd_id, e))