aviator 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. data/README.md +9 -1
  2. data/aviator.gemspec +1 -1
  3. data/bin/aviator +6 -86
  4. data/lib/aviator/core/cli/describer.rb +95 -0
  5. data/lib/aviator/core/cli.rb +1 -0
  6. data/lib/aviator/core/request.rb +62 -65
  7. data/lib/aviator/core/service.rb +26 -41
  8. data/lib/aviator/core/session.rb +7 -0
  9. data/lib/aviator/core.rb +1 -0
  10. data/lib/aviator/openstack/compute/v2/public/list_images.rb +51 -42
  11. data/lib/aviator/openstack/compute/v2/public/list_servers.rb +58 -0
  12. data/lib/aviator/openstack/identity/v2/admin/create_tenant.rb +43 -32
  13. data/lib/aviator/openstack/identity/v2/admin/list_tenants.rb +49 -38
  14. data/lib/aviator/openstack/identity/v2/public/create_token.rb +53 -47
  15. data/lib/aviator/openstack/identity/v2/public/list_tenants.rb +36 -26
  16. data/lib/aviator/version.rb +1 -1
  17. data/lib/aviator.rb +1 -0
  18. data/test/aviator/core/cli/describer_test.rb +140 -0
  19. data/test/aviator/core/request_test.rb +132 -157
  20. data/test/aviator/core/service_test.rb +49 -26
  21. data/test/aviator/core/session_test.rb +29 -0
  22. data/test/aviator/openstack/compute/v2/public/list_images_test.rb +16 -18
  23. data/test/aviator/openstack/compute/v2/public/list_servers_test.rb +178 -0
  24. data/test/aviator/openstack/identity/v2/admin/create_tenant_test.rb +10 -12
  25. data/test/aviator/openstack/identity/v2/public/create_token_test.rb +12 -14
  26. data/test/cassettes/core/service/i_default_session_data_/sets_the_service_s_default_session_data.yml +1 -1
  27. data/test/cassettes/core/service/i_request/accepts_an_endpoint_type_option_for_selecting_a_specific_request.yml +1 -1
  28. data/test/cassettes/core/service/i_request/can_find_the_correct_request_based_on_bootstrapped_session_data.yml +1 -1
  29. data/test/cassettes/core/service/i_request/can_find_the_correct_request_based_on_non-bootstrapped_session_data.yml +1 -1
  30. data/test/cassettes/core/service/i_request/can_find_the_correct_request_if_api_version_is_not_defined_but_can_be_inferred_from_host_uri.yml +1 -1
  31. data/test/cassettes/core/service/i_request/uses_the_default_session_data_if_session_data_is_not_provided.yml +1 -1
  32. data/test/cassettes/core/session/c_load/creates_a_new_instance_from_the_given_session_dump.yml +1 -1
  33. data/test/cassettes/core/session/c_load/uses_the_loaded_auth_info_for_its_services.yml +1 -1
  34. data/test/cassettes/core/session/c_new/directs_log_entries_to_the_given_log_file.yml +1 -1
  35. data/test/cassettes/core/session/i_authenticate/authenticates_against_the_auth_service_indicated_in_the_config_file.yml +1 -1
  36. data/test/cassettes/core/session/i_authenticate/authenticates_against_the_auth_service_using_the_credentials_in_the_given_block.yml +1 -1
  37. data/test/cassettes/core/session/i_authenticate/updates_the_session_data_of_its_service_objects.yml +2 -2
  38. data/test/cassettes/core/session/i_dump/serializes_the_session_data_for_caching.yml +1 -1
  39. data/test/cassettes/core/session/i_load/returns_itself.yml +63 -0
  40. data/test/cassettes/core/session/i_load/updates_the_session_data_of_its_service_objects.yml +123 -0
  41. data/test/cassettes/core/session/i_validate/returns_false_if_session_is_no_longer_valid.yml +1 -1
  42. data/test/cassettes/core/session/i_validate/returns_true_if_session_is_still_valid.yml +1 -1
  43. data/test/cassettes/core/session/i_xxx_service/returns_an_instance_of_the_indicated_service.yml +1 -1
  44. data/test/cassettes/openstack/compute/v2/public/list_images/leads_to_a_valid_response_when_no_parameters_are_provided.yml +1 -1
  45. data/test/cassettes/openstack/compute/v2/public/list_images/leads_to_a_valid_response_when_parameters_are_invalid.yml +1 -1
  46. data/test/cassettes/openstack/compute/v2/public/list_images/leads_to_a_valid_response_when_parameters_are_valid.yml +1 -1
  47. data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_body.yml +1 -1
  48. data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_body_.yml +1 -1
  49. data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_headers.yml +1 -1
  50. data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_headers_.yml +1 -1
  51. data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_http_method_.yml +63 -0
  52. data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_url.yml +1 -1
  53. data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_url_.yml +1 -1
  54. data/test/cassettes/openstack/compute/v2/public/list_servers/leads_to_a_valid_response_when_no_parameters_are_provided.yml +101 -0
  55. data/test/cassettes/openstack/compute/v2/public/list_servers/leads_to_a_valid_response_when_parameters_are_invalid.yml +95 -0
  56. data/test/cassettes/openstack/compute/v2/public/list_servers/leads_to_a_valid_response_when_parameters_are_valid.yml +109 -0
  57. data/test/cassettes/openstack/compute/v2/public/list_servers/returns_the_correct_value_for_body_.yml +62 -0
  58. data/test/cassettes/openstack/compute/v2/public/list_servers/returns_the_correct_value_for_headers_.yml +62 -0
  59. data/test/cassettes/openstack/compute/v2/public/list_servers/returns_the_correct_value_for_http_method_.yml +62 -0
  60. data/test/cassettes/openstack/compute/v2/public/list_servers/returns_the_correct_value_for_url_.yml +62 -0
  61. data/test/cassettes/openstack/identity/v2/admin/create_tenant/leads_to_a_valid_response_when_params_are_invalid.yml +1 -1
  62. data/test/cassettes/openstack/identity/v2/admin/create_tenant/leads_to_a_valid_response_when_params_are_valid.yml +1 -1
  63. data/test/cassettes/openstack/identity/v2/admin/create_tenant/leads_to_a_valid_response_when_provided_with_invalid_params.yml +1 -1
  64. data/test/cassettes/openstack/identity/v2/public/create_token/leads_to_a_valid_response_when_parameters_are_valid.yml +1 -1
  65. data/test/cassettes/openstack/identity/v2/public/create_token/leads_to_a_valid_response_when_provided_with_a_token.yml +2 -2
  66. data/test/support/{openstack_request_test_helper.rb → request_helper.rb} +21 -2
  67. data/test/support/test_base_class.rb +1 -1
  68. data/test/support/test_reporter.rb +4 -2
  69. data/test/support/vcr_setup.rb +4 -0
  70. data/test/test_helper.rb +5 -1
  71. metadata +38 -10
