85 lines
3.3 KiB
Python
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
|