chef 12.0.0.alpha.1 → 12.0.0.alpha.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (180) hide show
  1. checksums.yaml +4 -4
  2. data/lib/chef/application.rb +8 -1
  3. data/lib/chef/application/apply.rb +4 -0
  4. data/lib/chef/application/client.rb +7 -7
  5. data/lib/chef/application/solo.rb +21 -13
  6. data/lib/chef/chef_fs/chef_fs_data_store.rb +60 -6
  7. data/lib/chef/chef_fs/config.rb +78 -4
  8. data/lib/chef/chef_fs/data_handler/acl_data_handler.rb +2 -2
  9. data/lib/chef/chef_fs/data_handler/client_data_handler.rb +1 -1
  10. data/lib/chef/chef_fs/data_handler/container_data_handler.rb +1 -1
  11. data/lib/chef/chef_fs/data_handler/cookbook_data_handler.rb +1 -1
  12. data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +1 -1
  13. data/lib/chef/chef_fs/data_handler/data_handler_base.rb +76 -2
  14. data/lib/chef/chef_fs/data_handler/environment_data_handler.rb +1 -1
  15. data/lib/chef/chef_fs/data_handler/group_data_handler.rb +1 -1
  16. data/lib/chef/chef_fs/data_handler/node_data_handler.rb +1 -1
  17. data/lib/chef/chef_fs/data_handler/organization_data_handler.rb +30 -0
  18. data/lib/chef/chef_fs/data_handler/organization_invites_data_handler.rb +17 -0
  19. data/lib/chef/chef_fs/data_handler/organization_members_data_handler.rb +17 -0
  20. data/lib/chef/chef_fs/data_handler/role_data_handler.rb +1 -1
  21. data/lib/chef/chef_fs/data_handler/user_data_handler.rb +2 -1
  22. data/lib/chef/chef_fs/file_system.rb +0 -1
  23. data/lib/chef/chef_fs/file_system/acl_entry.rb +1 -1
  24. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_dir.rb +1 -1
  25. data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +5 -1
  26. data/lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb +73 -13
  27. data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +44 -5
  28. data/lib/chef/chef_fs/file_system/cookbook_dir.rb +1 -1
  29. data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +3 -3
  30. data/lib/chef/chef_fs/file_system/org_entry.rb +34 -0
  31. data/lib/chef/chef_fs/file_system/organization_invites_entry.rb +58 -0
  32. data/lib/chef/chef_fs/file_system/organization_members_entry.rb +57 -0
  33. data/lib/chef/chef_fs/file_system/rest_list_entry.rb +13 -4
  34. data/lib/chef/chef_fs/knife.rb +1 -1
  35. data/lib/chef/client.rb +8 -2
  36. data/lib/chef/config.rb +75 -57
  37. data/lib/chef/config_fetcher.rb +6 -21
  38. data/lib/chef/dsl/data_query.rb +48 -3
  39. data/lib/chef/dsl/platform_introspection.rb +42 -0
  40. data/lib/chef/dsl/reboot_pending.rb +6 -3
  41. data/lib/chef/encrypted_data_bag_item.rb +1 -1
  42. data/lib/chef/encrypted_data_bag_item/encryptor.rb +12 -0
  43. data/lib/chef/exceptions.rb +2 -0
  44. data/lib/chef/http/basic_client.rb +14 -0
  45. data/lib/chef/http/json_output.rb +7 -2
  46. data/lib/chef/knife.rb +36 -121
  47. data/lib/chef/knife/bootstrap.rb +68 -54
  48. data/lib/chef/knife/bootstrap/archlinux-gems.erb +6 -1
  49. data/lib/chef/knife/bootstrap/chef-aix.erb +5 -0
  50. data/lib/chef/knife/bootstrap/chef-full.erb +5 -1
  51. data/lib/chef/knife/core/bootstrap_context.rb +70 -29
  52. data/lib/chef/knife/search.rb +56 -12
  53. data/lib/chef/knife/serve.rb +1 -1
  54. data/lib/chef/local_mode.rb +10 -4
  55. data/lib/chef/mixin/deep_merge.rb +6 -3
  56. data/lib/chef/mixin/shell_out.rb +33 -17
  57. data/lib/chef/null_logger.rb +72 -0
  58. data/lib/chef/platform.rb +2 -1
  59. data/lib/chef/platform/provider_mapping.rb +1 -1
  60. data/lib/chef/platform/rebooter.rb +54 -0
  61. data/lib/chef/provider/ifconfig.rb +15 -16
  62. data/lib/chef/provider/link.rb +1 -1
  63. data/lib/chef/provider/mount/mount.rb +1 -1
  64. data/lib/chef/provider/mount/solaris.rb +102 -64
  65. data/lib/chef/provider/package/aix.rb +4 -12
  66. data/lib/chef/provider/package/ips.rb +8 -12
  67. data/lib/chef/provider/package/macports.rb +4 -12
  68. data/lib/chef/provider/package/pacman.rb +2 -6
  69. data/lib/chef/provider/package/portage.rb +2 -6
  70. data/lib/chef/provider/package/rpm.rb +4 -12
  71. data/lib/chef/provider/package/solaris.rb +4 -12
  72. data/lib/chef/provider/reboot.rb +69 -0
  73. data/lib/chef/provider/service/debian.rb +10 -10
  74. data/lib/chef/provider/service/freebsd.rb +89 -73
  75. data/lib/chef/provider/service/gentoo.rb +2 -2
  76. data/lib/chef/provider/service/init.rb +6 -4
  77. data/lib/chef/provider/service/insserv.rb +3 -3
  78. data/lib/chef/provider/service/macosx.rb +2 -2
  79. data/lib/chef/provider/service/simple.rb +6 -4
  80. data/lib/chef/provider/service/solaris.rb +1 -1
  81. data/lib/chef/provider/service/systemd.rb +9 -9
  82. data/lib/chef/provider/service/upstart.rb +6 -6
  83. data/lib/chef/provider/subversion.rb +6 -6
  84. data/lib/chef/provider/user/dscl.rb +32 -28
  85. data/lib/chef/provider/user/windows.rb +6 -6
  86. data/lib/chef/provider/whyrun_safe_ruby_block.rb +1 -1
  87. data/lib/chef/providers.rb +1 -0
  88. data/lib/chef/recipe.rb +0 -1
  89. data/lib/chef/resource.rb +3 -5
  90. data/lib/chef/resource/mount.rb +9 -0
  91. data/lib/chef/resource/reboot.rb +48 -0
  92. data/lib/chef/resources.rb +1 -0
  93. data/lib/chef/run_context.rb +25 -0
  94. data/lib/chef/search/query.rb +122 -14
  95. data/lib/chef/util/path_helper.rb +54 -6
  96. data/lib/chef/util/windows/net_user.rb +4 -1
  97. data/lib/chef/version.rb +1 -1
  98. data/lib/chef/win32/api/file.rb +1 -5
  99. data/lib/chef/win32/api/net.rb +1 -0
  100. data/lib/chef/workstation_config_loader.rb +177 -0
  101. data/spec/functional/http/simple_spec.rb +57 -1
  102. data/spec/functional/mixin/shell_out_spec.rb +2 -2
  103. data/spec/functional/provider/whyrun_safe_ruby_block_spec.rb +51 -0
  104. data/spec/functional/rebooter_spec.rb +105 -0
  105. data/spec/functional/resource/deploy_revision_spec.rb +0 -4
  106. data/spec/functional/resource/file_spec.rb +26 -3
  107. data/spec/functional/resource/group_spec.rb +5 -3
  108. data/spec/functional/resource/link_spec.rb +16 -16
  109. data/spec/functional/resource/reboot_spec.rb +103 -0
  110. data/spec/integration/client/client_spec.rb +4 -8
  111. data/spec/integration/client/ipv6_spec.rb +1 -1
  112. data/spec/integration/knife/cookbook_api_ipv6_spec.rb +3 -2
  113. data/spec/integration/knife/delete_spec.rb +39 -0
  114. data/spec/integration/knife/deps_spec.rb +30 -20
  115. data/spec/integration/knife/download_spec.rb +77 -1
  116. data/spec/integration/knife/list_spec.rb +221 -0
  117. data/spec/integration/knife/raw_spec.rb +1 -1
  118. data/spec/integration/knife/show_spec.rb +2 -2
  119. data/spec/integration/knife/upload_spec.rb +154 -1
  120. data/spec/support/pedant/run_pedant.rb +0 -1
  121. data/spec/support/shared/functional/http.rb +8 -1
  122. data/spec/support/shared/integration/integration_helper.rb +11 -19
  123. data/spec/support/shared/unit/platform_introspector.rb +22 -0
  124. data/spec/unit/application/apply.rb +11 -1
  125. data/spec/unit/application/solo_spec.rb +19 -3
  126. data/spec/unit/chef_fs/config_spec.rb +58 -0
  127. data/spec/unit/config_fetcher_spec.rb +1 -3
  128. data/spec/unit/config_spec.rb +247 -220
  129. data/spec/unit/dsl/data_query_spec.rb +165 -23
  130. data/spec/unit/dsl/reboot_pending_spec.rb +1 -7
  131. data/spec/unit/encrypted_data_bag_item_spec.rb +1 -1
  132. data/spec/unit/knife/bootstrap_spec.rb +354 -182
  133. data/spec/unit/knife/core/bootstrap_context_spec.rb +67 -30
  134. data/spec/unit/knife_spec.rb +3 -30
  135. data/spec/unit/mixin/deep_merge_spec.rb +14 -0
  136. data/spec/unit/mixin/shell_out_spec.rb +134 -64
  137. data/spec/unit/provider/ifconfig/debian_spec.rb +19 -9
  138. data/spec/unit/provider/ifconfig/redhat_spec.rb +16 -14
  139. data/spec/unit/provider/ifconfig_spec.rb +3 -3
  140. data/spec/unit/provider/link_spec.rb +5 -5
  141. data/spec/unit/provider/mount/mount_spec.rb +10 -1
  142. data/spec/unit/provider/mount/solaris_spec.rb +185 -11
  143. data/spec/unit/provider/package/aix_spec.rb +5 -17
  144. data/spec/unit/provider/package/ips_spec.rb +8 -21
  145. data/spec/unit/provider/package/macports_spec.rb +12 -12
  146. data/spec/unit/provider/package/pacman_spec.rb +4 -12
  147. data/spec/unit/provider/package/portage_spec.rb +5 -15
  148. data/spec/unit/provider/package/rpm_spec.rb +7 -22
  149. data/spec/unit/provider/package/solaris_spec.rb +5 -16
  150. data/spec/unit/provider/service/arch_service_spec.rb +8 -14
  151. data/spec/unit/provider/service/debian_service_spec.rb +1 -1
  152. data/spec/unit/provider/service/freebsd_service_spec.rb +457 -225
  153. data/spec/unit/provider/service/gentoo_service_spec.rb +2 -2
  154. data/spec/unit/provider/service/init_service_spec.rb +10 -10
  155. data/spec/unit/provider/service/insserv_service_spec.rb +3 -4
  156. data/spec/unit/provider/service/invokercd_service_spec.rb +8 -9
  157. data/spec/unit/provider/service/macosx_spec.rb +5 -5
  158. data/spec/unit/provider/service/simple_service_spec.rb +4 -6
  159. data/spec/unit/provider/service/solaris_smf_service_spec.rb +1 -3
  160. data/spec/unit/provider/service/systemd_service_spec.rb +20 -20
  161. data/spec/unit/provider/service/upstart_service_spec.rb +15 -17
  162. data/spec/unit/provider/subversion_spec.rb +5 -6
  163. data/spec/unit/provider/user/dscl_spec.rb +2 -1
  164. data/spec/unit/provider/user/windows_spec.rb +7 -0
  165. data/spec/unit/provider/whyrun_safe_ruby_block_spec.rb +2 -2
  166. data/spec/unit/resource/mount_spec.rb +9 -0
  167. data/spec/unit/resource_spec.rb +0 -4
  168. data/spec/unit/rest_spec.rb +1 -1
  169. data/spec/unit/run_context_spec.rb +15 -0
  170. data/spec/unit/search/query_spec.rb +196 -40
  171. data/spec/unit/util/path_helper_spec.rb +111 -28
  172. data/spec/unit/workstation_config_loader_spec.rb +283 -0
  173. metadata +36 -20
  174. data/lib/chef/knife/bootstrap/centos5-gems.erb +0 -62
  175. data/lib/chef/knife/bootstrap/fedora13-gems.erb +0 -44
  176. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +0 -53
  177. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +0 -48
  178. data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +0 -46
  179. data/spec/support/shared/integration/chef_zero_support.rb +0 -130
  180. data/spec/unit/knife/config_file_selection_spec.rb +0 -135
