chef 13.5.3-universal-mingw32 → 13.6.0-universal-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/acceptance/.bundle/config +2 -0
- data/bin/chef-shell +2 -0
- data/distro/powershell/chef/chef.psm1 +23 -2
- data/lib/chef/.DS_Store +0 -0
- data/lib/chef/application/client.rb +1 -1
- data/lib/chef/chef_fs/config.rb +1 -1
- data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +5 -0
- data/lib/chef/client.rb +3 -0
- data/lib/chef/cookbook/synchronizer.rb +2 -4
- data/lib/chef/data_bag.rb +4 -0
- data/lib/chef/deprecated.rb +10 -0
- data/lib/chef/knife/client_delete.rb +1 -1
- data/lib/chef/knife/node_delete.rb +1 -1
- data/lib/chef/knife/node_run_list_add.rb +1 -1
- data/lib/chef/knife/node_run_list_remove.rb +1 -1
- data/lib/chef/knife/role_env_run_list_add.rb +1 -1
- data/lib/chef/knife/role_run_list_add.rb +1 -1
- data/lib/chef/mixin/.DS_Store +0 -0
- data/lib/chef/mixin/user_context.rb +1 -1
- data/lib/chef/platform/rebooter.rb +7 -3
- data/lib/chef/provider/dsc_script.rb +5 -1
- data/lib/chef/provider/package.rb +35 -4
- data/lib/chef/provider/package/apt.rb +7 -0
- data/lib/chef/provider/package/chocolatey.rb +24 -8
- data/lib/chef/provider/package/dnf.rb +14 -5
- data/lib/chef/provider/package/dnf/dnf_helper.py +10 -0
- data/lib/chef/provider/package/dnf/python_helper.rb +15 -0
- data/lib/chef/provider/package/rpm.rb +5 -0
- data/lib/chef/provider/package/windows.rb +15 -0
- data/lib/chef/provider/package/yum.rb +4 -20
- data/lib/chef/provider/package/zypper.rb +5 -1
- data/lib/chef/provider/route.rb +1 -1
- data/lib/chef/provider/windows_task.rb +19 -4
- data/lib/chef/provider/zypper_repository.rb +100 -12
- data/lib/chef/resource/deploy.rb +6 -0
- data/lib/chef/resource/dnf_package.rb +9 -2
- data/lib/chef/resource/windows_task.rb +12 -7
- data/lib/chef/resource/zypper_package.rb +1 -0
- data/lib/chef/resource/zypper_repository.rb +1 -0
- data/lib/chef/util/dsc/lcm_output_parser.rb +57 -2
- data/lib/chef/util/dsc/local_configuration_manager.rb +16 -16
- data/lib/chef/version.rb +1 -1
- data/spec/.DS_Store +0 -0
- data/spec/functional/rebooter_spec.rb +22 -11
- data/spec/functional/resource/windows_task_spec.rb +25 -0
- data/spec/unit/.DS_Store +0 -0
- data/spec/unit/chef_fs/data_handler/data_bag_item_data_handler.rb +79 -0
- data/spec/unit/client_spec.rb +11 -0
- data/spec/unit/cookbook/synchronizer_spec.rb +30 -0
- data/spec/unit/knife/data_bag_create_spec.rb +8 -0
- data/spec/unit/mixin/user_context_spec.rb +1 -2
- data/spec/unit/provider/package/chocolatey_spec.rb +3 -1
- data/spec/unit/provider/package/rubygems_spec.rb +5 -0
- data/spec/unit/provider/package/zypper_spec.rb +8 -0
- data/spec/unit/provider/remote_file/network_file_spec.rb +1 -1
- data/spec/unit/provider/route_spec.rb +2 -0
- data/spec/unit/provider/windows_task_spec.rb +28 -0
- data/spec/unit/provider/zypper_repository_spec.rb +124 -0
- data/spec/unit/provider_resolver_spec.rb +4 -1
- data/spec/unit/resource/windows_task_spec.rb +8 -2
- data/spec/unit/resource/zypper_repository_spec.rb +11 -9
- data/spec/unit/util/dsc/lcm_output_parser_spec.rb +102 -18
- data/spec/unit/util/dsc/local_configuration_manager_spec.rb +2 -1
- metadata +8 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3e4e80c0de1137ddd227984e82625f3639a7f2a9
|
4
|
+
data.tar.gz: 5fad1ea8fbe36e1df7ab94eb5f09010b2ac233af
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ada2261cc4ec65adb6450bdf48261d6041680c92e276279d49d50ed9ed2df117f023a73912106ef9fe612bc20d7e21f175d406b14a9d0b3c1d1cac1fa4c18959
|
7
|
+
data.tar.gz: 6faae2f2806281b90ef8df82418811f26e5f7197f56369d46c8af5804ae8a7d2b8f82b6b8932de996ea5fd141c836d20bcb18dbd414ae74d34cec2a46011713e
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
13.
|
1
|
+
13.6.0
|
data/bin/chef-shell
CHANGED
@@ -282,6 +282,24 @@ function Run-ExecutableAndWait($AppPath, $ArgumentString) {
|
|
282
282
|
break
|
283
283
|
}
|
284
284
|
}
|
285
|
+
} else {
|
286
|
+
# For some reason, you can't read from the read-end of the read-pipe before the write end has started
|
287
|
+
# to write. Otherwise the process just blocks forever and never returns from the read. So we peek
|
288
|
+
# at the pipe until there is something. But don't peek too eagerly. This is stupid stupid stupid.
|
289
|
+
# There must be a way to do this without having to peek at a pipe first but I have not found it.
|
290
|
+
#
|
291
|
+
# Note to the future intrepid soul who wants to fix this:
|
292
|
+
# 0) This is related to unreasonable CPU usage by the wrapper PS script on a 1 VCPU VM (either Hyper-V
|
293
|
+
# or VirtualBox) running a consumer Windows SKU (Windows 10 for example...). Test it there.
|
294
|
+
# 1) Maybe this entire script is unnecessary and the bugs mentioned below have been fixed or don't need
|
295
|
+
# to be supported.
|
296
|
+
# 2) The server and consumer windows schedulers have different defaults. I had a hard time reproducing
|
297
|
+
# any issue on a win 2008 on win 2012 server default setup. See the "foreground application scheduler
|
298
|
+
# priority" setting to see if it's relevant.
|
299
|
+
# 3) This entire endeavor is silly anyway - why are we reimplementing process forking all over? Maybe try
|
300
|
+
# to get the folks above to accept patches instead of extending this crazy script.
|
301
|
+
Start-Sleep -s 1
|
302
|
+
# Start-Sleep -m 100
|
285
303
|
}
|
286
304
|
|
287
305
|
if ($global:LASTEXITCODE -ne [Chef.Kernel32]::STILL_ACTIVE) {
|
@@ -434,9 +452,12 @@ Export-ModuleMember -function chef-solo
|
|
434
452
|
Export-ModuleMember -function chef-windows-service
|
435
453
|
Export-ModuleMember -function knife
|
436
454
|
|
437
|
-
# To debug this module, uncomment the line below
|
455
|
+
# To debug this module, uncomment the line below
|
438
456
|
# Export-ModuleMember -function Run-RubyCommand
|
457
|
+
|
458
|
+
# Then run the following to reload the module. Use puts_argv as a helpful debug executable.
|
439
459
|
# Remove-Module chef
|
440
460
|
# Import-Module chef
|
441
|
-
# "puts ARGV" | Out-File C:\opscode\chef\bin\puts_args
|
461
|
+
# "puts ARGV" | Out-File C:\opscode\chef\bin\puts_args -Encoding ASCII
|
462
|
+
# Copy-Item C:\opscode\chef\bin\ohai.bat C:\opscode\chef\bin\puts_args.bat
|
442
463
|
# Run-RubyCommand puts_args 'Here' "are" some '"very interesting"' 'arguments[to]' "`"try out`""
|
data/lib/chef/.DS_Store
CHANGED
Binary file
|
@@ -501,7 +501,7 @@ class Chef::Application::Client < Chef::Application
|
|
501
501
|
# we need to sleep again after reconfigure to avoid stampeding when logrotate runs out of cron
|
502
502
|
if signal == RECONFIGURE_SIGNAL
|
503
503
|
reconfigure
|
504
|
-
interval_sleep(
|
504
|
+
interval_sleep(sec)
|
505
505
|
end
|
506
506
|
else
|
507
507
|
sleep(sec)
|
data/lib/chef/chef_fs/config.rb
CHANGED
@@ -66,7 +66,7 @@ class Chef
|
|
66
66
|
# upgrade/migration of older Chef Servers, so they should be considered
|
67
67
|
# frozen in time.
|
68
68
|
|
69
|
-
CHEF_11_OSS_STATIC_OBJECTS = %w{cookbooks
|
69
|
+
CHEF_11_OSS_STATIC_OBJECTS = %w{cookbooks data_bags environments roles}.freeze
|
70
70
|
CHEF_11_OSS_DYNAMIC_OBJECTS = %w{clients nodes users}.freeze
|
71
71
|
RBAC_OBJECT_NAMES = %w{acls containers groups }.freeze
|
72
72
|
CHEF_12_OBJECTS = %w{ cookbook_artifacts policies policy_groups client_keys }.freeze
|
@@ -5,6 +5,8 @@ class Chef
|
|
5
5
|
module ChefFS
|
6
6
|
module DataHandler
|
7
7
|
class DataBagItemDataHandler < DataHandlerBase
|
8
|
+
RESERVED_NAMES = /node|role|environment|client/
|
9
|
+
|
8
10
|
def normalize(data_bag_item, entry)
|
9
11
|
# If it's wrapped with raw_data, unwrap it.
|
10
12
|
if data_bag_item["json_class"] == "Chef::DataBagItem" && data_bag_item["raw_data"]
|
@@ -43,6 +45,7 @@ class Chef
|
|
43
45
|
end
|
44
46
|
|
45
47
|
# Verify that the JSON hash for this type has a key that matches its name.
|
48
|
+
# Also check that the data bag name is not a reserved search index name.
|
46
49
|
#
|
47
50
|
# @param object [Object] JSON hash of the object
|
48
51
|
# @param entry [Chef::ChefFS::FileSystem::BaseFSObject] filesystem object we are verifying
|
@@ -52,6 +55,8 @@ class Chef
|
|
52
55
|
base_name = remove_dot_json(entry.name)
|
53
56
|
if object["raw_data"]["id"] != base_name
|
54
57
|
yield("ID in #{entry.path_for_printing} must be '#{base_name}' (is '#{object['raw_data']['id']}')")
|
58
|
+
elsif entry.parent.name =~ RESERVED_NAMES
|
59
|
+
yield("Data bag name ('#{entry.parent.name}') must not match #{RESERVED_NAMES.inspect}")
|
55
60
|
end
|
56
61
|
end
|
57
62
|
|
data/lib/chef/client.rb
CHANGED
@@ -605,6 +605,9 @@ class Chef
|
|
605
605
|
filter = Chef::Config[:minimal_ohai] ? %w{fqdn machinename hostname platform platform_version os os_version} : nil
|
606
606
|
ohai.all_plugins(filter)
|
607
607
|
events.ohai_completed(node)
|
608
|
+
rescue Ohai::Exceptions::CriticalPluginFailure => e
|
609
|
+
Chef::Log.error("Critical Ohai plugins failed: #{e.message}")
|
610
|
+
exit(false)
|
608
611
|
end
|
609
612
|
|
610
613
|
#
|
@@ -154,6 +154,7 @@ class Chef
|
|
154
154
|
|
155
155
|
queue = Chef::Util::ThreadedJobQueue.new
|
156
156
|
|
157
|
+
Chef::Log.warn("skipping cookbook synchronization! DO NOT LEAVE THIS ENABLED IN PRODUCTION!!!") if Chef::Config[:skip_cookbook_sync]
|
157
158
|
files.each do |file|
|
158
159
|
queue << lambda do |lock|
|
159
160
|
full_file_path = sync_file(file)
|
@@ -279,10 +280,7 @@ class Chef
|
|
279
280
|
end
|
280
281
|
|
281
282
|
def cached_copy_up_to_date?(local_path, expected_checksum)
|
282
|
-
if Chef::Config[:skip_cookbook_sync]
|
283
|
-
Chef::Log.warn "skipping cookbook synchronization! DO NOT LEAVE THIS ENABLED IN PRODUCTION!!!"
|
284
|
-
return true
|
285
|
-
end
|
283
|
+
return true if Chef::Config[:skip_cookbook_sync]
|
286
284
|
if cache.has_key?(local_path)
|
287
285
|
current_checksum = CookbookVersion.checksum_cookbook_file(cache.load(local_path, false))
|
288
286
|
expected_checksum == current_checksum
|
data/lib/chef/data_bag.rb
CHANGED
@@ -33,6 +33,7 @@ class Chef
|
|
33
33
|
include Chef::Mixin::ParamsValidate
|
34
34
|
|
35
35
|
VALID_NAME = /^[\.\-[:alnum:]_]+$/
|
36
|
+
RESERVED_NAMES = /node|role|environment|client/
|
36
37
|
|
37
38
|
attr_accessor :chef_server_rest
|
38
39
|
|
@@ -40,6 +41,9 @@ class Chef
|
|
40
41
|
unless name =~ VALID_NAME
|
41
42
|
raise Exceptions::InvalidDataBagName, "DataBags must have a name matching #{VALID_NAME.inspect}, you gave #{name.inspect}"
|
42
43
|
end
|
44
|
+
if name =~ RESERVED_NAMES
|
45
|
+
raise Exceptions::InvalidDataBagName, "DataBags may not have a name matching #{RESERVED_NAMES.inspect}, you gave #{name.inspect}"
|
46
|
+
end
|
43
47
|
end
|
44
48
|
|
45
49
|
# Create a new Chef::DataBag
|
data/lib/chef/deprecated.rb
CHANGED
@@ -32,7 +32,7 @@ class Chef
|
|
32
32
|
:long => "--delete-validators",
|
33
33
|
:description => "Force deletion of client if it's a validator"
|
34
34
|
|
35
|
-
banner "knife client delete [CLIENT[
|
35
|
+
banner "knife client delete [CLIENT [CLIENT]] (options)"
|
36
36
|
|
37
37
|
def run
|
38
38
|
if @name_args.length == 0
|
@@ -27,7 +27,7 @@ class Chef
|
|
27
27
|
require "chef/json_compat"
|
28
28
|
end
|
29
29
|
|
30
|
-
banner "knife role env_run_list add [ROLE] [ENVIRONMENT] [ENTRY[
|
30
|
+
banner "knife role env_run_list add [ROLE] [ENVIRONMENT] [ENTRY [ENTRY]] (options)"
|
31
31
|
|
32
32
|
option :after,
|
33
33
|
:short => "-a ITEM",
|
Binary file
|
@@ -23,7 +23,7 @@ class Chef
|
|
23
23
|
module UserContext
|
24
24
|
|
25
25
|
def with_user_context(user, password, domain = nil, &block)
|
26
|
-
|
26
|
+
unless Chef::Platform.windows?
|
27
27
|
raise Exceptions::UnsupportedPlatform, "User context impersonation is supported only on the Windows platform"
|
28
28
|
end
|
29
29
|
|
@@ -33,14 +33,18 @@ class Chef
|
|
33
33
|
def reboot!(node)
|
34
34
|
reboot_info = node.run_context.reboot_info
|
35
35
|
|
36
|
-
cmd =
|
36
|
+
cmd = case
|
37
|
+
when Chef::Platform.windows?
|
37
38
|
# should this do /f as well? do we then need a minimum delay to let apps quit?
|
38
39
|
# Use explicit path to shutdown.exe, to protect against https://github.com/chef/chef/issues/5594
|
39
40
|
windows_shutdown_path = "#{ENV['SYSTEMROOT']}/System32/shutdown.exe"
|
40
41
|
"#{windows_shutdown_path} /r /t #{reboot_info[:delay_mins] * 60} /c \"#{reboot_info[:reason]}\""
|
42
|
+
when node["os"] == "solaris2"
|
43
|
+
# SysV-flavored shutdown
|
44
|
+
"shutdown -i6 -g#{reboot_info[:delay_mins]} -y \"#{reboot_info[:reason]}\" &"
|
41
45
|
else
|
42
|
-
#
|
43
|
-
"shutdown -r +#{reboot_info[:delay_mins]} \"#{reboot_info[:reason]}\""
|
46
|
+
# Linux/BSD/Mac/AIX and other systems with BSD-ish shutdown
|
47
|
+
"shutdown -r +#{reboot_info[:delay_mins]} \"#{reboot_info[:reason]}\" &"
|
44
48
|
end
|
45
49
|
|
46
50
|
msg = "Rebooting server at a recipe's request. Details: #{reboot_info.inspect}"
|
@@ -161,7 +161,11 @@ class Chef
|
|
161
161
|
if resource.changes_state?
|
162
162
|
# We ignore the last log message because it only contains the time it took, which looks weird
|
163
163
|
cleaned_messages = resource.change_log[0..-2].map { |c| c.sub(/^#{Regexp.escape(resource.name)}/, "").strip }
|
164
|
-
|
164
|
+
unless cleaned_messages.empty?
|
165
|
+
"converge DSC resource #{resource.name} by #{cleaned_messages.find_all { |c| c != '' }.join("\n")}"
|
166
|
+
else
|
167
|
+
"converge DSC resource #{resource.name}"
|
168
|
+
end
|
165
169
|
else
|
166
170
|
# This is needed because a dsc script can have resources that are both converged and not
|
167
171
|
"converge DSC resource #{resource.name} by doing nothing because it is already converged"
|
@@ -323,10 +323,38 @@ class Chef
|
|
323
323
|
#
|
324
324
|
# Note that most likely we need a spaceship operator on versions that subclasses can implement
|
325
325
|
# and we should have `version_compare(v1, v2)` that returns `v1 <=> v2`.
|
326
|
+
|
327
|
+
# This method performs a strict equality check between two strings representing version numbers
|
326
328
|
#
|
329
|
+
# This function will eventually be deprecated in favour of the below version_equals function.
|
330
|
+
|
327
331
|
def target_version_already_installed?(current_version, target_version)
|
328
|
-
|
329
|
-
|
332
|
+
version_equals?(current_version, target_version)
|
333
|
+
end
|
334
|
+
|
335
|
+
# Note that most likely we need a spaceship operator on versions that subclasses can implement
|
336
|
+
# and we should have `version_compare(v1, v2)` that returns `v1 <=> v2`.
|
337
|
+
|
338
|
+
# This method performs a strict equality check between two strings representing version numbers
|
339
|
+
#
|
340
|
+
def version_equals?(v1, v2)
|
341
|
+
return false unless v1 && v2
|
342
|
+
v1 == v2
|
343
|
+
end
|
344
|
+
|
345
|
+
# This function compares two version numbers and returns 'spaceship operator' style results, ie:
|
346
|
+
# if v1 < v2 then return -1
|
347
|
+
# if v1 = v2 then return 0
|
348
|
+
# if v1 > v2 then return 1
|
349
|
+
# if v1 and v2 are not comparable then return nil
|
350
|
+
#
|
351
|
+
# By default, this function will use Gem::Version comparison. Subclasses can reimplement this method
|
352
|
+
# for package-management system specific versions.
|
353
|
+
def version_compare(v1, v2)
|
354
|
+
gem_v1 = Gem::Version.new(v1)
|
355
|
+
gem_v2 = Gem::Version.new(v2)
|
356
|
+
|
357
|
+
gem_v1 <=> gem_v2
|
330
358
|
end
|
331
359
|
|
332
360
|
# Check the current_version against the new_resource.version, possibly using fuzzy
|
@@ -439,16 +467,19 @@ class Chef
|
|
439
467
|
each_package do |package_name, new_version, current_version, candidate_version|
|
440
468
|
case action
|
441
469
|
when :upgrade
|
442
|
-
if
|
470
|
+
if version_equals?(current_version, new_version)
|
443
471
|
# this is an odd use case
|
444
472
|
Chef::Log.debug("#{new_resource} #{package_name} #{new_version} is already installed -- you are equality pinning with an :upgrade action, this may be deprecated in the future")
|
445
473
|
target_version_array.push(nil)
|
446
|
-
elsif
|
474
|
+
elsif version_equals?(current_version, candidate_version)
|
447
475
|
Chef::Log.debug("#{new_resource} #{package_name} #{candidate_version} is already installed")
|
448
476
|
target_version_array.push(nil)
|
449
477
|
elsif candidate_version.nil?
|
450
478
|
Chef::Log.debug("#{new_resource} #{package_name} has no candidate_version to upgrade to")
|
451
479
|
target_version_array.push(nil)
|
480
|
+
elsif version_compare(current_version, candidate_version) == 1 && !new_resource.allow_downgrade
|
481
|
+
Chef::Log.debug("#{new_resource} #{package_name} has installed version #{current_version}, which is newer than available version #{candidate_version}. Skipping...)")
|
482
|
+
target_version_array.push(nil)
|
452
483
|
else
|
453
484
|
Chef::Log.debug("#{new_resource} #{package_name} is out of date, will upgrade to #{candidate_version}")
|
454
485
|
target_version_array.push(candidate_version)
|
@@ -127,6 +127,13 @@ class Chef
|
|
127
127
|
|
128
128
|
private
|
129
129
|
|
130
|
+
def version_compare(v1, v2)
|
131
|
+
gem_v1 = v1.gsub(/[_+]/, "+" => "-", "_" => "-") unless v1.nil?
|
132
|
+
gem_v2 = v2.gsub(/[_+]/, "+" => "-", "_" => "-") unless v2.nil?
|
133
|
+
|
134
|
+
Gem::Version.new(gem_v1) <=> Gem::Version.new(gem_v2)
|
135
|
+
end
|
136
|
+
|
130
137
|
# Runs command via shell_out with magic environment to disable
|
131
138
|
# interactive prompts. Command is run with default localization rather
|
132
139
|
# than forcing locale to "C", so command output may not be stable.
|
@@ -141,6 +141,17 @@ EOS
|
|
141
141
|
|
142
142
|
private
|
143
143
|
|
144
|
+
def version_compare(v1, v2)
|
145
|
+
if v1 == "latest" || v2 == "latest"
|
146
|
+
return 0
|
147
|
+
end
|
148
|
+
|
149
|
+
gem_v1 = Gem::Version.new(v1)
|
150
|
+
gem_v2 = Gem::Version.new(v2)
|
151
|
+
|
152
|
+
gem_v1 <=> gem_v2
|
153
|
+
end
|
154
|
+
|
144
155
|
# Magic to find where chocolatey is installed in the system, and to
|
145
156
|
# return the full path of choco.exe
|
146
157
|
#
|
@@ -226,15 +237,20 @@ EOS
|
|
226
237
|
#
|
227
238
|
# @return [Hash] name-to-version mapping of available packages
|
228
239
|
def available_packages
|
229
|
-
@available_packages
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
240
|
+
return @available_packages if @available_packages
|
241
|
+
@available_packages = {}
|
242
|
+
package_name_array.each do |pkg|
|
243
|
+
available_versions =
|
244
|
+
begin
|
245
|
+
cmd = [ "list -r #{pkg}" ]
|
246
|
+
cmd.push( "-source #{new_resource.source}" ) if new_resource.source
|
247
|
+
raw = parse_list_output(*cmd)
|
248
|
+
raw.keys.each_with_object({}) do |name, available|
|
249
|
+
available[name] = desired_name_versions[name] || raw[name]
|
250
|
+
end
|
236
251
|
end
|
237
|
-
|
252
|
+
@available_packages.merge! available_versions
|
253
|
+
end
|
238
254
|
@available_packages
|
239
255
|
end
|
240
256
|
|
@@ -35,13 +35,18 @@ class Chef
|
|
35
35
|
use_multipackage_api
|
36
36
|
use_package_name_for_source
|
37
37
|
|
38
|
-
|
39
|
-
|
40
|
-
|
38
|
+
# all rhel variants >= 8 will use DNF
|
39
|
+
provides :package, platform_family: "rhel", platform_version: ">= 8"
|
40
|
+
|
41
|
+
# fedora >= 22 uses DNF
|
42
|
+
provides :package, platform: "fedora", platform_version: ">= 22"
|
41
43
|
|
42
|
-
|
44
|
+
# amazon will eventually use DNF
|
45
|
+
provides :package, platform: "amazon" do
|
46
|
+
which("dnf")
|
47
|
+
end
|
43
48
|
|
44
|
-
provides :dnf_package
|
49
|
+
provides :dnf_package
|
45
50
|
|
46
51
|
#
|
47
52
|
# Most of the magic in this class happens in the python helper script. The ruby side of this
|
@@ -126,6 +131,10 @@ class Chef
|
|
126
131
|
end
|
127
132
|
end
|
128
133
|
|
134
|
+
def version_compare(v1, v2)
|
135
|
+
python_helper.compare_versions(v1, v2)
|
136
|
+
end
|
137
|
+
|
129
138
|
# @returns Array<Version>
|
130
139
|
def available_version(index)
|
131
140
|
@available_version ||= []
|