Example #1
0
    def run(self, errors, error_level):

        errors = json.loads(errors, encoding="utf-8")
        if "name" not in errors:
            raise Exception(
                "Error: Instance name not provided in errors. Can not continue!"
            )

        instance = errors["name"]
        vtm = Vtm(self.config, self.logger, instance)
        bsd = Bsd(self.config, self.logger)
        status = bsd.get_status(instance)[0]

        nodes = errors["traffic_health"]["failed_nodes"]
        failedPools = {
            pool: [node["node"] for node in nodes for pool in node["pools"]]
            for node in nodes for pool in node["pools"]
        }

        for pool in failedPools.keys():
            nodes = vtm.get_pool_nodes(pool)
            if set(nodes["active"]).issubset(failedPools[pool]):
                self.logger.debug("Pool Dead")
                for vs in status["traffic_health"]["virtual_servers"]:
                    if vs["pool"] == pool:
                        self.logger.debug(
                            "Putting VS: {} into maintenance.".format(
                                vs["name"]))
                        vtm.enable_maintenance(vs["name"], "maintenance")
            else:
                self.logger.debug("Pool not dead")
    def run(self, errors, error_level):

        errors = json.loads(errors, encoding="utf-8")
        if "name" not in errors:
            raise Exception("Error: Instance name not provided in errors. Can not continue!")

        instance = errors["name"]
        vtm = Vtm(self.config, self.logger, instance)
        bsd = Bsd(self.config, self.logger)
        status = bsd.getStatus(instance)[0]

        nodes = errors["traffic_health"]["failed_nodes"]
        failedPools = {
            pool: [node["node"] for node in nodes for pool in node["pools"]] for node in nodes for pool in node["pools"]
        }

        for pool in failedPools.keys():
            nodes = vtm.getPoolNodes(pool)
            if set(nodes["active"]).issubset(failedPools[pool]):
                self.logger.debug("Pool Dead")
                for vs in status["traffic_health"]["virtual_servers"]:
                    if vs["pool"] == pool:
                        self.logger.debug("Putting VS: {} into maintenance.".format(vs["name"]))
                        vtm.enableMaintenance(vs["name"], "maintenance")
            else:
                self.logger.debug("Pool not dead")
Example #3
0
    def run(self, vtm, stringify):

        bsd = Bsd(self.config, self.logger)
        result = bsd.getStatus(vtm, stringify)
        return result
    def run(self, vtm, bw):

        bsd = Bsd(self.config, self.logger)
        bsd.setBandwidth(vtm, bw)
class brcdSdSensor(PollingSensor):
    def __init__(self, sensor_service, config=None, poll_interval=5):
        super(brcdSdSensor, self).__init__(sensor_service=sensor_service,
                                           config=config,
                                           poll_interval=poll_interval)
        self._logger = self.sensor_service.get_logger(
            name=self.__class__.__name__)
        self._stop = False
        self._bsd = None

    def setup(self):
        self._bsd = Bsd(self._config, self._logger)
        self._last_errors = None

    def poll(self):
        try:
            errors = self._bsd.get_errors()
            last_errors = self._get_last_errors()
            self._set_last_errors(errors)
            self._process_changes(errors, last_errors)
            if last_errors and not errors:
                payload = {
                    "status": "all_clear",
                    "errors": "ALL CLEAR",
                    "error_level": "na"
                }
                self.sensor_service.dispatch(trigger="vadc.bsd_failure_event",
                                             payload=payload)
        except Exception as e:
            payload = {
                "status":
                "sensor_fail",
                "errors":
                "BSD Sensor: {}: {}".format(self._config["brcd_sd_host"], e),
                "error_level":
                "na"
            }
            self.sensor_service.dispatch(trigger="vadc.bsd_failure_event",
                                         payload=payload)

    def _process_changes(self, errors, last_errors):
        for instance in errors:
            if "traffic_health" in errors[instance]:
                error_level = errors[instance]["traffic_health"]["error_level"]
            else:
                error_level = "unknown"
            if instance in last_errors:
                if errors[instance] != last_errors[instance]:
                    # This has changed
                    payload = {
                        "status": "updated",
                        "error_level": error_level,
                        "errors": json.dumps(errors[instance],
                                             encoding="utf-8")
                    }
                    self.sensor_service.dispatch(
                        trigger="vadc.bsd_failure_event", payload=payload)
                else:
                    # No change
                    pass
            else:
                # New error
                payload = {
                    "status": "new",
                    "error_level": error_level,
                    "errors": json.dumps(errors[instance], encoding="utf-8")
                }
                self.sensor_service.dispatch(trigger="vadc.bsd_failure_event",
                                             payload=payload)
        for instance in last_errors:
            if instance not in errors:
                # Recovered
                payload = {
                    "status": "resolved",
                    "error_level": "ok",
                    "errors": json.dumps(last_errors[instance],
                                         encoding="utf-8")
                }
                self.sensor_service.dispatch(trigger="vadc.bsd_failure_event",
                                             payload=payload)

    def _get_last_errors(self):
        if not self._last_errors and hasattr(self._sensor_service,
                                             'get_value'):
            last_errors = self._sensor_service.get_value(name='last_errors')
            if last_errors is not None:
                self._last_errors = json.loads(last_errors, encoding="utf-8")
            else:
                self._last_errors = {}
        return self._last_errors

    def _set_last_errors(self, last_errors):
        self._last_errors = last_errors

        if hasattr(self._sensor_service, 'set_value'):
            self._sensor_service.set_value(name='last_errors',
                                           value=json.dumps(last_errors,
                                                            encoding="utf-8"))

    def cleanup(self):
        # This is called when the st2 system goes down. You can perform cleanup operations like
        # closing the connections to external system here.
        pass

    def add_trigger(self, trigger):
        # This method is called when trigger is created
        pass

    def update_trigger(self, trigger):
        # This method is called when trigger is updated
        pass

    def remove_trigger(self, trigger):
        # This method is called when trigger is deleted
        pass
