chef 12.4.0 → 12.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (133) hide show
  1. checksums.yaml +4 -4
  2. data/lib/chef/api_client.rb +31 -129
  3. data/lib/chef/api_client_v1.rb +325 -0
  4. data/lib/chef/chef_class.rb +15 -7
  5. data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +2 -2
  6. data/lib/chef/dsl/resources.rb +6 -4
  7. data/lib/chef/exceptions.rb +2 -2
  8. data/lib/chef/guard_interpreter/resource_guard_interpreter.rb +2 -1
  9. data/lib/chef/knife/bootstrap/templates/chef-full.erb +4 -4
  10. data/lib/chef/knife/client_bulk_delete.rb +2 -2
  11. data/lib/chef/knife/client_create.rb +4 -4
  12. data/lib/chef/knife/client_delete.rb +3 -3
  13. data/lib/chef/knife/client_edit.rb +10 -2
  14. data/lib/chef/knife/client_list.rb +2 -2
  15. data/lib/chef/knife/client_reregister.rb +2 -2
  16. data/lib/chef/knife/client_show.rb +2 -2
  17. data/lib/chef/knife/osc_user_create.rb +3 -3
  18. data/lib/chef/knife/osc_user_delete.rb +2 -2
  19. data/lib/chef/knife/osc_user_edit.rb +3 -3
  20. data/lib/chef/knife/osc_user_list.rb +2 -2
  21. data/lib/chef/knife/osc_user_reregister.rb +2 -2
  22. data/lib/chef/knife/osc_user_show.rb +2 -2
  23. data/lib/chef/knife/user_create.rb +3 -3
  24. data/lib/chef/knife/user_delete.rb +4 -4
  25. data/lib/chef/knife/user_edit.rb +3 -3
  26. data/lib/chef/knife/user_list.rb +2 -2
  27. data/lib/chef/knife/user_reregister.rb +2 -2
  28. data/lib/chef/knife/user_show.rb +2 -2
  29. data/lib/chef/node_map.rb +14 -18
  30. data/lib/chef/platform/handler_map.rb +45 -0
  31. data/lib/chef/platform/priority_map.rb +19 -32
  32. data/lib/chef/platform/provider_handler_map.rb +29 -0
  33. data/lib/chef/platform/provider_mapping.rb +3 -2
  34. data/lib/chef/platform/resource_handler_map.rb +29 -0
  35. data/lib/chef/platform/resource_priority_map.rb +0 -6
  36. data/lib/chef/provider.rb +1 -1
  37. data/lib/chef/provider/dsc_resource.rb +2 -2
  38. data/lib/chef/provider/dsc_script.rb +1 -1
  39. data/lib/chef/provider/mount/aix.rb +1 -1
  40. data/lib/chef/provider/package.rb +0 -31
  41. data/lib/chef/provider/package/aix.rb +1 -0
  42. data/lib/chef/provider/package/apt.rb +1 -0
  43. data/lib/chef/provider/package/homebrew.rb +1 -0
  44. data/lib/chef/provider/package/ips.rb +1 -0
  45. data/lib/chef/provider/package/macports.rb +1 -0
  46. data/lib/chef/provider/package/openbsd.rb +1 -0
  47. data/lib/chef/provider/package/pacman.rb +1 -0
  48. data/lib/chef/provider/package/paludis.rb +1 -0
  49. data/lib/chef/provider/package/portage.rb +2 -0
  50. data/lib/chef/provider/package/smartos.rb +1 -0
  51. data/lib/chef/provider/package/solaris.rb +2 -0
  52. data/lib/chef/provider/package/yum.rb +1 -0
  53. data/lib/chef/provider/package/zypper.rb +1 -0
  54. data/lib/chef/provider/service.rb +4 -22
  55. data/lib/chef/provider/service/debian.rb +2 -0
  56. data/lib/chef/provider/service/insserv.rb +2 -0
  57. data/lib/chef/provider/service/invokercd.rb +2 -0
  58. data/lib/chef/provider/service/openbsd.rb +1 -1
  59. data/lib/chef/provider/service/redhat.rb +2 -0
  60. data/lib/chef/provider/service/upstart.rb +3 -0
  61. data/lib/chef/provider_resolver.rb +59 -53
  62. data/lib/chef/resource.rb +22 -73
  63. data/lib/chef/resource/dsc_script.rb +1 -1
  64. data/lib/chef/resource/ips_package.rb +1 -0
  65. data/lib/chef/resource/mount.rb +8 -0
  66. data/lib/chef/resource/openbsd_package.rb +0 -11
  67. data/lib/chef/resource/solaris_package.rb +1 -4
  68. data/lib/chef/resource_resolver.rb +54 -26
  69. data/lib/chef/run_list/versioned_recipe_list.rb +6 -5
  70. data/lib/chef/user.rb +52 -188
  71. data/lib/chef/user_v1.rb +335 -0
  72. data/lib/chef/version.rb +1 -1
  73. data/spec/data/trusted_certs/opscode.pem +53 -56
  74. data/spec/functional/provider/whyrun_safe_ruby_block_spec.rb +1 -1
  75. data/spec/functional/resource/package_spec.rb +0 -2
  76. data/spec/integration/recipes/recipe_dsl_spec.rb +661 -126
  77. data/spec/spec_helper.rb +19 -13
  78. data/spec/support/shared/unit/api_versioning.rb +2 -2
  79. data/spec/unit/api_client_spec.rb +22 -201
  80. data/spec/unit/api_client_v1_spec.rb +457 -0
  81. data/spec/unit/knife/client_bulk_delete_spec.rb +4 -4
  82. data/spec/unit/knife/client_create_spec.rb +1 -1
  83. data/spec/unit/knife/client_delete_spec.rb +3 -3
  84. data/spec/unit/knife/client_edit_spec.rb +14 -1
  85. data/spec/unit/knife/client_list_spec.rb +1 -1
  86. data/spec/unit/knife/client_reregister_spec.rb +2 -2
  87. data/spec/unit/knife/client_show_spec.rb +2 -2
  88. data/spec/unit/knife/osc_user_create_spec.rb +5 -5
  89. data/spec/unit/knife/osc_user_delete_spec.rb +1 -1
  90. data/spec/unit/knife/osc_user_edit_spec.rb +1 -1
  91. data/spec/unit/knife/osc_user_list_spec.rb +1 -1
  92. data/spec/unit/knife/osc_user_reregister_spec.rb +1 -1
  93. data/spec/unit/knife/osc_user_show_spec.rb +1 -1
  94. data/spec/unit/knife/user_create_spec.rb +1 -1
  95. data/spec/unit/knife/user_delete_spec.rb +2 -2
  96. data/spec/unit/knife/user_edit_spec.rb +2 -2
  97. data/spec/unit/knife/user_list_spec.rb +1 -1
  98. data/spec/unit/knife/user_reregister_spec.rb +1 -1
  99. data/spec/unit/knife/user_show_spec.rb +2 -2
  100. data/spec/unit/lwrp_spec.rb +146 -134
  101. data/spec/unit/node_map_spec.rb +12 -0
  102. data/spec/unit/platform_spec.rb +1 -1
  103. data/spec/unit/provider/deploy_spec.rb +1 -1
  104. data/spec/unit/provider/dsc_resource_spec.rb +3 -3
  105. data/spec/unit/provider/dsc_script_spec.rb +2 -2
  106. data/spec/unit/provider_resolver_spec.rb +170 -135
  107. data/spec/unit/recipe_spec.rb +3 -3
  108. data/spec/unit/resource/breakpoint_spec.rb +1 -1
  109. data/spec/unit/resource/cron_spec.rb +1 -1
  110. data/spec/unit/resource/directory_spec.rb +1 -1
  111. data/spec/unit/resource/dsc_resource_spec.rb +1 -1
  112. data/spec/unit/resource/dsc_script_spec.rb +2 -2
  113. data/spec/unit/resource/env_spec.rb +1 -1
  114. data/spec/unit/resource/erl_call_spec.rb +1 -1
  115. data/spec/unit/resource/file_spec.rb +1 -1
  116. data/spec/unit/resource/group_spec.rb +1 -1
  117. data/spec/unit/resource/link_spec.rb +1 -1
  118. data/spec/unit/resource/mdadm_spec.rb +1 -1
  119. data/spec/unit/resource/mount_spec.rb +1 -1
  120. data/spec/unit/resource/ohai_spec.rb +1 -1
  121. data/spec/unit/resource/registry_key_spec.rb +1 -1
  122. data/spec/unit/resource/route_spec.rb +1 -1
  123. data/spec/unit/resource/ruby_block_spec.rb +3 -3
  124. data/spec/unit/resource/user_spec.rb +1 -1
  125. data/spec/unit/resource/windows_service_spec.rb +1 -1
  126. data/spec/unit/resource_resolver_spec.rb +8 -4
  127. data/spec/unit/resource_spec.rb +89 -3
  128. data/spec/unit/run_list/versioned_recipe_list_spec.rb +115 -48
  129. data/spec/unit/user_spec.rb +97 -405
  130. data/spec/unit/user_v1_spec.rb +584 -0
  131. metadata +11 -6
  132. data/lib/chef/osc_user.rb +0 -194
  133. data/spec/unit/osc_user_spec.rb +0 -276
@@ -16,6 +16,11 @@
16
16
  # limitations under the License.
17
17
  #
18
18
 
19
+ # DEPRECATION NOTE
20
+ # This code only remains to support users still operating with
21
+ # Open Source Chef Server 11 and should be removed once support
22
+ # for OSC 11 ends. New development should occur in user_spec.rb.
23
+
19
24
  require 'spec_helper'
20
25
 
21
26
  require 'chef/user'
@@ -26,141 +31,98 @@ describe Chef::User do
26
31
  @user = Chef::User.new
27
32
  end
28
33
 
29
- shared_examples_for "string fields with no contraints" do
30
- it "should let you set the public key" do
31
- expect(@user.send(method, "some_string")).to eq("some_string")
32
- end
33
-
34
- it "should return the current public key" do
35
- @user.send(method, "some_string")
36
- expect(@user.send(method)).to eq("some_string")
37
- end
38
-
39
- it "should throw an ArgumentError if you feed it something lame" do
40
- expect { @user.send(method, Hash.new) }.to raise_error(ArgumentError)
41
- end
42
- end
43
-
44
- shared_examples_for "boolean fields with no constraints" do
45
- it "should let you set the field" do
46
- expect(@user.send(method, true)).to eq(true)
47
- end
48
-
49
- it "should return the current field value" do
50
- @user.send(method, true)
51
- expect(@user.send(method)).to eq(true)
52
- end
53
-
54
- it "should return the false value when false" do
55
- @user.send(method, false)
56
- expect(@user.send(method)).to eq(false)
57
- end
58
-
59
- it "should throw an ArgumentError if you feed it anything but true or false" do
60
- expect { @user.send(method, Hash.new) }.to raise_error(ArgumentError)
61
- end
62
- end
63
-
64
34
  describe "initialize" do
