foreman_docker 3.1.0 → 3.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +10 -1
- data/app/assets/javascripts/foreman_docker/container_image_search.js +203 -0
- data/app/assets/javascripts/foreman_docker/create_registry.js +15 -0
- data/app/assets/stylesheets/foreman_docker/autocomplete.css.scss +4 -0
- data/app/controllers/concerns/foreman/controller/parameters/docker_registry.rb +1 -1
- data/app/controllers/image_search_controller.rb +6 -35
- data/app/helpers/container_steps_helper.rb +0 -1
- data/app/models/container.rb +1 -1
- data/app/models/docker_container_wizard_state.rb +1 -1
- data/app/models/docker_container_wizard_states/configuration.rb +1 -1
- data/app/models/docker_container_wizard_states/environment.rb +1 -1
- data/app/models/docker_container_wizard_states/image.rb +1 -1
- data/app/models/docker_container_wizard_states/preliminary.rb +1 -1
- data/app/models/docker_parameter.rb +1 -1
- data/app/models/docker_registry.rb +8 -4
- data/app/models/foreman_docker/docker.rb +10 -2
- data/app/models/service/registry_api.rb +10 -5
- data/app/views/containers/steps/_form_buttons.html.erb +5 -7
- data/app/views/containers/steps/_image_hub_tab.html.erb +16 -17
- data/app/views/containers/steps/image.html.erb +1 -3
- data/app/views/image_search/_repository_search_results.html.erb +1 -1
- data/app/views/registries/_form.html.erb +5 -3
- data/app/views/registries/index.html.erb +11 -10
- data/db/migrate/20170508130316_add_verify_ssl_option_to_docker_registries.rb +5 -0
- data/lib/foreman_docker/engine.rb +7 -6
- data/lib/foreman_docker/version.rb +1 -1
- data/test/functionals/image_search_controller_test.rb +120 -169
- data/test/integration/container_steps_test.rb +118 -18
- data/test/integration/registry_creation_test.rb +19 -0
- data/test/units/docker_container_wizard_states/image_test.rb +0 -1
- data/test/units/docker_registry_test.rb +0 -8
- data/test/units/registry_api_test.rb +13 -1
- metadata +10 -6
- data/app/assets/javascripts/foreman_docker/image_step.js +0 -175
@@ -12,19 +12,17 @@ module Service
|
|
12
12
|
def initialize(params = {})
|
13
13
|
self.config = DEFAULTS.merge(params)
|
14
14
|
self.url = config[:url]
|
15
|
-
@user = config[:user] unless config[:user].blank?
|
16
|
-
@password = config[:password] unless config[:password].blank?
|
17
15
|
|
18
16
|
Docker.logger = logger if Rails.env.development? || Rails.env.test?
|
19
17
|
end
|
20
18
|
|
21
19
|
def connection
|
22
|
-
@connection ||= ::Docker::Connection.new(url, credentials)
|
20
|
+
@connection ||= ::Docker::Connection.new(url, default_connection_options.merge(credentials))
|
23
21
|
end
|
24
22
|
|
25
23
|
def get(path, params = nil)
|
26
24
|
response = connection.get('/'.freeze, params,
|
27
|
-
|
25
|
+
connection.options.merge({ path: "#{path}" }))
|
28
26
|
response = parse_json(response)
|
29
27
|
response
|
30
28
|
end
|
@@ -65,6 +63,12 @@ module Service
|
|
65
63
|
|
66
64
|
private
|
67
65
|
|
66
|
+
def default_connection_options
|
67
|
+
@default_connection_options ||= DEFAULTS[:connection].tap do |defaults|
|
68
|
+
defaults[:ssl_verify_peer] = config.fetch(:verify_ssl, true)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
68
72
|
def parse_json(string)
|
69
73
|
JSON.parse(string)
|
70
74
|
rescue => e
|
@@ -86,7 +90,8 @@ module Service
|
|
86
90
|
end
|
87
91
|
|
88
92
|
def credentials
|
89
|
-
{ user:
|
93
|
+
{ user: config.fetch(:user, nil),
|
94
|
+
password: config.fetch(:password, nil) }
|
90
95
|
end
|
91
96
|
|
92
97
|
def filter_tags(result, query)
|
@@ -1,20 +1,18 @@
|
|
1
1
|
<div class="clearfix">
|
2
|
-
<div class="form-actions">
|
2
|
+
<div class="form-actions col-md-6 col-md-offset-2 small-gutter">
|
3
3
|
<% if step == :preliminary %>
|
4
4
|
<%= link_to _("Cancel"), containers_path, :class => "btn btn-danger" %>
|
5
5
|
<% else %>
|
6
6
|
<a class="btn btn-default" href="<%= previous_wizard_path %>">
|
7
|
-
|
8
|
-
<%= _("Back") %>
|
7
|
+
<%= _("Previous Step") %>
|
9
8
|
</a>
|
10
9
|
<% end %>
|
11
|
-
|
12
|
-
<%= button_tag(:id =>
|
10
|
+
|
11
|
+
<%= button_tag(:id => 'next', :type => 'submit', :class => "btn btn-primary") do %>
|
13
12
|
<% if last_step? %>
|
14
13
|
<%= _("Submit") %>
|
15
14
|
<% else %>
|
16
|
-
<%= _("Next") %>
|
17
|
-
<span class="glyphicon glyphicon-chevron-right"></span>
|
15
|
+
<%= _("Next Step") %>
|
18
16
|
<% end %>
|
19
17
|
<% end %>
|
20
18
|
</div>
|
@@ -17,47 +17,46 @@
|
|
17
17
|
<% end %>
|
18
18
|
|
19
19
|
<% if registry == "registry" -%>
|
20
|
-
<div class="input-group col-md-6">
|
21
20
|
<%= select_registry f %>
|
22
|
-
</div>
|
23
21
|
<% end -%>
|
24
22
|
|
25
23
|
<% help_type = f.object.errors[:repository_name].present? ? :help_block : :help_inline %>
|
26
24
|
<%= text_f(f, :repository_name,
|
27
25
|
:label => _('Search'),
|
28
|
-
:size => 'col-md-6',
|
29
26
|
:wrapper_class => (image_search_wrapper_class(model) if tab_active?(registry)),
|
30
|
-
:'data-url' =>
|
27
|
+
:'data-url' => search_repository_image_search_path(model.compute_resource_id),
|
31
28
|
:value => f.object.repository_name.present? ? f.object.repository_name : '',
|
32
29
|
:'data-registry' => registry,
|
33
30
|
:'data-image' => true,
|
34
|
-
:'data-search' => true,
|
35
31
|
:'data-min-length' => 1,
|
36
32
|
:focus_on_load => true,
|
37
33
|
:placeholder => _('Find your favorite container, e.g. centos'),
|
38
34
|
:control_group_id => "#{registry}_image_search",
|
39
|
-
|
40
|
-
icon_text('search', ''),
|
41
|
-
'searchRepo(this)',
|
42
|
-
:class => 'btn btn-default',
|
43
|
-
:id => "search_repository_#{registry}",
|
44
|
-
:'data-registry' => registry,
|
45
|
-
:'data-url' => search_repository_image_search_path(model.compute_resource_id)
|
46
|
-
) + content_tag(:span, '', :id => 'image-confirmation').html_safe) %>
|
35
|
+
:help_inline => spinner('', class: 'hide autocomplete-status')) %>
|
47
36
|
|
48
37
|
<%= text_f f, :tag,
|
49
38
|
:control_group_id => "#{registry}_tag_search",
|
50
39
|
:'data-registry' => registry,
|
51
40
|
:'data-tag' => true,
|
52
|
-
:'data-
|
41
|
+
:'data-min-length' => 0,
|
42
|
+
:'data-url' => search_repository_image_search_path(model.compute_resource_id),
|
43
|
+
:help_inline => spinner('', class: 'hide autocomplete-status') %>
|
44
|
+
|
45
|
+
<div class="col-md-6 col-md-offset-2 small-gutter">
|
46
|
+
<%= link_to(icon_text('search', _('Search for images')), "#",
|
47
|
+
:id => "search_repository_button_#{registry}",
|
48
|
+
:class => 'image-search-button btn btn-default',
|
49
|
+
:'data-registry' => registry,
|
50
|
+
:'data-url' => search_repository_image_search_path(model.compute_resource_id)) %>
|
51
|
+
</div>
|
53
52
|
|
54
|
-
<div class="col-md-12">
|
53
|
+
<div class="registry-search-results col-md-12">
|
55
54
|
<div data-search-spinner=true class='col-md-offset-3 hide'>
|
56
55
|
<span data-wait-text=true>
|
57
56
|
</span>
|
58
|
-
<%= spinner(''
|
57
|
+
<%= spinner('') %>
|
59
58
|
</div>
|
60
|
-
<div
|
59
|
+
<div class="registry-search-results-list">
|
61
60
|
</div>
|
62
61
|
</div>
|
63
62
|
<%= render :partial => 'form_buttons', locals: { :registry => registry} %>
|
@@ -1,4 +1,4 @@
|
|
1
|
-
<%= javascript 'foreman_docker/
|
1
|
+
<%= javascript 'foreman_docker/container_image_search' %>
|
2
2
|
<%= stylesheet 'foreman_docker/autocomplete' %>
|
3
3
|
|
4
4
|
<%= render :layout => 'title', :locals => { :step => 2 } do %>
|
@@ -11,11 +11,9 @@
|
|
11
11
|
<% end -%>
|
12
12
|
|
13
13
|
<li class='<%= tab_class(:hub) %>'><a href="#hub" data-toggle="tab" id="hub_tab">
|
14
|
-
<span class="glyphicon glyphicon-cloud-download"></span>
|
15
14
|
<%= _("Docker hub") %>
|
16
15
|
</a></li>
|
17
16
|
<li class='<%= tab_class(:registry) %>'><a href="#registry" data-toggle="tab" id="registry_tab">
|
18
|
-
<span class="glyphicon glyphicon-cloud-download"></span>
|
19
17
|
<%= _("External registry") %>
|
20
18
|
</a></li>
|
21
19
|
</ul>
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<% repositories.each do |repository| %>
|
2
|
-
<h3><%= link_to cleanup_image_name(repository['name']), '#', :
|
2
|
+
<h3><%= link_to cleanup_image_name(repository['name']), '#', class: 'repository-name' %></h3>
|
3
3
|
<p>
|
4
4
|
<%= '<span class="glyphicon glyphicon-certificate" title="Official"></span>'.html_safe if repository['is_official'] %>
|
5
5
|
<%= '<span class="glyphicon glyphicon-thumbs-up" title="Trusted"></span>'.html_safe if repository['is_trusted'] %>
|
@@ -1,3 +1,4 @@
|
|
1
|
+
<%= javascript 'foreman_docker/create_registry' %>
|
1
2
|
<%= form_for @registry, :url => (@registry.new_record? ? registries_path : registry_path(:id => @registry.id)) do |f| %>
|
2
3
|
<%= base_errors_for @registry %>
|
3
4
|
<ul class="nav nav-tabs" data-tabs="tabs">
|
@@ -14,9 +15,10 @@
|
|
14
15
|
<div class="tab-pane active" id="primary">
|
15
16
|
<%= text_f f, :name %>
|
16
17
|
<%= text_f f, :url %>
|
17
|
-
<%= text_f f, :description, :
|
18
|
-
<%= text_f f, :username, :
|
19
|
-
<%= password_f f, :password, :
|
18
|
+
<%= text_f f, :description, :label_help => _("Description of the registry") %>
|
19
|
+
<%= text_f f, :username, :label_help => _("Username used to access the registry") %>
|
20
|
+
<%= password_f f, :password, :label_help => _("Password used for authentication to the registry") %>
|
21
|
+
<%= checkbox_f f, :verify_ssl, :label_help => _("Disable to use an insecure registry"), :wrapper_class => 'form-group hidden' %>
|
20
22
|
</div>
|
21
23
|
|
22
24
|
<%= render 'taxonomies/loc_org_tabs', :f => f, :obj => @registry %>
|
@@ -3,16 +3,16 @@
|
|
3
3
|
<%= title_actions(new_link(_("Create Registry"))) %>
|
4
4
|
|
5
5
|
<table class="table table-bordered table-striped table-condensed" data-table="inline">
|
6
|
+
<thead>
|
7
|
+
<tr>
|
8
|
+
<th><%= sort :name, :as => _("Name") %></th>
|
9
|
+
<th class="hidden-tablet hidden-xs"><%= sort :url, :as => _("URL") %></th>
|
10
|
+
<th class="hidden-tablet hidden-xs"><%= _("Description") %></th>
|
11
|
+
<th><%= _('Actions') %></th>
|
12
|
+
</tr>
|
6
13
|
</thead>
|
7
|
-
<
|
8
|
-
|
9
|
-
<th class="hidden-tablet hidden-xs text-center"><%= sort :url, :as => _("URL") %></th>
|
10
|
-
<th class="hidden-tablet hidden-xs text-center"><%= _("Description") %></th>
|
11
|
-
<th><%= _('Actions') %></th>
|
12
|
-
</tr>
|
13
|
-
</thead>
|
14
|
-
|
15
|
-
<% @registries.each do |r| %>
|
14
|
+
<tbody>
|
15
|
+
<% @registries.each do |r| %>
|
16
16
|
<tr>
|
17
17
|
<td><%= link_to_if_authorized trunc_with_tooltip(r.name), hash_for_edit_registry_path(:id => r).merge(:auth_object => r, :authorizer => authorizer) %></td>
|
18
18
|
<td class="hidden-tablet hidden-xs text-center"><%= trunc_with_tooltip(r.url) %></td>
|
@@ -22,7 +22,8 @@
|
|
22
22
|
merge(:auth_object => r, :authorizer => authorizer),
|
23
23
|
:confirm => _("Delete %s?") % r.name) %></td>
|
24
24
|
</tr>
|
25
|
-
|
25
|
+
<% end %>
|
26
|
+
</tbody>
|
26
27
|
</table>
|
27
28
|
|
28
29
|
<%= will_paginate_with_info @registries %>
|
@@ -20,17 +20,18 @@ module ForemanDocker
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
+
foreman_docker_assets = %w[foreman_docker/autocomplete.css
|
24
|
+
foreman_docker/terminal.css
|
25
|
+
foreman_docker/container_image_search.js
|
26
|
+
foreman_docker/create_registry.js]
|
27
|
+
|
23
28
|
initializer "foreman_docker.assets.precompile" do |app|
|
24
|
-
app.config.assets.precompile +=
|
25
|
-
foreman_docker/terminal.css
|
26
|
-
foreman_docker/image_step.js)
|
29
|
+
app.config.assets.precompile += foreman_docker_assets
|
27
30
|
end
|
28
31
|
|
29
32
|
initializer 'foreman_docker.configure_assets', :group => :assets do
|
30
33
|
SETTINGS[:foreman_docker] =
|
31
|
-
{ :assets => { :precompile =>
|
32
|
-
'foreman_docker/terminal.css',
|
33
|
-
'foreman_docker/image_step.js'] } }
|
34
|
+
{ :assets => { :precompile => foreman_docker_assets } }
|
34
35
|
end
|
35
36
|
|
36
37
|
initializer 'foreman_docker.register_gettext', :after => :load_config_initializers do
|
@@ -18,204 +18,155 @@ class ImageSearchControllerTest < ActionController::TestCase
|
|
18
18
|
.stubs(:find).returns(registry)
|
19
19
|
end
|
20
20
|
|
21
|
-
describe '#
|
22
|
-
|
23
|
-
exists = ['true', 'false'].sample
|
24
|
-
search_type = ['hub', 'registry'].sample
|
25
|
-
subject.instance_variable_set(:@image_search_service, image_search_service)
|
26
|
-
image_search_service.expects(:available?).returns(exists)
|
27
|
-
|
28
|
-
xhr :get, :auto_complete_repository_name,
|
29
|
-
{ registry: search_type, search: term,
|
30
|
-
id: compute_resource }, set_session_user
|
31
|
-
assert_equal exists, response.body
|
32
|
-
end
|
33
|
-
|
34
|
-
context 'it is a Docker Hub tab request' do
|
35
|
-
let(:search_type) { 'hub' }
|
21
|
+
describe '#search_repository' do
|
22
|
+
let(:search_types) { ['hub', 'registry'] }
|
36
23
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
.returns(tags)
|
42
|
-
docker_hub.expects(:tags).returns([])
|
24
|
+
describe 'calls #search on image_search_service' do
|
25
|
+
setup do
|
26
|
+
subject.instance_variable_set(:@image_search_service, image_search_service)
|
27
|
+
end
|
43
28
|
|
44
|
-
|
45
|
-
|
29
|
+
test 'passes params search and tags' do
|
30
|
+
tags_enabled = ['true', 'false'].sample
|
31
|
+
image_search_service.expects(:search).with({ term: term, tags: tags_enabled })
|
32
|
+
.returns([])
|
33
|
+
xhr :get, :search_repository,
|
34
|
+
{ registry: search_types.sample, search: term, tags: tags_enabled,
|
46
35
|
id: compute_resource }, set_session_user
|
47
36
|
end
|
48
|
-
end
|
49
|
-
|
50
|
-
context 'it is a External Registry tab request' do
|
51
|
-
let(:search_type) { 'registry' }
|
52
37
|
|
53
|
-
test '
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
.
|
38
|
+
test 'returns an array of { label:, value: } hashes' do
|
39
|
+
image_search_service.expects(:search).with({ term: term, tags: 'true' })
|
40
|
+
.returns(tags)
|
41
|
+
xhr :get, :search_repository,
|
42
|
+
{ registry: search_types.sample, search: term, tags: 'true',
|
43
|
+
id: compute_resource }, set_session_user
|
44
|
+
assert_equal tags.first, JSON.parse(response.body).first['value']
|
45
|
+
end
|
58
46
|
|
59
|
-
|
60
|
-
|
61
|
-
|
47
|
+
test 'returns html with the found images' do
|
48
|
+
image_search_service.expects(:search)
|
49
|
+
.with({ term: term, tags: 'false' })
|
50
|
+
.returns([{ 'name' => term }])
|
51
|
+
xhr :get, :search_repository,
|
52
|
+
{ registry: search_types.sample, search: term,
|
53
|
+
id: compute_resource, format: :html}, set_session_user
|
54
|
+
assert response.body.include?(term)
|
62
55
|
end
|
63
|
-
end
|
64
|
-
end
|
65
56
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
subject.instance_variable_set(:@image_search_service, image_search_service)
|
73
|
-
image_search_service.expects(:search)
|
74
|
-
.with({ term: term, tags: 'true' })
|
75
|
-
.returns(tags)
|
76
|
-
xhr :get, :auto_complete_image_tag,
|
77
|
-
{ registry: search_type, search: term,
|
78
|
-
id: compute_resource }, set_session_user
|
79
|
-
assert_equal tags.first, JSON.parse(response.body).first['value']
|
80
|
-
end
|
57
|
+
[Docker::Error::DockerError, Excon::Errors::Error, Errno::ECONNREFUSED].each do |error|
|
58
|
+
test "search_repository catch exceptions on network errors like #{error}" do
|
59
|
+
image_search_service.expects(:search)
|
60
|
+
.raises(error)
|
61
|
+
xhr :get, :search_repository,
|
62
|
+
{ registry: search_types.sample, search: term, id: compute_resource }, set_session_user
|
81
63
|
|
82
|
-
|
83
|
-
|
64
|
+
assert_response :error
|
65
|
+
assert response.body.include?('An error occured during repository search:')
|
66
|
+
end
|
67
|
+
end
|
84
68
|
|
85
|
-
test
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
69
|
+
test "centos 7 search responses are handled correctly" do
|
70
|
+
repository = "registry-fancycorp.rhcloud.com/fancydb-rhel7/fancydb"
|
71
|
+
repo_full_name = "redhat.com: #{repository}"
|
72
|
+
expected = [{ "description" => "Really fancy database app...",
|
73
|
+
"is_official" => true,
|
74
|
+
"is_trusted" => true,
|
75
|
+
"name" => repo_full_name,
|
76
|
+
"star_count" => 0
|
77
|
+
}]
|
78
|
+
image_search_service.expects(:search).returns(expected)
|
79
|
+
xhr :get, :search_repository,
|
80
|
+
{ registry: search_types.sample, search: 'centos', id: compute_resource, format: :html }, set_session_user
|
81
|
+
assert_response :success
|
82
|
+
refute response.body.include?(repo_full_name)
|
83
|
+
assert response.body.include?(repository)
|
84
|
+
end
|
91
85
|
|
92
|
-
|
93
|
-
|
94
|
-
|
86
|
+
test "fedora search responses are handled correctly" do
|
87
|
+
repository = "registry-fancycorp.rhcloud.com/fancydb-rhel7/fancydb"
|
88
|
+
repo_full_name = repository
|
89
|
+
request.env["HTTP_ACCEPT"] = "application/javascript"
|
90
|
+
expected = [{ "description" => "Really fancy database app...",
|
91
|
+
"is_official" => true,
|
92
|
+
"is_trusted" => true,
|
93
|
+
"name" => repo_full_name,
|
94
|
+
"star_count" => 0
|
95
|
+
}]
|
96
|
+
image_search_service.expects(:search).returns(expected)
|
97
|
+
xhr :get, :search_repository,
|
98
|
+
{ registry: search_types.sample, search: term, id: compute_resource, format: :html }, set_session_user
|
99
|
+
assert_response :success
|
100
|
+
assert response.body.include?(repo_full_name)
|
101
|
+
assert response.body.include?(repository)
|
95
102
|
end
|
96
103
|
end
|
97
104
|
|
98
|
-
|
99
|
-
|
105
|
+
describe 'for image names' do
|
106
|
+
context 'with a Docker Hub tab request' do
|
107
|
+
let(:search_type) { 'hub' }
|
100
108
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
.returns([])
|
109
|
+
test 'it searches Docker Hub and the ComputeResource' do
|
110
|
+
compute_resource.expects(:local_images)
|
111
|
+
.returns([OpenStruct.new(info: { 'RepoTags' => [term] })])
|
112
|
+
docker_hub.expects(:search).returns({})
|
106
113
|
|
107
|
-
|
108
|
-
|
109
|
-
|
114
|
+
xhr :get, :search_repository,
|
115
|
+
{ registry: search_type, search: term,
|
116
|
+
id: compute_resource }, set_session_user
|
117
|
+
end
|
110
118
|
end
|
111
|
-
end
|
112
|
-
end
|
113
119
|
|
114
|
-
|
115
|
-
|
116
|
-
search_type = ['hub', 'registry'].sample
|
117
|
-
subject.instance_variable_set(:@image_search_service, image_search_service)
|
118
|
-
image_search_service.expects(:search)
|
119
|
-
.with({ term: term, tags: 'false' })
|
120
|
-
.returns([{ 'name' => term}])
|
121
|
-
xhr :get, :search_repository,
|
122
|
-
{ registry: search_type, search: term,
|
123
|
-
id: compute_resource }, set_session_user
|
124
|
-
assert response.body.include?(term)
|
125
|
-
end
|
120
|
+
context 'with a External Registry tab request' do
|
121
|
+
let(:search_type) { 'registry' }
|
126
122
|
|
127
|
-
|
128
|
-
|
123
|
+
test 'it only queries the registry api' do
|
124
|
+
compute_resource.expects(:local_images).with(docker_image).never
|
125
|
+
docker_hub.expects(:search).never
|
126
|
+
registry.api.expects(:search).with(docker_image)
|
127
|
+
.returns({})
|
129
128
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
xhr :get, :search_repository,
|
136
|
-
{ registry: search_type, search: term,
|
137
|
-
id: compute_resource }, set_session_user
|
129
|
+
xhr :get, :search_repository,
|
130
|
+
{ registry: search_type, registry_id: registry,
|
131
|
+
search: term, id: compute_resource }, set_session_user
|
132
|
+
end
|
138
133
|
end
|
139
134
|
end
|
140
135
|
|
141
|
-
|
142
|
-
let(:
|
136
|
+
describe 'for tags' do
|
137
|
+
let(:tag_fragment) { 'lat' }
|
138
|
+
let(:term) { "#{docker_image}:#{tag_fragment}"}
|
143
139
|
|
144
|
-
|
145
|
-
|
146
|
-
docker_hub.expects(:search).never
|
147
|
-
registry.api.expects(:search).with(docker_image)
|
148
|
-
.returns({})
|
140
|
+
context 'with a Docker Hub tab request' do
|
141
|
+
let(:search_type) { 'hub' }
|
149
142
|
|
150
|
-
|
151
|
-
|
152
|
-
|
143
|
+
test 'it searches Docker Hub and the ComputeResource' do
|
144
|
+
compute_resource.expects(:image).with(docker_image)
|
145
|
+
.returns(term)
|
146
|
+
compute_resource.expects(:tags_for_local_image)
|
147
|
+
.returns(tags)
|
148
|
+
docker_hub.expects(:tags).returns([])
|
149
|
+
|
150
|
+
xhr :get, :search_repository,
|
151
|
+
{ registry: search_type, search: term, tags: 'true',
|
152
|
+
id: compute_resource }, set_session_user
|
153
|
+
end
|
153
154
|
end
|
154
|
-
end
|
155
|
-
end
|
156
155
|
|
157
|
-
|
158
|
-
|
159
|
-
ForemanDocker::ImageSearch.any_instance.expects(:available?)
|
160
|
-
.raises(error)
|
161
|
-
xhr :get, :auto_complete_repository_name,
|
162
|
-
{ registry: 'hub', search: term, id: compute_resource }, set_session_user
|
163
|
-
assert_response_is_expected
|
164
|
-
end
|
156
|
+
context 'with a External Registry tab request' do
|
157
|
+
let(:search_type) { 'registry' }
|
165
158
|
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
end
|
159
|
+
test 'it only queries the registry api' do
|
160
|
+
compute_resource.expects(:image).with(docker_image).never
|
161
|
+
docker_hub.expects(:tags).never
|
162
|
+
registry.api.expects(:tags).with(docker_image, tag_fragment)
|
163
|
+
.returns([])
|
172
164
|
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
165
|
+
xhr :get, :search_repository,
|
166
|
+
{ registry: search_type, registry_id: registry, tags: 'true',
|
167
|
+
search: term, id: compute_resource }, set_session_user
|
168
|
+
end
|
169
|
+
end
|
178
170
|
end
|
179
171
|
end
|
180
|
-
|
181
|
-
test "centos 7 search responses are handled correctly" do
|
182
|
-
repository = "registry-fancycorp.rhcloud.com/fancydb-rhel7/fancydb"
|
183
|
-
repo_full_name = "redhat.com: #{repository}"
|
184
|
-
request.env["HTTP_ACCEPT"] = "application/javascript"
|
185
|
-
expected = [{ "description" => "Really fancy database app...",
|
186
|
-
"is_official" => true,
|
187
|
-
"is_trusted" => true,
|
188
|
-
"name" => repo_full_name,
|
189
|
-
"star_count" => 0
|
190
|
-
}]
|
191
|
-
ForemanDocker::ImageSearch.any_instance.expects(:search).returns(expected).at_least_once
|
192
|
-
xhr :get, :search_repository,
|
193
|
-
{ registry: 'hub', search: 'centos', id: compute_resource }, set_session_user
|
194
|
-
assert_response :success
|
195
|
-
refute response.body.include?(repo_full_name)
|
196
|
-
assert response.body.include?(repository)
|
197
|
-
end
|
198
|
-
|
199
|
-
test "fedora search responses are handled correctly" do
|
200
|
-
repository = "registry-fancycorp.rhcloud.com/fancydb-rhel7/fancydb"
|
201
|
-
repo_full_name = repository
|
202
|
-
request.env["HTTP_ACCEPT"] = "application/javascript"
|
203
|
-
expected = [{ "description" => "Really fancy database app...",
|
204
|
-
"is_official" => true,
|
205
|
-
"is_trusted" => true,
|
206
|
-
"name" => repo_full_name,
|
207
|
-
"star_count" => 0
|
208
|
-
}]
|
209
|
-
ForemanDocker::ImageSearch.any_instance.expects(:search).returns(expected).at_least_once
|
210
|
-
xhr :get, :search_repository,
|
211
|
-
{ registry: 'hub', search: 'centos', id: compute_resource }, set_session_user
|
212
|
-
assert_response :success
|
213
|
-
assert response.body.include?(repo_full_name)
|
214
|
-
assert response.body.include?(repository)
|
215
|
-
end
|
216
|
-
|
217
|
-
def assert_response_is_expected
|
218
|
-
assert_response :error
|
219
|
-
assert response.body.include?('An error occured during repository search:')
|
220
|
-
end
|
221
172
|
end
|