@@ -33,10 +33,6 @@ describe Chef::Knife::Core::BootstrapContext do
33
33
 
34
34
  subject(:bootstrap_context) { described_class.new(config, run_list, chef_config) }
35
35
 
36
- it "installs the same version of chef on the remote host" do
37
- bootstrap_context.bootstrap_version_string.should eq "--version #{Chef::VERSION}"
38
- end
39
-
40
36
  it "runs chef with the first-boot.json in the _default environment" do
41
37
  bootstrap_context.start_chef.should eq "chef-client -j /etc/chef/first-boot.json -E _default"
42
38
  end
@@ -95,24 +91,6 @@ EXPECTED
95
91
  end
96
92
  end
97
93
 
98
- describe "when installing a prerelease version of chef" do
99
- let(:config){ {:prerelease => true }}
100
- it "supplies --prerelease as the version string" do
101
- bootstrap_context.bootstrap_version_string.should eq '--prerelease'
102
- end
103
- end
104
-
105
- describe "when installing an explicit version of chef" do
106
- let(:chef_config) do
107
- {
108
- :knife => { :bootstrap_version => '123.45.678' }
109
- }
110
- end
111
- it "gives --version $VERSION as the version string" do
112
- bootstrap_context.bootstrap_version_string.should eq '--version 123.45.678'
113
- end
114
- end
115
-
116
94
  describe "when JSON attributes are given" do
