Project

General

Profile

Download (3.61 KB) Statistics
| Branch: | Tag: | Revision:

foreman-docker / app / controllers / containers_controller.rb @ 387babdd

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
  # This should only rescue Fog::Errors, but Fog returns all kinds of errors...
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
    # Unmanaged container - only present in Compute Resource
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 # Managed container
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