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'))
6 require 'puppet/provider/aviator'
9 describe Puppet::Provider::Aviator do
12 ENV['OS_USERNAME'] = nil
13 ENV['OS_PASSWORD'] = nil
14 ENV['OS_TENANT_NAME'] = nil
15 ENV['OS_AUTH_URL'] = nil
18 let(:log_file) { '/tmp/aviator_spec.log' }
21 Puppet::Type.newtype(:test_resource) do
22 newparam(:name, :namevar => true)
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'
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)
40 expect(response.status).to eq(200)
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"
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)
58 expect(response.status).to eq(200)
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/)
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)
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)
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/)
94 describe '#session' do
96 context 'with valid password credentials in parameters' do
97 let(:resource_attrs) do
99 :name => 'stubresource',
101 'username' => 'admin',
102 'password' => 'fyby-tet',
103 'tenant_name' => 'admin',
104 'host_uri' => 'http://192.168.11.4:35357/v2.0',
109 it 'creates a session' do
110 provider = Puppet::Provider::Aviator.new(type.new(resource_attrs))
112 VCR.use_cassette('aviator/session/with_password') do
113 session = provider.session
114 response = session.identity_service.request(:list_tenants)
116 expect(response.status).to eq(200)
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
124 :name => 'stubresource',
126 'openrc' => '/root/openrc'
131 it 'creates a session' do
132 provider = Puppet::Provider::Aviator.new(type.new(resource_attrs))
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)
140 expect(response.status).to eq(200)
144 context 'with valid service token in parameters' do
145 let(:resource_attrs) do
147 :name => 'stubresource',
149 'service_token' => 'sosp-kyl',
150 'host_uri' => 'http://192.168.11.4:35357/v2.0'
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)
163 it 'creates a session' do
164 expect(session.status).to eq(200)
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
173 :name => 'stubresource',
177 Puppet::Provider::Aviator.new(type.new(resource_attrs))
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
186 :name => 'stubresource',
190 Puppet::Provider::Aviator.new(type.new(resource_attrs))
196 context 'with no valid credentials' do
197 it_behaves_like 'it has no credentials' do
198 let(:resource_attrs) do
200 :name => 'stubresource',
203 let(:provider) { Puppet::Provider::Aviator.new(type.new(resource_attrs)) }
210 describe '::session' do
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 }
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 }
224 context 'with no valid credentials' do
225 it_behaves_like 'it has no credentials' do
226 let(:provider) { Puppet::Provider::Aviator.dup }
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
236 :name => 'stubresource',
238 'username' => 'admin',
239 'password' => 'fyby-tet',
240 'tenant_name' => 'admin',
241 'host_uri' => 'http://192.168.11.4:35357/v2.0',
245 let (:provider) { Puppet::Provider::Aviator.new(type.new(resource_attrs)) }
249 context 'when injecting session data' do
250 let(:resource_attrs) do
252 :name => 'stubresource',
254 'service_token' => 'sosp-kyl',
255 'host_uri' => 'http://192.168.11.4:35357/v2.0'
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)
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
274 :name => 'stubresource',
277 let(:provider) {Puppet::Provider::Aviator.new(type.new(resource_attrs)) }
282 describe '::request' do
283 context 'when a session exists' do
285 it_behaves_like 'making request with an existing session' do
286 let(:provider) { provider = Puppet::Provider::Aviator.dup }
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'
296 context 'when injecting session data' do
297 let(:session_data) do
299 :base_url => 'http://192.168.11.4:35357/v2.0',
300 :service_token => 'sosp-kyl'
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)
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 }