1
2
3
4
5
6
7
8
9
10
11 from itertools import imap
12 from Products.ZenUtils.Time import LocalDateTimeFromMilli
13 from Products.ZenEvents.events2.fields import EventField, EventSummaryField, ZepRawEventField
14 from zenoss.protocols.protobufs.model_pb2 import DEVICE, COMPONENT
15 from zenoss.protocols.protobufs.zep_pb2 import (
16 STATUS_NEW,
17 STATUS_ACKNOWLEDGED,
18 STATUS_SUPPRESSED,
19 STATUS_CLOSED,
20 STATUS_CLEARED,
21 STATUS_DROPPED,
22 STATUS_AGED,
23 SEVERITY_CLEAR,
24 EventTag,
25 EventDetail
26 )
27 from zenoss.protocols.jsonformat import to_dict
28
29 import logging
30 log = logging.getLogger('zen.%s' % __name__)
33 """
34 A proxy for a tag UUID dictionary. Maps org.zenoss.protocols.zep.EventTag
35 to a dictionary.
36 """
37 - def __init__(self, eventProtobufWithTags):
38 self._eventProtobuf = eventProtobufWithTags
39 self._tags = {}
40 self._load()
41
43 for tag in self._eventProtobuf.tags:
44 tag_uuids = self._tags.get(tag.type)
45 if not tag_uuids:
46 self._tags[tag.type] = tag_uuids = set()
47 for tagUuid in tag.uuid:
48 tag_uuids.add(tagUuid)
49
50 - def add(self, type, uuid):
51 tag_uuids = self._tags.get(type)
52 if not tag_uuids:
53 self._tags[type] = tag_uuids = set()
54
55 if not uuid in tag_uuids:
56 tag_uuids.add(uuid)
57
58 event_tag = None
59 for tag in self._eventProtobuf.tags:
60 if tag.type == type:
61 event_tag = tag
62 break
63 else:
64 event_tag = self._eventProtobuf.tags.add()
65 event_tag.type = type
66
67 event_tag.uuid.append(uuid)
68
69 - def addAll(self, type, uuids):
72
75
77
78
79
80 if hasattr(removetype, 'next'):
81 removetype = list(removetype)
82
83
84 if not hasattr(removetype, '__iter__'):
85 removetype = [removetype]
86
87
88 for typ in removetype:
89 if typ in self._tags:
90 del self._tags[typ]
91
92
93
94
95
96
97 saveTags = []
98 for tag in self._eventProtobuf.tags:
99 if tag.type not in removetype:
100 cloned = EventTag()
101 cloned.MergeFrom(tag)
102 saveTags.append(cloned)
103
104 del self._eventProtobuf.tags[:]
105 self._eventProtobuf.tags.extend(saveTags)
106
109 """
110 A proxy for a details dictionary. Maps org.zenoss.protocols.zep.EventDetail
111 to a dictionary.
112 """
114 self.__dict__['_eventProtobuf'] = eventProtobuf
115 self.__dict__['_map'] = {}
116
117 for detail in self._eventProtobuf.details:
118 self._map[detail.name] = detail
119
121 try:
122 return self[name]
123 except KeyError:
124 raise AttributeError(name)
125
128
130 if key in self._map:
131 item = self._map.pop(key)
132
133
134 savedetails = []
135 for det in self._eventProtobuf.details:
136 if det.name != item.name:
137 cloned = EventDetail()
138 cloned.MergeFrom(det)
139 savedetails.append(cloned)
140 self._map[cloned.name] = cloned
141 del self._eventProtobuf.details[:]
142 self._eventProtobuf.details.extend(savedetails)
143
145 item = self._map[key]
146
147
148 if len(item.value) == 0:
149 return None
150 if len(item.value) == 1:
151 return item.value[0]
152 else:
153 raise Exception('Detail %s has more than one value but the old event system expects only one: %s' % (item.name, item.value))
154
171
173 return key in self._map
174
176 return len(self._map)
177
178 - def get(self, key, default=None):
179 try:
180 return self[key]
181 except KeyError:
182 return default
183
184 - def set(self, key, value):
186
187 - def getAll(self, key, default=None):
188 """
189 The normal __getitem__ and get() methods throw an exception for multi-valued details. This one specifically
190 allows multi-valued details.
191 """
192 try:
193 return self._map[key].value
194 except KeyError:
195 return default
196
198 """
199 Conveinence wrapper for protobufs to make sure fields
200 are actually set.
201 """
203 self.__dict__['_pb'] = pb
204
205 - def get(self, key, default=None):
210
211 - def set(self, key, value):
212 setattr(self.__dict__['_pb'], key, value)
213
215 return getattr(self._pb, name)
216
219
221 self._pb.ClearField(name)
222
225
227 """
228 Wraps an org.zenoss.protobufs.zep.Event
229 and makes it look like an old style Event.
230 """
231
232 DEVICE_PRIORITY_DETAIL_KEY = "zenoss.device.priority"
233 PRODUCTION_STATE_DETAIL_KEY = "zenoss.device.production_state"
234 DEVICE_IP_ADDRESS_DETAIL_KEY = 'zenoss.device.ip_address'
235 DEVICE_SYSTEMS_DETAIL_KEY = 'zenoss.device.systems'
236 DEVICE_GROUPS_DETAIL_KEY = 'zenoss.device.groups'
237 DEVICE_LOCATION_DETAIL_KEY = 'zenoss.device.location'
238 DEVICE_CLASS_DETAIL_KEY = 'zenoss.device.device_class'
239
241 self.__dict__['_event'] = ProtobufWrapper(eventProtobuf)
242 self.__dict__['_clearClasses'] = set()
243 self.__dict__['_readOnly'] = {}
244 self.__dict__['details'] = EventDetailProxy(self._event)
245 self.__dict__['_tags'] = EventTagProxy(self._event)
246
250
251 @property
256 @property
259
260 @agent.setter
263
264 @property
267
268 @severity.setter
271
272 @property
274 return self._event.actor.element_identifier
275
276 @device.setter
278 self._event.actor.element_identifier = val
279 self._event.actor.element_type_id = DEVICE
280 self._event.actor.ClearField(EventField.Actor.ELEMENT_UUID)
281
282 @property
284 return self._event.actor.element_sub_identifier
285
286 @component.setter
288 self._event.actor.element_sub_identifier = val
289 self._event.actor.element_sub_type_id = COMPONENT
290 self._event.actor.ClearField(EventField.Actor.ELEMENT_SUB_UUID)
291
292 @property
294 eventClassValue = self._event.get(EventField.EVENT_CLASS)
295 if isinstance( eventClassValue, unicode ):
296 eventClassValue = str( eventClassValue )
297 return eventClassValue
298
299 @eventClass.setter
302
303 @property
308
309 @prodState.setter
312
313 @property
316
317 @summary.setter
320
321 @property
324
325 @message.setter
328
329 @property
332
333 @facility.setter
336
337 @property
340
341 @eventClassKey.setter
344
345 @property
348
349 @dedupid.setter
352
353 @property
356
357 @monitor.setter
360
361 @property
364
365 @ntevid.setter
368
369 @property
374
375 @DevicePriority.setter
378
379 @property
382
383 @priority.setter
386
387 @property
390
391 @property
394
395 @eventKey.setter
398
399 @property
402
403 @eventGroup.setter
406
407 @property
410
411 @ipAddress.setter
414
415 @property
418
419 @DeviceClass.setter
422
423 @property
426
427 @eventState.setter
430
431 @property
434
435 @property
438
439 @property
444
445 @property
450
452 """
453 Adds a read only attribute for transforms to read.
454 These properties are not sent with the event to the queue.
455 """
456 self._readOnly[name] = value
457
459 """
460 Clears a read only attribute so it can be updated.
461 """
462 self._readOnly.pop(name, None)
463
464
466 if name in self._readOnly:
467 return self._readOnly[name]
468
469 try:
470 return self.__dict__['details'][name]
471 except KeyError:
472 raise AttributeError(name)
473
479
481 """
482 Wraps an org.zenoss.protobufs.zep.EventSummary
483
484 and makes it look like an old style Event.
485 """
486 - def __init__(self, eventSummaryProtobuf):
487 self.__dict__['_eventSummary'] = ProtobufWrapper(eventSummaryProtobuf)
488 if not self._eventSummary.occurrence:
489 self._eventSummary.occurrence.add()
490
491 event = self._eventSummary.occurrence[0]
492 EventProxy.__init__(self, event)
493
494 @property
497
498 @property
503
504 @property
507
508 @clearid.setter
511
512 @property
517
518 @property
523
524 @property
527
528 @property
531
532 @ownerid.setter
535
536 @property
539
540 @eventState.setter
543
545 """
546 Wraps an org.zenoss.protobufs.zep.ZepRawEvent and makes it look like
547 an old style Event. It is the proper event proxy to use for transforms
548 since transforms use _action and _clearClasses.
549 """
550 ACTION_HISTORY = 'history'
551 ACTION_DROP = 'drop'
552 ACTION_STATUS = 'status'
553 ACTION_HEARTBEAT = 'heartbeat'
554 ACTION_LOG = 'log'
555 ACTION_ALERT_STATE = 'alert_state'
556 ACTION_DETAIL = 'detail'
557
558 ACTION_STATUS_MAP = {
559 ACTION_HISTORY : STATUS_CLOSED,
560 ACTION_STATUS : STATUS_NEW,
561 ACTION_DROP : STATUS_DROPPED,
562 None : STATUS_NEW,
563 }
564
565 STATUS_ACTION_MAP = {
566 STATUS_NEW : ACTION_STATUS,
567 STATUS_ACKNOWLEDGED : ACTION_STATUS,
568 STATUS_SUPPRESSED : ACTION_STATUS,
569 STATUS_CLOSED : ACTION_HISTORY,
570 STATUS_CLEARED : ACTION_HISTORY,
571 STATUS_DROPPED : ACTION_DROP,
572 STATUS_AGED : ACTION_HISTORY,
573 None : ACTION_STATUS,
574 }
575
586
588 return "{_zepRawEvent:%s}" % str(to_dict(self._zepRawEvent))
589
598
599 @property
601 return list(self._clearClassesSet)
602
603 @_clearClasses.setter
608
609 @property
612
613 @_action.setter
618
619 @property
621 return self.details.get('eventClassMapping', '')
622
623 @eventClassMapping.setter
625
626
627 self.details['eventClassMapping'] = val
628
629
630
631 for typ in (EventProxy, EventSummaryProxy):
632 typ.FIELDS = [name for name in dir(typ) if isinstance(getattr(typ,name), property)]
633