65
35
  it "should be a Chef::User" do
66
36
  expect(@user).to be_a_kind_of(Chef::User)
67
37
  end
68
38
  end
69
39
 
70
- describe "username" do
71
- it "should let you set the username to a string" do
72
- expect(@user.username("ops_master")).to eq("ops_master")
40
+ describe "name" do
41
+ it "should let you set the name to a string" do
42
+ expect(@user.name("ops_master")).to eq("ops_master")
73
43
  end
74
44
 
75
- it "should return the current username" do
76
- @user.username "ops_master"
77
- expect(@user.username).to eq("ops_master")
45
+ it "should return the current name" do
46
+ @user.name "ops_master"
47
+ expect(@user.name).to eq("ops_master")
78
48
  end
79
49
 
80
50
  # It is not feasible to check all invalid characters. Here are a few
81
51
  # that we probably care about.
82
52
  it "should not accept invalid characters" do
83
53
  # capital letters
84
- expect { @user.username "Bar" }.to raise_error(ArgumentError)
54
+ expect { @user.name "Bar" }.to raise_error(ArgumentError)
85
55
  # slashes
86
- expect { @user.username "foo/bar" }.to raise_error(ArgumentError)
56
+ expect { @user.name "foo/bar" }.to raise_error(ArgumentError)
87
57
  # ?
