90 lines
2.8 KiB
Ruby
90 lines
2.8 KiB
Ruby
![]() |
# frozen_string_literal: true
|
||
|
|
||
|
class BackfillEscalationPoliciesForOncallSchedules < ActiveRecord::Migration[6.0]
|
||
|
include Gitlab::Database::MigrationHelpers
|
||
|
|
||
|
# Creates a single new escalation policy for projects which have
|
||
|
# existing on-call schedules. Only one schedule is expected
|
||
|
# per project, but it is possible to have multiple.
|
||
|
#
|
||
|
# An escalation rule is created for each existing schedule,
|
||
|
# configured to immediately notify the schedule of an incoming
|
||
|
# alert payload unless the alert has already been acknowledged.
|
||
|
# For projects with multiple schedules, the name of the first saved
|
||
|
# schedule will be used for the policy's description.
|
||
|
#
|
||
|
# Skips projects which already have escalation policies & schedules.
|
||
|
#
|
||
|
# EX)
|
||
|
# For these existing records:
|
||
|
# Project #3
|
||
|
# IncidentManagement::OncallSchedules #13
|
||
|
# project_id: 3
|
||
|
# name: 'Awesome Schedule'
|
||
|
# description: null
|
||
|
# IncidentManagement::OncallSchedules #14
|
||
|
# project_id: 3
|
||
|
# name: '2ndary sched'
|
||
|
# description: 'Backup on-call'
|
||
|
#
|
||
|
# These will be inserted:
|
||
|
# EscalationPolicy #1
|
||
|
# project_id: 3
|
||
|
# name: 'On-call Escalation Policy'
|
||
|
# description: 'Immediately notify Awesome Schedule'
|
||
|
# EscalationRule #1
|
||
|
# policy_id: 1,
|
||
|
# oncall_schedule_id: 13
|
||
|
# status: 1 # Acknowledged status
|
||
|
# elapsed_time_seconds: 0
|
||
|
# EscalationRule #2
|
||
|
# policy_id: 1,
|
||
|
# oncall_schedule_id: 14
|
||
|
# status: 1 # Acknowledged status
|
||
|
# elapsed_time_seconds: 0
|
||
|
def up
|
||
|
ApplicationRecord.connection.exec_query(<<~SQL.squish)
|
||
|
WITH new_escalation_policies AS (
|
||
|
INSERT INTO incident_management_escalation_policies (
|
||
|
project_id,
|
||
|
name,
|
||
|
description
|
||
|
)
|
||
|
SELECT
|
||
|
DISTINCT ON (project_id) project_id,
|
||
|
'On-call Escalation Policy',
|
||
|
CONCAT('Immediately notify ', name)
|
||
|
FROM incident_management_oncall_schedules
|
||
|
WHERE project_id NOT IN (
|
||
|
SELECT DISTINCT project_id
|
||
|
FROM incident_management_escalation_policies
|
||
|
)
|
||
|
ORDER BY project_id, id
|
||
|
RETURNING id, project_id
|
||
|
)
|
||
|
|
||
|
INSERT INTO incident_management_escalation_rules (
|
||
|
policy_id,
|
||
|
oncall_schedule_id,
|
||
|
status,
|
||
|
elapsed_time_seconds
|
||
|
)
|
||
|
SELECT
|
||
|
new_escalation_policies.id,
|
||
|
incident_management_oncall_schedules.id,
|
||
|
1,
|
||
|
0
|
||
|
FROM new_escalation_policies
|
||
|
INNER JOIN incident_management_oncall_schedules
|
||
|
ON new_escalation_policies.project_id = incident_management_oncall_schedules.project_id
|
||
|
SQL
|
||
|
end
|
||
|
|
||
|
# There is no way to distinguish between policies created
|
||
|
# via the backfill or as a result of a user creating a new
|
||
|
# on-call schedule.
|
||
|
def down
|
||
|
# no-op
|
||
|
end
|
||
|
end
|