oncall-engine/engine/apps/alerts/integration_options_mixin.py

85 lines
3.3 KiB
Python

import importlib
from django.conf import settings
from common.utils import getattrd
class IntegrationOptionsMixin:
DEFAULT_INTEGRATION = "grafana"
# Import every integration config file listed in settings.INSTALLED_ONCALL_INTEGRATIONS
# as a submodule into a tuple, e.g. AlertReceiveChannel._config[0].id, slug, description, etc..
_config = tuple(
(importlib.import_module(integration_config) for integration_config in settings.INSTALLED_ONCALL_INTEGRATIONS)
)
def __init__(self, *args, **kwargs):
super(IntegrationOptionsMixin, self).__init__(*args, **kwargs)
# Object integration configs (imported as submodules earlier) are also available in `config` field,
# e.g. instance.config.id, instance.config.slug, instance.config.description, etc...
self.config = IntegrationOptionsMixin.get_config_from_type(self.integration)
@classmethod
def get_config_from_type(cls, integration_type):
config = None
for integration in cls._config:
if integration.slug == integration_type:
config = integration
break
return config
# Define variables for backward compatibility, e.g. INTEGRATION_GRAFANA, INTEGRATION_FORMATTED_WEBHOOK, etc...
for integration_config in _config:
vars()[f"INTEGRATION_{integration_config.slug.upper()}"] = integration_config.slug
INTEGRATION_TYPES = {integration_config.slug for integration_config in _config}
INTEGRATION_CHOICES = tuple(
(
(
integration_config.slug,
integration_config.title,
)
for integration_config in _config
)
)
# Following attributes are generated from _config for backwards compatibility and used across the codebase
WEB_INTEGRATION_CHOICES = [
integration_config.slug for integration_config in _config if integration_config.is_displayed_on_web
]
INTEGRATION_SHORT_DESCRIPTION = {
integration_config.slug: integration_config.short_description for integration_config in _config
}
INTEGRATION_FEATURED = [integration_config.slug for integration_config in _config if integration_config.is_featured]
INTEGRATION_FEATURED_TAG_NAME = {
integration_config.slug: integration_config.featured_tag_name
for integration_config in _config
if hasattr(integration_config, "featured_tag_name")
}
# The following attributes dynamically generated and used by apps.alerts.incident_appearance.renderers, templaters
# e.g. INTEGRATION_TO_DEFAULT_SLACK_TITLE_TEMPLATE, INTEGRATION_TO_DEFAULT_SLACK_MESSAGE_TEMPLATE, etc...
template_names = [
"slack_title",
"slack_message",
"slack_image_url",
"web_title",
"web_message",
"web_image_url",
"sms_title",
"phone_call_title",
"telegram_title",
"telegram_message",
"telegram_image_url",
"grouping_id",
"resolve_condition",
"acknowledge_condition",
"source_link",
]
for template_name in template_names:
result = dict()
for integration_config in _config:
result[integration_config.slug] = getattrd(integration_config, template_name, None)
vars()[f"INTEGRATION_TO_DEFAULT_{template_name.upper()}_TEMPLATE"] = result