Project

General

Profile

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

foreman_docker / app / controllers / image_search_controller.rb @ c36fdec1

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).map do |item|
64
      # el7 returns -> "name" => "docker.io: docker.io/centos",
65
      # while f20 returns -> "name" => "centos"
66
      # we need repo name to be => "docker.io/centos" for el7 and "centos" for fedora
67
      # to ensure proper search with respect to the tags, image creation etc.
68
      new_item = item.clone
69
      new_item["name"] = item["name"].split.last
70
      new_item
71
    end
72
  end
73

    
74
  def registry_image_exists?(term)
75
    result = ::Service::RegistryApi.new(:url => @registry.url,
76
                                        :user => @registry.username,
77
                                        :password => @registry.password).search(term)
78
    registry_name = term.split('/').size > 1 ? term :
79
        'library/' + term
80
    result['results'].any? { |r| r['name'] == registry_name }
81
  end
82

    
83
  def registry_auto_complete_image_tags(terms)
84
    ::Service::RegistryApi.new(:url => @registry.url,
85
                               :user => @registry.username,
86
                               :password => @registry.password).list_repository_tags(terms).keys
87
  end
88

    
89
  def registry_search_image(terms)
90
    r = ::Service::RegistryApi.new(:url => @registry.url,
91
                                   :user => @registry.username,
92
                                   :password => @registry.password).search(terms)
93
    r['results']
94
  end
95

    
96
  def action_permission
97
    case params[:action]
98
    when 'auto_complete_repository_name', 'auto_complete_image_tag', 'search_repository'
99
      :search_repository
100
    else
101
      super
102
    end
103
  end
104

    
105
  def find_resource
106
    if params[:registry_id].present?
107
      @registry = DockerRegistry.authorized(:view_registries).find(params[:registry_id])
108
    else
109
      @compute_resource = ComputeResource.authorized(:view_compute_resources).find(params[:id])
110
    end
111
  rescue ActiveRecord::RecordNotFound
112
    not_found
113
  end
114
end