88
- expect { @user.username "foo?" }.to raise_error(ArgumentError)
58
+ expect { @user.name "foo?" }.to raise_error(ArgumentError)
89
59
  # &
90
- expect { @user.username "foo&" }.to raise_error(ArgumentError)
60
+ expect { @user.name "foo&" }.to raise_error(ArgumentError)
91
61
  end
92
62
 
93
63
 
94
64
  it "should not accept spaces" do
95
- expect { @user.username "ops master" }.to raise_error(ArgumentError)
65
+ expect { @user.name "ops master" }.to raise_error(ArgumentError)
96
66
  end
97
67
 
98
68
  it "should throw an ArgumentError if you feed it anything but a string" do
99
- expect { @user.username Hash.new }.to raise_error(ArgumentError)
69
+ expect { @user.name Hash.new }.to raise_error(ArgumentError)
100
70
  end
101
71
  end
102
72
 
103
- describe "boolean fields" do
104
- describe "create_key" do
105
- it_should_behave_like "boolean fields with no constraints" do
106
- let(:method) { :create_key }
107
- end
73
+ describe "admin" do
74
+ it "should let you set the admin bit" do
75
+ expect(@user.admin(true)).to eq(true)
108
76
  end
109
- end
110
77
 
111
- describe "string fields" do
112
- describe "public_key" do
113
- it_should_behave_like "string fields with no contraints" do
114
- let(:method) { :public_key }
115
- end
78
+ it "should return the current admin value" do
79
+ @user.admin true
80
+ expect(@user.admin).to eq(true)
116
81
  end
117
82
 
118
- describe "private_key" do
119
- it_should_behave_like "string fields with no contraints" do
120
- let(:method) { :private_key }
121
- end
83
+ it "should default to false" do
84
+ expect(@user.admin).to eq(false)
122
85
  end
123
86
 
124
- describe "display_name" do
125
- it_should_behave_like "string fields with no contraints" do
126
- let(:method) { :display_name }
127
- end
87
+ it "should throw an ArgumentError if you feed it anything but true or false" do
88
+ expect { @user.name Hash.new }.to raise_error(ArgumentError)
128
89
  end
90
+ end
129
91
 
130
- describe "first_name" do
131
- it_should_behave_like "string fields with no contraints" do
132
- let(:method) { :first_name }
133
- end
92
+ describe "public_key" do
93
+ it "should let you set the public key" do
94
+ expect(@user.public_key("super public")).to eq("super public")
134
95
  end
135
96
 
136
- describe "middle_name" do
137
- it_should_behave_like "string fields with no contraints" do
138
- let(:method) { :middle_name }
139
- end
97
+ it "should return the current public key" do
98
+ @user.public_key("super public")
99
+ expect(@user.public_key).to eq("super public")
140
100
  end
141
101
 
142
- describe "last_name" do
143
- it_should_behave_like "string fields with no contraints" do
144
- let(:method) { :last_name }
145
- end
102
+ it "should throw an ArgumentError if you feed it something lame" do
103
+ expect { @user.public_key Hash.new }.to raise_error(ArgumentError)
146
104
  end
105
+ end
147
106
 
148
- describe "email" do
149
- it_should_behave_like "string fields with no contraints" do
150
- let(:method) { :email }
151
- end
107
+ describe "private_key" do
108
+ it "should let you set the private key" do
109
+ expect(@user.private_key("super private")).to eq("super private")
152
110
  end
153
111
 
154
- describe "password" do
155
- it_should_behave_like "string fields with no contraints" do
156
- let(:method) { :password }
157
- end
112
+ it "should return the private key" do
113
+ @user.private_key("super private")
114
+ expect(@user.private_key).to eq("super private")
115
+ end
116
+
117
+ it "should throw an ArgumentError if you feed it something lame" do
118
+ expect { @user.private_key Hash.new }.to raise_error(ArgumentError)
158
119
  end
159
120
  end
160
121
 
161
122
  describe "when serializing to JSON" do
162
123
  before(:each) do
163
- @user.username("black")
124
+ @user.name("black")
125
+ @user.public_key("crowes")
164
126
  @json = @user.to_json
