aviator 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
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