def test_fmtd_sub_expr(self):
     expression = self.good_simple_expression
     sub_exprs = alarm_expr_parser.AlarmExprParser(expression).sub_expr_list
     self.assertEqual([x.fmtd_sub_expr_str for x in sub_exprs], [
         'MAX(cpu.idle_perc{hostname=fred}) <= 3.0 times 4',
         'AVG(CPU.PERCENT{}) < 5.0', 'MIN(cpu.percent{}) gte 3.0'
     ])
    def test_should_create(self):
        expression = ('AVG(hpcs.compute{flavor_id=777, image_id=888,'
                      ' metric_name=cpu}) > 10')
        description = ''
        match_by = ['flavor_id', 'image_id']
        sub_expr_list = (
            alarm_expr_parser.AlarmExprParser(expression).sub_expr_list)
        alarm_actions = ['29387234', '77778687']
        alarmA_id = self.repo.create_alarm_definition(
            '555', '90% CPU', expression, sub_expr_list, description, 'LOW',
            match_by, alarm_actions, None, None)

        alarmB = self.repo.get_alarm_definition('555', alarmA_id)

        self.assertEqual(alarmA_id, alarmB['id'])

        query_sad = (select([self.sad.c.id]).select_from(
            self.sad).where(self.sad.c.alarm_definition_id == alarmA_id))

        query_sadd = (select([func.count()]).select_from(self.sadd).where(
            self.sadd.c.sub_alarm_definition_id == bindparam('id')))

        with self.engine.connect() as conn:
            count_sad = conn.execute(query_sad).fetchall()
            self.assertEqual(len(count_sad), 1)
            count_sadd = conn.execute(query_sadd,
                                      id=count_sad[0][0]).fetchone()
            self.assertEqual(count_sadd[0], 3)
    def test_build_expression_all_parameters(self):
        expression = 'avg(darth.vader{over=9000}, deterministic, 60) GT 10.0 times 1'
        sub_expr_list = alarm_expr_parser.AlarmExprParser(expression).sub_expr_list
        sub_alarm_d = sub_alarm_definition.SubAlarmDefinition(sub_expr=sub_expr_list[0])
        self.assertEqual(expression, sub_alarm_d.expression)

        sub_alarm_d.dimensions_str = None
        sub_alarm_d.dimensions = None
        sub_alarm_d.deterministic = False
        sub_alarm_d.period = None
        sub_alarm_d.periods = None
        self.assertEqual('avg(darth.vader) GT 10.0', sub_alarm_d.expression)
 def test_init_from_both_row_and_sub_expr(self):
     sub_alarm_d_dict = {'id': '111',
                         'alarm_definition_id': '123',
                         'function': 'AVG',
                         'metric_name': 'darth.vader',
                         'operator': 'GT',
                         'threshold': 10,
                         'period': 60,
                         'periods': 1,
                         'is_deterministic': 0,
                         'dimensions': 'device=1,image_id=888'}
     expression = 'avg(darth.vader.compute{device=1,image_id=888}, 60) GT 10.0 times 1'
     sub_expr_list = alarm_expr_parser.AlarmExprParser(expression).sub_expr_list
     self.assertRaises(Exception, sub_alarm_definition.SubAlarmDefinition,
                       sub_alarm_d_dict, sub_expr_list)  # noqa: E202
