def __init__(self, dmd, instance): HubService.__init__(self, dmd, instance) self.config = self.dmd.Monitors.Performance._getOb(self.instance) self.procrastinator = Procrastinate(self.pushConfig) self._collectorMap = {} self._notifier = component.getUtility(IBatchNotifier)
class PerformanceConfig(HubService, ThresholdMixin): def __init__(self, dmd, instance): HubService.__init__(self, dmd, instance) self.config = self.dmd.Monitors.Performance._getOb(self.instance) self.procrastinator = Procrastinate(self.pushConfig) self._collectorMap = {} self._notifier = component.getUtility(IBatchNotifier) @translateError def remote_propertyItems(self): return self.config.propertyItems() def notifyAll(self, device): self.procrastinator.doLater(device) def pushConfig(self, device): deferreds = [] cfg = None cur_collector = device.perfServer.getRelatedId() prev_collector = self._collectorMap.get(device.id, None) self._collectorMap[device.id] = cur_collector # Always push config to currently assigned collector. if cur_collector == self.instance: cfg = self.getDeviceConfig(device) # Push a deleteDevice call if the device was previously assigned to # this collector. elif prev_collector and prev_collector == self.instance: cfg = None # Don't do anything if this collector is not, and has not been involved # with the device else: return defer.DeferredList(deferreds) for listener in self.listeners: if cfg is None: deferreds.append(listener.callRemote('deleteDevice', device.id)) else: deferreds.append(self.sendDeviceConfig(listener, cfg)) return defer.DeferredList(deferreds) def getDeviceConfig(self, device): "How to get the config for a device" return None def sendDeviceConfig(self, listener, config): "How to send the config to a device, probably via callRemote" pass @onUpdate(PerformanceConf) def perfConfUpdated(self, object, event): if object.id == self.instance: for listener in self.listeners: listener.callRemote('setPropertyItems', object.propertyItems()) @onUpdate(ZenPack) def zenPackUpdated(self, object, event): for listener in self.listeners: try: listener.callRemote('updateThresholdClasses', self.remote_getThresholdClasses()) except Exception, ex: self.log.warning("Error notifying a listener of new classes")
class PerformanceConfig(HubService, ThresholdMixin): def __init__(self, dmd, instance): HubService.__init__(self, dmd, instance) self.config = self.dmd.Monitors.Performance._getOb(self.instance) self.procrastinator = Procrastinate(self.pushConfig) self._collectorMap = {} self._notifier = component.getUtility(IBatchNotifier) @translateError def remote_propertyItems(self): return self.config.propertyItems() def remote_getDefaultRRDCreateCommand(self, *args, **kwargs): return self.config.getDefaultRRDCreateCommand(*args, **kwargs) def notifyAll(self, device): self.procrastinator.doLater(device) def pushConfig(self, device): deferreds = [] cfg = None cur_collector = device.perfServer.getRelatedId() prev_collector = self._collectorMap.get(device.id, None) self._collectorMap[device.id] = cur_collector # Always push config to currently assigned collector. if cur_collector == self.instance: cfg = self.getDeviceConfig(device) # Push a deleteDevice call if the device was previously assigned to # this collector. elif prev_collector and prev_collector == self.instance: cfg = None # Don't do anything if this collector is not, and has not been involved # with the device else: return defer.DeferredList(deferreds) for listener in self.listeners: if cfg is None: deferreds.append(listener.callRemote('deleteDevice', device.id)) else: deferreds.append(self.sendDeviceConfig(listener, cfg)) return defer.DeferredList(deferreds) def getDeviceConfig(self, device): "How to get the config for a device" return None def sendDeviceConfig(self, listener, config): "How to send the config to a device, probably via callRemote" pass @onUpdate(PerformanceConf) def perfConfUpdated(self, object, event): if object.id == self.instance: for listener in self.listeners: listener.callRemote('setPropertyItems', object.propertyItems()) @onUpdate(ZenPack) def zenPackUpdated(self, object, event): for listener in self.listeners: try: listener.callRemote('updateThresholdClasses', self.remote_getThresholdClasses()) except Exception, ex: self.log.warning("Error notifying a listener of new classes")
class PerformanceConfig(HubService, ThresholdMixin): def __init__(self, dmd, instance): HubService.__init__(self, dmd, instance) self.config = self.dmd.Monitors.Performance._getOb(self.instance) self.procrastinator = Procrastinate(self.pushConfig) self._collectorMap = {} self._notifier = component.getUtility(IBatchNotifier) @translateError def remote_propertyItems(self): return self.config.propertyItems() def notifyAll(self, device): self.procrastinator.doLater(device) def pushConfig(self, device): deferreds = [] cfg = None cur_collector = device.perfServer.getRelatedId() prev_collector = self._collectorMap.get(device.id, None) self._collectorMap[device.id] = cur_collector # Always push config to currently assigned collector. if cur_collector == self.instance: cfg = self.getDeviceConfig(device) # Push a deleteDevice call if the device was previously assigned to # this collector. elif prev_collector and prev_collector == self.instance: cfg = None # Don't do anything if this collector is not, and has not been involved # with the device else: return defer.DeferredList(deferreds) for listener in self.listeners: if cfg is None: deferreds.append(listener.callRemote('deleteDevice', device.id)) else: deferreds.append(self.sendDeviceConfig(listener, cfg)) return defer.DeferredList(deferreds) def getDeviceConfig(self, device): "How to get the config for a device" return None def sendDeviceConfig(self, listener, config): "How to send the config to a device, probably via callRemote" pass @onUpdate(PerformanceConf) def perfConfUpdated(self, object, event): if object.id == self.instance: for listener in self.listeners: listener.callRemote('setPropertyItems', object.propertyItems()) @onUpdate(ZenPack) def zenPackUpdated(self, object, event): for listener in self.listeners: try: listener.callRemote('updateThresholdClasses', self.remote_getThresholdClasses()) except Exception as ex: self.log.warning("Error notifying a listener of new classes") @onUpdate(Device) def deviceUpdated(self, object, event): self.notifyAll(object) @onUpdate(None) # Matches all def notifyAffectedDevices(self, object, event): if isinstance(object, Device): return # something else... mark the devices as out-of-date from Products.ZenModel.DeviceClass import DeviceClass while object: # Don't bother with privately managed objects; the ZenPack # will handle them on its own if is_private(object): return # walk up until you hit an organizer or a device if isinstance(object, DeviceClass): uid = (self.__class__.__name__, self.instance) self._notifier.notify_subdevices(object, uid, self.notifyAll) break if isinstance(object, Device): self.notifyAll(object) break object = aq_parent(object) @onDelete(Device) def deviceDeleted(self, object, event): devid = object.id for listener in self.listeners: listener.callRemote('deleteDevice', devid)