117
95
  let(:config) { {:first_boot_attributes => {:baz => :quux}} }
118
96
  it "adds the attributes to first_boot" do
@@ -141,7 +119,20 @@ EXPECTED
141
119
  context "via config[:secret_file]" do
142
120
  let(:chef_config) do
143
121
  {
144
- :knife => {:secret_file => secret_file}
122
+ :knife => {:secret_file => secret_file}
123
+ }
124
+ end
125
+ it "reads the encrypted_data_bag_secret" do
126
+ bootstrap_context.encrypted_data_bag_secret.should eq IO.read(secret_file)
127
+ end
128
+ end
129
+
130
+ context "via config[:secret_file] with short home path" do
131
+ let(:chef_config) do
132
+ home_path = File.expand_path("~")
133
+ shorted_secret_file_path = secret_file.gsub(home_path, "~")
134
+ {
135
+ :knife => {:secret_file => shorted_secret_file_path}
145
136
  }
146
137
  end
147
138
  it "reads the encrypted_data_bag_secret" do
@@ -158,13 +149,6 @@ EXPECTED
158
149
  it "sets the @run_list instance variable" do
159
150
  bootstrap_context.instance_variable_get(:@run_list).should eq run_list
160
151
  end
161
-
162
- describe "accepts encrypted_data_bag_secret via Chef::Config" do
163
- let(:chef_config) { {:encrypted_data_bag_secret => secret_file }}
164
- it "reads the encrypted_data_bag_secret" do
165
- bootstrap_context.encrypted_data_bag_secret.should eq IO.read(secret_file)
166
- end
167
- end
168
152
  end
