foreman_docker 2.1.1 → 3.0.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.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -1
  3. data/app/controllers/api/v2/registries_controller.rb +4 -2
  4. data/app/controllers/concerns/foreman/controller/parameters/docker_registry.rb +19 -0
  5. data/app/controllers/containers/steps_controller.rb +21 -2
  6. data/app/controllers/containers_controller.rb +1 -0
  7. data/app/controllers/registries_controller.rb +3 -2
  8. data/app/models/container.rb +0 -5
  9. data/app/models/docker_container_wizard_states/configuration.rb +0 -4
  10. data/app/models/docker_container_wizard_states/environment.rb +0 -4
  11. data/app/models/docker_container_wizard_states/image.rb +0 -2
  12. data/app/models/docker_container_wizard_states/preliminary.rb +0 -2
  13. data/app/models/docker_registry.rb +6 -3
  14. data/app/models/environment_variable.rb +0 -1
  15. data/app/models/exposed_port.rb +0 -1
  16. data/app/models/foreman_docker/dns.rb +0 -2
  17. data/app/models/foreman_docker/docker.rb +1 -3
  18. data/app/models/service/containers.rb +20 -15
  19. data/app/views/api/v2/registries/show.json.rabl +2 -2
  20. data/app/views/compute_resources_vms/index/_docker.html.erb +28 -29
  21. data/app/views/containers/steps/preliminary.html.erb +2 -1
  22. data/db/migrate/20141209182008_remove_docker_tables.rb +2 -2
  23. data/lib/foreman_docker/engine.rb +2 -0
  24. data/lib/foreman_docker/tasks/test.rake +1 -0
  25. data/lib/foreman_docker/version.rb +1 -1
  26. data/test/factories/compute_resources.rb +1 -1
  27. data/test/functionals/api/v2/containers_controller_test.rb +45 -41
  28. data/test/functionals/containers_controller_test.rb +15 -0
  29. data/test/units/containers_service_test.rb +11 -0
  30. metadata +3 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ca765fa935bb364c2d3f7fbb17fd066eeed01a8f
4
- data.tar.gz: d488dee47746e6805e40ed8e84d4fadc2d75a84e
3
+ metadata.gz: 26d60710f8feff575f0ad158fe70dcd4ca943a4b
4
+ data.tar.gz: c2cb12599647a844761982076c1b8b176d5c378e
5
5
  SHA512:
6
- metadata.gz: c9b6bf889814e3b29f09b3ae11fb263a08ccdfa8e468eff22daec5c164b2f89e120fc05d732865926ae11a397406bca4bab2d49844b9461c042be7b303ffb5fa
7
- data.tar.gz: 934ba8ca1909f47ed825ad23f8e984d01a5827f538eb41b84e7ec379df3bd2f94a7f93828ba731aaba900ced7e59843b49d001a0f05a2be3e9eb3fdc61d6346b
6
+ metadata.gz: 96ad25c6bd9fa70731aaa122c26d4515e6094162bd0b998b88b0d64d5f5cd1bc420b21f932ea624c65b5fb9410030a232d5e6dc0c587321b0e4952717f4abd18
7
+ data.tar.gz: 1e1853fbe2f9f8ce9ecf4f3b8811d7cd0a2a2fbf0afa43298662607559f0cbf7e0d143de93e4c384ce7e16a393aaf157bca069d408c5b931364205aa468860e2
data/README.md CHANGED
@@ -84,7 +84,8 @@ That's it. You're now ready to create and manage containers in your new Docker c
84
84
  | ---------------:| --------------:|
85
85
  | >= 1.5 | 0.0.1 - 0.0.3 |
86
86
  | >= 1.6 | 0.1.0 - 0.2.0 |
87
- | >= 1.7 | 1.0.0+ |
87
+ | >= 1.7 | 1.0.0 - 2.1.1 |
88
+ | >= 1.7 | 3.0.0+ |
88
89
 
89
90
  See extras/RELEASE.md for more detailed information on compatibility and releases.
90
91
 
@@ -1,6 +1,7 @@
1
1
  module Api
2
2
  module V2
3
3
  class RegistriesController < ::Api::V2::BaseController
4
+ include Foreman::Controller::Parameters::DockerRegistry
4
5
  before_filter :find_resource, :except => %w(index create)
5
6
 
6
7
  resource_description do
@@ -12,6 +13,7 @@ module Api
12
13
  def_param_group :registry do
