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
@@ -8,13 +8,13 @@ class Aviator::Test
8
8
 
9
9
  it 'raises an error when a required param is not provided' do
10
10
  klass = Class.new(Aviator::Request) do
11
- required_param :someparamname
11
+ param :someparamname, required: true
12
12
  end
13
13
 
14
- initializer = lambda { klass.new }
15
- initializer.must_raise ArgumentError
14
+ the_method = lambda { klass.new }
15
+ the_method.must_raise ArgumentError
16
16
 
17
- error = initializer.call rescue $!
17
+ error = the_method.call rescue $!
18
18
 
19
19
  error.message.wont_be_nil
20
20
  error.message.must_include "someparamname"
@@ -23,11 +23,9 @@ class Aviator::Test
23
23
 
24
24
  it 'does not raise any error when the required param is provided' do
25
25
  klass = Class.new(Aviator::Request) do
26
- required_param :someparamname
26
+ param :someparamname, required: true
27
27
  end
28
-
29
- # obj = klass.new({ someparamname: 'someparamvalue' })
30
-
28
+
31
29
  obj = klass.new do |params|
32
30
  params.someparamname = 'something'
33
31
  end
@@ -37,173 +35,160 @@ class Aviator::Test
37
35
 
38
36
 
39
37
  describe '::anonymous?' do
40
-
38
+
41
39
  it 'is false by default' do
42
40
  klass = Class.new(Aviator::Request)
43
-
41
+
44
42
  klass.anonymous?.must_equal false
45
43
  end
46
-
47
-
44
+
45
+
48
46
  it 'returns true if specified as such' do
49
47
  klass = Class.new(Aviator::Request) do
50
- anonymous
48
+ meta :anonymous, true
51
49
  end
52
-
50
+
53
51
  klass.anonymous?.must_equal true
54
52
  end
55
-
53
+
56
54
  end
57
-
58
-
55
+
56
+
59
57
  describe '#anonymous?' do
60
-
58
+
61
59
  it 'is false by default' do
62
60
  klass = Class.new(Aviator::Request)
63
-
61
+
64
62
  klass.new.anonymous?.must_equal false
65
63
  end
66
-
67
-
64
+
65
+
68
66
  it 'returns true if specified as such' do
69
67
  klass = Class.new(Aviator::Request) do
70
- anonymous
68
+ meta :anonymous, true
71
69
  end
72
-
70
+
73
71
  klass.new.anonymous?.must_equal true
74
72
  end
75
-
73
+
76
74
  end
77
-
78
-
75
+
76
+
79
77
  describe '::api_version' do
80
-
78
+
81
79
  it 'returns the api version' do
82
80
  klass = Class.new(Aviator::Request) do
83
- api_version :v2
81
+ meta :api_version, :v2
84
82
  end
85
-
83
+
86
84
  klass.api_version.must_equal :v2
87
85
  end
88
-
86
+
89
87
  end
90
-
91
-
88
+
89
+
92
90
  describe '#api_version' do
93
-
91
+
94
92
  it 'returns the api version' do
95
93
  klass = Class.new(Aviator::Request) do
96
- api_version :v2
94
+ meta :api_version, :v2
97
95
  end
98
-
96
+
99
97
  klass.new.api_version.must_equal :v2
100
98
  end
101
-
99
+
102
100
  end
103
-
104
-
101
+
102
+
105
103
  describe '::body?' do
106
-
104
+
107
105
  it 'returns false if the body method is not defined' do
108
106
  klass = Class.new(Aviator::Request)
109
-
107
+
110
108
  klass.body?.must_equal false
111
109
  end
112
-
113
-
110
+
111
+
114
112
  it 'returns true if the body method is defined' do
115
113
  klass = Class.new(Aviator::Request) do
116
114
  def body; end
117
115
  end
118
-
116
+
119
117
  klass.body?.must_equal true
120
118
  end
121
-
119
+
122
120
  end
123
-
124
-
121
+
122
+
125
123
  describe '#body?' do
126
-
124
+
127
125
  it 'returns false if the body method is not defined' do
128
126
  klass = Class.new(Aviator::Request)
129
-
127
+
130
128
  klass.new.body?.must_equal false
131
129
  end
132
-
133
-
130
+
131
+
134
132
  it 'returns true if the body method is defined' do