169
153
 
170
154
  describe "when a bootstrap_version is specified" do
@@ -197,4 +181,57 @@ EXPECTED
197
181
  bootstrap_context.latest_current_chef_version_string.should eq("-v #{Chef::VERSION.to_i}")
198
182
  end
199
183
  end
184
+
185
+ describe "ssl_verify_mode" do
186
+ it "isn't set in the config_content by default" do
187
+ bootstrap_context.config_content.should_not include("ssl_verify_mode")
188
+ end
189
+
190
+ describe "when configured in config" do
191
+ let(:chef_config) do
192
+ {
193
+ :knife => {:ssl_verify_mode => :verify_peer}
194
+ }
195
+ end
196
+
197
+ it "uses the config value" do
198
+ bootstrap_context.config_content.should include("ssl_verify_mode :verify_peer")
199
+ end
200
+
201
+ describe "when configured via CLI" do
202
+ let(:config) {{:node_ssl_verify_mode => "none"}}
203
+
204
+ it "uses CLI value" do
205
+ bootstrap_context.config_content.should include("ssl_verify_mode :verify_none")
206
+ end
207
+ end
208
+ end
209
+ end
210
+
211
+ describe "verify_api_cert" do
212
+ it "isn't set in the config_content by default" do
213
+ bootstrap_context.config_content.should_not include("verify_api_cert")
214
+ end
215
+
216
+ describe "when configured in config" do
217
+ let(:chef_config) do
218
+ {
219
+ :knife => {:verify_api_cert => :false}
220
+ }
221
+ end
222
+
223
+ it "uses the config value" do
224
+ bootstrap_context.config_content.should include("verify_api_cert false")
225
+ end
226
+
227
+ describe "when configured via CLI" do
228
+ let(:config) {{:node_verify_api_cert => true}}
229
+
230
+ it "uses CLI value" do
231
+ bootstrap_context.config_content.should include("verify_api_cert true")
232
+ end
233
+ end
234
+ end
235
+ end
236
+
200
237
  end
@@ -44,34 +44,6 @@ describe Chef::Knife do
44
44
  @stderr = StringIO.new
45
45
  end
46
46
 
47
- describe "selecting a config file" do
48
- context "when the current working dir is inside a symlinked directory" do
49
- before do
50
- Chef::Knife.reset_config_path!
51
- # pwd according to your shell is /home/someuser/prod/chef-repo, but
52
- # chef-repo is a symlink to /home/someuser/codes/chef-repo
53
- if Chef::Platform.windows?
54
- ENV.should_receive(:[]).with("CD").and_return("/home/someuser/prod/chef-repo")
55
- else
56
- ENV.should_receive(:[]).with("PWD").and_return("/home/someuser/prod/chef-repo")
57
- end
58
-
59
- Dir.stub(:pwd).and_return("/home/someuser/codes/chef-repo")
60
- end
61
-
62
- after do
63
- Chef::Knife.reset_config_path!
64
- end
65
-
66
- it "loads the config from the non-dereferenced directory path" do
67
- File.should_receive(:exist?).with("/home/someuser/prod/chef-repo/.chef").and_return(false)
68
- File.should_receive(:exist?).with("/home/someuser/prod/.chef").and_return(true)
69
- File.should_receive(:directory?).with("/home/someuser/prod/.chef").and_return(true)
70
- Chef::Knife.chef_config_dir.should == "/home/someuser/prod/.chef"
71
- end
72
- end
73
- end
74
-
75
47
  describe "after loading a subcommand" do
