summaryrefslogtreecommitdiff
path: root/lib/chef/provider/package.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/chef/provider/package.rb')
-rw-r--r--lib/chef/provider/package.rb74
1 files changed, 44 insertions, 30 deletions
diff --git a/lib/chef/provider/package.rb b/lib/chef/provider/package.rb
index 880104bff7..888b171fa4 100644
--- a/lib/chef/provider/package.rb
+++ b/lib/chef/provider/package.rb
@@ -1,6 +1,6 @@
#
# Author:: Adam Jacob (<adam@opscode.com>)
-# Copyright:: Copyright (c) 2008 Opscode, Inc.
+# Copyright:: Copyright (c) 2008-2015 Chef Software, Inc.
# License:: Apache License, Version 2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -86,11 +86,10 @@ class Chef
end
end
- # XXX: mutating the new resource is generally bad
- @new_resource.version(versions_for_new_resource)
-
converge_by(install_description) do
- install_package(package_names_for_targets, versions_for_targets)
+ multipackage_api_adapter(package_names_for_targets, versions_for_targets) do |name, version|
+ install_package(name, version)
+ end
Chef::Log.info("#{@new_resource} installed #{package_names_for_targets} at #{versions_for_targets}")
end
end
@@ -113,11 +112,10 @@ class Chef
return
end
- # XXX: mutating the new resource is generally bad
- @new_resource.version(versions_for_new_resource)
-
converge_by(upgrade_description) do
- upgrade_package(package_names_for_targets, versions_for_targets)
+ multipackage_api_adapter(package_names_for_targets, versions_for_targets) do |name, version|
+ upgrade_package(name, version)
+ end
log_allow_downgrade = allow_downgrade ? '(allow_downgrade)' : ''
Chef::Log.info("#{@new_resource} upgraded#{log_allow_downgrade} #{package_names_for_targets} to #{versions_for_targets}")
end
@@ -138,12 +136,13 @@ class Chef
private :upgrade_description
- # @todo: ability to remove an array of packages
def action_remove
if removing_package?
description = @new_resource.version ? "version #{@new_resource.version} of " : ""
converge_by("remove #{description}package #{@current_resource.package_name}") do
- remove_package(@current_resource.package_name, @new_resource.version)
+ multipackage_api_adapter(@current_resource.package_name, @new_resource.version) do |name, version|
+ remove_package(name, version)
+ end
Chef::Log.info("#{@new_resource} removed")
end
else
@@ -172,18 +171,18 @@ class Chef
end
end
- # @todo: ability to purge an array of packages
def action_purge
if removing_package?
description = @new_resource.version ? "version #{@new_resource.version} of" : ""
converge_by("purge #{description} package #{@current_resource.package_name}") do
- purge_package(@current_resource.package_name, @new_resource.version)
+ multipackage_api_adapter(@current_resource.package_name, @new_resource.version) do |name, version|
+ purge_package(name, version)
+ end
Chef::Log.info("#{@new_resource} purged")
end
end
end
- # @todo: ability to reconfigure an array of packages
def action_reconfig
if @current_resource.version == nil then
Chef::Log.debug("#{@new_resource} is NOT installed - nothing to do")
@@ -198,7 +197,10 @@ class Chef
if preseed_file = get_preseed_file(@new_resource.package_name, @current_resource.version)
converge_by("reconfigure package #{@new_resource.package_name}") do
preseed_package(preseed_file)
- reconfig_package(@new_resource.package_name, @current_resource.version)
+ multipackage_api_adapter(@new_resource.package_name, @current_resource.version) do |name, version|
+ reconfig_package(name, version)
+
+ end
Chef::Log.info("#{@new_resource} reconfigured")
end
else
@@ -207,6 +209,15 @@ class Chef
end
# @todo use composition rather than inheritance
+
+ def multipackage_api_adapter(name, version)
+ if supports_arrays?
+ yield [name].flatten, [version].flatten
+ else
+ yield name, version
+ end
+ end
+
def install_package(name, version)
raise Chef::Exceptions::UnsupportedAction, "#{self.to_s} does not support :install"
end
@@ -287,6 +298,24 @@ class Chef
[ thing ].flatten
end
+ class << self
+ attr_accessor :supports_arrays
+
+ def supports_arrays?
+ !!@supports_arrays
+ end
+
+ private
+
+ def use_multipackage_api
+ @supports_arrays = true
+ end
+ end
+
+ def supports_arrays?
+ self.class.supports_arrays?
+ end
+
private
# Returns the package names which need to be modified. If the resource was called with an array of packages
@@ -322,18 +351,6 @@ class Chef
multipackage? ? versions_for_targets : versions_for_targets[0]
end
- # We need to mutate @new_resource.version() for some reason and this is a helper so that we inject the right
- # class (String or Array) into that attribute based on if we're handling an array of package names or not.
- #
- # @return [String, Array<String>] target_versions coerced into the correct type for back-compat
- def versions_for_new_resource
- if multipackage?
- target_version_array
- else
- target_version_array[0]
- end
- end
-
# Return an array indexed the same as *_version_array which contains either the target version to install/upgrade to
# or else nil if the package is not being modified.
#
@@ -491,8 +508,6 @@ class Chef
end
end
- private
-
def shell_out_with_timeout(*command_args)
shell_out(*add_timeout_option(command_args))
end
@@ -513,7 +528,6 @@ class Chef
end
args
end
-
end
end
end