foreman_docker 3.0.0 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +22 -22
- data/app/assets/javascripts/foreman_docker/image_step.js +36 -6
- data/app/controllers/api/v2/containers_controller.rb +13 -11
- data/app/controllers/containers/steps_controller.rb +8 -2
- data/app/controllers/containers_controller.rb +4 -3
- data/app/controllers/image_search_controller.rb +36 -79
- data/app/helpers/container_steps_helper.rb +21 -0
- data/app/models/concerns/foreman_docker/parameter_validators.rb +27 -4
- data/app/models/container.rb +9 -10
- data/app/models/docker_container_wizard_state.rb +2 -0
- data/app/models/docker_container_wizard_states/dns.rb +2 -8
- data/app/models/docker_container_wizard_states/environment.rb +4 -14
- data/app/models/docker_container_wizard_states/environment_variable.rb +2 -2
- data/app/models/docker_container_wizard_states/exposed_port.rb +2 -8
- data/app/models/docker_container_wizard_states/image.rb +30 -0
- data/app/models/docker_container_wizard_states/preliminary.rb +1 -1
- data/app/models/docker_parameter.rb +20 -0
- data/app/models/docker_registry.rb +6 -4
- data/app/models/environment_variable.rb +3 -3
- data/app/models/exposed_port.rb +4 -10
- data/app/models/foreman_docker/compute_resource_extensions.rb +11 -0
- data/app/models/foreman_docker/dns.rb +3 -9
- data/app/models/foreman_docker/docker.rb +1 -5
- data/app/models/service/containers.rb +15 -11
- data/app/models/service/registry_api.rb +87 -15
- data/app/services/foreman_docker/image_search.rb +92 -0
- data/app/views/containers/index.html.erb +1 -3
- data/app/views/containers/show.html.erb +1 -1
- data/app/views/containers/steps/_image_hub_tab.html.erb +39 -29
- data/app/views/containers/steps/_title.html.erb +1 -1
- data/app/views/containers/steps/preliminary.html.erb +1 -1
- data/app/views/foreman_docker/common_parameters/_dns_entry.html.erb +1 -1
- data/app/views/foreman_docker/common_parameters/_environment_variable.html.erb +1 -1
- data/app/views/foreman_docker/common_parameters/_exposed_port.html.erb +1 -1
- data/app/views/image_search/_repository_search_results.html.erb +1 -1
- data/app/views/registries/index.html.erb +1 -3
- data/app/views/registries/new.html.erb +1 -1
- data/db/migrate/20160605133025_create_docker_parameters.rb +13 -0
- data/db/migrate/20160605134652_move_parameters_to_docker_parameters.rb +27 -0
- data/lib/foreman_docker/engine.rb +6 -7
- data/lib/foreman_docker/version.rb +1 -1
- data/lib/tasks/test.rake +35 -0
- data/test/functionals/api/v2/containers_controller_test.rb +21 -0
- data/test/functionals/api/v2/registries_controller_test.rb +4 -3
- data/test/functionals/containers_controller_test.rb +5 -0
- data/test/functionals/containers_steps_controller_test.rb +74 -36
- data/test/functionals/image_search_controller_test.rb +166 -12
- data/test/integration/container_test.rb +1 -1
- data/test/test_plugin_helper.rb +10 -0
- data/test/units/container_test.rb +1 -1
- data/test/units/containers_service_test.rb +31 -9
- data/test/units/docker_container_wizard_states/image_test.rb +84 -0
- data/test/units/docker_registry_test.rb +27 -10
- data/test/units/foreman_docker/compute_resource_extensions_test.rb +10 -0
- data/test/units/image_search_service_test.rb +188 -0
- data/test/units/registry_api_test.rb +206 -12
- metadata +55 -36
- data/lib/foreman_docker/tasks/test.rake +0 -45
- data/locale/de/foreman_docker.edit.po +0 -631
- data/locale/de/foreman_docker.po.time_stamp +0 -0
- data/locale/es/foreman_docker.edit.po +0 -631
- data/locale/es/foreman_docker.po.time_stamp +0 -0
- data/locale/fr/foreman_docker.edit.po +0 -632
- data/locale/fr/foreman_docker.po.time_stamp +0 -0
- data/locale/it/foreman_docker.edit.po +0 -630
- data/locale/it/foreman_docker.po.time_stamp +0 -0
- data/locale/ja/foreman_docker.edit.po +0 -634
- data/locale/ja/foreman_docker.po.time_stamp +0 -0
- data/locale/ko/foreman_docker.edit.po +0 -629
- data/locale/ko/foreman_docker.po.time_stamp +0 -0
- data/locale/pt_BR/foreman_docker.edit.po +0 -631
- data/locale/pt_BR/foreman_docker.po.time_stamp +0 -0
- data/locale/ru/foreman_docker.edit.po +0 -630
- data/locale/ru/foreman_docker.po.time_stamp +0 -0
- data/locale/zh_CN/foreman_docker.edit.po +0 -628
- data/locale/zh_CN/foreman_docker.po.time_stamp +0 -0
- data/locale/zh_TW/foreman_docker.edit.po +0 -628
- data/locale/zh_TW/foreman_docker.po.time_stamp +0 -0
@@ -0,0 +1,92 @@
|
|
1
|
+
module ForemanDocker
|
2
|
+
class ImageSearch
|
3
|
+
def initialize(*args)
|
4
|
+
@sources = {}
|
5
|
+
args.each do |source|
|
6
|
+
add_source(source)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def add_source(source)
|
11
|
+
case source
|
12
|
+
when ForemanDocker::Docker
|
13
|
+
@sources[:compute_resource] ||= []
|
14
|
+
@sources[:compute_resource] << source
|
15
|
+
when Service::RegistryApi
|
16
|
+
@sources[:registry] ||= []
|
17
|
+
@sources[:registry] << source
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def remove_source(source)
|
22
|
+
@sources.each do |_, sources|
|
23
|
+
sources.delete(source)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def search(query)
|
28
|
+
return [] if query[:term].blank? || query[:term] == ':'
|
29
|
+
|
30
|
+
unless query[:tags] == 'true'
|
31
|
+
images(query[:term])
|
32
|
+
else
|
33
|
+
tags(query[:term])
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def images(query)
|
38
|
+
sources_results_for(:search, query)
|
39
|
+
end
|
40
|
+
|
41
|
+
def tags(query)
|
42
|
+
image_name, tag = query.split(':')
|
43
|
+
sources_results_for(:tags, image_name, tag)
|
44
|
+
.map { |tag_name| { 'name' => tag_name } }
|
45
|
+
end
|
46
|
+
|
47
|
+
def available?(query)
|
48
|
+
tags(query).present?
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def registry_search(registry, term)
|
54
|
+
registry.search(term)['results']
|
55
|
+
end
|
56
|
+
|
57
|
+
def compute_resource_search(compute_resource, query)
|
58
|
+
images = compute_resource.local_images(query)
|
59
|
+
images.flat_map do |image|
|
60
|
+
image.info['RepoTags'].map do |tag|
|
61
|
+
{ 'name' => tag.split(':').first }
|
62
|
+
end
|
63
|
+
end.uniq
|
64
|
+
end
|
65
|
+
|
66
|
+
def compute_resource_image(compute_resource, image_name)
|
67
|
+
compute_resource.image(image_name)
|
68
|
+
rescue ::Docker::Error::NotFoundError
|
69
|
+
nil
|
70
|
+
end
|
71
|
+
|
72
|
+
def compute_resource_tags(compute_resource, image_name, tag)
|
73
|
+
image = compute_resource_image(compute_resource, image_name)
|
74
|
+
image ? compute_resource.tags_for_local_image(image, tag) : []
|
75
|
+
end
|
76
|
+
|
77
|
+
def registry_tags(registry, image_name, tag)
|
78
|
+
registry.tags(image_name, tag).map { |t| t['name'] }
|
79
|
+
end
|
80
|
+
|
81
|
+
def sources_results_for(search, *args)
|
82
|
+
result = []
|
83
|
+
@sources.each do |kind, sources|
|
84
|
+
sources.each do |source|
|
85
|
+
result << self.send("#{kind}_#{search}", source, *args)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
result.flatten.compact
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
@@ -1,8 +1,6 @@
|
|
1
1
|
<% title _("Containers") %>
|
2
2
|
|
3
|
-
<%= title_actions(
|
4
|
-
_('New container'),
|
5
|
-
hash_for_new_container_path)) %>
|
3
|
+
<%= title_actions(new_link(_("Create container"))) %>
|
6
4
|
|
7
5
|
<ul class="nav nav-tabs" data-tabs="tabs">
|
8
6
|
<% @container_resources.each_with_index do |resource, i| %>
|
@@ -69,7 +69,7 @@
|
|
69
69
|
<td><%= _('Environment Variables') %></td>
|
70
70
|
<td>
|
71
71
|
<table id="environment_variables" class="table table-bordered" style="table-layout:fixed; word-wrap: break-word">
|
72
|
-
<% (@container.in_fog.
|
72
|
+
<% (@container.in_fog.environment_variables || []).each do |environment_variable| %>
|
73
73
|
<% pair = environment_variable.split("=") %>
|
74
74
|
<tr>
|
75
75
|
<td><b><%= pair.first %></b></td>
|
@@ -4,42 +4,52 @@
|
|
4
4
|
:url => wizard_path,
|
5
5
|
:method => :put,
|
6
6
|
:html => {:data => {:registry => registry}} do |f| %>
|
7
|
+
|
8
|
+
<% model.errors.messages.each do |field, field_errors| %>
|
9
|
+
<div class="alert alert-danger">
|
10
|
+
<span class="pficon pficon-error-circle-o"></span>
|
11
|
+
<ul>
|
12
|
+
<% field_errors.each do |message| %>
|
13
|
+
<li><%= message %></li>
|
14
|
+
<% end %>
|
15
|
+
</ul>
|
16
|
+
</div>
|
17
|
+
<% end %>
|
18
|
+
|
7
19
|
<% if registry == "registry" -%>
|
8
20
|
<div class="input-group col-md-6">
|
9
21
|
<%= select_registry f %>
|
10
22
|
</div>
|
11
23
|
<% end -%>
|
12
24
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
:'data-registry' => registry,
|
33
|
-
:'data-url' => search_repository_image_search_path(model.compute_resource_id)
|
34
|
-
) + content_tag(:span, '', :id => 'image-confirmation').html_safe) %>
|
35
|
-
</div>
|
36
|
-
<div class='row'>
|
37
|
-
<%= text_f f, :tag,
|
25
|
+
<% help_type = f.object.errors[:repository_name].present? ? :help_block : :help_inline %>
|
26
|
+
<%= text_f(f, :repository_name,
|
27
|
+
:label => _('Search'),
|
28
|
+
:size => 'col-md-6',
|
29
|
+
:wrapper_class => (image_search_wrapper_class(model) if tab_active?(registry)),
|
30
|
+
:'data-url' => auto_complete_repository_name_image_search_path(model.compute_resource_id),
|
31
|
+
:value => f.object.repository_name.present? ? f.object.repository_name : '',
|
32
|
+
:'data-registry' => registry,
|
33
|
+
:'data-image' => true,
|
34
|
+
:'data-search' => true,
|
35
|
+
:'data-min-length' => 1,
|
36
|
+
:focus_on_load => true,
|
37
|
+
:placeholder => _('Find your favorite container, e.g. centos'),
|
38
|
+
:control_group_id => "#{registry}_image_search",
|
39
|
+
help_type => link_to_function(
|
40
|
+
icon_text('search', ''),
|
41
|
+
'searchRepo(this)',
|
42
|
+
:class => 'btn btn-default',
|
43
|
+
:id => "search_repository_#{registry}",
|
38
44
|
:'data-registry' => registry,
|
39
|
-
:'data-
|
40
|
-
|
41
|
-
|
42
|
-
|
45
|
+
:'data-url' => search_repository_image_search_path(model.compute_resource_id)
|
46
|
+
) + content_tag(:span, '', :id => 'image-confirmation').html_safe) %>
|
47
|
+
|
48
|
+
<%= text_f f, :tag,
|
49
|
+
:control_group_id => "#{registry}_tag_search",
|
50
|
+
:'data-registry' => registry,
|
51
|
+
:'data-tag' => true,
|
52
|
+
:'data-url' => auto_complete_image_tag_image_search_path(model.compute_resource_id) %>
|
43
53
|
|
44
54
|
<div class="col-md-12">
|
45
55
|
<div data-search-spinner=true class='col-md-offset-3 hide'>
|
@@ -23,7 +23,7 @@
|
|
23
23
|
<% else %>
|
24
24
|
|
25
25
|
<div class="alert alert-warning alert-dismissable">
|
26
|
-
<%=
|
26
|
+
<%= (_("You need a Docker compute resource in order to create containers. Please %s and try again.") % link_to('add a new one', new_compute_resource_path)).html_safe %>
|
27
27
|
</div>
|
28
28
|
<% end %>
|
29
29
|
</div>
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<tr class="fields form-group <%= 'has-error' if f.object.errors.any? %>">
|
2
|
-
<td><%= f.text_field(:
|
2
|
+
<td><%= f.text_field(:key, :class => "form-control",
|
3
3
|
:placeholder => _("DNS e.g. 8.8.8.8")) %></td>
|
4
4
|
<td style='vertical-align: middle' class='text-center'>
|
5
5
|
<span class="help-block">
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<tr class="fields form-group <%= 'error' if f.object.errors.any? %>">
|
2
|
-
<td><%= f.text_field(:
|
2
|
+
<td><%= f.text_field(:key, :class => "form-control",
|
3
3
|
:placeholder => _("Name, e.g. PING_HOST")) %></td>
|
4
4
|
<td><%= f.text_field(:value, :class => "form-control",
|
5
5
|
:placeholder => _("Value, e.g. example.org")) %></td>
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<tr class="fields form-group <%= 'has-error' if f.object.errors.any? %>">
|
2
|
-
<td><%= f.text_field(:
|
2
|
+
<td><%= f.text_field(:key, :class => "form-control",
|
3
3
|
:placeholder => _("Port number e.g. 22")) %></td>
|
4
4
|
<td><%= f.select :value, [['TCP','tcp'],['UDP','udp']] %></td>
|
5
5
|
<td style='vertical-align: middle' class='text-center'>
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<% repositories.each do |repository| %>
|
2
|
-
<h3><%= link_to repository['name'], '#', :onclick => 'repoSelected(this)', "data-hub" => use_hub %></h3>
|
2
|
+
<h3><%= link_to cleanup_image_name(repository['name']), '#', :onclick => 'repoSelected(this)', "data-hub" => use_hub %></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,8 +1,6 @@
|
|
1
1
|
<% title _("Registries") %>
|
2
2
|
|
3
|
-
<%= title_actions(
|
4
|
-
_('New registry'),
|
5
|
-
hash_for_new_registry_path)) %>
|
3
|
+
<%= title_actions(new_link(_("Create Registry"))) %>
|
6
4
|
|
7
5
|
<table class="table table-bordered table-striped table-condensed" data-table="inline">
|
8
6
|
</thead>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class CreateDockerParameters < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :docker_parameters do |t|
|
4
|
+
t.string :key, :limit => 255
|
5
|
+
t.text :value
|
6
|
+
t.string :type, :limit => 255
|
7
|
+
t.integer :reference_id
|
8
|
+
t.timestamps
|
9
|
+
end
|
10
|
+
|
11
|
+
add_index :docker_parameters, [:type, :reference_id, :key], :unique => true
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class MoveParametersToDockerParameters < ActiveRecord::Migration
|
2
|
+
class FakeDockerParameter < ActiveRecord::Base
|
3
|
+
self.table_name = 'docker_parameters'
|
4
|
+
end
|
5
|
+
|
6
|
+
class FakeParameter < ActiveRecord::Base
|
7
|
+
self.table_name = 'parameters'
|
8
|
+
end
|
9
|
+
|
10
|
+
def up
|
11
|
+
# All the DockerContainerWizardStates::PARAMETER are temporary for the wizard step so no need to keep them
|
12
|
+
docker_params = FakeParameter.unscoped.where(:type => ['EnvironmentVariable', 'ForemanDocker::Dns', 'ExposedPort'])
|
13
|
+
docker_params.each do |param|
|
14
|
+
DockerParameter.create(:key => param['name'], :value => param['value'], :reference_id => param['reference_id'], :type => param['type'])
|
15
|
+
end
|
16
|
+
docker_params.delete_all
|
17
|
+
end
|
18
|
+
|
19
|
+
def down
|
20
|
+
docker_params = FakeDockerParameter.unscoped.where(:type => ['EnvironmentVariable', 'ForemanDocker::Dns', 'ExposedPort'])
|
21
|
+
docker_params.each do |param|
|
22
|
+
Parameter.create(:key => param['name'], :value => param['value'], :reference_id => param['reference_id'], :type => param['type'])
|
23
|
+
end
|
24
|
+
|
25
|
+
docker_params.delete_all
|
26
|
+
end
|
27
|
+
end
|
@@ -42,15 +42,15 @@ module ForemanDocker
|
|
42
42
|
|
43
43
|
initializer 'foreman_docker.register_plugin', :before => :finisher_hook do
|
44
44
|
Foreman::Plugin.register :foreman_docker do
|
45
|
-
requires_foreman '>= 1.
|
45
|
+
requires_foreman '>= 1.15'
|
46
46
|
compute_resource ForemanDocker::Docker
|
47
47
|
|
48
48
|
sub_menu :top_menu, :containers_menu, :caption => N_('Containers'),
|
49
49
|
:after => :monitor_menu do
|
50
|
-
menu :top_menu, :containers, :caption => N_('All
|
50
|
+
menu :top_menu, :containers, :caption => N_('All Containers'),
|
51
51
|
:url_hash => { :controller => :containers,
|
52
52
|
:action => :index }
|
53
|
-
menu :top_menu, :new_container, :caption => N_('
|
53
|
+
menu :top_menu, :new_container, :caption => N_('Create Container'),
|
54
54
|
:url_hash => { :controller => :containers,
|
55
55
|
:action => :new }
|
56
56
|
menu :top_menu, :registries, :caption => N_('Registries'),
|
@@ -103,6 +103,8 @@ module ForemanDocker
|
|
103
103
|
:resource_type => 'Docker/ImageSearch'
|
104
104
|
end
|
105
105
|
|
106
|
+
add_all_permissions_to_default_roles
|
107
|
+
|
106
108
|
parameter_filter ComputeResource, :email
|
107
109
|
|
108
110
|
# apipie API documentation
|
@@ -127,10 +129,6 @@ module ForemanDocker
|
|
127
129
|
end
|
128
130
|
end
|
129
131
|
|
130
|
-
rake_tasks do
|
131
|
-
load "#{ForemanDocker::Engine.root}/lib/foreman_docker/tasks/test.rake"
|
132
|
-
end
|
133
|
-
|
134
132
|
require 'fog/fogdocker/models/compute/server'
|
135
133
|
require 'fog/fogdocker/models/compute/image'
|
136
134
|
require 'fog/fogdocker/models/compute/images'
|
@@ -146,6 +144,7 @@ module ForemanDocker
|
|
146
144
|
# Compatibility fixes - to be removed once 1.7 compatibility is no longer required
|
147
145
|
Fog::Compute::Fogdocker::Images.send(:include, ::FogExtensions::Fogdocker::Images)
|
148
146
|
::Taxonomy.send(:include, ForemanDocker::TaxonomyExtensions)
|
147
|
+
ComputeResource.send(:include, ForemanDocker::ComputeResourceExtensions)
|
149
148
|
end
|
150
149
|
end
|
151
150
|
end
|
data/lib/tasks/test.rake
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
namespace :test do
|
2
|
+
desc "Test ForemanDocker"
|
3
|
+
Rake::TestTask.new(:docker) do |t|
|
4
|
+
test_dir = File.join(File.dirname(__FILE__), '../..', 'test')
|
5
|
+
t.libs << ['test', test_dir]
|
6
|
+
t.pattern = "#{test_dir}/**/*_test.rb"
|
7
|
+
t.verbose = false
|
8
|
+
t.warning = false
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
namespace :docker do
|
13
|
+
task :rubocop do
|
14
|
+
begin
|
15
|
+
require 'rubocop/rake_task'
|
16
|
+
RuboCop::RakeTask.new(:rubocop_docker) do |task|
|
17
|
+
task.patterns = ["#{ForemanDocker::Engine.root}/app/**/*.rb",
|
18
|
+
"#{ForemanDocker::Engine.root}/lib/**/*.rb",
|
19
|
+
"#{ForemanDocker::Engine.root}/test/**/*.rb"]
|
20
|
+
end
|
21
|
+
rescue
|
22
|
+
puts "Rubocop not loaded."
|
23
|
+
end
|
24
|
+
|
25
|
+
Rake::Task['rubocop_docker'].invoke
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
Rake::Task[:test].enhance ['test:docker']
|
30
|
+
|
31
|
+
load 'tasks/jenkins.rake'
|
32
|
+
if Rake::Task.task_defined?(:'jenkins:unit')
|
33
|
+
Rake::Task["jenkins:unit"].enhance ['test:docker',
|
34
|
+
'docker:rubocop']
|
35
|
+
end
|
@@ -3,6 +3,11 @@ require 'test_plugin_helper'
|
|
3
3
|
module Api
|
4
4
|
module V2
|
5
5
|
class ContainersControllerTest < ActionController::TestCase
|
6
|
+
setup do
|
7
|
+
stub_image_existance
|
8
|
+
stub_registry_api
|
9
|
+
end
|
10
|
+
|
6
11
|
test 'index returns a list of all containers' do
|
7
12
|
get :index, {}, set_session_user
|
8
13
|
assert_response :success
|
@@ -109,6 +114,21 @@ module Api
|
|
109
114
|
:tag => tag }
|
110
115
|
assert_response :created
|
111
116
|
end
|
117
|
+
|
118
|
+
test 'creates a container with correct params' do
|
119
|
+
repository_name = "centos"
|
120
|
+
tag = "8"
|
121
|
+
name = "foo2"
|
122
|
+
Service::Containers.any_instance.expects(:pull_image).returns(true)
|
123
|
+
Service::Containers.any_instance.expects(:start_container).returns(true)
|
124
|
+
post :create, :container => { :compute_resource_id => @compute_resource.id,
|
125
|
+
:name => name,
|
126
|
+
:registry_id => @registry.id,
|
127
|
+
:repository_name => repository_name,
|
128
|
+
:tag => tag,
|
129
|
+
:environment_variables => [{:key => 'ping_host', :value => 'example.com'}]}
|
130
|
+
assert_response :created
|
131
|
+
end
|
112
132
|
end
|
113
133
|
|
114
134
|
test 'creates a katello container with correct params' do
|
@@ -145,6 +165,7 @@ module Api
|
|
145
165
|
:repository_name => 'centos',
|
146
166
|
:tag => 'latest' }
|
147
167
|
assert_response :unprocessable_entity
|
168
|
+
assert_match /Name has already been taken/, @response.body
|
148
169
|
end
|
149
170
|
end
|
150
171
|
end
|
@@ -43,15 +43,16 @@ module Api
|
|
43
43
|
|
44
44
|
test 'update a docker registry' do
|
45
45
|
DockerRegistry.any_instance.stubs(:attempt_login)
|
46
|
-
|
46
|
+
new_name = 'hello_world'
|
47
|
+
put :update, :id => @registry.id, :registry => { :name => new_name }
|
47
48
|
assert_response :success
|
48
|
-
|
49
|
+
assert_equal new_name, @registry.reload.name
|
49
50
|
end
|
50
51
|
|
51
52
|
test 'deletes a docker registry' do
|
52
53
|
delete :destroy, :id => @registry.id
|
53
54
|
assert_response :success
|
54
|
-
|
55
|
+
assert DockerRegistry.where(:id => @registry.id).blank?
|
55
56
|
end
|
56
57
|
end
|
57
58
|
end
|