Example #6
0
    def run(self, vtm, stringify):

        bsd = Bsd(self.config, self.logger)
        result = bsd.get_bandwidth(vtm, stringify)
        return (True, result)
Example #7
0
    def run(self, vtm, password, address, bw, fp):

        bsd = Bsd(self.config, self.logger)
        result = bsd.addVtm(vtm, password, address, bw, fp)
        return result
Example #8
0
    def run(self, vtm):

        bsd = Bsd(self.config, self.logger)
        result = bsd.del_vtm(vtm)
        return (True, result)
Example #9
0
    def run(self, vtm):

        bsd = Bsd(self.config, self.logger)
        result = bsd.delVtm(vtm)
        return result
Example #10
0
 def run(self, stringify):
     bsd = Bsd(self.config, self.logger)
     result = bsd.get_errors(stringify)
     return (True, result)
Example #11
0
 def run(self, vtms, cluster):
     bsd = Bsd(self.config, self.logger)
     result = bsd.get_active_vtm(vtms, cluster)
     if result is None:
         return (False, result)
     return (True, result)
Example #12
0
class brcdBwSensor(PollingSensor):

    def __init__(self, sensor_service, config=None, poll_interval=5):
        super(brcdBwSensor, self).__init__(sensor_service=sensor_service, config=config,
            poll_interval=poll_interval)
        self._logger = self.sensor_service.get_logger(name=self.__class__.__name__)
        self._stop = False
        self._bw_tracker = None
        self._bsd = None
        self._manage = None
        self._minimum = 10
        self._headroom = 10
        self._roundup = 10
        self._track = 10
        self._warn = 10

    def setup(self):
        self._bsd = Bsd(self._config, self._logger)
        self._bw_tracker = None

    def poll(self):
        self._get_configs()
        bandwidth = self._bsd.getBandwidth()
        bw_tracker = self._get_bw_tracker()
        if self._manage is not None:
            self._manage_bandwidth(bw_tracker, bandwidth)
        else:
            bw_tracker = {}
        self._monitor_bandwidth(bandwidth)
        self._set_bw_tracker(bw_tracker)

    def _get_configs(self):
        self._logger.debug(self._config)
        if "brcd_bw_minimum" in self._config and self._config["brcd_bw_minimum"] is not None:
            self._minimum = int(self._config["brcd_bw_minimum"])
        if "brcd_bw_roundup" in self._config and self._config["brcd_bw_roundup"] is not None:
            self._roundup = int(self._config["brcd_bw_roundup"])
        if "brcd_bw_headroom" in self._config and self._config["brcd_bw_headroom"] is not None:
            self._headroom = int(self._config["brcd_bw_headroom"])
        if "brcd_bw_track" in self._config and self._config["brcd_bw_track"] is not None:
            self._track = int(self._config["brcd_bw_track"])
        if "brcd_bw_warn" in self._config and self._config["brcd_bw_warn"] is not None:
            self._warn = int(self._config["brcd_bw_warn"])
        if "brcd_bw_manage" in self._config and self._config["brcd_bw_manage"] is not None:
            manage = str(self._config["brcd_bw_manage"])
            if manage.lower() == "all":
                self._manage = ["__ALL__"]
            else:
                self._manage = manage.split(',')

    def _manage_bandwidth(self, bw_tracker, bandwidth):
        for instance in bandwidth.keys():
            instData = bandwidth[instance]
            tag = instData["tag"]
            if "__ALL__" in self._manage or instance in self._manage or tag in self._manage:
                tracked = instData["current"]
                tracked += self._roundup - (tracked % self._roundup)
                if tracked < self._minimum:
                    tracked = self._minimum
                if instance not in bw_tracker:
                    bw_tracker[instance] = instData
                    bw_tracker[instance]["tracking"] = []
                while len(bw_tracker[instance]["tracking"]) >= self._track:
                    bw_tracker[instance]["tracking"].pop(0)
                bw_tracker[instance]["tracking"].append(tracked)
                bw_tracker[instance]["current"] = instData["current"]
                bw_tracker[instance]["peak"] = instData["peak"]
                self._issue_update(instance, tracked, instData, bw_tracker, bandwidth)
            else:
                if instance in bw_tracker:
                    bw_tracker.pop(instance)

    def _issue_update(self, instance, tracked, instData, bw_tracker, bandwidth):
            average = sum(bw_tracker[instance]["tracking"]) / len(bw_tracker[instance]["tracking"])
            assign = average if tracked < average else tracked
            assign = int(assign + self._headroom)
            if assign != instData["assigned"]:
                bw_tracker[instance]["assigned"] = assign
                payload = {"action": "update", "instance": instance, "tag": instData["tag"],
                    "bandwidth": assign, "current": instData["current"], "average": average}
                self.sensor_service.dispatch(trigger="vadc.bsd_bandwidth_event", payload=payload)

    def _monitor_bandwidth(self, bandwidth):
        for instance in bandwidth.keys():
            instData = bandwidth[instance]
            tag = instData["tag"]
            if instData["assigned"] - instData["current"] - self._warn <= 0:
                payload = {"action": "alert", "instance": instance, "tag": tag,
                    "bandwidth": instData["assigned"], "current": instData["current"]}
                self.sensor_service.dispatch(trigger="vadc.bsd_bandwidth_event", payload=payload)

    def _get_bw_tracker(self):
        if not self._bw_tracker and hasattr(self._sensor_service, 'get_value'):
            bw_tracker = self._sensor_service.get_value(name='bw_tracker')
            if bw_tracker is not None:
                self._bw_tracker = json.loads(bw_tracker, encoding="utf-8")
            else:
                self._bw_tracker = {}
        return self._bw_tracker

    def _set_bw_tracker(self, bw_tracker):
        self._bw_tracker = bw_tracker

        if hasattr(self._sensor_service, 'set_value'):
            self._sensor_service.set_value(name='bw_tracker', value=json.dumps(bw_tracker,
                encoding="utf-8"))

    def cleanup(self):
        # This is called when the st2 system goes down. You can perform cleanup operations like
        # closing the connections to external system here.
        pass

    def add_trigger(self, trigger):
        # This method is called when trigger is created
        pass

    def update_trigger(self, trigger):
        # This method is called when trigger is updated
        pass

    def remove_trigger(self, trigger):
        # This method is called when trigger is deleted
        pass
