def _vnc_subscribe_callback(self, oper_info): self._db_resync_done.wait() dependency_tracker = None try: msg = "Notification Message: %s" % (pformat(oper_info)) self.config_log(msg, level=SandeshLevel.SYS_DEBUG) obj_type = oper_info['type'].replace('-', '_') obj_class = DBBaseST.get_obj_type_map().get(obj_type) if obj_class is None: return oper = oper_info['oper'] obj_id = oper_info['uuid'] notify_trace = MessageBusNotifyTrace( request_id=oper_info.get('request_id'), operation=oper, uuid=obj_id) if oper == 'CREATE': obj_dict = oper_info['obj_dict'] obj_fq_name = ':'.join(obj_dict['fq_name']) obj = obj_class.locate(obj_fq_name) if obj is None: self.config_log('%s id %s fq_name %s not found' % (obj_type, obj_id, obj_fq_name), level=SandeshLevel.SYS_INFO) return dependency_tracker = DependencyTracker( DBBaseST.get_obj_type_map(), self._REACTION_MAP) dependency_tracker.evaluate(obj_type, obj) elif oper == 'UPDATE': obj = obj_class.get_by_uuid(obj_id) old_dt = None if obj is not None: old_dt = DependencyTracker(DBBaseST.get_obj_type_map(), self._REACTION_MAP) old_dt.evaluate(obj_type, obj) else: self.config_log('%s id %s not found' % (obj_type, obj_id), level=SandeshLevel.SYS_INFO) return try: obj.update() except NoIdError: self.config_log('%s id %s update caused NoIdError' % (obj_type, obj_id), level=SandeshLevel.SYS_INFO) return dependency_tracker = DependencyTracker( DBBaseST.get_obj_type_map(), self._REACTION_MAP) dependency_tracker.evaluate(obj_type, obj) if old_dt: for resource, ids in old_dt.resources.items(): if resource not in dependency_tracker.resources: dependency_tracker.resources[resource] = ids else: dependency_tracker.resources[resource] = list( set(dependency_tracker.resources[resource]) | set(ids)) elif oper == 'DELETE': obj = obj_class.get_by_uuid(obj_id) if obj is None: return dependency_tracker = DependencyTracker( DBBaseST.get_obj_type_map(), self._REACTION_MAP) dependency_tracker.evaluate(obj_type, obj) obj_class.delete(obj.name) else: # unknown operation self.config_log('Unknown operation %s' % oper, level=SandeshLevel.SYS_ERR) return if obj is None: self.config_log('Error while accessing %s uuid %s' % (obj_type, obj_id)) return notify_trace.fq_name = obj.name if not dependency_tracker: return notify_trace.dependency_tracker_resources = [] for res_type, res_id_list in dependency_tracker.resources.items(): if not res_id_list: continue dtr = DependencyTrackerResource(obj_type=res_type, obj_keys=res_id_list) notify_trace.dependency_tracker_resources.append(dtr) cls = DBBaseST.get_obj_type_map().get(res_type) if cls is None: continue for res_id in res_id_list: res_obj = cls.get(res_id) if res_obj is not None: res_obj.evaluate() for vn_id in dependency_tracker.resources.get( 'virtual_network', []): vn = VirtualNetworkST.get(vn_id) if vn is not None: vn.uve_send() # end for vn_id except Exception as e: string_buf = cStringIO.StringIO() cgitb_hook(file=string_buf, format="text") notify_trace.error = string_buf.getvalue() try: with open(self._args.trace_file, 'a') as err_file: err_file.write(string_buf.getvalue()) except IOError: self.config_log(string_buf.getvalue(), level=SandeshLevel.SYS_ERR) finally: try: notify_trace.trace_msg(name='MessageBusNotifyTraceBuf', sandesh=self._sandesh) except Exception: pass
def add_msgbus_dtr(self, res_type, res_id_list): dtr = DependencyTrackerResource(obj_type=res_type, obj_keys=res_id_list) self.msg_tracer.dependency_tracker_resources.append(dtr)