foreman_docker 3.0.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
@@ -1,6 +1,11 @@
|
|
1
1
|
require 'test_plugin_helper'
|
2
2
|
|
3
3
|
class ContainersControllerTest < ActionController::TestCase
|
4
|
+
setup do
|
5
|
+
stub_image_existance
|
6
|
+
stub_registry_api
|
7
|
+
end
|
8
|
+
|
4
9
|
test 'redirect if Docker provider is not available' do
|
5
10
|
get :index, {}, set_session_user
|
6
11
|
assert_redirected_to new_compute_resource_path
|
@@ -3,14 +3,16 @@ require 'test_plugin_helper'
|
|
3
3
|
module Containers
|
4
4
|
class StepsControllerTest < ActionController::TestCase
|
5
5
|
setup do
|
6
|
+
stub_image_existance
|
7
|
+
stub_registry_api
|
6
8
|
@container = FactoryGirl.create(:container)
|
9
|
+
@state = DockerContainerWizardState.create!
|
7
10
|
end
|
8
11
|
|
9
12
|
test 'wizard finishes with a redirect to the managed container' do
|
10
|
-
|
11
|
-
Service::Containers.any_instance.expects(:start_container!).with(equals(state))
|
13
|
+
Service::Containers.any_instance.expects(:start_container!).with(equals(@state))
|
12
14
|
.returns(@container)
|
13
|
-
put :update, { :wizard_state_id => state.id,
|
15
|
+
put :update, { :wizard_state_id => @state.id,
|
14
16
|
:id => :environment,
|
15
17
|
:start_on_create => true,
|
16
18
|
:docker_container_wizard_states_environment => { :tty => false } },
|
@@ -19,41 +21,68 @@ module Containers
|
|
19
21
|
assert_redirected_to container_path(:id => @container.id)
|
20
22
|
end
|
21
23
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
describe 'on image step' do
|
25
|
+
setup do
|
26
|
+
@compute_resource = FactoryGirl.create(:docker_cr)
|
27
|
+
@create_options = { :wizard_state => @state,
|
28
|
+
:compute_resource_id => @compute_resource.id }
|
29
|
+
@state.preliminary = DockerContainerWizardStates::Preliminary.create!(@create_options)
|
30
|
+
DockerContainerWizardState.expects(:find).at_least_once.returns(@state)
|
31
|
+
end
|
32
|
+
|
33
|
+
test 'image show doesnot load katello' do
|
34
|
+
get :show, { :wizard_state_id => @state.id, :id => :image }, set_session_user
|
35
|
+
refute @state.image.katello?
|
36
|
+
refute response.body.include?("katello") # this is code generated by katello partial
|
37
|
+
docker_image = @controller.instance_eval do
|
38
|
+
@docker_container_wizard_states_image
|
39
|
+
end
|
40
|
+
assert_equal @state.image, docker_image
|
41
|
+
end
|
42
|
+
|
43
|
+
describe 'submitting' do
|
44
|
+
setup do
|
45
|
+
@image_params = {
|
46
|
+
docker_container_wizard_states_image: {
|
47
|
+
repository_name: 'test',
|
48
|
+
tag: 'test'
|
49
|
+
}}
|
50
|
+
@params = @image_params.merge({
|
51
|
+
wizard_state_id: @state.id,
|
52
|
+
id: :image,
|
53
|
+
})
|
54
|
+
end
|
55
|
+
|
56
|
+
test 'has no errors if the image exists' do
|
57
|
+
put :update, @params, set_session_user
|
58
|
+
assert_valid @state.image
|
59
|
+
assert css_select('#hub_image_search.has-error').size == 0
|
60
|
+
end
|
27
61
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
docker_image = @controller.instance_eval do
|
35
|
-
@docker_container_wizard_states_image
|
62
|
+
test 'shows an error when the image does not exist' do
|
63
|
+
stub_image_existance(false)
|
64
|
+
put :update, @params, set_session_user
|
65
|
+
refute_valid @state.image
|
66
|
+
assert_select '#hub_image_search.has-error'
|
67
|
+
end
|
36
68
|
end
|
37
|
-
assert_equal state.image, docker_image
|
38
69
|
end
|
39
70
|
|
40
71
|
test 'new container respects exposed_ports configuration' do
|
41
|
-
state = DockerContainerWizardState.create!
|
42
72
|
environment_options = {
|
43
|
-
:docker_container_wizard_state_id => state.id
|
73
|
+
:docker_container_wizard_state_id => @state.id
|
44
74
|
}
|
45
|
-
state.environment = DockerContainerWizardStates::Environment.create!(environment_options)
|
46
|
-
state.environment.exposed_ports.create!(:
|
47
|
-
state.environment.exposed_ports.create!(:
|
48
|
-
get :show, { :wizard_state_id => state.id, :id => :environment }, set_session_user
|
75
|
+
@state.environment = DockerContainerWizardStates::Environment.create!(environment_options)
|
76
|
+
@state.environment.exposed_ports.create!(:key => '1654', :value => 'tcp')
|
77
|
+
@state.environment.exposed_ports.create!(:key => '1655', :value => 'udp')
|
78
|
+
get :show, { :wizard_state_id => @state.id, :id => :environment }, set_session_user
|
49
79
|
assert response.body.include?("1654")
|
50
80
|
assert response.body.include?("1655")
|
51
81
|
|
52
82
|
# Load ExposedPort variables into container
|
53
|
-
state.environment.exposed_ports.each do |e|
|
54
|
-
@container.exposed_ports.build :
|
55
|
-
:value => e.value
|
56
|
-
:priority => e.priority
|
83
|
+
@state.environment.exposed_ports.each do |e|
|
84
|
+
@container.exposed_ports.build :key => e.key,
|
85
|
+
:value => e.value
|
57
86
|
end
|
58
87
|
# Check if parametrized value of container matches Docker API's expectations
|
59
88
|
assert @container.parametrize.key? "ExposedPorts"
|
@@ -62,26 +91,35 @@ module Containers
|
|
62
91
|
end
|
63
92
|
|
64
93
|
test 'new container respects dns configuration' do
|
65
|
-
state = DockerContainerWizardState.create!
|
66
94
|
environment_options = {
|
67
|
-
:docker_container_wizard_state_id => state.id
|
95
|
+
:docker_container_wizard_state_id => @state.id
|
68
96
|
}
|
69
|
-
state.environment = DockerContainerWizardStates::Environment.create!(environment_options)
|
70
|
-
state.environment.dns.create!(:
|
71
|
-
state.environment.dns.create!(:
|
72
|
-
get :show, { :wizard_state_id => state.id, :id => :environment }, set_session_user
|
97
|
+
@state.environment = DockerContainerWizardStates::Environment.create!(environment_options)
|
98
|
+
@state.environment.dns.create!(:key => '18.18.18.18')
|
99
|
+
@state.environment.dns.create!(:key => '19.19.19.19')
|
100
|
+
get :show, { :wizard_state_id => @state.id, :id => :environment }, set_session_user
|
73
101
|
assert response.body.include?("18.18.18.18")
|
74
102
|
assert response.body.include?("19.19.19.19")
|
75
103
|
|
76
104
|
# Load Dns variables into container
|
77
|
-
state.environment.dns.each do |e|
|
78
|
-
@container.dns.build :
|
79
|
-
:priority => e.priority
|
105
|
+
@state.environment.dns.each do |e|
|
106
|
+
@container.dns.build :key => e.key
|
80
107
|
end
|
81
108
|
# Check if parametrized value of container matches Docker API's expectations
|
82
109
|
assert @container.parametrize.key? "HostConfig"
|
83
110
|
assert @container.parametrize["HostConfig"].key? "Dns"
|
84
111
|
assert @container.parametrize["HostConfig"].value? ["18.18.18.18", "19.19.19.19"]
|
85
112
|
end
|
113
|
+
|
114
|
+
test "does not create a container with 2 exposed ports with the same key" do
|
115
|
+
environment_options = {
|
116
|
+
:docker_container_wizard_state_id => @state.id
|
117
|
+
}
|
118
|
+
@state.environment = DockerContainerWizardStates::Environment.new(environment_options)
|
119
|
+
@state.environment.exposed_ports.new(:key => '1654', :value => 'tcp')
|
120
|
+
@state.environment.exposed_ports.new(:key => '1654', :value => 'udp')
|
121
|
+
refute_valid @state
|
122
|
+
assert_equal "Please ensure the following parameters are unique", @state.errors[:'environment.exposed_ports'].first
|
123
|
+
end
|
86
124
|
end
|
87
125
|
end
|
@@ -1,27 +1,179 @@
|
|
1
1
|
require 'test_plugin_helper'
|
2
2
|
|
3
3
|
class ImageSearchControllerTest < ActionController::TestCase
|
4
|
+
let(:docker_image) { 'centos' }
|
5
|
+
let(:tags) { ['latest', '5', '4.3'].map { |tag| "#{term}:#{tag}" } }
|
6
|
+
let(:term) { docker_image }
|
7
|
+
|
8
|
+
let(:docker_hub) { Service::RegistryApi.new(url: 'https://nothub.com') }
|
9
|
+
let(:compute_resource) { FactoryGirl.create(:docker_cr) }
|
10
|
+
let(:registry) { FactoryGirl.create(:docker_registry) }
|
11
|
+
let(:image_search_service) { ForemanDocker::ImageSearch.new }
|
12
|
+
|
4
13
|
setup do
|
5
|
-
|
14
|
+
Service::RegistryApi.stubs(:docker_hub).returns(docker_hub)
|
15
|
+
ComputeResource::ActiveRecord_Relation.any_instance
|
16
|
+
.stubs(:find).returns(compute_resource)
|
17
|
+
DockerRegistry::ActiveRecord_Relation.any_instance
|
18
|
+
.stubs(:find).returns(registry)
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#auto_complete_repository_name' do
|
22
|
+
test 'returns if an image is available' do
|
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' }
|
36
|
+
|
37
|
+
test 'it queries the compute_resource and Docker Hub' do
|
38
|
+
compute_resource.expects(:image).with(term)
|
39
|
+
.returns(term)
|
40
|
+
compute_resource.expects(:tags_for_local_image)
|
41
|
+
.returns(tags)
|
42
|
+
docker_hub.expects(:tags).returns([])
|
43
|
+
|
44
|
+
xhr :get, :auto_complete_repository_name,
|
45
|
+
{ registry: search_type, search: term,
|
46
|
+
id: compute_resource }, set_session_user
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'it is a External Registry tab request' do
|
51
|
+
let(:search_type) { 'registry' }
|
52
|
+
|
53
|
+
test 'it only queries the registry api' do
|
54
|
+
compute_resource.expects(:image).with(term).never
|
55
|
+
docker_hub.expects(:tags).never
|
56
|
+
registry.api.expects(:tags).with(term, nil)
|
57
|
+
.returns(['latest'])
|
58
|
+
|
59
|
+
xhr :get, :auto_complete_repository_name,
|
60
|
+
{ registry: search_type, registry_id: registry,
|
61
|
+
search: term, id: compute_resource }, set_session_user
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe '#auto_complete_image_tag' do
|
67
|
+
let(:tag_fragment) { 'lat' }
|
68
|
+
let(:term) { "#{docker_image}:#{tag_fragment}"}
|
69
|
+
|
70
|
+
test 'returns an array of { label:, value: } hashes' do
|
71
|
+
search_type = ['hub', 'registry'].sample
|
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
|
81
|
+
|
82
|
+
context 'a Docker Hub tab request' do
|
83
|
+
let(:search_type) { 'hub' }
|
84
|
+
|
85
|
+
test 'it searches Docker Hub and the ComputeResource' do
|
86
|
+
compute_resource.expects(:image).with(docker_image)
|
87
|
+
.returns(term)
|
88
|
+
compute_resource.expects(:tags_for_local_image)
|
89
|
+
.returns(tags)
|
90
|
+
docker_hub.expects(:tags).returns([])
|
91
|
+
|
92
|
+
xhr :get, :auto_complete_image_tag,
|
93
|
+
{ registry: search_type, search: term,
|
94
|
+
id: compute_resource }, set_session_user
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context 'it is a External Registry tab request' do
|
99
|
+
let(:search_type) { 'registry' }
|
100
|
+
|
101
|
+
test 'it only queries the registry api' do
|
102
|
+
compute_resource.expects(:image).with(docker_image).never
|
103
|
+
docker_hub.expects(:tags).never
|
104
|
+
registry.api.expects(:tags).with(docker_image, tag_fragment)
|
105
|
+
.returns([])
|
106
|
+
|
107
|
+
xhr :get, :auto_complete_image_tag,
|
108
|
+
{ registry: search_type, registry_id: registry,
|
109
|
+
search: term, id: compute_resource }, set_session_user
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
describe '#search_repository' do
|
115
|
+
test 'returns html with the found images' do
|
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
|
126
|
+
|
127
|
+
context 'a Docker Hub tab request' do
|
128
|
+
let(:search_type) { 'hub' }
|
129
|
+
|
130
|
+
test 'it searches Docker Hub and the ComputeResource' do
|
131
|
+
compute_resource.expects(:local_images)
|
132
|
+
.returns([OpenStruct.new(info: { 'RepoTags' => [term] })])
|
133
|
+
docker_hub.expects(:search).returns({})
|
134
|
+
|
135
|
+
xhr :get, :search_repository,
|
136
|
+
{ registry: search_type, search: term,
|
137
|
+
id: compute_resource }, set_session_user
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
context 'it is a External Registry tab request' do
|
142
|
+
let(:search_type) { 'registry' }
|
143
|
+
|
144
|
+
test 'it only queries the registry api' do
|
145
|
+
compute_resource.expects(:local_images).with(docker_image).never
|
146
|
+
docker_hub.expects(:search).never
|
147
|
+
registry.api.expects(:search).with(docker_image)
|
148
|
+
.returns({})
|
149
|
+
|
150
|
+
xhr :get, :search_repository,
|
151
|
+
{ registry: search_type, registry_id: registry,
|
152
|
+
search: term, id: compute_resource }, set_session_user
|
153
|
+
end
|
154
|
+
end
|
6
155
|
end
|
7
156
|
|
8
157
|
[Docker::Error::DockerError, Excon::Errors::Error, Errno::ECONNREFUSED].each do |error|
|
9
158
|
test 'auto_complete_repository_name catches exceptions on network errors' do
|
10
|
-
ForemanDocker::
|
11
|
-
|
12
|
-
|
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
|
13
163
|
assert_response_is_expected
|
14
164
|
end
|
15
165
|
|
16
166
|
test 'auto_complete_image_tag catch exceptions on network errors' do
|
17
|
-
ForemanDocker::
|
18
|
-
|
167
|
+
ForemanDocker::ImageSearch.any_instance.expects(:search).raises(error)
|
168
|
+
xhr :get, :auto_complete_image_tag,
|
169
|
+
{ registry: 'hub', search: term, id: compute_resource }, set_session_user
|
19
170
|
assert_response_is_expected
|
20
171
|
end
|
21
172
|
|
22
173
|
test 'search_repository catch exceptions on network errors' do
|
23
|
-
ForemanDocker::
|
24
|
-
|
174
|
+
ForemanDocker::ImageSearch.any_instance.expects(:search).raises(error)
|
175
|
+
xhr :get, :search_repository,
|
176
|
+
{ registry: 'hub', search: term, id: compute_resource }, set_session_user
|
25
177
|
assert_response_is_expected
|
26
178
|
end
|
27
179
|
end
|
@@ -36,8 +188,9 @@ class ImageSearchControllerTest < ActionController::TestCase
|
|
36
188
|
"name" => repo_full_name,
|
37
189
|
"star_count" => 0
|
38
190
|
}]
|
39
|
-
ForemanDocker::
|
40
|
-
|
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
|
41
194
|
assert_response :success
|
42
195
|
refute response.body.include?(repo_full_name)
|
43
196
|
assert response.body.include?(repository)
|
@@ -53,8 +206,9 @@ class ImageSearchControllerTest < ActionController::TestCase
|
|
53
206
|
"name" => repo_full_name,
|
54
207
|
"star_count" => 0
|
55
208
|
}]
|
56
|
-
ForemanDocker::
|
57
|
-
|
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
|
58
212
|
assert_response :success
|
59
213
|
assert response.body.include?(repo_full_name)
|
60
214
|
assert response.body.include?(repository)
|
@@ -12,7 +12,7 @@ class ContainerIntegrationTest < ActionDispatch::IntegrationTest
|
|
12
12
|
ComputeResource.any_instance.stubs(:vms).returns([])
|
13
13
|
FactoryGirl.create(:docker_cr)
|
14
14
|
visit containers_path
|
15
|
-
assert page.has_link? '
|
15
|
+
assert page.has_link? 'Create container'
|
16
16
|
refute_equal current_path, new_compute_resource_path
|
17
17
|
end
|
18
18
|
end
|
data/test/test_plugin_helper.rb
CHANGED
@@ -12,3 +12,13 @@ end
|
|
12
12
|
# Add plugin to FactoryGirl's paths
|
13
13
|
FactoryGirl.definition_file_paths << File.join(File.dirname(__FILE__), 'factories')
|
14
14
|
FactoryGirl.reload
|
15
|
+
|
16
|
+
def stub_image_existance(exists = true)
|
17
|
+
Docker::Image.any_instance.stubs(:exist?).returns(exists)
|
18
|
+
ForemanDocker::ImageSearch.any_instance.stubs(:available?).returns(exists)
|
19
|
+
end
|
20
|
+
|
21
|
+
def stub_registry_api
|
22
|
+
Service::RegistryApi.any_instance.stubs(:get).returns({'results' => []})
|
23
|
+
Docker::Image.stubs(:all).returns([])
|
24
|
+
end
|
@@ -1,12 +1,16 @@
|
|
1
1
|
require 'test_plugin_helper'
|
2
|
+
require 'ostruct'
|
2
3
|
|
3
4
|
class ContainersServiceTest < ActiveSupport::TestCase
|
4
5
|
setup do
|
6
|
+
stub_image_existance
|
7
|
+
stub_registry_api
|
8
|
+
|
5
9
|
@state = DockerContainerWizardState.create! do |s|
|
6
10
|
s.build_preliminary(:compute_resource_id => FactoryGirl.create(:docker_cr).id,
|
7
11
|
:locations => [taxonomies(:location1)],
|
8
12
|
:organizations => [taxonomies(:organization1)])
|
9
|
-
s.build_image(:repository_name => 'test', :tag => 'test')
|
13
|
+
s.build_image(:repository_name => 'test', :tag => 'test', :wizard_state => s)
|
10
14
|
s.build_configuration(:name => 'test', :command => '/bin/bash')
|
11
15
|
s.build_environment(:tty => false)
|
12
16
|
end
|
@@ -25,14 +29,32 @@ class ContainersServiceTest < ActiveSupport::TestCase
|
|
25
29
|
assert_equal DockerContainerWizardState.where(:id => @state.id).count, 0
|
26
30
|
end
|
27
31
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
32
|
+
context 'errors' do
|
33
|
+
setup do
|
34
|
+
@containers_service = Service::Containers.new
|
35
|
+
end
|
36
|
+
|
37
|
+
test 'from compute resource' do
|
38
|
+
# Since the compute resource will be unreachable, this test will always
|
39
|
+
# fail at the 'pull_image' step
|
40
|
+
assert_raises(ActiveRecord::Rollback) do
|
41
|
+
@containers_service.create_container_object(@state)
|
42
|
+
end
|
43
|
+
assert @containers_service.errors.present?
|
44
|
+
assert_match(/No such file or directory.*ENOENT/,
|
45
|
+
@containers_service.full_messages.join(' '))
|
34
46
|
end
|
35
|
-
assert containers_service.errors.present?
|
36
|
-
end
|
37
47
|
|
48
|
+
test 'from multiple sources' do
|
49
|
+
Container.any_instance.expects(:valid?).returns(false)
|
50
|
+
Container.any_instance.stubs(:errors).returns(
|
51
|
+
OpenStruct.new(:full_messages => ['foo']))
|
52
|
+
assert_raises(ActiveRecord::Rollback) do
|
53
|
+
@containers_service.create_container_object(@state)
|
54
|
+
end
|
55
|
+
assert @containers_service.errors.present?
|
56
|
+
assert_match(/foo/,
|
57
|
+
@containers_service.full_messages.join(' '))
|
58
|
+
end
|
59
|
+
end
|
38
60
|
end
|