From 35487a1e925f7b4ec72a3d0cdde94f92582d2087 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Sat, 25 Jan 2020 09:08:46 +0000 Subject: Add latest changes from gitlab-org/gitlab@master --- app/models/serverless/domain_cluster.rb | 9 +++++-- .../prometheus/queries/knative_invocation_query.rb | 2 +- lib/gitlab/serverless/domain.rb | 13 +++++++++ spec/factories/serverless/domain_cluster.rb | 1 - spec/lib/gitlab/serverless/domain_spec.rb | 22 +++++++++++++++ spec/models/serverless/domain_cluster_spec.rb | 31 ++++++++++++++++++++-- 6 files changed, 72 insertions(+), 6 deletions(-) create mode 100644 lib/gitlab/serverless/domain.rb create mode 100644 spec/lib/gitlab/serverless/domain_spec.rb diff --git a/app/models/serverless/domain_cluster.rb b/app/models/serverless/domain_cluster.rb index a8365649dd1..44463a56327 100644 --- a/app/models/serverless/domain_cluster.rb +++ b/app/models/serverless/domain_cluster.rb @@ -4,11 +4,16 @@ module Serverless class DomainCluster < ApplicationRecord self.table_name = 'serverless_domain_cluster' + HEX_REGEXP = %r{\A\h+\z}.freeze + belongs_to :pages_domain belongs_to :knative, class_name: 'Clusters::Applications::Knative', foreign_key: 'clusters_applications_knative_id' belongs_to :creator, class_name: 'User', optional: true - validates :pages_domain, :knative, :uuid, presence: true - validates :uuid, uniqueness: true, length: { is: 14 } + validates :pages_domain, :knative, presence: true + validates :uuid, presence: true, uniqueness: true, length: { is: Gitlab::Serverless::Domain::UUID_LENGTH }, + format: { with: HEX_REGEXP, message: 'only allows hex characters' } + + default_value_for(:uuid, allows_nil: false) { Gitlab::Serverless::Domain.generate_uuid } end end diff --git a/lib/gitlab/prometheus/queries/knative_invocation_query.rb b/lib/gitlab/prometheus/queries/knative_invocation_query.rb index 8873608c411..abc90bad9c3 100644 --- a/lib/gitlab/prometheus/queries/knative_invocation_query.rb +++ b/lib/gitlab/prometheus/queries/knative_invocation_query.rb @@ -20,7 +20,7 @@ module Gitlab protected def context(function_id) - function = Serverless::Function.find_by_id(function_id) + function = ::Serverless::Function.find_by_id(function_id) { function_name: function.name, kube_namespace: function.namespace diff --git a/lib/gitlab/serverless/domain.rb b/lib/gitlab/serverless/domain.rb new file mode 100644 index 00000000000..ec7c68764d1 --- /dev/null +++ b/lib/gitlab/serverless/domain.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module Gitlab + module Serverless + class Domain + UUID_LENGTH = 14 + + def self.generate_uuid + SecureRandom.hex(UUID_LENGTH / 2) + end + end + end +end diff --git a/spec/factories/serverless/domain_cluster.rb b/spec/factories/serverless/domain_cluster.rb index 5adfcacbd7f..24893f4a613 100644 --- a/spec/factories/serverless/domain_cluster.rb +++ b/spec/factories/serverless/domain_cluster.rb @@ -5,6 +5,5 @@ FactoryBot.define do pages_domain { create(:pages_domain) } knative { create(:clusters_applications_knative) } creator { create(:user) } - uuid { SecureRandom.hex(7) } end end diff --git a/spec/lib/gitlab/serverless/domain_spec.rb b/spec/lib/gitlab/serverless/domain_spec.rb new file mode 100644 index 00000000000..ae5551977d4 --- /dev/null +++ b/spec/lib/gitlab/serverless/domain_spec.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Gitlab::Serverless::Domain do + describe '.generate_uuid' do + it 'has 14 characters' do + expect(described_class.generate_uuid.length).to eq(described_class::UUID_LENGTH) + end + + it 'consists of only hexadecimal characters' do + expect(described_class.generate_uuid).to match(/\A\h+\z/) + end + + it 'uses random characters' do + uuid = 'abcd1234567890' + + expect(SecureRandom).to receive(:hex).with(described_class::UUID_LENGTH / 2).and_return(uuid) + expect(described_class.generate_uuid).to eq(uuid) + end + end +end diff --git a/spec/models/serverless/domain_cluster_spec.rb b/spec/models/serverless/domain_cluster_spec.rb index 73d7d64d35e..b5ed1df4f45 100644 --- a/spec/models/serverless/domain_cluster_spec.rb +++ b/spec/models/serverless/domain_cluster_spec.rb @@ -8,10 +8,17 @@ describe Serverless::DomainCluster do describe 'validations' do it { is_expected.to validate_presence_of(:pages_domain) } it { is_expected.to validate_presence_of(:knative) } - it { is_expected.to validate_presence_of(:uuid) } + it { is_expected.to validate_presence_of(:uuid) } + it { is_expected.to validate_length_of(:uuid).is_equal_to(Gitlab::Serverless::Domain::UUID_LENGTH) } it { is_expected.to validate_uniqueness_of(:uuid) } - it { is_expected.to validate_length_of(:uuid).is_equal_to(14) } + + it 'validates that uuid has only hex characters' do + subject = build(:serverless_domain_cluster, uuid: 'z1234567890123') + subject.valid? + + expect(subject.errors[:uuid]).to include('only allows hex characters') + end end describe 'associations' do @@ -19,4 +26,24 @@ describe Serverless::DomainCluster do it { is_expected.to belong_to(:knative) } it { is_expected.to belong_to(:creator).optional } end + + describe 'uuid' do + context 'when nil' do + it 'generates a value by default' do + attributes = build(:serverless_domain_cluster).attributes.merge(uuid: nil) + expect(Gitlab::Serverless::Domain).to receive(:generate_uuid).and_call_original + + subject = Serverless::DomainCluster.new(attributes) + + expect(subject.uuid).not_to be_blank + end + end + + context 'when not nil' do + it 'does not override the existing value' do + uuid = 'abcd1234567890' + expect(build(:serverless_domain_cluster, uuid: uuid).uuid).to eq(uuid) + end + end + end end -- cgit v1.2.1