AiC and REST login
[myslice.git] / sla / wsag_helper.py
1 import re\r
2 import datetime\r
3 from myslice.settings import logger\r
4 \r
5 from slaclient import wsag_model\r
6 from slaclient.wsag_model import AgreementStatus\r
7 from slaclient.wsag_model import Violation\r
8 \r
9 \r
10 VIOLATED = AgreementStatus.StatusEnum.VIOLATED\r
11 NON_DETERMINED = AgreementStatus.StatusEnum.NON_DETERMINED\r
12 FULFILLED = AgreementStatus.StatusEnum.FULFILLED\r
13 \r
14 \r
15 def get_violations_bydate(violations):\r
16     """Returns a list of violations per date, from a list of violations\r
17 \r
18     :param violations list[Violation]:\r
19     :rtype: list\r
20     """\r
21     d = dict()\r
22     for v in violations:\r
23         assert isinstance(v, Violation)\r
24         date = v.datetime.date()\r
25         if not date in d:\r
26             d[date] = []\r
27         d[date].append(v)\r
28 \r
29     result = [(key, d[key]) for key in sorted(d.keys(), reverse=True)]\r
30     return result\r
31 \r
32 \r
33 class AgreementAnnotator(object):\r
34     """Annotates an agreement with the following attributes:\r
35 \r
36     agreement.guaranteestatus\r
37     agreement.statusclass\r
38     agreement.guaranteeterms[*].status\r
39     agreement.guaranteeterms[*].statusclass\r
40     agreement.guaranteeterms[*].nviolations\r
41     agreement.guaranteeterms[*].servicelevelobjetive.bounds\r
42 \r
43     """\r
44     def __init__(self):\r
45         pass\r
46 \r
47     @staticmethod\r
48     def _get_statusclass(status):\r
49         if status is None or status == "" or status == NON_DETERMINED:\r
50             return "non-determined"\r
51         return "success" if status == FULFILLED else "error"\r
52 \r
53     @staticmethod\r
54     def _parse_bounds(servicelevel):\r
55 #         pattern = re.compile(".*BETWEEN *[(]?(.*), *([^)]*)[)]?")\r
56         pattern = re.compile(".*GT *([+-]?\\d*\\.\\d+)(?![-+0-9\\.])")\r
57         constraint = eval(servicelevel.strip(' \t\n\r'))\r
58         m = pattern.match(constraint['constraint'])\r
59         return m.groups()\r
60 \r
61     def _annotate_guaranteeterm(self, term, violations):\r
62         #\r
63         # Annotate a guarantee term: set bounds and violations\r
64         #\r
65         level = term.servicelevelobjective.customservicelevel\r
66         bounds = AgreementAnnotator._parse_bounds(level)\r
67         term.servicelevelobjective.bounds = bounds\r
68 \r
69         #\r
70         # set status attribute if not set before\r
71         #\r
72         if not hasattr(term, 'status'):\r
73             term.status = wsag_model.AgreementStatus.StatusEnum.NON_DETERMINED\r
74         #\r
75         # TODO: efficiency\r
76         #\r
77         n = 0\r
78         for violation in violations:\r
79             if violation.metric_name == term.servicelevelobjective.kpiname:\r
80                 n += 1\r
81         term.nviolations = n\r
82 \r
83     def _annotate_guaranteeterm_by_status(\r
84             self, agreement, termstatus, violations):\r
85         #\r
86         # Annotate a guarantee term: it is different from the previous\r
87         # one in that this takes the status into account.\r
88         #\r
89         name = termstatus.name\r
90         status = termstatus.status\r
91 \r
92         term = agreement.guaranteeterms[name]\r
93         term.status = status\r
94         term.statusclass = AgreementAnnotator._get_statusclass(status)\r
95         self._annotate_guaranteeterm(term, violations)\r
96 \r
97     def annotate_agreement(self, agreement, status=None, violations=()):\r
98 \r
99         """Annotate an agreement with certain values needed in the templates\r
100 \r
101         :param wsag_model.Agreement agreement: agreement to annotate\r
102         :param wsag_model.AgreementStatus status: status of the agreement.\r
103         :param violations: list of agreement's violations\r
104             (wsag_model.Violation[])\r
105         """\r
106         a = agreement\r
107 \r
108         if status is not None:\r
109             a.guaranteestatus = status.guaranteestatus\r
110             a.statusclass = self._get_statusclass(status.guaranteestatus)\r
111             for termstatus in status.guaranteeterms:\r
112                 self._annotate_guaranteeterm_by_status(\r
113                     agreement, termstatus, violations)\r
114         else:\r
115             a.guaranteestatus = NON_DETERMINED\r
116             for termname, term in agreement.guaranteeterms.items():\r
117                 self._annotate_guaranteeterm(term, violations)\r