def test_create_fake_moira_trigger_and_alerting_prefix_exists_token_not_exists(
            self):
        valid_config = 'tests/valid_config_second.yaml'
        data = read_from_file(valid_config)
        trigger_count = len(data.triggers)
        client = Client(self.url)

        with patch.object(client, 'get',
                          return_value={'list':
                                        []}), patch.object(client,
                                                           'put',
                                                           return_value={}):
            trigger_manager = TriggerManager(client)
            tag_manager = TagManager(client)
            contact_manager = ContactManager(client)
            subscription_manager = SubscriptionManager(client)

            with patch.object(
                    self.moira, '_trigger', return_value=trigger_manager
            ) as _trigger_mock, patch.object(
                    self.moira, '_contact', return_value=contact_manager
            ) as _contact_mock, patch.object(
                    self.moira, '_tag',
                    return_value=tag_manager) as _tag_mock, patch.object(
                        self.moira,
                        '_subscription',
                        return_value=subscription_manager), patch.object(
                            self.redis, 'exists',
                            return_value=0) as _redis_exists, patch.object(
                                self.redis, 'sadd',
                                return_value=1) as _redis_sadd:
                _contact_mock.fetch_by_current_user.return_value = []
                _contact_mock.add = Mock(
                    side_effect=lambda value, contact_type: Contact(
                        id=str(uuid.uuid4()), type=contact_type, value=value))
                trigger_orig = MoiraAlert(self.moira, self.redis, self.token)
                trigger_orig.setup(data)

            args, kwargs = _trigger_mock.create.call_args_list[0]
            kwargs.pop('name')
            count_contacts_in_alerting_block = self._get_count_key_by_dict(
                data.alerting, 'contacts')
            count_contacts_in_alerting_block += 2  # + 2 contacts from escalations

            self.assertTrue(_tag_mock.fetch_assigned_triggers_by_tags.called)
            self.assertDictKeysEqual(
                {
                    k: v
                    for k, v in data.triggers[0].to_custom_dict().items()
                    if k not in ('name', )
                },
                kwargs,
            )
            self.assertTrue(_contact_mock.add.called)
            self.assertTrue(_trigger_mock.create.called)
            self.assertEqual(_contact_mock.add.call_count,
                             count_contacts_in_alerting_block)
            self.assertEqual(_trigger_mock.create.call_count, trigger_count)
            self.assertEqual(_redis_exists.call_count, 1)
            self.assertEqual(_redis_sadd.call_count, trigger_count)
    def test_config_prefix(self):
        data = read_from_file('tests/valid_config_second.yaml')
        prefix = data.prefix
        for trigger in data.triggers:
            self.assertTrue(trigger.name.startswith(prefix),
                            'Trigger name with prefix')
            for tag in trigger.tags:
                self.assertTrue(tag.startswith(prefix),
                                'Trigger tag with prefix')

        for alerting in data.alerting:
            for tag in alerting.tags:
                self.assertTrue(tag.startswith(prefix),
                                'Alerting tag with prefix')
Beispiel #3
0
def main():
    frmt = "[%(asctime)s] %(levelname)s:%(name)s:%(funcName)s:%(message)s"
    logging.basicConfig(
        level=logging.getLevelName(LOG_LEVEL),
        stream=sys.stdout,
        format=frmt,
        datefmt="%Y-%m-%d %H:%M:%S",
    )

    _logger = logging.getLogger("validate")

    params = parse_params()
    log_level = params.log_level.upper()

    if LOG_LEVEL != log_level:
        logging.getLogger().setLevel(logging.getLevelName(log_level))
        _logger.setLevel(logging.getLevelName(log_level))

    is_valid = True
    data = read_from_file(params.config, params.cluster)

    for trigger in data.triggers:
        for n, target in enumerate(trigger.targets):
            request_params = {
                "format": "json",
                "target": target,
                "from": "-1min",
                "noNullPoints": "true",
                "maxDataPoints": 1,
            }
            try:
                r = requests.get(params.url, params=request_params)
                r.json()
                _logger.info('Trigger: "%s", target: "%s" OK' %
                             (trigger.name, n))
            except JSONDecodeError as e:
                is_valid = False
                _logger.error('Trigger: "%s", target: "%s" ERROR: %s' %
                              (trigger.name, n, r.text))
            except Exception as e:
                is_valid = False
                _logger.error('Trigger: "%s", target: "%s", exception: "%s"' %
                              (trigger.name, n, e))

    if not is_valid:
        sys.exit(1)
