1
|
class ContainersController < ::ApplicationController
|
2
|
before_filter :find_resource, :only => [:show, :auto_complete_image, :auto_complete_image_tags,
|
3
|
:commit]
|
4
|
|
5
|
def index
|
6
|
@container_resources = allowed_resources.select { |cr| cr.provider == 'Docker' }
|
7
|
if @container_resources.empty?
|
8
|
warning('You need a Compute Resource of type Docker to start managing containers')
|
9
|
redirect_to new_compute_resource_path
|
10
|
end
|
11
|
|
12
|
rescue
|
13
|
process_error
|
14
|
end
|
15
|
|
16
|
def new
|
17
|
@container = Container.create
|
18
|
redirect_to container_step_path(:container_id => @container.id, :id => :preliminary)
|
19
|
end
|
20
|
|
21
|
def destroy
|
22
|
if resource_deletion
|
23
|
process_success(:success_redirect => containers_path,
|
24
|
:success_msg => (_("Container %s is being deleted.") %
|
25
|
@deleted_identifier))
|
26
|
else
|
27
|
process_error(:redirect => containers_path)
|
28
|
end
|
29
|
rescue ActiveRecord::RecordNotFound
|
30
|
not_found
|
31
|
end
|
32
|
|
33
|
def show
|
34
|
end
|
35
|
|
36
|
def auto_complete_image
|
37
|
images = @container.compute_resource.all_images(params[:search]).map do |image|
|
38
|
image.info['RepoTags'].map do |image_tag|
|
39
|
name, _ = image_tag.split(':')
|
40
|
name
|
41
|
end
|
42
|
end
|
43
|
render :json => images.flatten.uniq.map do |n|
|
44
|
{ :label => CGI.escapeHTML(n), :value => CGI.escapeHTML(n) }
|
45
|
end
|
46
|
end
|
47
|
|
48
|
def auto_complete_image_tags
|
49
|
images = @container.compute_resource.all_images(params[:search]).map do |image|
|
50
|
image.info['RepoTags'].map do |image_tag|
|
51
|
_, tag = image_tag.split(':')
|
52
|
{ :label => CGI.escapeHTML(tag), :value => CGI.escapeHTML(tag) }
|
53
|
end
|
54
|
end
|
55
|
render :json => images.flatten
|
56
|
end
|
57
|
|
58
|
def commit
|
59
|
Docker::Container.get(@container.uuid).commit(:author => params[:commit][:author],
|
60
|
:repo => params[:commit][:repo],
|
61
|
:tag => params[:commit][:tag],
|
62
|
:comment => params[:commit][:comment])
|
63
|
|
64
|
process_success :success_redirect => :back,
|
65
|
:success_msg => _("%{container} commit was successful") %
|
66
|
{ :container => @container }
|
67
|
rescue => e
|
68
|
process_error :redirect => :back, :error_msg => _("Failed to commit %{container}: %{e}") %
|
69
|
{ :container => @container, :e => e }
|
70
|
end
|
71
|
|
72
|
private
|
73
|
|
74
|
def action_permission
|
75
|
case params[:action]
|
76
|
when 'auto_complete_image', 'auto_complete_image_tags'
|
77
|
:view
|
78
|
when 'commit'
|
79
|
:commit
|
80
|
else
|
81
|
super
|
82
|
end
|
83
|
end
|
84
|
|
85
|
def resource_deletion
|
86
|
|
87
|
if params[:compute_resource_id].present?
|
88
|
@deleted_identifier = params[:id]
|
89
|
destroy_compute_resource_vm(params[:compute_resource_id], params[:id])
|
90
|
else
|
91
|
find_resource
|
92
|
@deleted_identifier = @container.name
|
93
|
|
94
|
destroy_compute_resource_vm(@container.compute_resource, @container.uuid) &&
|
95
|
@container.destroy
|
96
|
end
|
97
|
end
|
98
|
|
99
|
def destroy_compute_resource_vm(resource_id, uuid)
|
100
|
@container_resource = ComputeResource.authorized(:destroy_compute_resources_vms)
|
101
|
.find(resource_id)
|
102
|
@container_resource.destroy_vm(uuid)
|
103
|
rescue => error
|
104
|
logger.error "#{error.message} (#{error.class})\n#{error.backtrace.join("\n")}"
|
105
|
false
|
106
|
end
|
107
|
|
108
|
def allowed_resources
|
109
|
ComputeResource.authorized(:view_compute_resources)
|
110
|
end
|
111
|
end
|