76
48
  before do
77
49
  Chef::Knife.reset_subcommands!
@@ -247,7 +219,7 @@ describe Chef::Knife do
247
219
  end
248
220
 
249
221
  it "loads lazy dependencies" do
250
- command = Chef::Knife.run(%w{test yourself})
222
+ Chef::Knife.run(%w{test yourself})
251
223
  KnifeSpecs::TestYourself.test_deps_loaded.should be_true
252
224
  end
253
225
 
@@ -256,7 +228,8 @@ describe Chef::Knife do
256
228
  KnifeSpecs::TestYourself.class_eval do
257
229
  deps { other_deps_loaded = true }
258
230
  end
259
- command = Chef::Knife.run(%w{test yourself})
231
+
232
+ Chef::Knife.run(%w{test yourself})
260
233
  KnifeSpecs::TestYourself.test_deps_loaded.should be_true
261
234
  other_deps_loaded.should be_true
262
235
  end
@@ -236,6 +236,20 @@ describe Chef::Mixin::DeepMerge, "deep_merge!" do
236
236
  @dm.deep_merge!(hash_src, hash_dst)
237
237
  hash_dst.should == {"item" => "orange"}
238
238
  end
239
+
240
+ it 'should overwrite hashes with nil' do
241
+ hash_src = {"item" => { "1" => "2"}, "other" => true }
242
+ hash_dst = {"item" => nil }
243
+ @dm.deep_merge!(hash_src, hash_dst)
244
+ hash_dst.should == {"item" => nil, "other" => true }
245
+ end
246
+
247
+ it 'should overwrite strings with nil' do
248
+ hash_src = {"item" => "to_overwrite", "other" => false }
249
+ hash_dst = {"item" => nil }
250
+ @dm.deep_merge!(hash_src, hash_dst)
251
+ hash_dst.should == {"item" => nil, "other" => false }
252
+ end
239
253
  end # deep_merge!
240
254
 
241
255
  # Chef specific
@@ -32,7 +32,7 @@ describe Chef::Mixin::ShellOut do
32
32
 
33
33
  let(:output) { StringIO.new }
34
34
  let!(:capture_log_output) { Chef::Log.logger = Logger.new(output) }
35
- let(:assume_deprecation_log_level) { Chef::Log.stub(:level).and_return(:warn) }
35
+ let(:assume_deprecation_log_level) { allow(Chef::Log).to receive(:level).and_return(:warn) }
36
36
 
37
37
  context 'without options' do
38
38
  let(:command_args) { [ cmd ] }
@@ -55,9 +55,9 @@ describe Chef::Mixin::ShellOut do
55
55
  it 'should emit a deprecation warning' do
56
56
  assume_deprecation_log_level and capture_log_output
57
57
  subject
58
- output.string.should match /DEPRECATION:/
59
- output.string.should match Regexp.escape(old_option.to_s)
60
- output.string.should match Regexp.escape(new_option.to_s)
58
+ expect(output.string).to match /DEPRECATION:/
59
+ expect(output.string).to match Regexp.escape(old_option.to_s)
60
+ expect(output.string).to match Regexp.escape(new_option.to_s)
61
61
  end
62
62
  end
63
63
 
@@ -106,7 +106,7 @@ describe Chef::Mixin::ShellOut do
106
106
  end
107
107
  end
108
108
 
109
- describe "#shell_out_with_systems_locale" do
109
+ context "when testing individual methods" do
110
110
  before(:each) do
111
111
  @original_env = ENV.to_hash
112
112
  ENV.clear
@@ -120,82 +120,152 @@ describe Chef::Mixin::ShellOut do
120
120
  let(:shell_out) { Chef::Mixin::ShellOut }
121
121
  let(:cmd) { "echo '#{rand(1000)}'" }
122
122
 
