foreman_docker 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/foreman_docker/image_step.js +4 -4
- data/app/controllers/concerns/foreman_docker/find_container.rb +1 -1
- data/app/controllers/containers/steps_controller.rb +18 -8
- data/app/controllers/containers_controller.rb +4 -4
- data/app/controllers/registries_controller.rb +1 -1
- data/app/helpers/container_steps_helper.rb +2 -2
- data/app/helpers/containers_helper.rb +8 -1
- data/app/models/docker_container_wizard_state.rb +4 -4
- data/app/models/docker_container_wizard_states/configuration.rb +3 -0
- data/app/models/docker_container_wizard_states/environment.rb +4 -3
- data/app/models/docker_container_wizard_states/environment_variable.rb +1 -1
- data/app/models/docker_container_wizard_states/preliminary.rb +12 -0
- data/app/models/foreman_docker/docker.rb +25 -6
- data/app/models/foreman_docker/taxonomy_extensions.rb +14 -0
- data/app/models/service/containers.rb +18 -6
- data/app/views/containers/_list.html.erb +2 -2
- data/app/views/containers/show.html.erb +1 -1
- data/app/views/containers/steps/configuration.html.erb +1 -1
- data/app/views/containers/steps/environment.html.erb +2 -2
- data/app/views/containers/steps/image.html.erb +15 -9
- data/app/views/containers/steps/preliminary.html.erb +2 -2
- data/app/views/image_search/_repository_search_results.html.erb +1 -1
- data/app/views/registries/index.html.erb +3 -3
- data/lib/foreman_docker/engine.rb +12 -9
- data/lib/foreman_docker/version.rb +1 -1
- data/test/functionals/containers_steps_controller_test.rb +2 -1
- data/test/units/containers_service_test.rb +7 -3
- metadata +3 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 79d46d67b21374126131d7fc7550feb71bbabb2c
|
4
|
+
data.tar.gz: 1b8d4d788c2ba1c72ab8aa62641082aff4a7c8e1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 813096a864f743b67807f6065aa581d18a6c5182653dcb93c5e0d187378dcf62e91e92c1a377090cd32b76eac5df61faf5d0ffc2efa6f8ceb6840f49cacba30b
|
7
|
+
data.tar.gz: 7d1e069cdbc84cc05078274476f19ad69441f454f5d20775e155fb3cdfe4df1cd949f25c8db582bbaa00284e4ac8db01ce5dbf64f1d5e008dae7538c476b00fc
|
@@ -18,7 +18,7 @@ $(document).ready(function() {
|
|
18
18
|
});
|
19
19
|
|
20
20
|
$('#hub_tab').click( function() {
|
21
|
-
$('#
|
21
|
+
$('#docker_container_wizard_states_image_registry_id').val('');
|
22
22
|
});
|
23
23
|
});
|
24
24
|
|
@@ -26,7 +26,7 @@ function autoCompleteRepo(item) {
|
|
26
26
|
$.ajax({
|
27
27
|
type:'get',
|
28
28
|
url: $(item).attr('data-url'),
|
29
|
-
data: { search: item.val(), registry_id: $('#
|
29
|
+
data: { search: item.val(), registry_id: $('#docker_container_wizard_states_image_registry_id').val() },
|
30
30
|
//data:'search=' + item.val(),
|
31
31
|
success:function (result) {
|
32
32
|
if(result == 'true'){
|
@@ -52,7 +52,7 @@ function setAutocompleteTags() {
|
|
52
52
|
tag.addClass('tags-autocomplete-loading');
|
53
53
|
tag.val('');
|
54
54
|
var source = [];
|
55
|
-
$.getJSON( tag.data("url"), { search: $('#search').val(), registry_id: $('#
|
55
|
+
$.getJSON( tag.data("url"), { search: $('#search').val(), registry_id: $('#docker_container_wizard_states_image_registry_id').val() },
|
56
56
|
function(data) {
|
57
57
|
$('#searching_spinner').hide();
|
58
58
|
tag.removeClass('tags-autocomplete-loading');
|
@@ -72,7 +72,7 @@ function searchRepo(item) {
|
|
72
72
|
type:'get',
|
73
73
|
dataType:'text',
|
74
74
|
url: $(item).attr('data-url'),
|
75
|
-
data: { search: $('#search').val(), registry_id: $('#
|
75
|
+
data: { search: $('#search').val(), registry_id: $('#docker_container_wizard_states_image_registry_id').val() },
|
76
76
|
success: function (result) {
|
77
77
|
$('#repository_search_results').html(result);
|
78
78
|
},
|
@@ -5,8 +5,9 @@ module Containers
|
|
5
5
|
|
6
6
|
steps :preliminary, :image, :configuration, :environment
|
7
7
|
|
8
|
-
before_filter :
|
9
|
-
before_filter :
|
8
|
+
before_filter :find_state
|
9
|
+
before_filter :build_state, :only => [:update]
|
10
|
+
before_filter :set_form, :only => [:show]
|
10
11
|
|
11
12
|
def show
|
12
13
|
@container_resources = allowed_resources if step == :preliminary
|
@@ -23,25 +24,34 @@ module Containers
|
|
23
24
|
|
24
25
|
private
|
25
26
|
|
26
|
-
def
|
27
|
+
def find_state
|
27
28
|
@state = DockerContainerWizardState.find(params[:wizard_state_id])
|
28
|
-
@state.send(:"build_#{step}", params[:"docker_container_wizard_states_#{step}"])
|
29
29
|
rescue ActiveRecord::RecordNotFound
|
30
30
|
not_found
|
31
31
|
end
|
32
32
|
|
33
|
+
def build_state
|
34
|
+
s = @state.send(:"build_#{step}", params[:"docker_container_wizard_states_#{step}"])
|
35
|
+
instance_variable_set("@docker_container_wizard_states_#{step}", s)
|
36
|
+
end
|
37
|
+
|
33
38
|
def set_form
|
34
|
-
instance_variable_set(
|
39
|
+
instance_variable_set(
|
40
|
+
"@docker_container_wizard_states_#{step}",
|
41
|
+
@state.send(:"#{step}") || @state.send(:"build_#{step}"))
|
35
42
|
end
|
36
43
|
|
37
44
|
def create_container
|
38
45
|
@state.send(:"create_#{step}", params[:"docker_container_wizard_states_#{step}"])
|
39
|
-
container = Service::Containers.start_container!(@state)
|
46
|
+
container = (service = Service::Containers.new).start_container!(@state)
|
40
47
|
if container.present?
|
41
48
|
process_success(:object => container, :success_redirect => container_path(container))
|
42
49
|
else
|
43
|
-
@
|
44
|
-
process_error(
|
50
|
+
@docker_container_wizard_states_environment = @state.environment
|
51
|
+
process_error(
|
52
|
+
:error_msg => service.errors,
|
53
|
+
:object => @state.environment,
|
54
|
+
:render => 'environment')
|
45
55
|
end
|
46
56
|
end
|
47
57
|
end
|
@@ -42,10 +42,10 @@ class ContainersController < ::ApplicationController
|
|
42
42
|
|
43
43
|
process_success :success_redirect => :back,
|
44
44
|
:success_msg => _("%{container} commit was successful") %
|
45
|
-
|
45
|
+
{ :container => @container }
|
46
46
|
rescue => e
|
47
47
|
process_error :redirect => :back, :error_msg => _("Failed to commit %{container}: %{e}") %
|
48
|
-
|
48
|
+
{ :container => @container, :e => e }
|
49
49
|
end
|
50
50
|
|
51
51
|
private
|
@@ -71,13 +71,13 @@ class ContainersController < ::ApplicationController
|
|
71
71
|
@deleted_identifier = @container.name
|
72
72
|
|
73
73
|
destroy_compute_resource_vm(@container.compute_resource, @container.uuid) &&
|
74
|
-
|
74
|
+
@container.destroy
|
75
75
|
end
|
76
76
|
end
|
77
77
|
|
78
78
|
def destroy_compute_resource_vm(resource_id, uuid)
|
79
79
|
@container_resource = ComputeResource.authorized(:destroy_compute_resources_vms)
|
80
|
-
|
80
|
+
.find(resource_id)
|
81
81
|
@container_resource.destroy_vm(uuid)
|
82
82
|
rescue => error
|
83
83
|
logger.error "#{error.message} (#{error.class})\n#{error.backtrace.join("\n")}"
|
@@ -8,9 +8,9 @@ module ContainerStepsHelper
|
|
8
8
|
|
9
9
|
def select_registry(f)
|
10
10
|
registries = DockerRegistry.with_taxonomy_scope_override(@location, @organization)
|
11
|
-
|
11
|
+
.authorized(:view_registries)
|
12
12
|
field(f, 'docker_container_wizard_states_image[registry_id]', :label => _("Registry")) do
|
13
|
-
collection_select :
|
13
|
+
collection_select :docker_container_wizard_states_image, :registry_id,
|
14
14
|
registries,
|
15
15
|
:id, :name,
|
16
16
|
{ :prompt => _("Select a registry") },
|
@@ -10,7 +10,7 @@ module ContainersHelper
|
|
10
10
|
def uuids_in_resource(resource)
|
11
11
|
@uuids_in_resource ||= {}
|
12
12
|
@uuids_in_resource[resource.id] ||= Container.where(:compute_resource_id => resource.id)
|
13
|
-
|
13
|
+
.pluck(:uuid)
|
14
14
|
end
|
15
15
|
|
16
16
|
def link_to_container(container, resource)
|
@@ -63,4 +63,11 @@ module ContainersHelper
|
|
63
63
|
"https://registry.hub.docker.com/u/#{image['name']}"
|
64
64
|
end
|
65
65
|
end
|
66
|
+
|
67
|
+
# Compatibility fixes - to be removed once 1.7 compatibility is no longer required
|
68
|
+
if SETTINGS[:version].to_s.to_f <= 1.7
|
69
|
+
def trunc_with_tooltip(text, length = 32)
|
70
|
+
trunc(text, length)
|
71
|
+
end
|
72
|
+
end
|
66
73
|
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
class DockerContainerWizardState < ActiveRecord::Base
|
2
2
|
has_one :preliminary, :class_name => DockerContainerWizardStates::Preliminary,
|
3
|
-
|
3
|
+
:dependent => :destroy, :validate => true, :autosave => true
|
4
4
|
has_one :image, :class_name => DockerContainerWizardStates::Image,
|
5
|
-
|
5
|
+
:dependent => :destroy, :validate => true, :autosave => true
|
6
6
|
has_one :configuration, :class_name => DockerContainerWizardStates::Configuration,
|
7
|
-
|
7
|
+
:dependent => :destroy, :validate => true, :autosave => true
|
8
8
|
has_one :environment, :class_name => DockerContainerWizardStates::Environment,
|
9
|
-
|
9
|
+
:dependent => :destroy, :validate => true, :autosave => true
|
10
10
|
|
11
11
|
delegate :compute_resource_id, :to => :preliminary
|
12
12
|
delegate :environment_variables, :to => :environment
|
@@ -3,5 +3,8 @@ 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 :name, :presence => true
|
8
|
+
validates :command, :presence => true
|
6
9
|
end
|
7
10
|
end
|
@@ -7,9 +7,10 @@ module DockerContainerWizardStates
|
|
7
7
|
# that forces validation of reference_id. This will fail on new records as
|
8
8
|
# validations are executed before parent and children records have been persisted.
|
9
9
|
has_many :environment_variables, :dependent => :destroy, :foreign_key => :reference_id,
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
:inverse_of => :environment,
|
11
|
+
:class_name =>
|
12
|
+
'DockerContainerWizardStates::EnvironmentVariable',
|
13
|
+
:validate => false
|
13
14
|
include ::ParameterValidators
|
14
15
|
|
15
16
|
accepts_nested_attributes_for :environment_variables, :allow_destroy => true
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module DockerContainerWizardStates
|
2
2
|
class EnvironmentVariable < Parameter
|
3
3
|
belongs_to :environment, :foreign_key => :reference_id, :inverse_of => :environment_variables,
|
4
|
-
|
4
|
+
:class_name => 'DockerContainerWizardStates::Environment'
|
5
5
|
validates :name, :uniqueness => { :scope => :reference_id }
|
6
6
|
end
|
7
7
|
end
|
@@ -7,5 +7,17 @@ module DockerContainerWizardStates
|
|
7
7
|
:foreign_key => :docker_container_wizard_state_id
|
8
8
|
|
9
9
|
validates :compute_resource_id, :presence => true
|
10
|
+
|
11
|
+
def used_location_ids
|
12
|
+
Location.joins(:taxable_taxonomies).where(
|
13
|
+
'taxable_taxonomies.taxable_type' => 'DockerContainerWizardStates::Preliminary',
|
14
|
+
'taxable_taxonomies.taxable_id' => id).pluck(:id)
|
15
|
+
end
|
16
|
+
|
17
|
+
def used_organization_ids
|
18
|
+
Organization.joins(:taxable_taxonomies).where(
|
19
|
+
'taxable_taxonomies.taxable_type' => 'DockerContainerWizardStates::Preliminary',
|
20
|
+
'taxable_taxonomies.taxable_id' => id).pluck(:id)
|
21
|
+
end
|
10
22
|
end
|
11
23
|
end
|
@@ -24,6 +24,10 @@ module ForemanDocker
|
|
24
24
|
16 * 1024 * 1024 * 1024
|
25
25
|
end
|
26
26
|
|
27
|
+
def max_cpu_count
|
28
|
+
::Docker.info['NCPU'] || 1
|
29
|
+
end
|
30
|
+
|
27
31
|
def available_images
|
28
32
|
client.images.all
|
29
33
|
end
|
@@ -71,16 +75,21 @@ module ForemanDocker
|
|
71
75
|
def create_container(args = {})
|
72
76
|
options = vm_instance_defaults.merge(args)
|
73
77
|
logger.debug("Creating container with the following options: #{options.inspect}")
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
78
|
+
docker_command do
|
79
|
+
::Docker::Container.create(options)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def create_image(args = {})
|
84
|
+
logger.debug("Creating docker image with the following options: #{args.inspect}")
|
85
|
+
docker_command do
|
86
|
+
::Docker::Image.create(args)
|
87
|
+
end
|
79
88
|
end
|
80
89
|
|
81
90
|
def vm_instance_defaults
|
82
91
|
ActiveSupport::HashWithIndifferentAccess.new('name' => "foreman_#{Time.now.to_i}",
|
83
|
-
'
|
92
|
+
'Cmd' => ['/bin/bash'])
|
84
93
|
end
|
85
94
|
|
86
95
|
def console(uuid)
|
@@ -104,6 +113,16 @@ module ForemanDocker
|
|
104
113
|
|
105
114
|
protected
|
106
115
|
|
116
|
+
def docker_command
|
117
|
+
yield
|
118
|
+
rescue Excon::Errors::Error, ::Docker::Error::DockerError => e
|
119
|
+
logger.debug "Fog error: #{e.message}\n " + e.backtrace.join("\n ")
|
120
|
+
errors.add(:base,
|
121
|
+
_("Error creating communicating with Docker. Check the Foreman logs: %s") %
|
122
|
+
e.message.to_s)
|
123
|
+
false
|
124
|
+
end
|
125
|
+
|
107
126
|
def bootstrap(args)
|
108
127
|
client.servers.bootstrap vm_instance_defaults.merge(args.to_hash)
|
109
128
|
rescue Fog::Errors::Error => e
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module ForemanDocker
|
2
|
+
module TaxonomyExtensions
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
if SETTINGS[:version].to_s.to_f <= 1.7
|
7
|
+
def self.enabled_taxonomies
|
8
|
+
%w(locations organizations).select { |taxonomy| SETTINGS["#{taxonomy}_enabled".to_sym] }
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
# To be removed after 1.7 compatibility is no longer required
|
@@ -1,11 +1,15 @@
|
|
1
1
|
module Service
|
2
2
|
class Containers
|
3
|
-
def
|
3
|
+
def errors
|
4
|
+
@errors ||= []
|
5
|
+
end
|
6
|
+
|
7
|
+
def start_container!(wizard_state)
|
4
8
|
ActiveRecord::Base.transaction do
|
5
9
|
container = Container.new(wizard_state.container_attributes) do |r|
|
6
10
|
# eagerly load environment variables
|
7
11
|
state = DockerContainerWizardState.includes(:environment => [:environment_variables])
|
8
|
-
|
12
|
+
.find(wizard_state.id)
|
9
13
|
state.environment_variables.each do |environment_variable|
|
10
14
|
r.environment_variables.build :name => environment_variable.name,
|
11
15
|
:value => environment_variable.value,
|
@@ -16,7 +20,7 @@ module Service
|
|
16
20
|
container.send(:"#{taxonomy}=", wizard_state.preliminary.send(:"#{taxonomy}"))
|
17
21
|
end
|
18
22
|
|
19
|
-
fail ActiveRecord::Rollback unless start_container(container)
|
23
|
+
fail ActiveRecord::Rollback unless pull_image(container) && start_container(container)
|
20
24
|
|
21
25
|
container.save!
|
22
26
|
destroy_wizard_state(wizard_state)
|
@@ -24,13 +28,21 @@ module Service
|
|
24
28
|
end
|
25
29
|
end
|
26
30
|
|
27
|
-
def
|
31
|
+
def pull_image(container)
|
32
|
+
container.compute_resource.create_image(:fromImage => container.repository_pull_url)
|
33
|
+
end
|
34
|
+
|
35
|
+
def start_container(container)
|
28
36
|
started = container.compute_resource.create_container(container.parametrize)
|
29
|
-
|
37
|
+
if started
|
38
|
+
container.uuid = started.id
|
39
|
+
else
|
40
|
+
errors << container.compute_resource.errors[:base]
|
41
|
+
end
|
30
42
|
started
|
31
43
|
end
|
32
44
|
|
33
|
-
def
|
45
|
+
def destroy_wizard_state(wizard_state)
|
34
46
|
wizard_state.destroy
|
35
47
|
DockerContainerWizardState.destroy_all(["updated_at < ?", (Time.now - 24.hours)])
|
36
48
|
end
|
@@ -18,8 +18,8 @@
|
|
18
18
|
<td class="ellipsis text-center"><%= link_to_container(container, resource) %></td>
|
19
19
|
<td class="hidden-tablet hidden-xs text-center">
|
20
20
|
<span <%= vm_power_class(container.ready?) %>><%= vm_state(container) %></span></td>
|
21
|
-
<td class="hidden-tablet hidden-xs text-center"><%=
|
22
|
-
<td class="hidden-tablet hidden-xs text-center"><%=
|
21
|
+
<td class="hidden-tablet hidden-xs text-center"><%= trunc_with_tooltip(container.image_friendly_name) %></td>
|
22
|
+
<td class="hidden-tablet hidden-xs text-center"><%= trunc_with_tooltip(container.command) %></td>
|
23
23
|
<td class="hidden-tablet hidden-xs text-center">
|
24
24
|
<span class="glyphicon glyphicon-time"></span> <%= container.ready? ? time_ago_in_words(container.started_at) : "N/A" %>
|
25
25
|
</td>
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<%= render :layout => 'title', :locals => { :step => 3 } do %>
|
2
|
-
<%= form_for @
|
2
|
+
<%= form_for @docker_container_wizard_states_configuration, :url => wizard_path, :method => :put do |f| %>
|
3
3
|
<h3><%= _("Basic options") %></h3>
|
4
4
|
<%= text_f f, :name, :size => 'col-md-4' %>
|
5
5
|
<%= text_f f, :command, :size => 'col-md-4' %>
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<%= render :layout => 'title', :locals => { :step => 4 } do %>
|
2
|
-
<%= form_for @
|
2
|
+
<%= form_for @docker_container_wizard_states_environment, :url => wizard_path, :method => :put do |f| %>
|
3
3
|
<div class='row'>
|
4
4
|
<div class='col-md-6 col-md-push-7'>
|
5
5
|
<h3><%= _("Shell") %></h3>
|
@@ -10,7 +10,7 @@
|
|
10
10
|
</div>
|
11
11
|
<div class='col-md-6 col-md-pull-6'>
|
12
12
|
<h3><%= _("Environment variables") %></h3>
|
13
|
-
<%= f.fields_for :environment_variables, @
|
13
|
+
<%= f.fields_for :environment_variables, @docker_container_wizard_states_environment.environment_variables do |builder| %>
|
14
14
|
<%= render 'foreman_docker/common_parameters/environment_variable', :f => builder %>
|
15
15
|
<% end %>
|
16
16
|
<%= link_to_add_fields(_("Add environment variable"), f, :environment_variables,
|
@@ -3,21 +3,27 @@
|
|
3
3
|
|
4
4
|
<%= render :layout => 'title', :locals => { :step => 2 } do %>
|
5
5
|
<ul class="nav nav-tabs" data-tabs="tabs">
|
6
|
-
<li class
|
6
|
+
<li class=<%= ("active" if @docker_container_wizard_states_image.registry_id.nil?) %>><a href="#hub" data-toggle="tab" id="hub_tab">
|
7
7
|
<span class="glyphicon glyphicon-cloud-download"></span>
|
8
8
|
<%= _("Docker hub") %>
|
9
9
|
</a></li>
|
10
|
-
<li
|
10
|
+
<li class=<%= ("active" unless @docker_container_wizard_states_image.registry_id.nil?) %>><a href="#registry" data-toggle="tab" id="registry_tab">
|
11
11
|
<span class="glyphicon glyphicon-cloud-download"></span>
|
12
12
|
<%= _("External registry") %>
|
13
13
|
</a></li>
|
14
14
|
</ul>
|
15
15
|
|
16
|
-
<%= form_for @
|
16
|
+
<%= form_for @docker_container_wizard_states_image, :class => 'form-horizontal', :url => wizard_path, :method => :put do |f| %>
|
17
17
|
<div class="tab-content">
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
<% if @docker_container_wizard_states_image.registry_id.nil? %>
|
19
|
+
<div class="tab-pane active" id="hub">
|
20
|
+
</div>
|
21
|
+
<div class="tab-pane" id="registry">
|
22
|
+
<% else %>
|
23
|
+
<div class="tab-pane" id="hub">
|
24
|
+
</div>
|
25
|
+
<div class="tab-pane active" id="registry">
|
26
|
+
<% end %>
|
21
27
|
<div class="input-group col-md-6">
|
22
28
|
<%= select_registry f %>
|
23
29
|
</div>
|
@@ -28,7 +34,7 @@
|
|
28
34
|
<div class="input-group">
|
29
35
|
|
30
36
|
<%= auto_complete_docker_search('docker_container_wizard_states_image[repository_name]', '',
|
31
|
-
:'data-url' => auto_complete_repository_name_image_search_path(@
|
37
|
+
:'data-url' => auto_complete_repository_name_image_search_path(@docker_container_wizard_states_image.compute_resource_id),
|
32
38
|
:value => f.object.repository_name.present? ? f.object.repository_name : '',
|
33
39
|
:id => :search,
|
34
40
|
:focus_on_load => true,
|
@@ -38,7 +44,7 @@
|
|
38
44
|
<%= button_tag(:class => 'btn btn-default',
|
39
45
|
:type => 'button',
|
40
46
|
:id => 'search_repository',
|
41
|
-
:'data-url' => search_repository_image_search_path(@
|
47
|
+
:'data-url' => search_repository_image_search_path(@docker_container_wizard_states_image.compute_resource_id),
|
42
48
|
:onclick => 'searchRepo(this)') do %>
|
43
49
|
<span class="glyphicon glyphicon-search"></span>
|
44
50
|
<% end %>
|
@@ -47,7 +53,7 @@
|
|
47
53
|
</div>
|
48
54
|
<%= text_f f, :tag,
|
49
55
|
:id => 'tag',
|
50
|
-
:'data-url' => auto_complete_image_tag_image_search_path(@
|
56
|
+
:'data-url' => auto_complete_image_tag_image_search_path(@docker_container_wizard_states_image.compute_resource_id) %>
|
51
57
|
<div class="col-md-12">
|
52
58
|
<div id='searching_spinner' class='col-md-offset-3 hide'>
|
53
59
|
<span id='waiting_text'>
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<%= render :layout => 'title', :locals => { :step => 1 } do %>
|
2
|
-
<%= form_for @
|
2
|
+
<%= form_for @docker_container_wizard_states_preliminary, :url => wizard_path, :method => :put do |f| %>
|
3
3
|
<ul class="nav nav-tabs" data-tabs="tabs">
|
4
4
|
<li class="active"><a href="#primary" data-toggle="tab">
|
5
5
|
<span class="glyphicon glyphicon-tasks"></span>
|
@@ -26,7 +26,7 @@
|
|
26
26
|
</div>
|
27
27
|
<% end %>
|
28
28
|
</div>
|
29
|
-
<%= render "taxonomies/loc_org_tabs", :f => f, :obj => @
|
29
|
+
<%= render "taxonomies/loc_org_tabs", :f => f, :obj => @docker_container_wizard_states_preliminary %>
|
30
30
|
</div>
|
31
31
|
<% if @container_resources.present? %>
|
32
32
|
<%= render :partial => 'form_buttons' %>
|
@@ -6,7 +6,7 @@
|
|
6
6
|
<span class="glyphicon glyphicon-star"></span> <%= repository['star_count'] %>
|
7
7
|
</p>
|
8
8
|
<p>
|
9
|
-
<%=
|
9
|
+
<%= trunc_with_tooltip(repository['description']) %>
|
10
10
|
<%= link_to '<span class="glyphicon glyphicon-share"></span>'.html_safe, hub_url(repository), :target => '_blank' %>
|
11
11
|
</p>
|
12
12
|
<% end %>
|
@@ -17,9 +17,9 @@
|
|
17
17
|
|
18
18
|
<% @registries.each do |r| %>
|
19
19
|
<tr>
|
20
|
-
<td><%= link_to_if_authorized
|
21
|
-
<td class="hidden-tablet hidden-xs text-center"><%=
|
22
|
-
<td class="hidden-tablet hidden-xs text-center"><%=
|
20
|
+
<td><%= link_to_if_authorized trunc_with_tooltip(r.name), hash_for_edit_registry_path(:id => r).merge(:auth_object => r, :authorizer => authorizer) %></td>
|
21
|
+
<td class="hidden-tablet hidden-xs text-center"><%= trunc_with_tooltip(r.url) %></td>
|
22
|
+
<td class="hidden-tablet hidden-xs text-center"><%= trunc_with_tooltip(r.description) %></td>
|
23
23
|
<td><%= display_delete_if_authorized hash_for_registry_path(:id => r).merge(:auth_object => r, :authorizer => authorizer), :confirm => _("Delete %s?") % r.name %></td>
|
24
24
|
</tr>
|
25
25
|
<% end %>
|
@@ -77,19 +77,22 @@ module ForemanDocker
|
|
77
77
|
:search_repository]
|
78
78
|
end
|
79
79
|
end
|
80
|
-
|
81
80
|
end
|
82
81
|
|
83
82
|
rake_tasks do
|
84
83
|
load "#{ForemanDocker::Engine.root}/lib/foreman_docker/tasks/test.rake"
|
85
84
|
end
|
86
|
-
end
|
87
85
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
86
|
+
require 'fog/fogdocker/models/compute/server'
|
87
|
+
require 'fog/fogdocker/models/compute/image'
|
88
|
+
require File.expand_path('../../../app/models/concerns/fog_extensions/fogdocker/server',
|
89
|
+
__FILE__)
|
90
|
+
require File.expand_path('../../../app/models/concerns/fog_extensions/fogdocker/image',
|
91
|
+
__FILE__)
|
92
|
+
config.to_prepare do
|
93
|
+
Fog::Compute::Fogdocker::Server.send(:include, ::FogExtensions::Fogdocker::Server)
|
94
|
+
Fog::Compute::Fogdocker::Image.send(:include, ::FogExtensions::Fogdocker::Image)
|
95
|
+
::Taxonomy.send(:include, ForemanDocker::TaxonomyExtensions)
|
96
|
+
end
|
97
|
+
end
|
95
98
|
end
|
@@ -8,7 +8,8 @@ module Containers
|
|
8
8
|
|
9
9
|
test 'wizard finishes with a redirect to the managed container' do
|
10
10
|
state = DockerContainerWizardState.create!
|
11
|
-
Service::Containers.expects(:start_container!).with(equals(state))
|
11
|
+
Service::Containers.any_instance.expects(:start_container!).with(equals(state))
|
12
|
+
.returns(@container)
|
12
13
|
put :update, { :wizard_state_id => state.id,
|
13
14
|
:id => :environment,
|
14
15
|
:docker_container_wizard_states_environment => { :tty => false } },
|
@@ -7,15 +7,19 @@ class ContainersServiceTest < ActiveSupport::TestCase
|
|
7
7
|
:locations => [taxonomies(:location1)],
|
8
8
|
:organizations => [taxonomies(:organization1)])
|
9
9
|
s.build_image(:repository_name => 'test', :tag => 'test')
|
10
|
-
s.build_configuration(:name => 'test')
|
10
|
+
s.build_configuration(:name => 'test', :command => '/bin/bash')
|
11
11
|
s.build_environment(:tty => false)
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
15
|
test 'removes current state after successful container creation' do
|
16
|
+
ret = OpenStruct.new(:id => 1)
|
17
|
+
ForemanDocker::Docker.any_instance.expects(:create_image).returns(ret).with do |subject|
|
18
|
+
subject.must_equal(:fromImage => "test:test")
|
19
|
+
end
|
16
20
|
ForemanDocker::Docker.any_instance.expects(:create_container)
|
17
|
-
|
18
|
-
Service::Containers.start_container!(@state)
|
21
|
+
.returns(OpenStruct.new(:uuid => 1))
|
22
|
+
Service::Containers.new.start_container!(@state)
|
19
23
|
assert_equal DockerContainerWizardState.where(:id => @state.id).count, 0
|
20
24
|
end
|
21
25
|
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: 1.0.
|
4
|
+
version: 1.0.1
|
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-
|
11
|
+
date: 2015-02-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: docker-api
|
@@ -38,20 +38,6 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1.1'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: rubocop
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0.26'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0.26'
|
55
41
|
description: Provision and manage Docker containers and images from Foreman.
|
56
42
|
email:
|
57
43
|
- dlobatog@redhat.com, abenari@redhat.com
|
@@ -85,6 +71,7 @@ files:
|
|
85
71
|
- app/models/docker_registry.rb
|
86
72
|
- app/models/environment_variable.rb
|
87
73
|
- app/models/foreman_docker/docker.rb
|
74
|
+
- app/models/foreman_docker/taxonomy_extensions.rb
|
88
75
|
- app/models/service/containers.rb
|
89
76
|
- app/models/service/registry_api.rb
|
90
77
|
- app/views/api/v1/compute_resources/docker.json
|