Fix specs for container repository model class
This commit is contained in:
parent
ea16ea5bfc
commit
f451173a19
|
@ -1,16 +1,23 @@
|
||||||
class ContainerRepository < ActiveRecord::Base
|
class ContainerRepository < ActiveRecord::Base
|
||||||
belongs_to :project
|
belongs_to :project
|
||||||
|
delegate :client, to: :registry
|
||||||
delegate :container_registry, to: :project
|
|
||||||
delegate :client, to: :container_registry
|
|
||||||
|
|
||||||
validates :manifest, presence: true
|
validates :manifest, presence: true
|
||||||
|
validates :name, presence: true
|
||||||
before_destroy :delete_tags
|
before_destroy :delete_tags
|
||||||
|
|
||||||
def registry
|
def registry
|
||||||
# TODO, container registry with image access level
|
@registry ||= begin
|
||||||
token = Auth::ContainerRegistryAuthenticationService.image_token(self)
|
token = Auth::ContainerRegistryAuthenticationService.full_access_token(path)
|
||||||
|
|
||||||
|
url = Gitlab.config.registry.api_url
|
||||||
|
host_port = Gitlab.config.registry.host_port
|
||||||
|
|
||||||
|
ContainerRegistry::Registry.new(url, token: token, path: host_port)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def path
|
||||||
|
@path ||= "#{project.full_path}/#{name}"
|
||||||
end
|
end
|
||||||
|
|
||||||
def tag(tag)
|
def tag(tag)
|
||||||
|
|
|
@ -1,22 +0,0 @@
|
||||||
FactoryGirl.define do
|
|
||||||
factory :container_image do
|
|
||||||
name "test_container_image"
|
|
||||||
project
|
|
||||||
|
|
||||||
transient do
|
|
||||||
tags ['tag']
|
|
||||||
stubbed true
|
|
||||||
end
|
|
||||||
|
|
||||||
after(:build) do |image, evaluator|
|
|
||||||
if evaluator.stubbed
|
|
||||||
allow(Gitlab.config.registry).to receive(:enabled).and_return(true)
|
|
||||||
allow(Auth::ContainerRegistryAuthenticationService).to receive(:full_access_token).and_return('token')
|
|
||||||
allow(image.client).to receive(:repository_tags).and_return({
|
|
||||||
name: image.name_with_namespace,
|
|
||||||
tags: evaluator.tags
|
|
||||||
})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
FactoryGirl.define do
|
||||||
|
factory :container_repository do
|
||||||
|
name "test_container_image"
|
||||||
|
project
|
||||||
|
|
||||||
|
transient do
|
||||||
|
tags ['tag']
|
||||||
|
end
|
||||||
|
|
||||||
|
after(:build) do |image, evaluator|
|
||||||
|
# if evaluator.tags.to_a.any?
|
||||||
|
# allow(Gitlab.config.registry).to receive(:enabled).and_return(true)
|
||||||
|
# allow(Auth::ContainerRegistryAuthenticationService)
|
||||||
|
# .to receive(:full_access_token).and_return('token')
|
||||||
|
# allow(image.client).to receive(:repository_tags).and_return({
|
||||||
|
# name: image.name_with_namespace,
|
||||||
|
# tags: evaluator.tags
|
||||||
|
# })
|
||||||
|
# end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,73 +0,0 @@
|
||||||
require 'spec_helper'
|
|
||||||
|
|
||||||
describe ContainerImage do
|
|
||||||
let(:group) { create(:group, name: 'group') }
|
|
||||||
let(:project) { create(:project, path: 'test', group: group) }
|
|
||||||
let(:example_host) { 'example.com' }
|
|
||||||
let(:registry_url) { 'http://' + example_host }
|
|
||||||
let(:container_image) { create(:container_image, name: '', project: project, stubbed: false) }
|
|
||||||
|
|
||||||
before do
|
|
||||||
stub_container_registry_config(enabled: true, api_url: registry_url, host_port: example_host)
|
|
||||||
stub_request(:get, 'http://example.com/v2/group/test/tags/list').
|
|
||||||
with(headers: { 'Accept' => 'application/vnd.docker.distribution.manifest.v2+json' }).
|
|
||||||
to_return(
|
|
||||||
status: 200,
|
|
||||||
body: JSON.dump(tags: ['test']),
|
|
||||||
headers: { 'Content-Type' => 'application/json' })
|
|
||||||
end
|
|
||||||
|
|
||||||
it { expect(container_image).to respond_to(:project) }
|
|
||||||
it { expect(container_image).to delegate_method(:container_registry).to(:project) }
|
|
||||||
it { expect(container_image).to delegate_method(:client).to(:container_registry) }
|
|
||||||
it { expect(container_image.tag('test')).not_to be_nil }
|
|
||||||
|
|
||||||
context '#path' do
|
|
||||||
subject { container_image.path }
|
|
||||||
|
|
||||||
it { is_expected.to eq('example.com/group/test') }
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'manifest processing' do
|
|
||||||
context '#manifest' do
|
|
||||||
subject { container_image.manifest }
|
|
||||||
|
|
||||||
it { is_expected.not_to be_nil }
|
|
||||||
end
|
|
||||||
|
|
||||||
context '#valid?' do
|
|
||||||
subject { container_image.valid? }
|
|
||||||
|
|
||||||
it { is_expected.to be_truthy }
|
|
||||||
end
|
|
||||||
|
|
||||||
context '#tags' do
|
|
||||||
subject { container_image.tags }
|
|
||||||
|
|
||||||
it { is_expected.not_to be_empty }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context '#delete_tags' do
|
|
||||||
let(:tag) { ContainerRegistry::Tag.new(container_image, 'tag') }
|
|
||||||
|
|
||||||
before do
|
|
||||||
expect(container_image).to receive(:tags).twice.and_return([tag])
|
|
||||||
expect(tag).to receive(:digest).and_return('sha256:4c8e63ca4cb663ce6c688cb06f1c3672a172b088dac5b6d7ad7d49cd620d85cf')
|
|
||||||
end
|
|
||||||
|
|
||||||
subject { container_image.delete_tags }
|
|
||||||
|
|
||||||
context 'succeeds' do
|
|
||||||
before { expect(container_image.client).to receive(:delete_repository_tag).and_return(true) }
|
|
||||||
|
|
||||||
it { is_expected.to be_truthy }
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'any fails' do
|
|
||||||
before { expect(container_image.client).to receive(:delete_repository_tag).and_return(false) }
|
|
||||||
|
|
||||||
it { is_expected.to be_falsey }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -0,0 +1,96 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe ContainerRepository do
|
||||||
|
let(:group) { create(:group, name: 'group') }
|
||||||
|
let(:project) { create(:project, path: 'test', group: group) }
|
||||||
|
|
||||||
|
let(:container_repository) do
|
||||||
|
create(:container_repository, name: 'my_image', project: project)
|
||||||
|
end
|
||||||
|
|
||||||
|
before do
|
||||||
|
stub_container_registry_config(enabled: true,
|
||||||
|
api_url: 'http://registry.gitlab',
|
||||||
|
host_port: 'registry.gitlab')
|
||||||
|
|
||||||
|
stub_request(:get, 'http://registry.gitlab/v2/group/test/my_image/tags/list')
|
||||||
|
.with(headers: {
|
||||||
|
'Accept' => 'application/vnd.docker.distribution.manifest.v2+json' })
|
||||||
|
.to_return(
|
||||||
|
status: 200,
|
||||||
|
body: JSON.dump(tags: ['test_tag']),
|
||||||
|
headers: { 'Content-Type' => 'application/json' })
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'associations' do
|
||||||
|
it 'belongs to the project' do
|
||||||
|
expect(container_repository).to belong_to(:project)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#tag' do
|
||||||
|
it 'has a test tag' do
|
||||||
|
expect(container_repository.tag('test')).not_to be_nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#path' do
|
||||||
|
it 'returns a full path to the repository' do
|
||||||
|
expect(container_repository.path).to eq('group/test/my_image')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#manifest' do
|
||||||
|
subject { container_repository.manifest }
|
||||||
|
|
||||||
|
it { is_expected.not_to be_nil }
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#valid?' do
|
||||||
|
subject { container_repository.valid? }
|
||||||
|
|
||||||
|
it { is_expected.to be_truthy }
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#tags' do
|
||||||
|
subject { container_repository.tags }
|
||||||
|
|
||||||
|
it { is_expected.not_to be_empty }
|
||||||
|
end
|
||||||
|
|
||||||
|
# TODO, improve these specs
|
||||||
|
#
|
||||||
|
describe '#delete_tags' do
|
||||||
|
let(:tag) { ContainerRegistry::Tag.new(container_repository, 'tag') }
|
||||||
|
|
||||||
|
before do
|
||||||
|
allow(container_repository).to receive(:tags).twice.and_return([tag])
|
||||||
|
allow(tag).to receive(:digest)
|
||||||
|
.and_return('sha256:4c8e63ca4cb663ce6c688cb06f1c3672a172b088dac5b6d7ad7d49cd620d85cf')
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when action succeeds' do
|
||||||
|
before do
|
||||||
|
allow(container_repository.client)
|
||||||
|
.to receive(:delete_repository_tag)
|
||||||
|
.and_return(true)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns status that indicates success' do
|
||||||
|
expect(container_repository.delete_tags).to be_truthy
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when action fails' do
|
||||||
|
before do
|
||||||
|
allow(container_repository.client)
|
||||||
|
.to receive(:delete_repository_tag)
|
||||||
|
.and_return(false)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns status that indicates failure' do
|
||||||
|
expect(container_repository.delete_tags).to be_falsey
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue