57 lines
2.4 KiB
Ruby
57 lines
2.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class AddNonNullConstraintForEscalationRuleOnPendingAlertEscalations < ActiveRecord::Migration[6.1]
|
|
ELAPSED_WHOLE_MINUTES_IN_SECONDS = <<~SQL
|
|
ABS(ROUND(
|
|
EXTRACT(EPOCH FROM (escalations.process_at - escalations.created_at))/60*60
|
|
))
|
|
SQL
|
|
|
|
INSERT_RULES_FOR_ESCALATIONS_WITHOUT_RULES = <<~SQL
|
|
INSERT INTO incident_management_escalation_rules (policy_id, oncall_schedule_id, status, elapsed_time_seconds, is_removed)
|
|
SELECT
|
|
policies.id,
|
|
schedule_id,
|
|
status,
|
|
#{ELAPSED_WHOLE_MINUTES_IN_SECONDS} AS elapsed_time_seconds,
|
|
TRUE
|
|
FROM incident_management_pending_alert_escalations AS escalations
|
|
INNER JOIN incident_management_oncall_schedules AS schedules ON schedules.id = schedule_id
|
|
INNER JOIN incident_management_escalation_policies AS policies ON policies.project_id = schedules.project_id
|
|
WHERE rule_id IS NULL
|
|
GROUP BY policies.id, schedule_id, status, elapsed_time_seconds
|
|
ON CONFLICT DO NOTHING;
|
|
SQL
|
|
|
|
UPDATE_EMPTY_RULE_IDS = <<~SQL
|
|
UPDATE incident_management_pending_alert_escalations AS escalations
|
|
SET rule_id = rules.id
|
|
FROM incident_management_pending_alert_escalations AS through_escalations
|
|
INNER JOIN incident_management_oncall_schedules AS schedules ON schedules.id = through_escalations.schedule_id
|
|
INNER JOIN incident_management_escalation_policies AS policies ON policies.project_id = schedules.project_id
|
|
INNER JOIN incident_management_escalation_rules AS rules ON rules.policy_id = policies.id
|
|
WHERE escalations.rule_id IS NULL
|
|
AND rules.status = escalations.status
|
|
AND rules.oncall_schedule_id = escalations.schedule_id
|
|
AND rules.elapsed_time_seconds = #{ELAPSED_WHOLE_MINUTES_IN_SECONDS};
|
|
SQL
|
|
|
|
DELETE_LEFTOVER_ESCALATIONS_WITHOUT_RULES = 'DELETE FROM incident_management_pending_alert_escalations WHERE rule_id IS NULL;'
|
|
|
|
# For each alert which has a pending escalation without a corresponding rule,
|
|
# create a rule with the expected attributes for the project's policy.
|
|
#
|
|
# Deletes all escalations without rules/policy & adds non-null constraint for rule_id.
|
|
def up
|
|
exec_query INSERT_RULES_FOR_ESCALATIONS_WITHOUT_RULES
|
|
exec_query UPDATE_EMPTY_RULE_IDS
|
|
exec_query DELETE_LEFTOVER_ESCALATIONS_WITHOUT_RULES
|
|
|
|
change_column_null :incident_management_pending_alert_escalations, :rule_id, false
|
|
end
|
|
|
|
def down
|
|
change_column_null :incident_management_pending_alert_escalations, :rule_id, true
|
|
end
|
|
end
|