3 from myslice.settings import logger
\r
5 from slaclient import wsag_model
\r
6 from slaclient.wsag_model import AgreementStatus
\r
7 from slaclient.wsag_model import Violation
\r
10 VIOLATED = AgreementStatus.StatusEnum.VIOLATED
\r
11 NON_DETERMINED = AgreementStatus.StatusEnum.NON_DETERMINED
\r
12 FULFILLED = AgreementStatus.StatusEnum.FULFILLED
\r
15 def get_violations_bydate(violations):
\r
16 """Returns a list of violations per date, from a list of violations
\r
18 :param violations list[Violation]:
\r
22 for v in violations:
\r
23 assert isinstance(v, Violation)
\r
24 date = v.datetime.date()
\r
29 result = [(key, d[key]) for key in sorted(d.keys(), reverse=True)]
\r
33 class AgreementAnnotator(object):
\r
34 """Annotates an agreement with the following attributes:
\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
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
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
61 def _annotate_guaranteeterm(self, term, violations):
\r
63 # Annotate a guarantee term: set bounds and violations
\r
65 level = term.servicelevelobjective.customservicelevel
\r
66 bounds = AgreementAnnotator._parse_bounds(level)
\r
67 term.servicelevelobjective.bounds = bounds
\r
70 # set status attribute if not set before
\r
72 if not hasattr(term, 'status'):
\r
73 term.status = wsag_model.AgreementStatus.StatusEnum.NON_DETERMINED
\r
78 for violation in violations:
\r
79 if violation.metric_name == term.servicelevelobjective.kpiname:
\r
81 term.nviolations = n
\r
83 def _annotate_guaranteeterm_by_status(
\r
84 self, agreement, termstatus, violations):
\r
86 # Annotate a guarantee term: it is different from the previous
\r
87 # one in that this takes the status into account.
\r
89 name = termstatus.name
\r
90 status = termstatus.status
\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
97 def annotate_agreement(self, agreement, status=None, violations=()):
\r
99 """Annotate an agreement with certain values needed in the templates
\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
108 logger.debug("SLA STATUS: {}".format(status))
\r
110 if status is not None:
\r
111 a.guaranteestatus = status.guaranteestatus
\r
112 a.statusclass = self._get_statusclass(status.guaranteestatus)
\r
113 for termstatus in status.guaranteeterms:
\r
114 self._annotate_guaranteeterm_by_status(
\r
115 agreement, termstatus, violations)
\r
117 a.guaranteestatus = NON_DETERMINED
\r
118 for termname, term in agreement.guaranteeterms.items():
\r
119 self._annotate_guaranteeterm(term, violations)
\r