alert-autoconf
62 строки · 1.6 Кб
1import logging2from typing import List3
4import pydantic5from redis import Redis6import yaml7
8from alert_autoconf import models9
10
11# Redis keys
12DEFAULT_PREFIX = "autoconf:defaults:"13DEFAULT_TRIGGER_KEY = DEFAULT_PREFIX + "triggers"14
15
16class DefaultCondition(pydantic.BaseModel):17tags: List[str]18
19def applies(self, trigger: models.TriggerFile):20return set(self.tags).issubset(trigger.tags)21
22
23class DefaultValues(pydantic.BaseModel):24parents: List[models.ParentTriggerRef]25
26
27class DefaultRule(pydantic.BaseModel):28condition: DefaultCondition29values: DefaultValues30
31
32class DefaultFile(pydantic.BaseModel):33defaults: List[DefaultRule]34
35
36def apply_defaults(alerts: models.Alerts, redis: Redis):37"""Applies default values stored in Redis.38As of version 0.4.15, the defaults are these:
39* all triggers with a MONAD tag get default parents.
40"""
41
42default_file = redis.get(DEFAULT_TRIGGER_KEY)43if default_file is None:44logging.info("Defaults not found in Redis, skipping.")45else:46default_file = yaml.safe_load(default_file)47default_file = DefaultFile(**default_file)48default_rules = default_file.defaults49
50for trigger in alerts.triggers:51for default_rule in default_rules:52if default_rule.condition.applies(trigger):53trigger.parents = _extend_without_duplicates(trigger.parents, default_rule.values.parents)54
55
56def _extend_without_duplicates(this, extension):57if this is None:58this = []59for item in extension:60if item not in this:61this.append(item)62return this63