Related to https://github.com/grafana/oncall-private/issues/2977 e.g. `GET /api/plugins/grafana-oncall-app/resources/alertgroups/filter_affected_services?service=service-a&service=service-b` ``` [ {"name": "service-a", "service_url": "http://localhost:3000/a/grafana-slo-app/service/service-a", "alert_groups_url": "http://localhost:3000/a/grafana-oncall-app/alert-groups?status=0&status=1&started_at=now-7d_now&label=service_name:service-a"} ] ```
61 lines
2.4 KiB
Python
61 lines
2.4 KiB
Python
import typing
|
|
from urllib.parse import urljoin
|
|
|
|
from common.constants.plugin_ids import PluginID
|
|
|
|
if typing.TYPE_CHECKING:
|
|
from apps.user_management.models import Organization
|
|
|
|
|
|
class UIURLBuilder:
|
|
"""
|
|
If `base_url` is passed into the constructor, it will override using `organization.grafana_url`
|
|
"""
|
|
|
|
def __init__(self, organization: "Organization", base_url: typing.Optional[str] = None) -> None:
|
|
self.base_url = base_url if base_url else organization.grafana_url
|
|
self.is_grafana_irm_enabled = organization.is_grafana_irm_enabled
|
|
|
|
def _build_url(self, page: str, path_extra: str = "", plugin_id: typing.Optional[str] = None) -> str:
|
|
"""
|
|
Constructs an absolute URL to a Grafana plugin page.
|
|
"""
|
|
if not plugin_id:
|
|
plugin_id = PluginID.IRM if self.is_grafana_irm_enabled else PluginID.ONCALL
|
|
return urljoin(self.base_url, f"a/{plugin_id}/{page}{path_extra}")
|
|
|
|
def home(self, path_extra: str = "") -> str:
|
|
return self._build_url("", path_extra)
|
|
|
|
def alert_groups(self, path_extra: str = "") -> str:
|
|
return self._build_url("alert-groups", path_extra)
|
|
|
|
def alert_group_detail(self, id: str, path_extra: str = "") -> str:
|
|
return self._build_url(f"alert-groups/{id}", path_extra)
|
|
|
|
def integration_detail(self, id: str, path_extra: str = "") -> str:
|
|
return self._build_url(f"integrations/{id}", path_extra)
|
|
|
|
def schedules(self, path_extra: str = "") -> str:
|
|
return self._build_url("schedules", path_extra)
|
|
|
|
def schedule_detail(self, id: str, path_extra: str = "") -> str:
|
|
return self._build_url(f"schedules/{id}", path_extra)
|
|
|
|
def users(self, path_extra: str = "") -> str:
|
|
return self._build_url("users", path_extra)
|
|
|
|
def user_profile(self, path_extra: str = "") -> str:
|
|
return self._build_url("users/me", path_extra)
|
|
|
|
def chatops(self, path_extra: str = "") -> str:
|
|
return self._build_url("chat-ops", path_extra)
|
|
|
|
def settings(self, path_extra: str = "") -> str:
|
|
return self._build_url("settings", path_extra)
|
|
|
|
def declare_incident(self, path_extra: str = "") -> str:
|
|
return self._build_url("incidents/declare", path_extra, plugin_id=PluginID.INCIDENT)
|
|
|
|
def service_page(self, service_name: str, path_extra: str = "") -> str:
|
|
return self._build_url(f"service/{service_name}", path_extra, plugin_id=PluginID.SLO)
|