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.
- data/.coveralls.yml +1 -0
- data/.gitignore +6 -1
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +12 -0
- data/Gemfile +13 -0
- data/Guardfile +6 -0
- data/LICENSE.txt +1 -1
- data/README.md +151 -2
- data/Rakefile +8 -0
- data/aviator.gemspec +14 -1
- data/bin/aviator +110 -0
- data/lib/aviator/core.rb +9 -0
- data/lib/aviator/core/request.rb +229 -0
- data/lib/aviator/core/response.rb +33 -0
- data/lib/aviator/core/service.rb +203 -0
- data/lib/aviator/core/session.rb +187 -0
- data/lib/aviator/openstack/compute/v2/public/list_images.rb +49 -0
- data/lib/aviator/openstack/identity/v2/admin/create_tenant.rb +42 -0
- data/lib/aviator/openstack/identity/v2/admin/list_tenants.rb +43 -0
- data/lib/aviator/openstack/identity/v2/public/create_token.rb +61 -0
- data/lib/aviator/openstack/identity/v2/public/list_tenants.rb +44 -0
- data/lib/aviator/version.rb +1 -1
- data/test/aviator/core/request_test.rb +342 -0
- data/test/aviator/core/service_test.rb +158 -0
- data/test/aviator/core/session_test.rb +201 -0
- data/test/aviator/openstack/compute/v2/public/list_images_test.rb +179 -0
- data/test/aviator/openstack/identity/v2/admin/create_tenant_test.rb +151 -0
- data/test/aviator/openstack/identity/v2/public/create_token_test.rb +159 -0
- data/test/cassettes/core/service/i_default_session_data_/sets_the_service_s_default_session_data.yml +63 -0
- data/test/cassettes/core/service/i_request/accepts_an_endpoint_type_option_for_selecting_a_specific_request.yml +140 -0
- data/test/cassettes/core/service/i_request/can_find_the_correct_request_based_on_bootstrapped_session_data.yml +63 -0
- data/test/cassettes/core/service/i_request/can_find_the_correct_request_based_on_non-bootstrapped_session_data.yml +97 -0
- 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
- data/test/cassettes/core/service/i_request/uses_the_default_session_data_if_session_data_is_not_provided.yml +97 -0
- data/test/cassettes/core/session/c_load/creates_a_new_instance_from_the_given_session_dump.yml +63 -0
- data/test/cassettes/core/session/c_load/uses_the_loaded_auth_info_for_its_services.yml +63 -0
- data/test/cassettes/core/session/c_new/directs_log_entries_to_the_given_log_file.yml +63 -0
- data/test/cassettes/core/session/i_authenticate/authenticates_against_the_auth_service_indicated_in_the_config_file.yml +63 -0
- data/test/cassettes/core/session/i_authenticate/authenticates_against_the_auth_service_using_the_credentials_in_the_given_block.yml +38 -0
- data/test/cassettes/core/session/i_authenticate/raises_an_AuthenticationError_when_authentication_fails.yml +35 -0
- data/test/cassettes/core/session/i_authenticate/updates_the_session_data_of_its_service_objects.yml +123 -0
- data/test/cassettes/core/session/i_dump/serializes_the_session_data_for_caching.yml +63 -0
- data/test/cassettes/core/session/i_validate/returns_false_if_session_is_no_longer_valid.yml +97 -0
- data/test/cassettes/core/session/i_validate/returns_true_if_session_is_still_valid.yml +98 -0
- data/test/cassettes/core/session/i_xxx_service/returns_an_instance_of_the_indicated_service.yml +63 -0
- data/test/cassettes/openstack/compute/v2/public/list_images/leads_to_a_valid_response_when_no_parameters_are_provided.yml +108 -0
- data/test/cassettes/openstack/compute/v2/public/list_images/leads_to_a_valid_response_when_parameters_are_invalid.yml +96 -0
- data/test/cassettes/openstack/compute/v2/public/list_images/leads_to_a_valid_response_when_parameters_are_valid.yml +103 -0
- data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_body.yml +63 -0
- data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_body_.yml +63 -0
- data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_headers.yml +63 -0
- data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_headers_.yml +63 -0
- data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_url.yml +63 -0
- data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_url_.yml +63 -0
- data/test/cassettes/openstack/identity/v2/admin/create_tenant/leads_to_a_valid_response_when_params_are_invalid.yml +97 -0
- data/test/cassettes/openstack/identity/v2/admin/create_tenant/leads_to_a_valid_response_when_params_are_valid.yml +97 -0
- data/test/cassettes/openstack/identity/v2/admin/create_tenant/leads_to_a_valid_response_when_provided_with_invalid_params.yml +97 -0
- data/test/cassettes/openstack/identity/v2/public/create_token/leads_to_a_valid_response_when_parameters_are_invalid.yml +35 -0
- data/test/cassettes/openstack/identity/v2/public/create_token/leads_to_a_valid_response_when_parameters_are_valid.yml +38 -0
- data/test/cassettes/openstack/identity/v2/public/create_token/leads_to_a_valid_response_when_provided_with_a_token.yml +98 -0
- data/test/environment.yml.example +22 -0
- data/test/environment.yml.travis-ci +24 -0
- data/test/support/openstack_request_test_helper.rb +57 -0
- data/test/support/test_base_class.rb +39 -0
- data/test/support/test_environment.rb +37 -0
- data/test/support/test_reporter.rb +45 -0
- data/test/support/vcr_setup.rb +41 -0
- data/test/test_helper.rb +35 -0
- data/tmp/.gitignore +0 -0
- metadata +310 -8
- 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
|