Beispiel #4
0
def main():
    logging.basicConfig(level=logging.getLevelName(LOG_LEVEL),
                        format=LOG_FORMAT)

    logger = logging.getLogger("alert")

    params = parse_params()

    log_level = params["log_level"].upper()
    if LOG_LEVEL != log_level:
        logger.setLevel(logging.getLevelName(log_level))

    # urllib3 logging is too verbose, set it at WARNING or more
    loglevel_as_int = logging._nameToLevel[log_level.upper()]
    # `loglevel_as_int` is 50 for CRITICAL, 10 for DEBUG
    logging.getLogger("urllib3").setLevel(max(logging.WARNING,
                                              loglevel_as_int))
    # after this line, the loglevel for urllib3 is CRITICAL, ERROR or WARNING

    if not params["url"].startswith("http://"):
        params["url"] = "{}{}".format("http://", params["url"])

    moira = Moira(
        params["url"],
        auth_user=params["user"],
        auth_pass=params["password"],
        auth_custom={
            "User-Agent": _make_user_agent(),
        },
        retry_policy=RetryPolicy(
            max_tries=3,
            delay=1,
            backoff=1.5,
        ),
    )

    redis = Redis.from_url(params["redis_token_storage"])

    alert = MoiraAlert(moira=moira, redis=redis, token=params["token"])

    data = config.read_from_file(params["config"],
                                 cluster_name=params.get("cluster"))
    defaults.apply_defaults(data, redis)

    alert.setup(data)
    def test_create_fake_moira_trigger_and_alerting_token_exists_and_not_empty(
            self):
        valid_config = 'tests/valid_config.yaml'
        data = read_from_file(valid_config)
        current_triggers = self.createCustomTriggers()
        moira_triggers = dict([current_triggers.popitem()])
        client = Client(self.url)

        redis_trigger_ids = set(
            i.encode('utf-8') for i in moira_triggers.keys())
        redis_trigger_ids = redis_trigger_ids | {
            str(uuid.uuid4()).encode('utf-8')
        }

        with patch.object(client, 'get',
                          return_value={'list':
                                        []}), patch.object(client,
                                                           'put',
                                                           return_value={}):
            trigger_manager = TriggerManager(client)
            tag_manager = TagManager(client)
            contact_manager = ContactManager(client)
            subscription_manager = SubscriptionManager(client)

            with patch.object(
                    self.moira, '_trigger', return_value=trigger_manager
            ) as _trigger_mock, patch.object(
                    self.moira, '_contact', return_value=contact_manager
            ) as _contact_mock, patch.object(
                    self.moira, '_tag',
                    return_value=tag_manager) as _tag_mock, patch.object(
                        self.moira,
                        '_subscription',
                        return_value=subscription_manager), patch.object(
                            self.redis, 'exists', return_value=1
                        ) as _redis_exists_mock, patch.object(
                            self.redis,
                            'smembers',
                            return_value=redis_trigger_ids
                        ) as _redis_smembers_mock, patch.object(
                            self.redis, 'sadd',
                            return_value=1) as _redis_sadd_mock, patch.object(
                                self.redis, 'srem',
                                return_value=1) as _redis_srem_mock:
                _trigger_mock.fetch_by_id = Mock(
                    side_effect=lambda id: moira_triggers.get(id, None))
                _contact_mock.fetch_by_current_user.return_value = []
                _contact_mock.add = Mock(
                    side_effect=lambda value, contact_type: Contact(
                        id=str(uuid.uuid4()), type=contact_type, value=value))
                trigger_orig = MoiraAlert(self.moira, self.redis, self.token)
                trigger_orig.setup(data)

            args, kwargs = _trigger_mock.create.call_args_list[0]
            kwargs.pop('name')
            count_contacts_in_alerting_block = self._get_count_key_by_dict(
                data.alerting, 'contacts')
            count_contacts_in_alerting_block += 2  # + 2 contacts from escalations

            self.assertFalse(_tag_mock.fetch_assigned_triggers_by_tags.called)
            self.assertDictKeysEqual(
                {
                    k: v
                    for k, v in data.triggers[0].to_custom_dict().items()
                    if k not in ('name', )
                },
                kwargs,
            )
            self.assertTrue(_contact_mock.add.called)
            self.assertEqual(_trigger_mock.fetch_by_id.call_count, 2)
            self.assertTrue(_trigger_mock.create.called)
            self.assertEqual(_contact_mock.add.call_count,
                             count_contacts_in_alerting_block)
            self.assertEqual(_trigger_mock.create.call_count, 1)
            self.assertTrue(_redis_exists_mock.call_count)
            self.assertTrue(_redis_smembers_mock.call_count)
            self.assertEqual(_redis_sadd_mock.call_count, 1)
            self.assertEqual(_redis_srem_mock.call_count, 1)
    def test_invalid_config_read_raises_ValidationError(self):
        invalid_config = 'tests/invalid_config.yaml'

        with self.assertRaises(ValidationError):
            read_from_file(invalid_config)