Example #13
0
 def setup(self):
     self._bsd = Bsd(self._config, self._logger)
     self._bw_tracker = None
Example #14
0
class brcdSdSensor(PollingSensor):

    def __init__(self, sensor_service, config=None, poll_interval=5):
        super(brcdSdSensor, self).__init__(sensor_service=sensor_service, config=config,
            poll_interval=poll_interval)
        self._logger = self.sensor_service.get_logger(name=self.__class__.__name__)
        self._stop = False
        self._bsd = None

    def setup(self):
        self._bsd = Bsd(self._config, self._logger)
        self._last_errors = None

    def poll(self):
        try:
            errors = self._bsd.getErrors()
            last_errors = self._get_last_errors()
            self._set_last_errors(errors)
            self._process_changes(errors, last_errors)
            if last_errors and not errors:
                payload = {"status": "all_clear", "errors": "ALL CLEAR", "error_level": "na"}
                self.sensor_service.dispatch(trigger="vadc.bsd_failure_event", payload=payload)
        except Exception as e:
            payload = {"status": "sensor_fail", "errors": "BSD Sensor: {}: {}".format(
                self._config["brcd_sd_host"], e), "error_level": "na"}
            self.sensor_service.dispatch(trigger="vadc.bsd_failure_event", payload=payload)

    def _process_changes(self, errors, last_errors):
        for instance in errors:
            if "traffic_health" in errors[instance]:
                error_level = errors[instance]["traffic_health"]["error_level"]
            else:
                error_level = "unknown"
            if instance in last_errors:
                if errors[instance] != last_errors[instance]:
                    # This has changed
                    payload = {"status": "updated", "error_level": error_level, "errors":
                        json.dumps(errors[instance], encoding="utf-8")}
                    self.sensor_service.dispatch(trigger="vadc.bsd_failure_event", payload=payload)
                else:
                    # No change
                    pass
            else:
                # New error
                payload = {"status": "new", "error_level": error_level, "errors":
                    json.dumps(errors[instance], encoding="utf-8")}
                self.sensor_service.dispatch(trigger="vadc.bsd_failure_event", payload=payload)
        for instance in last_errors:
            if instance not in errors:
                # Recovered
                payload = {"status": "resolved", "error_level": "ok", "errors":
                    json.dumps(last_errors[instance], encoding="utf-8")}
                self.sensor_service.dispatch(trigger="vadc.bsd_failure_event", payload=payload)

    def _get_last_errors(self):
        if not self._last_errors and hasattr(self._sensor_service, 'get_value'):
            last_errors = self._sensor_service.get_value(name='last_errors')
            if last_errors is not None:
                self._last_errors = json.loads(last_errors, encoding="utf-8")
            else:
                self._last_errors = {}
        return self._last_errors

    def _set_last_errors(self, last_errors):
        self._last_errors = last_errors

        if hasattr(self._sensor_service, 'set_value'):
            self._sensor_service.set_value(name='last_errors', value=json.dumps(last_errors,
                encoding="utf-8"))

    def cleanup(self):
        # This is called when the st2 system goes down. You can perform cleanup operations like
        # closing the connections to external system here.
        pass

    def add_trigger(self, trigger):
        # This method is called when trigger is created
        pass

    def update_trigger(self, trigger):
        # This method is called when trigger is updated
        pass

    def remove_trigger(self, trigger):
        # This method is called when trigger is deleted
        pass
