chef 12.17.44 → 12.18.31

Sign up to get free protection for your applications and to get access to all the features.
Files changed (178) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +0 -1
  3. data/README.md +3 -2
  4. data/Rakefile +9 -0
  5. data/VERSION +1 -1
  6. data/acceptance/Gemfile.lock +17 -17
  7. data/distro/common/html/knife_environment.html +4 -8
  8. data/distro/common/man/man1/knife-environment.1 +4 -16
  9. data/distro/powershell/chef/chef.psm1 +139 -24
  10. data/lib/chef/application.rb +5 -4
  11. data/lib/chef/application/windows_service_manager.rb +6 -4
  12. data/lib/chef/chef_fs/chef_fs_data_store.rb +1 -1
  13. data/lib/chef/chef_fs/command_line.rb +1 -1
  14. data/lib/chef/chef_fs/file_system/chef_server/rest_list_entry.rb +8 -1
  15. data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_root_dir.rb +1 -1
  16. data/lib/chef/chef_fs/file_system/repository/nodes_dir.rb +1 -1
  17. data/lib/chef/cookbook/chefignore.rb +1 -1
  18. data/lib/chef/cookbook/cookbook_version_loader.rb +4 -4
  19. data/lib/chef/cookbook/metadata.rb +2 -2
  20. data/lib/chef/cookbook_loader.rb +1 -1
  21. data/lib/chef/data_collector.rb +24 -13
  22. data/lib/chef/data_collector/messages.rb +8 -6
  23. data/lib/chef/data_collector/messages/helpers.rb +1 -1
  24. data/lib/chef/deprecated.rb +30 -0
  25. data/lib/chef/dsl/platform_introspection.rb +2 -2
  26. data/lib/chef/encrypted_data_bag_item.rb +1 -1
  27. data/lib/chef/encrypted_data_bag_item/decryptor.rb +2 -2
  28. data/lib/chef/environment.rb +1 -1
  29. data/lib/chef/exceptions.rb +5 -5
  30. data/lib/chef/file_access_control/unix.rb +5 -5
  31. data/lib/chef/formatters/error_description.rb +1 -1
  32. data/lib/chef/http/basic_client.rb +1 -1
  33. data/lib/chef/http/json_input.rb +2 -2
  34. data/lib/chef/knife.rb +1 -1
  35. data/lib/chef/knife/cookbook_site_install.rb +1 -1
  36. data/lib/chef/knife/core/cookbook_scm_repo.rb +1 -1
  37. data/lib/chef/knife/core/ui.rb +1 -1
  38. data/lib/chef/mixin/command.rb +1 -0
  39. data/lib/chef/mixin/deep_merge.rb +1 -1
  40. data/lib/chef/mixin/shell_out.rb +58 -3
  41. data/lib/chef/mixin/which.rb +5 -9
  42. data/lib/chef/mixin/wide_string.rb +1 -1
  43. data/lib/chef/node.rb +1 -1
  44. data/lib/chef/node/attribute.rb +4 -5
  45. data/lib/chef/node_map.rb +18 -2
  46. data/lib/chef/platform/provider_handler_map.rb +2 -2
  47. data/lib/chef/platform/provider_mapping.rb +5 -0
  48. data/lib/chef/platform/resource_handler_map.rb +2 -2
  49. data/lib/chef/provider/env/windows.rb +1 -1
  50. data/lib/chef/provider/git.rb +1 -1
  51. data/lib/chef/provider/group.rb +41 -46
  52. data/lib/chef/provider/group/aix.rb +12 -19
  53. data/lib/chef/provider/group/dscl.rb +46 -43
  54. data/lib/chef/provider/group/gpasswd.rb +7 -7
  55. data/lib/chef/provider/group/groupadd.rb +29 -34
  56. data/lib/chef/provider/group/groupmod.rb +26 -31
  57. data/lib/chef/provider/group/pw.rb +28 -31
  58. data/lib/chef/provider/group/suse.rb +9 -9
  59. data/lib/chef/provider/group/usermod.rb +10 -11
  60. data/lib/chef/provider/group/windows.rb +18 -20
  61. data/lib/chef/provider/ifconfig.rb +52 -63
  62. data/lib/chef/provider/ifconfig/aix.rb +23 -28
  63. data/lib/chef/provider/ifconfig/debian.rb +23 -22
  64. data/lib/chef/provider/ifconfig/redhat.rb +12 -12
  65. data/lib/chef/provider/mount/mount.rb +1 -1
  66. data/lib/chef/provider/osx_profile.rb +4 -2
  67. data/lib/chef/provider/package.rb +16 -7
  68. data/lib/chef/provider/package/chocolatey.rb +3 -1
  69. data/lib/chef/provider/package/dnf.rb +183 -0
  70. data/lib/chef/provider/package/dnf/dnf_helper.py +91 -0
  71. data/lib/chef/provider/package/dnf/python_helper.rb +120 -0
  72. data/lib/chef/provider/package/dnf/version.rb +56 -0
  73. data/lib/chef/provider/package/easy_install.rb +1 -1
  74. data/lib/chef/provider/package/freebsd/base.rb +1 -1
  75. data/lib/chef/provider/package/freebsd/pkgng.rb +1 -1
  76. data/lib/chef/provider/package/powershell.rb +3 -3
  77. data/lib/chef/provider/package/windows.rb +1 -1
  78. data/lib/chef/provider/package/zypper.rb +1 -1
  79. data/lib/chef/provider/route.rb +186 -184
  80. data/lib/chef/provider/service/arch.rb +2 -2
  81. data/lib/chef/provider/service/freebsd.rb +1 -1
  82. data/lib/chef/provider/service/gentoo.rb +2 -2
  83. data/lib/chef/provider/service/insserv.rb +2 -2
  84. data/lib/chef/provider/service/macosx.rb +2 -2
  85. data/lib/chef/provider/service/openbsd.rb +1 -1
  86. data/lib/chef/provider/service/redhat.rb +2 -2
  87. data/lib/chef/provider/support/yum_repo.erb +10 -3
  88. data/lib/chef/provider/user.rb +17 -20
  89. data/lib/chef/provider/user/aix.rb +23 -24
  90. data/lib/chef/provider/user/dscl.rb +56 -53
  91. data/lib/chef/provider/user/linux.rb +13 -16
  92. data/lib/chef/provider/user/pw.rb +26 -30
  93. data/lib/chef/provider/user/solaris.rb +11 -12
  94. data/lib/chef/provider/user/useradd.rb +20 -22
  95. data/lib/chef/provider/user/windows.rb +19 -22
  96. data/lib/chef/provider_resolver.rb +4 -2
  97. data/lib/chef/providers.rb +1 -0
  98. data/lib/chef/resource.rb +7 -0
  99. data/lib/chef/resource/chocolatey_package.rb +1 -0
  100. data/lib/chef/resource/dnf_package.rb +64 -0
  101. data/lib/chef/resource/file/verification.rb +6 -4
  102. data/lib/chef/resource/yum_package.rb +18 -14
  103. data/lib/chef/resource/yum_repository.rb +1 -1
  104. data/lib/chef/resource_reporter.rb +11 -0
  105. data/lib/chef/resources.rb +1 -0
  106. data/lib/chef/scan_access_control.rb +4 -4
  107. data/lib/chef/util/dsc/resource_store.rb +1 -1
  108. data/lib/chef/version.rb +1 -1
  109. data/lib/chef/win32/memory.rb +1 -1
  110. data/lib/chef/win32/security.rb +2 -2
  111. data/lib/chef/win32/security/sid.rb +2 -2
  112. data/spec/functional/assets/yumrepo/chef_rpm-1.10-1.fc24.i686.rpm +0 -0
  113. data/spec/functional/assets/yumrepo/chef_rpm-1.10-1.fc24.src.rpm +0 -0
  114. data/spec/functional/assets/yumrepo/chef_rpm-1.10-1.fc24.x86_64.rpm +0 -0
  115. data/spec/functional/assets/yumrepo/chef_rpm-1.2-1.fc24.i686.rpm +0 -0
  116. data/spec/functional/assets/yumrepo/chef_rpm-1.2-1.fc24.src.rpm +0 -0
  117. data/spec/functional/assets/yumrepo/chef_rpm-1.2-1.fc24.x86_64.rpm +0 -0
  118. data/spec/functional/assets/yumrepo/repodata/313329137b55fd333b2dc66394a6661a2befa6cc535d8460d92a4a78a9c581f0-primary.sqlite.bz2 +0 -0
  119. data/spec/functional/assets/yumrepo/repodata/31ac4db5d5ac593728fcc26aef82b7b93c4cc4dbec843786b1845b939b658553-other.xml.gz +0 -0
  120. data/spec/functional/assets/yumrepo/repodata/4ac40fa3c6728c1401318e2e20a997436624e83dcf7a5f952b851ef422637773-filelists.sqlite.bz2 +0 -0
  121. data/spec/functional/assets/yumrepo/repodata/66391e53f0510b98b3f0b79f40ba1048026d9a1ef20905d9c40ba6f5411f3243-primary.xml.gz +0 -0
  122. data/spec/functional/assets/yumrepo/repodata/8b34697595fcc87928e12d24644dda9462c3857bd932861e28bc77ae1f31be16-filelists.xml.gz +0 -0
  123. data/spec/functional/assets/yumrepo/repodata/b97cca3fe14bcf06c52be4449b6108f7731239ff221111dcce8aada5467f60dc-other.sqlite.bz2 +0 -0
  124. data/spec/functional/assets/yumrepo/repodata/repomd.xml +55 -0
  125. data/spec/functional/resource/dnf_package_spec.rb +686 -0
  126. data/spec/functional/resource/dsc_script_spec.rb +1 -0
  127. data/spec/functional/resource/user/useradd_spec.rb +10 -1
  128. data/spec/integration/knife/chef_repo_path_spec.rb +2 -2
  129. data/spec/integration/recipes/recipe_dsl_spec.rb +3 -0
  130. data/spec/integration/recipes/resource_load_spec.rb +3 -3
  131. data/spec/spec_helper.rb +5 -3
  132. data/spec/support/lib/chef/provider/snakeoil.rb +1 -0
  133. data/spec/support/lib/chef/resource/cat.rb +1 -0
  134. data/spec/support/lib/chef/resource/one_two_three_four.rb +1 -0
  135. data/spec/support/lib/chef/resource/openldap_includer.rb +2 -0
  136. data/spec/support/lib/chef/resource/with_state.rb +2 -0
  137. data/spec/support/lib/chef/resource/zen_master.rb +1 -0
  138. data/spec/unit/cookbook/metadata_spec.rb +3 -3
  139. data/spec/unit/data_collector/messages/helpers_spec.rb +7 -0
  140. data/spec/unit/data_collector_spec.rb +56 -0
  141. data/spec/unit/decorator/lazy_spec.rb +1 -1
  142. data/spec/unit/environment_spec.rb +1 -1
  143. data/spec/unit/lwrp_spec.rb +3 -4
  144. data/spec/unit/node_spec.rb +23 -2
  145. data/spec/unit/platform_spec.rb +1 -0
  146. data/spec/unit/provider/group/dscl_spec.rb +29 -29
  147. data/spec/unit/provider/group/gpasswd_spec.rb +10 -10
  148. data/spec/unit/provider/group/groupadd_spec.rb +31 -30
  149. data/spec/unit/provider/group/groupmod_spec.rb +16 -16
  150. data/spec/unit/provider/group/pw_spec.rb +11 -11
  151. data/spec/unit/provider/group/suse_spec.rb +5 -5
  152. data/spec/unit/provider/group/usermod_spec.rb +15 -15
  153. data/spec/unit/provider/ifconfig/aix_spec.rb +14 -14
  154. data/spec/unit/provider/ifconfig/debian_spec.rb +10 -22
  155. data/spec/unit/provider/ifconfig/redhat_spec.rb +4 -4
  156. data/spec/unit/provider/ifconfig_spec.rb +18 -19
  157. data/spec/unit/provider/package/chocolatey_spec.rb +21 -21
  158. data/spec/unit/provider/package/msu_spec.rb +1 -1
  159. data/spec/unit/provider/route_spec.rb +21 -21
  160. data/spec/unit/provider/user/dscl_spec.rb +54 -57
  161. data/spec/unit/provider/user/linux_spec.rb +5 -5
  162. data/spec/unit/provider/user/pw_spec.rb +26 -22
  163. data/spec/unit/provider/user/windows_spec.rb +4 -4
  164. data/spec/unit/provider/user_spec.rb +19 -21
  165. data/spec/unit/provider_resolver_spec.rb +1 -0
  166. data/spec/unit/resource/chocolatey_package_spec.rb +12 -0
  167. data/spec/unit/resource/dnf_package_spec.rb +99 -0
  168. data/spec/unit/resource/remote_file_spec.rb +2 -2
  169. data/spec/unit/resource/yum_package_spec.rb +20 -0
  170. data/spec/unit/resource_reporter_spec.rb +24 -0
  171. data/spec/unit/resource_spec.rb +2 -0
  172. data/spec/unit/runner_spec.rb +1 -0
  173. data/tasks/bin/bundle-platform +1 -1
  174. data/tasks/gemfile_util.rb +2 -2
  175. data/tasks/templates/prerelease.md.erb +1 -10
  176. data/tasks/templates/release.md.erb +1 -9
  177. metadata +24 -5
  178. data/lib/chef/platform/handler_map.rb +0 -40
