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
|
|
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
|
|
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
|