Example #15
0
 def setup(self):
     self._bsd = Bsd(self._config, self._logger)
     self._last_errors = None
Example #16
0
 def setup(self):
     self._bsd = Bsd(self._config, self._logger)
     self._bw_tracker = None
Example #17
0
class brcdBwSensor(PollingSensor):
    def __init__(self, sensor_service, config=None, poll_interval=5):
        super(brcdBwSensor, self).__init__(sensor_service=sensor_service,
                                           config=config,
                                           poll_interval=poll_interval)
        self._logger = self.sensor_service.get_logger(
            name=self.__class__.__name__)
        self._stop = False
        self._bw_tracker = None
        self._bsd = None
        self._manage = None
        self._minimum = 10
        self._headroom = 10
        self._roundup = 10
        self._track = 10
        self._warn = 10

    def setup(self):
        self._bsd = Bsd(self._config, self._logger)
        self._bw_tracker = None

    def poll(self):
        self._get_configs()
        bandwidth = self._bsd.get_bandwidth()
        bw_tracker = self._get_bw_tracker()
        if self._manage is not None:
            self._manage_bandwidth(bw_tracker, bandwidth)
        else:
            bw_tracker = {}
        self._monitor_bandwidth(bandwidth)
        self._set_bw_tracker(bw_tracker)

    def _get_configs(self):
        self._logger.debug(self._config)
        if "brcd_bw_minimum" in self._config and self._config[
                "brcd_bw_minimum"] is not None:
            self._minimum = int(self._config["brcd_bw_minimum"])
        if "brcd_bw_roundup" in self._config and self._config[
                "brcd_bw_roundup"] is not None:
            self._roundup = int(self._config["brcd_bw_roundup"])
        if "brcd_bw_headroom" in self._config and self._config[
                "brcd_bw_headroom"] is not None:
            self._headroom = int(self._config["brcd_bw_headroom"])
        if "brcd_bw_track" in self._config and self._config[
                "brcd_bw_track"] is not None:
            self._track = int(self._config["brcd_bw_track"])
        if "brcd_bw_warn" in self._config and self._config[
                "brcd_bw_warn"] is not None:
            self._warn = int(self._config["brcd_bw_warn"])
        if "brcd_bw_manage" in self._config and self._config[
                "brcd_bw_manage"] is not None:
            manage = str(self._config["brcd_bw_manage"])
            if manage.lower() == "all":
                self._manage = ["__ALL__"]
            else:
                self._manage = manage.split(',')

    def _manage_bandwidth(self, bw_tracker, bandwidth):
        for instance in bandwidth.keys():
            instData = bandwidth[instance]
            tag = instData["tag"]
            if "__ALL__" in self._manage or instance in self._manage or tag in self._manage:
                tracked = instData["current"]
                tracked += self._roundup - (tracked % self._roundup)
                if tracked < self._minimum:
                    tracked = self._minimum
                if instance not in bw_tracker:
                    bw_tracker[instance] = instData
                    bw_tracker[instance]["tracking"] = []
                while len(bw_tracker[instance]["tracking"]) >= self._track:
                    bw_tracker[instance]["tracking"].pop(0)
                bw_tracker[instance]["tracking"].append(tracked)
                bw_tracker[instance]["current"] = instData["current"]
                bw_tracker[instance]["peak"] = instData["peak"]
                self._issue_update(instance, tracked, instData, bw_tracker,
                                   bandwidth)
            else:
                if instance in bw_tracker:
                    bw_tracker.pop(instance)
        for instance in bw_tracker.keys():
            if instance not in bandwidth:
                bw_tracker.pop(instance)

    def _issue_update(self, instance, tracked, instData, bw_tracker,
                      bandwidth):
        average = sum(bw_tracker[instance]["tracking"]) / len(
            bw_tracker[instance]["tracking"])
        assign = average if tracked < average else tracked
        assign = int(assign + self._headroom)
        if assign != instData["assigned"]:
            bw_tracker[instance]["assigned"] = assign
            payload = {
                "action": "update",
                "instance": instance,
                "tag": instData["tag"],
                "bandwidth": assign,
                "current": instData["current"],
                "average": average
            }
            self.sensor_service.dispatch(trigger="vadc.bsd_bandwidth_event",
                                         payload=payload)

    def _monitor_bandwidth(self, bandwidth):
        for instance in bandwidth.keys():
            instData = bandwidth[instance]
            tag = instData["tag"]
            if instData["assigned"] - instData["current"] - self._warn <= 0:
                payload = {
                    "action": "alert",
                    "instance": instance,
                    "tag": tag,
                    "bandwidth": instData["assigned"],
                    "current": instData["current"]
                }
                self.sensor_service.dispatch(
                    trigger="vadc.bsd_bandwidth_event", payload=payload)

    def _get_bw_tracker(self):
        if not self._bw_tracker and hasattr(self._sensor_service, 'get_value'):
            bw_tracker = self._sensor_service.get_value(name='bw_tracker')
            if bw_tracker is not None:
                self._bw_tracker = json.loads(bw_tracker, encoding="utf-8")
            else:
                self._bw_tracker = {}
        return self._bw_tracker

    def _set_bw_tracker(self, bw_tracker):
        self._bw_tracker = bw_tracker

        if hasattr(self._sensor_service, 'set_value'):
            self._sensor_service.set_value(name='bw_tracker',
                                           value=json.dumps(bw_tracker,
                                                            encoding="utf-8"))

    def cleanup(self):
        # This is called when the st2 system goes down. You can perform cleanup operations like
        # closing the connections to external system here.
        pass

    def add_trigger(self, trigger):
        # This method is called when trigger is created
        pass

    def update_trigger(self, trigger):
        # This method is called when trigger is updated
        pass

    def remove_trigger(self, trigger):
        # This method is called when trigger is deleted
        pass
