spec/gitlab/qa/release_spec.rb (599 lines of code) (raw):
# frozen_string_literal: true
describe Gitlab::QA::Release do
let(:specific_ce_tag) { '10.8.4-ce.0' }
let(:specific_ce_qa_tag) { '10.8.4-ce' }
let(:specific_ee_tag) { '11.0.0-rc5.ee.1' }
let(:specific_ee_qa_tag) { '11.0.0-rc5-ee' }
let(:specific_version_timestamp_refs_tag) { '12.4.201910071518-933febe7c6d.aae3944cae6' }
let(:gitlab_ref) { '933febe7c6d' }
let(:full_ce_address) { 'registry.gitlab.com:5000/foo/gitlab/gitlab-ce' }
let(:full_ce_address_with_simple_tag) { "#{full_ce_address}:latest" }
let(:full_ce_address_with_complex_tag) { "#{full_ce_address}:#{specific_ce_tag}" }
let(:full_ee_address) { 'registry.gitlab.com:5000/foo/gitlab/gitlab-ee' }
let(:full_ee_address_with_simple_tag) { "#{full_ee_address}:latest" }
let(:full_ee_address_with_complex_tag) { "#{full_ee_address}:#{specific_ee_tag}" }
let(:dev_address) { 'dev.gitlab.org:5005/gitlab/omnibus-gitlab/gitlab-ee' }
let(:full_dev_address) { "#{dev_address}:latest" }
let(:full_dev_address_with_version_timestamp_refs_tag) { "#{dev_address}:#{specific_version_timestamp_refs_tag}" }
let(:ce_image) { 'gitlab/gitlab-ce' }
let(:ee_image) { 'gitlab/gitlab-ee' }
let(:ce_qa_image) { "#{ce_image}-qa" }
let(:full_ce_qa_image) { "#{full_ce_address}-qa" }
let(:full_ee_qa_image) { "#{full_ee_address}-qa" }
let(:dev_qa_address) { "dev.gitlab.org:5005/gitlab/gitlab-ee/gitlab-ee-qa" }
let(:omnibus_mirror_image) do
"registry.gitlab.com/gitlab-org/build/omnibus-gitlab-mirror/gitlab-ee:db5d4783b4689cb78c32f613b8888e06684097e5"
end
describe '#initialize' do
context 'when release is valid' do
subject(:release) { described_class.new('ce') }
it 'does not raise an error' do
expect { release }.not_to raise_error described_class::InvalidImageNameError
end
end
context 'when release is invalid' do
subject(:release) { described_class.new('--') }
it 'raises an error' do
expect { release }.to raise_error described_class::InvalidImageNameError
end
end
end
describe '#to_s' do
context 'when release is ce' do
subject(:release) { described_class.new('ce') }
it { expect(release.to_s).to eq 'gitlab/gitlab-ce:nightly' }
end
context 'when release is CE' do
subject(:release) { described_class.new('CE') }
it { expect(release.to_s).to eq 'gitlab/gitlab-ce:nightly' }
end
context 'when release is EE' do
subject(:release) { described_class.new('EE') }
it { expect(release.to_s).to eq 'gitlab/gitlab-ee:nightly' }
end
context 'when release is EDITION:tag' do
subject(:release) { described_class.new("CE:#{specific_ce_tag}") }
it { expect(release.to_s).to eq "gitlab/gitlab-ce:#{specific_ce_tag}" }
end
context 'when release is edition:tag' do
subject(:release) { described_class.new("ce:#{specific_ce_tag}") }
it { expect(release.to_s).to eq "gitlab/gitlab-ce:#{specific_ce_tag}" }
end
context 'when release is a full CE address' do
context 'without a tag' do
subject(:release) { described_class.new(full_ce_address) }
it { expect(release.to_s).to eq full_ce_address_with_simple_tag }
end
context 'with a simple tag' do
subject(:release) { described_class.new(full_ce_address_with_simple_tag) }
it { expect(release.to_s).to eq full_ce_address_with_simple_tag }
end
context 'with a complex tag' do
subject(:release) { described_class.new(full_ce_address_with_complex_tag) }
it { expect(release.to_s).to eq full_ce_address_with_complex_tag }
end
end
context 'when release is a full EE address' do
context 'with a simple tag' do
subject(:release) { described_class.new(full_ee_address_with_simple_tag) }
it { expect(release.to_s).to eq full_ee_address_with_simple_tag }
end
context 'with a complex tag' do
subject(:release) { described_class.new(full_ee_address_with_complex_tag) }
it { expect(release.to_s).to eq full_ee_address_with_complex_tag }
end
end
context 'when release is a QA image' do
subject(:release) { described_class.new("#{ce_qa_image}:latest") }
it { expect(release.to_s).to eq "#{ce_image}:latest" }
end
context 'when release is a full QA image' do
subject(:release) { described_class.new("#{full_ce_qa_image}:latest") }
it { expect(release.to_s).to eq "#{full_ce_address}:latest" }
end
end
describe '#previous_stable' do
context 'when release is CE' do
subject(:release) { described_class.new('CE').previous_stable }
it { expect(release.image).to eq 'gitlab/gitlab-ce' }
it { expect(release.tag).to eq 'latest' }
end
context 'when release is EE' do
subject(:release) { described_class.new('EE').previous_stable }
it { expect(release.image).to eq 'gitlab/gitlab-ee' }
it { expect(release.tag).to eq 'latest' }
end
context 'when release is edition:tag' do
subject(:release) { described_class.new("ce:#{specific_ce_tag}") }
it { expect(release.image).to eq 'gitlab/gitlab-ce' }
it { expect(release.tag).to eq specific_ce_tag }
end
context 'when release is a full CE address' do
context 'with a simple tag' do
subject(:release) do
described_class.new(full_ce_address_with_simple_tag).previous_stable
end
it { expect(release.image).to eq 'gitlab/gitlab-ce' }
it { expect(release.tag).to eq 'latest' }
end
context 'with a complex tag' do
subject(:release) do
described_class.new(full_ce_address_with_complex_tag).previous_stable
end
it { expect(release.image).to eq 'gitlab/gitlab-ce' }
it { expect(release.tag).to eq 'latest' }
end
end
context 'when release is a full EE address' do
context 'with a simple tag' do
subject(:release) do
described_class.new(full_ee_address_with_simple_tag).previous_stable
end
it { expect(release.image).to eq 'gitlab/gitlab-ee' }
it { expect(release.tag).to eq 'latest' }
end
context 'with a complex tag' do
subject(:release) do
described_class.new(full_ee_address_with_complex_tag).previous_stable
end
it { expect(release.image).to eq 'gitlab/gitlab-ee' }
it { expect(release.tag).to eq 'latest' }
end
end
context 'when release is a QA image' do
subject(:release) do
described_class.new("#{ce_qa_image}:nightly").previous_stable
end
it { expect(release.image).to eq ce_image }
it { expect(release.tag).to eq 'latest' }
end
context 'when release is a full QA image' do
subject(:release) do
described_class.new("#{full_ce_qa_image}:nightly").previous_stable
end
it { expect(release.image).to eq ce_image }
it { expect(release.tag).to eq 'latest' }
end
end
describe '#edition' do
context 'when release is CE' do
subject(:release) { described_class.new('CE') }
it { expect(release.edition).to eq :ce }
end
context 'when release is EE' do
subject(:release) { described_class.new('EE') }
it { expect(release.edition).to eq :ee }
end
context 'when release is edition:tag' do
subject(:release) { described_class.new("ce:#{specific_ce_tag}") }
it { expect(release.edition).to eq :ce }
end
context 'when release is a full CE address' do
context 'with a simple tag' do
subject(:release) { described_class.new(full_ce_address_with_simple_tag) }
it { expect(release.edition).to eq :ce }
end
context 'with a complex tag' do
subject(:release) { described_class.new(full_ce_address_with_complex_tag) }
it { expect(release.edition).to eq :ce }
end
end
context 'when release is a full EE address' do
context 'with a simple tag' do
subject(:release) { described_class.new(full_ee_address_with_simple_tag) }
it { expect(release.edition).to eq :ee }
end
context 'with a complex tag' do
subject(:release) { described_class.new(full_ee_address_with_complex_tag) }
it { expect(release.edition).to eq :ee }
end
end
context 'when release is a QA image' do
subject(:release) { described_class.new("#{ce_qa_image}:latest") }
it { expect(release.edition).to eq :ce }
end
context 'when release is a full QA image' do
subject(:release) { described_class.new("#{full_ce_qa_image}:latest") }
it { expect(release.edition).to eq :ce }
end
end
describe '#ee?' do
context 'when release is CE' do
subject(:release) { described_class.new('CE') }
it { expect(release).not_to be_ee }
end
context 'when release is EE' do
subject(:release) { described_class.new('EE') }
it { expect(release).to be_ee }
end
context 'when release is edition:tag' do
subject(:release) { described_class.new("ce:#{specific_ce_tag}") }
it { expect(release).not_to be_ee }
end
context 'when release is a full CE address' do
context 'with a simple tag' do
subject(:release) { described_class.new(full_ce_address_with_simple_tag) }
it { expect(release).not_to be_ee }
end
context 'with a complex tag' do
subject(:release) { described_class.new(full_ce_address_with_complex_tag) }
it { expect(release).not_to be_ee }
end
end
context 'when release is a full EE address' do
context 'with a simple tag' do
subject(:release) { described_class.new(full_ee_address_with_simple_tag) }
it { expect(release).to be_ee }
end
context 'with a complex tag' do
subject(:release) { described_class.new(full_ee_address_with_complex_tag) }
it { expect(release).to be_ee }
end
end
context 'when release is a QA image' do
subject(:release) { described_class.new("#{ce_qa_image}:latest") }
it { expect(release).not_to be_ee }
end
context 'when release is a full QA image' do
subject(:release) { described_class.new("#{full_ce_qa_image}:latest") }
it { expect(release).not_to be_ee }
end
end
describe '#to_ee' do
context 'when release is CE' do
subject(:release) { described_class.new('CE') }
it { expect(release.to_ee.to_s).to eq 'gitlab/gitlab-ee:nightly' }
end
context 'when release is EE' do
subject(:release) { described_class.new('EE') }
it { expect(release.to_ee.to_s).to eq release.to_s }
end
context 'when release is edition:tag' do
subject(:release) { described_class.new("ce:#{specific_ce_tag}") }
it { expect(release.to_ee.to_s).to eq "gitlab/gitlab-ee:#{specific_ce_tag}" }
end
context 'when tag includes `ce`' do
subject(:release) { described_class.new('CE:abcdcef') }
it { expect(release.to_ee.to_s).to eq 'gitlab/gitlab-ee:abcdcef' }
end
context 'when tag includes `ee`' do
subject(:release) { described_class.new('CE:abcdeef') }
it { expect(release.to_ee.to_s).to eq 'gitlab/gitlab-ee:abcdeef' }
end
context 'when release is a full CE address' do
context 'with a simple tag' do
subject(:release) { described_class.new(full_ce_address_with_simple_tag) }
it { expect(release.to_ee.to_s).to eq full_ee_address_with_simple_tag }
end
context 'with a complex tag' do
subject(:release) { described_class.new(full_ce_address_with_complex_tag) }
it { expect(release.to_ee.to_s).to eq "#{full_ee_address}:#{specific_ce_tag}" }
end
context 'with `ce` in the address outside of the image' do
let(:ce_image) { 'registry.gitlab.com/cef/gitlab/gitlab-ce:latest' }
let(:ee_image) { 'registry.gitlab.com/cef/gitlab/gitlab-ee:latest' }
subject(:release) { described_class.new(ce_image) }
it { expect(release.to_ee.to_s).to eq ee_image }
end
end
context 'when release is a full EE address' do
context 'with a simple tag' do
subject(:release) { described_class.new(full_ee_address_with_simple_tag) }
it { expect(release.to_ee.to_s).to eq release.to_s }
end
context 'with a complex tag' do
subject(:release) { described_class.new(full_ee_address_with_complex_tag) }
it { expect(release.to_ee.to_s).to eq release.to_s }
end
end
context 'when release is a QA image' do
subject(:release) { described_class.new("#{ce_qa_image}:latest") }
it { expect(release.to_ee.to_s).to eq "#{ee_image}:latest" }
end
context 'when release is a full QA image' do
subject(:release) { described_class.new("#{full_ce_qa_image}:latest") }
it { expect(release.to_ee.to_s).to eq "#{full_ee_address}:latest" }
end
end
describe '#image' do
context 'when release is CE' do
subject(:release) { described_class.new('CE') }
it { expect(release.image).to eq 'gitlab/gitlab-ce' }
end
context 'when release is EE' do
subject(:release) { described_class.new('EE') }
it { expect(release.image).to eq 'gitlab/gitlab-ee' }
end
context 'when release is edition:tag' do
subject(:release) { described_class.new("ce:#{specific_ce_tag}") }
it { expect(release.image).to eq 'gitlab/gitlab-ce' }
end
context 'when release is a full CE address' do
context 'with a simple tag' do
subject(:release) { described_class.new(full_ce_address_with_simple_tag) }
it { expect(release.image).to eq full_ce_address }
end
context 'with a complex tag' do
subject(:release) { described_class.new(full_ce_address_with_complex_tag) }
it { expect(release.image).to eq full_ce_address }
end
end
context 'when release is a full EE address' do
context 'with a simple tag' do
subject(:release) { described_class.new(full_ee_address_with_simple_tag) }
it { expect(release.image).to eq full_ee_address }
end
context 'with a complex tag' do
subject(:release) { described_class.new(full_ee_address_with_complex_tag) }
it { expect(release.image).to eq full_ee_address }
end
end
context 'when release is a QA image' do
subject(:release) { described_class.new("#{ce_qa_image}:latest") }
it { expect(release.image).to eq ce_image }
end
context 'when release is a full QA image' do
subject(:release) { described_class.new("#{full_ce_qa_image}:latest") }
it { expect(release.image).to eq full_ce_address }
end
end
describe '#qa_image' do
context 'when release is CE' do
subject(:release) { described_class.new('CE') }
it { expect(release.qa_image).to eq 'gitlab/gitlab-ce-qa' }
end
context 'when release is EE' do
subject(:release) { described_class.new('EE') }
it { expect(release.qa_image).to eq 'gitlab/gitlab-ee-qa' }
end
context 'when release is a full CE address' do
context 'with a simple tag' do
subject(:release) { described_class.new(full_ce_address_with_simple_tag) }
it { expect(release.qa_image).to eq "#{full_ce_address}-qa" }
end
context 'with a complex tag' do
subject(:release) { described_class.new(full_ce_address_with_complex_tag) }
it { expect(release.qa_image).to eq "#{full_ce_address}-qa" }
end
end
context 'when release is a full EE address' do
context 'with a simple tag' do
subject(:release) { described_class.new(full_ee_address_with_simple_tag) }
it { expect(release.qa_image).to eq full_ee_qa_image }
end
context 'with a complex tag' do
subject(:release) { described_class.new(full_ee_address_with_complex_tag) }
it { expect(release.qa_image).to eq full_ee_qa_image }
end
end
context 'when release is a QA image' do
subject(:release) { described_class.new("#{ce_qa_image}:latest") }
it { expect(release.qa_image).to eq ce_qa_image }
end
context 'when release is a full QA image' do
subject(:release) { described_class.new("#{full_ce_qa_image}:latest") }
it { expect(release.qa_image).to eq full_ce_qa_image }
end
context 'when release is a dev image with gitlab ref in tag' do
subject(:release) { described_class.new(full_dev_address_with_version_timestamp_refs_tag) }
it { expect(release.qa_image).to eq dev_qa_address }
end
end
describe '#project_name' do
context 'when release is CE' do
subject(:release) { described_class.new('CE') }
it { expect(release.project_name).to eq 'gitlab-ce' }
end
context 'when release is EE' do
subject(:release) { described_class.new('EE') }
it { expect(release.project_name).to eq 'gitlab-ee' }
end
context 'when release is edition:tag' do
subject(:release) { described_class.new("ce:#{specific_ce_tag}") }
it { expect(release.project_name).to eq 'gitlab-ce' }
end
context 'when release is a QA image' do
subject(:release) { described_class.new("#{ce_qa_image}:latest") }
it { expect(release.project_name).to eq 'gitlab-ce' }
end
context 'when release is a full QA image' do
subject(:release) { described_class.new("#{full_ce_qa_image}:latest") }
it { expect(release.project_name).to eq 'gitlab-ce' }
end
end
describe '#tag' do
context 'when release is CE' do
subject(:release) { described_class.new('CE') }
it { expect(release.tag).to eq 'nightly' }
end
context 'when release is EE' do
subject(:release) { described_class.new('EE') }
it { expect(release.tag).to eq 'nightly' }
end
context 'when release is edition:tag' do
subject(:release) { described_class.new("ce:#{specific_ce_tag}") }
it { expect(release.tag).to eq specific_ce_tag }
end
context 'when release is a full CE address' do
context 'with a simple tag' do
subject(:release) { described_class.new(full_ce_address_with_simple_tag) }
it { expect(release.tag).to eq 'latest' }
end
context 'with a complex tag' do
subject(:release) { described_class.new(full_ce_address_with_complex_tag) }
it { expect(release.tag).to eq specific_ce_tag }
end
end
context 'when release is a full EE address' do
context 'with a simple tag' do
subject(:release) { described_class.new(full_ee_address_with_simple_tag) }
it { expect(release.tag).to eq 'latest' }
end
context 'with a complex tag' do
subject(:release) { described_class.new(full_ee_address_with_complex_tag) }
it { expect(release.tag).to eq specific_ee_tag }
end
end
context 'when release is a QA image without a tag' do
subject(:release) { described_class.new(ce_qa_image) }
it { expect(release.tag).to eq 'latest' }
end
context 'when release is a QA image' do
subject(:release) { described_class.new("#{ce_qa_image}:nightly") }
it { expect(release.tag).to eq 'nightly' }
end
context 'when release is a full QA image' do
subject(:release) { described_class.new("#{full_ce_qa_image}:nightly") }
it { expect(release.tag).to eq 'nightly' }
end
end
describe '#qa_tag' do
context 'when release is CE' do
subject(:release) { described_class.new('CE') }
it { expect(release.qa_tag).to eq 'nightly' }
end
context 'when release is EE' do
subject(:release) { described_class.new('EE') }
it { expect(release.qa_tag).to eq 'nightly' }
end
context 'when release is a full CE address' do
context 'with a simple tag' do
subject(:release) { described_class.new(full_ce_address_with_simple_tag) }
it { expect(release.qa_tag).to eq 'latest' }
end
context 'with a complex tag' do
subject(:release) { described_class.new(full_ce_address_with_complex_tag) }
it { expect(release.qa_tag).to eq specific_ce_qa_tag }
end
end
context 'when release is a full EE address' do
context 'with a simple tag' do
subject(:release) { described_class.new(full_ee_address_with_simple_tag) }
it { expect(release.qa_tag).to eq 'latest' }
end
context 'with a complex tag' do
subject(:release) { described_class.new(full_ee_address_with_complex_tag) }
it { expect(release.qa_tag).to eq specific_ee_qa_tag }
end
end
context 'when tag is already in the good form' do
context 'with a simple tag' do
subject(:release) { described_class.new('ce:11.0.8-rc8-ee') }
it { expect(release.qa_tag).to eq '11.0.8-rc8-ee' }
end
context 'with a QA image and a numeric tag' do
subject(:release) { described_class.new('gitlab/gitlab-ce-qa:11.1.8') }
it { expect(release.qa_tag).to eq '11.1.8' }
end
end
context 'when release is a QA image without a tag' do
subject(:release) { described_class.new(ce_qa_image) }
it { expect(release.qa_tag).to eq 'latest' }
end
context 'when release is a QA image' do
subject(:release) { described_class.new("#{ce_qa_image}:nightly") }
it { expect(release.qa_tag).to eq 'nightly' }
end
context 'when release is a full QA image' do
subject(:release) { described_class.new("#{full_ce_qa_image}:nightly") }
it { expect(release.qa_tag).to eq 'nightly' }
end
context 'when release is a dev image with gitlab ref in tag' do
subject(:release) { described_class.new(full_dev_address_with_version_timestamp_refs_tag) }
it { expect(release.qa_tag).to eq gitlab_ref }
end
end
describe '#dev_gitlab_org?' do
context 'when release is CE' do
subject(:release) { described_class.new('CE') }
it { expect(release).not_to be_dev_gitlab_org }
end
context 'when release is EE' do
subject(:release) { described_class.new('EE') }
it { expect(release).not_to be_dev_gitlab_org }
end
context 'when release is a full address from non-dev' do
subject(:release) { described_class.new(full_ce_address_with_simple_tag) }
it { expect(release).not_to be_dev_gitlab_org }
end
context 'when release is a full address from dev' do
subject(:release) { described_class.new(full_dev_address) }
it { expect(release).to be_dev_gitlab_org }
end
end
describe '#omnibus_mirror?' do
before do
allow(Gitlab::QA::Runtime::Env).to receive(:ci_project_path).and_return("gitlab-org/gitlab")
end
context 'when image is a full ce address' do
subject(:release) { described_class.new(full_ce_address_with_simple_tag) }
it { expect(release.omnibus_mirror?).to be false }
end
context 'when image is a dev image' do
subject(:release) { described_class.new(full_dev_address) }
it { expect(release.omnibus_mirror?).to be false }
end
context 'when image is omnibus-mirror image' do
subject(:release) { described_class.new(omnibus_mirror_image) }
it { expect(release.omnibus_mirror?).to be true }
it { expect(release.qa_image).to eq("registry.gitlab.com/gitlab-org/gitlab/gitlab-ee-qa") }
end
end
describe '#api_project_name' do
context 'when release is ce' do
subject(:release) { described_class.new('ce') }
it { expect(release.api_project_name).to eq 'gitlab-foss' }
end
context 'when release is CE' do
subject(:release) { described_class.new('CE') }
it { expect(release.api_project_name).to eq 'gitlab-foss' }
end
context 'when release is ee' do
subject(:release) { described_class.new('ee') }
it { expect(release.api_project_name).to eq 'gitlab' }
end
context 'when release is EE' do
subject(:release) { described_class.new('EE') }
it { expect(release.api_project_name).to eq 'gitlab' }
end
context 'when release is EDITION:tag' do
subject(:release) { described_class.new("CE:#{specific_ce_tag}") }
it { expect(release.api_project_name).to eq 'gitlab-foss' }
end
context 'when release is edition:tag' do
subject(:release) { described_class.new("ce:#{specific_ce_tag}") }
it { expect(release.api_project_name).to eq 'gitlab-foss' }
end
context 'when release is a full CE address' do
context 'without a tag' do
subject(:release) { described_class.new(full_ce_address) }
it { expect(release.api_project_name).to eq 'gitlab-foss' }
end
context 'with a simple tag' do
subject(:release) { described_class.new(full_ce_address_with_simple_tag) }
it { expect(release.api_project_name).to eq 'gitlab-foss' }
end
context 'with a complex tag' do
subject(:release) { described_class.new(full_ce_address_with_complex_tag) }
it { expect(release.api_project_name).to eq 'gitlab-foss' }
end
end
context 'when release is a full EE address' do
context 'with a simple tag' do
subject(:release) { described_class.new(full_ee_address_with_simple_tag) }
it { expect(release.api_project_name).to eq 'gitlab' }
end
context 'with a complex tag' do
subject(:release) { described_class.new(full_ee_address_with_complex_tag) }
it { expect(release.api_project_name).to eq 'gitlab' }
end
end
context 'when release is a QA image' do
subject(:release) { described_class.new("#{ce_qa_image}:latest") }
it { expect(release.api_project_name).to eq 'gitlab-foss' }
end
context 'when release is a full QA image' do
subject(:release) { described_class.new("#{full_ce_qa_image}:latest") }
it { expect(release.api_project_name).to eq 'gitlab-foss' }
end
end
end