data/README.md CHANGED
@@ -25,7 +25,7 @@ Or install it yourself as:
25
25
  ## Usage
26
26
 
27
27
  ```ruby
28
- require 'aviator'
28
+ require 'aviator/core'
29
29
 
30
30
  # Create a new session. See 'Configuration' below for the config file format.
31
31
  session = Aviator::Session.new(
@@ -59,6 +59,14 @@ str = session.dump
59
59
  # If you employed any form of encryption on the string, make sure to decrypt it first!
60
60
  session = Aviator::Session.load(str)
61
61
 
62
+ # In some instances, Session::load is inefficient because it creates a new session object
63
+ # each time. In a web app environment, for instance, having to destroy and recreate the
64
+ # session object can take its toll on performance. In such a scenario, use Session#load
65
+ # (instance method, as opposed to class method). This will 'infect' an already existing
66
+ # session object with the supplied session dump and return itself instead of creating
67
+ # a brand new session object.
68
+ session.load(other_session_dump)
69
+
62
70
  # Depending on how old the loaded session dump is, the auth_info may already be expired.
63
71
  # Check if it's still current by calling Session#validate and reauthenticate as needed.
64
72
  #
data/aviator.gemspec CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_dependency 'faraday', '~> 0.8.0'
22
- spec.add_dependency 'activesupport', '~> 4.0.0'
22
+ spec.add_dependency 'activesupport', '>= 3.2.8'
23
23
  spec.add_dependency 'thor', '~> 0.18.1'
24
24
 
25
25
  spec.add_development_dependency "bundler", "~> 1.3"
data/bin/aviator CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
-
3
2
  require 'bundler/setup'
4
3
  require 'thor'
5
- require 'aviator/core'
4
+ require 'aviator'
5
+ require 'aviator/core/cli'
6
6
 
7
7
  module Aviator
8
8
  module CLI
@@ -12,98 +12,18 @@ module CLI
12
12
  desc 'describe [PROVIDER] [SERVICE] [API_VERSION ENDPOINT_TYPE REQUEST_NAME]', 'Describes various parts of Aviator.'
13
13
  def describe(provider=nil, service=nil, api_version=nil, endpoint_type=nil, request=nil)
14
14
  if request
15
- describe_request provider, service, api_version, endpoint_type, request
15
+ puts Aviator::Describer.describe_request(provider, service, api_version, endpoint_type, request)
16
16
  elsif service
17
- describe_service provider, service
17
+ puts Aviator::Describer.describe_service(provider, service)
18
18
  elsif provider
19
- describe_provider provider
19
+ puts Aviator::Describer.describe_provider(provider)
20
20
  else
21
- list_providers
22
- end
23
- end
24
-
25
-
26
- private
27
-
28
-
29
- def describe_provider(provider)
30
- puts "Available services from #{ provider }"
31
-
32
- Dir[Pathname.new(__FILE__).join('..', '..', 'lib', 'aviator', provider, '**')].each do |d|
33
- puts " #{ Pathname.new(d).basename }"
34
- end
35
- end
36
-
37
-
38
- def describe_request(provider, service, api_version, endpoint_type, request_name)
39
- endpoints = Service.new(provider: provider, service: service).requests[api_version.to_sym]
40
- raise "Invalid API version #{ api_version }" unless endpoints
41
-
42
- requests = endpoints[endpoint_type.to_sym]
43
- raise "Invalid endpoint type #{ endpoint_type }" unless requests
44
-
45
- request = requests[request_name.to_sym]
46
- raise "Could not find request named #{ request_name }. Try a different api version or endpoint" unless request
47
-
48
- puts "Request: #{ request_name }"
49
-
50
- params = []
51
-
52
- request.optional_params.each do |param|
53
- params << [param, :optional]
54
- end
55
-
56
- request.required_params.each do |param|
57
- params << [param, :required]
21
+ puts Aviator::Describer.describe_aviator
58
22
  end
59
-
60
- params.sort! { |a,b| a[0].to_s <=> b[0].to_s }
61
-
62
- puts "\nParameters:"
63
- params.each do |param_desc|
64
- puts " (#{ param_desc[1] }) #{ param_desc[0] }"
65
- end
66
-
67
- puts "\nSample Code:"
68
- print " session.#{ service }_service.request(:#{ request_name }, endpoint_type: '#{ endpoint_type }')"
69
- if params
70
- puts " do |params|"
71
- params.each do |pair|
72
- puts " params['#{ pair[0] }'] = val"
73
- end
74
- puts " end"
75
- end
76
-
77
- puts "\nLinks:"
78
- request.links.each do |link|
79
- puts " #{ link[:rel] }:"
80
- puts " #{ link[:href] }\n"
81
- end
82
- end
83
-
84
-
85
- def describe_service(provider, service)
86
- puts "Available requests for #{ provider } #{ service }:"
87
-
88
- Service.new(provider: provider, service: service).requests.each do |api_version, endpoints|
89
- endpoints.each do |endpoint_type, requests|
90
- requests.each do |request_name, request_obj|
91
- puts " #{ api_version} #{ endpoint_type } #{ request_name }"
92
- end
93
- puts ""
94
- end
95
- end
96
- end
97
-
98
-
99
- def list_providers
100
- puts "Available providers:"
101
- puts " openstack"
102
23
  end
103
24
 
104
25
  end
105
26
 
106
-
107
27
  end
108
28
  end
109
29
 
@@ -0,0 +1,95 @@
1
+ module Aviator
2
+
3
+ module Describer
4
+
5
+ def self.describe_aviator
6
+ provider_names = Pathname.new(__FILE__)
7
+ .join('..', '..', '..')
8
+ .children
9
+ .select{|c| c.directory? && c.basename.to_s != 'core' }
10
+ .map{|c| c.basename.to_s }
11
+
12
+ str = "Available providers:\n"
13
+
14
+ provider_names.each do |provider_name|
15
+ str << " #{ provider_name }\n"
16
+ end
17
+
18
+ str
19
+ end
20
+
21
+
22
+ def self.describe_provider(provider_name)
23
+ service_names = Pathname.new(__FILE__)
24
+ .join('..', '..', '..', provider_name)
25
+ .children
26
+ .select{|c| c.directory? }
27
+ .map{|c| c.basename.to_s }
28
+
29
+ str = "Available services for #{ provider_name }:\n"
30
+
31
+ service_names.each do |service_name|
32
+ str << " #{ service_name }\n"
33
+ end
34
+
35
+ str
36
+ end
37
+
38
+
39
+ def self.describe_request(provider_name, service_name, api_version, endpoint_type, request_name)
40
+ service = Aviator::Service.new provider: provider_name, service: service_name
41
+ request_class = "Aviator::#{ provider_name.camelize }::#{ service_name.camelize }::"\
42
+ "#{ api_version.camelize }::#{ endpoint_type.camelize }::#{ request_name.camelize }".constantize
43
+
44
+ str = "Request: #{ request_name }\n\n"
45
+
46
+ str << "Parameters:\n"
47
+
48
+ params = request_class.optional_params.map{|p| [p, :optional]} +
49
+ request_class.required_params.map{|p| [p, :required]}
50
+
51
+ params.sort{|a,b| a[0].to_s <=> b[0].to_s }.each do |param|
52
+ str << " (#{ param[1].to_s }) #{ param[0] }\n"
53
+ end
54
+
55
+ str << "\nSample Code:\n"
56
+
57
+ str << " session.#{ service_name }_service.request(:#{ request_name }, endpoint_type: '#{ request_class.endpoint_type }')"
58
+ if params
59
+ str << " do |params|\n"
60
+ params.each do |pair|
61
+ str << " params['#{ pair[0] }'] = value\n"
62
+ end
63
+ str << " end\n"
64
+ end
65
+
66
+ if request_class.links
67
+ str << "\nLinks:\n"
68
+
69
+ request_class.links.each do |link|
70
+ str << " #{ link[:rel] }:\n"
71
+ str << " #{ link[:href] }\n"
72
+ end
73
+ end
74
+
75
+ str
76
+ end
77
+
78
+
79
+ def self.describe_service(provider_name, service_name)
80
+ service = Aviator::Service.new(provider: provider_name, service: service_name)
81
+ klasses = service.request_classes
82
+
83
+ str = "Available requests for #{ provider_name } #{ service_name }_service:\n"
84
+
85
+ klasses.each do |klass|
86
+ str << " #{ klass.api_version } #{ klass.endpoint_type } #{ klass.name.split('::').last.underscore }\n"
87
+ end
88
+
89
+ str
90
+ end
91
+
92
+
93
+ end
94
+
95
+ end
@@ -0,0 +1 @@
1
+ require "aviator/core/cli/describer"
@@ -1,5 +1,40 @@
1
1
  module Aviator
2
2
 
3
+ class << self
4
+
5
+ def define_request(request_name, &block)
6
+ class_obj = Class.new(Request, &block)
7
+
8
+ set_class_name(
9
+ Aviator,
10
+ class_obj,
11
+
12
+ class_obj.provider,
13
+ class_obj.service,
14
+ class_obj.api_version,
15
+ class_obj.endpoint_type,
16
+ request_name
17
+ )
18
+ end
19
+
20
+
21
+ private
22
+
23
+ def set_class_name(base, obj, *hierarchy)
24
+ const_name = hierarchy.shift.to_s.camelize
25
+
26
+ const = if base.const_defined?(const_name)
27
+ base.const_get(const_name)
28
+ else
29
+ base.const_set(const_name, (hierarchy.empty? ? obj : Module.new))
30
+ end
31
+
32
+ hierarchy.empty? ? const : set_class_name(const, obj, *hierarchy)
33
+ end
34
+
35
+ end # class << self
36
+
37
+
3
38
  class Request
4
39
 
5
40
  class ApiVersionNotDefinedError < StandardError
@@ -40,31 +75,16 @@ module Aviator
40
75
  end
41
76
 
42
77
 
43
- def api_version
44
- self.class.api_version
45
- end
46
-
47
-
48
78
  def body?
49
79
  self.class.body?
50
80
  end
51
81
 
52
82
 
53
- def endpoint_type
54
- self.class.endpoint_type
55
- end
56
-
57
-
58
83
  def headers?
59
84
  self.class.headers?
60
85
  end
61
86
 
62
87
 
63
- def http_method
64
- self.class.http_method
65
- end
66
-
67
-
68
88
  def links
69
89
  self.class.links
70
90
  end
@@ -80,11 +100,6 @@ module Aviator
80
100
  end
81
101
 
82
102
 
83
- def querystring?
84
- self.class.querystring?
85
- end
86
-
87
-
88
103
  def required_params
89
104
  self.class.required_params
90
105
  end
@@ -100,6 +115,11 @@ module Aviator
100
115
  end
101
116
 
102
117
 
118
+ def querystring?
119
+ self.class.querystring?
120
+ end
121
+
122
+
103
123
  def url?
104
124
  self.class.url?
105
125
  end
@@ -123,22 +143,8 @@ module Aviator
123
143
  # within the class and because they don't change between instances anyway.
124
144
  class << self
125
145
 
126
- def anonymous
127
- @anonymous = true
128
- end
129
-
130
-
131
146
  def anonymous?
132
- @anonymous == true
133
- end
134
-
135
-
136
- def api_version(value=nil)
137
- if value
138
- @api_version = value
139
- else
140
- @api_version
141
- end
147
+ respond_to?(:anonymous) && anonymous == true
142
148
  end
143
149
 
144
150
 
@@ -147,33 +153,10 @@ module Aviator
147
153
  end
148
154
 
149
155
 
150
- def endpoint_type(value=nil)
151
- if value
152
- @endpoint_type = value
153
- else
154
- @endpoint_type
155
- end
156
- end
157
-
158
-
159
156
  def headers?
160
157
  instance_methods.include? :headers
161
158
  end
162
-
163
-
164
- def http_method(value=nil)
165
- if value
166
- @http_method = value
167
- else
168
- @http_method
169
- end
170
- end
171
-
172
-
173
- def link_to(rel, href)
174
- links << { rel: rel, href: href }
175
- end
176
-
159
+
177
160
 
178
161
  def links
179
162
  @links ||= []
@@ -199,12 +182,12 @@ module Aviator
199
182
  def querystring?
200
183
  instance_methods.include? :querystring
201
184
  end
202
-
185
+
203
186
 
204
187
  def required_params
205
188
  @required_params ||= []
206
189
  end
207
-
190
+
208
191
 
209
192
  def url?
210
193
  instance_methods.include? :url
@@ -213,13 +196,27 @@ module Aviator
213
196
 
214
197
  private
215
198
 
216
- def required_param(param_name)
217
- required_params << param_name unless required_params.include?(param_name)
199
+
200
+ def link(rel, href)
201
+ links << { rel: rel, href: href }
218
202
  end
219
203
 
220
204
 
221
- def optional_param(param_name)
222
- optional_params << param_name unless optional_params.include?(param_name)
205
+ def meta(attr_name, attr_value)
206
+ define_singleton_method(attr_name) do
207
+ attr_value
208
+ end
209
+
210
+ define_method(attr_name) do
211
+ self.class.send(attr_name)
212
+ end
213
+ end
214
+
215
+
216
+ def param(param_name, opts={})
217
+ opts = opts.with_indifferent_access
218
+ list = (opts[:required] == false ? optional_params : required_params)
219
+ list << param_name unless optional_params.include?(param_name)
223
220
  end
224
221
 
225
222
  end
@@ -45,29 +45,6 @@ module Aviator
45
45
  end
46
46
  end
47
47
 
48
- # Because we define requests in a flattened scope, we want to make sure that when each
49
- # request is initialized it doesn't get polluted by instance variables and methods
50
- # of the containing class. This builder class makes that happen by being a
51
- # scope gate for the file. See Metaprogramming Ruby, specifically on blocks and scope
52
- class RequestBuilder
53
-
54
- # This method gets called by the request file eval'd in self.build below
55
- def define_request(request_name, &block)
56
- klass = Class.new(Aviator::Request, &block)
57
- return klass, request_name
58
- end
59
-
60
-
61
- def self.build(path_to_request_file)
62
- clean_room = new
63
- clean_room.instance_eval(File.read(path_to_request_file))
64
- end
65
-
66
-
67
- private_class_method :new
68
-
69
- end
70
-
71
48
 
72
49
  attr_accessor :default_session_data
73
50
 
@@ -108,8 +85,8 @@ module Aviator
108
85
  end
109
86
 
110
87
 
111
- def requests
112
- @requests
88
+ def request_classes
89
+ @request_classes
113
90
  end
114
91
 
115
92
 
@@ -134,19 +111,27 @@ module Aviator
134
111
  # Candidate for extraction to aviator/openstack
135
112
  def find_request(name, session_data, endpoint_type=nil)
136
113
  endpoint_types = if endpoint_type
137
- [endpoint_type.to_sym]
114
+ [endpoint_type.to_s.camelize]
138
115
  else
139
- [:public, :admin]
116
+ ['Public', 'Admin']
140
117
  end
141
118
 
142
- version = infer_version(session_data)
119
+ namespace = Aviator.const_get(provider.camelize)
120
+ .const_get(service.camelize)
143
121
 
144
- return nil unless version && requests[version]
122
+ version = infer_version(session_data).to_s.camelize
123
+
124
+ return nil unless version && namespace.const_defined?(version)
125
+
126
+ namespace = namespace.const_get(version)
145
127
 
146
128
  endpoint_types.each do |endpoint_type|
147
- next unless requests[version][endpoint_type]
148
- pair = requests[version][endpoint_type].find{ |k, v| k == name }
149
- return pair[1] unless pair.nil?
129
+ name = name.to_s.camelize
130
+
131
+ next unless namespace.const_defined?(endpoint_type)
132
+ next unless namespace.const_get(endpoint_type).const_defined?(name)
133
+
134
+ return namespace.const_get(endpoint_type).const_get(name)
150
135
  end
151
136
 
152
137
  nil
@@ -182,14 +167,14 @@ module Aviator
182
167
  ).expand_path
183
168
  )
184
169
 
185
- @requests ||= {}
186
-
187
- request_file_paths.each do |path_to_file|
188
- klass, request_name = RequestBuilder.build(path_to_file)
189
-
190
- api_version = @requests[klass.api_version] ||= {}
191
- endpoint_type = api_version[klass.endpoint_type] ||= {}
192
- endpoint_type[request_name] = klass
170
+ request_file_paths.each{ |path| require path }
171
+
172
+ constant_parts = request_file_paths
173
+ .map{|rf| rf.to_s.match(/#{provider}\/#{service}\/([\w\/]+)\.rb$/) }
174
+ .map{|rf| rf[1].split('/').map{|c| c.camelize }.join('::') }
175
+
176
+ @request_classes = constant_parts.map do |cp|
177
+ "Aviator::#{provider.camelize}::#{service.camelize}::#{cp}".constantize
193
178
  end
194
179
  end
195
180
 
@@ -197,7 +182,7 @@ module Aviator
197
182
  def log_file
198
183
  @log_file
199
184
  end
200
-
185
+
201
186
  end
202
187
 
203
188
  end
@@ -83,6 +83,13 @@ module Aviator
83
83
  end
84
84
 
85
85
 
86
+ def load(session_dump)
87
+ initialize_with_dump(session_dump)
88
+ update_services_session_data
89
+ self
90
+ end
91
+
92
+
86
93
  def method_missing(name, *args, &block)
87
94
  service_name_parts = name.to_s.match(/^(\w+)_service$/)
88
95
 
data/lib/aviator/core.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'json'
2
2
  require 'active_support/inflector'
3
+ require 'active_support/core_ext/hash/indifferent_access'
3
4
  require 'faraday'
4
5
 
5
6
  require "aviator/version"
@@ -1,49 +1,58 @@
1
- define_request :list_images do
2
-
3
- endpoint_type :public
4
- api_version :v2
5
- http_method :get
6
-
7
- link_to 'documentation',
8
- 'http://docs.openstack.org/api/openstack-compute/2/content/List_Images-d1e4435.html'
9
-
10
- optional_param :details
11
- optional_param :server
12
- optional_param :name
13
- optional_param :status
14
- optional_param 'changes-since'
15
- optional_param :marker
16
- optional_param :limit
17
- optional_param :type
18
-
19
-
20
-
21
- def url
22
- service_spec = session_data[:access][:serviceCatalog].find{|s| s[:type] == 'compute' }
23
-
24
- str = "#{ service_spec[:endpoints][0][:publicURL] }/images"
25
- str += "/detail" if params[:details]
26
-
27
- filters = []
28
-
29
- (optional_params + required_params - [:details]).each do |param_name|
30
- filters << "#{ param_name }=#{ params[param_name] }" if params[param_name]
1
+ module Aviator
2
+
3
+ define_request :list_images do
4
+
5
+ meta :provider, :openstack
6
+ meta :service, :compute
7
+ meta :api_version, :v2
8
+ meta :endpoint_type, :public
9
+
10
+ link 'documentation',
11
+ 'http://docs.openstack.org/api/openstack-compute/2/content/List_Images-d1e4435.html'
12
+
13
+ param :details, required: false
14
+ param :server, required: false
15
+ param :name, required: false
16
+ param :status, required: false
17
+ param 'changes-since', required: false
18
+ param :marker, required: false
19
+ param :limit, required: false
20
+ param :type, required: false
21
+
22
+
23
+ def headers
24
+ h = {}
25
+
26
+ unless self.anonymous?
27
+ h['X-Auth-Token'] = session_data[:access][:token][:id]
28
+ end
29
+
30
+ h
31
31
  end
32
-
33
- str += "?#{ filters.join('&') }" unless filters.empty?
34
-
35
- str
36
- end
37
32
 
38
33
 
39
- def headers
40
- h = {}
41
-
42
- unless self.anonymous?
43
- h['X-Auth-Token'] = session_data[:access][:token][:id]
34
+ def http_method
35
+ :get
36
+ end
37
+
38
+
39
+ def url
40
+ service_spec = session_data[:access][:serviceCatalog].find{|s| s[:type] == 'compute' }
41
+
42
+ str = "#{ service_spec[:endpoints][0][:publicURL] }/images"
43
+ str += "/detail" if params[:details]
44
+
45
+ filters = []
46
+
47
+ (optional_params + required_params - [:details]).each do |param_name|
48
+ filters << "#{ param_name }=#{ params[param_name] }" if params[param_name]
49
+ end
50
+
51
+ str += "?#{ filters.join('&') }" unless filters.empty?
52
+
53
+ str
44
54
  end
45
55
 
46
- h
47
56
  end
48
57
 
49
- end
58
+ end