feb6c18640a4b61c346aea2e1403f576e9140a97
[mirror/dsa-puppet.git] / 3rdparty / modules / neutron / spec / unit / provider / nova_admin_tenant_id_setter / neutron_spec.rb
1 require 'spec_helper'
2 require 'puppet'
3 require 'puppet/type/nova_admin_tenant_id_setter'
4
5 provider_class = Puppet::Type.type(:nova_admin_tenant_id_setter).provider(:ruby)
6
7 # used to simulate an authentication response from Keystone
8 # (POST v2.0/tokens)
9 auth_response = {
10     'access' => {
11         'token' => {
12             'id' => 'TOKEN',
13         }
14     }
15 }
16
17 # used to simulate a response to GET v2.0/tenants
18 tenants_response = {
19     'tenants' => [
20         {
21             'name' => 'services',
22             'id'   => 'UUID_SERVICES'
23         },
24         {
25             'name' => 'multiple_matches_tenant',
26             'id'   => 'UUID1'
27         },
28         {
29             'name' => 'multiple_matches_tenant',
30             'id'   => 'UUID2'
31         },
32     ]
33 }
34
35 # Stub for ini_setting resource
36 Puppet::Type.newtype(:ini_setting) do
37 end
38
39 # Stub for ini_setting provider
40 Puppet::Type.newtype(:ini_setting).provide(:ruby) do
41     def create
42     end
43 end
44
45 describe 'Puppet::Type.type(:nova_admin_tenant_id_setter)' do
46     let :params do
47         {
48             :name             => 'nova_admin_tenant_id',
49             :tenant_name      => 'services',
50             :auth_username    => 'nova',
51             :auth_password    => 'secret',
52             :auth_tenant_name => 'admin',
53             :auth_url         => 'http://127.0.0.1:35357/v2.0',
54         }
55     end
56
57     it 'should have a non-nil provider' do
58         expect(provider_class).not_to be_nil
59     end
60
61     context 'when url is correct' do
62         before :each do
63             stub_request(:post, "http://127.0.0.1:35357/v2.0/tokens").
64                 to_return(:status => 200,
65                           :body => auth_response.to_json,
66                           :headers => {})
67             stub_request(:get, "http://127.0.0.1:35357/v2.0/tenants").
68                 with(:headers => {'X-Auth-Token'=>'TOKEN'}).
69                 to_return(:status => 200,
70                           :body => tenants_response.to_json,
71                           :headers => {})
72         end
73
74         it 'should create a resource' do
75             resource = Puppet::Type::Nova_admin_tenant_id_setter.new(params)
76             provider = provider_class.new(resource)
77             expect(provider.exists?).to be_false
78             expect(provider.create).to be_nil
79         end
80
81         context 'when tenant id already set' do
82             it 'should create a resource, with exists? true' do
83                 mock = { 'DEFAULT' => { 'nova_admin_tenant_id' => 'UUID_SERVICES' } }
84                 Puppet::Util::IniConfig::File.expects(:new).returns(mock)
85                 mock.expects(:read).with('/etc/neutron/neutron.conf')
86
87                 resource = Puppet::Type::Nova_admin_tenant_id_setter.new(params)
88                 provider = provider_class.new(resource)
89                 expect(provider.exists?).to be_true
90                 expect(provider.create).to be_nil
91             end
92         end
93     end
94
95     # What happens if we ask for a tenant that does not exist?
96     context 'when tenant cannot be found' do
97         before :each do
98             stub_request(:post, "http://127.0.0.1:35357/v2.0/tokens").
99                 to_return(:status => 200,
100                           :body => auth_response.to_json,
101                           :headers => {})
102             stub_request(:get, "http://127.0.0.1:35357/v2.0/tenants").
103                 with(:headers => {'X-Auth-Token'=>'TOKEN'}).
104                 to_return(:status => 200,
105                           :body => tenants_response.to_json,
106                           :headers => {})
107
108             params.merge!(:tenant_name => 'bad_tenant_name')
109         end
110
111         it 'should receive an api error' do
112             resource = Puppet::Type::Nova_admin_tenant_id_setter.new(params)
113             provider = provider_class.new(resource)
114             expect(provider.exists?).to be_false
115             expect { provider.create }.to raise_error KeystoneAPIError, /Unable to find matching tenant/
116         end
117     end
118
119     # What happens if we ask for a tenant name that results in multiple
120     # matches?
121     context 'when there are multiple matching tenants' do
122         before :each do
123             stub_request(:post, "http://127.0.0.1:35357/v2.0/tokens").
124                 to_return(:status => 200,
125                           :body => auth_response.to_json,
126                           :headers => {})
127             stub_request(:get, "http://127.0.0.1:35357/v2.0/tenants").
128                 with(:headers => {'X-Auth-Token'=>'TOKEN'}).
129                 to_return(:status => 200,
130                           :body => tenants_response.to_json,
131                           :headers => {})
132
133             params.merge!(:tenant_name => 'multiple_matches_tenant')
134         end
135
136         it 'should receive an api error' do
137             resource = Puppet::Type::Nova_admin_tenant_id_setter.new(params)
138             provider = provider_class.new(resource)
139             expect(provider.exists?).to be_false
140             expect { provider.create }.to raise_error KeystoneAPIError, /Found multiple matches for tenant name/
141         end
142     end
143
144     # What happens if we pass a bad password?
145     context 'when password is incorrect' do
146         before :each do
147             stub_request(:post, "http://127.0.0.1:35357/v2.0/tokens").
148                 to_return(:status => 401,
149                           :body => auth_response.to_json,
150                           :headers => {})
151         end
152
153         it 'should receive an authentication error' do
154             resource = Puppet::Type::Nova_admin_tenant_id_setter.new(params)
155             provider = provider_class.new(resource)
156             expect(provider.exists?).to be_false
157             expect { provider.create }.to raise_error KeystoneAPIError
158         end
159     end
160
161     # What happens if the server is not listening?
162     context 'when keystone server is unavailable' do
163         before :each do
164             stub_request(:post, "http://127.0.0.1:35357/v2.0/tokens").to_raise Errno::ECONNREFUSED
165         end
166
167         it 'should receive a connection error' do
168             resource = Puppet::Type::Nova_admin_tenant_id_setter.new(params)
169             provider = provider_class.new(resource)
170             expect(provider.exists?).to be_false
171             expect { provider.create }.to raise_error KeystoneConnectionError
172         end
173     end
174
175     # What happens if we mistype the hostname?
176     context 'when keystone server is unknown' do
177         before :each do
178             stub_request(:post, "http://127.0.0.1:35357/v2.0/tokens").to_raise SocketError, 'getaddrinfo: Name or service not known'
179         end
180
181         it 'should receive a connection error' do
182             resource = Puppet::Type::Nova_admin_tenant_id_setter.new(params)
183             provider = provider_class.new(resource)
184             expect(provider.exists?).to be_false
185             expect { provider.create }.to raise_error KeystoneConnectionError
186         end
187     end
188
189     context 'when using secure keystone endpoint' do
190         before :each do
191             params.merge!(:auth_url => "https://127.0.0.1:35357/v2.0")
192             stub_request(:post, "https://127.0.0.1:35357/v2.0/tokens").
193                 to_return(:status => 200,
194                           :body => auth_response.to_json,
195                           :headers => {})
196             stub_request(:get, "https://127.0.0.1:35357/v2.0/tenants").
197                 with(:headers => {'X-Auth-Token'=>'TOKEN'}).
198                 to_return(:status => 200,
199                           :body => tenants_response.to_json,
200                           :headers => {})
201         end
202
203         it 'should create a resource' do
204             resource = Puppet::Type::Nova_admin_tenant_id_setter.new(params)
205             provider = provider_class.new(resource)
206             expect(provider.exists?).to be_false
207             expect(provider.create).to be_nil
208         end
209     end
210
211 end
212