foreman_docker 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d4e681e8c0ceee246d607633e6b910b9dc6ba280
4
- data.tar.gz: 8e56c72c227e1a14cb14a22f44b854fab6f2bc6c
3
+ metadata.gz: 86749f058604f314afa36079efedb8335d2ef47e
4
+ data.tar.gz: b8ef0a060b0475b26e09b4a6cf2696d544005d80
5
5
  SHA512:
6
- metadata.gz: ee41e12ec2a7dca60bb0d2bed285e1cbdada0ec0b28e853e33d6bc3d998b0436d37c2dec7c01313b367f184b5ad44d3d7df32c72d2c9886c8a4f4adddc86a89e
7
- data.tar.gz: 8cd2fb046a8e8521954cafa9f6e6183b1b6fb6a45a06ec228a7d3800d8ec5e12342b6e36bf5259078c9165b4764e3cf41b37c168b9565050d25ac1c8ddfd1077
6
+ metadata.gz: 448a15eb9db1bfa4ed7f18037ab4cb9ff094ba7887663016b9a960bca4403ce24e419f02440c60c8baea03a961d31b66d7c003868e0ef72dd397a5fe19628708
7
+ data.tar.gz: 2ca249ac65d7589834c7f583312b180d6689ad8b20f85811a2aecd2c99704d20f34377b29e0a97ee47988a089c2ddd414bba0378afd191e6e9797d5ce52f9460
@@ -0,0 +1,170 @@
1
+ # module ForemanDocker
2
+ module Api
3
+ module V2
4
+ class ContainersController < ::Api::V2::BaseController
5
+ before_filter :find_resource, :except => %w(index create)
6
+
7
+ resource_description do
8
+ resource_id 'containers'
9
+ api_version 'v2'
10
+ api_base_url '/api/v2'
11
+ end
12
+
13
+ api :GET, '/containers/', N_('List all containers')
14
+ api :GET, '/compute_resources/:compute_resource_id/containers/',
15
+ N_('List all containers in a compute resource')
16
+ param :compute_resource_id, :identifier
17
+ param_group :pagination, ::Api::V2::BaseController
18
+
19
+ def index
20
+ if params[:compute_resource_id].present?
21
+ @containers = Container.where(:compute_resource_id => params[:compute_resource_id])
22
+ else
23
+ @containers = Container.all
24
+ end
25
+ end
26
+
27
+ api :GET, '/containers/:id/', N_('Show a container')
28
+ api :GET, '/compute_resources/:compute_resource_id/containers/:id',
29
+ N_('Show container in a compute resource')
30
+ param :id, :identifier, :required => true
31
+ param :compute_resource_id, :identifier
32
+
33
+ def show
34
+ end
35
+
36
+ def_param_group :container do
37
+ param :container, Hash, :required => true, :action_aware => true do
38
+ param :name, String, :required => true
39
+ param_group :taxonomies, ::Api::V2::BaseController
40
+ param :compute_resource_id, :identifier, :required => true
41
+ param :registry_id, :identifier, :desc => N_('Registry this container will have to use
42
+ to get the image')
43
+ param :image, String, :desc => N_('Image to use to create the container.
44
+ Format should be repository:tag, e.g: centos:7')
45
+ param :tty, :bool
46
+ param :entrypoint, String
47
+ param :cmd, String
48
+ param :memory, String
49
+ param :cpu_shares, :number
50
+ param :cpu_sets, String
51
+ param :environment_variables, Hash
52
+ param :attach_stdout, :bool
53
+ param :attach_stdin, :bool
54
+ param :attach_stderr, :bool
55
+ param :katello, :bool
56
+ end
57
+ end
58
+
59
+ api :POST, '/containers/', N_('Create a container')
60
+ api :POST, '/compute_resources/:compute_resource_id/containers/',
61
+ N_('Create container in a compute resource')
62
+ param_group :container, :as => :create
63
+
64
+ def create
65
+ @container = Service::Containers.new.start_container!(set_wizard_state)
66
+ set_container_taxonomies
67
+ process_response @container.save
68
+ rescue ActiveModel::MassAssignmentSecurity::Error => e
69
+ render :json => { :error => _("Wrong attributes: %s") % e.message },
70
+ :status => :unprocessable_entity
71
+ end
72
+
73
+ api :DELETE, '/containers/:id/', N_('Delete a container')
74
+ api :DELETE, '/compute_resources/:compute_resource_id/containers/:id',
75
+ N_('Delete container in a compute resource')
76
+ param :id, :identifier, :required => true
77
+ param :compute_resource_id, :identifier
78
+
79
+ def destroy
80
+ process_response @container.destroy
81
+ end
82
+
83
+ api :GET, '/containers/:id/logs', N_('Show container logs')
84
+ api :GET, '/compute_resources/:compute_resource_id/containers/:id/logs',
85
+ N_('Show logs from a container in a compute resource')
86
+ param :id, :identifier, :required => true
87
+ param :compute_resource_id, :identifier
88
+ param :stdout, :bool
89
+ param :stderr, :bool
90
+ param :tail, Fixnum, N_('Number of lines to tail. Default: 100')
91
+
92
+ def logs
93
+ render :json => { :logs => Docker::Container.get(@container.uuid)
94
+ .logs(:stdout => (params[:stdout] || true),
95
+ :stderr => (params[:stderr] || false),
96
+ :tail => (params[:tail] || 100)) }
97
+ end
98
+
99
+ api :PUT, '/containers/:id/power', N_('Run power operation on a container')
100
+ api :PUT, '/compute_resources/:compute_resource_id/containers/:id/power',
101
+ N_('Run power operation on a container in a compute resource')
102
+ param :id, :identifier, :required => true
103
+ param :compute_resource_id, :identifier
104
+ param :power_action, String,
105
+ :required => true,
106
+ :desc => N_('power action, valid actions are (start), (stop), (status)')
107
+
108
+ def power
109
+ power_actions = %(start stop status)
110
+ if power_actions.include? params[:power_action]
111
+ response = if params[:power_action] == 'status'
112
+ { :running => @container.in_fog.ready? }
113
+ else
114
+ { :running => @container.in_fog.send(params[:power_action]) }
115
+ end
116
+ render :json => response
117
+ else
118
+ render :json =>
119
+ { :error => _("Unknown method: available power operations are %s") %
120
+ power_actions.join(', ') }, :status => :unprocessable_entity
121
+ end
122
+ end
123
+
124
+ private
125
+
126
+ def set_wizard_state
127
+ wizard_properties = { :preliminary => [:compute_resource_id],
128
+ :image => [:registry_id, :repository_name, :tag, :katello],
129
+ :configuration => [:name, :command, :entrypoint, :cpu_set,
130
+ :cpu_shares, :memory],
131
+ :environment => [:tty, :attach_stdin, :attach_stdout,
132
+ :attach_stderr] }
133
+
134
+ wizard_state = DockerContainerWizardState.create
135
+ wizard_properties.each do |step, properties|
136
+ property_values = properties.each_with_object({}) do |property, values|
137
+ values[:"#{property}"] = params[:container][:"#{property}"]
138
+ end
139
+ wizard_state.send(:"create_#{step}", property_values)
140
+ end
141
+
142
+ if params[:container][:environment_variables].present?
143
+ wizard_state.environment.environment_variables =
144
+ params[:container][:environment_variables]
145
+ end
146
+ wizard_state.tap(&:save)
147
+ end
148
+
149
+ def set_container_taxonomies
150
+ Taxonomy.enabled_taxonomies.each do |taxonomy|
151
+ if params[:container][:"#{taxonomy}"].present?
152
+ @container.send(:"#{taxonomy}=", params[:container][:"#{taxonomy}"])
153
+ end
154
+ end
155
+ end
156
+
157
+ def action_permission
158
+ case params[:action]
159
+ when 'logs'
160
+ :view
161
+ when 'power'
162
+ :edit
163
+ else
164
+ super
165
+ end
166
+ end
167
+ end
168
+ end
169
+ end
170
+ # end
@@ -1,7 +1,7 @@
1
1
  class ContainersController < ::ApplicationController
2
2
  include ForemanDocker::FindContainer
3
3
 
4
- before_filter :find_container, :only => [:show, :commit]
4
+ before_filter :find_container, :only => [:show, :commit, :power]
5
5
 
6
6
  def index
7
7
  @container_resources = allowed_resources
@@ -48,6 +48,28 @@ class ContainersController < ::ApplicationController
48
48
  { :container => @container, :e => e }
49
49
  end
50
50
 
51
+ def power
52
+ compute_resource = @container.compute_resource
53
+ @docker_container = compute_resource.find_vm_by_uuid(@container.uuid)
54
+ run_container_action(@docker_container.ready? ? :stop : :start)
55
+ end
56
+
57
+ def run_container_action(action)
58
+ if @docker_container.send(action)
59
+ @docker_container.reload
60
+ notice _("%{vm} is now %{vm_state}") %
61
+ { :vm => @docker_container, :vm_state => @docker_container.state.capitalize }
62
+ redirect_to containers_path(:id => @container.id)
63
+ else
64
+ error _("failed to %{action} %{vm}") % { :action => _(action), :vm => @docker_container }
65
+ redirect_to :back
66
+ end
67
+ # This should only rescue Fog::Errors, but Fog returns all kinds of errors...
68
+ rescue => e
69
+ error _("Error - %{message}") % { :message => _(e.message) }
70
+ redirect_to :back
71
+ end
72
+
51
73
  private
52
74
 
53
75
  def action_permission
@@ -56,6 +78,16 @@ class ContainersController < ::ApplicationController
56
78
  :view
57
79
  when 'commit'
58
80
  :commit
81
+ when 'power'
82
+ :power_compute_resources_vms
83
+ else
84
+ super
85
+ end
86
+ end
87
+
88
+ def current_permission
89
+ if params[:action] == 'power'
90
+ :power_compute_resources_vms
59
91
  else
60
92
  super
61
93
  end
@@ -1,8 +1,4 @@
1
1
  module ContainersHelper
2
- def managed_icon(container, resource)
3
- icon_text(managed?(container, resource) ? 'check' : 'unchecked')
4
- end
5
-
6
2
  def managed?(container, resource)
7
3
  uuids_in_resource(resource).include? container.identity
8
4
  end
@@ -39,7 +35,7 @@ module ContainersHelper
39
35
  button_group(
40
36
  link_to(_('Commit'), '#commit-modal', :'data-toggle' => 'modal')
41
37
  ),
42
- button_group(vm_power_action(container.in_fog)),
38
+ button_group(container_power_action(container.in_fog)),
43
39
  button_group(
44
40
  display_delete_if_authorized(
45
41
  hash_for_container_path(:id => container.id)
@@ -51,6 +47,33 @@ module ContainersHelper
51
47
  )
52
48
  end
53
49
 
50
+ def container_power_action(vm, authorizer = nil)
51
+ if managed?(vm, @compute_resource)
52
+ id = Container.find_by_uuid(vm.identity).id
53
+ opts = hash_for_power_container_path(:id => id)
54
+ .merge(:auth_object => @compute_resource,
55
+ :permission => 'power_compute_resources_vms',
56
+ :authorizer => authorizer)
57
+ else
58
+ opts = hash_for_power_compute_resource_vm_path(:compute_resource_id => @compute_resource,
59
+ :id => vm.identity)
60
+ .merge(:auth_object => @compute_resource, :permission => 'power_compute_resources_vms',
61
+ :authorizer => authorizer)
62
+ end
63
+ html = if vm.ready?
64
+ { :confirm => power_on_off_message(vm), :class => "btn btn-danger" }
65
+ else
66
+ { :class => "btn btn-info" }
67
+ end
68
+
69
+ display_link_if_authorized "Power #{action_string(vm)}", opts, html.merge(:method => :put)
70
+ end
71
+
72
+ def power_on_off_message(vm)
73
+ _("Are you sure you want to power %{act} %{vm}?") % { :act => action_string(vm).downcase.strip,
74
+ :vm => vm }
75
+ end
76
+
54
77
  def auto_complete_docker_search(name, val, options = {})
55
78
  addClass options, 'form-control'
56
79
  text_field_tag(name, val, options)
@@ -0,0 +1,14 @@
1
+ # Compatibility fixes - to be removed once 1.7 compatibility is no longer required
2
+ module FogExtensions
3
+ module Fogdocker
4
+ module Images
5
+ extend ActiveSupport::Concern
6
+
7
+ def image_search(query = {})
8
+ Docker::Util.parse_json(Docker.connection.get('/images/search', query)).map do |image|
9
+ downcase_hash_keys(image)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -8,6 +8,7 @@ class DockerRegistry < ActiveRecord::Base
8
8
 
9
9
  validates_lengths_from_database
10
10
  validates :name, :presence => true, :uniqueness => true
11
+ validates :url, :presence => true, :uniqueness => true
11
12
 
12
13
  scoped_search :on => :name, :complete_value => true
13
14
  scoped_search :on => :url
@@ -0,0 +1,3 @@
1
+ object @container
2
+
3
+ attributes :id, :name, :uuid
@@ -0,0 +1,3 @@
1
+ collection @containers
2
+
3
+ extends 'api/v2/containers/main'
@@ -0,0 +1,9 @@
1
+ object @container
2
+
3
+ extends 'api/v2/containers/base'
4
+
5
+ attributes :command, :compute_resource_id, :compute_resource_name, :entrypoint,
6
+ :cpu_set, :cpu_shares, :memory, :tty,
7
+ :attach_stdin, :attach_stdout, :attach_stderr,
8
+ :repository_name, :tag, :registry_id, :registry_name,
9
+ :created_at, :updated_at
@@ -0,0 +1,7 @@
1
+ object @container
2
+
3
+ extends "api/v2/containers/main"
4
+
5
+ node do |container|
6
+ partial("api/v2/taxonomies/children_nodes", :object => container)
7
+ end
@@ -20,7 +20,7 @@
20
20
  <td> <%= vm.attributes['status'] %> </td>
21
21
  <td> <span <%= vm_power_class(vm.ready?) %>> <%= vm_state(vm) %></span> </td>
22
22
  <td>
23
- <%= action_buttons(vm_power_action(vm),
23
+ <%= action_buttons(container_power_action(vm),
24
24
  display_delete_if_authorized(hash_for_compute_resource_vm_path(:compute_resource_id => @compute_resource, :id => vm.id))) %>
25
25
  </td>
26
26
 
@@ -24,9 +24,9 @@
24
24
  <span class="glyphicon glyphicon-time"></span> <%= container.ready? ? time_ago_in_words(container.started_at) : "N/A" %>
25
25
  </td>
26
26
  <td class="hidden-tablet hidden-xs text-center"><%= link_to resource, compute_resource_path(resource) %> </td>
27
- <td class="hidden-tablet hidden-xs text-center"><%= managed_icon(container, resource) %></td>
27
+ <td class="hidden-tablet hidden-xs text-center"><%= managed?(container, resource) ? _('Yes') : _('No') %></td>
28
28
  <% @compute_resource = resource %>
29
- <td><%= action_buttons(vm_power_action(container),
29
+ <td><%= action_buttons(container_power_action(container),
30
30
  display_delete_if_authorized(hash_for_container_path(:compute_resource_id => resource,
31
31
  :id => container.id).
32
32
  merge(:auth_object => resource, :auth_action => 'destroy',
@@ -47,7 +47,7 @@
47
47
  <td><%= _('Environment Variables') %></td>
48
48
  <td>
49
49
  <table id="environment_variables" class="table table-bordered" style="table-layout:fixed; word-wrap: break-word">
50
- <% @container.in_fog.attributes['config_env'].each do |environment_variable| %>
50
+ <% (@container.in_fog.attributes['config_env'] || []).each do |environment_variable| %>
51
51
  <% pair = environment_variable.split("=") %>
52
52
  <tr>
53
53
  <td><b><%= pair.first %></b></td>
data/config/routes.rb CHANGED
@@ -2,6 +2,7 @@ Rails.application.routes.draw do
2
2
  resources :containers, :only => [:index, :new, :show, :destroy] do
3
3
  member do
4
4
  post :commit
5
+ put :power
5
6
  end
6
7
  end
7
8
 
@@ -10,10 +11,34 @@ Rails.application.routes.draw do
10
11
  end
11
12
 
12
13
  resources :image_search, :only => [] do
13
- get :auto_complete_repository_name, :on => :member
14
- get :auto_complete_image_tag, :on => :member
15
- get :search_repository, :on => :member
14
+ member do
15
+ get :auto_complete_repository_name
16
+ get :auto_complete_image_tag
17
+ get :search_repository
18
+ end
16
19
  end
17
20
 
18
- resources :registries, :only => [:index, :new, :create, :update, :destroy, :edit]
21
+ resources :registries, :except => [:show]
22
+
23
+ scope :foreman_docker, :path => '/docker' do
24
+ namespace :api, :defaults => { :format => 'json' } do
25
+ scope "(:apiv)", :module => :v2, :defaults => { :apiv => 'v2' }, :apiv => /v2/,
26
+ :constraints => ApiConstraints.new(:version => 2) do
27
+ resources :containers, :only => [:index, :create, :show, :destroy] do
28
+ member do
29
+ get :logs
30
+ put :power
31
+ end
32
+ end
33
+ resources :compute_resources, :only => [] do
34
+ resources :containers, :only => [:index, :create, :show, :destroy] do
35
+ member do
36
+ get :logs
37
+ put :power
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
19
44
  end
@@ -57,11 +57,20 @@ module ForemanDocker
57
57
  end
58
58
 
59
59
  security_block :containers do
60
- permission :view_containers, :containers => [:index, :show]
61
- permission :commit_containers, :containers => [:commit]
62
- permission :create_containers, :'containers/steps' => [:show, :update],
63
- :containers => [:new]
64
- permission :destroy_containers, :containers => [:destroy]
60
+ permission :view_containers,
61
+ :containers => [:index, :show],
62
+ :'api/v2/containers' => [:index, :show, :logs]
63
+ permission :commit_containers, :containers => [:commit]
64
+ permission :create_containers,
65
+ :'containers/steps' => [:show, :update],
66
+ :containers => [:new],
67
+ :'api/v2/containers' => [:create, :power]
68
+ permission :destroy_containers,
69
+ :containers => [:destroy],
70
+ :'api/v2/containers' => [:destroy]
71
+ permission :power_compute_resources_vms,
72
+ :containers => [:power],
73
+ :'api/v2/containers' => [:create, :power]
65
74
  end
66
75
 
67
76
  security_block :registries do
@@ -76,6 +85,26 @@ module ForemanDocker
76
85
  :auto_complete_image_tag,
77
86
  :search_repository]
78
87
  end
88
+
89
+ # apipie API documentation
90
+ # Only available in 1.8, otherwise it has to be in the initializer below
91
+ if SETTINGS[:version].to_s.include?('develop') ||
92
+ Gem::Version.new(SETTINGS[:version]) >= Gem::Version.new('1.8')
93
+ apipie_documented_controllers [
94
+ "#{ForemanDocker::Engine.root}/app/controllers/api/v2/*.rb"]
95
+ end
96
+ end
97
+ end
98
+
99
+ initializer "foreman_docker.apipie" do
100
+ # this condition is here for compatibility reason to work with Foreman 1.4.x
101
+ # Also need to handle the reverse of the 1.8 method above
102
+ unless SETTINGS[:version].to_s.include?('develop') ||
103
+ Gem::Version.new(SETTINGS[:version]) >= Gem::Version.new('1.8')
104
+ if Apipie.configuration.api_controllers_matcher.is_a?(Array)
105
+ Apipie.configuration.api_controllers_matcher <<
106
+ "#{ForemanDocker::Engine.root}/app/controllers/api/v2/*.rb"
107
+ end
79
108
  end
80
109
  end
81
110
 
@@ -85,13 +114,18 @@ module ForemanDocker
85
114
 
86
115
  require 'fog/fogdocker/models/compute/server'
87
116
  require 'fog/fogdocker/models/compute/image'
117
+ require 'fog/fogdocker/models/compute/images'
88
118
  require File.expand_path('../../../app/models/concerns/fog_extensions/fogdocker/server',
89
119
  __FILE__)
90
120
  require File.expand_path('../../../app/models/concerns/fog_extensions/fogdocker/image',
91
121
  __FILE__)
122
+ require File.expand_path('../../../app/models/concerns/fog_extensions/fogdocker/images',
123
+ __FILE__)
92
124
  config.to_prepare do
93
125
  Fog::Compute::Fogdocker::Server.send(:include, ::FogExtensions::Fogdocker::Server)
94
126
  Fog::Compute::Fogdocker::Image.send(:include, ::FogExtensions::Fogdocker::Image)
127
+ # Compatibility fixes - to be removed once 1.7 compatibility is no longer required
128
+ Fog::Compute::Fogdocker::Images.send(:include, ::FogExtensions::Fogdocker::Images)
95
129
  ::Taxonomy.send(:include, ForemanDocker::TaxonomyExtensions)
96
130
  end
97
131
  end
@@ -1,3 +1,3 @@
1
1
  module ForemanDocker
2
- VERSION = '1.1.0'
2
+ VERSION = '1.2.0'
3
3
  end
@@ -0,0 +1,70 @@
1
+ require 'test_plugin_helper'
2
+
3
+ module Api
4
+ module V2
5
+ class ContainersControllerTest < ActionController::TestCase
6
+ test 'index returns a list of all containers' do
7
+ get :index, {}, set_session_user
8
+ assert_response :success
9
+ assert_template 'index'
10
+ end
11
+
12
+ context 'container operations' do
13
+ setup do
14
+ @container = FactoryGirl.create(:container, :name => 'foo')
15
+ end
16
+
17
+ test 'logs returns latest lines of container log' do
18
+ fake_container = Struct.new(:logs)
19
+ fake_container.expects(:logs).returns('I am a log').twice
20
+ Docker::Container.expects(:get).with(@container.uuid).returns(fake_container)
21
+ get :logs, :id => @container.id
22
+ assert_response :success
23
+ assert_equal ActiveSupport::JSON.decode(response.body)['logs'], fake_container.logs
24
+ end
25
+
26
+ test 'show returns information about container' do
27
+ get :show, :id => @container.id
28
+ assert_response :success
29
+ assert_equal ActiveSupport::JSON.decode(response.body)['name'], 'foo'
30
+ end
31
+
32
+ test 'delete removes a container in foreman and in Docker host' do
33
+ delete :destroy, :id => @container.id
34
+ assert_response :success
35
+ assert_equal ActiveSupport::JSON.decode(response.body)['name'], 'foo'
36
+ end
37
+
38
+ test 'power call turns on/off container in Docker host' do
39
+ Fog.mock!
40
+ Fog::Compute::Fogdocker::Server.any_instance.expects(:start)
41
+ put :power, :id => @container.id, :power_action => 'start'
42
+ assert_response :success
43
+ end
44
+
45
+ test 'power call checks status of container in Docker host' do
46
+ Fog.mock!
47
+ Fog::Compute::Fogdocker::Server.any_instance.expects(:ready?).returns(false)
48
+ put :power, :id => @container.id, :power_action => 'status'
49
+ assert_response :success
50
+ assert_equal ActiveSupport::JSON.decode(response.body)['running'], false
51
+ end
52
+
53
+ test 'power call host' do
54
+ Fog.mock!
55
+ Fog::Compute::Fogdocker::Server.any_instance.expects(:ready?).returns(false)
56
+ put :power, :id => @container.id, :power_action => 'status'
57
+ assert_response :success
58
+ assert_equal ActiveSupport::JSON.decode(response.body)['running'], false
59
+ end
60
+
61
+ test 'creates a container with correct params' do
62
+ Service::Containers.any_instance.expects(:pull_image).returns(true)
63
+ Service::Containers.any_instance.expects(:start_container).returns(true)
64
+ post :create, :container => { :name => 'foo', :registry_id => 3, :image => 'centos:7' }
65
+ assert_response :created
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -8,6 +8,7 @@ class ContainerIntegrationTest < ActionDispatch::IntegrationTest
8
8
 
9
9
  context 'available compute resource' do
10
10
  test 'shows containers list if compute resource is available' do
11
+ Fog.mock!
11
12
  ComputeResource.any_instance.stubs(:vms).returns([])
12
13
  FactoryGirl.create(:docker_cr)
13
14
  visit containers_path
@@ -22,8 +22,9 @@ class DockerRegistryTest < ActiveSupport::TestCase
22
22
  assert registry.is_decryptable?(registry.password_in_db)
23
23
  end
24
24
 
25
- test 'registries need a name' do
26
- registry = FactoryGirl.build(:docker_registry, :name => '')
27
- refute registry.valid?
25
+ %w(name url).each do |property|
26
+ test "registries need a #{property}" do
27
+ refute FactoryGirl.build(:docker_registry, property.to_sym => '').valid?
28
+ end
28
29
  end
29
30
  end
metadata CHANGED
@@ -1,41 +1,41 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_docker
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.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: 2015-02-10 00:00:00.000000000 Z
11
+ date: 2015-02-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: docker-api
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ~>
18
18
  - !ruby/object:Gem::Version
19
- version: '1.13'
19
+ version: '1.17'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ~>
25
25
  - !ruby/object:Gem::Version
26
- version: '1.13'
26
+ version: '1.17'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: wicked
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ~>
32
32
  - !ruby/object:Gem::Version
33
33
  version: '1.1'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ~>
39
39
  - !ruby/object:Gem::Version
40
40
  version: '1.1'
41
41
  description: Provision and manage Docker containers and images from Foreman.
@@ -45,92 +45,99 @@ executables: []
45
45
  extensions: []
46
46
  extra_rdoc_files: []
47
47
  files:
48
- - LICENSE
49
- - README.md
50
- - Rakefile
51
- - app/assets/javascripts/foreman_docker/image_step.js
52
- - app/assets/stylesheets/foreman_docker/autocomplete.css.scss
53
- - app/assets/stylesheets/foreman_docker/terminal.css.scss
54
- - app/controllers/concerns/foreman_docker/find_container.rb
55
- - app/controllers/containers/steps_controller.rb
56
- - app/controllers/containers_controller.rb
57
- - app/controllers/image_search_controller.rb
58
- - app/controllers/registries_controller.rb
59
- - app/helpers/container_steps_helper.rb
60
- - app/helpers/containers_helper.rb
61
- - app/models/concerns/fog_extensions/fogdocker/image.rb
62
- - app/models/concerns/fog_extensions/fogdocker/server.rb
63
- - app/models/concerns/foreman_docker/parameter_validators.rb
64
- - app/models/container.rb
65
- - app/models/docker_container_wizard_state.rb
66
- - app/models/docker_container_wizard_states/configuration.rb
67
- - app/models/docker_container_wizard_states/environment.rb
68
- - app/models/docker_container_wizard_states/environment_variable.rb
69
- - app/models/docker_container_wizard_states/image.rb
70
- - app/models/docker_container_wizard_states/preliminary.rb
71
- - app/models/docker_registry.rb
72
- - app/models/environment_variable.rb
73
- - app/models/foreman_docker/docker.rb
74
- - app/models/foreman_docker/taxonomy_extensions.rb
75
- - app/models/service/containers.rb
76
- - app/models/service/registry_api.rb
77
- - app/views/api/v1/compute_resources/docker.json
78
- - app/views/api/v2/compute_resources/docker.json
79
48
  - app/views/compute_resources/form/_docker.html.erb
80
49
  - app/views/compute_resources/show/_docker.html.erb
81
- - app/views/compute_resources_vms/form/_docker.html.erb
82
- - app/views/compute_resources_vms/index/_docker.html.erb
83
- - app/views/compute_resources_vms/show/_docker.html.erb
84
- - app/views/containers/_list.html.erb
85
- - app/views/containers/index.html.erb
86
- - app/views/containers/show.html.erb
87
- - app/views/containers/steps/_form_buttons.html.erb
88
- - app/views/containers/steps/_image_hub_tab.html.erb
89
- - app/views/containers/steps/_title.html.erb
90
- - app/views/containers/steps/configuration.html.erb
50
+ - app/views/image_search/_repository_search_results.html.erb
51
+ - app/views/api/v2/compute_resources/docker.json
52
+ - app/views/api/v2/containers/main.json.rabl
53
+ - app/views/api/v2/containers/base.json.rabl
54
+ - app/views/api/v2/containers/index.json.rabl
55
+ - app/views/api/v2/containers/show.json.rabl
56
+ - app/views/api/v1/compute_resources/docker.json
91
57
  - app/views/containers/steps/environment.html.erb
58
+ - app/views/containers/steps/_title.html.erb
59
+ - app/views/containers/steps/_form_buttons.html.erb
92
60
  - app/views/containers/steps/image.html.erb
93
61
  - app/views/containers/steps/preliminary.html.erb
94
- - app/views/foreman_docker/common_parameters/_environment_variable.html.erb
95
- - app/views/image_search/_repository_search_results.html.erb
96
- - app/views/images/form/_docker.html.erb
97
- - app/views/registries/_form.html.erb
62
+ - app/views/containers/steps/_image_hub_tab.html.erb
63
+ - app/views/containers/steps/configuration.html.erb
64
+ - app/views/containers/_list.html.erb
65
+ - app/views/containers/show.html.erb
66
+ - app/views/containers/index.html.erb
98
67
  - app/views/registries/edit.html.erb
99
- - app/views/registries/index.html.erb
100
68
  - app/views/registries/new.html.erb
69
+ - app/views/registries/_form.html.erb
70
+ - app/views/registries/index.html.erb
71
+ - app/views/foreman_docker/common_parameters/_environment_variable.html.erb
72
+ - app/views/images/form/_docker.html.erb
73
+ - app/views/compute_resources_vms/form/_docker.html.erb
74
+ - app/views/compute_resources_vms/index/_docker.html.erb
75
+ - app/views/compute_resources_vms/show/_docker.html.erb
76
+ - app/models/docker_registry.rb
77
+ - app/models/service/registry_api.rb
78
+ - app/models/service/containers.rb
79
+ - app/models/concerns/fog_extensions/fogdocker/image.rb
80
+ - app/models/concerns/fog_extensions/fogdocker/images.rb
81
+ - app/models/concerns/fog_extensions/fogdocker/server.rb
82
+ - app/models/concerns/foreman_docker/parameter_validators.rb
83
+ - app/models/docker_container_wizard_state.rb
84
+ - app/models/container.rb
85
+ - app/models/environment_variable.rb
86
+ - app/models/foreman_docker/taxonomy_extensions.rb
87
+ - app/models/foreman_docker/docker.rb
88
+ - app/models/docker_container_wizard_states/environment.rb
89
+ - app/models/docker_container_wizard_states/image.rb
90
+ - app/models/docker_container_wizard_states/configuration.rb
91
+ - app/models/docker_container_wizard_states/environment_variable.rb
92
+ - app/models/docker_container_wizard_states/preliminary.rb
93
+ - app/controllers/api/v2/containers_controller.rb
94
+ - app/controllers/containers/steps_controller.rb
95
+ - app/controllers/concerns/foreman_docker/find_container.rb
96
+ - app/controllers/registries_controller.rb
97
+ - app/controllers/image_search_controller.rb
98
+ - app/controllers/containers_controller.rb
99
+ - app/helpers/containers_helper.rb
100
+ - app/helpers/container_steps_helper.rb
101
+ - app/assets/javascripts/foreman_docker/image_step.js
102
+ - app/assets/stylesheets/foreman_docker/terminal.css.scss
103
+ - app/assets/stylesheets/foreman_docker/autocomplete.css.scss
101
104
  - config/routes.rb
102
- - db/migrate/20140930175337_add_email_to_compute_resource.rb
105
+ - db/migrate/20141018110810_add_uuid_to_containers.rb
106
+ - db/migrate/20141028164206_change_memory_in_container.rb
103
107
  - db/migrate/20141005233312_create_containers.rb
108
+ - db/migrate/20141028164633_change_cpuset_in_container.rb
109
+ - db/migrate/20141009011026_add_attributes_to_container.rb
110
+ - db/migrate/20141222113313_create_wizard_states.rb
111
+ - db/migrate/20150129054944_add_katello_flag_to_containers.rb
104
112
  - db/migrate/20141007225130_add_compute_resource_id_to_container.rb
105
113
  - db/migrate/20141009001613_add_tag_to_container.rb
106
- - db/migrate/20141009011026_add_attributes_to_container.rb
114
+ - db/migrate/20141120123003_add_user_credentials_to_docker_registries.rb
115
+ - db/migrate/20140930175337_add_email_to_compute_resource.rb
107
116
  - db/migrate/20141010173220_create_docker_images.rb
108
- - db/migrate/20141018110810_add_uuid_to_containers.rb
117
+ - db/migrate/20150122011747_add_katello_flag_to_docker_wizard_image.rb
109
118
  - db/migrate/20141024163003_create_docker_registries.rb
110
- - db/migrate/20141028164206_change_memory_in_container.rb
111
- - db/migrate/20141028164633_change_cpuset_in_container.rb
112
- - db/migrate/20141120123003_add_user_credentials_to_docker_registries.rb
113
119
  - db/migrate/20141209182008_remove_docker_tables.rb
114
- - db/migrate/20141222113313_create_wizard_states.rb
115
- - db/migrate/20150122011747_add_katello_flag_to_docker_wizard_image.rb
116
- - db/migrate/20150129054944_add_katello_flag_to_containers.rb
117
- - lib/foreman_docker.rb
118
- - lib/foreman_docker/engine.rb
119
120
  - lib/foreman_docker/tasks/test.rake
120
121
  - lib/foreman_docker/version.rb
122
+ - lib/foreman_docker/engine.rb
123
+ - lib/foreman_docker.rb
121
124
  - locale/Makefile
125
+ - LICENSE
126
+ - Rakefile
127
+ - README.md
128
+ - test/functionals/api/v2/containers_controller_test.rb
129
+ - test/functionals/containers_steps_controller_test.rb
130
+ - test/functionals/container_controller_test.rb
131
+ - test/factories/docker_registry.rb
122
132
  - test/factories/compute_resources.rb
123
133
  - test/factories/containers.rb
124
- - test/factories/docker_registry.rb
125
- - test/functionals/container_controller_test.rb
126
- - test/functionals/containers_steps_controller_test.rb
127
- - test/integration/container_steps_test.rb
128
- - test/integration/container_test.rb
129
- - test/test_plugin_helper.rb
130
134
  - test/units/container_test.rb
131
- - test/units/containers_service_test.rb
132
135
  - test/units/docker_registry_test.rb
133
136
  - test/units/registry_api_test.rb
137
+ - test/units/containers_service_test.rb
138
+ - test/test_plugin_helper.rb
139
+ - test/integration/container_steps_test.rb
140
+ - test/integration/container_test.rb
134
141
  homepage: http://github.com/theforeman/foreman-docker
135
142
  licenses:
136
143
  - GPL-3
@@ -141,21 +148,22 @@ require_paths:
141
148
  - lib
142
149
  required_ruby_version: !ruby/object:Gem::Requirement
143
150
  requirements:
144
- - - ">="
151
+ - - '>='
145
152
  - !ruby/object:Gem::Version
146
153
  version: '0'
147
154
  required_rubygems_version: !ruby/object:Gem::Requirement
148
155
  requirements:
149
- - - ">="
156
+ - - '>='
150
157
  - !ruby/object:Gem::Version
151
158
  version: '0'
152
159
  requirements: []
153
160
  rubyforge_project:
154
- rubygems_version: 2.4.5
161
+ rubygems_version: 2.0.14
155
162
  signing_key:
156
163
  specification_version: 4
157
164
  summary: Provision and manage Docker containers and images from Foreman
158
165
  test_files:
166
+ - test/functionals/api/v2/containers_controller_test.rb
159
167
  - test/functionals/containers_steps_controller_test.rb
160
168
  - test/functionals/container_controller_test.rb
161
169
  - test/factories/docker_registry.rb