X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=rwlaunchpad%2Fplugins%2Frwnsm%2Frift%2Ftasklets%2Frwnsmtasklet%2Frwnsmtasklet.py;h=2b0c57bd23bbf3bd2e347590ce4ff661d899bcd1;hb=9ad945aab0b5a992e1df860bede8ecc9b143470e;hp=0797b5583216e2e047d667ac53b6592716cc19c1;hpb=f49375710db1acf3cd74c8651d098b7a08e8d0b2;p=osm%2FSO.git diff --git a/rwlaunchpad/plugins/rwnsm/rift/tasklets/rwnsmtasklet/rwnsmtasklet.py b/rwlaunchpad/plugins/rwnsm/rift/tasklets/rwnsmtasklet/rwnsmtasklet.py index 0797b558..2b0c57bd 100755 --- a/rwlaunchpad/plugins/rwnsm/rift/tasklets/rwnsmtasklet/rwnsmtasklet.py +++ b/rwlaunchpad/plugins/rwnsm/rift/tasklets/rwnsmtasklet/rwnsmtasklet.py @@ -35,7 +35,7 @@ from enum import Enum import gi gi.require_version('RwYang', '1.0') -gi.require_version('RwNsdYang', '1.0') +gi.require_version('ProjectNsdYang', '1.0') gi.require_version('RwDts', '1.0') gi.require_version('RwNsmYang', '1.0') gi.require_version('RwNsrYang', '1.0') @@ -46,7 +46,7 @@ from gi.repository import ( RwYang, RwNsrYang, NsrYang, - NsdYang, + ProjectNsdYang as NsdYang, RwVlrYang, VnfrYang, RwVnfrYang, @@ -985,7 +985,7 @@ class VirtualNetworkFunctionRecord(object): vnfr.vnfd = VnfrYang.YangData_RwProject_Project_VnfrCatalog_Vnfr_Vnfd. \ from_dict(self.vnfd.as_dict(), ignore_missing_keys=True) - vnfr.member_vnf_index_ref = str(self.member_vnf_index) + vnfr.member_vnf_index_ref = self.member_vnf_index vnfr.vnf_configuration.from_dict(self._vnfd.vnf_configuration.as_dict()) if self._vnfd.mgmt_interface.has_field("port"): @@ -1094,6 +1094,8 @@ class VirtualNetworkFunctionRecord(object): return None # For every connection point in the VNFD fill in the identifier + self._log.debug("Add connection point for VNF %s: %s", + self.vnfr_msg.name, self._vnfd.connection_point) for conn_p in self._vnfd.connection_point: cpr = VnfrYang.YangData_RwProject_Project_VnfrCatalog_Vnfr_ConnectionPoint() cpr.name = conn_p.name @@ -1125,9 +1127,6 @@ class VirtualNetworkFunctionRecord(object): self._log.info("Created VNF with xpath %s and vnfr %s", self.xpath, self.vnfr_msg) - self._log.info("Instantiated VNFR with xpath %s and vnfd %s, vnfr %s", - self.xpath, self._vnfd, self.vnfr_msg) - @asyncio.coroutine def update_state(self, vnfr_msg): """ Update this VNFR""" @@ -1444,7 +1443,7 @@ class NetworkServiceRecord(object): """ Fetch Cloud Account for the passed vnfd id """ if self._nsr_cfg_msg.vnf_cloud_account_map: vim_accounts = [(vnf.cloud_account,vnf.om_datacenter) for vnf in self._nsr_cfg_msg.vnf_cloud_account_map \ - if vnfd_member_index == vnf.member_vnf_index_ref] + if str(vnfd_member_index) == vnf.member_vnf_index_ref] if vim_accounts and vim_accounts[0]: return vim_accounts[0] return (self.cloud_account_name,self.om_datacenter_name) @@ -2039,7 +2038,7 @@ class NetworkServiceRecord(object): for group in self.nsd_msg.placement_groups: for member_vnfd in group.member_vnfd: if (member_vnfd.vnfd_id_ref == vnfd_msg.id) and \ - (member_vnfd.member_vnf_index_ref == const_vnfd.member_vnf_index): + (member_vnfd.member_vnf_index_ref == str(const_vnfd.member_vnf_index)): group_info = self.resolve_placement_group_cloud_construct(group) if group_info is None: self._log.error("Could not resolve cloud-construct for placement group: %s", group.name) @@ -2057,10 +2056,11 @@ class NetworkServiceRecord(object): # Fetch the VNFD associated with this VNF placement_groups = self.get_placement_groups(vnfd_msg, const_vnfd) self._log.info("Cloud Account for VNF %d is %s",const_vnfd.member_vnf_index,cloud_account_name) - self._log.info("Launching VNF: %s (Member Index: %s) in NSD plancement Groups: %s", + self._log.info("Launching VNF: %s (Member Index: %s) in NSD plancement Groups: %s, restart mode self.restart_mode %s", vnfd_msg.name, const_vnfd.member_vnf_index, - [ group.name for group in placement_groups]) + [ group.name for group in placement_groups], + self.restart_mode) vnfr = yield from VirtualNetworkFunctionRecord.create_record(self._dts, self._log, self._loop, @@ -2235,7 +2235,7 @@ class NetworkServiceRecord(object): def nsd_xpath(self): """ Return NSD config xpath.""" return self._project.add_project(( - "C,/nsd:nsd-catalog/nsd:nsd[nsd:id = '{}']" + "C,/project-nsd:nsd-catalog/project-nsd:nsd[project-nsd:id = '{}']" ).format(self.nsd_id)) @asyncio.coroutine @@ -2780,7 +2780,7 @@ class NetworkServiceDescriptor(object): def path_for_id(nsd_id): """ Return path for the passed nsd_id""" return self._nsm._project.add_project( - "C,/nsd:nsd-catalog/nsd:nsd[nsd:id = '{}'". + "C,/project-nsd:nsd-catalog/project-nsd:nsd[project-nsd:id = '{}'". format(nsd_id)) def path(self): @@ -2794,7 +2794,7 @@ class NetworkServiceDescriptor(object): class NsdDtsHandler(object): """ The network service descriptor DTS handler """ - XPATH = "C,/nsd:nsd-catalog/nsd:nsd" + XPATH = "C,/project-nsd:nsd-catalog/project-nsd:nsd" def __init__(self, dts, log, loop, nsm): self._dts = dts @@ -2824,11 +2824,17 @@ class NsdDtsHandler(object): is_recovery = xact.xact is None and action == rwdts.AppconfAction.INSTALL self._log.debug("Got nsd apply cfg (xact:%s) (action:%s)", xact, action) - # Create/Update an NSD record - for cfg in self._regh.get_xact_elements(xact): - # Only interested in those NSD cfgs whose ID was received in prepare callback - if cfg.id in scratch.get('nsds', []) or is_recovery: - self._nsm.update_nsd(cfg) + + if self._regh: + # Create/Update an NSD record + for cfg in self._regh.get_xact_elements(xact): + # Only interested in those NSD cfgs whose ID was received in prepare callback + if cfg.id in scratch.get('nsds', []) or is_recovery: + self._nsm.update_nsd(cfg) + + else: + self._log.error("No reg handle for {} for project {}". + format(self.__class__, self._project.name)) scratch.pop('nsds', None) @@ -2900,7 +2906,7 @@ class NsdDtsHandler(object): class VnfdDtsHandler(object): """ DTS handler for VNFD config changes """ - XPATH = "C,/vnfd:vnfd-catalog/vnfd:vnfd" + XPATH = "C,/project-vnfd:vnfd-catalog/project-vnfd:vnfd" def __init__(self, dts, log, loop, nsm): self._dts = dts @@ -2930,15 +2936,20 @@ class VnfdDtsHandler(object): self._log.debug("Got NSM VNFD apply (xact: %s) (action: %s)(scr: %s)", xact, action, scratch) - # Create/Update a VNFD record - for cfg in self._regh.get_xact_elements(xact): - # Only interested in those VNFD cfgs whose ID was received in prepare callback - if cfg.id in scratch.get('vnfds', []): - self._nsm.update_vnfd(cfg) + if self._regh: + # Create/Update a VNFD record + for cfg in self._regh.get_xact_elements(xact): + # Only interested in those VNFD cfgs whose ID was received in prepare callback + if cfg.id in scratch.get('vnfds', []): + self._nsm.update_vnfd(cfg) + + for cfg in self._regh.elements: + if cfg.id in scratch.get('deleted_vnfds', []): + yield from self._nsm.delete_vnfd(cfg.id) - for cfg in self._regh.elements: - if cfg.id in scratch.get('deleted_vnfds', []): - yield from self._nsm.delete_vnfd(cfg.id) + else: + self._log.error("Reg handle none for {} in project {}". + format(self.__class__, self._project)) scratch.pop('vnfds', None) scratch.pop('deleted_vnfds', None) @@ -3350,11 +3361,20 @@ class NsrDtsHandler(object): if action == rwdts.AppconfAction.INSTALL and xact.id is None: key_pairs = [] - for element in self._key_pair_regh.elements: - key_pairs.append(element) - for element in self._nsr_regh.elements: - nsr = handle_create_nsr(element, key_pairs, restart_mode=True) - self._loop.create_task(begin_instantiation(nsr)) + if self._key_pair_regh: + for element in self._key_pair_regh.elements: + key_pairs.append(element) + else: + self._log.error("Reg handle none for key pair in project {}". + format(self._project)) + + if self._nsr_regh: + for element in self._nsr_regh.elements: + nsr = handle_create_nsr(element, key_pairs, restart_mode=True) + self._loop.create_task(begin_instantiation(nsr)) + else: + self._log.error("Reg handle none for NSR in project {}". + format(self._project)) (added_msgs, deleted_msgs, updated_msgs) = get_add_delete_update_cfgs(self._nsr_regh, @@ -3663,7 +3683,7 @@ class VnfrDtsHandler(object): def deregister(self): self._log.debug("De-register VNFR for project {}". - format(self._project.name)) + format(self._nsm._project.name)) if self._regh: self._regh.deregister() self._regh = None @@ -3725,7 +3745,7 @@ class NsdRefCountDtsHandler(object): def deregister(self): self._log.debug("De-register NSD Ref count for project {}". - format(self._project.name)) + format(self._nsm._project.name)) if self._regh: self._regh.deregister() self._regh = None @@ -3851,7 +3871,7 @@ class NsManager(object): def deregister(self): """ Register all static DTS handlers """ for dts_handle in self._dts_handlers: - yield from dts_handle.deregister() + dts_handle.deregister() def get_ns_by_nsr_id(self, nsr_id): @@ -3986,9 +4006,10 @@ class NsManager(object): self._log.error(msg) raise NetworkServiceRecordError(msg) - self._log.info("Create NetworkServiceRecord nsr id %s from nsd_id %s", + self._log.info("Create NetworkServiceRecord nsr id %s from nsd_id %s, restart mode %s", nsr_msg.id, - nsr_msg.nsd.id) + nsr_msg.nsd.id, + restart_mode) nsm_plugin = self._ro_plugin_selector.ro_plugin sdn_account_name = self._cloud_account_handler.get_cloud_account_sdn_name(nsr_msg.cloud_account) @@ -4538,6 +4559,14 @@ class NsmProject(ManoProject): self._vnffgmgr.deregister() self._cloud_account_handler.deregister() self._ro_plugin_selector.deregister() + self._nsm = None + + @asyncio.coroutine + def delete_prepare(self): + # Check if any NS instance is present + if self._nsm and self._nsm._nsrs: + return False + return True class NsmTasklet(rift.tasklets.Tasklet):