X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=rwlaunchpad%2Fplugins%2Frwnsm%2Frift%2Ftasklets%2Frwnsmtasklet%2Frwnsmtasklet.py;h=7cbc194b99dd568c7c62dd46bc080473b7756556;hb=375ebf79a245a2140c3eeaf82b1843d255c149fd;hp=85b31a5d26c9f4e9365e37cb0989431197cc407c;hpb=d051747b9a40a8b675ecf39f1b5e89f33cd9bffb;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 85b31a5d..7cbc194b 100755 --- a/rwlaunchpad/plugins/rwnsm/rift/tasklets/rwnsmtasklet/rwnsmtasklet.py +++ b/rwlaunchpad/plugins/rwnsm/rift/tasklets/rwnsmtasklet/rwnsmtasklet.py @@ -111,16 +111,10 @@ class NetworkServiceDescriptorNotFound(Exception): pass -class NetworkServiceDescriptorRefCountExists(Exception): +class NetworkServiceDescriptorNotFound(Exception): """ Network Service Descriptor reference count exists """ pass - -class NetworkServiceDescriptorUnrefError(Exception): - """ Failed to unref a network service descriptor """ - pass - - class NsrInstantiationFailed(Exception): """ Failed to instantiate network service """ pass @@ -1459,7 +1453,6 @@ class NetworkServiceRecord(object): for vlr in self._vlrs: yield from self.nsm_plugin.instantiate_vl(self, vlr) vlr.state = VlRecordState.ACTIVE - self.vlr_uptime_tasks[vlr.id] = self._loop.create_task(self.vlr_uptime_update(vlr)) def vlr_uptime_update(self, vlr): @@ -1701,7 +1694,6 @@ class NetworkServiceRecord(object): vnfr = yield from self.create_vnf_record(vnfd_msg, const_vnfd_msg, cloud_account_name, om_datacenter_name, group_name, index) scale_instance.add_vnfr(vnfr) vnfrs.append(vnfr) - return vnfrs @asyncio.coroutine @@ -1722,7 +1714,8 @@ class NetworkServiceRecord(object): format(group.name, index)) scale_instance.operational_status = "failed" else: - yield from self.instantiate_vnfs(vnfrs) + yield from self.instantiate_vnfs(vnfrs, scaleout=True) + except Exception as e: self._log.exception("Failed to begin instantiatiation of vnfs for scale group {}: {}". @@ -2026,11 +2019,10 @@ 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, restart mode self.restart_mode %s", + self._log.info("Launching VNF: %s (Member Index: %s) in NSD plancement Groups: %s", vnfd_msg.name, const_vnfd.member_vnf_index, - [ group.name for group in placement_groups], - self.restart_mode) + [ group.name for group in placement_groups]) vnfr = yield from VirtualNetworkFunctionRecord.create_record(self._dts, self._log, self._loop, @@ -2095,14 +2087,14 @@ class NetworkServiceRecord(object): return vnfr @asyncio.coroutine - def instantiate_vnfs(self, vnfrs): + def instantiate_vnfs(self, vnfrs, scaleout=False): """ This function instantiates VNFs for every VNF in this Network Service """ self._log.debug("Instantiating %u VNFs in NS %s", len(vnfrs), self.id) for vnf in vnfrs: self._log.debug("Instantiating VNF: %s in NS %s", vnf, self.id) - yield from self.nsm_plugin.instantiate_vnf(self, vnf) + yield from self.nsm_plugin.instantiate_vnf(self, vnf,scaleout) @asyncio.coroutine def instantiate_vnffgs(self): @@ -2240,14 +2232,6 @@ class NetworkServiceRecord(object): # Find the NSD self._nsd = self._nsr_cfg_msg.nsd - try: - # Update ref count if nsd present in catalog - self._nsm.get_nsd_ref(self.nsd_id) - - except NetworkServiceDescriptorError: - # This could be an NSD not in the nsd-catalog - pass - # Merge any config and initial config primitive values self.config_store.merge_nsd_config(self.nsd_msg) self._log.debug("Merged NSD: {}".format(self.nsd_msg.as_dict())) @@ -2351,9 +2335,12 @@ class NetworkServiceRecord(object): def on_instantiate_done(fut): # If the do_instantiate fails, then publish NSR with failed result - if fut.exception() is not None: - self._log.error("NSR instantiation failed for NSR id %s: %s", self.id, str(fut.exception())) - self._loop.create_task(self.instantiation_failed(failed_reason=str(fut.exception()))) + e = fut.exception() + if e is not None: + import traceback, sys + print(traceback.format_exception(None,e, e.__traceback__), file=sys.stderr, flush=True) + self._log.error("NSR instantiation failed for NSR id %s: %s", self.id, str(e)) + self._loop.create_task(self.instantiation_failed(failed_reason=str(e))) instantiate_task = self._loop.create_task(do_instantiate()) instantiate_task.add_done_callback(on_instantiate_done) @@ -2703,8 +2690,6 @@ class NetworkServiceDescriptor(object): self._loop = loop self._nsd = nsd - self._ref_count = 0 - self._nsm = nsm @property @@ -2717,28 +2702,6 @@ class NetworkServiceDescriptor(object): """ Returns name of nsd """ return self._nsd.name - @property - def ref_count(self): - """ Returns reference count""" - return self._ref_count - - def in_use(self): - """ Returns whether nsd is in use or not """ - return True if self.ref_count > 0 else False - - def ref(self): - """ Take a reference on this object """ - self._ref_count += 1 - - def unref(self): - """ Release reference on this object """ - if self.ref_count < 1: - msg = ("Unref on a NSD object - nsd id %s, ref_count = %s" % - (self.id, self.ref_count)) - self._log.critical(msg) - raise NetworkServiceDescriptorError(msg) - self._ref_count -= 1 - @property def msg(self): """ Return the message associated with this NetworkServiceDescriptor""" @@ -2821,11 +2784,6 @@ class NsdDtsHandler(object): if fref.is_field_deleted(): # Delete an NSD record self._log.debug("Deleting NSD with id %s", msg.id) - if self._nsm.nsd_in_use(msg.id): - self._log.debug("Cannot delete NSD in use - %s", msg.id) - err = "Cannot delete an NSD in use - %s" % msg.id - raise NetworkServiceDescriptorRefCountExists(err) - yield from delete_nsd_libs(msg.id) self._nsm.delete_nsd(msg.id) else: @@ -3382,6 +3340,8 @@ class NsrDtsHandler(object): raise NsrVlUpdateError("NS config NSD should have atleast 1 VLD defined") if msg.has_field("scaling_group"): + self._log.debug("ScaleMsg %s", msg) + self._log.debug("NSSCALINGSTATE %s", nsr.state) if nsr.state != NetworkServiceRecordState.RUNNING: raise ScalingOperationError("Unable to perform scaling action when NS is not in running state") @@ -3553,56 +3513,6 @@ class VnfrDtsHandler(object): flags=(rwdts.Flag.SUBSCRIBER),) -class NsdRefCountDtsHandler(object): - """ The NSD Ref Count DTS handler """ - XPATH = "D,/nsr:ns-instance-opdata/rw-nsr:nsd-ref-count" - - def __init__(self, dts, log, loop, nsm): - self._dts = dts - self._log = log - self._loop = loop - self._nsm = nsm - - self._regh = None - - @property - def regh(self): - """ Return registration handle """ - return self._regh - - @property - def nsm(self): - """ Return the NS manager instance """ - return self._nsm - - @asyncio.coroutine - def register(self): - """ Register for NSD ref count read from dts """ - - @asyncio.coroutine - def on_prepare(xact_info, action, ks_path, msg): - """ prepare callback from dts """ - xpath = ks_path.to_xpath(RwNsrYang.get_schema()) - - if action == rwdts.QueryAction.READ: - schema = RwNsrYang.YangData_Nsr_NsInstanceOpdata_NsdRefCount.schema() - path_entry = schema.keyspec_to_entry(ks_path) - nsd_list = yield from self._nsm.get_nsd_refcount(path_entry.key00.nsd_id_ref) - for xpath, msg in nsd_list: - xact_info.respond_xpath(rsp_code=rwdts.XactRspCode.MORE, - xpath=xpath, - msg=msg) - xact_info.respond_xpath(rwdts.XactRspCode.ACK) - else: - raise NetworkServiceRecordError("Not supported operation %s" % action) - - hdl = rift.tasklets.DTS.RegistrationHandler(on_prepare=on_prepare,) - with self._dts.group_create() as group: - self._regh = group.register(xpath=NsdRefCountDtsHandler.XPATH, - handler=hdl, - flags=rwdts.Flag.PUBLISHER,) - - class NsManager(object): """ The Network Service Manager class""" def __init__(self, dts, log, loop, @@ -3630,7 +3540,7 @@ class NsManager(object): self._conf_url = "https://{ip}:{port}/api/config". \ format(ip=self._ip, port=self._rport) - + self._nsrs = {} self._nsds = {} self._vnfds = {} @@ -3644,7 +3554,6 @@ class NsManager(object): self._vnfd_dts_handler = VnfdDtsHandler(dts, log, loop, self) self._dts_handlers = [self._nsd_dts_handler, VnfrDtsHandler(dts, log, loop, self), - NsdRefCountDtsHandler(dts, log, loop, self), NsrDtsHandler(dts, log, loop, self), ScalingRpcHandler(log, dts, loop, self.scale_rpc_callback), NsrRpcDtsHandler(dts,log,loop,self), @@ -3770,7 +3679,7 @@ class NsManager(object): return None scaling_group_info = json.loads(output.text) return scaling_group_info - + def config_scaling_group_information(scaling_group_info): data_str = json.dumps(scaling_group_info) self.log.debug("scaling group Info %s", data_str) @@ -3778,12 +3687,12 @@ class NsManager(object): scale_out_url = "{url}/ns-instance-config/nsr/{nsr_id}".format(url=self._conf_url, nsr_id=msg.nsr_id_ref) response = requests.put(scale_out_url, data=data_str, verify=False, auth=(self._user, self._password), headers=self._headers) response.raise_for_status() - + def scale_out(): scaling_group_info = get_scaling_group_information() if scaling_group_info is None: return - + scaling_group_present = False if "scaling-group" in scaling_group_info["nsr:nsr"]: scaling_group_array = scaling_group_info["nsr:nsr"]["scaling-group"] @@ -3795,12 +3704,12 @@ class NsManager(object): for instance in scaling_group['instance']: if instance["id"] == int(msg.instance_id): self.log.error("scaling group with instance id %s exists for scale out", msg.instance_id) - return - scaling_group["instance"].append({"id": int(msg.instance_id)}) - + return + scaling_group["instance"].append({"id": int(msg.instance_id)}) + if not scaling_group_present: scaling_group_info["nsr:nsr"]["scaling-group"] = [{"scaling-group-name-ref": msg.scaling_group_name_ref, "instance": [{"id": msg.instance_id}]}] - + config_scaling_group_information(scaling_group_info) return @@ -3808,7 +3717,7 @@ class NsManager(object): scaling_group_info = get_scaling_group_information() if scaling_group_info is None: return - + scaling_group_array = scaling_group_info["nsr:nsr"]["scaling-group"] scaling_group_present = False instance_id_present = False @@ -3817,20 +3726,20 @@ class NsManager(object): scaling_group_present = True if 'instance' in scaling_group: instance_array = scaling_group["instance"]; - for index in range(len(instance_array)): + for index in range(len(instance_array)): if instance_array[index]["id"] == int(msg.instance_id): instance_array.pop(index) instance_id_present = True break - + if not scaling_group_present: self.log.error("Scaling group %s doesnot exists for scale in", msg.scaling_group_name_ref) return - + if not instance_id_present: self.log.error("Instance id %s doesnot exists for scale in", msg.instance_id) return - + config_scaling_group_information(scaling_group_info) return @@ -3863,15 +3772,15 @@ class NsManager(object): def create_nsr(self, nsr_msg, key_pairs=None,restart_mode=False): """ Create an NSR instance """ + self._log.debug("NSRMSG %s", nsr_msg) if nsr_msg.id in self._nsrs: msg = "NSR id %s already exists" % nsr_msg.id self._log.error(msg) raise NetworkServiceRecordError(msg) - self._log.info("Create NetworkServiceRecord nsr id %s from nsd_id %s, restart mode %s", + self._log.info("Create NetworkServiceRecord nsr id %s from nsd_id %s", nsr_msg.id, - nsr_msg.nsd.id, - restart_mode) + nsr_msg.nsd.id) nsm_plugin = self._ro_plugin_selector.ro_plugin sdn_account_name = self._cloud_account_handler.get_cloud_account_sdn_name(nsr_msg.cloud_account) @@ -3933,13 +3842,6 @@ class NsManager(object): """ Delete VNFR with the passed id""" del self._vnfrs[vnfr_id] - def get_nsd_ref(self, nsd_id): - """ Get network service descriptor for the passed nsd_id - with a reference""" - nsd = self.get_nsd(nsd_id) - nsd.ref() - return nsd - @asyncio.coroutine def get_nsr_config(self, nsd_id): xpath = "C,/nsr:ns-instance-config" @@ -3955,33 +3857,6 @@ class NsManager(object): return None - @asyncio.coroutine - def nsd_unref_by_nsr_id(self, nsr_id): - """ Unref the network service descriptor based on NSR id """ - self._log.debug("NSR Unref called for Nsr Id:%s", nsr_id) - if nsr_id in self._nsrs: - nsr = self._nsrs[nsr_id] - - try: - nsd = self.get_nsd(nsr.nsd_id) - self._log.debug("Releasing ref on NSD %s held by NSR %s - Curr %d", - nsd.id, nsr.id, nsd.ref_count) - nsd.unref() - except NetworkServiceDescriptorError: - # We store a copy of NSD in NSR and the NSD in nsd-catalog - # could be deleted - pass - - else: - self._log.error("Cannot find NSR with id %s", nsr_id) - raise NetworkServiceDescriptorUnrefError("No NSR with id" % nsr_id) - - @asyncio.coroutine - def nsd_unref(self, nsd_id): - """ Unref the network service descriptor associated with the id """ - nsd = self.get_nsd(nsd_id) - nsd.unref() - def get_nsd(self, nsd_id): """ Get network service descriptor for the passed nsd_id""" if nsd_id not in self._nsds: @@ -4024,16 +3899,6 @@ class NsManager(object): if nsd_id not in self._nsds: self._log.debug("Delete NSD failed - cannot find nsd-id %s", nsd_id) raise NetworkServiceDescriptorNotFound("Cannot find %s", nsd_id) - - if nsd_id not in self._nsds: - self._log.debug("Cannot delete NSD id %s reference exists %s", - nsd_id, - self._nsds[nsd_id].ref_count) - raise NetworkServiceDescriptorRefCountExists( - "Cannot delete :%s, ref_count:%s", - nsd_id, - self._nsds[nsd_id].ref_count) - del self._nsds[nsd_id] def get_vnfd_config(self, xact): @@ -4086,13 +3951,6 @@ class NsManager(object): del self._vnfds[vnfd_id] - def nsd_in_use(self, nsd_id): - """ Is the NSD with the passed id in use """ - self._log.debug("Is this NSD in use - msg:%s", nsd_id) - if nsd_id in self._nsds: - return self._nsds[nsd_id].in_use() - return False - @asyncio.coroutine def publish_nsr(self, xact, path, msg): """ Publish a NSR """ @@ -4115,29 +3973,6 @@ class NsManager(object): raise VirtualNetworkFunctionRecordError(err) self._vnfrs[vnfr_id].is_ready() - @asyncio.coroutine - def get_nsd_refcount(self, nsd_id): - """ Get the nsd_list from this NSM""" - - def nsd_refcount_xpath(nsd_id): - """ xpath for ref count entry """ - return (NsdRefCountDtsHandler.XPATH + - "[rw-nsr:nsd-id-ref = '{}']").format(nsd_id) - - nsd_list = [] - if nsd_id is None or nsd_id == "": - for nsd in self._nsds.values(): - nsd_msg = RwNsrYang.YangData_Nsr_NsInstanceOpdata_NsdRefCount() - nsd_msg.nsd_id_ref = nsd.id - nsd_msg.instance_ref_count = nsd.ref_count - nsd_list.append((nsd_refcount_xpath(nsd.id), nsd_msg)) - elif nsd_id in self._nsds: - nsd_msg = RwNsrYang.YangData_Nsr_NsInstanceOpdata_NsdRefCount() - nsd_msg.nsd_id_ref = self._nsds[nsd_id].id - nsd_msg.instance_ref_count = self._nsds[nsd_id].ref_count - nsd_list.append((nsd_refcount_xpath(nsd_id), nsd_msg)) - - return nsd_list @asyncio.coroutine def terminate_ns(self, nsr_id, xact): @@ -4152,9 +3987,6 @@ class NsManager(object): except Exception as e: self.log.exception("Failed to terminate NSR[id=%s]", nsr_id) - # Unref the NSD - yield from self.nsd_unref_by_nsr_id(nsr_id) - # Unpublish the NSR record self._log.debug("Unpublishing the network service %s", nsr_id) yield from self._nsrs[nsr_id].unpublish(xact)