Have it take the semaphores as arguments. This allows using a simple attr_reader for the semaphore names. It also makes sure the semaphore name array is frozen.
79 lines
2.0 KiB
Ruby
79 lines
2.0 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require_relative "../model"
|
|
|
|
require "pagerduty"
|
|
require "openssl"
|
|
|
|
class Page < Sequel::Model
|
|
dataset_module do
|
|
where :active, resolved_at: nil
|
|
end
|
|
|
|
# This cannot be covered, as the current coverage tests run without freezing models.
|
|
# :nocov:
|
|
def self.freeze
|
|
pagerduty_client
|
|
super
|
|
end
|
|
# :nocov:
|
|
|
|
def self.pagerduty_client
|
|
@pagerduty_client ||= Pagerduty.build(integration_key: Config.pagerduty_key, api_version: 2)
|
|
end
|
|
|
|
plugin SemaphoreMethods, :resolve
|
|
plugin ResourceMethods
|
|
|
|
def pagerduty_client
|
|
self.class.pagerduty_client
|
|
end
|
|
|
|
def trigger
|
|
return unless Config.pagerduty_key
|
|
|
|
links = []
|
|
details.fetch("related_resources", []).each do |ubid|
|
|
links << {href: Config.pagerduty_log_link.gsub("<ubid>", ubid), text: "View #{ubid} Logs"} if Config.pagerduty_log_link
|
|
end
|
|
|
|
pagerduty_incident.trigger(summary:, severity:, source: "clover", custom_details: details, links:)
|
|
end
|
|
|
|
def resolve
|
|
this.update(resolved_at: Sequel::CURRENT_TIMESTAMP)
|
|
|
|
return unless Config.pagerduty_key
|
|
|
|
pagerduty_incident.resolve
|
|
end
|
|
|
|
def self.generate_tag(*tag_parts)
|
|
tag_parts.join("-")
|
|
end
|
|
|
|
def self.from_tag_parts(*tag_parts)
|
|
tag = Page.generate_tag(tag_parts)
|
|
Page.active.where(tag: tag).first
|
|
end
|
|
|
|
private
|
|
|
|
def pagerduty_incident
|
|
pagerduty_client.incident(OpenSSL::HMAC.hexdigest("SHA256", "ubicloud-page-key", tag))
|
|
end
|
|
end
|
|
|
|
# Table: page
|
|
# Columns:
|
|
# id | uuid | PRIMARY KEY
|
|
# created_at | timestamp with time zone | NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
# resolved_at | timestamp with time zone |
|
|
# summary | text |
|
|
# tag | text | NOT NULL
|
|
# details | jsonb | NOT NULL DEFAULT '{}'::jsonb
|
|
# severity | page_severity | NOT NULL DEFAULT 'error'::page_severity
|
|
# Indexes:
|
|
# page_pkey | PRIMARY KEY btree (id)
|
|
# page_tag_index | UNIQUE btree (tag) WHERE resolved_at IS NULL
|