Completed
Pull Request — master (#583)
by
unknown
10:22 queued 04:17
created

brcdSdSensor._set_last_errors()   A

Complexity

Conditions 2

Size

Total Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
dl 0
loc 6
rs 9.4285
c 1
b 0
f 0
1
from st2reactor.sensor.base import PollingSensor
2
from lib.vadc import Bsd
3
4
import json
5
6
7
class brcdSdSensor(PollingSensor):
8
9
    def __init__(self, sensor_service, config=None, poll_interval=5):
10
        super(brcdSdSensor, self).__init__(sensor_service=sensor_service, config=config,
11
            poll_interval=poll_interval)
12
        self._logger = self.sensor_service.get_logger(name=self.__class__.__name__)
13
        self._stop = False
14
        self._bsd = None
15
16
    def setup(self):
17
        self._bsd = Bsd(self._config, self._logger)
18
        self._last_errors = None
19
20
    def poll(self):
21
        try:
22
            errors = self._bsd.getErrors()
23
            last_errors = self._get_last_errors()
24
            self._set_last_errors(errors)
25
            self._process_changes(errors, last_errors)
26
            if last_errors and not errors:
27
                payload = {"status": "all_clear", "errors": "ALL CLEAR", "error_level": "na"}
28
                self.sensor_service.dispatch(trigger="vadc.bsd_failure_event", payload=payload)
29
        except Exception as e:
30
            payload = {"status": "sensor_fail", "errors": "BSD Sensor: {}: {}".format(
31
                self._config["brcd_sd_host"], e), "error_level": "na"}
32
            self.sensor_service.dispatch(trigger="vadc.bsd_failure_event", payload=payload)
33
34
    def _process_changes(self, errors, last_errors):
35
        for instance in errors:
36
            if "traffic_health" in errors[instance]:
37
                error_level = errors[instance]["traffic_health"]["error_level"]
38
            else:
39
                error_level = "unknown"
40
            if instance in last_errors:
41
                if errors[instance] != last_errors[instance]:
42
                    # This has changed
43
                    payload = {"status": "updated", "error_level": error_level, "errors":
44
                        json.dumps(errors[instance], encoding="utf-8")}
45
                    self.sensor_service.dispatch(trigger="vadc.bsd_failure_event", payload=payload)
46
                else:
47
                    # No change
48
                    pass
49
            else:
50
                # New error
51
                payload = {"status": "new", "error_level": error_level, "errors":
52
                    json.dumps(errors[instance], encoding="utf-8")}
53
                self.sensor_service.dispatch(trigger="vadc.bsd_failure_event", payload=payload)
54
        for instance in last_errors:
55
            if instance not in errors:
56
                # Recovered
57
                payload = {"status": "resolved", "error_level": "ok", "errors":
58
                    json.dumps(last_errors[instance], encoding="utf-8")}
59
                self.sensor_service.dispatch(trigger="vadc.bsd_failure_event", payload=payload)
60
61
    def _get_last_errors(self):
62
        if not self._last_errors and hasattr(self._sensor_service, 'get_value'):
63
            self._last_errors = json.loads(self._sensor_service.get_value(name='last_errors'),
64
                encoding="utf-8")
65
        return self._last_errors
66
67
    def _set_last_errors(self, last_errors):
68
        self._last_errors = last_errors
69
70
        if hasattr(self._sensor_service, 'set_value'):
71
            self._sensor_service.set_value(name='last_errors', value=json.dumps(last_errors,
72
                encoding="utf-8"))
73
74
    def cleanup(self):
75
        # This is called when the st2 system goes down. You can perform cleanup operations like
76
        # closing the connections to external system here.
77
        pass
78
79
    def add_trigger(self, trigger):
80
        # This method is called when trigger is created
81
        pass
82
83
    def update_trigger(self, trigger):
84
        # This method is called when trigger is updated
85
        pass
86
87
    def remove_trigger(self, trigger):
88
        # This method is called when trigger is deleted
89
        pass
90