Skip to content

Commit e402ecd

Browse files
Fix event processing bug and fix migrate scripts that fail in a CI setting.
1 parent d91e645 commit e402ecd

28 files changed

+205
-226
lines changed

ci/makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ $(DOCKERFILE): $(DOCKERFILE).in prodbin/packages.txt ../VERSION
8787
- > $@
8888

8989
$(SOLR_FILES): $(COMPONENTS_DIR)/zenoss.modelindex-0-py2-none-any.whl | $(SOLR_FILES_DIR)
90-
@unzip -j $< $(addprefix $(SOLR_TAR_PATH)/,$(notdir $@)) -d $(SOLR_FILES_DIR)/
90+
@unzip -j -o $< $(addprefix $(SOLR_TAR_PATH)/,$(notdir $@)) -d $(SOLR_FILES_DIR)/
9191

9292
mariadb/initdb.d/zodb.sql.gz: | mariadb/initdb.d
9393
mariadb/initdb.d/zodb.sql.gz: ../src/Products/ZenModel/data/zodb.sql.gz

src/Products/ZenEvents/events2/processing.py

Lines changed: 115 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,115 @@ class AddDeviceContextAndTagsPipe(EventProcessorPipe):
584584
),
585585
}
586586

587+
def __call__(self, eventContext):
588+
actor = eventContext.event.actor
589+
590+
# Set identifier and title based on resolved object
591+
element = self._findTypeIdAndElement(
592+
actor,
593+
EventField.Actor.ELEMENT_TYPE_ID,
594+
EventField.Actor.ELEMENT_UUID,
595+
)
596+
self._applyElementToActor(actor, element.value)
597+
598+
sub_element = self._findTypeIdAndElement(
599+
actor,
600+
EventField.Actor.ELEMENT_SUB_TYPE_ID,
601+
EventField.Actor.ELEMENT_SUB_UUID,
602+
)
603+
self._applySubElementToActor(actor, sub_element.value)
604+
605+
device = eventContext.deviceObject
606+
if device is None:
607+
device = self._selectByTypeId(DEVICE, element, sub_element)
608+
if device is not None:
609+
self._applyDeviceToEventContext(device, eventContext)
610+
611+
component = eventContext.componentObject
612+
if component is None:
613+
component = self._selectByTypeId(COMPONENT, element, sub_element)
614+
if component is not None:
615+
self._applyComponentToEventContext(component, eventContext)
616+
617+
return eventContext
618+
619+
def _findTypeIdAndElement(self, actor, type_id_field, uuid_field):
620+
type_id = None
621+
element = None
622+
if actor.HasField(type_id_field):
623+
type_id = getattr(actor, type_id_field)
624+
if actor.HasField(uuid_field):
625+
element = self._manager.getElementByUuid(
626+
getattr(actor, uuid_field)
627+
)
628+
return _Element(type_id, element)
629+
630+
def _applyElementToActor(self, actor, element):
631+
if not element:
632+
return
633+
actor.element_identifier = element.id
634+
elementTitle = element.titleOrId()
635+
if elementTitle != actor.element_identifier:
636+
try:
637+
actor.element_title = elementTitle
638+
except ValueError:
639+
actor.element_title = elementTitle.decode("utf8")
640+
641+
def _applySubElementToActor(self, actor, sub_element):
642+
if not sub_element:
643+
return
644+
actor.element_sub_identifier = sub_element.id
645+
subElementTitle = sub_element.titleOrId()
646+
if subElementTitle != actor.element_sub_identifier:
647+
try:
648+
actor.element_sub_title = subElementTitle
649+
except ValueError:
650+
actor.element_sub_title = subElementTitle.decode("utf8")
651+
652+
def _selectByTypeId(self, typeid, element, sub_element):
653+
if element.typeid == typeid:
654+
return element.value
655+
elif sub_element.typeid == typeid:
656+
return sub_element.value
657+
658+
def _applyDeviceToEventContext(self, device, eventContext):
659+
eventContext.setDeviceObject(device)
660+
661+
# find all organizers for this device, and add their uuids to
662+
# the appropriate event tags
663+
deviceOrgs = self._getOrgs(
664+
device, eventContext, self.DEVICE_TAGGERS
665+
)
666+
self._addDeviceContext(eventContext, device)
667+
self._addDeviceOrganizers(eventContext, deviceOrgs)
668+
669+
def _applyComponentToEventContext(self, component, eventContext):
670+
eventContext.setComponentObject(component)
671+
672+
componentOrgs = self._getOrgs(
673+
component, eventContext, self.COMPONENT_TAGGERS
674+
)
675+
self._addComponentOrganizers(eventContext, componentOrgs)
676+
677+
def _getOrgs(self, entity, eventContext, taggers):
678+
orgs = {}
679+
for tagType, info in six.iteritems(taggers):
680+
getOrgFunc, orgTypeName = info
681+
objList = getOrgFunc(entity)
682+
if objList:
683+
if not isinstance(objList, list):
684+
objList = [objList]
685+
uuids = set(
686+
sum(
687+
(self._manager.getUuidsOfPath(obj) for obj in objList),
688+
[],
689+
)
690+
)
691+
if uuids:
692+
eventContext.eventProxy.tags.addAll(tagType, uuids)
693+
orgs[orgTypeName] = [obj.getOrganizerName() for obj in objList]
694+
return orgs
695+
587696
def _addDeviceOrganizerNames(
588697
self,
589698
orgs,
@@ -653,132 +762,13 @@ def _addComponentOrganizers(self, eventContext, orgs):
653762
EventProxy.COMPONENT_GROUP_DETAIL_KEY,
654763
)
655764

