class EventCompatInfo(object): """ Takes a zep event and maps it to the format that the UI expects """ implements(IMarshallable) def __init__(self, dmd, event_summary): self._dmd = dmd self._event_summary = event_summary self._eventOccurrence = event_summary['occurrence'][0] self._eventActor = self._eventOccurrence['actor'] self._eventDetails = self._findDetails(self._eventOccurrence) self._catalog = IModelCatalogTool(dmd) self._manager = IGUIDManager(dmd) @property def id(self): return self._event_summary['uuid'] @property def evid(self): return self.id @property def dedupid(self): return self._eventOccurrence.get('fingerprint') @property def eventState(self): return EventStatus.getPrettyName(self._event_summary['status']) @property def severity(self): return self._eventOccurrence['severity'] @property def component(self): return { 'text': self._eventActor.get('element_sub_title'), 'uid': self._getPathFromUuid(self._eventActor.get('element_sub_uuid')), 'url': self._uuidUrl(self._eventActor.get('element_sub_uuid')), 'uuid': self._eventActor.get('element_sub_uuid') } @property def eventClass(self): eventClass = self._eventOccurrence['event_class'] return {"text": eventClass, "uid": "/zport/dmd/Events%s" % eventClass} @property def summary(self): return self._eventOccurrence['summary'] @property def firstTime(self): return self._event_summary['first_seen_time'] / 1000.0 @property def lastTime(self): return self._event_summary['last_seen_time'] / 1000.0 @property def count(self): return self._event_summary['count'] @property def stateChange(self): return self._event_summary['status_change_time'] / 1000.0 @property def eventClassKey(self): return self._eventOccurrence.get('event_class_key') @property def eventGroup(self): return self._eventOccurrence.get('event_group') @property def eventKey(self): return self._eventOccurrence.get('event_key') @property def agent(self): return self._eventOccurrence.get('agent') @property def monitor(self): return self._eventOccurrence.get('monitor') @property def ownerid(self): return self._event_summary.get('current_user_name') @property def facility(self): return self._eventOccurrence.get('syslog_facility') @property def priority(self): return self._eventOccurrence.get('syslog_priority') @property def eventClassMapping(self): return self._lookupEventClassMapping( self._eventOccurrence.get('event_class_mapping_uuid')) @property def clearid(self): return self._event_summary.get('cleared_by_event_uuid') @property def ntevid(self): return self._eventOccurrence.get('nt_event_code') @property def ipAddress(self): return self._eventDetails.get('zenoss.device.ip_address', '') @property def message(self): return self._eventOccurrence.get('message', '') @property def Location(self): return self._lookupDetailPath( '/zport/dmd/Locations', self._eventDetails.get(EventProxy.DEVICE_LOCATION_DETAIL_KEY)) @property def DeviceGroups(self): return self._lookupDetailPath( '/zport/dmd/Groups', self._eventDetails.get(EventProxy.DEVICE_GROUPS_DETAIL_KEY)) @property def Systems(self): return self._lookupDetailPath( '/zport/dmd/Systems', self._eventDetails.get(EventProxy.DEVICE_SYSTEMS_DETAIL_KEY)) @property def DeviceClass(self): return self._lookupDetailPath( '/zport/dmd/Devices', self._eventDetails.get(EventProxy.DEVICE_CLASS_DETAIL_KEY)) @property def device(self): device_url = self._get_device_url(self._eventDetails) if device_url is None: return dict(text=self._eventActor.get('element_title'), uid=self._getPathFromUuid( self._eventActor.get('element_uuid')), url=self._uuidUrl( self._eventActor.get('element_uuid')), uuid=self._eventActor.get('element_uuid')) else: return dict(text=self._eventActor.get('element_title'), url=device_url) @property def prodState(self): prodState = self._singleDetail( self._eventDetails.get('zenoss.device.production_state')) if prodState is not None: return self._dmd.convertProdState(prodState) @property def DevicePriority(self): DevicePriority = self._singleDetail( self._eventDetails.get('zenoss.device.priority')) if DevicePriority is not None: return self._dmd.convertPriority(DevicePriority) @property def details(self): return self._eventDetails def __getattr__(self, name): if self._eventDetails.get(name): return self._eventDetails.get(name) raise AttributeError(name) def _uuidUrl(self, uuid): if uuid: return '/zport/dmd/goto?guid=%s' % uuid def _get_device_url(self, eventDetails): url_and_path = [ self._singleDetail(eventDetails.get(k)) for k in ('zenoss.device.url', 'zenoss.device.path') ] if len(url_and_path) != 2: return None url, path = url_and_path try: self._dmd.findChild(path) except Exception: return None return url def _singleDetail(self, value): """ A convenience method for fetching a single detail from a property which correlates to a repeated field on the protobuf. """ if isinstance(value, (tuple, list, set)) and value: return value[0] def _findDetails(self, event): """ Event details are created as a dictionary like the following: detail = { 'name': 'zenoss.foo.bar', 'value': 'baz' } This method maps these detail items to a flat dictionary to facilitate looking up details by key easier. @rtype dict """ details = {} if 'details' in event: for d in event['details']: details[d['name']] = d.get('value', ()) return details def _lookupDetailPath(self, prefix, values): if not values: return () paths = [] for value in values: paths.append({'uid': prefix + value, 'name': value}) return paths def _getPathFromUuid(self, uuid): if uuid: path = self._manager.getPath(uuid) if path: return urllib.unquote(path) def _lookupEventClassMapping(self, mappingUuid): if not mappingUuid: return "" return { 'uuid': mappingUuid, 'name': self._getNameFromUuid(mappingUuid) } def _getNameFromUuid(self, uuid): """ Given a uuid this returns the objects name from the catalog, it does not wake the object up """ if uuid: path = self._getPathFromUuid(uuid) if path: brain = self._catalog.getBrain(path, fields="name") if brain: return brain.name
class EventCompatInfo(object): """ Takes a zep event and maps it to the format that the UI expects """ implements(IMarshallable) def __init__(self, dmd, event_summary): self._dmd = dmd self._event_summary = event_summary self._eventOccurrence = event_summary['occurrence'][0] self._eventActor = self._eventOccurrence['actor'] self._eventDetails = self._findDetails(self._eventOccurrence) self._catalog = IModelCatalogTool(dmd) self._manager = IGUIDManager(dmd) @property def id(self): return self._event_summary['uuid'] @property def evid(self): return self.id @property def dedupid(self): return self._eventOccurrence.get('fingerprint') @property def eventState(self): return EventStatus.getPrettyName(self._event_summary['status']) @property def severity(self): return self._eventOccurrence['severity'] @property def component(self): return { 'text': self._eventActor.get('element_sub_title'), 'uid': self._getPathFromUuid( self._eventActor.get('element_sub_uuid') ), 'url': self._uuidUrl(self._eventActor.get('element_sub_uuid')), 'uuid': self._eventActor.get('element_sub_uuid') } @property def eventClass(self): eventClass = self._eventOccurrence['event_class'] return {"text": eventClass, "uid": "/zport/dmd/Events%s" % eventClass} @property def summary(self): return self._eventOccurrence['summary'] @property def firstTime(self): return self._event_summary['first_seen_time'] / 1000.0 @property def lastTime(self): return self._event_summary['last_seen_time'] / 1000.0 @property def count(self): return self._event_summary['count'] @property def stateChange(self): return self._event_summary['status_change_time'] / 1000.0 @property def eventClassKey(self): return self._eventOccurrence.get('event_class_key') @property def eventGroup(self): return self._eventOccurrence.get('event_group') @property def eventKey(self): return self._eventOccurrence.get('event_key') @property def agent(self): return self._eventOccurrence.get('agent') @property def monitor(self): return self._eventOccurrence.get('monitor') @property def ownerid(self): return self._event_summary.get('current_user_name') @property def facility(self): return self._eventOccurrence.get('syslog_facility') @property def priority(self): return self._eventOccurrence.get('syslog_priority') @property def eventClassMapping(self): return self._lookupEventClassMapping( self._eventOccurrence.get('event_class_mapping_uuid') ) @property def clearid(self): return self._event_summary.get('cleared_by_event_uuid') @property def ntevid(self): return self._eventOccurrence.get('nt_event_code') @property def ipAddress(self): return self._eventDetails.get('zenoss.device.ip_address', '') @property def message(self): return self._eventOccurrence.get('message', '') @property def Location(self): return self._lookupDetailPath( '/zport/dmd/Locations', self._eventDetails.get(EventProxy.DEVICE_LOCATION_DETAIL_KEY) ) @property def DeviceGroups(self): return self._lookupDetailPath( '/zport/dmd/Groups', self._eventDetails.get(EventProxy.DEVICE_GROUPS_DETAIL_KEY) ) @property def Systems(self): return self._lookupDetailPath( '/zport/dmd/Systems', self._eventDetails.get(EventProxy.DEVICE_SYSTEMS_DETAIL_KEY) ) @property def DeviceClass(self): return self._lookupDetailPath( '/zport/dmd/Devices', self._eventDetails.get(EventProxy.DEVICE_CLASS_DETAIL_KEY) ) @property def device(self): device_url = self._get_device_url(self._eventDetails) if device_url is None: return dict( text=self._eventActor.get('element_title'), uid=self._getPathFromUuid( self._eventActor.get('element_uuid') ), url=self._uuidUrl(self._eventActor.get('element_uuid')), uuid=self._eventActor.get('element_uuid') ) else: return dict(text=self._eventActor.get('element_title'), url=device_url) @property def prodState(self): prodState = self._singleDetail( self._eventDetails.get('zenoss.device.production_state') ) if prodState is not None: return self._dmd.convertProdState(prodState) @property def DevicePriority(self): DevicePriority = self._singleDetail( self._eventDetails.get('zenoss.device.priority') ) if DevicePriority is not None: return self._dmd.convertPriority(DevicePriority) @property def details(self): return self._eventDetails def __getattr__(self, name): if self._eventDetails.get(name): return self._eventDetails.get(name) raise AttributeError(name) def _uuidUrl(self, uuid): if uuid: return '/zport/dmd/goto?guid=%s' % uuid def _get_device_url(self, eventDetails): url_and_path = [ self._singleDetail(eventDetails.get(k)) for k in ('zenoss.device.url', 'zenoss.device.path') ] if len(url_and_path) != 2: return None url, path = url_and_path try: self._dmd.findChild(path) except: return None return url def _singleDetail(self, value): """ A convenience method for fetching a single detail from a property which correlates to a repeated field on the protobuf. """ if isinstance(value, (tuple, list, set)) and value: return value[0] def _findDetails(self, event): """ Event details are created as a dictionary like the following: detail = { 'name': 'zenoss.foo.bar', 'value': 'baz' } This method maps these detail items to a flat dictionary to facilitate looking up details by key easier. @rtype dict """ details = {} if 'details' in event: for d in event['details']: details[d['name']] = d.get('value', ()) return details def _lookupDetailPath(self, prefix, values): if not values: return () paths = [] for value in values: paths.append({'uid': prefix + value, 'name': value}) return paths def _getPathFromUuid(self, uuid): if uuid: path = self._manager.getPath(uuid) if path: return urllib.unquote(path) def _lookupEventClassMapping(self, mappingUuid): if not mappingUuid: return "" return { 'uuid': mappingUuid, 'name': self._getNameFromUuid(mappingUuid) } def _getNameFromUuid(self, uuid): """ Given a uuid this returns the objects name from the catalog, it does not wake the object up """ if uuid: path = self._getPathFromUuid(uuid) if path: brain = self._catalog.getBrain(path, fields="name") if brain: return brain.name