chef 16.0.275-universal-mingw32 → 16.0.287-universal-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -0
  3. data/lib/chef/application/apply.rb +1 -1
  4. data/lib/chef/application/exit_code.rb +2 -2
  5. data/lib/chef/chef_fs/chef_fs_data_store.rb +3 -3
  6. data/lib/chef/chef_fs/file_system/chef_server/policies_dir.rb +1 -1
  7. data/lib/chef/chef_fs/file_system/chef_server/rest_list_dir.rb +1 -1
  8. data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +1 -1
  9. data/lib/chef/cookbook_version.rb +4 -4
  10. data/lib/chef/deprecated.rb +1 -1
  11. data/lib/chef/dsl/platform_introspection.rb +1 -1
  12. data/lib/chef/knife/bootstrap.rb +6 -6
  13. data/lib/chef/knife/{user_invite_recind.rb → user_invite_rescind.rb} +6 -6
  14. data/lib/chef/mixin/create_path.rb +8 -8
  15. data/lib/chef/mixin/properties.rb +2 -0
  16. data/lib/chef/node/mixin/deep_merge_cache.rb +7 -7
  17. data/lib/chef/provider/launchd.rb +18 -24
  18. data/lib/chef/provider/service/macosx.rb +4 -2
  19. data/lib/chef/provider/service/simple.rb +3 -3
  20. data/lib/chef/provider/windows_task.rb +1 -1
  21. data/lib/chef/resource/launchd.rb +4 -4
  22. data/lib/chef/resource/macos_userdefaults.rb +3 -3
  23. data/lib/chef/resource/msu_package.rb +1 -1
  24. data/lib/chef/resource/windows_firewall_rule.rb +2 -2
  25. data/lib/chef/resource/windows_package.rb +2 -2
  26. data/lib/chef/resource/windows_printer.rb +1 -1
  27. data/lib/chef/resource/windows_share.rb +2 -2
  28. data/lib/chef/resource/windows_task.rb +13 -13
  29. data/lib/chef/util/dsc/lcm_output_parser.rb +3 -3
  30. data/lib/chef/version.rb +1 -1
  31. data/lib/chef/win32/api/file.rb +18 -18
  32. data/lib/chef/win32/process.rb +2 -2
  33. data/spec/functional/resource/user/dscl_spec.rb +1 -1
  34. data/spec/functional/resource/user/mac_user_spec.rb +1 -1
  35. data/spec/support/shared/functional/file_resource.rb +1 -1
  36. data/spec/unit/knife/role_env_run_list_add_spec.rb +6 -6
  37. data/spec/unit/knife/role_env_run_list_clear_spec.rb +4 -4
  38. data/spec/unit/knife/role_env_run_list_remove_spec.rb +4 -4
  39. data/spec/unit/knife/role_env_run_list_replace_spec.rb +4 -4
  40. data/spec/unit/knife/role_env_run_list_set_spec.rb +4 -4
  41. data/spec/unit/knife/role_run_list_add_spec.rb +6 -6
  42. data/spec/unit/knife/role_run_list_clear_spec.rb +4 -4
  43. data/spec/unit/knife/role_run_list_remove_spec.rb +4 -4
  44. data/spec/unit/knife/role_run_list_replace_spec.rb +4 -4
  45. data/spec/unit/knife/role_run_list_set_spec.rb +4 -4
  46. data/spec/unit/provider/git_spec.rb +3 -3
  47. data/spec/unit/provider/launchd_spec.rb +8 -8
  48. data/spec/unit/provider/osx_profile_spec.rb +2 -2
  49. data/spec/unit/provider/package/msu_spec.rb +3 -3
  50. data/spec/unit/provider/service/gentoo_service_spec.rb +1 -1
  51. data/spec/unit/provider_resolver_spec.rb +9 -9
  52. data/spec/unit/resource/windows_package_spec.rb +10 -0
  53. data/spec/unit/run_context_spec.rb +1 -1
  54. metadata +7 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: abadb83dc708a6808d7914030f131699fcc00343ddb453c836b0c0ae12748689
4
- data.tar.gz: b0fe5ae006d654435d0a5c71df6e1aa44007849ff473fa94d9bfa864a378b716
3
+ metadata.gz: b1352baaafdadf59913e7973a1c52ead1fa8adcdde5d844118393409c545f512
4
+ data.tar.gz: '09c4450fbc67d1059c9c8b1def5697acf90280bc95005031000bdea6c04aa35a'
5
5
  SHA512:
6
- metadata.gz: 24d18a8d55ec79197b0f332c9118c16df582a43c2fa7274cc8575ec2831830e0303ad33809aee5a08554775a32aa7ae5932781ce6548df8e54fc3cc0baebe6f4
7
- data.tar.gz: 5ffedd46cdbcf844b732f70cff4313f4b6464fe5f42989db36612652faf3a2ecabcc191a7b2537fc78338d8999ae1cb3bb14ac66459372c4a45dcc89a893dc3a
6
+ metadata.gz: 0fe3a34cd5e9563490331baab2acdddc680234113d870ed8d22887233e6899ea4faa9fe645916935be6906cd5417f59b3919651a5a0757f529fe766392420756
7
+ data.tar.gz: 65f25ac64ac1c1c9a2907052aa6576d9421357e34ac9300038d9ca2cd4ebefe33154857b24fa56ae055655ff49a2a8aee808bcd6f0b405dc664cacdb0844477a
data/Gemfile CHANGED
@@ -22,6 +22,9 @@ end
22
22
 
23
23
  gem "cheffish", ">= 14"
24
24
 
25
+ # avoid bringing in the new http 4 gem that comes with other ffi baggage which breaks builds
26
+ gem "chef-telemetry", "=1.0.3"
27
+
25
28
  group(:omnibus_package) do
26
29
  gem "appbundler"
27
30
  gem "rb-readline"
@@ -232,7 +232,7 @@ class Chef::Application::Apply < Chef::Application
232
232
  Chef::Application.fatal!("#{e.class}: #{e.message}", e)
233
233
  end
234
234
 
235
- # Get this party started
235
+ # Get this party started
236
236
  def run(enforce_license = false)
237
237
  reconfigure
238
238
  check_license_acceptance if enforce_license
@@ -139,8 +139,8 @@ class Chef
139
139
  def notify_on_deprecation(message)
140
140
  Chef.deprecated(:exit_code, message)
141
141
  rescue Chef::Exceptions::DeprecatedFeatureError
142
- # Have to rescue this, otherwise this unhandled error preempts
143
- # the current exit code assignment.
142
+ # Have to rescue this, otherwise this unhandled error preempts
143
+ # the current exit code assignment.
144
144
  end
145
145
 
146
146
  def non_standard_exit_code_warning(exit_code)
@@ -204,7 +204,7 @@ class Chef
204
204
  @memory_store.create(path, name, data, *options)
205
205
 
206
206
  elsif path[0] == "cookbooks" && path.length == 2
207
- # Do nothing. The entry gets created when the cookbook is created.
207
+ # Do nothing. The entry gets created when the cookbook is created.
208
208
 
209
209
  # /policy_groups/GROUP/policies/NAME
