oncall-engine/engine/apps/api/tests/conftest.py
Innokentii Konstantinov 26a2bd9c91
Refactor maintenance (#1340)
# What this PR does
This PR simplifies code of maintenance mode.
1. Perform distribution/escalation maintenance checks in send_signal...
tasks.
2. Use usual alert distribution flow for the maintenance incident.
3. Decouple maintenance mode from slack (all, except
**notify_about_maintenance_action** methods, I don't want to make this
PR too big)

As a bonus from these changes, maintenance mode now mute alert group
delivery in all chatops integrations, not only in slack. (Before,
incidents happened while maintenance were posted to telegram and msteams
anyway)

## Checklist

- [ ] Tests updated
- [ ] Documentation added
- [ ] `CHANGELOG.md` updated
2023-02-23 07:13:03 +00:00

68 lines
2.5 KiB
Python

from datetime import timedelta
import pytest
from django.utils import timezone
from apps.slack.scenarios.distribute_alerts import AlertShootingStep
from apps.slack.slack_client import SlackClientWithErrorHandling
@pytest.fixture()
def mock_slack_api_call(monkeypatch):
def _mock_api_call(*args, **kwargs):
return {
"status": 200,
"user": {
"profile": {"image_512": "TEST_SLACK_IMAGE_URL"},
"name": "TEST_SLACK_LOGIN",
"real_name": "TEST_SLACK_NAME",
},
"team": {"name": "TEST_SLACK_TEAM_NAME"},
}
monkeypatch.setattr(SlackClientWithErrorHandling, "api_call", _mock_api_call)
@pytest.fixture()
def make_resolved_ack_new_silenced_alert_groups(make_alert_group, make_alert_receive_channel, make_alert):
def _make_alert_groups_all_statuses(alert_receive_channel, channel_filter, alert_raw_request_data, **kwargs):
resolved_alert_group = make_alert_group(
alert_receive_channel,
channel_filter=channel_filter,
acknowledged_at=timezone.now() + timedelta(hours=1),
resolved_at=timezone.now() + timedelta(hours=2),
resolved=True,
acknowledged=True,
)
make_alert(alert_group=resolved_alert_group, raw_request_data=alert_raw_request_data)
ack_alert_group = make_alert_group(
alert_receive_channel,
channel_filter=channel_filter,
acknowledged_at=timezone.now() + timedelta(hours=1),
acknowledged=True,
)
make_alert(alert_group=ack_alert_group, raw_request_data=alert_raw_request_data)
new_alert_group = make_alert_group(alert_receive_channel, channel_filter=channel_filter)
make_alert(alert_group=new_alert_group, raw_request_data=alert_raw_request_data)
silenced_alert_group = make_alert_group(
alert_receive_channel,
channel_filter=channel_filter,
silenced=True,
silenced_at=timezone.now() + timedelta(hours=1),
)
make_alert(alert_group=silenced_alert_group, raw_request_data=alert_raw_request_data)
return resolved_alert_group, ack_alert_group, new_alert_group, silenced_alert_group
return _make_alert_groups_all_statuses
@pytest.fixture()
def mock_alert_shooting_step_post_alert_group_to_slack(monkeypatch):
def mock_post_alert_group_to_slack(*args, **kwargs):
return None
monkeypatch.setattr(AlertShootingStep, "_post_alert_group_to_slack", mock_post_alert_group_to_slack)