3 define_request :base do
5 meta :provider, :openstack
8 meta :endpoint_type, :public
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]
21 elsif keystone_v2_style_session_data?
22 h['X-Auth-Token'] = session_data[:body][:access][:token][:id]
24 elsif keystone_v3_style_session_data?
25 h['X-Auth-Token'] = session_data[:headers]['x-subject-token']
28 raise "Unknown session data format!"
38 if session_data[:base_url]
39 session_data[:base_url]
41 elsif keystone_v2_style_session_data? && keystone_v2_style_service_info?
42 extract_base_url_from_keystone_v2_session_data
44 elsif keystone_v3_style_session_data? && keystone_v3_style_service_info?
45 extract_base_url_from_keystone_v3_session_data
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 }"
51 elsif session_data[:auth_service] && session_data[:auth_service][:host_uri]
52 session_data[:auth_service][:host_uri]
55 raise Aviator::Service::MissingServiceEndpointError.new(service.to_s, self.class)
60 def build_service_type_string
61 api_versions_without_a_suffix = [
71 if api_versions_without_a_suffix.include? [service, api_version]
74 "#{ service }#{ api_version }"
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]
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']
89 endpoints.find{ |s| s['interface'] == endpoint_type.to_s }['url']
93 def keystone_v2_style_service_info?
94 not session_data[:body][:access][:serviceCatalog].find{ |s| s[:type] == build_service_type_string }.nil?
98 def keystone_v2_style_session_data?
99 session_data.has_key?(:body) && session_data[:body].has_key?(:access)
103 def keystone_v3_style_service_info?
104 not session_data[:body][:token][:catalog].find{ |s| s[:type] == build_service_type_string }.nil?
108 def keystone_v3_style_session_data?
109 session_data.has_key?(:headers) && session_data[:headers].has_key?("x-subject-token")
113 def params_to_querystring(param_names)
116 param_names.each do |param_name|
117 filters << "#{ param_name }=#{ params[param_name] }" if params[param_name]
120 filters.empty? ? "" : "?#{ filters.join('&') }"