Project

General

Profile

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

foreman-docker / app / controllers / image_search_controller.rb @ d2e54db4

1
class ImageSearchController < ::ApplicationController
2
  before_filter :find_resource
3

    
4
  def auto_complete_repository_name
5
    catch_network_errors do
6
      render :text => (use_hub? ? hub_image_exists?(params[:search]) :
7
          registry_image_exists?(params[:search])).to_s
8
    end
9
  end
10

    
11
  def auto_complete_image_tag
12
    catch_network_errors do
13
      # This is the format jQuery UI autocomplete expects
14
      tags = use_hub? ? hub_auto_complete_image_tags(params[:search]) :
15
          registry_auto_complete_image_tags(params[:search])
16
      respond_to do |format|
17
        format.js do
18
          tags.map! { |tag| { :label => CGI.escapeHTML(tag), :value => CGI.escapeHTML(tag) } }
19
          render :json => tags
20
        end
21
      end
22
    end
23
  end
24

    
25
  def search_repository
26
    catch_network_errors do
27
      repositories = use_hub? ? hub_search_image(params[:search]) :
28
                                registry_search_image(params[:search])
29
      respond_to do |format|
30
        format.js do
31
          render :partial => 'repository_search_results',
32
                 :locals  => { :repositories => repositories,
33
                               :use_hub => use_hub? }
34
        end
35
      end
36
    end
37
  end
38

    
39
  def catch_network_errors
40
    yield
41
  rescue Docker::Error::NotFoundError => e
42
    # not an error
43
    logger.debug "image not found: #{e.backtrace}"
44
    render :js, :nothing => true
45
  rescue Docker::Error::DockerError, Excon::Errors::Error, SystemCallError => e
46
    render :js => _("An error occured during repository search: '%s'") % e.message,
47
           :status => 500
48
  end
49

    
50
  def use_hub?
51
    @registry.nil?
52
  end
53

    
54
  def hub_image_exists?(terms)
55
    @compute_resource.exist?(terms)
56
  end
57

    
58
  def hub_auto_complete_image_tags(terms)
59
    @compute_resource.tags(terms)
60
  end
61

    
62
  def hub_search_image(terms)
63
    @compute_resource.search(terms)
64
  end
65

    
66
  def registry_image_exists?(term)
67
    result = ::Service::RegistryApi.new(:url => @registry.url,
68
                                        :user => @registry.username,
69
                                        :password => @registry.password).search(term)
70
    registry_name = term.split('/').size > 1 ? term :
71
        'library/' + term
72
    result['results'].any? { |r| r['name'] == registry_name }
73
  end
74

    
75
  def registry_auto_complete_image_tags(terms)
76
    ::Service::RegistryApi.new(:url => @registry.url,
77
                               :user => @registry.username,
78
                               :password => @registry.password).list_repository_tags(terms).keys
79
  end
80

    
81
  def registry_search_image(terms)
82
    r = ::Service::RegistryApi.new(:url => @registry.url,
83
                                   :user => @registry.username,
84
                                   :password => @registry.password).search(terms)
85
    r['results']
86
  end
87

    
88
  def action_permission
89
    case params[:action]
90
    when 'auto_complete_repository_name', 'auto_complete_image_tag', 'search_repository'
91
      :search_repository
92
    else
93
      super
94
    end
95
  end
96

    
97
  def find_resource
98
    if params[:registry_id].present?
99
      @registry = DockerRegistry.authorized(:view_registries).find(params[:registry_id])
100
    else
101
      @compute_resource = ComputeResource.authorized(:view_compute_resources).find(params[:id])
102
    end
103
  rescue ActiveRecord::RecordNotFound
104
    not_found
105
  end
106
end