135
133
  klass = Class.new(Aviator::Request) do
136
134
  def body; end
137
135
  end
138
-
136
+
139
137
  klass.new.body?.must_equal true
140
138
  end
141
-
139
+
142
140
  end
143
-
144
-
141
+
142
+
145
143
  describe '::endpoint_type' do
146
-
144
+
147
145
  it 'returns the endpoint type' do
148
146
  klass = Class.new(Aviator::Request) do
149
- endpoint_type :public
147
+ meta :endpoint_type, :public
150
148
  end
151
-
149
+
152
150
  klass.endpoint_type.must_equal :public
153
151
  end
154
-
152
+
155
153
  end
156
-
157
-
154
+
155
+
158
156
  describe '#endpoint_type' do
159
-
157
+
160
158
  it 'returns the endpoint type' do
161
159
  klass = Class.new(Aviator::Request) do
162
- endpoint_type :public
160
+ meta :endpoint_type, :whatever
163
161
  end
164
-
165
- klass.new.endpoint_type.must_equal :public
166
- end
167
-
168
- end
169
-
170
-
171
- describe '::http_method' do
172
-
173
- it 'returns the http method if it is defined' do
174
- klass = Class.new(Aviator::Request) do
175
- http_method :post
176
- end
177
-
178
- klass.http_method.must_equal :post
162
+
163
+ klass.new.endpoint_type.must_equal :whatever
179
164
  end
180
-
165
+
181
166
  end
182
-
183
-
167
+
168
+
184
169
  describe '#http_method' do
185
-
170
+
186
171
  it 'returns the http method if it is defined' do
187
172
  klass = Class.new(Aviator::Request) do
188
- http_method :post
173
+ def http_method; :post; end
189
174
  end
190
-
175
+
191
176
  klass.new.http_method.must_equal :post
192
177
  end
193
-
178
+
194
179
  end
195
-
196
-
197
- describe '::link_to' do
198
-
180
+
181
+
182
+ describe '::link' do
183
+
199
184
  it 'adds a link to Request::links' do
200
185
  rel = 'documentation'
201
186
  href = 'http://x.y.z'
202
187
 
203
188
  klass = Class.new(Aviator::Request) do
204
- link_to rel, href
189
+ link rel, href
205
190
  end
206
-
191
+
207
192
  expected = [
208
193
  { rel: rel, href: href }
209
194
  ]
@@ -211,129 +196,119 @@ class Aviator::Test
211
196
  klass.links.must_equal expected
212
197
  klass.new.links.must_equal expected
213
198
  end
214
-
199
+
215
200
  end
216
201
 
217
-
218
- describe '::optional_param' do
219
-
202
+
203
+ describe '::param' do
204
+
220
205
  it 'is a private class method' do
221
- private_method = lambda { Aviator::Request.optional_param }
206
+ private_method = lambda { Aviator::Request.param }
222
207
  private_method.must_raise NoMethodError
223
-
208
+
224
209
  error = private_method.call rescue $!
225
-
210
+
226
211
  error.message.wont_be_nil
227
212
  error.message.must_include "private method"
228
213
  end
229
-
214
+
230
215
  end
231
216
 
232
-
217
+
233
218
  describe '::optional_params' do
234
-
219
+
235
220
  it 'returns an array' do
236
221
  klass = Class.new(Aviator::Request) do
237
- optional_param :whatever
222
+ param :whatever, required: false
238
223
  end
239
-
224
+
240
225
  klass.optional_params.must_equal [:whatever]
241
226
  end
242
-
227
+
243
228
  end
244
-
245
-
229
+
230
+
246
231
  describe '#optional_params' do
247
-
232
+
248
233
  it 'returns an array' do
249
234
  klass = Class.new(Aviator::Request) do
250
- optional_param :whatever
235
+ param :whatever, required: false
251
236
  end
252
-
237
+
253
238
  klass.new.optional_params.must_equal [:whatever]
254
239
  end
255
-
256
- end
257
-
258
-
259
- describe '::required_param' do
260
-
261
- it 'is a private class method' do
262
- private_method = lambda { Aviator::Request.required_param }
263
- private_method.must_raise NoMethodError
264
-
265
- error = private_method.call rescue $!
266
-
267
- error.message.wont_be_nil
268
- error.message.must_include "private method"
269
- end
270
-
240
+
271
241
  end