165
127
  end
166
128
 
@@ -168,62 +130,16 @@ describe Chef::User do
168
130
  expect(@json).to match(/^\{.+\}$/)
169
131
  end
170
132
 
171
- it "includes the username value" do
172
- expect(@json).to include(%q{"username":"black"})
173
- end
174
-
175
- it "includes the display name when present" do
176
- @user.display_name("get_displayed")
177
- expect(@user.to_json).to include(%{"display_name":"get_displayed"})
178
- end
179
-
180
- it "does not include the display name if not present" do
181
- expect(@json).not_to include("display_name")
182
- end
183
-
184
- it "includes the first name when present" do
185
- @user.first_name("char")
186
- expect(@user.to_json).to include(%{"first_name":"char"})
187
- end
188
-
189
- it "does not include the first name if not present" do
190
- expect(@json).not_to include("first_name")
191
- end
192
-
193
- it "includes the middle name when present" do
194
- @user.middle_name("man")
195
- expect(@user.to_json).to include(%{"middle_name":"man"})
196
- end
197
-
198
- it "does not include the middle name if not present" do
199
- expect(@json).not_to include("middle_name")
200
- end
201
-
202
- it "includes the last name when present" do
203
- @user.last_name("der")
204
- expect(@user.to_json).to include(%{"last_name":"der"})
205
- end
206
-
207
- it "does not include the last name if not present" do
208
- expect(@json).not_to include("last_name")
209
- end
210
-
211
- it "includes the email when present" do
212
- @user.email("charmander@pokemon.poke")
213
- expect(@user.to_json).to include(%{"email":"charmander@pokemon.poke"})
214
- end
215
-
216
- it "does not include the email if not present" do
217
- expect(@json).not_to include("email")
133
+ it "includes the name value" do
134
+ expect(@json).to include(%q{"name":"black"})
218
135
  end
219
136
 
220
- it "includes the public key when present" do
221
- @user.public_key("crowes")
222
- expect(@user.to_json).to include(%{"public_key":"crowes"})
137
+ it "includes the public key value" do
138
+ expect(@json).to include(%{"public_key":"crowes"})
223
139
  end
224
140
 
225
- it "does not include the public key if not present" do
226
- expect(@json).not_to include("public_key")
141
+ it "includes the 'admin' flag" do
142
+ expect(@json).to include(%q{"admin":false})
227
143
  end
228
144
 
229
145
  it "includes the private key when present" do
@@ -251,18 +167,11 @@ describe Chef::User do
251
167
 
252
168
  describe "when deserializing from JSON" do
253
169
  before(:each) do
254
- user = {
255
- "username" => "mr_spinks",
256
- "display_name" => "displayed",
257
- "first_name" => "char",
258
- "middle_name" => "man",
259
- "last_name" => "der",
260
- "email" => "charmander@pokemon.poke",
261
- "password" => "password",
170
+ user = { "name" => "mr_spinks",
262
171
  "public_key" => "turtles",
263
172
  "private_key" => "pandas",
264
- "create_key" => false
265
- }
173
+ "password" => "password",
174
+ "admin" => true }
266
175
  @user = Chef::User.from_json(Chef::JSONCompat.to_json(user))
267
176
  end
268
177
 
@@ -270,277 +179,34 @@ describe Chef::User do
270
179
  expect(@user).to be_a_kind_of(Chef::User)
271
180
  end
272
181
 
273
- it "preserves the username" do
274
- expect(@user.username).to eq("mr_spinks")
275
- end
276
-
277
- it "preserves the display name if present" do
278
- expect(@user.display_name).to eq("displayed")
182
+ it "preserves the name" do
183
+ expect(@user.name).to eq("mr_spinks")
279
184
  end
280
185
 
281
- it "preserves the first name if present" do
282
- expect(@user.first_name).to eq("char")
283
- end
284
-
285
- it "preserves the middle name if present" do
286
- expect(@user.middle_name).to eq("man")
186
+ it "preserves the public key" do
187
+ expect(@user.public_key).to eq("turtles")
287
188
  end
288
189
 
289
- it "preserves the last name if present" do
290
- expect(@user.last_name).to eq("der")
190
+ it "preserves the admin status" do
191
+ expect(@user.admin).to be_truthy
291
192
  end
292
193
 
293
- it "preserves the email if present" do
294
- expect(@user.email).to eq("charmander@pokemon.poke")
194
+ it "includes the private key if present" do
195
+ expect(@user.private_key).to eq("pandas")
295
196
  end
296
197
 
297
198
  it "includes the password if present" do
298
199
  expect(@user.password).to eq("password")
299
200
  end
300
201
 
301
- it "preserves the public key if present" do
302
- expect(@user.public_key).to eq("turtles")
303
- end
304
-
305
- it "includes the private key if present" do
306
- expect(@user.private_key).to eq("pandas")
307
- end
308
-
309
- it "includes the create key status if not nil" do
310
- expect(@user.create_key).to be_falsey
311
- end
312
202
  end
313
203
 
314
- describe "Versioned API Interactions" do
315
- let(:response_406) { OpenStruct.new(:code => '406') }
316
- let(:exception_406) { Net::HTTPServerException.new("406 Not Acceptable", response_406) }
317
-
318
- before (:each) do
319
- @user = Chef::User.new
320
- allow(@user).to receive(:chef_root_rest_v0).and_return(double('chef rest root v0 object'))
321
- allow(@user).to receive(:chef_root_rest_v1).and_return(double('chef rest root v1 object'))
322
- end
323
-
324
- describe "update" do
325
- before do
326
- # populate all fields that are valid between V0 and V1
327
- @user.username "some_username"
328
- @user.display_name "some_display_name"
329
- @user.first_name "some_first_name"
330
- @user.middle_name "some_middle_name"
331
- @user.last_name "some_last_name"
332
- @user.email "some_email"
333
- @user.password "some_password"
334
- end
335
-
336
- let(:payload) {
337
- {
338
- :username => "some_username",
339
- :display_name => "some_display_name",
340
- :first_name => "some_first_name",
341
- :middle_name => "some_middle_name",
342
- :last_name => "some_last_name",
343
- :email => "some_email",
344
- :password => "some_password"
345
- }
346
- }
347
-
348
- context "when server API V1 is valid on the Chef Server receiving the request" do
349
- context "when the user submits valid data" do
350
- it "properly updates the user" do
351
- expect(@user.chef_root_rest_v1).to receive(:put).with("users/some_username", payload).and_return({})
352
- @user.update
353
- end
354
- end
355
- end
356
-
357
- context "when server API V1 is not valid on the Chef Server receiving the request" do
358
- let(:payload) {
359
- {
360
- :username => "some_username",
361
- :display_name => "some_display_name",
362
- :first_name => "some_first_name",
363
- :middle_name => "some_middle_name",
364
- :last_name => "some_last_name",
365
- :email => "some_email",
366
- :password => "some_password",
367
- :public_key => "some_public_key"
368
- }
369
- }
370
-
371
- before do
372
- @user.public_key "some_public_key"
373
- allow(@user.chef_root_rest_v1).to receive(:put)
374
- end
375
-
376
- context "when the server returns a 400" do
377
- let(:response_400) { OpenStruct.new(:code => '400') }
378
- let(:exception_400) { Net::HTTPServerException.new("400 Bad Request", response_400) }
379
-
380
- context "when the 400 was due to public / private key fields no longer being supported" do
381
- let(:response_body_400) { '{"error":["Since Server API v1, all keys must be updated via the keys endpoint. "]}' }
382
-
383
- before do
384
- allow(response_400).to receive(:body).and_return(response_body_400)
385
- allow(@user.chef_root_rest_v1).to receive(:put).and_raise(exception_400)
386
- end
387
-
388
- it "proceeds with the V0 PUT since it can handle public / private key fields" do
389
- expect(@user.chef_root_rest_v0).to receive(:put).with("users/some_username", payload).and_return({})
390
- @user.update
391
- end
392
-
393
- it "does not call server_client_api_version_intersection, since we know to proceed with V0 in this case" do
394
- expect(@user).to_not receive(:server_client_api_version_intersection)
395
- allow(@user.chef_root_rest_v0).to receive(:put).and_return({})
396
- @user.update
397
- end
398
- end # when the 400 was due to public / private key fields
399
-
400
- context "when the 400 was NOT due to public / private key fields no longer being supported" do
401
- let(:response_body_400) { '{"error":["Some other error. "]}' }
402
-
403
- before do
404
- allow(response_400).to receive(:body).and_return(response_body_400)
405
- allow(@user.chef_root_rest_v1).to receive(:put).and_raise(exception_400)
406
- end
407
-
408
- it "will not proceed with the V0 PUT since the original bad request was not key related" do
409
- expect(@user.chef_root_rest_v0).to_not receive(:put).with("users/some_username", payload)
410
- expect { @user.update }.to raise_error(exception_400)
411
- end
412
-
413
- it "raises the original error" do
414
- expect { @user.update }.to raise_error(exception_400)
415
- end
416
-
417
- end
418
- end # when the server returns a 400
419
-
420
- context "when the server returns a 406" do
421
- # from spec/support/shared/unit/api_versioning.rb
422
- it_should_behave_like "version handling" do
423
- let(:object) { @user }
424
- let(:method) { :update }
425
- let(:http_verb) { :put }
426
- let(:rest_v1) { @user.chef_root_rest_v1 }
427
- end
428
-
429
- context "when the server supports API V0" do
430
- before do
431
- allow(@user).to receive(:server_client_api_version_intersection).and_return([0])
432
- allow(@user.chef_root_rest_v1).to receive(:put).and_raise(exception_406)
433
- end
434
-
435
- it "properly updates the user" do
436
- expect(@user.chef_root_rest_v0).to receive(:put).with("users/some_username", payload).and_return({})
437
- @user.update
438
- end
439
- end # when the server supports API V0
440
- end # when the server returns a 406
441
-
442
- end # when server API V1 is not valid on the Chef Server receiving the request
443
- end # update
444
-
445
- describe "create" do
446
- let(:payload) {
447
- {
448
- :username => "some_username",
449
- :display_name => "some_display_name",
450
- :first_name => "some_first_name",
451
- :last_name => "some_last_name",
452
- :email => "some_email",
453
- :password => "some_password"
454
- }
455
- }
456
- before do
457
- @user.username "some_username"
458
- @user.display_name "some_display_name"
459
- @user.first_name "some_first_name"
460
- @user.last_name "some_last_name"
461
- @user.email "some_email"
462
- @user.password "some_password"
463
- end
464
-
465
- # from spec/support/shared/unit/user_and_client_shared.rb
466
- it_should_behave_like "user or client create" do
467
- let(:object) { @user }
468
- let(:error) { Chef::Exceptions::InvalidUserAttribute }
469
- let(:rest_v0) { @user.chef_root_rest_v0 }
470
- let(:rest_v1) { @user.chef_root_rest_v1 }
471
- let(:url) { "users" }
472
- end
473
-
474
- context "when handling API V1" do
475
- it "creates a new user via the API with a middle_name when it exists" do
476
- @user.middle_name "some_middle_name"
477
- expect(@user.chef_root_rest_v1).to receive(:post).with("users", payload.merge({:middle_name => "some_middle_name"})).and_return({})
478
- @user.create
479
- end
480
- end # when server API V1 is valid on the Chef Server receiving the request
481
-
482
- context "when API V1 is not supported by the server" do
483
- # from spec/support/shared/unit/api_versioning.rb
484
- it_should_behave_like "version handling" do
485
- let(:object) { @user }
486
- let(:method) { :create }
487
- let(:http_verb) { :post }
488
- let(:rest_v1) { @user.chef_root_rest_v1 }
489
- end
490
- end
491
-
492
- context "when handling API V0" do
493
- before do
494
- allow(@user).to receive(:server_client_api_version_intersection).and_return([0])
495
- allow(@user.chef_root_rest_v1).to receive(:post).and_raise(exception_406)
496
- end
497
-
498
- it "creates a new user via the API with a middle_name when it exists" do
499
- @user.middle_name "some_middle_name"
500
- expect(@user.chef_root_rest_v0).to receive(:post).with("users", payload.merge({:middle_name => "some_middle_name"})).and_return({})
501
- @user.create
502
- end
503
- end # when server API V1 is not valid on the Chef Server receiving the request
504
-
505
- end # create
506
-
507
- # DEPRECATION
508
- # This can be removed after API V0 support is gone
509
- describe "reregister" do
510
- let(:payload) {
511
- {
512
- "username" => "some_username",
513
- }
514
- }
515
-
516
- before do
517
- @user.username "some_username"
518
- end
519
-
520
- context "when server API V0 is valid on the Chef Server receiving the request" do
521
- it "creates a new object via the API" do
522
- expect(@user.chef_root_rest_v0).to receive(:put).with("users/#{@user.username}", payload.merge({"private_key" => true})).and_return({})
523
- @user.reregister
524
- end
525
- end # when server API V0 is valid on the Chef Server receiving the request
526
-
527
- context "when server API V0 is not supported by the Chef Server" do
528
- # from spec/support/shared/unit/api_versioning.rb
529
- it_should_behave_like "user and client reregister" do
530
- let(:object) { @user }
531
- let(:rest_v0) { @user.chef_root_rest_v0 }
532
- end
533
- end # when server API V0 is not supported by the Chef Server
534
- end # reregister
535
-
536
- end # Versioned API Interactions
537
-
538
204
  describe "API Interactions" do
539
205
  before (:each) do
540
206
  @user = Chef::User.new
541
- @user.username "foobar"
542
- @http_client = double("Chef::REST mock")
543
- allow(Chef::REST).to receive(:new).and_return(@http_client)
207
+ @user.name "foobar"
208
+ @http_client = double("Chef::ServerAPI mock")
209
+ allow(Chef::ServerAPI).to receive(:new).and_return(@http_client)
544
210
  end
545
211
 
546
212
  describe "list" do
@@ -552,6 +218,16 @@ describe Chef::User do
552
218
  @osc_inflated_response = { "admin" => @user }
553
219
  end
554
220
 
221
+ it "lists all clients on an OSC server" do
222
+ allow(@http_client).to receive(:get).with("users").and_return(@osc_response)
223
+ expect(Chef::User.list).to eq(@osc_response)
224
+ end
225
+
226
+ it "inflate all clients on an OSC server" do
227
+ allow(@http_client).to receive(:get).with("users").and_return(@osc_response)
228
+ expect(Chef::User.list(true)).to eq(@osc_inflated_response)
229
+ end
230
+
555
231
  it "lists all clients on an OHC/OPC server" do
556
232
  allow(@http_client).to receive(:get).with("users").and_return(@ohc_response)
557
233
  # We expect that Chef::User.list will give a consistent response