210
210
  elsif path[0] == "policy_groups" && path[2] == "policies"
@@ -724,8 +724,8 @@ class Chef
724
724
  path[-1] = "#{path[-1]}.json"
725
725
  end
726
726
 
727
- # /acls/containers|nodes|... do NOT drop into the next elsif, and do
728
- # not get .json appended
727
+ # /acls/containers|nodes|... do NOT drop into the next elsif, and do
728
+ # not get .json appended
729
729
 
730
730
  # /nodes|clients|.../x.json
731
731
  elsif path.length == 2
@@ -66,7 +66,7 @@ class Chef
66
66
  # }
67
67
  # }
68
68
  def children
69
- # Grab the names of the children, append json, and make child entries
69
+ # Grab the names of the children, append json, and make child entries
70
70
  @children ||= begin
71
71
  result = []
72
72
  data = root.get_json(api_path)
@@ -71,7 +71,7 @@ class Chef
71
71
  # Children are foo.json and bar.json in this case.
72
72
  #
73
73
  def children
74
- # Grab the names of the children, append json, and make child entries
74
+ # Grab the names of the children, append json, and make child entries
75
75
  @children ||= root.get_json(api_path).keys.sort.map do |key|
76
76
  make_child_entry(key, true)
77
77
  end
@@ -19,7 +19,7 @@ class Chef
19
19
  def children
20
20
  result = []
21
21
  seen = {}
22
- # If multiple things have the same name, the first one wins.
22
+ # If multiple things have the same name, the first one wins.
23
23
  multiplexed_dirs.each do |dir|
24
24
  dir.children.each do |child|
25
25
  if seen[child.name]
@@ -358,10 +358,10 @@ class Chef
358
358
 
359
359
  # extract the preference part from the path.