272
-
273
-
242
+
243
+
274
244
  describe '::required_params' do
275
-
245
+
276
246
  it 'returns an array' do
277
247
  klass = Class.new(Aviator::Request) do
278
- required_param :whatever
248
+ param :whatever, required: true
279
249
  end
280
-
250
+
281
251
  klass.required_params.must_equal [:whatever]
282
252
  end
283
-
253
+
284
254
  end
285
-
286
-
255
+
256
+
287
257
  describe '#required_params' do
288
-
258
+
289
259
  it 'returns an array' do
290
260
  klass = Class.new(Aviator::Request) do
291
- required_param :whatever
261
+ param :whatever, required: true
292
262
  end
293
-
294
- klass.required_params.must_equal [:whatever]
263
+
264
+ request = klass.new do |params|
265
+ params[:whatever] = 'something'
266
+ end
267
+
268
+
269
+ request.required_params.must_equal [:whatever]
295
270
  end
296
-
271
+
297
272
  end
298
273
 
299
-
274
+
300
275
  describe '::url?' do
301
-
302
- it 'returns false if the path method is not defined' do
276
+
277
+ it 'returns false if the url method is not defined' do
303
278
  klass = Class.new(Aviator::Request)
304
-
279
+
305
280
  klass.url?.must_equal false
306
281
  end
307
-
308
-
309
- it 'returns true if the path method is defined' do
282
+
283
+
284
+ it 'returns true if the url method is defined' do
310
285
  klass = Class.new(Aviator::Request) do
311
286
  def url; end
312
287
  end
313
-
288
+
314
289
  klass.url?.must_equal true
315
290
  end
316
-
291
+
317
292
  end
318
-
319
-
320
- describe '#path?' do
321
-
322
- it 'returns false if the path method is not defined' do
293
+
294
+
295
+ describe '#url?' do
296
+
297
+ it 'returns false if the url method is not defined' do
323
298
  klass = Class.new(Aviator::Request)
324
-
299
+
325
300
  klass.new.url?.must_equal false
326
301
  end
327
-
328
-
329
- it 'returns true if the path method is defined' do
302
+
303
+
304
+ it 'returns true if the url method is defined' do
330
305
  klass = Class.new(Aviator::Request) do
331
306
  def url; end
332
307
  end
333
-
308
+
334
309
  klass.new.url?.must_equal true
335
310
  end
336
-
311
+
337
312
  end
338
313
 
339
314
 
@@ -22,21 +22,21 @@ class Aviator::Test
22
22
  end
23
23
  end
24
24
  end
25
-
26
-
25
+
26
+
27
27
  def klass
28
28
  Aviator::Service
29
29
  end
30
-
30
+
31
31
 
32
32
  def service(default_session_data=nil)
33
33
  options = {
34
34
  provider: config[:provider],
35
35
  service: config[:auth_service][:name]
36
36
  }
37
-
37
+
38
38
  options[:default_session_data] = default_session_data unless default_session_data.nil?
39
-
39
+
40
40
  klass.new(options)
41
41
  end
42
42
 
@@ -45,7 +45,7 @@ class Aviator::Test
45
45
 
46
46
  it 'can find the correct request based on bootstrapped session data' do
47
47
  response = do_auth_request
48
-
48
+
49
49
  response.must_be_instance_of Aviator::Response
50
50
  response.request.api_version.must_equal config[:auth_service][:api_version].to_sym
51
51
  end
@@ -67,26 +67,26 @@ class Aviator::Test
67
67
  params[k] = v
68
68
  end
69
69
  end
70
-
70
+
71
71
  response.must_be_instance_of Aviator::Response
72
72
  response.request.api_version.must_equal :v2
73
73
  response.status.must_equal 200
74
74
  end
75
-
76
-
75
+
76
+
77
77
  it 'can find the correct request based on non-bootstrapped session data' do
78
78
  session_data = do_auth_request.body
79
-
79
+
80
80
  response = service.request :create_tenant, session_data: session_data do |params|
81
81
  params.name = 'Test Project'
82
82
  params.description = 'This is a test'
83
83
  params.enabled = true
84
84
  end
85
-
85
+
86
86
  response.status.must_equal 200
87
87
  end
