]> git.donarmstrong.com Git - dsa-puppet.git/blob - 3rdparty/modules/openstacklib/spec/unit/provider/aviator_spec.rb
35564e64a70df38d53492362fb17375e244b8902
[dsa-puppet.git] / 3rdparty / modules / openstacklib / spec / unit / provider / aviator_spec.rb
1 # Load libraries from aviator here to simulate how they live together in a real puppet run
2 $LOAD_PATH.push(File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'modules', 'aviator', 'lib'))
3 require 'puppet'
4 require 'vcr'
5 require 'spec_helper'
6 require 'puppet/provider/aviator'
7
8
9 describe Puppet::Provider::Aviator do
10
11   before(:each) do
12     ENV['OS_USERNAME']    = nil
13     ENV['OS_PASSWORD']    = nil
14     ENV['OS_TENANT_NAME'] = nil
15     ENV['OS_AUTH_URL']    = nil
16   end
17
18   let(:log_file) { '/tmp/aviator_spec.log' }
19
20   let(:type) do
21     Puppet::Type.newtype(:test_resource) do
22       newparam(:name, :namevar => true)
23       newparam(:auth)
24       newparam(:log_file)
25     end
26   end
27
28
29   shared_examples 'creating a session using environment variables' do
30     it 'creates an authenticated session' do
31       ENV['OS_USERNAME']    = 'admin'
32       ENV['OS_PASSWORD']    = 'fyby-tet'
33       ENV['OS_TENANT_NAME'] = 'admin'
34       ENV['OS_AUTH_URL']    = 'http://192.168.11.4:35357/v2.0'
35       response = nil
36       VCR.use_cassette('aviator/session/with_password') do
37         session = provider.session
38         response = session.identity_service.request(:list_tenants, :session_data => provider.session_data)
39       end
40       expect(response.status).to eq(200)
41     end
42   end
43
44   shared_examples 'creating a session using a service token from keystone.conf' do
45     it 'creates an unauthenticated session' do
46       data = "[DEFAULT]\nadmin_token=sosp-kyl\nadmin_endpoint=http://192.168.11.4:35357/v2.0"
47       response = nil
48       VCR.use_cassette('aviator/session/with_token') do
49         # Stubbing File.read produces inconsistent results because of how IniConfig
50         # overrides the File class in some versions of Puppet.
51         # Stubbing FileType.filetype(:flat) simplifies working with IniConfig
52         Puppet::Util::FileType.filetype(:flat).any_instance.expects(:read).returns(StringIO.new(data).read)
53         session = provider.session
54         Puppet::Util::FileType.filetype(:flat).any_instance.unstub(:read)
55         response = session.identity_service.request(:list_tenants, :session_data => provider.session_data)
56       end
57
58       expect(response.status).to eq(200)
59     end
60   end
61
62   shared_examples 'it has no credentials' do
63     it 'fails to authenticate' do
64       expect{ provider.session }.to raise_error(Puppet::Error, /No credentials provided/)
65     end
66   end
67
68   shared_examples 'making request with an existing session' do
69    it 'makes a successful request' do
70      VCR.use_cassette('aviator/request/with_session') do
71        session = provider.session
72        response = provider.request(session.identity_service, :list_tenants)
73        expect(response.status).to eq(200)
74      end
75    end
76   end
77
78   shared_examples 'making request with injected session data' do
79     it 'makes a successful request' do
80       VCR.use_cassette('aviator/request/without_session') do
81         session = provider.session
82         response = provider.request(session.identity_service, :list_tenants)
83         expect(response.status).to eq(200)
84       end
85     end
86   end
87
88   shared_examples 'making request with no session or session data' do
89     it 'fails to make a request' do
90       expect{ provider.request(nil, :list_tenants) }.to raise_error(Puppet::Error, /Cannot make a request/)
91     end
92   end
93
94   describe '#session' do
95
96     context 'with valid password credentials in parameters' do
97       let(:resource_attrs) do
98         {
99           :name         => 'stubresource',
100           :auth         => {
101             'username'    => 'admin',
102             'password'    => 'fyby-tet',
103             'tenant_name' => 'admin',
104             'host_uri'    => 'http://192.168.11.4:35357/v2.0',
105           }
106         }
107       end
108
109       it 'creates a session' do
110         provider = Puppet::Provider::Aviator.new(type.new(resource_attrs))
111         response = nil
112         VCR.use_cassette('aviator/session/with_password') do
113           session = provider.session
114           response = session.identity_service.request(:list_tenants)
115         end
116         expect(response.status).to eq(200)
117       end
118     end
119
120     context 'with valid openrc file in parameters' do
121       data = "export OS_USERNAME='admin'\nexport OS_PASSWORD='fyby-tet'\nexport OS_TENANT_NAME='admin'\nexport OS_AUTH_URL='http://192.168.11.4:35357/v2.0'"
122       let(:resource_attrs) do
123         {
124           :name         => 'stubresource',
125           :auth         => {
126             'openrc' => '/root/openrc'
127           }
128         }
129       end
130
131       it 'creates a session' do
132         provider = Puppet::Provider::Aviator.new(type.new(resource_attrs))
133         response = nil
134         VCR.use_cassette('aviator/session/with_password') do
135           File.expects(:open).with('/root/openrc').returns(StringIO.new(data))
136           session = provider.session
137           File.unstub(:open)  # Ignore File.open calls to cassette file
138           response = session.identity_service.request(:list_tenants)
139         end
140         expect(response.status).to eq(200)
141       end
142     end
143
144     context 'with valid service token in parameters' do
145       let(:resource_attrs) do
146         {
147           :name         => 'stubresource',
148           :auth         => {
149             'service_token' => 'sosp-kyl',
150             'host_uri'      => 'http://192.168.11.4:35357/v2.0'
151           }
152         }
153       end
154
155       subject(:session) do
156         provider = Puppet::Provider::Aviator.new(type.new(resource_attrs))
157         VCR.use_cassette('aviator/session/with_token') do
158           session = provider.session
159           response = session.identity_service.request(:list_tenants, :session_data => provider.session_data)
160         end
161       end
162
163       it 'creates a session' do
164         expect(session.status).to eq(200)
165       end
166
167     end
168
169     context 'with valid password credentials in environment variables' do
170       it_behaves_like 'creating a session using environment variables' do
171         let(:resource_attrs) do
172           {
173             :name => 'stubresource',
174           }
175         end
176         let(:provider) do
177           Puppet::Provider::Aviator.new(type.new(resource_attrs))
178         end
179       end
180     end
181
182     context 'with valid service token in keystone.conf' do
183       it_behaves_like 'creating a session using a service token from keystone.conf' do
184         let(:resource_attrs) do
185           {
186             :name => 'stubresource',
187           }
188         end
189         let(:provider) do
190           Puppet::Provider::Aviator.new(type.new(resource_attrs))
191         end
192       end
193
194     end
195
196     context 'with no valid credentials' do
197       it_behaves_like 'it has no credentials' do
198         let(:resource_attrs) do
199           {
200             :name => 'stubresource',
201           }
202         end
203         let(:provider) { Puppet::Provider::Aviator.new(type.new(resource_attrs)) }
204       end
205     end
206
207   end
208
209
210   describe '::session' do
211
212     context 'with valid password credentials in environment variables' do
213       it_behaves_like 'creating a session using environment variables' do
214         let(:provider) { Puppet::Provider::Aviator.dup }
215       end
216     end
217
218     context 'with valid service token in keystone.conf' do
219       it_behaves_like 'creating a session using a service token from keystone.conf' do
220         let(:provider) { Puppet::Provider::Aviator.dup }
221       end
222     end
223
224     context 'with no valid credentials' do
225       it_behaves_like 'it has no credentials' do
226         let(:provider) { Puppet::Provider::Aviator.dup }
227       end
228     end
229   end
230
231   describe '#request' do
232     context 'when a session exists' do
233       it_behaves_like 'making request with an existing session' do
234         let(:resource_attrs) do
235           {
236             :name         => 'stubresource',
237             :auth         => {
238               'username'    => 'admin',
239               'password'    => 'fyby-tet',
240               'tenant_name' => 'admin',
241               'host_uri'    => 'http://192.168.11.4:35357/v2.0',
242             }
243           }
244         end
245         let (:provider) { Puppet::Provider::Aviator.new(type.new(resource_attrs)) }
246       end
247     end
248
249     context 'when injecting session data' do
250       let(:resource_attrs) do
251         {
252           :name         => 'stubresource',
253           :auth         => {
254             'service_token' => 'sosp-kyl',
255             'host_uri'      => 'http://192.168.11.4:35357/v2.0'
256           }
257         }
258       end
259       let(:provider) { Puppet::Provider::Aviator.new(type.new(resource_attrs)) }
260       it 'makes a successful request' do
261         provider = Puppet::Provider::Aviator.new(type.new(resource_attrs))
262         VCR.use_cassette('aviator/request/without_session') do
263           session = provider.session
264           response = provider.request(session.identity_service, :list_tenants)
265           expect(response.status).to eq(200)
266         end
267       end
268     end
269
270     context 'when there is no session or session data' do
271       it_behaves_like 'making request with no session or session data' do
272         let(:resource_attrs) do
273           {
274             :name => 'stubresource',
275           }
276         end
277         let(:provider) {Puppet::Provider::Aviator.new(type.new(resource_attrs)) }
278       end
279     end
280   end
281
282   describe '::request' do
283     context 'when a session exists' do
284
285       it_behaves_like 'making request with an existing session' do
286         let(:provider) { provider = Puppet::Provider::Aviator.dup }
287         before(:each) do
288           ENV['OS_USERNAME']    = 'admin'
289           ENV['OS_PASSWORD']    = 'fyby-tet'
290           ENV['OS_TENANT_NAME'] = 'admin'
291           ENV['OS_AUTH_URL']    = 'http://192.168.11.4:35357/v2.0'
292         end
293       end
294     end
295
296     context 'when injecting session data' do
297       let(:session_data) do
298         {
299           :base_url      => 'http://192.168.11.4:35357/v2.0',
300           :service_token => 'sosp-kyl'
301         }
302       end
303       it 'makes a successful request' do
304         provider = Puppet::Provider::Aviator.dup
305         VCR.use_cassette('aviator/request/without_session') do
306           session = ::Aviator::Session.new(:config => { :provider => 'openstack' }, :log_file => log_file)
307           provider.session_data = session_data
308           response = provider.request(session.identity_service, :list_tenants)
309           expect(response.status).to eq(200)
310         end
311       end
312     end
313
314     context 'when there is no session or session data' do
315       it_behaves_like 'making request with no session or session data' do
316         let(:provider) { Puppet::Provider::Aviator.dup }
317       end
318     end
319   end
320 end