123
- describe "when the last argument is a Hash" do
124
- describe "and environment is an option" do
125
- it "should not change environment['LC_ALL'] when set to nil" do
126
- options = { :environment => { 'LC_ALL' => nil } }
127
- shell_out.should_receive(:shell_out).with(cmd, options).and_return(true)
128
- shell_out.shell_out_with_systems_locale(cmd, options)
123
+ describe "#shell_out" do
124
+
125
+ describe "when the last argument is a Hash" do
126
+ describe "and environment is an option" do
127
+ it "should not change environment['LC_ALL'] when set to nil" do
128
+ options = { :environment => { 'LC_ALL' => nil } }
129
+ expect(shell_out).to receive(:shell_out_command).with(cmd, options).and_return(true)
130
+ shell_out.shell_out(cmd, options)
131
+ end
132
+
133
+ it "should not change environment['LC_ALL'] when set to non-nil" do
134
+ options = { :environment => { 'LC_ALL' => 'en_US.UTF-8' } }
135
+ expect(shell_out).to receive(:shell_out_command).with(cmd, options).and_return(true)
136
+ shell_out.shell_out(cmd, options)
137
+ end
138
+
139
+ it "should set environment['LC_ALL'] to 'en_US.UTF-8' when 'LC_ALL' not present" do
140
+ options = { :environment => { 'HOME' => '/Users/morty' } }
141
+ expect(shell_out).to receive(:shell_out_command).with(cmd, {
142
+ :environment => { 'HOME' => '/Users/morty', 'LC_ALL' => Chef::Config[:internal_locale] },
143
+ }).and_return(true)
144
+ shell_out.shell_out(cmd, options)
145
+ end
146
+
147
+ it "should not mutate the options hash when it adds LC_ALL" do
148
+ options = { :environment => { 'HOME' => '/Users/morty' } }
149
+ expect(shell_out).to receive(:shell_out_command).with(cmd, {
150
+ :environment => { 'HOME' => '/Users/morty', 'LC_ALL' => Chef::Config[:internal_locale] },
151
+ }).and_return(true)
152
+ shell_out.shell_out(cmd, options)
153
+ expect(options[:environment].has_key?('LC_ALL')).to be false
154
+ end
129
155
  end
130
156
 
131
- it "should not change environment['LC_ALL'] when set to non-nil" do
132
- options = { :environment => { 'LC_ALL' => 'en_US.UTF-8' } }
133
- shell_out.should_receive(:shell_out).with(cmd, options).and_return(true)
134
- shell_out.shell_out_with_systems_locale(cmd, options)
157
+ describe "and env is an option" do
158
+ it "should not change env when set to nil" do
159
+ options = { :env => { 'LC_ALL' => nil } }
160
+ expect(shell_out).to receive(:shell_out_command).with(cmd, options).and_return(true)
161
+ shell_out.shell_out(cmd, options)
162
+ end
163
+
164
+ it "should not change env when set to non-nil" do
165
+ options = { :env => { 'LC_ALL' => 'de_DE.UTF-8'}}
166
+ expect(shell_out).to receive(:shell_out_command).with(cmd, options).and_return(true)
167
+ shell_out.shell_out(cmd, options)
168
+ end
169
+
170
+ it "should set env['LC_ALL'] to 'en_US.UTF-8' when 'LC_ALL' not present" do
171
+ options = { :env => { 'HOME' => '/Users/morty' } }
172
+ expect(shell_out).to receive(:shell_out_command).with(cmd, {
173
+ :env => { 'HOME' => '/Users/morty', 'LC_ALL' => Chef::Config[:internal_locale] },
174
+ }).and_return(true)
175
+ shell_out.shell_out(cmd, options)
176
+ end
177
+
178
+ it "should not mutate the options hash when it adds LC_ALL" do
179
+ options = { :env => { 'HOME' => '/Users/morty' } }
180
+ expect(shell_out).to receive(:shell_out_command).with(cmd, {
181
+ :env => { 'HOME' => '/Users/morty', 'LC_ALL' => Chef::Config[:internal_locale] },
182
+ }).and_return(true)
183
+ shell_out.shell_out(cmd, options)
184
+ expect(options[:env].has_key?('LC_ALL')).to be false
185
+ end
135
186
  end
136
187
 
137
- it "should set environment['LC_ALL'] to nil when 'LC_ALL' not present" do
138
- options = { :environment => { 'HOME' => '/Users/morty' } }
139
- shell_out.should_receive(:shell_out).with(
140
- cmd,
141
- { :environment => {
142
- 'HOME' => '/Users/morty',
143
- 'LC_ALL' => nil }
144
- }
145
- ).and_return(true)
146
- shell_out.shell_out_with_systems_locale(cmd, options)
188
+ describe "and no env/environment option is present" do
189
+ it "should add environment option and set environment['LC_ALL'] to 'en_US.UTF_8'" do
190
+ options = { :user => 'morty' }
191
+ expect(shell_out).to receive(:shell_out_command).with(cmd, {
192
+ :user => 'morty', :environment => { 'LC_ALL' => Chef::Config[:internal_locale] },
193
+ }).and_return(true)
194
+ shell_out.shell_out(cmd, options)
195
+ end
147
196
  end
148
197
  end
149
198
 
