]> git.donarmstrong.com Git - dsa-puppet.git/blob - 3rdparty/modules/keystone/spec/unit/provider/keystone_user/openstack_spec.rb
Update to Kilo
[dsa-puppet.git] / 3rdparty / modules / keystone / spec / unit / provider / keystone_user / openstack_spec.rb
1 require 'puppet'
2 require 'spec_helper'
3 require 'puppet/provider/keystone_user/openstack'
4 require 'puppet/provider/openstack'
5
6 provider_class = Puppet::Type.type(:keystone_user).provider(:openstack)
7
8 def project_class
9   Puppet::Type.type(:keystone_tenant).provider(:openstack)
10 end
11
12 describe provider_class do
13
14   shared_examples 'authenticated with environment variables' do
15     ENV['OS_USERNAME']     = 'test'
16     ENV['OS_PASSWORD']     = 'abc123'
17     ENV['OS_PROJECT_NAME'] = 'test'
18     ENV['OS_AUTH_URL']     = 'http://127.0.0.1:5000'
19   end
20
21   let(:user_attrs) do
22     {
23       :name         => 'foo',
24       :ensure       => :present,
25       :enabled      => 'True',
26       :password     => 'foo',
27       :tenant       => 'foo',
28       :email        => 'foo@example.com',
29       :domain       => 'foo_domain',
30     }
31   end
32
33   let(:resource) do
34     Puppet::Type::Keystone_user.new(user_attrs)
35   end
36
37   let(:provider) do
38     provider_class.new(resource)
39   end
40
41   def before_hook(delete, missing, noproject, user_cached)
42     provider.class.expects(:openstack).once
43                   .with('domain', 'list', '--quiet', '--format', 'csv', [])
44                   .returns('"ID","Name","Enabled","Description"
45 "foo_domain_id","foo_domain",True,"foo domain"
46 "bar_domain_id","bar_domain",True,"bar domain"
47 "another_domain_id","another_domain",True,"another domain"
48 "disabled_domain_id","disabled_domain",False,"disabled domain"
49 ')
50     if user_cached
51       return # using cached user, so no user list
52     end
53     if noproject
54       project = ''
55     else
56       project = 'foo'
57     end
58     # delete will call the search again and should not return the deleted user
59     foo_returns = ['"ID","Name","Project Id","Domain","Description","Email","Enabled"
60 "1cb05cfed7c24279be884ba4f6520262","foo",' + project + ',"foo_domain_id","foo description","foo@example.com",True
61 "2cb05cfed7c24279be884ba4f6520262","foo",' + project + ',"bar_domain_id","foo description","foo@example.com",True
62 "3cb05cfed7c24279be884ba4f6520262","foo",' + project + ',"another_domain_id","foo description","foo@example.com",True
63 ']
64     nn = 1
65     if delete
66       nn = 2
67       foo_returns << ''
68     end
69     if missing
70       foo_returns = ['']
71     end
72     provider.class.expects(:openstack).times(nn)
73                   .with('user', 'list', '--quiet', '--format', 'csv', ['--long'])
74                   .returns(*foo_returns)
75   end
76
77   before :each, :default => true do
78     before_hook(false, false, false, false)
79   end
80   before :each, :delete => true do
81     before_hook(true, false, false, false)
82   end
83   before :each, :missing => true do
84     before_hook(false, true, false, false)
85   end
86   before :each, :noproject => true do
87     before_hook(false, false, true, false)
88   end
89   before :each, :default_https => true do
90     before_hook(false, false, false, false)
91   end
92   before :each, :user_cached => true do
93     before_hook(false, false, false, true)
94   end
95   before :each, :nohooks => true do
96     # do nothing
97   end
98
99   describe 'when managing a user' do
100     it_behaves_like 'authenticated with environment variables' do
101       describe '#create' do
102         it 'creates a user' do
103           project_class.expects(:openstack).once
104                        .with('domain', 'list', '--quiet', '--format', 'csv', [])
105                        .returns('"ID","Name","Enabled","Description"
106 "foo_domain_id","foo_domain",True,"foo domain"
107 "bar_domain_id","bar_domain",True,"bar domain"
108 "another_domain_id","another_domain",True,"another domain"
109 "disabled_domain_id","disabled_domain",False,"disabled domain"
110 ')
111           project_class.expects(:openstack)
112                        .with('project', 'list', '--quiet', '--format', 'csv', '--long')
113                        .returns('"ID","Name","Domain ID","Description","Enabled"
114 "1cb05cfed7c24279be884ba4f6520262","foo","foo_domain_id","foo",True
115 "2cb05cfed7c24279be884ba4f6520262","foo","bar_domain_id","foo",True
116 ')
117           provider.class.expects(:openstack)
118                         .with('role', 'show', '--format', 'shell', '_member_')
119                         .returns('
120 name="_member_"
121 ')
122           provider.class.expects(:openstack)
123                         .with('role', 'add', ['_member_', '--project', '2cb05cfed7c24279be884ba4f6520262', '--user', '12b23f07d4a3448d8189521ab09610b0'])
124           provider.class.expects(:openstack)
125                         .with('user', 'create', '--format', 'shell', ['foo', '--enable', '--password', 'foo', '--email', 'foo@example.com', '--domain', 'foo_domain'])
126                         .returns('email="foo@example.com"
127 enabled="True"
128 id="12b23f07d4a3448d8189521ab09610b0"
129 name="foo"
130 username="foo"
131 ')
132           provider.create
133           expect(provider.exists?).to be_truthy
134         end
135       end
136
137       describe '#destroy' do
138         it 'destroys a user' do
139           provider.instance_variable_get('@property_hash')[:id] = 'my-user-id'
140           provider.class.expects(:openstack)
141                         .with('user', 'delete', 'my-user-id')
142           provider.destroy
143           expect(provider.exists?).to be_falsey
144         end
145
146       end
147
148       describe '#exists' do
149         context 'when user does not exist' do
150           subject(:response) do
151             response = provider.exists?
152           end
153
154           it { is_expected.to be_falsey }
155         end
156       end
157
158       describe '#instances', :default => true do
159         it 'finds every user' do
160           instances = provider.class.instances
161           expect(instances.count).to eq(3)
162           expect(instances[0].name).to eq('foo')
163           expect(instances[0].domain).to eq('another_domain')
164           expect(instances[1].name).to eq('foo::foo_domain')
165           expect(instances[2].name).to eq('foo::bar_domain')
166         end
167       end
168
169       describe '#tenant' do
170         it 'gets the tenant with default backend', :nohooks => true do
171             project_class.expects(:openstack)
172                          .with('project', 'list', '--quiet', '--format', 'csv', '--long')
173                          .returns('"ID","Name","Domain ID","Description","Enabled"
174 "1cb05cfed7c24279be884ba4f6520262","foo","foo_domain_id","foo",True
175 "2cb05cfed7c24279be884ba4f6520262","bar","bar_domain_id","bar",True
176 ')
177           provider.class.expects(:openstack)
178                         .with('project', 'list', '--quiet', '--format', 'csv', ['--user', '1cb05cfed7c24279be884ba4f6520262', '--long'])
179                         .returns('"ID","Name","Domain ID","Description","Enabled"
180 "foo_project_id1","foo","foo_domain_id","",True
181 ')
182           provider.instance_variable_get('@property_hash')[:id] = '1cb05cfed7c24279be884ba4f6520262'
183           tenant = provider.tenant
184           expect(tenant).to eq('foo')
185         end
186
187         it 'gets the tenant with LDAP backend', :nohooks => true do
188           provider.instance_variable_get('@property_hash')[:id] = '1cb05cfed7c24279be884ba4f6520262'
189             project_class.expects(:openstack)
190                          .with('project', 'list', '--quiet', '--format', 'csv', '--long')
191                          .returns('"ID","Name","Domain ID","Description","Enabled"
192 "1cb05cfed7c24279be884ba4f6520262","foo","foo_domain_id","foo",True
193 "2cb05cfed7c24279be884ba4f6520262","bar","bar_domain_id","bar",True
194 ')
195           provider.class.expects(:openstack)
196                         .with('project', 'list', '--quiet', '--format', 'csv', ['--user', '1cb05cfed7c24279be884ba4f6520262', '--long'])
197                         .returns('"ID","Name","Domain ID","Description","Enabled"
198 "foo_project_id1","foo","foo_domain_id","",True
199 "bar_project_id2","bar","bar_domain_id","",True
200 "foo_project_id2","foo","another_domain_id","",True
201 ')
202           tenant = provider.tenant
203           expect(tenant).to eq('foo')
204         end
205       end
206       describe '#tenant=' do
207         context 'when using default backend', :nohooks => true do
208           it 'sets the tenant' do
209             provider.instance_variable_get('@property_hash')[:id] = '1cb05cfed7c24279be884ba4f6520262'
210             provider.instance_variable_get('@property_hash')[:domain] = 'foo_domain'
211             project_class.expects(:openstack)
212                          .with('project', 'list', '--quiet', '--format', 'csv', '--long')
213                          .returns('"ID","Name","Domain ID","Description","Enabled"
214 "1cb05cfed7c24279be884ba4f6520262","foo","foo_domain_id","foo",True
215 "2cb05cfed7c24279be884ba4f6520262","bar","bar_domain_id","bar",True
216 ')
217             provider.class.expects(:openstack)
218                           .with('role', 'show', '--format', 'shell', '_member_')
219                           .returns('name="_member_"')
220             provider.class.expects(:openstack)
221                           .with('role', 'add', ['_member_', '--project', '2cb05cfed7c24279be884ba4f6520262', '--user', '1cb05cfed7c24279be884ba4f6520262'])
222             provider.tenant=('bar')
223           end
224         end
225         context 'when using LDAP read-write backend', :nohooks => true do
226           it 'sets the tenant when _member_ role exists' do
227             provider.instance_variable_get('@property_hash')[:id] = '1cb05cfed7c24279be884ba4f6520262'
228             provider.instance_variable_get('@property_hash')[:domain] = 'foo_domain'
229             project_class.expects(:openstack)
230                          .with('project', 'list', '--quiet', '--format', 'csv', '--long')
231                          .returns('"ID","Name","Domain ID","Description","Enabled"
232 "1cb05cfed7c24279be884ba4f6520262","foo","foo_domain_id","foo",True
233 "2cb05cfed7c24279be884ba4f6520262","bar","bar_domain_id","bar",True
234 ')
235             provider.class.expects(:openstack)
236                           .with('role', 'show', '--format', 'shell', '_member_')
237                           .returns('name="_member_"')
238             provider.class.expects(:openstack)
239                           .with('role', 'add', ['_member_', '--project', '2cb05cfed7c24279be884ba4f6520262', '--user', '1cb05cfed7c24279be884ba4f6520262'])
240             provider.tenant=('bar')
241           end
242           it 'sets the tenant when _member_ role does not exist' do
243             provider.instance_variable_get('@property_hash')[:id] = '1cb05cfed7c24279be884ba4f6520262'
244             provider.instance_variable_get('@property_hash')[:domain] = 'foo_domain'
245             project_class.expects(:openstack)
246                          .with('project', 'list', '--quiet', '--format', 'csv', '--long')
247                          .returns('"ID","Name","Domain ID","Description","Enabled"
248 "1cb05cfed7c24279be884ba4f6520262","foo","foo_domain_id","foo",True
249 "2cb05cfed7c24279be884ba4f6520262","bar","bar_domain_id","bar",True
250 ')
251             provider.class.expects(:openstack)
252                           .with('role', 'show', '--format', 'shell', '_member_')
253                           .raises(Puppet::ExecutionFailure, 'no such role _member_')
254             provider.class.expects(:openstack)
255                           .with('role', 'create', '--format', 'shell', '_member_')
256                           .returns('name="_member_"')
257             provider.class.expects(:openstack)
258                           .with('role', 'add', ['_member_', '--project', '2cb05cfed7c24279be884ba4f6520262', '--user', '1cb05cfed7c24279be884ba4f6520262'])
259             provider.tenant=('bar')
260           end
261         end
262         context 'when using LDAP read-only backend', :nohooks => true do
263           it 'sets the tenant when _member_ role exists' do
264             provider.instance_variable_get('@property_hash')[:id] = '1cb05cfed7c24279be884ba4f6520262'
265             provider.instance_variable_get('@property_hash')[:domain] = 'foo_domain'
266             project_class.expects(:openstack)
267                          .with('project', 'list', '--quiet', '--format', 'csv', '--long')
268                          .returns('"ID","Name","Domain ID","Description","Enabled"
269 "1cb05cfed7c24279be884ba4f6520262","foo","foo_domain_id","foo",True
270 "2cb05cfed7c24279be884ba4f6520262","bar","bar_domain_id","bar",True
271 ')
272             provider.class.expects(:openstack)
273                           .with('role', 'show', '--format', 'shell', '_member_')
274                           .returns('name="_member_"')
275             provider.class.expects(:openstack)
276                           .with('role', 'add', ['_member_', '--project', '2cb05cfed7c24279be884ba4f6520262', '--user', '1cb05cfed7c24279be884ba4f6520262'])
277             provider.tenant=('bar')
278           end
279         end
280       end
281     end
282   end
283
284   describe "#password", :nohooks => true do
285     let(:user_attrs) do
286       {
287         :name         => 'foo',
288         :ensure       => 'present',
289         :enabled      => 'True',
290         :password     => 'foo',
291         :tenant       => 'foo',
292         :email        => 'foo@example.com',
293         :domain       => 'foo_domain',
294       }
295     end
296
297     let(:resource) do
298       Puppet::Type::Keystone_user.new(user_attrs)
299     end
300
301     let :provider do
302       provider_class.new(resource)
303     end
304
305     shared_examples 'with auth-url environment variable' do
306       ENV['OS_AUTH_URL'] = 'http://127.0.0.1:5000'
307     end
308
309     it_behaves_like 'with auth-url environment variable' do
310       it 'checks the password' do
311         provider.instance_variable_get('@property_hash')[:id] = '1cb05cfed7c24279be884ba4f6520262'
312         mockcreds = {}
313         Puppet::Provider::Openstack::CredentialsV3.expects(:new).returns(mockcreds)
314         mockcreds.expects(:auth_url=).with('http://127.0.0.1:5000')
315         mockcreds.expects(:password=).with('foo')
316         mockcreds.expects(:username=).with('foo')
317         mockcreds.expects(:user_id=).with('1cb05cfed7c24279be884ba4f6520262')
318         mockcreds.expects(:project_id=).with('project-id-1')
319         mockcreds.expects(:to_env).returns(mockcreds)
320         Puppet::Provider::Openstack.expects(:openstack)
321                       .with('project', 'list', '--quiet', '--format', 'csv', ['--user', '1cb05cfed7c24279be884ba4f6520262', '--long'])
322                       .returns('"ID","Name","Domain ID","Description","Enabled"
323 "project-id-1","foo","foo_domain_id","foo",True
324 ')
325         Puppet::Provider::Openstack.expects(:openstack)
326                       .with('token', 'issue', ['--format', 'value'])
327                       .returns('2015-05-14T04:06:05Z
328 e664a386befa4a30878dcef20e79f167
329 8dce2ae9ecd34c199d2877bf319a3d06
330 ac43ec53d5a74a0b9f51523ae41a29f0
331 ')
332         password = provider.password
333         expect(password).to eq('foo')
334       end
335
336       it 'fails the password check' do
337         provider.instance_variable_get('@property_hash')[:id] = '1cb05cfed7c24279be884ba4f6520262'
338         Puppet::Provider::Openstack.expects(:openstack)
339                       .with('project', 'list', '--quiet', '--format', 'csv', ['--user', '1cb05cfed7c24279be884ba4f6520262', '--long'])
340                       .returns('"ID","Name","Domain ID","Description","Enabled"
341 "project-id-1","foo","foo_domain_id","foo",True
342 ')
343         Puppet::Provider::Openstack.expects(:openstack)
344                       .with('token', 'issue', ['--format', 'value'])
345                       .raises(Puppet::ExecutionFailure, 'HTTP 401 invalid authentication')
346         password = provider.password
347         expect(password).to eq(nil)
348       end
349
350       it 'checks the password with domain scoped token' do
351         provider.instance_variable_get('@property_hash')[:id] = '1cb05cfed7c24279be884ba4f6520262'
352         provider.instance_variable_get('@property_hash')[:domain] = 'foo_domain'
353         mockcreds = {}
354         Puppet::Provider::Openstack::CredentialsV3.expects(:new).returns(mockcreds)
355         mockcreds.expects(:auth_url=).with('http://127.0.0.1:5000')
356         mockcreds.expects(:password=).with('foo')
357         mockcreds.expects(:username=).with('foo')
358         mockcreds.expects(:user_id=).with('1cb05cfed7c24279be884ba4f6520262')
359         mockcreds.expects(:domain_name=).with('foo_domain')
360         mockcreds.expects(:to_env).returns(mockcreds)
361         Puppet::Provider::Openstack.expects(:openstack)
362                       .with('project', 'list', '--quiet', '--format', 'csv', ['--user', '1cb05cfed7c24279be884ba4f6520262', '--long'])
363                       .returns('"ID","Name","Domain ID","Description","Enabled"
364 ')
365         Puppet::Provider::Openstack.expects(:openstack)
366                       .with('token', 'issue', ['--format', 'value'])
367                       .returns('2015-05-14T04:06:05Z
368 e664a386befa4a30878dcef20e79f167
369 8dce2ae9ecd34c199d2877bf319a3d06
370 ac43ec53d5a74a0b9f51523ae41a29f0
371 ')
372         password = provider.password
373         expect(password).to eq('foo')
374       end
375     end
376   end
377
378   describe 'when updating a user with unmanaged password', :nohooks => true do
379
380     describe 'when updating a user with unmanaged password' do
381
382       let(:user_attrs) do
383         {
384           :name             => 'foo',
385           :ensure           => 'present',
386           :enabled          => 'True',
387           :password         => 'foo',
388           :replace_password => 'False',
389           :tenant           => 'foo',
390           :email            => 'foo@example.com',
391           :domain           => 'foo_domain',
392         }
393       end
394
395       let(:resource) do
396         Puppet::Type::Keystone_user.new(user_attrs)
397       end
398
399       let :provider do
400         provider_class.new(resource)
401       end
402
403       it 'should not try to check password' do
404         expect(provider.password).to eq('foo')
405       end
406     end
407   end
408
409   it_behaves_like 'authenticated with environment variables' do
410     describe 'v3 domains with no domain in resource', :nohooks => true do
411       let(:user_attrs) do
412         {
413           :name         => 'foo',
414           :ensure       => 'present',
415           :enabled      => 'True',
416           :password     => 'foo',
417           :tenant       => 'foo',
418           :email        => 'foo@example.com',
419         }
420       end
421
422       it 'adds default domain to commands' do
423         provider_class.class_exec {
424           @default_domain_id = nil
425         }
426         mock = {
427           'identity' => {'default_domain_id' => 'foo_domain_id'}
428         }
429         Puppet::Util::IniConfig::File.expects(:new).returns(mock)
430         File.expects(:exists?).with('/etc/keystone/keystone.conf').returns(true)
431         mock.expects(:read).with('/etc/keystone/keystone.conf')
432         provider.class.expects(:openstack)
433                      .with('project', 'list', '--quiet', '--format', 'csv', ['--user', '1cb05cfed7c24279be884ba4f6520262', '--long'])
434                      .returns('"ID","Name"
435 ')
436         project_class.expects(:openstack)
437                      .with('project', 'list', '--quiet', '--format', 'csv', '--long')
438                      .returns('"ID","Name","Domain ID","Description","Enabled"
439 "1cb05cfed7c24279be884ba4f6520262","foo","foo_domain_id","foo",True
440 "2cb05cfed7c24279be884ba4f6520262","bar","bar_domain_id","bar",True
441 ')
442         provider.class.expects(:openstack)
443                       .with('role', 'show', '--format', 'shell', '_member_')
444                       .returns('
445 name="_member_"
446 ')
447         provider.class.expects(:openstack)
448                       .with('role', 'add', ['_member_', '--project', '1cb05cfed7c24279be884ba4f6520262', '--user', '1cb05cfed7c24279be884ba4f6520262'])
449         provider.class.expects(:openstack)
450                       .with('user', 'create', '--format', 'shell', ['foo', '--enable', '--password', 'foo', '--email', 'foo@example.com', '--domain', 'foo_domain'])
451                     .returns('email="foo@example.com"
452 enabled="True"
453 id="1cb05cfed7c24279be884ba4f6520262"
454 name="foo"
455 username="foo"
456 ')
457         provider.create
458         expect(provider.exists?).to be_truthy
459         expect(provider.id).to eq("1cb05cfed7c24279be884ba4f6520262")
460       end
461     end
462
463     describe 'v3 domains with domain in resource' do
464       let(:user_attrs) do
465         {
466           :name         => 'foo',
467           :ensure       => 'present',
468           :enabled      => 'True',
469           :password     => 'foo',
470           :tenant       => 'foo',
471           :email        => 'foo@example.com',
472           :domain       => 'bar_domain',
473         }
474       end
475
476       it 'uses given domain in commands' do
477         project_class.expects(:openstack)
478                      .with('project', 'list', '--quiet', '--format', 'csv', '--long')
479                      .returns('"ID","Name","Domain ID","Description","Enabled"
480 "1cb05cfed7c24279be884ba4f6520262","foo","foo_domain_id","foo",True
481 "2cb05cfed7c24279be884ba4f6520262","bar","bar_domain_id","bar",True
482 ')
483         provider.class.expects(:openstack)
484                       .with('role', 'show', '--format', 'shell', '_member_')
485                       .returns('
486 name="_member_"
487 ')
488         provider.class.expects(:openstack)
489                       .with('role', 'add', ['_member_', '--project', '1cb05cfed7c24279be884ba4f6520262', '--user', '2cb05cfed7c24279be884ba4f6520262'])
490         provider.class.expects(:openstack)
491                       .with('user', 'create', '--format', 'shell', ['foo', '--enable', '--password', 'foo', '--email', 'foo@example.com', '--domain', 'bar_domain'])
492                       .returns('email="foo@example.com"
493 enabled="True"
494 id="2cb05cfed7c24279be884ba4f6520262"
495 name="foo"
496 username="foo"
497 ')
498         provider.create
499         expect(provider.exists?).to be_truthy
500         expect(provider.id).to eq("2cb05cfed7c24279be884ba4f6520262")
501       end
502     end
503
504     describe 'v3 domains with domain in name/title' do
505       let(:user_attrs) do
506         {
507           :name         => 'foo::bar_domain',
508           :ensure       => 'present',
509           :enabled      => 'True',
510           :password     => 'foo',
511           :tenant       => 'foo',
512           :email        => 'foo@example.com',
513         }
514       end
515
516       it 'uses given domain in commands' do
517         project_class.expects(:openstack)
518                      .with('project', 'list', '--quiet', '--format', 'csv', '--long')
519                      .returns('"ID","Name","Domain ID","Description","Enabled"
520 "1cb05cfed7c24279be884ba4f6520262","foo","foo_domain_id","foo",True
521 "2cb05cfed7c24279be884ba4f6520262","bar","bar_domain_id","bar",True
522 ')
523         provider.class.expects(:openstack)
524                       .with('role', 'show', '--format', 'shell', '_member_')
525                       .returns('
526 name="_member_"
527 ')
528         provider.class.expects(:openstack)
529                       .with('role', 'add', ['_member_', '--project', '1cb05cfed7c24279be884ba4f6520262', '--user', '2cb05cfed7c24279be884ba4f6520262'])
530         provider.class.expects(:openstack)
531                       .with('user', 'create', '--format', 'shell', ['foo', '--enable', '--password', 'foo', '--email', 'foo@example.com', '--domain', 'bar_domain'])
532                       .returns('email="foo@example.com"
533 enabled="True"
534 id="2cb05cfed7c24279be884ba4f6520262"
535 name="foo"
536 username="foo"
537 ')
538         provider.create
539         expect(provider.exists?).to be_truthy
540         expect(provider.id).to eq("2cb05cfed7c24279be884ba4f6520262")
541       end
542     end
543
544     describe 'v3 domains with domain in name/title and in resource' do
545       let(:user_attrs) do
546         {
547           :name         => 'foo::bar_domain',
548           :ensure       => 'present',
549           :enabled      => 'True',
550           :password     => 'foo',
551           :tenant       => 'foo',
552           :email        => 'foo@example.com',
553           :domain       => 'foo_domain',
554         }
555       end
556
557       it 'uses the resource domain in commands' do
558         project_class.expects(:openstack)
559                      .with('project', 'list', '--quiet', '--format', 'csv', '--long')
560                      .returns('"ID","Name","Domain ID","Description","Enabled"
561 "1cb05cfed7c24279be884ba4f6520262","foo","foo_domain_id","foo",True
562 "2cb05cfed7c24279be884ba4f6520262","bar","bar_domain_id","bar",True
563 ')
564         provider.class.expects(:openstack)
565                       .with('role', 'show', '--format', 'shell', '_member_')
566                       .returns('
567 name="_member_"
568 ')
569         provider.class.expects(:openstack)
570                       .with('role', 'add', ['_member_', '--project', '1cb05cfed7c24279be884ba4f6520262', '--user', '2cb05cfed7c24279be884ba4f6520262'])
571         provider.class.expects(:openstack)
572                       .with('user', 'create', '--format', 'shell', ['foo', '--enable', '--password', 'foo', '--email', 'foo@example.com', '--domain', 'foo_domain'])
573                       .returns('email="foo@example.com"
574 enabled="True"
575 id="2cb05cfed7c24279be884ba4f6520262"
576 name="foo"
577 username="foo"
578 ')
579         provider.create
580         expect(provider.exists?).to be_truthy
581         expect(provider.id).to eq("2cb05cfed7c24279be884ba4f6520262")
582       end
583     end
584
585     describe 'v3 domains with domain in name/title and in resource and in tenant' do
586       let(:user_attrs) do
587         {
588           :name         => 'foo::bar_domain',
589           :ensure       => 'present',
590           :enabled      => 'True',
591           :password     => 'foo',
592           :tenant       => 'foo::foo_domain',
593           :email        => 'foo@example.com',
594           :domain       => 'foo_domain',
595         }
596       end
597
598       it 'uses the resource domain in commands' do
599         project_class.expects(:openstack)
600                      .with('project', 'list', '--quiet', '--format', 'csv', '--long')
601                      .returns('"ID","Name","Domain ID","Description","Enabled"
602 "1cb05cfed7c24279be884ba4f6520262","foo","foo_domain_id","foo",True
603 "2cb05cfed7c24279be884ba4f6520262","foo","bar_domain_id","foo",True
604 ')
605         provider.class.expects(:openstack)
606                       .with('role', 'show', '--format', 'shell', '_member_')
607                       .returns('
608 name="_member_"
609 ')
610         provider.class.expects(:openstack)
611                       .with('role', 'add', ['_member_', '--project', '1cb05cfed7c24279be884ba4f6520262', '--user', '2cb05cfed7c24279be884ba4f6520262'])
612         provider.class.expects(:openstack)
613                       .with('user', 'create', '--format', 'shell', ['foo', '--enable', '--password', 'foo', '--email', 'foo@example.com', '--domain', 'foo_domain'])
614                       .returns('email="foo@example.com"
615 enabled="True"
616 id="2cb05cfed7c24279be884ba4f6520262"
617 name="foo"
618 username="foo"
619 ')
620         provider.create
621         expect(provider.exists?).to be_truthy
622         expect(provider.id).to eq("2cb05cfed7c24279be884ba4f6520262")
623       end
624     end
625   end
626 end