debian-mirror-gitlab/app/models/ci_platform_metric.rb
2020-11-24 15:15:51 +05:30

39 lines
1.4 KiB
Ruby

# frozen_string_literal: true
class CiPlatformMetric < ApplicationRecord
include BulkInsertSafe
PLATFORM_TARGET_MAX_LENGTH = 255
validates :recorded_at, presence: true
validates :platform_target,
exclusion: [nil], # allow '' (the empty string), but not nil
length: { maximum: PLATFORM_TARGET_MAX_LENGTH }
validates :count,
presence: true,
numericality: { only_integer: true, greater_than: 0 }
CI_VARIABLE_KEY = 'AUTO_DEVOPS_PLATFORM_TARGET'
ALLOWED_TARGETS = %w[ECS FARGATE].freeze
def self.insert_auto_devops_platform_targets!
recorded_at = Time.zone.now
# This work can NOT be done in-database because value is encrypted.
# However, for 'AUTO_DEVOPS_PLATFORM_TARGET', these values are only
# encrypted as a matter of course, rather than as a need for secrecy.
# So this is not a security risk, but exposing other keys possibly could be.
variables = Ci::Variable.by_key(CI_VARIABLE_KEY)
counts = variables.group_by(&:value).map do |value, variables|
# While this value is, in theory, not secret. A user could accidentally
# put a secret in here so we need to make sure we filter invalid values.
next unless ALLOWED_TARGETS.include?(value)
count = variables.count
self.new(recorded_at: recorded_at, platform_target: value, count: count)
end.compact
bulk_insert!(counts, validate: true)
end
end