3 require 'puppet/type/nova_admin_tenant_id_setter'
5 provider_class = Puppet::Type.type(:nova_admin_tenant_id_setter).provider(:ruby)
7 # used to simulate an authentication response from Keystone
17 # used to simulate a response to GET v2.0/tenants
22 'id' => 'UUID_SERVICES'
25 'name' => 'multiple_matches_tenant',
29 'name' => 'multiple_matches_tenant',
35 # Stub for ini_setting resource
36 Puppet::Type.newtype(:ini_setting) do
39 # Stub for ini_setting provider
40 Puppet::Type.newtype(:ini_setting).provide(:ruby) do
45 describe 'Puppet::Type.type(:nova_admin_tenant_id_setter)' do
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',
57 it 'should have a non-nil provider' do
58 expect(provider_class).not_to be_nil
61 context 'when url is correct' 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,
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,
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
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')
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
95 # What happens if we ask for a tenant that does not exist?
96 context 'when tenant cannot be found' 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,
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,
108 params.merge!(:tenant_name => 'bad_tenant_name')
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/
119 # What happens if we ask for a tenant name that results in multiple
121 context 'when there are multiple matching tenants' 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,
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,
133 params.merge!(:tenant_name => 'multiple_matches_tenant')
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/
144 # What happens if we pass a bad password?
145 context 'when password is incorrect' 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,
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
161 # What happens if the server is not listening?
162 context 'when keystone server is unavailable' do
164 stub_request(:post, "http://127.0.0.1:35357/v2.0/tokens").to_raise Errno::ECONNREFUSED
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
175 # What happens if we mistype the hostname?
176 context 'when keystone server is unknown' do
178 stub_request(:post, "http://127.0.0.1:35357/v2.0/tokens").to_raise SocketError, 'getaddrinfo: Name or service not known'
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
189 context 'when using secure keystone endpoint' 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,
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,
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