Commit 7985026b authored by Kamil Trzciński's avatar Kamil Trzciński Committed by Felipe Artur

Merge branch 'fix/gb/improve-container-registry-clipboard-links' into 'master'

Fix container repository/tag location text copied into the clipboard

Closes #30695

See merge request !10587
parent 1e10c1b2
...@@ -23,6 +23,10 @@ class ContainerRepository < ActiveRecord::Base ...@@ -23,6 +23,10 @@ class ContainerRepository < ActiveRecord::Base
@path ||= [project.full_path, name].select(&:present?).join('/') @path ||= [project.full_path, name].select(&:present?).join('/')
end end
def location
File.join(registry.path, path)
end
def tag(tag) def tag(tag)
ContainerRegistry::Tag.new(self, tag) ContainerRegistry::Tag.new(self, tag)
end end
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
= icon('chevron-down', 'aria-hidden': 'true') = icon('chevron-down', 'aria-hidden': 'true')
= escape_once(image.path) = escape_once(image.path)
= clipboard_button(clipboard_text: "docker pull #{image.path}") = clipboard_button(clipboard_text: "docker pull #{image.location}")
.controls.hidden-xs.pull-right .controls.hidden-xs.pull-right
= link_to namespace_project_container_registry_path(@project.namespace, @project, image), = link_to namespace_project_container_registry_path(@project.namespace, @project, image),
......
%tr.tag %tr.tag
%td %td
= escape_once(tag.name) = escape_once(tag.name)
= clipboard_button(text: "docker pull #{tag.path}") = clipboard_button(text: "docker pull #{tag.location}")
%td %td
- if tag.revision - if tag.revision
%span.has-tooltip{ title: "#{tag.revision}" } %span.has-tooltip{ title: "#{tag.revision}" }
......
...@@ -29,6 +29,10 @@ module ContainerRegistry ...@@ -29,6 +29,10 @@ module ContainerRegistry
"#{repository.path}:#{name}" "#{repository.path}:#{name}"
end end
def location
"#{repository.location}:#{name}"
end
def [](key) def [](key)
return unless manifest return unless manifest
......
...@@ -50,6 +50,13 @@ describe ContainerRegistry::Tag do ...@@ -50,6 +50,13 @@ describe ContainerRegistry::Tag do
end end
end end
describe '#location' do
it 'returns a full location of the tag' do
expect(tag.location)
.to eq 'registry.gitlab/group/test:tag'
end
end
context 'manifest processing' do context 'manifest processing' do
context 'schema v1' do context 'schema v1' do
before do before do
......
...@@ -4,7 +4,7 @@ describe ContainerRepository do ...@@ -4,7 +4,7 @@ describe ContainerRepository do
let(:group) { create(:group, name: 'group') } let(:group) { create(:group, name: 'group') }
let(:project) { create(:project, path: 'test', group: group) } let(:project) { create(:project, path: 'test', group: group) }
let(:container_repository) do let(:repository) do
create(:container_repository, name: 'my_image', project: project) create(:container_repository, name: 'my_image', project: project)
end end
...@@ -23,48 +23,48 @@ describe ContainerRepository do ...@@ -23,48 +23,48 @@ describe ContainerRepository do
describe 'associations' do describe 'associations' do
it 'belongs to the project' do it 'belongs to the project' do
expect(container_repository).to belong_to(:project) expect(repository).to belong_to(:project)
end end
end end
describe '#tag' do describe '#tag' do
it 'has a test tag' do it 'has a test tag' do
expect(container_repository.tag('test')).not_to be_nil expect(repository.tag('test')).not_to be_nil
end end
end end
describe '#path' do describe '#path' do
it 'returns a full path to the repository' do it 'returns a full path to the repository' do
expect(container_repository.path).to eq('group/test/my_image') expect(repository.path).to eq('group/test/my_image')
end end
end end
describe '#manifest' do describe '#manifest' do
subject { container_repository.manifest } it 'returns non-empty manifest' do
expect(repository.manifest).not_to be_nil
it { is_expected.not_to be_nil } end
end end
describe '#valid?' do describe '#valid?' do
subject { container_repository.valid? } it 'is a valid repository' do
expect(repository).to be_valid
it { is_expected.to be_truthy } end
end end
describe '#tags' do describe '#tags' do
subject { container_repository.tags } it 'returns non-empty tags list' do
expect(repository.tags).not_to be_empty
it { is_expected.not_to be_empty } end
end end
describe '#has_tags?' do describe '#has_tags?' do
it 'has tags' do it 'has tags' do
expect(container_repository).to have_tags expect(repository).to have_tags
end end
end end
describe '#delete_tags!' do describe '#delete_tags!' do
let(:container_repository) do let(:repository) do
create(:container_repository, name: 'my_image', create(:container_repository, name: 'my_image',
tags: %w[latest rc1], tags: %w[latest rc1],
project: project) project: project)
...@@ -72,21 +72,36 @@ describe ContainerRepository do ...@@ -72,21 +72,36 @@ describe ContainerRepository do
context 'when action succeeds' do context 'when action succeeds' do
it 'returns status that indicates success' do it 'returns status that indicates success' do
expect(container_repository.client) expect(repository.client)
.to receive(:delete_repository_tag) .to receive(:delete_repository_tag)
.and_return(true) .and_return(true)
expect(container_repository.delete_tags!).to be_truthy expect(repository.delete_tags!).to be_truthy
end end
end end
context 'when action fails' do context 'when action fails' do
it 'returns status that indicates failure' do it 'returns status that indicates failure' do
expect(container_repository.client) expect(repository.client)
.to receive(:delete_repository_tag) .to receive(:delete_repository_tag)
.and_return(false) .and_return(false)
expect(container_repository.delete_tags!).to be_falsey expect(repository.delete_tags!).to be_falsey
end
end
end
describe '#location' do
context 'when registry is running on a custom port' do
before do
stub_container_registry_config(enabled: true,
api_url: 'http://registry.gitlab:5000',
host_port: 'registry.gitlab:5000')
end
it 'returns a full location of the repository' do
expect(repository.location)
.to eq 'registry.gitlab:5000/group/test/my_image'
end end
end end
end end
...@@ -102,7 +117,7 @@ describe ContainerRepository do ...@@ -102,7 +117,7 @@ describe ContainerRepository do
context 'when repository is not a root repository' do context 'when repository is not a root repository' do
it 'returns false' do it 'returns false' do
expect(container_repository).not_to be_root_repository expect(repository).not_to be_root_repository
end end
end end
end end
......
require 'spec_helper'
describe 'projects/registry/repositories/index', :view do
let(:group) { create(:group, path: 'group') }
let(:project) { create(:empty_project, group: group, path: 'test') }
let(:repository) do
create(:container_repository, project: project, name: 'image')
end
before do
stub_container_registry_config(enabled: true,
host_port: 'registry.gitlab',
api_url: 'http://registry.gitlab')
stub_container_registry_tags(repository: :any, tags: [:latest])
assign(:project, project)
assign(:images, [repository])
allow(view).to receive(:can?).and_return(true)
end
it 'contains container repository path' do
render
expect(rendered).to have_content 'group/test/image'
end
it 'contains attribute for copying tag location into clipboard' do
render
expect(rendered).to have_css 'button[data-clipboard-text="docker pull ' \
'registry.gitlab/group/test/image:latest"]'
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment