aviator 0.0.1 → 0.0.2

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 (72) hide show
  1. data/.coveralls.yml +1 -0
  2. data/.gitignore +6 -1
  3. data/.ruby-gemset +1 -0
  4. data/.ruby-version +1 -0
  5. data/.travis.yml +12 -0
  6. data/Gemfile +13 -0
  7. data/Guardfile +6 -0
  8. data/LICENSE.txt +1 -1
  9. data/README.md +151 -2
  10. data/Rakefile +8 -0
  11. data/aviator.gemspec +14 -1
  12. data/bin/aviator +110 -0
  13. data/lib/aviator/core.rb +9 -0
  14. data/lib/aviator/core/request.rb +229 -0
  15. data/lib/aviator/core/response.rb +33 -0
  16. data/lib/aviator/core/service.rb +203 -0
  17. data/lib/aviator/core/session.rb +187 -0
  18. data/lib/aviator/openstack/compute/v2/public/list_images.rb +49 -0
  19. data/lib/aviator/openstack/identity/v2/admin/create_tenant.rb +42 -0
  20. data/lib/aviator/openstack/identity/v2/admin/list_tenants.rb +43 -0
  21. data/lib/aviator/openstack/identity/v2/public/create_token.rb +61 -0
  22. data/lib/aviator/openstack/identity/v2/public/list_tenants.rb +44 -0
  23. data/lib/aviator/version.rb +1 -1
  24. data/test/aviator/core/request_test.rb +342 -0
  25. data/test/aviator/core/service_test.rb +158 -0
  26. data/test/aviator/core/session_test.rb +201 -0
  27. data/test/aviator/openstack/compute/v2/public/list_images_test.rb +179 -0
  28. data/test/aviator/openstack/identity/v2/admin/create_tenant_test.rb +151 -0
  29. data/test/aviator/openstack/identity/v2/public/create_token_test.rb +159 -0
  30. data/test/cassettes/core/service/i_default_session_data_/sets_the_service_s_default_session_data.yml +63 -0
  31. data/test/cassettes/core/service/i_request/accepts_an_endpoint_type_option_for_selecting_a_specific_request.yml +140 -0
  32. data/test/cassettes/core/service/i_request/can_find_the_correct_request_based_on_bootstrapped_session_data.yml +63 -0
  33. data/test/cassettes/core/service/i_request/can_find_the_correct_request_based_on_non-bootstrapped_session_data.yml +97 -0
  34. 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 +63 -0
  35. data/test/cassettes/core/service/i_request/uses_the_default_session_data_if_session_data_is_not_provided.yml +97 -0
  36. data/test/cassettes/core/session/c_load/creates_a_new_instance_from_the_given_session_dump.yml +63 -0
  37. data/test/cassettes/core/session/c_load/uses_the_loaded_auth_info_for_its_services.yml +63 -0
  38. data/test/cassettes/core/session/c_new/directs_log_entries_to_the_given_log_file.yml +63 -0
  39. data/test/cassettes/core/session/i_authenticate/authenticates_against_the_auth_service_indicated_in_the_config_file.yml +63 -0
  40. data/test/cassettes/core/session/i_authenticate/authenticates_against_the_auth_service_using_the_credentials_in_the_given_block.yml +38 -0
  41. data/test/cassettes/core/session/i_authenticate/raises_an_AuthenticationError_when_authentication_fails.yml +35 -0
  42. data/test/cassettes/core/session/i_authenticate/updates_the_session_data_of_its_service_objects.yml +123 -0
  43. data/test/cassettes/core/session/i_dump/serializes_the_session_data_for_caching.yml +63 -0
  44. data/test/cassettes/core/session/i_validate/returns_false_if_session_is_no_longer_valid.yml +97 -0
  45. data/test/cassettes/core/session/i_validate/returns_true_if_session_is_still_valid.yml +98 -0
  46. data/test/cassettes/core/session/i_xxx_service/returns_an_instance_of_the_indicated_service.yml +63 -0
  47. data/test/cassettes/openstack/compute/v2/public/list_images/leads_to_a_valid_response_when_no_parameters_are_provided.yml +108 -0
  48. data/test/cassettes/openstack/compute/v2/public/list_images/leads_to_a_valid_response_when_parameters_are_invalid.yml +96 -0
  49. data/test/cassettes/openstack/compute/v2/public/list_images/leads_to_a_valid_response_when_parameters_are_valid.yml +103 -0
  50. data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_body.yml +63 -0
  51. data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_body_.yml +63 -0
  52. data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_headers.yml +63 -0
  53. data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_headers_.yml +63 -0
  54. data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_url.yml +63 -0
  55. data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_url_.yml +63 -0
  56. data/test/cassettes/openstack/identity/v2/admin/create_tenant/leads_to_a_valid_response_when_params_are_invalid.yml +97 -0
  57. data/test/cassettes/openstack/identity/v2/admin/create_tenant/leads_to_a_valid_response_when_params_are_valid.yml +97 -0
  58. data/test/cassettes/openstack/identity/v2/admin/create_tenant/leads_to_a_valid_response_when_provided_with_invalid_params.yml +97 -0
  59. data/test/cassettes/openstack/identity/v2/public/create_token/leads_to_a_valid_response_when_parameters_are_invalid.yml +35 -0
  60. data/test/cassettes/openstack/identity/v2/public/create_token/leads_to_a_valid_response_when_parameters_are_valid.yml +38 -0
  61. data/test/cassettes/openstack/identity/v2/public/create_token/leads_to_a_valid_response_when_provided_with_a_token.yml +98 -0
  62. data/test/environment.yml.example +22 -0
  63. data/test/environment.yml.travis-ci +24 -0
  64. data/test/support/openstack_request_test_helper.rb +57 -0
  65. data/test/support/test_base_class.rb +39 -0
  66. data/test/support/test_environment.rb +37 -0
  67. data/test/support/test_reporter.rb +45 -0
  68. data/test/support/vcr_setup.rb +41 -0
  69. data/test/test_helper.rb +35 -0
  70. data/tmp/.gitignore +0 -0
  71. metadata +310 -8
  72. data/lib/aviator.rb +0 -5