360
360
  if manifest_record_path =~ %r{(#{Regexp.escape(segment.to_s)}/[^/]+/#{Regexp.escape(dirname)})/.+$}
361
- # Note the specificy_dirname includes the segment and
362
- # dirname argument as above, which is what
363
- # preferences_for_path returns. It could be
364
- # "files/ubuntu-9.10/dirname", for example.
361
+ # Note the specificy_dirname includes the segment and
362
+ # dirname argument as above, which is what
363
+ # preferences_for_path returns. It could be
364
+ # "files/ubuntu-9.10/dirname", for example.
365
365
  specificity_dirname = $1
366
366
 
367
367
  # Record the specificity_dirname only if it's in the list of
@@ -72,7 +72,7 @@ class Chef
72
72
  # Just in case someone uses a symbol in the config by mistake.
73
73
  silence_spec = silence_spec.to_s
74
74
  end
75
- # Check for a silence by deprecation name, or by location.
75
+ # Check for a silence by deprecation name, or by location.
76
76
  self.class.deprecation_key == silence_spec || self.class.deprecation_id.to_s == silence_spec || "chef-#{self.class.deprecation_id}" == silence_spec.downcase || location.include?(silence_spec)
77
77
  end
78
78
  # check if this warning has been silenced by inline comment.
@@ -168,7 +168,7 @@ class Chef
168
168
  has_platform
169
169
  end
170
170
 
171
- # Implementation class for determining platform family dependent values
171
+ # Implementation class for determining platform family dependent values
172
172
  class PlatformFamilyDependentValue
173
173
 
174
174
  # Create a platform family dependent value object.
@@ -93,12 +93,12 @@ class Chef
93
93
  description: "For WinRM basic authentication when using the 'ssl' auth method.",
94
94
  boolean: true
95
95
 
96
- # This option was provided in knife bootstrap windows winrm,
97
- # but it is ignored in knife-windows/WinrmSession, and so remains unimplemeneted here.
98
- # option :kerberos_keytab_file,
99
- # :short => "-T KEYTAB_FILE",
100
- # :long => "--keytab-file KEYTAB_FILE",
101
- # :description => "The Kerberos keytab file used for authentication"
96
+ # This option was provided in knife bootstrap windows winrm,
97
+ # but it is ignored in knife-windows/WinrmSession, and so remains unimplemeneted here.
98
+ # option :kerberos_keytab_file,
99
+ # :short => "-T KEYTAB_FILE",
100
+ # :long => "--keytab-file KEYTAB_FILE",
101
+ # :description => "The Kerberos keytab file used for authentication"
102
102
 
103
103
  option :kerberos_realm,
104
104
  short: "-R KERBEROS_REALM",
@@ -20,14 +20,14 @@ require_relative "../knife"
20
20
 
21
21
  class Chef
22
22
  class Knife
23
- class UserInviteRecind < Chef::Knife
23
+ class UserInviteRescind < Chef::Knife
24
24
  category "user"
25
- banner "knife user invite recind [USERNAMES] (options)"
25
+ banner "knife user invite rescind [USERNAMES] (options)"
26
26
 
27
27
  option :all,
28
28
  short: "-a",
29
29
  long: "--all",
30
- description: "Recind all invites!"
30
+ description: "Rescind all invites!"
31
31
 
32
32
  def run
33
33
  if (name_args.length < 1) && ! config.key?(:all)
@@ -36,18 +36,18 @@ class Chef
36
36
  exit 1
37
37
  end
38
38
 
39
- # To recind we need to send a DELETE to association_requests/INVITE_ID
39
+ # To rescind we need to send a DELETE to association_requests/INVITE_ID
40
40
  # For user friendliness we look up the invite ID based on username.
41
41
  @invites = {}
42
42
  usernames = name_args
43
43
  rest.get_rest("association_requests").each { |i| @invites[i["username"]] = i["id"] }
44
44
  if config[:all]
45
- ui.confirm("Are you sure you want to recind all association requests")
45
+ ui.confirm("Are you sure you want to rescind all association requests")
46
46
  @invites.each do |u, i|
47
47
  rest.delete_rest("association_requests/#{i}")
48
48
  end
49
49
  else
50
- ui.confirm("Are you sure you want to recind the association requests for: #{usernames.join(", ")}")
50
+ ui.confirm("Are you sure you want to rescind the association requests for: #{usernames.join(", ")}")
51
51
  usernames.each do |u|
52
52
  if @invites.key?(u)
53
53
  rest.delete_rest("association_requests/#{@invites[u]}")
@@ -53,14 +53,14 @@ class Chef
53
53
  private
54
54
 
55
55
  def create_dir(path)
56
- # When doing multithreaded downloads into the file cache, the following
57
- # interleaving raises an error here:
58
- #
59
- # thread1 thread2
60
- # File.directory?(create_path) <- false
61
- # File.directory?(create_path) <- false
62
- # Dir.mkdir(create_path)
63
- # Dir.mkdir(create_path) <- raises Errno::EEXIST
56
+ # When doing multithreaded downloads into the file cache, the following
57
+ # interleaving raises an error here:
58
+ #
59
+ # thread1 thread2
60
+ # File.directory?(create_path) <- false
61
+ # File.directory?(create_path) <- false
62
+ # Dir.mkdir(create_path)
63
+ # Dir.mkdir(create_path) <- raises Errno::EEXIST
64
64
  Chef::Log.trace("Creating directory #{path}")
65
65
  Dir.mkdir(path)
66
66
  rescue Errno::EEXIST
@@ -340,6 +340,7 @@ class Chef
340
340
  # can also be overridden). Exclude has priority over include, although the caller is likely better
341
341
  # off doing the set arithmetic themselves for explicitness.
342
342
  #
343
+ # ```ruby
343
344
  # action :doit do
344
345
  # # use it inside a block
345
346
  # file "/etc/whatever.xyz" do
@@ -350,6 +351,7 @@ class Chef
350
351
  # r = declare_resource(:file, "etc/whatever.xyz")
351
352
  # r.copy_properties_from(new_resource, :owner, :group, :mode)
352
353
  # end
354
+ # ```
353
355
  #
354
356
  # @param other [Object] the other object (Chef::Resource) which implements the properties API
355
357
  # @param includes [Array<Symbol>] splat-args list of symbols of the properties to copy.
@@ -19,9 +19,9 @@ class Chef
19
19
  class Node
20
20
  module Mixin
21
21
  module DeepMergeCache
22
- # Cache of deep merged values by top-level key. This is a simple hash which has keys that are the
23
- # top-level keys of the node object, and we save the computed deep-merge for that key here. There is
24
- # no cache of subtrees.
22
+ # Cache of deep merged values by top-level key. This is a simple hash which has keys that are the
23
+ # top-level keys of the node object, and we save the computed deep-merge for that key here. There is
24
+ # no cache of subtrees.
25
25
  attr_accessor :deep_merge_cache
26
26
 
27
27
  def initialize
@@ -31,10 +31,10 @@ class Chef
31
31
  @deep_merge_cache = {}
32
32
  end
33
33
 
34
- # Invalidate a key in the deep_merge_cache. If called with nil, or no arg, this will invalidate
35
- # the entire deep_merge cache. In the case of the user doing node.default['foo']['bar']['baz']=
36
- # that eventually results in a call to reset_cache('foo') here. A node.default=hash_thing call
37
- # must invalidate the entire cache and re-deep-merge the entire node object.
34
+ # Invalidate a key in the deep_merge_cache. If called with nil, or no arg, this will invalidate
35
+ # the entire deep_merge cache. In the case of the user doing node.default['foo']['bar']['baz']=
36
+ # that eventually results in a call to reset_cache('foo') here. A node.default=hash_thing call
37
+ # must invalidate the entire cache and re-deep-merge the entire node object.
38
38
  def reset_cache(path = nil)
39
39
  if path.nil?
40
40
  deep_merge_cache.clear
@@ -36,7 +36,6 @@ class Chef
36
36
  label
37
37
  mode
38
38
  owner
39
- path
40
39
  source
41
40
  session_type
42
41
  type
@@ -44,7 +43,6 @@ class Chef
44
43
 
45
44
  def load_current_resource
46
45
  current_resource = Chef::Resource::Launchd.new(new_resource.name)
47
- @path = path ? path : gen_path_from_type
48
46
  end
49
47
 
50
48
  def gen_path_from_type
@@ -90,25 +88,16 @@ class Chef
90
88
 
91
89
  def manage_plist(action)
92
90
  if source
93
- cookbook_file @path do
94
- cookbook_name = cookbook if cookbook
95
- name(@path) if @path
96
- backup(backup) if backup
97
- group(group) if group
98
- mode(mode) if mode
99
- owner(owner) if owner
100
- source(source) if source
91
+ cookbook_file path do
92
+ cookbook_name = new_resource.cookbook if new_resource.cookbook
93
+ copy_properties_from(new_resource, :backup, :group, :mode, :owner, :source)
101
94
  action(action)
102
95
  only_if { manage_agent?(action) }
103
96
  end
104
97
  else
105
- file @path do
106
- name(@path) if @path
107
- backup(backup) if backup
108
- content(content) if content?
109
- group(group) if group
110
- mode(mode) if mode
111
- owner(owner) if owner
98
+ file path do
99
+ copy_properties_from(new_resource, :backup, :group, :mode, :owner)
100
+ content(file_content) if file_content?
112
101
  action(action)
113
102
  only_if { manage_agent?(action) }
114
103
  end
@@ -116,11 +105,11 @@ class Chef
116
105
  end
117
106
 
118
107
  def manage_service(action)
108
+ plist_path = path
119
109
  macosx_service label do
120
- name(label) if label
121
- service_name(label) if label
122
- plist(@path) if @path
123
- session_type(session_type) if session_type
110
+ service_name(new_resource.label) if new_resource.label
111
+ plist(plist_path) if plist_path
112
+ copy_properties_from(new_resource, :session_type)
124
113
  action(action)
125
114
  only_if { manage_agent?(action) }
126
115
  end
@@ -155,11 +144,11 @@ class Chef
155
144
  end
156
145
  end
157
146
 
158
- def content?
159
- !!content
147
+ def file_content?
148
+ !!file_content
160
149
  end
161
150
 
162
- def content
151
+ def file_content
163
152
  plist_hash = new_resource.plist_hash || gen_hash
164
153
  ::Plist::Emit.dump(plist_hash) unless plist_hash.nil?
165
154
  end
@@ -215,6 +204,11 @@ class Chef
215
204
  memo[val] = new_resource.send(key) if new_resource.send(key)
216
205
  end
217
206
  end
207
+
208
+ # @api private
209
+ def path
210
+ @path = new_resource.path ? new_resource.path : gen_path_from_type
211
+ end
218
212
  end
219
213
  end
220
214
  end
@@ -56,8 +56,10 @@ class Chef
56
56
  if @console_user
57
57
  @console_user = Etc.getpwuid(::File.stat("/dev/console").uid).name
58
58
  logger.trace("#{new_resource} console_user: '#{@console_user}'")
59
- cmd = "su -l"
60
- @base_user_cmd = cmd + "#{@console_user} -c"
59
+
60
+ @base_user_cmd = "su -l #{@console_user} -c"
61
+ logger.trace("#{new_resource} base_user_cmd: '#{@base_user_cmd}'")
62
+
61
63
  # Default LaunchAgent session should be Aqua
62
64
  @session_type = "Aqua" if @session_type.nil?
63
65
  end
@@ -117,9 +117,9 @@ class Chef
117
117
  logger.trace("#{@new_resource} is running")
118
118
  end
119
119
  rescue Mixlib::ShellOut::ShellCommandFailed, SystemCallError
120
- # ShellOut sometimes throws different types of Exceptions than ShellCommandFailed.
121
- # Temporarily catching different types of exceptions here until we get Shellout fixed.
122
- # TODO: Remove the line before one we get the ShellOut fix.
120
+ # ShellOut sometimes throws different types of Exceptions than ShellCommandFailed.
121
+ # Temporarily catching different types of exceptions here until we get Shellout fixed.
122
+ # TODO: Remove the line before one we get the ShellOut fix.
123
123
  @status_load_success = false
124
124
  @current_resource.running false
125
125
  nil
@@ -424,7 +424,7 @@ class Chef
424
424
  when TaskScheduler::AT_LOGON
425
425
  # TODO: handle option for this trigger
426
426
  when TaskScheduler::AT_SYSTEMSTART
427
- # TODO: handle option for this trigger
427
+ # TODO: handle option for this trigger
428
428
  end
429
429
  end
430
430
 
@@ -76,20 +76,20 @@ class Chef
76
76
  property :start_calendar_interval, [Hash, Array],
77
77
  description: "A Hash (similar to crontab) that defines the calendar frequency at which a job is started or an Array.",
78
78
  coerce: proc { |type|
79
- # Coerce into an array of hashes to make validation easier
79
+ # Coerce into an array of hashes to make validation easier
80
80
  array = if type.is_a?(Array)
81
81
  type
82
82
  else
83
83
  [type]
84
84
  end
85
85
 
86
- # Check to make sure that our array only has hashes
86
+ # Check to make sure that our array only has hashes
87
87
  unless array.all? { |obj| obj.is_a?(Hash) }
88
88
  error_msg = "start_calendar_interval must be a single hash or an array of hashes!"
89
89
  raise Chef::Exceptions::ValidationFailed, error_msg
90
90
  end
91
91
 
92
- # Make sure the hashes don't have any incorrect keys/values
92
+ # Make sure the hashes don't have any incorrect keys/values
93
93
  array.each do |entry|
94
94
  allowed_keys = %w{Minute Hour Day Weekday Month}
95
95
  unless entry.keys.all? { |key| allowed_keys.include?(key) }
@@ -105,7 +105,7 @@ class Chef
105
105
  end
106
106
  end
107
107
 
108
- # Don't return array if we only have one entry
108
+ # Don't return array if we only have one entry
109
109
  if array.size == 1
110
110
  array.first
111
111
  else
@@ -62,9 +62,9 @@ class Chef
62
62
  desired_state: false,
63
63
  skip_docs: true
64
64
 
65
- # coerce various ways of representing a boolean into either 0 (false) or 1 (true)
66
- # which is what the defaults CLI expects. Why? Well defaults itself accepts a few
67
- # different formats, but when you do a read command it all comes back as 1 or 0.
65
+ # coerce various ways of representing a boolean into either 0 (false) or 1 (true)
66
+ # which is what the defaults CLI expects. Why? Well defaults itself accepts a few
67
+ # different formats, but when you do a read command it all comes back as 1 or 0.
68
68
  def coerce_booleans(val)
69
69
  return 1 if [true, "TRUE", "1", "true", "YES", "yes"].include?(val)
70
70
  return 0 if [false, "FALSE", "0", "false", "NO", "no"].include?(val)
@@ -39,7 +39,7 @@ class Chef
39
39
 
40
40
  # This is the same property as the main package resource except it has the skip docs set to true
41
41
  # This resource abuses the package resource by storing the versions of all the cabs in the MSU file
42
- # in the version attribute from load current value even though those aren't technically the versio of the
42
+ # in the version attribute from load current value even though those aren't technically the version of the
43
43
  # msu. Since the user wouldn't actually set this we don't want it on the docs site.
44
44
  property :version, [String, Array],
45
45
  skip_docs: true,
@@ -93,7 +93,7 @@ class Chef
93
93
  description: "The local address the firewall rule applies to."
94
94
 
95
95
  property :local_port, [String, Integer, Array],
96
- # split various formats of comma separated lists and provide a sorted array of strings to match PS output
96
+ # split various formats of comma separated lists and provide a sorted array of strings to match PS output
97
97
  coerce: proc { |d| d.is_a?(String) ? d.split(/\s*,\s*/).sort : Array(d).sort.map(&:to_s) },
98
98
  description: "The local port the firewall rule applies to."
99
99
 
@@ -101,7 +101,7 @@ class Chef
101
101
  description: "The remote address the firewall rule applies to."
102
102
 
103
103
  property :remote_port, [String, Integer, Array],
104
- # split various formats of comma separated lists and provide a sorted array of strings to match PS output
104
+ # split various formats of comma separated lists and provide a sorted array of strings to match PS output
105
105
  coerce: proc { |d| d.is_a?(String) ? d.split(/\s*,\s*/).sort : Array(d).sort.map(&:to_s) },
106
106
  description: "The remote port the firewall rule applies to."
107
107
 
@@ -104,8 +104,8 @@ class Chef
104
104
  description: "An optional property to set the package name if it differs from the resource block's name.",
105
105
  identity: true
106
106
 
107
- property :version, String,
108
- description: "The version of a package to be installed or upgraded."
107
+ # we don't redefine the version property as a string here since we store the current value
108
+ # of version and that may be an array if multiple versions of a package are present on the system
109
109
 
110
110
  # windows can't take array options yet
111
111
  property :options, String,
@@ -62,7 +62,7 @@ class Chef
62
62
 
63
63
  property :driver_name, String,
64
64
  description: "The exact name of printer driver installed on the system.",
65
- required: true
65
+ required: [:create]
66
66
 
67
67
  property :location, String,
68
68
  description: "Printer location, such as `Fifth floor copy room`."
@@ -187,8 +187,8 @@ class Chef
187
187
  [f_users, c_users, r_users]
188
188
  end
189
189
 
190
- # local names are returned from Get-SmbShareAccess in the full format MACHINE\\NAME
191
- # but users of this resource would simply say NAME so we need to strip the values for comparison
190
+ # local names are returned from Get-SmbShareAccess in the full format MACHINE\\NAME
191
+ # but users of this resource would simply say NAME so we need to strip the values for comparison
192
192
  def stripped_account(name)
193
193
  name.slice!("#{node["hostname"]}\\")
194
194
  name
@@ -272,16 +272,16 @@ class Chef
272
272
 
273
273
  private
274
274
 
275
- ## Resource is not idempotent when day, start_day is not provided with frequency :weekly
276
- ## we set start_day when not given by user as current date based on which we set the day property for current current date day is monday ..
277
- ## we set the monday as the day so at next run when new_resource.day is nil and current_resource day is monday due to which udpate gets called
275
+ ## Resource is not idempotent when day, start_day is not provided with frequency :weekly
276
+ ## we set start_day when not given by user as current date based on which we set the day property for current current date day is monday ..
277
+ ## we set the monday as the day so at next run when new_resource.day is nil and current_resource day is monday due to which udpate gets called
278
278
  def idempotency_warning_for_frequency_weekly(day, start_day)
279
279
  if start_day.nil? && day.nil?
280
280
  logger.warn "To maintain idempotency for frequency :weekly provide start_day, start_time and day."
281
281
  end
282
282
  end
283
283
 
284
- # Validate the passed value is numeric values only if it is a string
284
+ # Validate the passed value is numeric values only if it is a string
285
285
  def numeric_value_in_string?(val)
286
286
  return true if Integer(val)
287
287
  rescue ArgumentError
@@ -307,7 +307,7 @@ class Chef
307
307
  end
308
308
  end
309
309
 
310
- # returns true if frequency_modifer has values First, second, third, fourth, last, lastday
310
+ # returns true if frequency_modifer has values First, second, third, fourth, last, lastday
311
311
  def frequency_modifier_includes_days_of_weeks?(frequency_modifier)
312
312
  frequency_modifier = frequency_modifier.to_s.split(",")
313
313
  frequency_modifier.map! { |value| value.strip.upcase }
@@ -322,7 +322,7 @@ class Chef
322
322
  raise ArgumentError, "Invalid value passed for `random_delay`. Please pass seconds as an Integer (e.g. 60) or a String with numeric values only (e.g. '60')." unless numeric_value_in_string?(random_delay)
323
323
  end
324
324
 
325
- # @todo when we drop ruby 2.3 support this should be converted to .match?() instead of =~f
325
+ # @todo when we drop ruby 2.3 support this should be converted to .match?() instead of =~f
326
326
  def validate_start_day(start_day, frequency)
327
327
  if start_day && frequency == :none
328
328
  raise ArgumentError, "`start_day` property is not supported with frequency: #{frequency}"
@@ -334,7 +334,7 @@ class Chef
334
334
  end
335
335
  end
336
336
 
337
- # @todo when we drop ruby 2.3 support this should be converted to .match?() instead of =~
337
+ # @todo when we drop ruby 2.3 support this should be converted to .match?() instead of =~
338
338
  def validate_start_time(start_time, frequency)
339
339
  if start_time
340
340
  raise ArgumentError, "`start_time` property is not supported with `frequency :none`" if frequency == :none
@@ -434,7 +434,7 @@ class Chef
434
434
  end
435
435
  end
436
436
 
437
- # This method returns true if day has values from 1-31 which is a days of moths and used with frequency :monthly
437
+ # This method returns true if day has values from 1-31 which is a days of moths and used with frequency :monthly
438
438
  def days_includes_days_of_months?(days)
439
439
  days.map! { |day| day.to_s.strip.downcase }
440
440
  (days - VALID_DAYS_OF_MONTH).empty?
@@ -452,11 +452,11 @@ class Chef
452
452
  end
453
453
  end
454
454
 
455
- # Converts the number of seconds to an ISO8601 duration format and returns it.
456
- # Ref : https://github.com/arnau/ISO8601/blob/master/lib/iso8601/duration.rb#L18-L23
457
- # e.g.
458
- # ISO8601::Duration.new(65707200).to_s
459
- # returns 'PT65707200S'
455
+ # Converts the number of seconds to an ISO8601 duration format and returns it.
456
+ # Ref : https://github.com/arnau/ISO8601/blob/master/lib/iso8601/duration.rb#L18-L23
457
+ # e.g.
458
+ # ISO8601::Duration.new(65707200).to_s
459
+ # returns 'PT65707200S'
460
460
  def sec_to_dur(seconds)
461
461
  ISO8601::Duration.new(seconds.to_i).to_s
462
462
  end
@@ -160,9 +160,9 @@ class Chef
160
160
 
161
161
  def self.parse_line(line)
162
162
  if match = line.match(/^.*?:.*?:\s*LCM:\s*\[(.*?)\](.*)/)
163
- # If the line looks like
164
- # What If: [machinename]: LCM: [op_action op_type] message
165
- # extract op_action, op_type, and message
163
+ # If the line looks like
164
+ # What If: [machinename]: LCM: [op_action op_type] message
165
+ # extract op_action, op_type, and message
166
166
  operation, info = match.captures
167
167
  op_action, op_type = operation.strip.split(" ").map { |m| m.downcase.to_sym }
168
168
  else
@@ -23,7 +23,7 @@ require_relative "version_string"
23
23
 
24
24
  class Chef
25
25
  CHEF_ROOT = File.expand_path("../..", __FILE__)
26
- VERSION = Chef::VersionString.new("16.0.275")
26
+ VERSION = Chef::VersionString.new("16.0.287")
27
27
  end
28
28
 
29
29
  #
@@ -461,22 +461,22 @@ BOOL WINAPI DeviceIoControl(
461
461
  =end
462
462
  safe_attach_function :DeviceIoControl, %i{HANDLE DWORD LPVOID DWORD LPVOID DWORD LPDWORD pointer}, :BOOL
463
463
 
464
- # BOOL WINAPI DeleteVolumeMountPoint(
465
- # _In_ LPCTSTR lpszVolumeMountPoint
466
- # );
464
+ # BOOL WINAPI DeleteVolumeMountPoint(
465
+ # _In_ LPCTSTR lpszVolumeMountPoint
466
+ # );
467
467
  safe_attach_function :DeleteVolumeMountPointW, [:LPCTSTR], :BOOL
468
468
 
469
- # BOOL WINAPI SetVolumeMountPoint(
470
- # _In_ LPCTSTR lpszVolumeMountPoint,
471
- # _In_ LPCTSTR lpszVolumeName
472
- # );
469
+ # BOOL WINAPI SetVolumeMountPoint(
470
+ # _In_ LPCTSTR lpszVolumeMountPoint,
471
+ # _In_ LPCTSTR lpszVolumeName
472
+ # );
473
473
  safe_attach_function :SetVolumeMountPointW, %i{LPCTSTR LPCTSTR}, :BOOL
474
474
 
475
- # BOOL WINAPI GetVolumeNameForVolumeMountPoint(
476
- # _In_ LPCTSTR lpszVolumeMountPoint,
477
- # _Out_ LPTSTR lpszVolumeName,
478
- # _In_ DWORD cchBufferLength
479
- # );
475
+ # BOOL WINAPI GetVolumeNameForVolumeMountPoint(
476
+ # _In_ LPCTSTR lpszVolumeMountPoint,
477
+ # _Out_ LPTSTR lpszVolumeName,
478
+ # _In_ DWORD cchBufferLength
479
+ # );
480
480
  safe_attach_function :GetVolumeNameForVolumeMountPointW, %i{LPCTSTR LPTSTR DWORD}, :BOOL
481
481
 
482
482
  =begin
@@ -538,12 +538,12 @@ BOOL WINAPI VerQueryValue(
538
538
  # ensures the handle is closed on exit of the block
539
539
  # FIXME: yard with @yield
540
540
  def file_search_handle(path)
541
- # Workaround for CHEF-4419:
542
- # Make sure paths starting with "/" has a drive letter
543
- # assigned from the current working diretory.
544
- # Note: With CHEF-4427 this issue will be fixed with a
545
- # broader fix to map all the paths starting with "/" to
546
- # SYSTEM_DRIVE on windows.
541
+ # Workaround for CHEF-4419:
542
+ # Make sure paths starting with "/" has a drive letter
543
+ # assigned from the current working diretory.
544
+ # Note: With CHEF-4427 this issue will be fixed with a
545
+ # broader fix to map all the paths starting with "/" to
546
+ # SYSTEM_DRIVE on windows.
547
547
  path = ::File.expand_path(path) if path.start_with? "/"
548
548
  path = canonical_encode_path(path)
549
549
  find_data = WIN32_FIND_DATA.new
@@ -82,8 +82,8 @@ class Chef
82
82
  (call_succeeded != 0) && (is_64_bit_process_result.get_int(0) != 0)
83
83
  end
84
84
 
85
- # Must have PROCESS_QUERY_INFORMATION or PROCESS_QUERY_LIMITED_INFORMATION rights,
86
- # AND the PROCESS_VM_READ right
85
+ # Must have PROCESS_QUERY_INFORMATION or PROCESS_QUERY_LIMITED_INFORMATION rights,
86
+ # AND the PROCESS_VM_READ right
87
87
  def self.get_process_memory_info(handle)
88
88
  memory_info = PROCESS_MEMORY_COUNTERS.new
89
89
  unless GetProcessMemoryInfo(handle.handle, memory_info, memory_info.size)
@@ -29,7 +29,7 @@ describe "Chef::Resource::User with Chef::Provider::User::Dscl provider", metada
29
29
  def clean_user
30
30
  shell_out!("/usr/bin/dscl . -delete '/Users/#{username}'")
31
31
  rescue Mixlib::ShellOut::ShellCommandFailed
32
- # Raised when the user is already cleaned
32
+ # Raised when the user is already cleaned
33
33
  end
34
34
 
35
35
  def user_should_exist
@@ -29,7 +29,7 @@ describe "Chef::Resource::User with Chef::Provider::User::MacUser provider", met
29
29
  def clean_user
30
30
  shell_out!("/usr/bin/dscl . -delete '/Users/#{username}'")
31
31
  rescue Mixlib::ShellOut::ShellCommandFailed
32
- # Raised when the user is already cleaned
32
+ # Raised when the user is already cleaned
33
33
  end
34
34
 
35
35
  def ensure_file_cache_path_exists
@@ -370,7 +370,7 @@ shared_examples_for "a configured file resource" do
370
370
  Chef::Config[:ssl_verify_mode] = :verify_none
371
371
  end
372
372
 
373
- # note the stripping of the drive letter from the tmpdir on windows
373
+ # note the stripping of the drive letter from the tmpdir on windows
374
374
  let(:backup_glob) { File.join(CHEF_SPEC_BACKUP_PATH, test_file_dir.sub(/^([A-Za-z]:)/, ""), "#{file_base}*") }
375
375
 
376
376
  # Most tests update the resource, but a few do not. We need to test that the
@@ -21,8 +21,8 @@ require "spec_helper"
21
21
 
22
22
  describe Chef::Knife::RoleEnvRunListAdd do
23
23
  before(:each) do
24
- # Chef::Config[:role_name] = "websimian"
25
- # Chef::Config[:env_name] = "QA"
24
+ # Chef::Config[:role_name] = "websimian"
25
+ # Chef::Config[:env_name] = "QA"
26
26
  @knife = Chef::Knife::RoleEnvRunListAdd.new
27
27
  @knife.config = {
28
28
  after: nil,
@@ -36,10 +36,10 @@ describe Chef::Knife::RoleEnvRunListAdd do
36
36
 
37
37
  describe "run" do
38
38
 
39
- # it "should display all the things" do
40
- # @knife.run
41
- # @role.to_json.should == 'show all the things'
42
- # end
39
+ # it "should display all the things" do
40
+ # @knife.run
41
+ # @role.to_json.should == 'show all the things'
42
+ # end
43
43
 
44
44
  it "should have an empty default run list" do
45
45
  @knife.run
@@ -44,10 +44,10 @@ describe Chef::Knife::RoleEnvRunListClear do
44
44
 
45
45
  describe "run" do
46
46
 
47
- # it "should display all the things" do
48
- # @knife.run
49
- # @role.to_json.should == 'show all the things'
50
- # end
47
+ # it "should display all the things" do
48
+ # @knife.run
49
+ # @role.to_json.should == 'show all the things'
50
+ # end
51
51
 
52
52
  it "should load the node" do
53
53
  expect(Chef::Role).to receive(:load).with("will").and_return(@role)
@@ -44,10 +44,10 @@ describe Chef::Knife::RoleEnvRunListRemove do
44
44
 
45
45
  describe "run" do
46
46
 
47
- # it "should display all the things" do
48
- # @knife.run
49
- # @role.to_json.should == 'show all the things'
50
- # end
47
+ # it "should display all the things" do
48
+ # @knife.run
49
+ # @role.to_json.should == 'show all the things'
50
+ # end
51
51
 
52
52
  it "should load the node" do
53
53
  expect(Chef::Role).to receive(:load).with("will").and_return(@role)
@@ -44,10 +44,10 @@ describe Chef::Knife::RoleEnvRunListReplace do
44
44
 
45
45
  describe "run" do
46
46
 
47
- # it "should display all the things" do
48
- # @knife.run
49
- # @role.to_json.should == 'show all the things'
50
- # end
47
+ # it "should display all the things" do
48
+ # @knife.run
49
+ # @role.to_json.should == 'show all the things'
50
+ # end
51
51
 
52
52
  it "should load the node" do
53
53
  expect(Chef::Role).to receive(:load).with("will").and_return(@role)
@@ -44,10 +44,10 @@ describe Chef::Knife::RoleEnvRunListSet do
44
44
 
45
45
  describe "run" do
46
46
 
47
- # it "should display all the things" do
48
- # @knife.run
49
- # @role.to_json.should == 'show all the things'
50
- # end
47
+ # it "should display all the things" do
48
+ # @knife.run
49
+ # @role.to_json.should == 'show all the things'
50
+ # end
51
51
 
52
52
  it "should load the node" do
53
53
  expect(Chef::Role).to receive(:load).with("will").and_return(@role)
@@ -21,8 +21,8 @@ require "spec_helper"
21
21
 
22
22
  describe Chef::Knife::RoleRunListAdd do
23
23
  before(:each) do
24
- # Chef::Config[:role_name] = "websimian"
25
- # Chef::Config[:env_name] = "QA"
24
+ # Chef::Config[:role_name] = "websimian"
25
+ # Chef::Config[:env_name] = "QA"
26
26
  @knife = Chef::Knife::RoleRunListAdd.new
27
27
  @knife.config = {
28
28
  after: nil,
@@ -36,10 +36,10 @@ describe Chef::Knife::RoleRunListAdd do
36
36
 
37
37
  describe "run" do
38
38
 
39
- # it "should display all the things" do
40
- # @knife.run
41
- # @role.to_json.should == 'show all the things'
42
- # end
39
+ # it "should display all the things" do
40
+ # @knife.run
41
+ # @role.to_json.should == 'show all the things'
42
+ # end
43
43
 
44
44
  it "should have a run list with the monkey role" do
45
45
  @knife.run
@@ -43,10 +43,10 @@ describe Chef::Knife::RoleRunListClear do
43
43
 
44
44
  describe "run" do
45
45
 
46
- # it "should display all the things" do
47
- # @knife.run
48
- # @role.to_json.should == 'show all the things'
49
- # end
46
+ # it "should display all the things" do
47
+ # @knife.run
48
+ # @role.to_json.should == 'show all the things'
49
+ # end
50
50
 
51
51
  it "should load the node" do
52
52
  expect(Chef::Role).to receive(:load).with("will").and_return(@role)
@@ -43,10 +43,10 @@ describe Chef::Knife::RoleRunListRemove do
43
43
 
44
44
  describe "run" do
45
45
 
46
- # it "should display all the things" do
47
- # @knife.run
48
- # @role.to_json.should == 'show all the things'
49
- # end
46
+ # it "should display all the things" do
47
+ # @knife.run
48
+ # @role.to_json.should == 'show all the things'
49
+ # end
50
50
 
51
51
  it "should load the node" do
52
52
  expect(Chef::Role).to receive(:load).with("will").and_return(@role)
@@ -43,10 +43,10 @@ describe Chef::Knife::RoleRunListReplace do
43
43
 
44
44
  describe "run" do
45
45
 
46
- # it "should display all the things" do
47
- # @knife.run
48
- # @role.to_json.should == 'show all the things'
49
- # end
46
+ # it "should display all the things" do
47
+ # @knife.run
48
+ # @role.to_json.should == 'show all the things'
49
+ # end
50
50
 
51
51
  it "should load the node" do
52
52
  expect(Chef::Role).to receive(:load).with("will").and_return(@role)
@@ -43,10 +43,10 @@ describe Chef::Knife::RoleRunListSet do
43
43
 
44
44
  describe "run" do
45
45
 
46
- # it "should display all the things" do
47
- # @knife.run
48
- # @role.to_json.should == 'show all the things'
49
- # end
46
+ # it "should display all the things" do
47
+ # @knife.run
48
+ # @role.to_json.should == 'show all the things'
49
+ # end
50
50
 
51
51
  it "should load the node" do
52
52
  expect(Chef::Role).to receive(:load).with("will").and_return(@role)
@@ -678,7 +678,7 @@ describe Chef::Provider::Git do
678
678
  expect(@provider).to receive(:enable_submodules)
679
679
  expect(@provider).to receive(:add_remotes)
680
680
  @provider.run_action(:checkout)
681
- # @resource.should be_updated
681
+ # @resource.should be_updated
682
682
  end
683
683
 
684
684
  it "should not checkout if the destination exists or is a non empty directory" do
@@ -716,7 +716,7 @@ describe Chef::Provider::Git do
716
716
  expect(@provider).to receive(:enable_submodules)
717
717
  expect(@provider).to receive(:add_remotes)
718
718
  @provider.run_action(:sync)
719
- # @resource.should be_updated
719
+ # @resource.should be_updated
720
720
  end
721
721
 
722
722
  it "does not fetch any updates if the remote revision matches the current revision" do
@@ -736,7 +736,7 @@ describe Chef::Provider::Git do
736
736
  expect(@provider).to receive(:action_checkout)
737
737
  expect(@provider).not_to receive(:shell_out!)
738
738
  @provider.run_action(:sync)
739
- # @resource.should be_updated
739
+ # @resource.should be_updated
740
740
  end
741
741
 
742
742
  it "clones the repo instead of fetching updates if the deploy directory is empty" do
@@ -131,8 +131,8 @@ describe Chef::Provider::Launchd do
131
131
  new_resource.program "/Library/scripts/call_mom.sh"
132
132
  new_resource.time_out 300
133
133
  new_resource.start_calendar_interval "Hour" => 10, "Weekday" => 7
134
- expect(provider.content?).to be_truthy
135
- expect(provider.content).to eql(test_plist)
134
+ expect(provider.file_content?).to be_truthy
135
+ expect(provider.file_content).to eql(test_plist)
136
136
  end
137
137
  end
138
138
 
@@ -147,8 +147,8 @@ describe Chef::Provider::Launchd do
147
147
  new_resource.program "/Library/scripts/call_mom.sh"
148
148
  new_resource.time_out 300
149
149
  new_resource.start_calendar_interval allowed
150
- expect(provider.content?).to be_truthy
151
- expect(provider.content).to eql(test_plist_multiple_intervals)
150
+ expect(provider.file_content?).to be_truthy
151
+ expect(provider.file_content).to eql(test_plist_multiple_intervals)
152
152
  end
153
153
 
154
154
  it "should allow all StartCalendarInterval keys" do
@@ -162,9 +162,9 @@ describe Chef::Provider::Launchd do
162
162
  new_resource.program "/Library/scripts/call_mom.sh"
163
163
  new_resource.time_out 300
164
164
  new_resource.start_calendar_interval allowed
165
- expect(provider.content?).to be_truthy
165
+ expect(provider.file_content?).to be_truthy
166
166
  %w{Minute Hour Day Weekday Month}.each do |key|
167
- expect(provider.content).to include("<key>#{key}</key>")
167
+ expect(provider.file_content).to include("<key>#{key}</key>")
168
168
  end
169
169
  end
170
170
 
@@ -188,8 +188,8 @@ describe Chef::Provider::Launchd do
188
188
  describe "hash is passed" do
189
189
  it "should produce the test_plist content from the plist_hash property" do
190
190
  new_resource.plist_hash test_hash
191
- expect(provider.content?).to be_truthy
192
- expect(provider.content).to eql(test_plist)
191
+ expect(provider.file_content?).to be_truthy
192
+ expect(provider.file_content).to eql(test_plist)
193
193
  end
194
194
  end
195
195
  end
@@ -61,8 +61,8 @@ describe Chef::Provider::OsxProfile do
61
61
  "ProfileVersion" => 1 }],
62
62
  }
63
63
  end
64
- # If anything is changed within this profile, be sure to update the
65
- # ProfileUUID in all_profiles to match the new config specific UUID
64
+ # If anything is changed within this profile, be sure to update the
65
+ # ProfileUUID in all_profiles to match the new config specific UUID
66
66
  let(:test_profile) do
67
67
  {
68
68
  "PayloadIdentifier" => "com.testprofile.screensaver",
@@ -261,9 +261,9 @@ describe Chef::Provider::Package::Msu, :windows_only do
261
261
  expect(cab_files).to eql(["msu_dir/IE10-Windows6.1-KB2859903-x86.CAB"])
262
262
  end
263
263
 
264
- # We couldn't find any msu file with multiple cab files in it.
265
- # So we are not 100% sure about the structure of XML file in this case
266
- # The specs below cover 2 possible XML formats
264
+ # We couldn't find any msu file with multiple cab files in it.
265
+ # So we are not 100% sure about the structure of XML file in this case
266
+ # The specs below cover 2 possible XML formats
267
267
  context "handles different xml formats for multiple cab files in the msu package" do
268
268
  it "parses xml file with multiple <package> tags" do
269
269
  xml_file = File.join(CHEF_SPEC_DATA, "sample_msu2.xml")
@@ -37,7 +37,7 @@ describe Chef::Provider::Service::Gentoo do
37
37
  allow(File).to receive(:exists?).with("/etc/runlevels/default/chef").and_return(false)
38
38
  allow(File).to receive(:readable?).with("/etc/runlevels/default/chef").and_return(false)
39
39
  end
40
- # new test: found_enabled state
40
+ # new test: found_enabled state
41
41
  #
42
42
  describe "load_current_resource" do
43
43
  it "should raise Chef::Exceptions::Service if /sbin/rc-update does not exist" do
@@ -593,14 +593,14 @@ describe Chef::ProviderResolver do
593
593
  "debian" => {
594
594
  ifconfig: [ Chef::Resource::Ifconfig, Chef::Provider::Ifconfig::Debian ],
595
595
  package: [ Chef::Resource::AptPackage, Chef::Provider::Package::Apt ],
596
- # service: [ Chef::Resource::DebianService, Chef::Provider::Service::Debian ],
596
+ # service: [ Chef::Resource::DebianService, Chef::Provider::Service::Debian ],
597
597
 
598
598
  "debian" => {
599
599
  "7.0" => {
600
600
  },
601
601
  "6.0" => {
602
602
  ifconfig: [ Chef::Resource::Ifconfig, Chef::Provider::Ifconfig ],
603
- # service: [ Chef::Resource::InsservService, Chef::Provider::Service::Insserv ],
603
+ # service: [ Chef::Resource::InsservService, Chef::Provider::Service::Insserv ],
604
604
  },
605
605
  "5.0" => {
606
606
  ifconfig: [ Chef::Resource::Ifconfig, Chef::Provider::Ifconfig ],
@@ -619,7 +619,7 @@ describe Chef::ProviderResolver do
619
619
  "linuxmint" => {
620
620
  "3.1.4" => {
621
621
  ifconfig: [ Chef::Resource::Ifconfig, Chef::Provider::Ifconfig ],
622
- # service: [ Chef::Resource::UpstartService, Chef::Provider::Service::Upstart ],
622
+ # service: [ Chef::Resource::UpstartService, Chef::Provider::Service::Upstart ],
623
623
  },
624
624
  },
625
625
  "raspbian" => {
@@ -667,7 +667,7 @@ describe Chef::ProviderResolver do
667
667
  # TODO should be Chef::Resource::PortagePackage
668
668
  package: [ Chef::Resource::Package, Chef::Provider::Package::Portage ],
669
669
  portage_package: [ Chef::Resource::PortagePackage, Chef::Provider::Package::Portage ],
670
- # service: [ Chef::Resource::GentooService, Chef::Provider::Service::Gentoo ],
670
+ # service: [ Chef::Resource::GentooService, Chef::Provider::Service::Gentoo ],
671
671
 
672
672
  "gentoo" => {
673
673
  "3.1.4" => {
@@ -676,14 +676,14 @@ describe Chef::ProviderResolver do
676
676
  },
677
677
 
678
678
  "rhel" => {
679
- # service: [ Chef::Resource::SystemdService, Chef::Provider::Service::Systemd ],
679
+ # service: [ Chef::Resource::SystemdService, Chef::Provider::Service::Systemd ],
680
680
  package: [ Chef::Resource::DnfPackage, Chef::Provider::Package::Dnf ],
681
681
  ifconfig: [ Chef::Resource::Ifconfig, Chef::Provider::Ifconfig::Redhat ],
682
682
 
683
683
  %w{amazon xcp xenserver ibm_powerkvm cloudlinux parallels} => {
684
684
  "3.1.4" => {
685
685
  package: [ Chef::Resource::YumPackage, Chef::Provider::Package::Yum ],
686
- # service: [ Chef::Resource::RedhatService, Chef::Provider::Service::Redhat ],
686
+ # service: [ Chef::Resource::RedhatService, Chef::Provider::Service::Redhat ],
687
687
  },
688
688
  },
689
689
  %w{redhat centos scientific oracle} => {
@@ -692,14 +692,14 @@ describe Chef::ProviderResolver do
692
692
  },
693
693
  "6.0" => {
694
694
  package: [ Chef::Resource::YumPackage, Chef::Provider::Package::Yum ],
695
- # service: [ Chef::Resource::RedhatService, Chef::Provider::Service::Redhat ],
695
+ # service: [ Chef::Resource::RedhatService, Chef::Provider::Service::Redhat ],
696
696
  },
697
697
  },
698
698
  "fedora" => {
699
699
  "15.0" => {
700
700
  },
701
701
  "14.0" => {
702
- # service: [ Chef::Resource::RedhatService, Chef::Provider::Service::Redhat ],
702
+ # service: [ Chef::Resource::RedhatService, Chef::Provider::Service::Redhat ],
703
703
  },
704
704
  },
705
705
  },
@@ -761,7 +761,7 @@ describe Chef::ProviderResolver do
761
761
  package: [ Chef::Resource::Package, Chef::Provider::Package::Bff ],
762
762
  rpm_package: [ Chef::Resource::RpmPackage, Chef::Provider::Package::Rpm ],
763
763
  user: [ Chef::Resource::User::AixUser, Chef::Provider::User::Aix ],
764
- # service: [ Chef::Resource::AixService, Chef::Provider::Service::Aix ],
764
+ # service: [ Chef::Resource::AixService, Chef::Provider::Service::Aix ],
765
765
 
766
766
  "aix" => {
767
767
  "aix" => {
@@ -93,6 +93,16 @@ describe Chef::Resource::WindowsPackage, "initialize" do
93
93
  expect(resource.returns).to eq([0, 3010])
94
94
  end
95
95
 
96
+ it "does not accept a string for the package_name property" do
97
+ expect { resource.package_name(%w{this should break}) }.to raise_error(Chef::Exceptions::ValidationFailed)
98
+ end
99
+
100
+ # even though we don't do anything with arrays of versions we need them for current_value
101
+ it "accepts both Strings and Arrays for the version property" do
102
+ expect { resource.version "1.2.3" }.not_to raise_error
103
+ expect { resource.version ["1.2.3", "1.2.3.4"] }.not_to raise_error
104
+ end
105
+
96
106
  it "defaults source to the resource name" do
97
107
  # it's a little late to stub out File.absolute_path
98
108
  expect(resource.source).to include("solitaire.msi")
@@ -138,7 +138,7 @@ describe Chef::RunContext do
138
138
  expect(node).to receive(:loaded_recipe).with(:ancient, "aliens")
139
139
  expect do
140
140
  run_context.include_recipe("ancient::aliens")
141
- # In CHEF-5120, this becomes a Chef::Exceptions::MissingCookbookDependency error:
141
+ # In CHEF-5120, this becomes a Chef::Exceptions::MissingCookbookDependency error:
142
142
  end.to raise_error(Chef::Exceptions::CookbookNotFound)
143
143
  end
144
144
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chef
3
3
  version: !ruby/object:Gem::Version
4
- version: 16.0.275
4
+ version: 16.0.287
5
5
  platform: universal-mingw32
6
6
  authors:
7
7
  - Adam Jacob
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-05 00:00:00.000000000 Z
11
+ date: 2020-05-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chef-config
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 16.0.275
19
+ version: 16.0.287
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 16.0.275
26
+ version: 16.0.287
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: chef-utils
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: 16.0.275
33
+ version: 16.0.287
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: 16.0.275
40
+ version: 16.0.287
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: train-core
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -1140,7 +1140,7 @@ files:
1140
1140
  - lib/chef/knife/user_edit.rb
1141
1141
  - lib/chef/knife/user_invite_add.rb
1142
1142
  - lib/chef/knife/user_invite_list.rb
1143
- - lib/chef/knife/user_invite_recind.rb
1143
+ - lib/chef/knife/user_invite_rescind.rb
1144
1144
  - lib/chef/knife/user_key_create.rb
1145
1145
  - lib/chef/knife/user_key_delete.rb
1146
1146
  - lib/chef/knife/user_key_edit.rb