Example #5
0
 def test_should_try_to_create_with_wrong_alarm_action(self):
     expression = ('AVG(hpcs.compute{flavor_id=777, image_id=888,'
                   ' metric_name=cpu}) > 10')
     description = ''
     match_by = ['flavor_id', 'image_id']
     sub_expr_list = alarm_expr_parser.AlarmExprParser(expression).sub_expr_list
     alarm_actions = ['66666666']
     args = ('555',
             '90% CPU',
             expression,
             sub_expr_list,
             description,
             'LOW',
             match_by,
             alarm_actions,
             None,
             None)
     self.assertRaises(exceptions.InvalidUpdateException,
                       self.repo.create_alarm_definition, *args)
 def test_init_from_sub_expr(self):
     sub_alarm_d_dict = {'function': 'AVG',
                         'metric_name': 'darth.vader',
                         'operator': 'GT',
                         'threshold': 10.0,
                         'period': 60,
                         'periods': 1,
                         'is_deterministic': 0,
                         'dimensions': 'device=1,image_id=888'}
     dimension_dict = {'device': '1',
                       'image_id': '888'}
     expression = 'avg(darth.vader{device=1,image_id=888}, 60) GT 10.0 times 1'
     sub_expr_list = alarm_expr_parser.AlarmExprParser(expression).sub_expr_list
     sub_alarm_d = sub_alarm_definition.SubAlarmDefinition(sub_expr=sub_expr_list[0])
     self.assertEqual(sub_alarm_d_dict['metric_name'], sub_alarm_d.metric_name)
     self.assertEqual(sub_alarm_d_dict['dimensions'], sub_alarm_d.dimensions_str)
     self.assertEqual(dimension_dict, sub_alarm_d.dimensions)
     self.assertEqual(sub_alarm_d_dict['function'], sub_alarm_d.function)
     self.assertEqual(sub_alarm_d_dict['operator'], sub_alarm_d.operator)
     self.assertEqual(sub_alarm_d_dict['period'], sub_alarm_d.period)
     self.assertEqual(sub_alarm_d_dict['periods'], sub_alarm_d.periods)
     self.assertEqual(sub_alarm_d_dict['threshold'], sub_alarm_d.threshold)
     self.assertEqual(False, sub_alarm_d.deterministic)
 def test_dimensions_as_list(self):
     expression = self.good_simple_expression
     sub_exprs = alarm_expr_parser.AlarmExprParser(expression).sub_expr_list
     print([x.dimensions_as_list for x in sub_exprs].__str__())
     self.assertEqual([x.dimensions_as_list for x in sub_exprs].__str__(),
                      "[(['hostname=fred'], {}), [], []]")
 def _ensure_parse_fails(self, expression):
     parser = alarm_expr_parser.AlarmExprParser(expression)
     self.assertRaises(
         (pyparsing.ParseException, pyparsing.ParseFatalException), getattr,
         parser, "sub_expr_list")
 def test_good_expression(self):
     expression = self.good_simple_expression
     sub_exprs = alarm_expr_parser.AlarmExprParser(expression).sub_expr_list
     self.assertEqual(1, len(sub_exprs))
 def test_normalized_operator(self):
     expression = self.good_simple_expression
     sub_exprs = alarm_expr_parser.AlarmExprParser(expression).sub_expr_list
     self.assertEqual([x.normalized_operator for x in sub_exprs],
                      ['LTE', 'LT', 'GTE'])
 def test_id(self):
     expression = self.good_simple_expression
     sub_exprs = alarm_expr_parser.AlarmExprParser(expression).sub_expr_list
     self.assertEqual([x.id for x in sub_exprs], [None, None, None])
 def test_threshold(self):
     expression = self.good_simple_expression
     sub_exprs = alarm_expr_parser.AlarmExprParser(expression).sub_expr_list
     self.assertEqual([x.threshold for x in sub_exprs], [3.0, 5.0, 3.0])
 def test_periods(self):
     expression = self.good_simple_expression
     sub_exprs = alarm_expr_parser.AlarmExprParser(expression).sub_expr_list
     self.assertEqual([x.periods for x in sub_exprs], [4, 1, 1])
    def test_should_update(self):
        expression = ''.join([
            'AVG(hpcs.compute{flavor_id=777, image_id=888,',
            ' metric_name=mem}) > 20 and', ' AVG(hpcs.compute) < 100'
        ])
        description = ''
        match_by = ['flavor_id', 'image_id']
        sub_expr_list = (
            alarm_expr_parser.AlarmExprParser(expression).sub_expr_list)
        alarm_actions = ['29387234', '77778687']
        self.repo.update_or_patch_alarm_definition('bob', '234', '90% CPU',
                                                   expression, sub_expr_list,
                                                   False, description,
                                                   alarm_actions, None, None,
                                                   match_by, 'LOW')
        alarm = self.repo.get_alarm_definition('bob', '234')
        expected = {
            'actions_enabled':
            False,
            'alarm_actions':
            '29387234,77778687',
            'description':
            '',
            'expression':
            'AVG(hpcs.compute{flavor_id=777, '
            'image_id=888, metric_name=mem}) > 20 and'
            ' AVG(hpcs.compute) < 100',
            'id':
            '234',
            'match_by':
            'flavor_id,image_id',
            'name':
            '90% CPU',
            'ok_actions':
            None,
            'severity':
            'LOW',
            'undetermined_actions':
            None
        }

        self.assertEqual(alarm, expected)

        sub_alarms = self.repo.get_sub_alarm_definitions('234')

        expected = [{
            'alarm_definition_id': '234',
            'dimensions': 'flavor_id=777,image_id=888,'
            'metric_name=mem',
            'function': 'AVG',
            'id': '222',
            'metric_name': 'hpcs.compute',
            'operator': 'GT',
            'period': 60,
            'periods': 1,
            'is_deterministic': False,
            'threshold': 20.0
        }, {
            'alarm_definition_id': '234',
            'dimensions': None,
            'function': 'AVG',
            'id': '223',
            'metric_name': 'hpcs.compute',
            'operator': 'LT',
            'period': 60,
            'periods': 1,
            'is_deterministic': False,
            'threshold': 100.0
        }]

        self.assertEqual(len(sub_alarms), len(expected))

        for s, e in zip(sub_alarms, expected):
            e['created_at'] = s['created_at']
            e['updated_at'] = s['updated_at']

        self.assertEqual(sub_alarms, expected)
        am = self.repo.get_alarm_metrics('bob', '234')
        self.assertEqual(am, [])

        sub_alarms = self.repo.get_sub_alarms('bob', '234')
        self.assertEqual(sub_alarms, [])

        ads = self.repo.get_alarm_definitions('bob', '90% CPU',
                                              {'image_id': '888'}, None, None,
                                              0, 100)
        expected = [{
            'actions_enabled': False,
            'alarm_actions': '29387234,77778687',
            'description': None,
            'expression': 'AVG(hpcs.compute{flavor_id=777, '
            'image_id=888, metric_name=cpu, device=1}) > 10',
            'id': '123',
            'match_by': 'flavor_id,image_id',
            'name': '90% CPU',
            'ok_actions': None,
            'severity': 'LOW',
            'undetermined_actions': None
        }, {
            'actions_enabled':
            False,
            'alarm_actions':
            '29387234,77778687',
            'description':
            '',
            'expression':
            'AVG(hpcs.compute{flavor_id=777, '
            'image_id=888, metric_name=mem}) > 20 and'
            ' AVG(hpcs.compute) < 100',
            'id':
            '234',
            'match_by':
            'flavor_id,image_id',
            'name':
            '90% CPU',
            'ok_actions':
            None,
            'severity':
            'LOW',
            'undetermined_actions':
            None
        }]
        self.assertEqual(ads, expected)

        ads = self.repo.get_alarm_definitions('bob', '90% CPU',
                                              {'image_id': '888'}, 'LOW', None,
                                              0, 100)
        expected = [{
            'actions_enabled': False,
            'alarm_actions': '29387234,77778687',
            'description': None,
            'expression': 'AVG(hpcs.compute{flavor_id=777, '
            'image_id=888, metric_name=cpu, device=1}) > 10',
            'id': '123',
            'match_by': 'flavor_id,image_id',
            'name': '90% CPU',
            'ok_actions': None,
            'severity': 'LOW',
            'undetermined_actions': None
        }, {
            'actions_enabled':
            False,
            'alarm_actions':
            '29387234,77778687',
            'description':
            '',
            'expression':
            'AVG(hpcs.compute{flavor_id=777, '
            'image_id=888, metric_name=mem}) > 20 and'
            ' AVG(hpcs.compute) < 100',
            'id':
            '234',
            'match_by':
            'flavor_id,image_id',
            'name':
            '90% CPU',
            'ok_actions':
            None,
            'severity':
            'LOW',
            'undetermined_actions':
            None
        }]
        self.assertEqual(ads, expected)

        ads = self.repo.get_alarm_definitions('bob', '90% CPU',
                                              {'image_id': '888'}, 'CRITICAL',
                                              None, 0, 100)
        expected = []
        self.assertEqual(ads, expected)

        self.repo.update_or_patch_alarm_definition('bob', '234', '90% CPU',
                                                   None, sub_expr_list, False,
                                                   description, alarm_actions,
                                                   None, None, match_by, 'LOW')

        self.repo.update_or_patch_alarm_definition('bob', '234', None, None,
                                                   None, True, None, None,
                                                   None, None, None, None,
                                                   True)

        self.repo.update_or_patch_alarm_definition('bob', '234', None, None,
                                                   None, None, None, None,
                                                   None, None, None, None,
                                                   True)

        self.repo.update_or_patch_alarm_definition('bob', '234', None, None,
                                                   None, None, None, [], [],
                                                   [], None, None, True)

        self.repo.update_or_patch_alarm_definition('bob', '234', None, None,
                                                   None, False, None, None,
                                                   None, None, match_by, None,
                                                   False)

        self.assertRaises(exceptions.InvalidUpdateException,
                          self.repo.update_or_patch_alarm_definition, 'bob',
                          '234', None, None, None, False, None, None, None,
                          None, None, None, False)

        self.assertRaises(exceptions.InvalidUpdateException,
                          self.repo.update_or_patch_alarm_definition, 'bob',
                          '234', '90% CPU', None, sub_expr_list, False,
                          description, alarm_actions, None, None,
                          'update_match_by', 'LOW')

        self.repo.delete_alarm_definition('bob', '234')

        self.assertRaises(exceptions.DoesNotExistException,
                          self.repo.get_alarm_definition, 'bob', '234')
 def test_deterministic(self):
     expression = self.good_simple_expression
     sub_exprs = alarm_expr_parser.AlarmExprParser(expression).sub_expr_list
     self.assertEqual([x.deterministic for x in sub_exprs],
                      [False, False, True])
 def test_dimensions(self):
     expression = self.good_simple_expression
     sub_exprs = alarm_expr_parser.AlarmExprParser(expression).sub_expr_list
     self.assertEqual([x.dimensions for x in sub_exprs],
                      ['hostname=fred', '', ''])
 def test_normalized_metric_name(self):
     expression = self.good_simple_expression
     sub_exprs = alarm_expr_parser.AlarmExprParser(expression).sub_expr_list
     self.assertEqual([x.normalized_metric_name for x in sub_exprs],
                      ['cpu.idle_perc', 'cpu.percent', 'cpu.percent'])
 def test_normalized_function(self):
     expression = self.good_simple_expression
     sub_exprs = alarm_expr_parser.AlarmExprParser(expression).sub_expr_list
     self.assertEqual([x.normalized_func for x in sub_exprs],
                      ['MAX', 'AVG', 'MIN'])
 def test_function(self):
     expression = self.good_simple_expression
     sub_exprs = alarm_expr_parser.AlarmExprParser(expression).sub_expr_list
     self.assertEqual([x.func for x in sub_exprs], ['max', 'avg', 'min'])
 def test_set_id(self):
     expression = self.good_simple_expression
     sub_exprs = alarm_expr_parser.AlarmExprParser(expression).sub_expr_list
     for x in sub_exprs:
         x.id = 88
     self.assertEqual([x.id for x in sub_exprs], [88, 88, 88])
    def run_patch_test(self,
                       name=None,
                       expression=None,
                       description=None,
                       actions_enabled=None,
                       alarm_actions=None,
                       ok_actions=None,
                       undetermined_actions=None,
                       match_by=None,
                       severity=None):
        if expression:
            sub_expr_list = (
                alarm_expr_parser.AlarmExprParser(expression).sub_expr_list)
        else:
            sub_expr_list = None
        updates = self.repo.update_or_patch_alarm_definition(
            TENANT_ID,
            '123',
            name,
            expression,
            sub_expr_list,
            actions_enabled,
            description,
            alarm_actions,
            ok_actions,
            undetermined_actions,
            match_by,
            severity,
            patch=True)

        alarm_def_row = (
            ALARM_DEF_123_FIELDS['id'],
            name if name else ALARM_DEF_123_FIELDS['name'],
            description
            if description else ALARM_DEF_123_FIELDS['description'],
            expression if expression else ALARM_DEF_123_FIELDS['expression'],
            ALARM_DEF_123_FIELDS['match_by'],  # match-by can't change
            severity if severity else ALARM_DEF_123_FIELDS['severity'],
            actions_enabled
            if actions_enabled else ALARM_DEF_123_FIELDS['actions_enabled'],
            u','.join(alarm_actions)
            if alarm_actions else ALARM_DEF_123_FIELDS['alarm_actions'],
            u','.join(ok_actions)
            if ok_actions else ALARM_DEF_123_FIELDS['ok_actions'],
            (u','.join(undetermined_actions) if undetermined_actions else
             ALARM_DEF_123_FIELDS['undetermined_actions']))

        sad = self.default_sads[0]
        if expression and ALARM_DEF_123_FIELDS['expression'] != expression:
            sub_expr = sub_expr_list[0]
            sub_alarm_def = sub_alarm_definition.SubAlarmDefinition(
                row={
                    'id': '',
                    'alarm_definition_id': sad['alarm_definition_id'],
                    'function': sub_expr.normalized_func,
                    'metric_name': sub_expr.metric_name,
                    'dimensions':
                    u'device=1,image_id=888,flavor_id=777,metric_name=cpu',
                    'operator': sub_expr.normalized_operator,
                    'threshold': sub_expr.threshold,
                    'period': sub_expr.period,
                    'is_deterministic': sub_expr.deterministic,
                    'periods': sub_expr.periods
                })
            expected_sub_alarm_maps = {
                'changed': {
                    u'111': sub_alarm_def
                },
                'new': {},
                'old': {},
                'unchanged': {}
            }
        else:
            sub_alarm_def = sub_alarm_definition.SubAlarmDefinition(
                row={
                    'id': sad['id'],
                    'alarm_definition_id': sad['alarm_definition_id'],
                    'function': sad['function'],
                    'metric_name': sad['metric_name'],
                    'dimensions':
                    u'device=1,image_id=888,flavor_id=777,metric_name=cpu',
                    'operator': sad['operator'],
                    'threshold': sad['threshold'],
                    'period': sad['period'],
                    'is_deterministic': sad['is_deterministic'],
                    'periods': sad['periods']
                })
            expected_sub_alarm_maps = {
                'changed': {},
                'new': {},
                'old': {},
                'unchanged': {
                    u'111': sub_alarm_def
                }
            }
        self.assertEqual((alarm_def_row, expected_sub_alarm_maps), updates)
 def test_operator(self):
     expression = self.good_simple_expression
     sub_exprs = alarm_expr_parser.AlarmExprParser(expression).sub_expr_list
     self.assertEqual([x.operator for x in sub_exprs], ['<=', '<', 'gte'])