656-
def _findTypeIdAndElement(self, actor, type_id_field, uuid_field):
657-
type_id = None
658-
element = None
659-
if actor.HasField(type_id_field):
660-
type_id = getattr(actor, type_id_field)
661-
if actor.HasField(uuid_field):
662-
element = self._manager.getElementByUuid(
663-
getattr(actor, uuid_field)
664-
)
665-
return type_id, element
666-
667-
def __call__(self, eventContext):
668-
actor = eventContext.event.actor
669-
670-
# Set identifier and title based on resolved object
671-
element_type_id, element = self._findTypeIdAndElement(
672-
eventContext.event.actor,
673-
EventField.Actor.ELEMENT_TYPE_ID,
674-
EventField.Actor.ELEMENT_UUID,
675-
)
676-
if element:
677-
actor.element_identifier = element.id
678-
elementTitle = element.titleOrId()
679-
if elementTitle != actor.element_identifier:
680-
try:
681-
actor.element_title = elementTitle
682-
except ValueError:
683-
actor.element_title = elementTitle.decode("utf8")
684-
685-
sub_element_type_id, sub_element = self._findTypeIdAndElement(
686-
eventContext.event.actor,
687-
EventField.Actor.ELEMENT_SUB_TYPE_ID,
688-
EventField.Actor.ELEMENT_SUB_UUID,
689-
)
690-
if sub_element:
691-
actor.element_sub_identifier = sub_element.id
692-
subElementTitle = sub_element.titleOrId()
693-
if subElementTitle != actor.element_sub_identifier:
694-
try:
695-
actor.element_sub_title = subElementTitle
696-
except ValueError:
697-
actor.element_sub_title = subElementTitle.decode("utf8")
698-
699-
self._applyDeviceToContext(
700-
eventContext,
701-
element_type_id,
702-
element,
703-
sub_element_type_id,
704-
sub_element,
705-
)
706-
707-
self._applyComponentToContext(
708-
eventContext,
709-
element_type_id,
710-
element,
711-
sub_element_type_id,
712-
sub_element,
713-
)
714765