@@ -565,15 +241,31 @@ describe Chef::User do
565
241
  end
566
242
  end
567
243
 
244
+ describe "create" do
245
+ it "creates a new user via the API" do
246
+ @user.password "password"
247
+ expect(@http_client).to receive(:post).with("users", {:name => "foobar", :admin => false, :password => "password"}).and_return({})
248
+ @user.create
249
+ end
250
+ end
251
+
568
252
  describe "read" do
569
253
  it "loads a named user from the API" do
570
- expect(@http_client).to receive(:get).with("users/foobar").and_return({"username" => "foobar", "admin" => true, "public_key" => "pubkey"})
254
+ expect(@http_client).to receive(:get).with("users/foobar").and_return({"name" => "foobar", "admin" => true, "public_key" => "pubkey"})
571
255
  user = Chef::User.load("foobar")
572
- expect(user.username).to eq("foobar")
256
+ expect(user.name).to eq("foobar")
257
+ expect(user.admin).to eq(true)
573
258
  expect(user.public_key).to eq("pubkey")
574
259
  end
575
260
  end
576
261
 
262
+ describe "update" do
263
+ it "updates an existing user on via the API" do
264
+ expect(@http_client).to receive(:put).with("users/foobar", {:name => "foobar", :admin => false}).and_return({})
265
+ @user.update
266
+ end
267
+ end
268
+
577
269
  describe "destroy" do
578
270
  it "deletes the specified user via the API" do
579
271
  expect(@http_client).to receive(:delete).with("users/foobar")