@@ -148,7 +148,7 @@ The operation completed successfully.
148
148
  expect(source_resource.name).to be == "windows_test_pkg"
149
149
  expect(source_resource.source).to be == [new_resource.source]
150
150
  expect(source_resource.cookbook_name).to be == "Msu_package"
151
- expect(source_resource.checksum).to be == nil
151
+ expect(source_resource.checksum).to be nil
152
152
  end
153
153
  end
154
154
 
@@ -51,7 +51,7 @@ describe Chef::Provider::Route do
51
51
  context "on linux" do
52
52
  before do
53
53
  @node.automatic_attrs[:os] = "linux"
54
- routing_table = "Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT\n" +
54
+ routing_table = "Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT\n" \
55
55
  "eth0 0064A8C0 0984A8C0 0003 0 0 0 00FFFFFF 0 0 0\n"
56
56
  route_file = StringIO.new(routing_table)
57
57
  allow(File).to receive(:open).with("/proc/net/route", "r").and_return(route_file)
@@ -91,16 +91,16 @@ describe Chef::Provider::Route do
91
91
 
92
92
  describe Chef::Provider::Route, "action_add" do
93
93
  it "should add the route if it does not exist" do
94
- allow(@provider).to receive(:run_command).and_return(true)
94
+ allow(@provider).to receive(:shell_out!)
95
95
  allow(@current_resource).to receive(:gateway).and_return(nil)
