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")
 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 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)