chef 11.14.0.alpha.3-x86-mingw32 → 11.14.0.alpha.4-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +140 -99
  3. data/lib/chef/application.rb +80 -2
  4. data/lib/chef/application/apply.rb +1 -0
  5. data/lib/chef/application/client.rb +5 -0
  6. data/lib/chef/application/knife.rb +4 -0
  7. data/lib/chef/application/windows_service.rb +1 -0
  8. data/lib/chef/chef_fs/parallelizer/parallel_enumerable.rb +6 -4
  9. data/lib/chef/config.rb +5 -3
  10. data/lib/chef/exceptions.rb +2 -0
  11. data/lib/chef/http/basic_client.rb +1 -0
  12. data/lib/chef/knife.rb +1 -0
  13. data/lib/chef/platform/provider_mapping.rb +7 -0
  14. data/lib/chef/provider/env/windows.rb +2 -0
  15. data/lib/chef/provider/group/usermod.rb +1 -1
  16. data/lib/chef/provider/mount/solaris.rb +233 -0
  17. data/lib/chef/provider/package/apt.rb +9 -0
  18. data/lib/chef/provider/package/windows.rb +3 -0
  19. data/lib/chef/providers.rb +1 -0
  20. data/lib/chef/resource/mount.rb +6 -1
  21. data/lib/chef/util/path_helper.rb +94 -0
  22. data/lib/chef/version.rb +1 -1
  23. data/spec/functional/application_spec.rb +58 -0
  24. data/spec/functional/resource/mount_spec.rb +14 -11
  25. data/spec/integration/client/client_spec.rb +11 -0
  26. data/spec/integration/knife/common_options_spec.rb +9 -0
  27. data/spec/unit/application_spec.rb +157 -0
  28. data/spec/unit/http/basic_client_spec.rb +42 -0
  29. data/spec/unit/provider/env/windows_spec.rb +67 -0
  30. data/spec/unit/provider/group/usermod_spec.rb +2 -1
  31. data/spec/unit/provider/mount/mount_spec.rb +3 -3
  32. data/spec/unit/provider/mount/solaris_spec.rb +646 -0
  33. data/spec/unit/provider/package/apt_spec.rb +5 -0
  34. data/spec/unit/provider/package/windows_spec.rb +6 -0
  35. data/spec/unit/resource_reporter_spec.rb +2 -2
  36. data/spec/unit/util/path_helper_spec.rb +136 -0
  37. metadata +23 -16
@@ -211,6 +211,7 @@ class Chef
211
211
  def reconfigure(startup_parameters=[])
212
212
  configure_chef startup_parameters
213
213
  configure_logging
214
+ configure_proxy_environment_variables
214
215
 
215
216
  Chef::Config[:chef_server_url] = config[:chef_server_url] if config.has_key? :chef_server_url
216
217
  unless Chef::Config[:exception_handlers].any? {|h| Chef::Handler::ErrorReport === h}
@@ -195,13 +195,15 @@ class Chef
195
195
  process_one
196
196
  end
197
197
  end
198
- ensure
199
- # If someone called "first" or something that exits the enumerator
200
- # early, we want to make sure and throw away any extra results
201
- # (gracefully) so that the next enumerator can start over.
198
+ rescue
199
+ # If we exited early, perhaps due to any? finding a result, we want
200
+ # to make sure and throw away any extra results (gracefully) so that
201
+ # the next enumerator can start over.
202
202
  if !finished?
203
203
  stop
204
204
  end
205
+ raise
206
+ ensure
205
207
  @each_running = false
206
208
  end
207
209
  end
data/lib/chef/config.rb CHANGED
@@ -324,8 +324,8 @@ class Chef
324
324
  config_context :chef_zero do
325
325
  config_strict_mode true
326
326
  default(:enabled) { Chef::Config.local_mode }
327
- default :port, 8889
328
327
  default :host, 'localhost'
328
+ default :port, 8889
329
329
  end
330
330
  default :chef_server_url, "https://localhost:443"
331
331
 
@@ -363,8 +363,10 @@ class Chef
363
363
 
364
364
  # Whether or not to verify the SSL cert for HTTPS requests to the Chef
365
365
  # server API. If set to `true`, the server's cert will be validated