13
14
  param :registry, Hash, :required => true, :action_aware => true do
14
15
  param :name, String, :required => true
16
+ param_group :taxonomies, ::Api::V2::BaseController
15
17
  param :url, String, :required => true
16
18
  param :description, String
17
19
  param :username, String
@@ -34,7 +36,7 @@ module Api
34
36
  api :POST, '/registries/', N_('Create a docker registry')
35
37
  param_group :registry, :as => :create
36
38
  def create
37
- @registry = DockerRegistry.new(params[:registry])
39
+ @registry = DockerRegistry.new(docker_registry_params)
38
40
  process_response @registry.save
39
41
  end
40
42
 
@@ -42,7 +44,7 @@ module Api
42
44
  param :id, :identifier, :required => true
43
45
  param_group :registry, :as => :update
44
46
  def update
45
- process_response @registry.update_attributes(params[:registry])
47
+ process_response @registry.update_attributes(docker_registry_params)
46
48
  end
47
49
 
48
50
  api :DELETE, '/registries/:id/', N_('Delete a docker registry')
@@ -0,0 +1,19 @@
1
+ module Foreman::Controller::Parameters::DockerRegistry
2
+ extend ActiveSupport::Concern
3
+
4
+ class_methods do
5
+ def docker_registry_params_filter
6
+ Foreman::ParameterFilter.new(::DockerRegistry).tap do |filter|
7
+ filter.permit :name, :url, :username, :password, :description,
8
+ :location_ids => [], :organization_ids => []
9
+ end
10
+ end
11
+ end
12
+
13
+ def docker_registry_params
14
+ param_name = parameter_filter_context.api? ? 'registry' : 'docker_registry'
15
+ self.class.docker_registry_params_filter.filter_params(params, parameter_filter_context,
16
+ param_name
17
+ )
18
+ end
19
+ end
@@ -35,10 +35,29 @@ module Containers
35
35
  end
36
36
 
37
37
  def build_state
38
- s = @state.send(:"build_#{step}", params[:"docker_container_wizard_states_#{step}"])
38
+ s = @state.send(:"build_#{step}", state_params)
39
39
  instance_variable_set("@docker_container_wizard_states_#{step}", s)
40
40
  end
41
41
 
42
+ def state_params
43
+ attrs = case step
44
+ when :preliminary
45
+ [:wizard_state, :compute_resource_id]
46
+ when :image
47
+ [:repository_name, :tag, :wizard_state, :registry_id, :capsule_id, :katello]
48
+ when :configuration
49
+ [:name, :command, :entrypoint, :cpu_set, :cpu_shares, :memory, :wizard_state]
50
+ when :environment
51
+ [:tty, :docker_container_wizard_state_id,
52
+ :attach_stdin, :attach_stdout, :attach_stderr,
53
+ :exposed_ports_attributes => [], :environment_variables_attributes => [],
54
+ :dns_attributes => []
55
+ ]
56
+ end
57
+
58
+ params.require("docker_container_wizard_states_#{step}").permit(*attrs)
59
+ end
60
+
42
61
  def set_form
