]> git.donarmstrong.com Git - dsa-puppet.git/blob - 3rdparty/modules/aviator/lib/puppet/feature/aviator/openstack/common/requests/v0/public/base.rb
add aimonb/aviator to 3rdparty
[dsa-puppet.git] / 3rdparty / modules / aviator / lib / puppet / feature / aviator / openstack / common / requests / v0 / public / base.rb
1 module Aviator
2
3   define_request :base do
4
5     meta :provider,      :openstack
6     meta :service,       :common
7     meta :api_version,   :v0
8     meta :endpoint_type, :public
9
10     def headers
11       {}.tap do |h|
12         if self.anonymous?
13           # do nothing
14
15         elsif session_data.has_key? :service_token
16           # service_token is the token that one would bootstrap OpenStack
17           # with during the installation process. This token can be used
18           # directly and does not require authentication beforehand.
19           h['X-Auth-Token'] = session_data[:service_token]
20
21         elsif keystone_v2_style_session_data?
22           h['X-Auth-Token'] = session_data[:body][:access][:token][:id]
23
24         elsif keystone_v3_style_session_data?
25           h['X-Auth-Token'] = session_data[:headers]['x-subject-token']
26
27         else
28           raise "Unknown session data format!"
29
30         end
31       end
32     end
33
34
35     private
36
37     def base_url
38       if session_data[:base_url]
39         session_data[:base_url]
40
41       elsif keystone_v2_style_session_data? && keystone_v2_style_service_info?
42         extract_base_url_from_keystone_v2_session_data
43
44       elsif keystone_v3_style_session_data? && keystone_v3_style_service_info?
45         extract_base_url_from_keystone_v3_session_data
46
47       elsif session_data[:auth_service] && session_data[:auth_service][:host_uri] && session_data[:auth_service][:api_version]
48         version = session_data[:auth_service][:api_version].to_s == "v2" ? "v2.0" : session_data[:auth_service][:api_version]
49         "#{ session_data[:auth_service][:host_uri] }/#{ version }"
50
51       elsif session_data[:auth_service] && session_data[:auth_service][:host_uri]
52         session_data[:auth_service][:host_uri]
53
54       else
55         raise Aviator::Service::MissingServiceEndpointError.new(service.to_s, self.class)
56       end
57     end
58
59
60     def build_service_type_string
61       api_versions_without_a_suffix = [
62         [:compute,  :v2],
63         [:ec2,      :v1],
64         [:identity, :v2],
65         [:image,    :v1],
66         [:metering, :v1],
67         [:s3,       :v1],
68         [:volume,   :v1]
69       ]
70
71       if api_versions_without_a_suffix.include? [service, api_version]
72         service.to_s
73       else
74         "#{ service }#{ api_version }"
75       end
76     end
77
78
79     def extract_base_url_from_keystone_v2_session_data
80       service_info = session_data[:body][:access][:serviceCatalog].find{ |s| s[:type] == build_service_type_string }
81       service_info[:endpoints][0]["#{ endpoint_type }URL".to_sym]
82     end
83
84
85     def extract_base_url_from_keystone_v3_session_data
86       service_info = session_data[:body][:token][:catalog].select{ |s| s[:type] == build_service_type_string }
87       endpoints = service_info.find{ |s| s.keys.include? "endpoints" }['endpoints']
88
89       endpoints.find{ |s| s['interface'] == endpoint_type.to_s }['url']
90     end
91
92
93     def keystone_v2_style_service_info?
94       not session_data[:body][:access][:serviceCatalog].find{ |s| s[:type] == build_service_type_string }.nil?
95     end
96
97
98     def keystone_v2_style_session_data?
99       session_data.has_key?(:body) && session_data[:body].has_key?(:access)
100     end
101
102
103     def keystone_v3_style_service_info?
104         not session_data[:body][:token][:catalog].find{ |s| s[:type] == build_service_type_string }.nil?
105     end
106
107
108     def keystone_v3_style_session_data?
109       session_data.has_key?(:headers) && session_data[:headers].has_key?("x-subject-token")
110     end
111
112
113     def params_to_querystring(param_names)
114       filters = []
115
116       param_names.each do |param_name|
117         filters << "#{ param_name }=#{ params[param_name] }" if params[param_name]
118       end
119
120       filters.empty? ? "" : "?#{ filters.join('&') }"
121     end
122
123   end
124
125 end