150
- describe "and env is an option" do
151
- it "should not change env when set to nil" do
152
- options = { :env => { 'LC_ALL' => nil } }
153
- shell_out.should_receive(:shell_out).with(cmd, options).and_return(true)
154
- shell_out.shell_out_with_systems_locale(cmd, options)
199
+ describe "when the last argument is not a Hash" do
200
+ it "should add environment options and set environment['LC_ALL'] to 'en_US.UTF-8'" do
201
+ expect(shell_out).to receive(:shell_out_command).with(cmd, {
202
+ :environment => { 'LC_ALL' => Chef::Config[:internal_locale] },
203
+ }).and_return(true)
204
+ shell_out.shell_out(cmd)
155
205
  end
206
+ end
207
+
208
+ end
156
209
 
157
- it "should not change env when set to non-nil" do
158
- options = { :env => { 'LC_ALL' => 'en_US.UTF-8'}}
159
- shell_out.should_receive(:shell_out).with(cmd, options).and_return(true)
160
- shell_out.shell_out_with_systems_locale(cmd, options)
210
+ describe "#shell_out_with_systems_locale" do
211
+
212
+ describe "when the last argument is a Hash" do
213
+ describe "and environment is an option" do
214
+ it "should not change environment['LC_ALL'] when set to nil" do
215
+ options = { :environment => { 'LC_ALL' => nil } }
216
+ expect(shell_out).to receive(:shell_out_command).with(cmd, options).and_return(true)
217
+ shell_out.shell_out_with_systems_locale(cmd, options)
218
+ end
219
+
220
+ it "should not change environment['LC_ALL'] when set to non-nil" do
221
+ options = { :environment => { 'LC_ALL' => 'en_US.UTF-8' } }
222
+ expect(shell_out).to receive(:shell_out_command).with(cmd, options).and_return(true)
223
+ shell_out.shell_out_with_systems_locale(cmd, options)
224
+ end
225
+
226
+ it "should no longer set environment['LC_ALL'] to nil when 'LC_ALL' not present" do
227
+ options = { :environment => { 'HOME' => '/Users/morty' } }
228
+ expect(shell_out).to receive(:shell_out_command).with(cmd, options).and_return(true)
229
+ shell_out.shell_out_with_systems_locale(cmd, options)
230
+ end
161
231
  end
162
232
 
163
- it "should set env['LC_ALL'] to nil when 'LC_ALL' not present" do
164
- options = { :env => { 'HOME' => '/Users/morty' } }
165
- shell_out.should_receive(:shell_out).with(
166
- cmd,
167
- { :env => {
168
- 'HOME' => '/Users/morty',
169
- 'LC_ALL' => nil }
170
- }
171
- ).and_return(true)
172
- shell_out.shell_out_with_systems_locale(cmd, options)
233
+ describe "and env is an option" do
234
+ it "should not change env when set to nil" do
235
+ options = { :env => { 'LC_ALL' => nil } }
236
+ expect(shell_out).to receive(:shell_out_command).with(cmd, options).and_return(true)
237
+ shell_out.shell_out_with_systems_locale(cmd, options)
238
+ end
239
+
240
+ it "should not change env when set to non-nil" do
241
+ options = { :env => { 'LC_ALL' => 'en_US.UTF-8'}}
242
+ expect(shell_out).to receive(:shell_out_command).with(cmd, options).and_return(true)
243
+ shell_out.shell_out_with_systems_locale(cmd, options)
244
+ end
245
+
246
+ it "should no longer set env['LC_ALL'] to nil when 'LC_ALL' not present" do
247
+ options = { :env => { 'HOME' => '/Users/morty' } }
248
+ expect(shell_out).to receive(:shell_out_command).with(cmd, options).and_return(true)
249
+ shell_out.shell_out_with_systems_locale(cmd, options)
250
+ end
173
251
  end
174
- end
175
252
 
176
- describe "and no env/environment option is present" do
177
- it "should add environment option and set environment['LC_ALL'] to nil" do
178
- options = { :user => 'morty' }
179
- shell_out.should_receive(:shell_out).with(
180
- cmd,
181
- { :environment => { 'LC_ALL' => nil },
182
- :user => 'morty'
183
- }
184
- ).and_return(true)
185
- shell_out.shell_out_with_systems_locale(cmd, options)
253
+ describe "and no env/environment option is present" do
254
+ it "should no longer add environment option and set environment['LC_ALL'] to nil" do
255
+ options = { :user => 'morty' }
256
+ expect(shell_out).to receive(:shell_out_command).with(cmd, options).and_return(true)
257
+ shell_out.shell_out_with_systems_locale(cmd, options)
258
+ end
186
259
  end
187
260
  end
188
- end
189
261
 