366
- # regardless of the :ssl_verify_mode setting.
367
- default :verify_api_cert, false
366
+ # regardless of the :ssl_verify_mode setting. This is set to `true` when
367
+ # running in local-mode.
368
+ # NOTE: This is a workaround until verify_peer is enabled by default.
369
+ default(:verify_api_cert) { Chef::Config.local_mode }
368
370
 
369
371
  # Path to the default CA bundle files.
370
372
  default :ssl_ca_path, nil
@@ -329,5 +329,7 @@ class Chef
329
329
  super "Unable to acquire lock. Waited #{duration} seconds for #{blocking_pid} to release."
330
330
  end
331
331
  end
332
+
333
+ class BadProxyURI < RuntimeError; end
332
334
  end
333
335
  end
@@ -98,6 +98,7 @@ class Chef
98
98
  end
99
99
 
100
100
  http_client.read_timeout = config[:rest_timeout]
101
+ http_client.open_timeout = config[:rest_timeout]
101
102
  http_client
102
103
  end
103
104
 
data/lib/chef/knife.rb CHANGED
@@ -394,6 +394,7 @@ class Chef
394
394
  if Chef::Config.local_mode && !Chef::Config.has_key?(:cookbook_path) && !Chef::Config.has_key?(:chef_repo_path)
395
395
  Chef::Config.chef_repo_path = Chef::Config.find_chef_repo_path(Dir.pwd)
396
396
  end
397
+ Chef::Config.chef_zero.host = config[:chef_zero_host] if config[:chef_zero_host]
397
398
  Chef::Config.chef_zero.port = config[:chef_zero_port] if config[:chef_zero_port]
398
399
 
399
400
  # Expand a relative path from the config directory. Config from command
@@ -276,6 +276,7 @@ class Chef
276
276
  :solaris => {},
