Skip to content

Commit 3dea334

Browse files
Merge pull request #4751 from zenoss/feature/ZEN-35547
Add support for setting production states on components.
2 parents e402ecd + 1226c78 commit 3dea334

File tree

6 files changed

+48
-24
lines changed

6 files changed

+48
-24
lines changed

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)