summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLamont Granquist <lamont@scriptkiddie.org>2016-12-14 16:48:26 -0800
committerLamont Granquist <lamont@scriptkiddie.org>2016-12-14 16:48:26 -0800
commitb3d72d3b30eaf257642424eedc574d72f66de4e0 (patch)
tree624cd17189eddaf4ec5f4816bb44e1555d214118
parente4a442d4d70dda5cd1ddc0799690216281a504ec (diff)
downloadchef-b3d72d3b30eaf257642424eedc574d72f66de4e0.tar.gz
refactor to use array indexes instead of package_names
fixes arch array support. pretty sure that my "helpfully" compacting out nils from the names and versions passed to install_package / remove_package was a design flaw now. all of the helpers i've created to translate from package_name to various arrays also assumes the package_name is a unique identifier which is what was going wrong here, and is wrong. best to just have all the arrays indexed the same. Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
-rw-r--r--lib/chef/provider/package.rb18
-rw-r--r--lib/chef/provider/package/dnf.rb54
-rw-r--r--spec/functional/resource/dnf_package_spec.rb1
3 files changed, 38 insertions, 35 deletions
diff --git a/lib/chef/provider/package.rb b/lib/chef/provider/package.rb
index 619653574b..f52614672a 100644
--- a/lib/chef/provider/package.rb
+++ b/lib/chef/provider/package.rb
@@ -635,24 +635,6 @@ class Chef
end
args
end
-
- # Helper to construct Hash of names-to-versions, requested on the new_resource.
- # If new_resource.version is nil, then all values will be nil.
- #
- # @return [Hash] Mapping of requested names to versions
- def desired_name_versions
- desired_versions = as_array(new_resource.version) || as_array(new_resource.package_name).map { nil }
- Hash[*as_array(new_resource.package_name).zip(desired_versions).flatten]
- end
-
- # Helper to construct Hash of names-to-arches, requested on the new_resource.
- # If new_resource.arch is nil, then all values will be nil.
- #
- # @return [Hash] Mapping of requested names to versions
- def desired_name_archs
- desired_archs = as_array(new_resource.arch) || as_array(new_resource.package_name).map { nil }
- Hash[*as_array(new_resource.package_name).zip(desired_archs).flatten]
- end
end
end
end
diff --git a/lib/chef/provider/package/dnf.rb b/lib/chef/provider/package/dnf.rb
index 6173637c8c..c22f06f52c 100644
--- a/lib/chef/provider/package/dnf.rb
+++ b/lib/chef/provider/package/dnf.rb
@@ -27,6 +27,8 @@ class Chef
extend Chef::Mixin::Which
include Chef::Mixin::GetSourceFromPackage
+ allow_nils
+
class Version
attr_accessor :name
attr_accessor :version
@@ -179,14 +181,14 @@ class Chef
end
def candidate_version
- package_name_array.map do |pkg|
- available_version(pkg).version_with_arch
+ package_name_array.each_with_index.map do |pkg, i|
+ available_version(i).version_with_arch
end
end
def get_current_versions
- package_name_array.map do |pkg|
- installed_version(pkg).version_with_arch
+ package_name_array.each_with_index.map do |pkg, i|
+ installed_version(i).version_with_arch
end
end
@@ -194,7 +196,7 @@ class Chef
if new_resource.source
dnf(new_resource.options, "-y install", new_resource.source)
else
- resolved_names = names.map { |name| available_version(name).to_s }
+ resolved_names = names.each_with_index.map { |name, i| available_version(i).to_s unless name.nil? }
dnf(new_resource.options, "-y install", resolved_names)
end
flushcache_after
@@ -204,7 +206,7 @@ class Chef
alias_method :upgrade_package, :install_package
def remove_package(names, versions)
- resolved_names = names.map { |name| installed_version(name).to_s }
+ resolved_names = names.each_with_index.map { |name, i| installed_version(i).to_s unless name.nil? }
dnf(new_resource.options, "-y remove", resolved_names)
flushcache_after
end
@@ -235,27 +237,27 @@ class Chef
end
# @returns Array<Version>
- def available_version(package_name)
- @available_version ||= {}
+ def available_version(index)
+ @available_version ||= []
if new_resource.source
- @available_version[package_name] ||= resolve_source_to_version_obj
+ @available_version[index] ||= resolve_source_to_version_obj
else
- @available_version[package_name] ||= python_helper.query(:whatavailable, package_name, desired_name_versions[package_name], desired_name_archs[package_name])
+ @available_version[index] ||= python_helper.query(:whatavailable, package_name_array[index], safe_version_array[index], safe_arch_array[index])
end
- @available_version[package_name]
+ @available_version[index]
end
# @returns Array<Version>
- def installed_version(package_name)
- @installed_version ||= {}
+ def installed_version(index)
+ @installed_version ||= []
if new_resource.source
- @installed_version[package_name] ||= python_helper.query(:whatinstalled, available_version(package_name).name, desired_name_versions[package_name], desired_name_archs[package_name])
+ @installed_version[index] ||= python_helper.query(:whatinstalled, available_version(index).name, safe_version_array[index], safe_arch_array[index])
else
- @installed_version[package_name] ||= python_helper.query(:whatinstalled, package_name, desired_name_versions[package_name], desired_name_archs[package_name])
+ @installed_version[index] ||= python_helper.query(:whatinstalled, package_name_array[index], safe_version_array[index], safe_arch_array[index])
end
- @installed_version[package_name]
+ @installed_version[index]
end
def flushcache
@@ -270,6 +272,26 @@ class Chef
shell_out_with_timeout!(a_to_s("dnf", *args))
end
+ def safe_version_array
+ if new_resource.version.is_a?(Array)
+ new_resource.version
+ elsif new_resource.version.nil?
+ package_name_array.map { nil }
+ else
+ [ new_resource.version ]
+ end
+ end
+
+ def safe_arch_array
+ if new_resource.arch.is_a?(Array)
+ new_resource.arch
+ elsif new_resource.arch.nil?
+ package_name_array.map { nil }
+ else
+ [ new_resource.arch ]
+ end
+ end
+
end
end
end
diff --git a/spec/functional/resource/dnf_package_spec.rb b/spec/functional/resource/dnf_package_spec.rb
index 487ddc5171..549bbad768 100644
--- a/spec/functional/resource/dnf_package_spec.rb
+++ b/spec/functional/resource/dnf_package_spec.rb
@@ -421,7 +421,6 @@ gpgcheck=0
# unlikely to work consistently correct, okay to deprecate the arch-array in favor of the arch in the name
it "installs two rpms with multi-arch" do
- skip "isn't going to work without major refactor"
flush_cache
dnf_package.package_name(%w{chef_rpm chef_rpm} )
dnf_package.arch(%w{x86_64 i686})