277
277
  :openindiana => {
278
278
  :default => {
279
+ :mount => Chef::Provider::Mount::Solaris,
279
280
  :service => Chef::Provider::Service::Solaris,
280
281
  :package => Chef::Provider::Package::Ips,
281
282
  :cron => Chef::Provider::Cron::Solaris,
@@ -284,6 +285,7 @@ class Chef
284
285
  },
285
286
  :opensolaris => {
286
287
  :default => {
288
+ :mount => Chef::Provider::Mount::Solaris,
287
289
  :service => Chef::Provider::Service::Solaris,
288
290
  :package => Chef::Provider::Package::Ips,
289
291
  :cron => Chef::Provider::Cron::Solaris,
@@ -292,6 +294,7 @@ class Chef
292
294
  },
293
295
  :nexentacore => {
294
296
  :default => {
297
+ :mount => Chef::Provider::Mount::Solaris,
295
298
  :service => Chef::Provider::Service::Solaris,
296
299
  :package => Chef::Provider::Package::Solaris,
297
300
  :cron => Chef::Provider::Cron::Solaris,
@@ -300,6 +303,7 @@ class Chef
300
303
  },
301
304
  :omnios => {
302
305
  :default => {
306
+ :mount => Chef::Provider::Mount::Solaris,
303
307
  :service => Chef::Provider::Service::Solaris,
304
308
  :package => Chef::Provider::Package::Ips,
305
309
  :cron => Chef::Provider::Cron::Solaris,
@@ -309,6 +313,7 @@ class Chef
309
313
  },
310
314
  :solaris2 => {
311
315
  :default => {
316
+ :mount => Chef::Provider::Mount::Solaris,
312
317
  :service => Chef::Provider::Service::Solaris,
313
318
  :package => Chef::Provider::Package::Ips,
314
319
  :cron => Chef::Provider::Cron::Solaris,
@@ -316,6 +321,7 @@ class Chef
316
321
  :user => Chef::Provider::User::Solaris,
317
322
  },
318
323
  "< 5.11" => {
324
+ :mount => Chef::Provider::Mount::Solaris,
319
325
  :service => Chef::Provider::Service::Solaris,
320
326
  :package => Chef::Provider::Package::Solaris,
321
327
  :cron => Chef::Provider::Cron::Solaris,
@@ -325,6 +331,7 @@ class Chef
325
331
  },
326
332
  :smartos => {
327
333
  :default => {
334
+ :mount => Chef::Provider::Mount::Solaris,
328
335
  :service => Chef::Provider::Service::Solaris,
329
336
  :package => Chef::Provider::Package::SmartOS,
330
337
  :cron => Chef::Provider::Cron::Solaris,
@@ -34,6 +34,7 @@ class Chef
34
34
  end
35
35
  obj.variablevalue = @new_resource.value
36
36
  obj.put_
37
+ ENV[@new_resource.key_name] = @new_resource.value
37
38
  broadcast_env_change
38
39
  end
39
40
 
@@ -41,6 +42,7 @@ class Chef
41
42
  obj = env_obj(@new_resource.key_name)
42
43
  if obj
43
44
  obj.delete_
45
+ ENV.delete(@new_resource.key_name)
44
46
  broadcast_env_change
45
47
  end
46
48
  end
@@ -78,7 +78,7 @@ class Chef
78
78
 
79
79
  def append_flags
80
80
  case node[:platform]
81
- when "openbsd", "netbsd", "aix", "solaris2", "smartos"
81
+ when "openbsd", "netbsd", "aix", "solaris2", "smartos", "omnios"
82
82
  "-G"
83
83
  when "solaris", "suse", "opensuse"
84
84
  "-a -G"
@@ -0,0 +1,233 @@
1
+ #
2
+ # Author:: Hugo Fichter
3
+ # Author:: Lamont Granquist (<lamont@getchef.com>)
4
+ # Author:: Joshua Timberman (<joshua@getchef.com>)
5
+ # Copyright:: Copyright (c) 2009-2014 Chef Software, Inc
6
+ # License:: Apache License, Version 2.0
7
+ #
8
+ # Licensed under the Apache License, Version 2.0 (the "License");
9
+ # you may not use this file except in compliance with the License.
10
+ # You may obtain a copy of the License at
11
+ #
12
+ # http://www.apache.org/licenses/LICENSE-2.0
13
+ #
14
+ # Unless required by applicable law or agreed to in writing, software
15
+ # distributed under the License is distributed on an "AS IS" BASIS,
16
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ # See the License for the specific language governing permissions and
18
+ # limitations under the License.
19
+ #
20
+
21
+ require 'chef/provider/mount'
22
+ require 'chef/log'
23
+ require 'chef/mixin/shell_out'
24
+ require 'forwardable'
25
+
26
+ class Chef
27
+ class Provider
28
+ class Mount
29
+ class Solaris < Chef::Provider::Mount
30
+ include Chef::Mixin::ShellOut
31
+ extend Forwardable
32
+
33
+ VFSTAB = "/etc/vfstab".freeze
34
+
35
+ def_delegator :@new_resource, :device, :device
36
+ def_delegator :@new_resource, :device_type, :device_type
37
+ def_delegator :@new_resource, :dump, :dump
38
+ def_delegator :@new_resource, :fstype, :fstype
39
+ def_delegator :@new_resource, :mount_point, :mount_point
40
+ def_delegator :@new_resource, :options, :options
41
+ def_delegator :@new_resource, :pass, :pass
42
+
43
+ def load_current_resource
44
+ @current_resource = Chef::Resource::Mount.new(new_resource.name)
45
+ current_resource.mount_point(mount_point)
46
+ current_resource.device(device)
47
+ current_resource.device_type(device_type)
48
+ update_current_resource_state
49
+ end
50
+
51
+ def define_resource_requirements
52
+ requirements.assert(:mount, :remount) do |a|
53
+ a.assertion { !device_should_exist? || ::File.exist?(device) }
54
+ a.failure_message(Chef::Exceptions::Mount, "Device #{device} does not exist")
55
+ a.whyrun("Assuming device #{device} would have been created")
56
+ end
57
+
58
+ requirements.assert(:mount, :remount) do |a|
59
+ a.assertion { ::File.exist?(mount_point) }
60
+ a.failure_message(Chef::Exceptions::Mount, "Mount point #{mount_point} does not exist")
61
+ a.whyrun("Assuming mount point #{mount_point} would have been created")
62
+ end
63
+ end
64
+
65
+ def mount_fs
66
+ actual_options = options || []
67
+ actual_options.delete("noauto")
68
+ command = "mount -F #{fstype}"
69
+ command << " -o #{actual_options.join(',')}" unless actual_options.empty?
70
+ command << " #{device} #{mount_point}"
71
+ shell_out!(command)
72
+ end
73
+
74
+ def umount_fs
75
+ shell_out!("umount #{mount_point}")
76
+ end
77
+
78
+ def remount_fs
79
+ # FIXME: what about options like "-o remount,logging" to enable logging on a UFS device?
80
+ shell_out!("mount -o remount #{mount_point}")
81
+ end
82
+
83
+ def enable_fs
84
+ if !mount_options_unchanged?
85
+ # we are enabling because our options have changed, so disable first then re-enable.
86
+ # XXX: this should be refactored to be the responsibility of the caller
87
+ disable_fs if current_resource.enabled
88
+ end
89
+
90
+ auto = options.nil? || ! options.include?("noauto")
91
+ actual_options = unless options.nil?
92
+ options.delete("noauto")
93
+ options
94
+ end
95
+
96
+ autostr = auto ? 'yes' : 'no'
97
+ passstr = pass == 0 ? "-" : pass
98
+ optstr = (actual_options.nil? || actual_options.empty?) ? "-" : actual_options.join(',')
99
+
100
+ etc_tempfile do |f|
101
+ f.write(IO.read(VFSTAB).chomp)
102
+ f.puts("\n#{device}\t-\t#{mount_point}\t#{fstype}\t#{passstr}\t#{autostr}\t#{optstr}")
103
+ f.close
104
+ # move, preserving modes of destination file
105
+ mover = Chef::FileContentManagement::Deploy.strategy(true)
106
+ mover.deploy(f.path, VFSTAB)
107
+ end
108
+
109
+ end
110
+
111
+ def disable_fs
112
+ contents = []
113
+
114
+ found = false
115
+ ::File.readlines(VFSTAB).reverse_each do |line|
116
+ if !found && line =~ /^#{device_regex}\s+\S+\s+#{Regexp.escape(mount_point)}/
117
+ found = true
118
+ Chef::Log.debug("#{new_resource} is removed from vfstab")
119
+ next
120
+ end
121
+ contents << line
122
+ end
123
+
124
+ if found
125
+ etc_tempfile do |f|
126
+ f.write(contents.reverse.join(''))
127
+ f.close
128
+ # move, preserving modes of destination file
129
+ mover = Chef::FileContentManagement::Deploy.strategy(true)
130
+ mover.deploy(f.path, VFSTAB)
131
+ end
132
+ else
133
+ # this is likely some kind of internal error, since we should only call disable_fs when there
134
+ # the filesystem we want to disable is enabled.
135
+ Chef::Log.warn("#{new_resource} did not find the mountpoint to disable in the vfstab")
136
+ end
137
+ end
138
+
139
+ def etc_tempfile
140
+ yield Tempfile.open("vfstab", "/etc")
141
+ end
142
+
143
+ def mount_options_unchanged?
144
+ current_resource.fstype == fstype and
145
+ current_resource.options == options and
146
+ current_resource.dump == dump and
147
+ current_resource.pass == pass
148
+ end
149
+
150
+ def update_current_resource_state
151
+ current_resource.mounted(mounted?)
152
+ ( enabled, fstype, options, pass ) = read_vfstab_status
153
+ current_resource.enabled(enabled)
154
+ current_resource.fstype(fstype)
155
+ current_resource.options(options)
156
+ current_resource.pass(pass)
157
+ end
158
+
159
+ def enabled?
160
+ read_vfstab_status[0]
161
+ end
162
+
163
+ def mounted?
164
+ mounted = false
165
+ shell_out!("mount -v").stdout.each_line do |line|
166
+ # <device> on <mountpoint> type <fstype> <options> on <date>
167
+ # /dev/dsk/c1t0d0s0 on / type ufs read/write/setuid/devices/intr/largefiles/logging/xattr/onerror=panic/dev=700040 on Tue May 1 11:33:55 2012
168
+ case line
169
+ when /^#{device_regex}\s+on\s+#{Regexp.escape(mount_point)}\s+/
170
+ Chef::Log.debug("Special device #{device} is mounted as #{mount_point}")
171
+ mounted = true
172
+ when /^([\/\w]+)\son\s#{Regexp.escape(mount_point)}\s+/
173
+ Chef::Log.debug("Special device #{$1} is mounted as #{mount_point}")
174
+ mounted = false
175
+ end
176
+ end
177
+ mounted
178
+ end
179
+
180
+ private
181
+
182
+ def read_vfstab_status
183
+ # Check to see if there is a entry in /etc/vfstab. Last entry for a volume wins.
184
+ enabled = false
185
+ fstype = options = pass = nil
186
+ ::File.foreach(VFSTAB) do |line|
187
+ case line
188
+ when /^[#\s]/
189
+ next
190
+ # solaris /etc/vfstab format:
191
+ # device device mount FS fsck mount mount
192
+ # to mount to fsck point type pass at boot options
193
+ when /^#{device_regex}\s+[-\/\w]+\s+#{Regexp.escape(mount_point)}\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/
194
+ enabled = true
195
+ fstype = $1
196
+ options = $4
197
+ # Store the 'mount at boot' column from vfstab as the 'noauto' option
198
+ # in current_resource.options (linux style)
199
+ if $3 == "yes"
200
+ if options.nil? || options.empty?
201
+ options = "noauto"
202
+ else
203
+ options += ",noauto"
204
+ end
205
+ end
206
+ pass = ( $2 == "-" ) ? 0 : $2.to_i
207
+ Chef::Log.debug("Found mount #{device} to #{mount_point} in #{VFSTAB}")
208
+ next
209
+ when /^[-\/\w]+\s+[-\/\w]+\s+#{Regexp.escape(mount_point)}\s+/
210
+ # if we find a mountpoint on top of our mountpoint, then we are not enabled
211
+ enabled = false
212
+ Chef::Log.debug("Found conflicting mount point #{mount_point} in #{VFSTAB}")
213
+ end
214
+ end
215
+ [ enabled, fstype, options, pass ]
216
+ end
217
+
218
+ def device_should_exist?
219
+ !%w{tmpfs nfs ctfs proc mntfs objfs sharefs fd smbfs}.include?(fstype)
220
+ end
221
+
222
+ def device_regex
223
+ if ::File.symlink?(device)
224
+ "(?:#{Regexp.escape(device)}|#{Regexp.escape(::File.expand_path(::File.readlink(device),::File.dirname(device)))})"
225
+ else
226
+ Regexp.escape(device)
227
+ end
228
+ end
229
+
230
+ end
231
+ end
232
+ end
233
+ end
@@ -37,6 +37,15 @@ class Chef
37
37
  @current_resource
38
38
  end
39
39
 
40
+ def define_resource_requirements
41
+ super
42
+
43
+ requirements.assert(:all_actions) do |a|
44
+ a.assertion { !@new_resource.source }
45
+ a.failure_message(Chef::Exceptions::Package, 'apt package provider cannot handle source attribute. Use dpkg provider instead')
46
+ end
47
+ end
48
+
40
49
  def default_release_options
41
50
  # Use apt::Default-Release option only if provider was explicitly defined
42
51
  "-o APT::Default-Release=#{@new_resource.default_release}" if @new_resource.provider && @new_resource.default_release
@@ -18,6 +18,7 @@
18
18
 
19
19
  require 'chef/resource/windows_package'
20
20
  require 'chef/provider/package'
21
+ require 'chef/util/path_helper'
21
22
 
22
23
  class Chef
23
24
  class Provider
@@ -32,6 +33,8 @@ class Chef
32
33
 
33
34
  # load_current_resource is run in Chef::Provider#run_action when not in whyrun_mode?
34
35
  def load_current_resource
36
+ @new_resource.source(Chef::Util::PathHelper.validate_path(@new_resource.source))
37
+
35
38
  @current_resource = Chef::Resource::WindowsPackage.new(@new_resource.name)
36
39
  @current_resource.version(package_provider.installed_version)
37
40
  @new_resource.version(package_provider.package_version)
@@ -103,6 +103,7 @@ require 'chef/provider/group/windows'
103
103
 
104
104
  require 'chef/provider/mount/mount'
105
105
  require 'chef/provider/mount/aix'
106
+ require 'chef/provider/mount/solaris'
106
107
  require 'chef/provider/mount/windows'
107
108
 
108
109
  require 'chef/provider/deploy/revision'
@@ -65,10 +65,15 @@ class Chef
65
65
 
66
66
  def device_type(arg=nil)
67
67
  real_arg = arg.kind_of?(String) ? arg.to_sym : arg
68
+ valid_devices = if RUBY_PLATFORM =~ /solaris/i
69
+ [ :device ]
70
+ else
71
+ [ :device, :label, :uuid ]
72
+ end
68
73
  set_or_return(
69
74
  :device_type,
70
75
  real_arg,
71
- :equal_to => [ :device, :label, :uuid ]
76
+ :equal_to => valid_devices
72
77
  )
73
78
  end
74
79