Example #18
0
    def run(self, full, deleted, stringify):

        bsd = Bsd(self.config, self.logger)
        result = bsd.listVtms(full, deleted, stringify)
        return result
Example #19
0
    def run(self, vtm, bw):

        bsd = Bsd(self.config, self.logger)
        bsd.set_bandwidth(vtm, bw)
Example #20
0
 def run(self, stringify):
     bsd = Bsd(self.config, self.logger)
     result = bsd.getErrors(stringify)
     return result
Example #21
0
    def run(self, full, deleted, stringify):

        bsd = Bsd(self.config, self.logger)
        result = bsd.list_vtms(full, deleted, stringify)
        return (True, result)
    def run(self, vtm, stringify):

        bsd = Bsd(self.config, self.logger)
        result = bsd.getStatus(vtm, stringify)
        return result
Example #23
0
 def setup(self):
     self._bsd = Bsd(self._config, self._logger)
     self._last_errors = None
    def run(self, vtm, stringify):

        bsd = Bsd(self.config, self.logger)
        result = bsd.getBandwidth(vtm, stringify)
        return result
    def run(self, vtm, password, address, bw, fp):

        bsd = Bsd(self.config, self.logger)
        result = bsd.addVtm(vtm, password, address, bw, fp)
        return result
Example #26
0
    def run(self, vtm):

        bsd = Bsd(self.config, self.logger)
        result = bsd.delVtm(vtm)
        return result