96
- expect(@provider).to receive(:generate_command).once.with(:add)
96
+ expect(@provider).to receive(:generate_command).with(:add).and_return(["command"])
97
97
  expect(@provider).to receive(:generate_config)
98
98
  @provider.run_action(:add)
99
99
  expect(@new_resource).to be_updated
100
100
  end
101
101
 
102
102
  it "should not add the route if it exists" do
103
- allow(@provider).to receive(:run_command).and_return(true)
103
+ allow(@provider).to receive(:shell_out!)
104
104
  allow(@provider).to receive(:is_running).and_return(true)
105
105
  expect(@provider).not_to receive(:generate_command).with(:add)
106
106
  expect(@provider).to receive(:generate_config)
@@ -115,7 +115,7 @@ describe Chef::Provider::Route do
115
115
  expect(File).to receive(:new).and_return(route_file)
116
116
  @resource_add = Chef::Resource::Route.new("192.168.1.0/24 via 192.168.0.1")
117
117
  @run_context.resource_collection << @resource_add
118
- allow(@provider).to receive(:run_command).and_return(true)
118
+ allow(@provider).to receive(:shell_out!).and_return(true)
119
119
 
120
120
  @resource_add.action(:add)
121
121
  @provider.run_action(:add)
@@ -126,8 +126,8 @@ describe Chef::Provider::Route do
126
126
 
127
127
  describe Chef::Provider::Route, "action_delete" do
128
128
  it "should delete the route if it exists" do
129
- allow(@provider).to receive(:run_command).and_return(true)
130
- expect(@provider).to receive(:generate_command).once.with(:delete)
129
+ allow(@provider).to receive(:shell_out!).and_return(true)
130
+ expect(@provider).to receive(:generate_command).with(:delete).and_return(["command"])
131
131
  allow(@provider).to receive(:is_running).and_return(true)
132
132
  @provider.run_action(:delete)
133
133
  expect(@new_resource).to be_updated
@@ -135,7 +135,7 @@ describe Chef::Provider::Route do
135
135
 
136
136
  it "should not delete the route if it does not exist" do
137
137
  allow(@current_resource).to receive(:gateway).and_return(nil)
138
- allow(@provider).to receive(:run_command).and_return(true)
138
+ allow(@provider).to receive(:shell_out!).and_return(true)
139
139
  expect(@provider).not_to receive(:generate_command).with(:add)
140
140
  @provider.run_action(:delete)
141
141
  expect(@new_resource).not_to be_updated
@@ -145,61 +145,61 @@ describe Chef::Provider::Route do
145
145
  describe Chef::Provider::Route, "generate_command for action_add" do
146
146
  it "should include a netmask when a one is specified" do
147
147
  allow(@new_resource).to receive(:netmask).and_return("255.255.0.0")
148
- expect(@provider.generate_command(:add)).to match(/\/\d{1,2}\s/)
148
+ expect(@provider.generate_command(:add).join(" ")).to match(/\/\d{1,2}/)
149
149
  end
150
150
 
151
151
  it "should not include a netmask when a one is specified" do
152
152
  allow(@new_resource).to receive(:netmask).and_return(nil)
