Skip to content

Commit 1226c78

Browse files
author
Jason Peacock
committed
Add support for setting production states on components.
The existing APIs for setting production state on devices were extended to accept components as well. Events on components are tagged with the component's production state if its value is less than the device's production state. ZEN-35547
1 parent e402ecd commit 1226c78

6 files changed

Lines changed: 48 additions & 24 deletions

File tree

src/Products/ZenEvents/events2/processing.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -657,21 +657,16 @@ def _selectByTypeId(self, typeid, element, sub_element):
657657

658658
def _applyDeviceToEventContext(self, device, eventContext):
659659
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-
)
660+
deviceOrgs = self._getOrgs(device, eventContext, self.DEVICE_TAGGERS)
666661
self._addDeviceContext(eventContext, device)
667662
self._addDeviceOrganizers(eventContext, deviceOrgs)
668663

669664
def _applyComponentToEventContext(self, component, eventContext):
670665
eventContext.setComponentObject(component)
671-
672666
componentOrgs = self._getOrgs(
673667
component, eventContext, self.COMPONENT_TAGGERS
674668
)
669+
self._addComponentContext(eventContext, component)
675670
self._addComponentOrganizers(eventContext, componentOrgs)
676671

677672
def _getOrgs(self, entity, eventContext, taggers):
@@ -753,6 +748,21 @@ def _addDeviceOrganizers(self, eventContext, orgs):
753748
asDelimitedList=True,
754749
)
755750

751+
def _addComponentContext(self, eventContext, component):
752+
evtProxy = eventContext.eventProxy
753+
754+
prodState = component.getProductionState()
755+
if prodState < evtProxy.prodState:
756+
log.info(
757+
"setting device %s component %s event from "
758+
"production state %s to %s",
759+
evtProxy.device,
760+
evtProxy.component,
761+
evtProxy.prodState,
762+
prodState,
763+
)
764+
evtProxy.prodState = prodState
765+
756766
def _addComponentOrganizers(self, eventContext, orgs):
757767
evtproxy = eventContext.eventProxy
758768
self._addDeviceOrganizerNames(

src/Products/ZenModel/Device.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1583,7 +1583,6 @@ def setProdState(self, state, maintWindowChange=False, REQUEST=None):
15831583
ret = super(Device, self).setProdState(
15841584
state, maintWindowChange, REQUEST
15851585
)
1586-
self._p_changed = True
15871586
if REQUEST:
15881587
audit(
15891588
"UI.Device.Edit",

src/Products/ZenModel/DeviceResultInt.py

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -68,18 +68,6 @@ def getDeviceClassPath(self):
6868
security.declareProtected("View", "getDeviceClassName")
6969
getDeviceClassName = getDeviceClassPath
7070

71-
security.declareProtected("View", "getProdState")
72-
73-
def getProdState(self):
74-
"""Get the production state of the device associated with
75-
this interface"""
76-
d = self.device()
77-
if d:
78-
# since this method is used as a case-insensitive index
79-
# always return a string
80-
return str(self.convertProdState(d.getProductionState()))
81-
return "None"
82-
8371
security.declareProtected("View", "getDeviceStatus")
8472

8573
def getDeviceStatus(self):

src/Products/ZenModel/ManagedEntity.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,16 @@ def getProductionStateString(self):
121121
"""
122122
return str(self.convertProdState(self.getProductionState()))
123123

124+
security.declareProtected("View", "getProdState")
125+
126+
def getProdState(self):
127+
"""
128+
Return the name of the current production state of this entity.
129+
130+
@rtype: str
131+
"""
132+
return str(self.convertProdState(self.getProductionState()))
133+
124134
security.declareProtected(ZEN_CHANGE_DEVICE_PRODSTATE, "setProdState")
125135

126136
def setProdState(self, state, maintWindowChange=False, REQUEST=None):
@@ -145,6 +155,8 @@ def setProdState(self, state, maintWindowChange=False, REQUEST=None):
145155
# maintenance window.
146156
self.setPreMWProductionState(self.getProductionState())
147157

158+
self._p_changed = True
159+
148160
if REQUEST:
149161
IMessageSender(self).sendToBrowser(
150162
"Production State Set",

src/Products/Zuul/facades/tests/test_devicefacade.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from zope.interface.verify import verifyClass
1414

1515
from Products import Zuul
16+
from Products.ZenModel.HardDisk import manage_addHardDisk
1617
from Products.ZenModel.Location import manage_addLocation
1718
from Products.Zuul.catalog.events import IndexingEvent
1819
from Products.Zuul.catalog.interfaces import IModelCatalogTool
@@ -289,7 +290,7 @@ def test_deviceSearchAndSortByProdState(self):
289290
self.assertEquals(device.getProductionState(), 1000)
290291
self.assertEquals(device.getPerformanceServer().id, "localhost")
291292

292-
def test_setProductionState(self):
293+
def test_setProductionStateOnDevices(self):
293294
dev = self.dmd.Devices.createInstance("dev")
294295
dev2 = self.dmd.Devices.createInstance("dev2")
295296

@@ -303,6 +304,19 @@ def test_setProductionState(self):
303304
self.assertEqual(dev.getProductionState(), 500)
304305
self.assertEqual(dev2.getProductionState(), 500)
305306

307+
def test_setProductionStateOnComponents(self):
308+
dev = self.dmd.Devices.createInstance("dev")
309+
manage_addHardDisk(dev.hw.harddisks, "df0")
310+
df0 = dev.hw.harddisks._getOb("df0")
311+
312+
self.assertEqual(dev.getProductionState(), 1000)
313+
self.assertEqual(df0.getProductionState(), 1000)
314+
315+
self.facade.setProductionState((df0.getPrimaryUrlPath(),), 500)
316+
317+
self.assertEqual(dev.getProductionState(), 1000)
318+
self.assertEqual(df0.getProductionState(), 500)
319+
306320

307321
def test_suite():
308322
return unittest.TestSuite((unittest.makeSuite(DeviceFacadeTest),))

src/Products/Zuul/routers/device.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
from Products import Zuul
2828
from Products.ZenMessaging.audit import audit
2929
from Products.ZenModel.Device import Device
30+
from Products.ZenModel.ManagedEntity import ManagedEntity
3031
from Products.ZenModel.ZenossSecurity import (
3132
ZEN_ADMIN_DEVICE,
3233
ZEN_CHANGE_DEVICE_PRODSTATE,
@@ -1034,10 +1035,10 @@ def setProductionState(
10341035
oldStates = {}
10351036
uids = (uids,) if isinstance(uids, six.string_types) else uids
10361037
for uid in uids:
1037-
device = facade._getObject(uid)
1038-
if isinstance(device, Device):
1038+
entity = facade._getObject(uid)
1039+
if isinstance(entity, ManagedEntity):
10391040
oldStates[uid] = self.context.convertProdState(
1040-
device.getProductionState()
1041+
entity.getProductionState()
10411042
)
10421043

10431044
prodStateName = self.context.convertProdState(prodState)

0 commit comments

Comments
 (0)