43
62
  instance_variable_set(
44
63
  "@docker_container_wizard_states_#{step}",
@@ -46,7 +65,7 @@ module Containers
46
65
  end
47
66
 
48
67
  def create_container(start = true)
49
- @state.send(:"create_#{step}", params[:"docker_container_wizard_states_#{step}"])
68
+ @state.send(:"create_#{step}", state_params)
50
69
  service = Service::Containers.new
51
70
  container = if start.is_a? TrueClass
52
71
  service.start_container!(@state)
@@ -102,6 +102,7 @@ class ContainersController < ::ApplicationController
102
102
  if params[:compute_resource_id].present?
103
103
  compute_resource_id = params[:compute_resource_id]
104
104
  container_uuid = params[:id]
105
+ @container ||= Container.authorized("#{action_permission}_#{controller_name}".to_sym).find_by_uuid(container_uuid)
105
106
  else
106
107
  find_container
107
108
  compute_resource_id = @container.compute_resource_id
@@ -1,5 +1,6 @@
1
1
  class RegistriesController < ::ApplicationController
2
2
  include Foreman::Controller::AutoCompleteSearch
3
+ include Foreman::Controller::Parameters::DockerRegistry
3
4
  before_filter :find_registry, :only => [:edit, :update, :destroy]
4
5
 
5
6
  def index
@@ -12,7 +13,7 @@ class RegistriesController < ::ApplicationController
12
13
  end
13
14
 
14
15
  def create
15
- @registry = DockerRegistry.new(params[:docker_registry])
16
+ @registry = DockerRegistry.new(docker_registry_params)
16
17
  if @registry.save
17
18
  process_success
18
19
  else
@@ -24,7 +25,7 @@ class RegistriesController < ::ApplicationController
24
25
  end
25
26
 
26
27
  def update
27
- if @registry.update_attributes(params[:docker_registry])
28
+ if @registry.update_attributes(docker_registry_params)
28
29
  process_success
29
30
  else
30
31
  process_error
@@ -24,11 +24,6 @@ class Container < ActiveRecord::Base
24
24
  accepts_nested_attributes_for :exposed_ports, :allow_destroy => true
25
25
  scoped_search :on => :name
26
26
 
27
- attr_accessible :command, :repository_name, :name, :compute_resource_id, :entrypoint,
28
- :cpu_set, :cpu_shares, :memory, :tty, :attach_stdin, :registry_id,
29
- :attach_stdout, :attach_stderr, :tag, :uuid, :environment_variables_attributes,
30
- :katello, :exposed_ports_attributes, :dns
31
-
32
27
  validates :name, :uniqueness => { :scope => :compute_resource_id }
33
28
 
34
29
  def repository_pull_url
@@ -3,9 +3,5 @@ module DockerContainerWizardStates
3
3
  self.table_name_prefix = 'docker_container_wizard_states_'
4
4
  belongs_to :wizard_state, :class_name => DockerContainerWizardState,
5
5
  :foreign_key => :docker_container_wizard_state_id
6
-
7
- validates :command, :presence => true
8
-
9
- attr_accessible :name, :command, :entrypoint, :cpu_set, :cpu_shares, :memory, :wizard_state
10
6
  end
11
7
  end
@@ -3,10 +3,6 @@ module DockerContainerWizardStates
3
3
  self.table_name_prefix = 'docker_container_wizard_states_'
4
4
  belongs_to :wizard_state, :class_name => DockerContainerWizardState
5
5
 
6
- attr_accessible :tty, :docker_container_wizard_state_id,
7
- :attach_stdin, :attach_stdout, :attach_stderr,
8
- :exposed_ports_attributes, :environment_variables_attributes,
9
- :dns_attributes
10
6
  # Fix me:
11
7
  # Validations are off on this association as there's a bug in ::Parameter
12
8
  # that forces validation of reference_id. This will fail on new records as
@@ -7,7 +7,5 @@ module DockerContainerWizardStates
7
7
 
8
8
  validates :tag, :presence => true
9
9
  validates :repository_name, :presence => true
10
-
11
- attr_accessible :repository_name, :tag, :wizard_state, :registry_id, :capsule_id, :katello
12
10
  end
13
11
  end
@@ -2,8 +2,6 @@ module DockerContainerWizardStates
2
2
  class Preliminary < ActiveRecord::Base
3
3
  include Taxonomix
4
4
 
5
- attr_accessible :wizard_state, :compute_resource_id
6
-
7
5
  self.table_name_prefix = 'docker_container_wizard_states_'
8
6
  belongs_to :wizard_state, :class_name => DockerContainerWizardState,
9
7
  :foreign_key => :docker_container_wizard_state_id
@@ -3,12 +3,15 @@ class DockerRegistry < ActiveRecord::Base
3
3
  include Taxonomix
4
4
  include Encryptable
5
5
 
6
+ default_scope do
7
+ with_taxonomy_scope do
8
+ order('docker_registries.name')
9
+ end
10
+ end
11
+
6
12
  has_many :containers, :foreign_key => "registry_id", :dependent => :destroy
7
13
  encrypts :password
8
14
 
9
- attr_accessible :name, :url, :username, :password, :locations, :organizations,
10
- :description
11
-
12
15
  validates_lengths_from_database
13
16
  validates :name, :presence => true, :uniqueness => true
14
17
  validates :url, :presence => true, :uniqueness => true,
@@ -2,5 +2,4 @@ class EnvironmentVariable < Parameter
2
2
  belongs_to :container, :foreign_key => :reference_id, :inverse_of => :environment_variables
3
3
  audited :except => [:priority], :associated_with => :container, :allow_mass_assignment => true
4
4
  validates :name, :uniqueness => { :scope => :reference_id }
5
- attr_accessible :priority
6
5
  end
@@ -1,5 +1,4 @@
1
1
  class ExposedPort < Parameter
2
- attr_accessible :priority
3
2
  # The Parameter class from which ExposedPort class inherits,validates for the
4
3
  # presence of an associated domain, operating system, host or host group. We
5
4
  # will have to reset those validations for the ExposedPort class as they do
@@ -2,8 +2,6 @@ require 'resolv'
2
2
 
3
3
  module ForemanDocker
4
4
  class Dns < Parameter
5
- attr_accessible :priority
6
-
7
5
  # The Parameter class from which this Dns class inherits,validates for the
8
6
  # presence of an associated domain, operating system, host or host group.
9
7
  # We will have to reset those validations for the Dns class as they do not
@@ -2,8 +2,6 @@ require 'uri'
2
2
 
3
3
  module ForemanDocker
4
4
  class Docker < ::ComputeResource
5
- attr_accessible :email
6
-
7
5
  validates :url, :format => { :with => URI.regexp }
8
6
  validates :email, :format => { :with => /.+@.+\..+/i }, :allow_blank => true
9
7
 
@@ -61,7 +59,7 @@ module ForemanDocker
61
59
 
62
60
  def tags(image_name)
63
61
  if exist?(image_name)
64
- tags_for_local_image(local_images(image_name).first)
62
+ tags_for_local_image(image(image_name))
65
63
  else
66
64
  # If image is not found in the compute resource, get the tags from the Hub
67
65
  hub_api_url = "https://index.docker.io/v1/repositories/#{image_name}/tags"
@@ -24,7 +24,8 @@ module Service
24
24
  end
25
25
 
26
26
  def create_container_object(wizard_state)
27
- container = Container.new(wizard_state.container_attributes) do |r|
27
+ container = Container.new do |r|
28
+ r.attributes = wizard_state.container_attributes
28
29
  # eagerly load environment variables and exposed ports configuration
29
30
  state = DockerContainerWizardState.includes(
30
31
  :environment => [:environment_variables, :exposed_ports]).find(wizard_state.id)
@@ -38,12 +39,11 @@ module Service
38
39
  container.send(:"#{taxonomy}=", wizard_state.preliminary.send(:"#{taxonomy}"))
39
40
  end
40
41
 
41
- unless container.valid?
42
- @errors = container.errors
43
- fail ActiveRecord::Rollback
44
- end
42
+ pull_image(container)
43
+ start_container(container)
44
+ errors << container.errors unless container.valid?
45
45
 
46
- fail ActiveRecord::Rollback unless pull_image(container) && start_container(container)
46
+ fail ActiveRecord::Rollback if @errors.present?
47
47
 
48
48
  container.name = container.in_fog.name[1..-1] unless container.name.present?
49
49
 
@@ -51,7 +51,9 @@ module Service
51
51
  end
52
52
 
53
53
  def pull_image(container)
54
- container.compute_resource.create_image(:fromImage => container.repository_pull_url)
54
+ success = container.compute_resource.
55
+ create_image(:fromImage => container.repository_pull_url)
56
+ errors << container.compute_resource.errors[:base] unless success
55
57
  end
56
58
 
57
59
  def start_container(container)
@@ -71,24 +73,27 @@ module Service
71
73
 
72
74
  def load_environment_variables(state, r)
73
75
  state.environment_variables.each do |environment_variable|
74
- r.environment_variables.build :name => environment_variable.name,
75
- :value => environment_variable.value,
76
- :priority => environment_variable.priority
76
+ var = r.environment_variables.build
77
+ var.name = environment_variable.name
78
+ var.value = environment_variable.value
79
+ var.priority = environment_variable.priority
77
80
  end
78
81
  end
79
82
 
80
83
  def load_exposed_ports(state, r)
81
84
  state.exposed_ports.each do |e|
82
- r.exposed_ports.build :name => e.name,
83
- :value => e.value,
84
- :priority => e.priority
85
+ port = r.exposed_ports.build
86
+ port.name = e.name
87
+ port.value = e.value
88
+ port.priority = e.priority
85
89
  end
86
90
  end
87
91
 
88
92
  def load_dns(state, r)
89
93
  state.dns.each do |e|
90
- r.dns.build :name => e.name,
91
- :priority => e.priority
94
+ dns = r.dns.build
95
+ dns.name = e.name
96
+ dns.priority = e.priority
92
97
  end
93
98
  end
94
99
 
@@ -2,6 +2,6 @@ object @registry
2
2
 
3
3
  extends "api/v2/registries/main"
4
4
 
5
- node do |container|
6
- partial("api/v2/taxonomies/children_nodes", :object => container)
5
+ node do |registry|
6
+ partial("api/v2/taxonomies/children_nodes", :object => registry)
7
7
  end
@@ -1,29 +1,28 @@
1
- <table class="table table-bordered" data-table='inline'>
2
- <thead>
3
- <tr>
4
- <th><%= _('Name') %></th>
5
- <th><%= _('Image') %></th>
6
- <th><%= _('CPUs') %></th>
7
- <th><%= _('Memory') %></th>
8
- <th><%= _('Status') %></th>
9
- <th><%= _('Power') %></th>
10
- <th></th>
11
- </tr>
12
- </thead>
13
- <% @vms.each do |vm| %>
14
- <tr>
15
- <% name = vm.name || (!vm.attributes['names'].empty? && vm.attributes['names'].first) %>
16
- <td><%= link_to_if_authorized name, hash_for_compute_resource_vm_path(:compute_resource_id => @compute_resource, :id => vm.identity) %></td>
17
- <td><%= vm.image %></td>
18
- <td><%= vm.cores %></td>
19
- <td> <%= number_to_human_size vm.memory %> </td>
20
- <td> <%= vm.attributes['status'] %> </td>
21
- <td> <span <%= vm_power_class(vm.ready?) %>> <%= vm_state(vm) %></span> </td>
22
- <td>
23
- <%= action_buttons(container_power_action(vm),
24
- display_delete_if_authorized(hash_for_compute_resource_vm_path(:compute_resource_id => @compute_resource, :id => vm.id))) %>
25
- </td>
26
-
27
- </tr>
28
- <% end %>
29
- </table>
1
+ <thead>
2
+ <tr>
3
+ <th><%= _('Name') %></th>
4
+ <th><%= _('Image') %></th>
5
+ <th><%= _('CPUs') %></th>
6
+ <th><%= _('Memory') %></th>
7
+ <th><%= _('Status') %></th>
8
+ <th><%= _('Power') %></th>
9
+ <th><%= _('Action') %></th>
10
+ </tr>
11
+ </thead>
12
+ <tbody>
13
+ <% @vms.each do |vm| %>
14
+ <tr>
15
+ <% name = vm.name || (!vm.attributes['names'].empty? && vm.attributes['names'].first) %>
16
+ <td><%= link_to_if_authorized name, hash_for_compute_resource_vm_path(:compute_resource_id => @compute_resource, :id => vm.identity) %></td>
17
+ <td><%= vm.image %></td>
18
+ <td><%= vm.cores %></td>
19
+ <td> <%= number_to_human_size vm.memory %> </td>
20
+ <td> <%= vm.attributes['status'] %> </td>
21
+ <td> <span <%= vm_power_class(vm.ready?) %>> <%= vm_state(vm) %></span> </td>
22
+ <td>
23
+ <%= action_buttons(container_power_action(vm),
24
+ display_delete_if_authorized(hash_for_compute_resource_vm_path(:compute_resource_id => @compute_resource, :id => vm.id))) %>
25
+ </td>
26
+ </tr>
27
+ <% end %>
28
+ </tbody>
@@ -21,8 +21,9 @@
21
21
  <hr>
22
22
  <%= select_f f, 'compute_resource_id', @container_resources, :id, :to_label, {}, { :label => _('Deploy on') } %>
23
23
  <% else %>
24
+
24
25
  <div class="alert alert-warning alert-dismissable">
25
- <%= image_tag 'false.png' %> <%= (_("You need a Docker compute resource in order to create containers. Please %s and try again.") % link_to('add a new one', hash_for_new_compute_resource_path)).html_safe %>
26
+ <%= image_tag 'false.png' %> <%= (_("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 %>
26
27
  </div>
27
28
  <% end %>
28
29
  </div>
@@ -28,8 +28,8 @@ class RemoveDockerTables < ActiveRecord::Migration
28
28
  remove_foreign_key :containers, :name => :containers_docker_tag_id_fk
29
29
  end
30
30
 
31
- remove_column :containers, :docker_image_id
32
- remove_column :containers, :docker_tag_id
31
+ remove_reference :containers, :docker_image, :foreign_key => true
32
+ remove_reference :containers, :docker_tag, :foreign_key => true
33
33
 
34
34
  # these tables might have foreign keys from plugins like katello so use cascade
35
35
  cascade_drop(:docker_images)
@@ -103,6 +103,8 @@ module ForemanDocker
103
103
  :resource_type => 'Docker/ImageSearch'
104
104
  end
105
105
 
106
+ parameter_filter ComputeResource, :email
107
+
106
108
  # apipie API documentation
107
109
  # Only available in 1.8, otherwise it has to be in the initializer below
108
110
  if SETTINGS[:version].to_s.include?('develop') ||
@@ -8,6 +8,7 @@ namespace :test do
8
8
  "#{ForemanDocker::Engine.root}/test/**/*_test.rb"
9
9
  ]
10
10
  t.verbose = true
11
+ t.warning = false
11
12
  end
12
13
 
13
14
  Rake::Task[test_task.name].invoke
@@ -1,3 +1,3 @@
1
1
  module ForemanDocker
2
- VERSION = '2.1.1'
2
+ VERSION = '3.0.0'
3
3
  end
@@ -7,7 +7,7 @@ FactoryGirl.define do
7
7
  user 'dockeruser'
8
8
  password 'dockerpassword'
9
9
  email 'container@containerization.com'
10
- url 'unix:///var/run/docker.sock'
10
+ url 'unix:///var/run/docker.falsesock'
11
11
  end
12
12
 
13
13
  factory :docker_cr, :class => ForemanDocker::Docker, :traits => [:docker]
@@ -46,7 +46,9 @@ module Api
46
46
  end
47
47
 
48
48
  test 'delete removes a container in foreman and in Docker host' do
49
+ Fog.mock!
49
50
  delete :destroy, :id => @container.id
51
+ Fog.unmock!
50
52
  assert_response :success
51
53
  assert_equal ActiveSupport::JSON.decode(response.body)['name'], 'foo'
52
54
  end
@@ -60,51 +62,53 @@ module Api
60
62
  end
61
63
  end
62
64
 
63
- test 'power call turns on/off container in Docker host' do
64
- Fog.mock!
65
- Fog::Compute::Fogdocker::Server.any_instance.expects(:start)
66
- put :power, :id => @container.id, :power_action => 'start'
67
- assert_response :success
68
- end
65
+ context 'power calls' do
66
+ setup { Fog.mock! }
67
+ teardown { Fog.unmock! }
69
68
 
70
- test 'power call checks status of container in Docker host' do
71
- Fog.mock!
72
- Fog::Compute::Fogdocker::Server.any_instance.expects(:ready?).returns(false)
73
- put :power, :id => @container.id, :power_action => 'status'
74
- assert_response :success
75
- assert_equal ActiveSupport::JSON.decode(response.body)['running'], false
76
- end
69
+ test 'power call turns on/off container in Docker host' do
70
+ Fog::Compute::Fogdocker::Server.any_instance.expects(:start)
71
+ put :power, :id => @container.id, :power_action => 'start'
72
+ assert_response :success
73
+ end
77
74
 
78
- test 'power call host' do
79
- Fog.mock!
80
- Fog::Compute::Fogdocker::Server.any_instance.expects(:ready?).returns(false)
81
- put :power, :id => @container.id, :power_action => 'status'
82
- assert_response :success
83
- assert_equal ActiveSupport::JSON.decode(response.body)['running'], false
84
- end
75
+ test 'power call checks status of container in Docker host' do
76
+ Fog::Compute::Fogdocker::Server.any_instance.expects(:ready?).returns(false)
77
+ put :power, :id => @container.id, :power_action => 'status'
78
+ assert_response :success
79
+ assert_equal ActiveSupport::JSON.decode(response.body)['running'], false
80
+ end
85
81
 
86
- test 'creates a container with correct params' do
87
- repository_name = "centos"
88
- tag = "7"
89
- name = "foo"
90
- registry_uri = URI.parse(@registry.url)
91
- Service::Containers.any_instance.expects(:pull_image).returns(true)
92
- Service::Containers.any_instance
93
- .expects(:start_container).returns(true).with do |container|
94
- container.must_be_kind_of(Container)
95
- container.repository_name.must_equal(repository_name)
96
- container.tag.must_equal(tag)
97
- container.compute_resource_id.must_equal(@compute_resource.id)
98
- container.name.must_equal(name)
99
- container.repository_pull_url.must_include(registry_uri.host)
100
- container.repository_pull_url.must_include("#{repository_name}:#{tag}")
82
+ test 'power call host' do
83
+ Fog::Compute::Fogdocker::Server.any_instance.expects(:ready?).returns(false)
84
+ put :power, :id => @container.id, :power_action => 'status'
85
+ assert_response :success
86
+ assert_equal ActiveSupport::JSON.decode(response.body)['running'], false
87
+ end
88
+
89
+ test 'creates a container with correct params' do
90
+ repository_name = "centos"
91
+ tag = "7"
92
+ name = "foo"
93
+ registry_uri = URI.parse(@registry.url)
94
+ Service::Containers.any_instance.expects(:pull_image).returns(true)
95
+ Service::Containers.any_instance
96
+ .expects(:start_container).returns(true).with do |container|
97
+ container.must_be_kind_of(Container)
98
+ container.repository_name.must_equal(repository_name)
99
+ container.tag.must_equal(tag)
100
+ container.compute_resource_id.must_equal(@compute_resource.id)
101
+ container.name.must_equal(name)
102
+ container.repository_pull_url.must_include(registry_uri.host)
103
+ container.repository_pull_url.must_include("#{repository_name}:#{tag}")
104
+ end
105
+ post :create, :container => { :compute_resource_id => @compute_resource.id,
106
+ :name => name,
107
+ :registry_id => @registry.id,
108
+ :repository_name => repository_name,
109
+ :tag => tag }
110
+ assert_response :created
101
111
  end
102
- post :create, :container => { :compute_resource_id => @compute_resource.id,
103
- :name => name,
104
- :registry_id => @registry.id,
105
- :repository_name => repository_name,
106
- :tag => tag }
107
- assert_response :created
108
112
  end
109
113
 
110
114
  test 'creates a katello container with correct params' do
@@ -59,6 +59,21 @@ class ContainersControllerTest < ActionController::TestCase
59
59
  flash[:notice]
60
60
  end
61
61
 
62
+ test 'deleting with container params deletes container object' do
63
+ managed_container = FactoryGirl.create(
64
+ :container,
65
+ :compute_resource => @container_resource)
66
+ managed_container.update(:uuid => @container.id)
67
+ ComputeResource.any_instance.expects(:destroy_vm).
68
+ with(@container.id).returns(true)
69
+ Container.any_instance.expects(:destroy)
70
+ delete :destroy, { :compute_resource_id => @container_resource.id,
71
+ :id => @container.id }, set_session_user
72
+ assert_redirected_to containers_path
73
+ assert_equal "Container #{managed_container.uuid} is being deleted.",
74
+ flash[:notice]
75
+ end
76
+
62
77
  test 'failed deletion of managed container keeps container in Foreman' do
63
78
  ComputeResource.any_instance.stubs(:destroy_vm).
64
79
  raises(::Foreman::Exception.new('Could not destroy Docker container'))
@@ -24,4 +24,15 @@ class ContainersServiceTest < ActiveSupport::TestCase
24
24
  Fog.unmock!
25
25
  assert_equal DockerContainerWizardState.where(:id => @state.id).count, 0
26
26
  end
27
+
28
+ test 'passes errors from compute resource' do
29
+ # Since the compute resource will be unreachable, this test will always
30
+ # fail at the 'pull_image' step
31
+ containers_service = Service::Containers.new
32
+ assert_raises(ActiveRecord::Rollback) do
33
+ containers_service.create_container_object(@state)
34
+ end
35
+ assert containers_service.errors.present?
36
+ end
37
+
27
38
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_docker
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.1
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Lobato, Amos Benari
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-15 00:00:00.000000000 Z
11
+ date: 2016-08-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: docker-api
@@ -68,6 +68,7 @@ files:
68
68
  - app/assets/stylesheets/foreman_docker/terminal.css.scss
69
69
  - app/controllers/api/v2/containers_controller.rb
70
70
  - app/controllers/api/v2/registries_controller.rb
71
+ - app/controllers/concerns/foreman/controller/parameters/docker_registry.rb
71
72
  - app/controllers/concerns/foreman_docker/find_container.rb
72
73
  - app/controllers/containers/steps_controller.rb
73
74
  - app/controllers/containers_controller.rb