715-
return eventContext
766+
class _Element(object):
767+
__slots__ = ("typeid", "value")
716768

717-
def _applyDeviceToContext(
718-
self, ctx, element_type_id, element, sub_element_type_id, sub_element
719-
):
720-
if ctx.deviceObject is not None:
721-
return
722-
723-
if element_type_id == DEVICE:
724-
device = element
725-
elif sub_element_type_id == DEVICE:
726-
device = sub_element
727-
else:
728-
return
729-
730-
ctx.setDeviceObject(device)
731-
732-
orgs, tags = self._getOrgsAndTags(
733-
ctx, self.DEVICE_TAGGERS, device
734-
)
735-
self._addDeviceContext(ctx, device)
736-
self._addDeviceOrganizers(ctx, orgs)
737-
for tagType, uuids in six.iteritems(tags):
738-
ctx.eventProxy.tags.addAll(tagType, uuids)
739-
740-
def _applyComponentToContext(
741-
self, ctx, element_type_id, element, sub_element_type_id, sub_element
742-
):
743-
if ctx.componentObject is not None:
744-
return
745-
746-
if element_type_id == COMPONENT:
747-
component = element
748-
elif sub_element_type_id == COMPONENT:
749-
component = sub_element
750-
else:
751-
return
752-
753-
ctx.setComponentObject(component)
754-
755-
orgs, tags = self._getOrgsAndTags(
756-
ctx, self.COMPONENT_TAGGERS, component
757-
)
758-
self._addComponentOrganizers(ctx, orgs)
759-
for tagType, uuids in six.iteritems(tags):
760-
ctx.eventProxy.tags.addAll(tagType, uuids)
761-
762-
def _getOrgsAndTags(self, ctx, taggers, entity):
763-
orgs = {}
764-
tags = {}
765-
for tagType, orgProcessValues in six.iteritems(taggers):
766-
getOrgFunc, orgTypeName = orgProcessValues
767-
objList = getOrgFunc(entity)
768-
if not objList:
769-
continue
770-
if not isinstance(objList, list):
771-
objList = [objList]
772-
orgs[orgTypeName] = [obj.getOrganizerName() for obj in objList]
773-
uuids = set(
774-
sum(
775-
(self._manager.getUuidsOfPath(obj) for obj in objList),
776-
[],
777-
)
778-
)
779-
if uuids:
780-
tags[tagType] = uuids
781-
return orgs, tags
769+
def __init__(self, typeid, value):
770+
self.typeid = typeid
771+
self.value = value
782772

783773

