X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=rwlaunchpad%2Fplugins%2Frwnsm%2Frift%2Ftasklets%2Frwnsmtasklet%2Frwnsmtasklet.py;h=ea17e6015ecc2113699bacd5dcd943b3a64fbe89;hb=refs%2Fchanges%2F35%2F1535%2F1;hp=e739684d99e6877d16964143f0e9cebd2d72050e;hpb=9bbec9ddf679ddf9bfd141211c7b4e8cb925483a;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 e739684d..ea17e601 100755 --- a/rwlaunchpad/plugins/rwnsm/rift/tasklets/rwnsmtasklet/rwnsmtasklet.py +++ b/rwlaunchpad/plugins/rwnsm/rift/tasklets/rwnsmtasklet/rwnsmtasklet.py @@ -51,7 +51,7 @@ from gi.repository import ( VnfrYang, RwVnfrYang, RwNsmYang, - RwsdnYang, + RwsdnalYang, RwDts as rwdts, RwTypes, ProtobufC, @@ -395,7 +395,7 @@ class VnffgRecord(object): vnfr = yield from self._nsr.fetch_vnfr(nsr_vnfr.xpath) self._log.debug("Received VNFR is %s", vnfr) - sff = RwsdnYang.VNFFGSff() + sff = RwsdnalYang.VNFFGSff() sff_list[nsr_vnfr.vnfd.id] = sff sff.name = nsr_vnfr.name sff.function_type = nsr_vnfr.vnfd.service_function_chain @@ -2041,7 +2041,7 @@ class NetworkServiceRecord(object): (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) + self._log.info("Could not resolve cloud-construct for placement group: %s", group.name) ### raise PlacementGroupError("Could not resolve cloud-construct for placement group: {}".format(group.name)) else: self._log.info("Successfully resolved cloud construct for placement group: %s for VNF: %s (Member Index: %s)", @@ -2056,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, @@ -2681,6 +2682,26 @@ class InputParameterSubstitution(object): self.log = log self.project = project + def _fix_xpath(self, xpath): + # Fix the parameter.xpath to include project and correct namespace + self.log.error("Provided xpath: {}".format(xpath)) + #Split the xpath at the / + attrs = xpath.split('/') + new_xp = attrs[0] + for attr in attrs[1:]: + new_ns = 'project-nsd' + name = attr + if ':' in attr: + # Includes namespace + ns, name = attr.split(':', 2) + if ns == "rw-nsd": + ns = "rw-project-nsd" + + new_xp = new_xp + '/' + new_ns + ':' + name + + self.log.error("Updated xpath: {}".format(new_xp)) + return new_xp + def __call__(self, nsd, nsr_config): """Substitutes input parameters from the NSR config into the NSD @@ -2699,7 +2720,7 @@ class InputParameterSubstitution(object): # to be modified optional_input_parameters = set() for input_parameter in nsd.input_parameter_xpath: - optional_input_parameters.add(self.project.add_project(input_parameter.xpath)) + optional_input_parameters.add(input_parameter.xpath) # Apply the input parameters to the descriptor if nsr_config.input_parameter: @@ -2717,7 +2738,8 @@ class InputParameterSubstitution(object): ) try: - xpath.setxattr(nsd, param.xpath, param.value) + xp = self._fix_xpath(param.xpath) + xpath.setxattr(nsd, xp, param.value) except Exception as e: self.log.exception(e) @@ -2823,11 +2845,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) @@ -2929,15 +2957,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) @@ -3349,11 +3382,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, @@ -3632,7 +3674,7 @@ class VnfrDtsHandler(object): schema = VnfrYang.YangData_RwProject_Project_VnfrCatalog_Vnfr.schema() path_entry = schema.keyspec_to_entry(ks_path) - if path_entry.key00.id not in self._nsm._vnfrs: + if not path_entry or (path_entry.key00.id not in self._nsm._vnfrs): # Check if this is a monitoring param xpath if 'vnfr:monitoring-param' not in xpath: self._log.error("%s request for non existent record path %s", @@ -3662,7 +3704,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 @@ -3724,7 +3766,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 @@ -3850,7 +3892,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): @@ -3985,9 +4027,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) @@ -4537,6 +4580,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):