Completed
Push — master ( 982099...38894f )
by
unknown
02:39
created

brcdSdSensor._process_changes()   C

Complexity

Conditions 7

Size

Total Lines 26

Duplication

Lines 0
Ratio 0 %

Importance

Changes 3
Bugs 0 Features 0
Metric Value
cc 7
dl 0
loc 26
rs 5.5
c 3
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
            last_errors = self._sensor_service.get_value(name='last_errors')
64
            if last_errors is not None:
65
                self._last_errors = json.loads(last_errors, encoding="utf-8")
66
            else:
67
                self._last_errors = {}
68
        return self._last_errors
69
70
    def _set_last_errors(self, last_errors):
71
        self._last_errors = last_errors
72
73
        if hasattr(self._sensor_service, 'set_value'):
74
            self._sensor_service.set_value(name='last_errors', value=json.dumps(last_errors,
75
                encoding="utf-8"))
76
77
    def cleanup(self):
78
        # This is called when the st2 system goes down. You can perform cleanup operations like
79
        # closing the connections to external system here.
80
        pass
81
82
    def add_trigger(self, trigger):
83
        # This method is called when trigger is created
84
        pass
85
86
    def update_trigger(self, trigger):
87
        # This method is called when trigger is updated
88
        pass
89
90
    def remove_trigger(self, trigger):
91
        # This method is called when trigger is deleted
92
        pass
93