From f578e55acd56e8bb15bda3604f9192280988105c Mon Sep 17 00:00:00 2001 From: tierno Date: Thu, 8 Nov 2018 19:07:20 +0100 Subject: [PATCH] Feature 1417 Fixing PDUs. Adding VLD deployed info at NSR and at VNFR. Adding topology at VNFR:vdur:interface, what ns-vld or vnf-vld is connected Change-Id: I8f3c68502838affbb0c1f8e876f097d0d8d14f83 Signed-off-by: tierno --- Dockerfile | 2 +- Dockerfile.local | 2 +- osm_lcm/lcm.py | 6 +- osm_lcm/lcm_utils.py | 4 ++ osm_lcm/ns.py | 162 ++++++++++++++++--------------------------- 5 files changed, 70 insertions(+), 106 deletions(-) diff --git a/Dockerfile b/Dockerfile index 95365fa..56b990d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -34,5 +34,5 @@ RUN apt-get update && \ # WORKDIR /app # # Copy the current directory contents into the container at /app # ADD . /app -#i CMD /app/devops-stages/stage-build.sh && find -name "*.deb" -exec dpkg -I {} ";" +# CMD /app/devops-stages/stage-build.sh && find -name "*.deb" -exec dpkg -I {} ";" diff --git a/Dockerfile.local b/Dockerfile.local index df607e6..65c7ce1 100644 --- a/Dockerfile.local +++ b/Dockerfile.local @@ -29,7 +29,7 @@ RUN apt-get update && apt-get install -y git tox python3 \ RUN git clone https://osm.etsi.org/gerrit/osm/N2VC.git \ && pip3 install -e N2VC \ && pip3 install -e N2VC/modules/libjuju \ - && apt-get install -y libffi-dev libssl-dev + && apt-get install -y libffi-dev libssl-dev openssh-client # cd N2VC; python3 setup.py develop # cd modules/libjuju; python3 setup.py develop diff --git a/osm_lcm/lcm.py b/osm_lcm/lcm.py index 7c33e5d..39a254b 100644 --- a/osm_lcm/lcm.py +++ b/osm_lcm/lcm.py @@ -27,14 +27,14 @@ min_RO_version = [0, 5, 72] min_n2vc_version = "0.0.2" min_common_version = "0.1.11" # uncomment if LCM is installed as library and installed, and get them from __init__.py -lcm_version = '0.1.22' -lcm_version_date = '2018-10-31' +lcm_version = '0.1.23' +lcm_version_date = '2018-11-13' class Lcm: ping_interval_pace = 120 # how many time ping is send once is confirmed all is running - ping_interval_boot = 5 # how mnay time ping is sent when booting + ping_interval_boot = 5 # how many time ping is sent when booting def __init__(self, config_file, loop=None): """ diff --git a/osm_lcm/lcm_utils.py b/osm_lcm/lcm_utils.py index b53f191..cb74118 100644 --- a/osm_lcm/lcm_utils.py +++ b/osm_lcm/lcm_utils.py @@ -12,6 +12,10 @@ class LcmException(Exception): pass +class LcmExceptionNoMgmtIP(LcmException): + pass + + def versiontuple(v): """utility for compare dot separate versions. Fills with zeros to proper number comparison package version will be something like 4.0.1.post11+gb3f024d.dirty-1. Where 4.0.1 is the git tag, postXX is the diff --git a/osm_lcm/ns.py b/osm_lcm/ns.py index 3126b17..4900287 100644 --- a/osm_lcm/ns.py +++ b/osm_lcm/ns.py @@ -9,7 +9,7 @@ import functools import traceback import ROclient -from lcm_utils import LcmException, LcmBase +from lcm_utils import LcmException, LcmExceptionNoMgmtIP, LcmBase from osm_common.dbbase import DbException from osm_common.fsbase import FsException @@ -83,58 +83,6 @@ class NsLcm(LcmBase): artifacts=None, ) - def _look_for_pdu(self, vdur, vnfr, vim_account): # TODO feature 1417: project_id - """ - Look for a free PDU in the catalog matching vdur type and interfaces. Fills vdur with ip_address information - :param vdur: vnfr:vdur descriptor. It is modified with pdu interface info if pdu is found - :param member_vnf_index: used just for logging. Target vnfd of nsd - :param vim_account: - :return: vder_update: dictionary to update vnfr:vdur with pdu info. In addition it modified choosen pdu to set - at status IN_USE - """ - pdu_type = vdur.get("pdu-type") - assert pdu_type - pdu_filter = { - "vim.vim_accounts": vim_account, - "type": pdu_type, - "_admin.operationalState": "ENABLED", - "_admin.usageSate": "NOT_IN_USE", - # TODO feature 1417: "shared": True, - # TODO feature 1417: "_admin.projects_read.cont": ["ANY", project_id], - } - available_pdus = self.db.get_list("pdus", pdu_filter) - for pdu in available_pdus: - # step 1 check if this pdu contains needed interfaces: - match_interfaces = True - for vdur_interface in vdur["interfaces"]: - for pdu_interface in pdu["interfaces"]: - if pdu_interface["name"] == vdur_interface["name"]: - # TODO feature 1417: match per mgmt type - break - else: # no interface found - match_interfaces = False - break - if not match_interfaces: - continue - - # step 2. Update pdu - self.update_db_2("pdus", pdu["_id"], {"_admin.usageSate": "IN_USE", - "_admin.usage.vnfr_id": vnfr["_id"], - "_admin.usage.nsr_id": vnfr["nsr-id-ref"], - "_admin.usage.vdur": vdur["vdu-id-ref"], - }) - # step 3. Fill vnfr info by filling vdur - vdur["pdu-id"] = pdu["_id"] - for vdur_interface in vdur["interfaces"]: - for pdu_interface in pdu["interfaces"]: - if pdu_interface["name"] == vdur_interface["name"]: - vdur_interface.update(pdu_interface) - break - - return - raise LcmException("No PDU of type={} found for member_vng_index={} at vim_account={} matching interface " - "names".format(vdur["vdu-id-ref"], vnfr["member-vnf-index-ref"], pdu_type)) - def vnfd2RO(self, vnfd, new_id=None): """ Converts creates a new vnfd descriptor for RO base on input OSM IM vnfd @@ -504,6 +452,28 @@ class NsLcm(LcmBase): db_vnfr["vdur"] = vdurs self.update_db_2("vnfrs", db_vnfr["_id"], vnfr_update) + def ns_update_nsr(self, ns_update_nsr, db_nsr, nsr_desc_RO): + """ + Updates database nsr with the RO info for the created vld + :param ns_update_nsr: dictionary to be filled with the updated info + :param db_nsr: content of db_nsr. This is also modified + :param nsr_desc_RO: nsr descriptor from RO + :return: Nothing, LcmException is raised on errors + """ + + for vld_index, vld in enumerate(get_iterable(db_nsr, "vld")): + for net_RO in get_iterable(nsr_desc_RO, "nets"): + if vld["id"] != net_RO.get("ns_net_osm_id"): + continue + vld["vim-id"] = net_RO.get("vim_net_id") + vld["name"] = net_RO.get("vim_name") + vld["status"] = net_RO.get("status") + vld["status-detailed"] = net_RO.get("error_msg") + ns_update_nsr["vld.{}".format(vld_index)] = vld + break + else: + raise LcmException("ns_update_nsr: Not found vld={} at RO info".format(vld["id"])) + def ns_update_vnfr(self, db_vnfrs, nsr_desc_RO): """ Updates database vnfr with the RO info, e.g. ip_address, vim_id... Descriptor db_vnfrs is also updated @@ -516,7 +486,10 @@ class NsLcm(LcmBase): if vnf_RO["member_vnf_index"] != vnf_index: continue vnfr_update = {} - db_vnfr["ip-address"] = vnfr_update["ip-address"] = vnf_RO.get("ip_address") + if vnf_RO.get("ip_address"): + db_vnfr["ip-address"] = vnfr_update["ip-address"] = vnf_RO["ip_address"] + elif not db_vnfr.get("ip-address"): + raise LcmExceptionNoMgmtIP("ns member_vnf_index '{}' has no IP address".format(vnf_index)) for vdu_index, vdur in enumerate(get_iterable(db_vnfr, "vdur")): vdur_RO_count_index = 0 @@ -548,6 +521,21 @@ class NsLcm(LcmBase): else: raise LcmException("ns_update_vnfr: Not found member_vnf_index={} vdur={} count_index={} at " "RO info".format(vnf_index, vdur["vdu-id-ref"], vdur["count-index"])) + + for vld_index, vld in enumerate(get_iterable(db_vnfr, "vld")): + for net_RO in get_iterable(nsr_desc_RO, "nets"): + if vld["id"] != net_RO.get("vnf_net_osm_id"): + continue + vld["vim-id"] = net_RO.get("vim_net_id") + vld["name"] = net_RO.get("vim_name") + vld["status"] = net_RO.get("status") + vld["status-detailed"] = net_RO.get("error_msg") + vnfr_update["vld.{}".format(vld_index)] = vld + break + else: + raise LcmException("ns_update_vnfr: Not found member_vnf_index={} vld={} at RO info".format( + vnf_index, vld["id"])) + self.update_db_2("vnfrs", db_vnfr["_id"], vnfr_update) break @@ -574,7 +562,7 @@ class NsLcm(LcmBase): db_nslcmop = self.db.get_one("nslcmops", {"_id": nslcmop_id}) step = "Getting nsr={} from db".format(nsr_id) db_nsr = self.db.get_one("nsrs", {"_id": nsr_id}) - ns_params = db_nsr.get("instantiate_params") + ns_params = db_nslcmop.get("operationParams") nsd = db_nsr["nsd"] nsr_name = db_nsr["name"] # TODO short-name?? @@ -603,41 +591,12 @@ class NsLcm(LcmBase): db_vnfds_ref[vnfd_ref] = vnfd db_vnfds[vnfd_id] = vnfd - # update VNFR vimAccount and pdu information - - vim_account = vnfr.get("vim-account-id") - vnfr_update = {} - if not vim_account: - step = "Updating VNFR vimAccount" - vim_account = db_nsr["instantiate_params"]["vimAccountId"] - # check instantiate parameters - if db_nsr["instantiate_params"].get("vnf"): - for vnf_params in db_nsr["instantiate_params"]["vnf"]: - if vnf_params.get("member-vnf-index") == vnfr["member-vnf-index-ref"]: - if vnf_params.get("vimAccountId"): - vim_account = vnf_params.get("vimAccountId") - break - vnfr_update["vim-account-id"] = vim_account - vnfr["vim-account-id"] = vim_account - - # check PDUs and get PDU - for vdur_index, vdur in enumerate(get_iterable(vnfr, "vdur")): - pdu_type = vdur.get("pdu-type") - if not pdu_type: - continue - # look for free pdu - self._look_for_pdu(vdur, vnfr, vim_account) - # fill vnfr with pdu info - vnfr_update["vdur.{}".format(vdur_index)] = vdur - if vnfr_update: - self.update_db_2("vnfrs", vnfr["_id"], vnfr_update) - nsr_lcm = db_nsr["_admin"].get("deployed") if not nsr_lcm: nsr_lcm = db_nsr["_admin"]["deployed"] = { "id": nsr_id, "RO": {"vnfd_id": {}, "nsd_id": None, "nsr_id": None, "nsr_status": "SCHEDULED"}, - "nsr_ip": {}, + # "nsr_ip": {}, "VCA": {}, } db_nsr_update["detailed-status"] = "creating" @@ -766,13 +725,13 @@ class NsLcm(LcmBase): 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" + step = detailed_status = "Waiting for management IP address reported by the VIM. Updating VNFRs" try: - nsr_lcm["nsr_ip"] = RO.get_ns_vnf_info(desc) + # nsr_lcm["nsr_ip"] = RO.get_ns_vnf_info(desc) + self.ns_update_vnfr(db_vnfrs, desc) break - except ROclient.ROClientException as e: - if e.http_code != 409: # IP address is not ready return code is 409 CONFLICT - raise e + except LcmExceptionNoMgmtIP: + pass else: assert False, "ROclient.check_ns_status returns unknown {}".format(ns_status) if detailed_status != detailed_status_old: @@ -782,8 +741,8 @@ class NsLcm(LcmBase): else: # total_deploy_timeout raise ROclient.ROClientException("Timeout waiting ns to be ready") - step = "Updating VNFRs" - self.ns_update_vnfr(db_vnfrs, desc) + step = "Updating NSR" + self.ns_update_nsr(db_nsr_update, db_nsr, desc) db_nsr["detailed-status"] = "Configuring vnfr" self.update_db_2("nsrs", nsr_id, db_nsr_update) @@ -1406,6 +1365,7 @@ class NsLcm(LcmBase): scale_process = None old_operational_status = "" old_config_status = "" + vnfr_scaled = False try: step = "Getting nslcmop from database" db_nslcmop = self.db.get_one("nslcmops", {"_id": nslcmop_id}) @@ -1593,14 +1553,18 @@ class NsLcm(LcmBase): elif ns_status == "BUILD": detailed_status = step + "; {}".format(ns_status_info) elif ns_status == "ACTIVE": - step = detailed_status = "Waiting for management IP address reported by the VIM" + step = detailed_status = \ + "Waiting for management IP address reported by the VIM. Updating VNFRs" + if not vnfr_scaled: + self.scale_vnfr(db_vnfr, vdu_create=vdu_create, vdu_delete=vdu_delete) + vnfr_scaled = True try: desc = await RO.show("ns", RO_nsr_id) - nsr_lcm["nsr_ip"] = RO.get_ns_vnf_info(desc) + # nsr_lcm["nsr_ip"] = RO.get_ns_vnf_info(desc) + self.ns_update_vnfr({db_vnfr["member-vnf-index-ref"]: db_vnfr}, desc) break - except ROclient.ROClientException as e: - if e.http_code != 409: # IP address is not ready return code is 409 CONFLICT - raise e + except LcmExceptionNoMgmtIP: + pass else: assert False, "ROclient.check_ns_status returns unknown {}".format(ns_status) if detailed_status != detailed_status_old: @@ -1612,10 +1576,6 @@ class NsLcm(LcmBase): if deployment_timeout <= 0: raise ROclient.ROClientException("Timeout waiting ns to be ready") - step = "Updating VNFRs" - self.scale_vnfr(db_vnfr, vdu_create=vdu_create, vdu_delete=vdu_delete) - self.ns_update_vnfr({db_vnfr["member-vnf-index-ref"]: db_vnfr}, desc) - # update VDU_SCALING_INFO with the obtained ip_addresses if vdu_scaling_info["scaling_direction"] == "OUT": for vdur in reversed(db_vnfr["vdur"]): -- 2.25.1