Files
ubicloud/model/page.rb
Jeremy Evans 30247a3800 Include model annotations at the bottom of all model files
This makes it easier for developers new to the codebase to
easily get important information on the model's table in the
same file as the model code.

To ensure the model annotations stay accurate, run them on
test_up/test_down.  In CI, regenerate the annotations, and
check for no changes, similar to how the linters work.
2024-11-13 09:13:30 -08:00

78 lines
2.1 KiB
Ruby

# frozen_string_literal: true
require_relative "../model"
require "pagerduty"
require "openssl"
class Page < Sequel::Model
dataset_module do
def active
where(resolved_at: nil)
end
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
include SemaphoreMethods
include ResourceMethods
semaphore :resolve
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
incident = pagerduty_client.incident(OpenSSL::HMAC.hexdigest("SHA256", "ubicloud-page-key", tag))
incident.trigger(summary: summary, severity: severity, source: "clover", custom_details: details, links: links)
end
def resolve
update(resolved_at: Time.now)
return unless Config.pagerduty_key
incident = pagerduty_client.incident(OpenSSL::HMAC.hexdigest("SHA256", "ubicloud-page-key", tag))
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
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