190
- describe "when the last argument is not a Hash" do
191
- it "should add environment options and set environment['LC_ALL'] to nil" do
192
- shell_out.should_receive(:shell_out).with(
193
- cmd,
194
- { :environment => { 'LC_ALL' => nil } }
195
- ).and_return(true)
196
- shell_out.shell_out_with_systems_locale(cmd)
262
+ describe "when the last argument is not a Hash" do
263
+ it "should no longer add environment options and set environment['LC_ALL'] to nil" do
264
+ expect(shell_out).to receive(:shell_out_command).with(cmd).and_return(true)
265
+ shell_out.shell_out_with_systems_locale(cmd)
266
+ end
197
267
  end
198
268
  end
199
- end
200
269
 
270
+ end
201
271
  end
@@ -56,8 +56,6 @@ describe Chef::Provider::Ifconfig::Debian do
56
56
  describe "generate_config" do
57
57
 
58
58
  context "when writing a file" do
59
- let(:config_file_ifcfg) { StringIO.new }
60
-
61
59
  let(:tempfile) { Tempfile.new("rspec-chef-ifconfig-debian") }
62
60
 
63
61
  let(:tempdir_path) { Dir.mktmpdir("rspec-chef-ifconfig-debian-dir") }
@@ -67,14 +65,13 @@ describe Chef::Provider::Ifconfig::Debian do
67
65
  before do
68
66
  stub_const("Chef::Provider::Ifconfig::Debian::INTERFACES_FILE", tempfile.path)
69
67
  stub_const("Chef::Provider::Ifconfig::Debian::INTERFACES_DOT_D_DIR", tempdir_path)
70
- expect(File).to receive(:new).with(config_filename_ifcfg, "w").and_return(config_file_ifcfg)
71
68
  end
72
69
 
73
70
  it "should write a network-script" do
74
71
  provider.run_action(:add)
75
- expect(config_file_ifcfg.string).to match(/^iface eth0 inet static\s*$/)
76
- expect(config_file_ifcfg.string).to match(/^\s+address 10\.0\.0\.1\s*$/)
77
- expect(config_file_ifcfg.string).to match(/^\s+netmask 255\.255\.254\.0\s*$/)
72
+ expect(File.read(config_filename_ifcfg)).to match(/^iface eth0 inet static\s*$/)
73
+ expect(File.read(config_filename_ifcfg)).to match(/^\s+address 10\.0\.0\.1\s*$/)
74
+ expect(File.read(config_filename_ifcfg)).to match(/^\s+netmask 255\.255\.254\.0\s*$/)
78
75
  end
79
76
 
80
77
  context "when the interface_dot_d directory does not exist" do
@@ -123,7 +120,6 @@ iface eth0 inet static
123
120
  netmask 255.255.254.0
124
121
  EOF
125
122
  )
126
- expect(File).to receive(:new).with(config_filename_ifcfg, "w").and_return(config_file_ifcfg)
127
123
  expect(File.exists?(tempdir_path)).to be_true # since the file exists, the enclosing dir must also exist
128
124
  end
129
125
 
@@ -139,6 +135,8 @@ EOF
139
135
  before do
140
136
  tempfile.write(expected_string)
141
137
  tempfile.close
138
+
139
+ expect(provider).not_to receive(:converge_by).with(/modifying #{tempfile.path} to source #{tempdir_path}/)
142
140
  end
143
141
 
144
142
  it "should preserve all the contents" do
@@ -165,6 +163,9 @@ EOF
165
163
  before do
166
164
  tempfile.write("a line\nanother line\n")
167
165
  tempfile.close
166
+
167
+ allow(provider).to receive(:converge_by).and_call_original
168
+ expect(provider).to receive(:converge_by).with(/modifying #{tempfile.path} to source #{tempdir_path}/).and_call_original
168
169
  end
169
170
 
170
171
  it "should preserve the original contents and add the source line" do
@@ -318,8 +319,17 @@ source #{tempdir_path}/*
318
319
 
319
320
  it "should delete network-script if it exists" do
320
321
  current_resource.device new_resource.device
321
- expect(File).to receive(:exist?).with(config_filename_ifcfg).and_return(true)
322
- expect(FileUtils).to receive(:rm_f).with(config_filename_ifcfg, :verbose => false)
322
+
323
+ [:exist?, :exists?, :writable?].each do |cmd|
324
+ # need to stub :writable? to make why_run? happy
325
+ allow(File).to receive(cmd).and_call_original
326
+ allow(File).to receive(cmd).with(config_filename_ifcfg).and_return(true)
327
+ end
328
+
329
+ # stub for Chef::Util::Backup#do_backup
330
+ expect(FileUtils).to receive(:cp)
331
+ .with(config_filename_ifcfg, /#{Chef::Config[:file_backup_path]}/, :preserve => true)
332
+ expect(File).to receive(:delete).with(config_filename_ifcfg)
323
333
 
324
334
  provider.run_action(:delete)
325
335
  end