153
- expect(@provider.generate_command(:add)).not_to match(/\/\d{1,2}\s/)
153
+ expect(@provider.generate_command(:add).join(" ")).not_to match(/\/\d{1,2}/)
154
154
  end
155
155
 
156
156
  it "should include ' via $gateway ' when a gateway is specified" do
157
- expect(@provider.generate_command(:add)).to match(/\svia\s#{Regexp.escape(@new_resource.gateway.to_s)}\s/)
157
+ expect(@provider.generate_command(:add).join(" ")).to match(/\svia\s#{Regexp.escape(@new_resource.gateway.to_s)}/)
158
158
  end
159
159
 
160
160
  it "should not include ' via $gateway ' when a gateway is not specified" do
161
161
  allow(@new_resource).to receive(:gateway).and_return(nil)
162
- expect(@provider.generate_command(:add)).not_to match(/\svia\s#{Regexp.escape(@new_resource.gateway.to_s)}\s/)
162
+ expect(@provider.generate_command(:add).join(" ")).not_to match(/\svia\s#{Regexp.escape(@new_resource.gateway.to_s)}/)
163
163
  end
164
164
  end
165
165
 
166
166
  describe Chef::Provider::Route, "generate_command for action_delete" do
167
167
  it "should include a netmask when a one is specified" do
168
168
  allow(@new_resource).to receive(:netmask).and_return("255.255.0.0")
169
- expect(@provider.generate_command(:delete)).to match(/\/\d{1,2}\s/)
169
+ expect(@provider.generate_command(:delete).join(" ")).to match(/\/\d{1,2}/)
170
170
  end
171
171
 
172
172
  it "should not include a netmask when a one is specified" do
173
173
  allow(@new_resource).to receive(:netmask).and_return(nil)
174
- expect(@provider.generate_command(:delete)).not_to match(/\/\d{1,2}\s/)
174
+ expect(@provider.generate_command(:delete).join(" ")).not_to match(/\/\d{1,2}/)
175
175
  end
176
176
 
177
177
  it "should include ' via $gateway ' when a gateway is specified" do
178
- expect(@provider.generate_command(:delete)).to match(/\svia\s#{Regexp.escape(@new_resource.gateway.to_s)}\s/)
178
+ expect(@provider.generate_command(:delete).join(" ")).to match(/\svia\s#{Regexp.escape(@new_resource.gateway.to_s)}/)
179
179
  end
180
180
 
181
181
  it "should not include ' via $gateway ' when a gateway is not specified" do
182
182
  allow(@new_resource).to receive(:gateway).and_return(nil)
183
- expect(@provider.generate_command(:delete)).not_to match(/\svia\s#{Regexp.escape(@new_resource.gateway.to_s)}\s/)
183
+ expect(@provider.generate_command(:delete).join(" ")).not_to match(/\svia\s#{Regexp.escape(@new_resource.gateway.to_s)}/)
184
184
  end
185
185
  end
186
186
 
187
187
  describe Chef::Provider::Route, "config_file_contents for action_add" do
188
188
  it "should include a netmask when a one is specified" do
189
189
  allow(@new_resource).to receive(:netmask).and_return("255.255.0.0")
190
- expect(@provider.config_file_contents(:add, { :target => @new_resource.target, :netmask => @new_resource.netmask })).to match(/\/\d{1,2}.*\n$/)
190
+ expect(@provider.config_file_contents(:add, target: @new_resource.target, netmask: @new_resource.netmask)).to match(/\/\d{1,2}.*\n$/)
191
191
  end
192
192
 
193
193
  it "should not include a netmask when a one is specified" do
194
- expect(@provider.config_file_contents(:add, { :target => @new_resource.target })).not_to match(/\/\d{1,2}.*\n$/)
194
+ expect(@provider.config_file_contents(:add, target: @new_resource.target)).not_to match(/\/\d{1,2}.*\n$/)
195
195
  end
196
196
 
197
197
  it "should include ' via $gateway ' when a gateway is specified" do
198
- expect(@provider.config_file_contents(:add, { :target => @new_resource.target, :gateway => @new_resource.gateway })).to match(/\svia\s#{Regexp.escape(@new_resource.gateway.to_s)}\n/)
198
+ expect(@provider.config_file_contents(:add, target: @new_resource.target, gateway: @new_resource.gateway)).to match(/\svia\s#{Regexp.escape(@new_resource.gateway.to_s)}\n/)
199
199
  end
200
200
 
201
201
  it "should not include ' via $gateway ' when a gateway is not specified" do
202
- expect(@provider.generate_command(:add)).not_to match(/\svia\s#{Regexp.escape(@new_resource.gateway.to_s)}\n/)
202
+ expect(@provider.generate_command(:add).join(" ")).not_to match(/\svia\s#{Regexp.escape(@new_resource.gateway.to_s)}\n/)
203
203
  end
204
204
  end
205
205
 
@@ -216,7 +216,7 @@ describe Chef::Provider::Route do
216
216
 
217
217
  route_file = StringIO.new
218
218
  expect(File).to receive(:new).with("/etc/sysconfig/network-scripts/route-eth0", "w").and_return(route_file)
219
- #Chef::Log.should_receive(:debug).with("route[10.0.0.10] writing route.eth0\n10.0.0.10 via 10.0.0.9\n")
219
+ # Chef::Log.should_receive(:debug).with("route[10.0.0.10] writing route.eth0\n10.0.0.10 via 10.0.0.9\n")
220
220
  @run_context.resource_collection << @new_resource
221
221
  @provider.generate_config
222
222
  end
@@ -116,38 +116,38 @@ ea18e18b720e358e7fbe3cfbeaa561456f6ba008937a30"
116
116
  describe "when shelling out to dscl" do
117
117
  it "should run dscl with the supplied cmd /Path args" do
118
118
  shell_return = shellcmdresult.new("stdout", "err", 0)
119
- expect(provider).to receive(:shell_out).with("dscl . -cmd /Path args").and_return(shell_return)
120
- expect(provider.run_dscl("cmd /Path args")).to eq("stdout")
119
+ expect(provider).to receive(:shell_out).with("dscl", ".", "-cmd", "/Path", "args").and_return(shell_return)
120
+ expect(provider.run_dscl("cmd", "/Path", "args")).to eq("stdout")
121
121
  end
122
122
 
123
123
  it "returns an empty string from delete commands" do
124
124
  shell_return = shellcmdresult.new("out", "err", 23)
125
- expect(provider).to receive(:shell_out).with("dscl . -delete /Path args").and_return(shell_return)
126
- expect(provider.run_dscl("delete /Path args")).to eq("")
125
+ expect(provider).to receive(:shell_out).with("dscl", ".", "-delete", "/Path", "args").and_return(shell_return)
126
+ expect(provider.run_dscl("delete", "/Path", "args")).to eq("")
127
127
  end
128
128
 
129
129
  it "should raise an exception for any other command" do
130
130
  shell_return = shellcmdresult.new("out", "err", 23)
131
- expect(provider).to receive(:shell_out).with("dscl . -cmd /Path arguments").and_return(shell_return)
132
- expect { provider.run_dscl("cmd /Path arguments") }.to raise_error(Chef::Exceptions::DsclCommandFailed)
131
+ expect(provider).to receive(:shell_out).with("dscl", ".", "-cmd", "/Path", "arguments").and_return(shell_return)
132
+ expect { provider.run_dscl("cmd", "/Path", "arguments") }.to raise_error(Chef::Exceptions::DsclCommandFailed)
133
133
  end
134
134
 
135
135
  it "raises an exception when dscl reports 'no such key'" do
136
136
  shell_return = shellcmdresult.new("No such key: ", "err", 23)
137
- expect(provider).to receive(:shell_out).with("dscl . -cmd /Path args").and_return(shell_return)
138
- expect { provider.run_dscl("cmd /Path args") }.to raise_error(Chef::Exceptions::DsclCommandFailed)
137
+ expect(provider).to receive(:shell_out).with("dscl", ".", "-cmd", "/Path", "args").and_return(shell_return)
138
+ expect { provider.run_dscl("cmd", "/Path", "args") }.to raise_error(Chef::Exceptions::DsclCommandFailed)
139
139
  end
140
140
 
141
141
  it "raises an exception when dscl reports 'eDSRecordNotFound'" do
142
142
  shell_return = shellcmdresult.new("<dscl_cmd> DS Error: -14136 (eDSRecordNotFound)", "err", -14136)
143
- expect(provider).to receive(:shell_out).with("dscl . -cmd /Path args").and_return(shell_return)
144
- expect { provider.run_dscl("cmd /Path args") }.to raise_error(Chef::Exceptions::DsclCommandFailed)
143
+ expect(provider).to receive(:shell_out).with("dscl", ".", "-cmd", "/Path", "args").and_return(shell_return)
144
+ expect { provider.run_dscl("cmd", "/Path", "args") }.to raise_error(Chef::Exceptions::DsclCommandFailed)
145
145
  end
146
146
  end
147
147
 
148
148
  describe "get_free_uid" do
149
149
  before do
150
- expect(provider).to receive(:run_dscl).with("list /Users uid").and_return("\nwheel 200\nstaff 201\nbrahms 500\nchopin 501\n")
150
+ expect(provider).to receive(:run_dscl).with("list", "/Users", "uid").and_return("\nwheel 200\nstaff 201\nbrahms 500\nchopin 501\n")
151
151
  end
152
152
 
153
153
  describe "when resource is configured as system" do
@@ -177,7 +177,7 @@ ea18e18b720e358e7fbe3cfbeaa561456f6ba008937a30"
177
177
 
178
178
  describe "when called with a user id" do
179
179
  before do
180
- expect(provider).to receive(:run_dscl).with("list /Users uid").and_return("\naj 500\n")
180
+ expect(provider).to receive(:run_dscl).with("list", "/Users", "uid").and_return("\naj 500\n")
181
181
  end
182
182
 
183
183
  it "should return true for a used uid number" do
@@ -198,8 +198,8 @@ ea18e18b720e358e7fbe3cfbeaa561456f6ba008937a30"
198
198
  end
199
199
 
200
200
  it "finds a valid, unused uid when none is specified" do
201
- expect(provider).to receive(:run_dscl).with("list /Users uid").and_return("")
202
- expect(provider).to receive(:run_dscl).with("create /Users/toor UniqueID 501")
201
+ expect(provider).to receive(:run_dscl).with("list", "/Users", "uid").and_return("")
202
+ expect(provider).to receive(:run_dscl).with("create", "/Users/toor", "UniqueID", 501)
203
203
  expect(provider).to receive(:get_free_uid).and_return(501)
204
204
  provider.dscl_set_uid
205
205
  expect(new_resource.uid).to eq(501)
@@ -207,8 +207,8 @@ ea18e18b720e358e7fbe3cfbeaa561456f6ba008937a30"
207
207
 
208
208
  it "sets the uid specified in the resource" do
209
209
  new_resource.uid(1000)
210
- expect(provider).to receive(:run_dscl).with("create /Users/toor UniqueID 1000").and_return(true)
211
- expect(provider).to receive(:run_dscl).with("list /Users uid").and_return("")
210
+ expect(provider).to receive(:run_dscl).with("create", "/Users/toor", "UniqueID", 1000).and_return(true)
211
+ expect(provider).to receive(:run_dscl).with("list", "/Users", "uid").and_return("")
212
212
  provider.dscl_set_uid
213
213
  end
214
214
  end
@@ -219,9 +219,7 @@ ea18e18b720e358e7fbe3cfbeaa561456f6ba008937a30"
219
219
  end
220
220
 
221
221
  before do
222
- Chef::Config[:treat_deprecation_warnings_as_errors] = false
223
- Chef::Config[:treat_deprecation_warnings_as_errors] = false
224
- new_resource.supports({ :manage_home => true })
222
+ new_resource.manage_home true
225
223
  new_resource.home("/Users/toor")
226
224
 
227
225
  provider.current_resource = current_resource
@@ -229,7 +227,7 @@ ea18e18b720e358e7fbe3cfbeaa561456f6ba008937a30"
229
227
 
230
228
  it "deletes the home directory when resource#home is nil" do
231
229
  new_resource.instance_variable_set(:@home, nil)
232
- expect(provider).to receive(:run_dscl).with("delete /Users/toor NFSHomeDirectory").and_return(true)
230
+ expect(provider).to receive(:run_dscl).with("delete", "/Users/toor", "NFSHomeDirectory").and_return(true)
233
231
  provider.dscl_set_home
234
232
  end
235
233
 
@@ -239,40 +237,40 @@ ea18e18b720e358e7fbe3cfbeaa561456f6ba008937a30"
239
237
  end
240
238
 
241
239
  it "moves the users home to the new location if it exists and the target location is different" do
242
- Chef::Config[:treat_deprecation_warnings_as_errors] = false
243
- new_resource.supports(:manage_home => true)
240
+ new_resource.manage_home true
244
241
 
245
242
  current_home = CHEF_SPEC_DATA + "/old_home_dir"
246
243
  current_home_files = [current_home + "/my-dot-emacs", current_home + "/my-dot-vim"]
247
244
  current_resource.home(current_home)
248
245
  new_resource.gid(23)
249
- allow(::File).to receive(:exists?).with("/old/home/toor").and_return(true)
250
- allow(::File).to receive(:exists?).with("/Users/toor").and_return(true)
246
+ allow(::File).to receive(:exist?).with("/old/home/toor").and_return(true)
247
+ allow(::File).to receive(:exist?).with("/Users/toor").and_return(true)
248
+ allow(::File).to receive(:exist?).with(current_home).and_return(true)
251
249
 
252
250
  expect(FileUtils).to receive(:mkdir_p).with("/Users/toor").and_return(true)
253
251
  expect(FileUtils).to receive(:rmdir).with(current_home)
254
252
  expect(::Dir).to receive(:glob).with("#{CHEF_SPEC_DATA}/old_home_dir/*", ::File::FNM_DOTMATCH).and_return(current_home_files)
255
- expect(FileUtils).to receive(:mv).with(current_home_files, "/Users/toor", :force => true)
253
+ expect(FileUtils).to receive(:mv).with(current_home_files, "/Users/toor", force: true)
256
254
  expect(FileUtils).to receive(:chown_R).with("toor", "23", "/Users/toor")
257
255
 
258
- expect(provider).to receive(:run_dscl).with("create /Users/toor NFSHomeDirectory '/Users/toor'")
256
+ expect(provider).to receive(:run_dscl).with("create", "/Users/toor", "NFSHomeDirectory", "/Users/toor")
259
257
  provider.dscl_set_home
260
258
  end
261
259
 
262
260
  it "should raise an exception when the systems user template dir (skel) cannot be found" do
263
- allow(::File).to receive(:exists?).and_return(false, false, false)
261
+ allow(::File).to receive(:exist?).and_return(false, false, false)
264
262
  expect { provider.dscl_set_home }.to raise_error(Chef::Exceptions::User)
265
263
  end
266
264
 
267
265
  it "should run ditto to copy any missing files from skel to the new home dir" do
268
- expect(::File).to receive(:exists?).with("/System/Library/User\ Template/English.lproj").and_return(true)
266
+ expect(::File).to receive(:exist?).with("/System/Library/User\ Template/English.lproj").and_return(true)
269
267
  expect(FileUtils).to receive(:chown_R).with("toor", "", "/Users/toor")
270
- expect(provider).to receive(:shell_out!).with("ditto '/System/Library/User Template/English.lproj' '/Users/toor'")
268
+ expect(provider).to receive(:shell_out!).with("ditto", "/System/Library/User Template/English.lproj", "/Users/toor")
271
269
  provider.ditto_home
272
270
  end
273
271
 
274
272
  it "creates the user's NFSHomeDirectory and home directory" do
275
- expect(provider).to receive(:run_dscl).with("create /Users/toor NFSHomeDirectory '/Users/toor'").and_return(true)
273
+ expect(provider).to receive(:run_dscl).with("create", "/Users/toor", "NFSHomeDirectory", "/Users/toor").and_return(true)
276
274
  expect(provider).to receive(:ditto_home)
277
275
  provider.dscl_set_home
278
276
  end
@@ -283,8 +281,8 @@ ea18e18b720e358e7fbe3cfbeaa561456f6ba008937a30"
283
281
  let(:plutil_exists) { true }
284
282
 
285
283
  before do
286
- allow(::File).to receive(:exists?).with("/usr/bin/dscl").and_return(dscl_exists)
287
- allow(::File).to receive(:exists?).with("/usr/bin/plutil").and_return(plutil_exists)
284
+ allow(::File).to receive(:exist?).with("/usr/bin/dscl").and_return(dscl_exists)
285
+ allow(::File).to receive(:exist?).with("/usr/bin/plutil").and_return(plutil_exists)
288
286
  end
289
287
 
290
288
  def run_requirements
@@ -382,8 +380,8 @@ ea18e18b720e358e7fbe3cfbeaa561456f6ba008937a30"
382
380
  let(:user_plist_file) { nil }
383
381
 
384
382
  before do
385
- expect(provider).to receive(:shell_out).with("dscacheutil '-flushcache'")
386
- expect(provider).to receive(:shell_out).with("plutil -convert xml1 -o - /var/db/dslocal/nodes/Default/users/toor.plist") do
383
+ expect(provider).to receive(:shell_out).with("dscacheutil", "-flushcache")
384
+ expect(provider).to receive(:shell_out).with("plutil", "-convert", "xml1", "-o", "-", "/var/db/dslocal/nodes/Default/users/toor.plist") do
387
385
  if user_plist_file.nil?
388
386
  shellcmdresult.new("Can not find the file", "Sorry!!", 1)
389
387
  else
@@ -391,7 +389,7 @@ ea18e18b720e358e7fbe3cfbeaa561456f6ba008937a30"
391
389
  end
392
390
  end
393
391
 
394
- if !user_plist_file.nil?
392
+ unless user_plist_file.nil?
395
393
  expect(provider).to receive(:convert_binary_plist_to_xml).and_return(File.read(File.join(CHEF_SPEC_DATA, "mac_users/#{user_plist_file}.shadow.xml")))
396
394
  end
397
395
  end
@@ -726,7 +724,7 @@ ea18e18b720e358e7fbe3cfbeaa561456f6ba008937a30")
726
724
  expect(provider).to receive(:prepare_password_shadow_info).and_return({})
727
725
  mock_shellout = double("Mock::Shellout")
728
726
  allow(mock_shellout).to receive(:run_command)
729
- expect(Mixlib::ShellOut).to receive(:new).and_return(mock_shellout)
727
+ expect(provider).to receive(:shell_out).and_return(mock_shellout)
730
728
  expect(provider).to receive(:read_user_info)
731
729
  expect(provider).to receive(:dscl_set)
732
730
  expect(provider).to receive(:sleep).with(3)
@@ -754,29 +752,29 @@ ea18e18b720e358e7fbe3cfbeaa561456f6ba008937a30")
754
752
  end
755
753
 
756
754
  it "creates the user and sets the comment field" do
757
- expect(provider).to receive(:run_dscl).with("create /Users/toor").and_return(true)
755
+ expect(provider).to receive(:run_dscl).with("create", "/Users/toor").and_return(true)
758
756
  provider.dscl_create_user
759
757
  end
760
758
 
761
759
  it "sets the comment field" do
762
- expect(provider).to receive(:run_dscl).with("create /Users/toor RealName '#mockssuck'").and_return(true)
760
+ expect(provider).to receive(:run_dscl).with("create", "/Users/toor", "RealName", "#mockssuck").and_return(true)
763
761
  provider.dscl_create_comment
764
762
  end
765
763
 
766
764
  it "sets the comment field to username" do
767
765
  new_resource.comment nil
768
- expect(provider).to receive(:run_dscl).with("create /Users/toor RealName '#mockssuck'").and_return(true)
766
+ expect(provider).to receive(:run_dscl).with("create", "/Users/toor", "RealName", "#mockssuck").and_return(true)
769
767
  provider.dscl_create_comment
770
768
  expect(new_resource.comment).to eq("#mockssuck")
771
769
  end
772
770
 
773
771
  it "should run run_dscl with create /Users/user PrimaryGroupID to set the users primary group" do
774
- expect(provider).to receive(:run_dscl).with("create /Users/toor PrimaryGroupID '1001'").and_return(true)
772
+ expect(provider).to receive(:run_dscl).with("create", "/Users/toor", "PrimaryGroupID", 1001).and_return(true)
775
773
  provider.dscl_set_gid
776
774
  end
777
775
 
778
776
  it "should run run_dscl with create /Users/user UserShell to set the users login shell" do
779
- expect(provider).to receive(:run_dscl).with("create /Users/toor UserShell '/usr/bin/false'").and_return(true)
777
+ expect(provider).to receive(:run_dscl).with("create", "/Users/toor", "UserShell", "/usr/bin/false").and_return(true)
780
778
  provider.dscl_set_shell
781
779
  end
782
780
  end
@@ -788,21 +786,21 @@ ea18e18b720e358e7fbe3cfbeaa561456f6ba008937a30")
788
786
  end
789
787
 
790
788
  it "should map the group name to a numeric ID when the group exists" do
791
- expect(provider).to receive(:run_dscl).with("read /Groups/newgroup PrimaryGroupID").ordered.and_return("PrimaryGroupID: 1001\n")
792
- expect(provider).to receive(:run_dscl).with("create /Users/toor PrimaryGroupID '1001'").ordered.and_return(true)
789
+ expect(provider).to receive(:run_dscl).with("read", "/Groups/newgroup", "PrimaryGroupID").ordered.and_return("PrimaryGroupID: 1001\n")
790
+ expect(provider).to receive(:run_dscl).with("create", "/Users/toor", "PrimaryGroupID", "1001").ordered.and_return(true)
793
791
  provider.dscl_set_gid
794
792
  end
795
793
 
796
794
  it "should raise an exception when the group does not exist" do
797
795
  shell_return = shellcmdresult.new("<dscl_cmd> DS Error: -14136 (eDSRecordNotFound)", "err", -14136)
798
- expect(provider).to receive(:shell_out).with("dscl . -read /Groups/newgroup PrimaryGroupID").and_return(shell_return)
796
+ expect(provider).to receive(:shell_out).with("dscl", ".", "-read", "/Groups/newgroup", "PrimaryGroupID").and_return(shell_return)
799
797
  expect { provider.dscl_set_gid }.to raise_error(Chef::Exceptions::GroupIDNotFound)
800
798
  end
801
799
  end
802
800
 
803
801
  it "should set group ID to 20 if it's not specified" do
804
802
  new_resource.gid nil
805
- expect(provider).to receive(:run_dscl).with("create /Users/toor PrimaryGroupID '20'").ordered.and_return(true)
803
+ expect(provider).to receive(:run_dscl).with("create", "/Users/toor", "PrimaryGroupID", 20).ordered.and_return(true)
806
804
  provider.dscl_set_gid
807
805
  expect(new_resource.gid).to eq(20)
808
806
  end
@@ -850,8 +848,8 @@ ea18e18b720e358e7fbe3cfbeaa561456f6ba008937a30")
850
848
 
851
849
  describe "when the user exists" do
852
850
  before do
853
- expect(provider).to receive(:shell_out).with("dscacheutil '-flushcache'")
854
- expect(provider).to receive(:shell_out).with("plutil -convert xml1 -o - /var/db/dslocal/nodes/Default/users/toor.plist") do
851
+ expect(provider).to receive(:shell_out).with("dscacheutil", "-flushcache")
852
+ expect(provider).to receive(:shell_out).with("plutil", "-convert", "xml1", "-o", "-", "/var/db/dslocal/nodes/Default/users/toor.plist") do
855
853
  shellcmdresult.new(File.read(File.join(CHEF_SPEC_DATA, "mac_users/10.9.plist.xml")), "", 0)
856
854
  end
857
855
  provider.load_current_resource
@@ -859,14 +857,13 @@ ea18e18b720e358e7fbe3cfbeaa561456f6ba008937a30")
859
857
 
860
858
  describe "when Chef is removing the user" do
861
859
  it "removes the user from the groups and deletes home directory when the resource is configured to manage home" do
862
- Chef::Config[:treat_deprecation_warnings_as_errors] = false
863
- new_resource.supports({ :manage_home => true })
864
- expect(provider).to receive(:run_dscl).with("list /Groups").and_return("my_group\nyour_group\nreal_group\n")
865
- expect(provider).to receive(:run_dscl).with("read /Groups/my_group").and_raise(Chef::Exceptions::DsclCommandFailed) # Empty group
866
- expect(provider).to receive(:run_dscl).with("read /Groups/your_group").and_return("GroupMembership: not_you")
867
- expect(provider).to receive(:run_dscl).with("read /Groups/real_group").and_return("GroupMembership: toor")
868
- expect(provider).to receive(:run_dscl).with("delete /Groups/real_group GroupMembership 'toor'")
869
- expect(provider).to receive(:run_dscl).with("delete /Users/toor")
860
+ new_resource.manage_home true
861
+ expect(provider).to receive(:run_dscl).with("list", "/Groups").and_return("my_group\nyour_group\nreal_group\n")
862
+ expect(provider).to receive(:run_dscl).with("read", "/Groups/my_group").and_raise(Chef::Exceptions::DsclCommandFailed) # Empty group
863
+ expect(provider).to receive(:run_dscl).with("read", "/Groups/your_group").and_return("GroupMembership: not_you")
864
+ expect(provider).to receive(:run_dscl).with("read", "/Groups/real_group").and_return("GroupMembership: toor")
865
+ expect(provider).to receive(:run_dscl).with("delete", "/Groups/real_group", "GroupMembership", "toor")
866
+ expect(provider).to receive(:run_dscl).with("delete", "/Users/toor")
870
867
  expect(FileUtils).to receive(:rm_rf).with("/Users/vagrant")
871
868
  provider.remove_user
872
869
  end
@@ -889,7 +886,7 @@ ea18e18b720e358e7fbe3cfbeaa561456f6ba008937a30")
889
886
  end
890
887
 
891
888
  it "can unlock the user" do
892
- expect(provider).to receive(:run_dscl).with("create /Users/toor AuthenticationAuthority ';ShadowHash;HASHLIST:<SALTED-SHA512-PBKDF2>'")
889
+ expect(provider).to receive(:run_dscl).with("create", "/Users/toor", "AuthenticationAuthority", ";ShadowHash;HASHLIST:<SALTED-SHA512-PBKDF2>")
893
890
  provider.unlock_user
894
891
  end
895
892
  end
@@ -897,7 +894,7 @@ ea18e18b720e358e7fbe3cfbeaa561456f6ba008937a30")
897
894
 
898
895
  describe "when locking the user" do
899
896
  it "should run run_dscl with append /Users/user AuthenticationAuthority ;DisabledUser; to lock the user account" do
900
- expect(provider).to receive(:run_dscl).with("append /Users/toor AuthenticationAuthority ';DisabledUser;'")
897
+ expect(provider).to receive(:run_dscl).with("append", "/Users/toor", "AuthenticationAuthority", ";DisabledUser;")
901
898
  provider.lock_user
902
899
  end
903
900
  end
@@ -55,7 +55,7 @@ describe Chef::Provider::User::Linux do
55
55
 
56
56
  # supports is a method on the superclass so can't totally be removed, but we should aggressively NOP it to decisively break it
57
57
  it "disables the supports API", chef: ">= 13" do
58
- @new_resource.supports( { manage_home: true } )
58
+ @new_resource.supports( manage_home: true )
59
59
  expect( @new_resource.supports.key?(:manage_home) ).to be false
60
60
  end
61
61
 
@@ -70,13 +70,13 @@ describe Chef::Provider::User::Linux do
70
70
  it "throws a deprecation warning on setting supports[:non_unique]" do
71
71
  Chef::Config[:treat_deprecation_warnings_as_errors] = false
72
72
  expect(Chef).to receive(:deprecated).with(:supports_property, "supports { non_unique: true } on the user resource is deprecated and will be removed in Chef 13, set non_unique true instead")
73
- @new_resource.supports( { :non_unique => true } )
73
+ @new_resource.supports( non_unique: true )
74
74
  end
75
75
 
76
76
  it "throws a deprecation warning on setting supports[:manage_home]" do
77
77
  Chef::Config[:treat_deprecation_warnings_as_errors] = false
78
78
  expect(Chef).to receive(:deprecated).with(:supports_property, "supports { manage_home: true } on the user resource is deprecated and will be removed in Chef 13, set manage_home true instead")
79
- @new_resource.supports( { :manage_home => true } )
79
+ @new_resource.supports( manage_home: true )
80
80
  end
81
81
 
82
82
  it "defaults manage_home to false" do
@@ -85,13 +85,13 @@ describe Chef::Provider::User::Linux do
85
85
 
86
86
  it "supports[:manage_home] (incorectly) acts like manage_home" do
87
87
  Chef::Config[:treat_deprecation_warnings_as_errors] = false
88
- @new_resource.supports({ manage_home: true })
88
+ @new_resource.supports(manage_home: true)
89
89
  expect( provider.useradd_options ).to eql(["-m"])
90
90
  end
91
91
 
92
92
  it "supports[:manage_home] does not change behavior of manage_home: false", chef: ">= 13" do
93
93
  Chef::Config[:treat_deprecation_warnings_as_errors] = false
94
- @new_resource.supports({ manage_home: true })
94
+ @new_resource.supports(manage_home: true)
95
95
  expect( provider.useradd_options ).to eql(["-M"])
96
96
  end
97
97