@@ -0,0 +1,158 @@
1
+ require 'test_helper'
2
+
3
+ class Aviator::Test
4
+
5
+ describe 'aviator/core/service' do
6
+
7
+ def config
8
+ Environment.openstack_admin
9
+ end
10
+
11
+
12
+ def do_auth_request
13
+ request_name = config[:auth_service][:request].to_sym
14
+
15
+ bootstrap = {
16
+ auth_service: config[:auth_service]
17
+ }
18
+
19
+ service.request request_name, session_data: bootstrap do |params|
20
+ config[:auth_credentials].each do |k,v|
21
+ params[k] = v
22
+ end
23
+ end
24
+ end
25
+
26
+
27
+ def klass
28
+ Aviator::Service
29
+ end
30
+
31
+
32
+ def service(default_session_data=nil)
33
+ options = {
34
+ provider: config[:provider],
35
+ service: config[:auth_service][:name]
36
+ }
37
+
38
+ options[:default_session_data] = default_session_data unless default_session_data.nil?
39
+
40
+ klass.new(options)
41
+ end
42
+
43
+
44
+ describe '#request' do
45
+
46
+ it 'can find the correct request based on bootstrapped session data' do
47
+ response = do_auth_request
48
+
49
+ response.must_be_instance_of Aviator::Response
50
+ response.request.api_version.must_equal config[:auth_service][:api_version].to_sym
51
+ end
52
+
53
+
54
+ it 'can find the correct request if api version is not defined but can be inferred from host_uri' do
55
+ request_name = config[:auth_service][:request].to_sym
56
+
57
+ bootstrap = {
58
+ auth_service: {
59
+ name: 'identity',
60
+ host_uri: 'http://devstack:5000/v2.0',
61
+ request: 'create_token'
62
+ }
63
+ }
64
+
65
+ response = service.request request_name, session_data: bootstrap do |params|
66
+ config[:auth_credentials].each do |k,v|
67
+ params[k] = v
68
+ end
69
+ end
70
+
71
+ response.must_be_instance_of Aviator::Response
72
+ response.request.api_version.must_equal :v2
73
+ response.status.must_equal 200
74
+ end
75
+
76
+
77
+ it 'can find the correct request based on non-bootstrapped session data' do
78
+ session_data = do_auth_request.body
79
+
80
+ response = service.request :create_tenant, session_data: session_data do |params|
81
+ params.name = 'Test Project'
82
+ params.description = 'This is a test'
83
+ params.enabled = true
84
+ end
85
+
86
+ response.status.must_equal 200
87
+ end
88
+
89
+
90
+ it 'uses the default session data if session data is not provided' do
91
+ default_session_data = do_auth_request.body
92
+ s = service(default_session_data)
93
+
94
+ response = s.request :create_tenant do |params|
95
+ params.name = 'Test Project Too'
96
+ params.description = 'This is a test'
97
+ params.enabled = true
98
+ end
99
+
100
+ response.status.must_equal 200
101
+ end
102
+
103
+
104
+ it 'raises a SessionDataNotProvidedError if there is no session data' do
105
+ the_method = lambda do
106
+ service.request :create_tenant do |params|
107
+ params.name = 'Test Project Too'
108
+ params.description = 'This is a test'
109
+ params.enabled = true
110
+ end
111
+ end
112
+
113
+ the_method.must_raise Aviator::Service::SessionDataNotProvidedError
114
+ error = the_method.call rescue $!
115
+ error.message.wont_be_nil
116
+ end
117
+
118
+
119
+ it 'accepts an endpoint type option for selecting a specific request' do
120
+ default_session_data = do_auth_request.body
121
+ s = service(default_session_data)
122
+
123
+ response1 = s.request :list_tenants, endpoint_type: 'admin'
124
+ response2 = s.request :list_tenants, endpoint_type: 'public'
125
+
126
+ response1.request.url.wont_equal response2.request.url
127
+ end
128
+
129
+ end
130
+
131
+
132
+ describe '#default_session_data=' do
133
+
134
+ it 'sets the service\'s default session data' do
135
+ bootstrap = {
136
+ auth_service: {
137
+ name: 'identity',
138
+ host_uri: 'http://devstack:5000/v2.0',
139
+ request: 'create_token'
140
+ }
141
+ }
142
+
143
+ svc = service(bootstrap)
144
+
145
+ session_data_1 = svc.default_session_data
146
+ session_data_2 = do_auth_request.body
147
+
148
+ svc.default_session_data = session_data_2
149
+
150
+ svc.default_session_data.wont_equal session_data_1
151
+ svc.default_session_data.must_equal session_data_2
152
+ end
153
+
154
+ end
155
+
156
+ end
157
+
158
+ end
@@ -0,0 +1,201 @@
1
+ require 'test_helper'
2
+
3
+ class Aviator::Test
4
+
5
+ describe 'aviator/core/session' do
6
+
7
+ def config
8
+ Environment
9
+ end
10
+
11
+
12
+ def log_file_path
13
+ Pathname.new(__FILE__).expand_path.join('..', '..', '..', '..', 'tmp', 'aviator.log')
14
+ end
15
+
16
+
17
+ def new_session
18
+ Aviator::Session.new(
19
+ config_file: config.path,
20
+ environment: 'test',
21
+ log_file: log_file_path
22
+ )
23
+ end
24
+
25
+
26
+ describe '#authenticate' do
27
+
28
+ it 'authenticates against the auth service indicated in the config file' do
29
+ session = new_session
30
+
31
+ session.authenticate
32
+
33
+ session.authenticated?.must_equal true
34
+ end
35
+
36
+
37
+ it 'authenticates against the auth service using the credentials in the given block' do
38
+ session = new_session
39
+ credentials = config.test[:auth_credentials]
40
+
41
+ session.authenticate do |c|
42
+ c[:username] = credentials[:username]
43
+ c[:password] = credentials[:password]
44
+ end
45
+
46
+ session.authenticated?.must_equal true
47
+ end
48
+
49
+
50
+ it 'raises an AuthenticationError when authentication fails' do
51
+ session = new_session
52
+ credentials = config.test[:auth_credentials]
53
+
54
+ the_method = lambda do
55
+ session.authenticate do |c|
56
+ c[:username] = 'invalidusername'
57
+ c[:password] = 'invalidpassword'
58
+ end
59
+ end
60
+
61
+ the_method.must_raise Aviator::Session::AuthenticationError
62
+ end
63
+
64
+
65
+ it 'updates the session data of its service objects' do
66
+ session = new_session
67
+ session.authenticate
68
+
69
+ keystone = session.identity_service
70
+
71
+ session_data_1 = keystone.default_session_data
72
+
73
+ session.authenticate
74
+
75
+ session.identity_service.must_equal keystone
76
+
77
+ new_token = session.identity_service.default_session_data[:access][:token][:id]
78
+ new_token.wont_equal session_data_1[:access][:token][:id]
79
+ keystone.default_session_data[:access][:token][:id].must_equal new_token
80
+ end
81
+
82
+ end # describe '#authenticate'
83
+
84
+
85
+ describe '#dump' do
86
+
87
+ it 'serializes the session data for caching' do
88
+ session = new_session
89
+ session.authenticate
90
+
91
+ str = session.dump
92
+
93
+ expected = JSON.generate({
94
+ environment: session.send(:environment),
95
+ auth_info: session.send(:auth_info)
96
+ })
97
+
98
+ str.must_equal expected
99
+ end
100
+
101
+ end
102
+
103
+
104
+ describe '::load' do
105
+
106
+ it 'creates a new instance from the given session dump' do
107
+ session = new_session
108
+ session.authenticate
109
+
110
+ str = session.dump
111
+ session = Aviator::Session.load(str)
112
+ expected = JSON.parse(str).with_indifferent_access
113
+
114
+ session.dump.must_equal str
115
+ session.authenticated?.must_equal true
116
+
117
+ # This is bad testing practice (testing a private method) but
118
+ # I'll go ahead and do it anyway just to be sure.
119
+ session.send(:environment).must_equal expected[:environment]
120
+ session.send(:auth_info).must_equal expected[:auth_info]
121
+ end
122
+
123
+
124
+ it 'uses the loaded auth info for its services' do
125
+ session = new_session
126
+ session.authenticate
127
+
128
+ expected = JSON.parse(session.dump).with_indifferent_access
129
+ session = Aviator::Session.load(session.dump)
130
+ service = session.identity_service
131
+
132
+ service.default_session_data.must_equal expected[:auth_info]
133
+ end
134
+
135
+ end
136
+
137
+
138
+ describe '::new' do
139
+
140
+ it 'directs log entries to the given log file' do
141
+ log_file_path.delete if log_file_path.file?
142
+
143
+ session = new_session
144
+ session.authenticate
145
+
146
+ log_file_path.file?.must_equal true
147
+ end
148
+
149
+ end
150
+
151
+
152
+ describe '#validate' do
153
+
154
+ it 'returns true if session is still valid' do
155
+ session = new_session
156
+ session.authenticate
157
+
158
+ session.validate.must_equal true
159
+ end
160
+
161
+
162
+ it 'returns false if session is no longer valid' do
163
+ session = new_session
164
+ session.authenticate
165
+
166
+ session.send(:auth_info)[:access][:token][:id] = 'invalidtokenid'
167
+
168
+ session.validate.must_equal false
169
+ end
170
+
171
+
172
+ it 'raises an error if called before authenticating' do
173
+ the_method = lambda { new_session.validate }
174
+
175
+ the_method.must_raise Aviator::Session::NotAuthenticatedError
176
+ end
177
+
178
+ end
179
+
180
+
181
+ describe '#xxx_service' do
182
+
183
+ it 'raises a NotAuthenticatedError if called without authenticating first' do
184
+ the_method = lambda { new_session.identity_service }
185
+
186
+ the_method.must_raise Aviator::Session::NotAuthenticatedError
187
+ end
188
+
189
+
190
+ it 'returns an instance of the indicated service' do
191
+ session = new_session
192
+ session.authenticate
193
+
194
+ session.identity_service.wont_be_nil
195
+ end
196
+
197
+ end
198
+
199
+ end # describe 'aviator/core/service'
200
+
201
+ end # class Aviator::Test
@@ -0,0 +1,179 @@
1
+ require 'test_helper'
2
+
3
+ class Aviator::Test
4
+
5
+ describe 'aviator/openstack/compute/v2/public/list_images' do
6
+
7
+ def create_request(session_data = new_session_data)
8
+ klass.new(session_data)
9
+ end
10
+
11
+
12
+ def new_session_data
13
+ service = Aviator::Service.new(
14
+ provider: 'openstack',
15
+ service: 'identity'
16
+ )
17
+
18
+ bootstrap = RequestHelper.admin_bootstrap_session_data
19
+
20
+ response = service.request :create_token, session_data: bootstrap do |params|
21
+ auth_credentials = Environment.openstack_admin[:auth_credentials]
22
+ auth_credentials.each { |key, value| params[key] = auth_credentials[key] }
23
+ end
24
+
25
+ response.body
26
+ end
27
+
28
+
29
+ def helper
30
+ Aviator::Test::RequestHelper
31
+ end
32
+
33
+
34
+ def klass
35
+ path = helper.request_path('compute', 'v2', 'public', 'list_images.rb')
36
+ klass, request_name = Aviator::Service::RequestBuilder.build(path)
37
+ klass
38
+ end
39
+
40
+
41
+ validate :anonymous? do
42
+ klass.anonymous?.must_equal false
43
+ end
44
+
45
+
46
+ validate :api_version do
47
+ klass.api_version.must_equal :v2
48
+ end
49
+
50
+
51
+ validate :body do
52
+ klass.body?.must_equal false
53
+ create_request.body?.must_equal false
54
+ end
55
+
56
+
57
+ validate :endpoint_type do
58
+ klass.endpoint_type.must_equal :public
59
+ end
60
+
61
+
62
+ validate :headers do
63
+ session_data = new_session_data
64
+
65
+ headers = { 'X-Auth-Token' => session_data[:access][:token][:id] }
66
+
67
+ request = create_request(session_data)
68
+
69
+ request.headers.must_equal headers
70
+ end
71
+
72
+
73
+ validate :http_method do
74
+ klass.http_method.must_equal :get
75
+ end
76
+
77
+
78
+ validate :optional_params do
79
+ klass.optional_params.must_equal [
80
+ :details,
81
+ :server,
82
+ :name,
83
+ :status,
84
+ 'changes-since',
85
+ :marker,
86
+ :limit,
87
+ :type
88
+ ]
89
+ end
90
+
91
+
92
+ validate :required_params do
93
+ klass.required_params.must_equal []
94
+ end
95
+
96
+
97
+ validate :url do
98
+ session_data = new_session_data
99
+ service_spec = session_data[:access][:serviceCatalog].find{|s| s[:type] == 'compute' }
100
+ url = "#{ service_spec[:endpoints][0][:publicURL] }/images"
101
+
102
+ params = [
103
+ [ :details, true ],
104
+ [ :name, 'cirros-0.3.1-x86_64-uec-ramdisk' ],
105
+ [ :status, 'ACTIVE' ],
106
+ [ :type, 'application/vnd.openstack.image' ]
107
+ ]
108
+
109
+ url += "/detail" if params.first[1]
110
+
111
+ filters = []
112
+
113
+ params[1, params.length-1].each { |pair| filters << "#{ pair[0] }=#{ pair[1] }" }
114
+
115
+ url += "?#{ filters.join('&') }" unless filters.empty?
116
+
117
+ request = klass.new(session_data) do |p|
118
+ params.each { |pair| p[pair[0]] = pair[1] }
119
+ end
120
+
121
+
122
+ request.url.must_equal url
123
+ end
124
+
125
+
126
+ validate_response 'no parameters are provided' do
127
+ service = Aviator::Service.new(
128
+ provider: 'openstack',
129
+ service: 'compute',
130
+ default_session_data: new_session_data
131
+ )
132
+
133
+ response = service.request :list_images
134
+
135
+ response.status.must_equal 200
136
+ response.body.wont_be_nil
137
+ response.headers.wont_be_nil
138
+ end
139
+
140
+
141
+ validate_response 'parameters are invalid' do
142
+ service = Aviator::Service.new(
143
+ provider: 'openstack',
144
+ service: 'compute',
145
+ default_session_data: new_session_data
146
+ )
147
+
148
+ response = service.request :list_images do |params|
149
+ params[:name] = "nonexistentimagenameherpderp"
150
+ end
151
+
152
+ response.status.must_equal 200
153
+ response.body.wont_be_nil
154
+ response.body[:images].length.must_equal 0
155
+ response.headers.wont_be_nil
156
+ end
157
+
158
+
159
+ validate_response 'parameters are valid' do
160
+ service = Aviator::Service.new(
161
+ provider: 'openstack',
162
+ service: 'compute',
163
+ default_session_data: new_session_data
164
+ )
165
+
166
+ response = service.request :list_images do |params|
167
+ params[:details] = true
168
+ params[:name] = "cirros-0.3.1-x86_64-uec-ramdisk"
169
+ end
170
+
171
+ response.status.must_equal 200
172
+ response.body.wont_be_nil
173
+ response.body[:images].length.must_equal 1
174
+ response.headers.wont_be_nil
175
+ end
176
+
177
+ end
178
+
179
+ end