88
-
89
-
88
+
89
+
90
90
  it 'uses the default session data if session data is not provided' do
91
91
  default_session_data = do_auth_request.body
92
92
  s = service(default_session_data)
@@ -96,11 +96,11 @@ class Aviator::Test
96
96
  params.description = 'This is a test'
97
97
  params.enabled = true
98
98
  end
99
-
99
+
100
100
  response.status.must_equal 200
101
101
  end
102
-
103
-
102
+
103
+
104
104
  it 'raises a SessionDataNotProvidedError if there is no session data' do
105
105
  the_method = lambda do
106
106
  service.request :create_tenant do |params|
@@ -109,28 +109,51 @@ class Aviator::Test
109
109
  params.enabled = true
110
110
  end
111
111
  end
112
-
112
+
113
113
  the_method.must_raise Aviator::Service::SessionDataNotProvidedError
114
114
  error = the_method.call rescue $!
115
115
  error.message.wont_be_nil
116
116
  end
117
-
118
-
117
+
118
+
119
119
  it 'accepts an endpoint type option for selecting a specific request' do
120
120
  default_session_data = do_auth_request.body
121
121
  s = service(default_session_data)
122
-
122
+
123
123
  response1 = s.request :list_tenants, endpoint_type: 'admin'
124
124
  response2 = s.request :list_tenants, endpoint_type: 'public'
125
-
125
+
126
126
  response1.request.url.wont_equal response2.request.url
127
127
  end
128
128
 
129
129
  end
130
130
 
131
131
 
132
- describe '#default_session_data=' do
132
+ describe '#request_classes' do
133
+
134
+ it 'returns an array of the request classes' do
135
+ provider_name = config[:provider]
136
+ service_name = config[:auth_service][:name]
137
+ service_path = Pathname.new(__FILE__).join(
138
+ '..', '..', '..', '..', 'lib', 'aviator', provider_name, service_name
139
+ ).expand_path
140
+
141
+ request_files = Pathname.glob(service_path.join('**', '*.rb'))
142
+ .map{|rf| rf.to_s.match(/#{provider_name}\/#{service_name}\/([\w\/]+)\.rb$/) }
143
+ .map{|rf| rf[1].split('/').map{|c| c.camelize }.join('::') }
144
+
145
+ classes = request_files.map do |rf|
146
+ "Aviator::#{provider_name.camelize}::#{service_name.camelize}::#{rf}".constantize
147
+ end
148
+
149
+ service.request_classes.must_equal classes
150
+ end
133
151
 
152
+ end
153
+
154
+
155
+ describe '#default_session_data=' do
156
+
134
157
  it 'sets the service\'s default session data' do
135
158
  bootstrap = {
136
159
  auth_service: {
@@ -139,18 +162,18 @@ class Aviator::Test
139
162
  request: 'create_token'
140
163
  }
141
164
  }
142
-
165
+
143
166
  svc = service(bootstrap)
144
167
 
145
168
  session_data_1 = svc.default_session_data
146
169
  session_data_2 = do_auth_request.body
147
-
170
+
148
171
  svc.default_session_data = session_data_2
149
-
172
+
150
173
  svc.default_session_data.wont_equal session_data_1
151
174
  svc.default_session_data.must_equal session_data_2
152
175
  end
153
-
176
+
154
177
  end
155
178
 
156
179
  end
@@ -99,6 +99,35 @@ class Aviator::Test
99
99
  end
100
100
 
101
101
  end
102
+
103
+
104
+ describe '#load' do
105
+
106
+ it 'returns itself' do
107
+ session = new_session
108
+ session.authenticate
109
+
110
+ str = session.dump
111
+ session.load(str).must_equal session
112
+ end
113
+
114
+
115
+ it 'updates the session data of its service objects' do
116
+ session1 = new_session
117
+ session1.authenticate
118
+ keystone1 = session1.identity_service
119
+
120
+ session2 = new_session
121
+ session2.authenticate
122
+ keystone2 = session2.identity_service
123
+
124
+ session1.load(session2.dump)
125
+
126
+ keystone1.wont_equal keystone2
127
+ keystone1.default_session_data.must_equal keystone2.default_session_data
128
+ end
129
+
130
+ end # describe '#load'
102
131
 
103
132
 
104
133
  describe '::load' do