784774
class UpdateDeviceContextAndTagsPipe(AddDeviceContextAndTagsPipe):
@@ -799,7 +789,7 @@ def __call__(self, eventContext):
799789
)
800790
# clear out device-specific tags and details
801791
deviceOrganizerTypeNames = [
802-
typename for function, typename in self.DEVICE_TAGGERS.values()
792+
typename for _, typename in self.DEVICE_TAGGERS.values()
803793
]
804794
deviceDetailNames = set(
805795
deviceOrganizerTypeNames

src/Products/ZenModel/migrate/addMariaDBLogFilters.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,12 @@
88
##############################################################################
99

1010
import os
11-
import re
1211
import logging
13-
log = logging.getLogger("zen.migrate")
14-
15-
from Products.ZenUtils.Utils import zenPath
1612

1713
import Migrate
1814
import servicemigration as sm
19-
from servicemigration import InstanceLimits
2015

16+
log = logging.getLogger("zen.migrate")
2117
sm.require("1.1.10")
2218

2319

@@ -54,8 +50,9 @@ def cutover(self, dmd):
5450
else:
5551
log.info("No updates necessary for the logfilter for {0}".format(logConfig.logType))
5652

57-
filename = 'Products/ZenModel/migrate/data/%s-6.0.0.conf' % filterName
58-
with open(zenPath(filename)) as filterFile:
53+
datafile = 'data/%s-6.0.0.conf' % filterName
54+
filename = os.path.join(os.path.dirname(__file__), datafile)
55+
with open(filename) as filterFile:
5956
try:
6057
filterDef = filterFile.read()
6158
except Exception as e:

src/Products/ZenModel/migrate/addNginxLogFilters.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,9 @@ def cutover(self, dmd):
5454
else:
5555
log.info("No updates necesary for the logfilter for %s", servicePath)
5656

57-
filename = 'Products/ZenModel/migrate/data/%s-6.0.0.conf' % filterName
58-
with open(zenPath(filename)) as filterFile:
57+
datafile = 'data/%s-6.0.0.conf' % filterName
58+
filename = os.path.join(os.path.dirname(__file__), datafile)
59+
with open(filename) as filterFile:
5960
try:
6061
filterDef = filterFile.read()
6162
except Exception as e:

src/Products/ZenModel/migrate/addRabbitMQLogFilters.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import Migrate
1212
import os
1313
import servicemigration as sm
14-
from Products.ZenUtils.Utils import zenPath
1514

1615
log = logging.getLogger("zen.migrate")
1716
sm.require("1.1.10")
@@ -36,8 +35,9 @@ def cutover(self, dmd):
3635
return
3736

3837
filterName = "rabbitmq"
39-
filename = 'Products/ZenModel/migrate/data/%s-6.0.0.conf' % filterName
40-
with open(zenPath(filename)) as filterFile:
38+
datafile = 'data/%s-6.0.0.conf' % filterName
39+
filename = os.path.join(os.path.dirname(__file__), datafile)
40+
with open(filename) as filterFile:
4141
try:
4242
filterDef = filterFile.read()
4343
except Exception as e:

src/Products/ZenModel/migrate/addRedisLogFilters.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,12 @@
99
##############################################################################
1010

1111
import os
12-
import re
1312
import logging
14-
log = logging.getLogger("zen.migrate")
15-
16-
from Products.ZenUtils.Utils import zenPath
1713

1814
import Migrate
1915
import servicemigration as sm
20-
from servicemigration import InstanceLimits
2116

17+
log = logging.getLogger("zen.migrate")
2218
sm.require("1.1.10")
2319

2420

@@ -57,8 +53,9 @@ def cutover(self, dmd):
5753
else:
5854
log.info("No updates necesary for the logfilter for %s", servicePath)
5955

60-
filename = 'Products/ZenModel/migrate/data/%s-6.0.0.conf' % filterName
61-
with open(zenPath(filename)) as filterFile:
56+
datafile = 'data/%s-6.0.0.conf' % filterName
57+
filename = os.path.join(os.path.dirname(__file__), datafile)
58+
with open(filename) as filterFile:
6259
try:
6360
filterDef = filterFile.read()
6461
except Exception as e:

src/Products/ZenModel/migrate/addSolrService.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@
1010
import json
1111
import logging
1212
import os
13-
log = logging.getLogger("zen.migrate")
1413

1514
import Migrate
1615
import servicemigration as sm
17-
sm.require("1.1.11")
1816
from servicemigration import HealthCheck
19-
from Products.ZenUtils.Utils import zenPath
17+
18+
log = logging.getLogger("zen.migrate")
19+
sm.require("1.1.11")
2020

2121
class AddSolrService(Migrate.Step):
2222
"""
@@ -98,8 +98,9 @@ def cutover(self, dmd):
9898
break
9999

100100
filterName = 'solr'
101-
filename = 'Products/ZenModel/migrate/data/%s-6.0.0.conf' % filterName
102-
with open(zenPath(filename)) as filterFile:
101+
datafile = 'data/%s-6.0.0.conf' % filterName
102+
filename = os.path.join(os.path.dirname(__file__), datafile)
103+
with open(filename) as filterFile:
103104
try:
104105
filterDef = filterFile.read()
105106
except Exception as e:

0 commit comments

Comments
 (0)