oncall-engine/tools/migrators/lib/splunk/resources/paging_policies.py
Joey Orlando c46dff09d9
Splunk OnCall migration tool (#4267)
# What this PR does

Refactors the PagerDuty migration script to be a bit more generic + adds
a migration script to migrate from Splunk OnCall (VictorOps)

tldr;
```bash
❯ docker build -t oncall-migrator .
[+] Building 0.4s (10/10) FINISHED
❯ docker run --rm \
-e MIGRATING_FROM="pagerduty" \
-e MODE="plan" \
-e ONCALL_API_URL="http://localhost:8080" \
-e ONCALL_API_TOKEN="<ONCALL_API_TOKEN>" \
-e PAGERDUTY_API_TOKEN="<PAGERDUTY_API_TOKEN>" \
oncall-migrator
running pagerduty migration script...

❯ docker run --rm \
-e MIGRATING_FROM="splunk" \
-e MODE="plan" \
-e ONCALL_API_URL="http://localhost:8080" \
-e ONCALL_API_TOKEN="<ONCALL_API_TOKEN>" \
-e SPLUNK_API_ID="<SPLUNK_API_ID>" \
-e SPLUNK_API_KEY="<SPLUNK_API_KEY>" \
oncall-migrator
migrating from splunk oncall...
```

https://www.loom.com/share/a855062d436a4ef79f030e22528d8c71

## Checklist

- [x] Unit, integration, and e2e (if applicable) tests updated
- [x] Documentation added (or `pr:no public docs` PR label added if not
required)
- [x] Added the relevant release notes label (see labels prefixed w/
`release:`). These labels dictate how your PR will
    show up in the autogenerated release notes.
2024-05-14 13:53:59 +00:00

60 lines
2 KiB
Python

import typing
from lib.oncall.api_client import OnCallAPIClient
from lib.splunk.config import SPLUNK_TO_ONCALL_CONTACT_METHOD_MAP
from lib.splunk.types import SplunkUserPagingPolicy, SplunkUserWithPagingPolicies
from lib.utils import transform_wait_delay
def migrate_paging_policies(user: SplunkUserWithPagingPolicies) -> None:
paging_policies = user["pagingPolicies"]
oncall_rules = transform_paging_policies(paging_policies, user["oncall_user"]["id"])
for rule in oncall_rules:
OnCallAPIClient.create("personal_notification_rules", rule)
if oncall_rules:
# delete old notification rules if any new rules were created
for rule in user["oncall_user"]["notification_rules"]:
OnCallAPIClient.delete("personal_notification_rules/{}".format(rule["id"]))
def transform_paging_policies(
paging_policies: typing.List[SplunkUserPagingPolicy], user_id: str
) -> typing.List[SplunkUserPagingPolicy]:
"""
Transform Splunk user paging policies to Grafana OnCall personal notification rules.
"""
paging_policies = sorted(paging_policies, key=lambda rule: rule["order"])
oncall_notification_rules = []
for idx, paging_policy in enumerate(paging_policies):
# don't add a delay at the end
if idx == len(paging_policies) - 1:
delay = None
else:
delay = paging_policy["timeout"]
oncall_notification_rules += transform_paging_policy(
paging_policy, delay, user_id
)
return oncall_notification_rules
def transform_paging_policy(
paging_policy: SplunkUserPagingPolicy, delay: typing.Optional[int], user_id: str
) -> list[dict]:
oncall_type = SPLUNK_TO_ONCALL_CONTACT_METHOD_MAP[paging_policy["contactType"]]
notify_rule = {"user_id": user_id, "type": oncall_type, "important": False}
if not delay:
return [notify_rule]
wait_rule = {
"user_id": user_id,
"type": "wait",
"duration": transform_wait_delay(delay),
"important": False,
}
return [notify_rule, wait_rule]