summaryrefslogtreecommitdiff
path: root/lib/chef/provider
diff options
context:
space:
mode:
authorKapil Chouhan <kapil.chouhan@msystechnologies.com>2019-03-19 16:47:26 +0530
committerKapil Chouhan <kapil.chouhan@msystechnologies.com>2019-05-07 14:04:03 +0530
commit38c62c0c14794045154d886ffaf6f27778e659dd (patch)
tree0e563f420fce95ed1af6a7b21b187bc08e560647 /lib/chef/provider
parent66c0fdeb65c19d267bd501550e60cd16d7bb4901 (diff)
downloadchef-38c62c0c14794045154d886ffaf6f27778e659dd.tar.gz
Move response_file and response_file_variables out of base package resource
Signed-off-by: Kapil Chouhan <kapil.chouhan@msystechnologies.com> Fix for Move response_file and response_file_variables out of base package resource Signed-off-by: Kapil Chouhan <kapil.chouhan@msystechnologies.com> update require changes Signed-off-by: Kapil Chouhan <kapil.chouhan@msystechnologies.com> Updated require changes Signed-off-by: Kapil Chouhan <kapil.chouhan@msystechnologies.com> Fixed some unit test cases Signed-off-by: Kapil Chouhan <kapil.chouhan@msystechnologies.com>
Diffstat (limited to 'lib/chef/provider')
-rw-r--r--lib/chef/provider/package.rb91
-rw-r--r--lib/chef/provider/package/apt.rb19
-rw-r--r--lib/chef/provider/package/deb.rb131
-rw-r--r--lib/chef/provider/package/dpkg.rb18
4 files changed, 141 insertions, 118 deletions
diff --git a/lib/chef/provider/package.rb b/lib/chef/provider/package.rb
index 44d7fed6f4..d0fb216604 100644
--- a/lib/chef/provider/package.rb
+++ b/lib/chef/provider/package.rb
@@ -88,14 +88,7 @@ class Chef
return
end
- # @todo: move the preseed code out of the base class (and complete the fix for Array of preseeds? ugh...)
- if new_resource.response_file
- if preseed_file = get_preseed_file(package_names_for_targets, versions_for_targets)
- converge_by("preseed package #{package_names_for_targets}") do
- preseed_package(preseed_file)
- end
- end
- end
+ prepare_for_installation
converge_by(install_description) do
multipackage_api_adapter(package_names_for_targets, versions_for_targets) do |name, version|
@@ -194,31 +187,6 @@ class Chef
end
end
- action :reconfig do
- if current_resource.version.nil?
- logger.trace("#{new_resource} is NOT installed - nothing to do")
- return
- end
-
- unless new_resource.response_file
- logger.trace("#{new_resource} no response_file provided - nothing to do")
- return
- end
-
- 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)
- multipackage_api_adapter(new_resource.package_name, current_resource.version) do |name, version|
- reconfig_package(name, version)
-
- end
- logger.info("#{new_resource} reconfigured")
- end
- else
- logger.trace("#{new_resource} preseeding has not changed - nothing to do")
- end
- end
-
def action_lock
packages_locked = if respond_to?(:packages_all_locked?, true)
packages_all_locked?(Array(new_resource.package_name), Array(new_resource.version))
@@ -262,6 +230,10 @@ class Chef
raise Chef::Exceptions::UnsupportedAction, "#{self} has no way to detect if package is locked"
end
+ # Subclasses will override this to a method and provide a preseed file path
+ def prepare_for_installation
+ end
+
# @todo use composition rather than inheritance
def multipackage_api_adapter(name, version)
@@ -292,7 +264,7 @@ class Chef
raise Chef::Exceptions::UnsupportedAction, "#{self} does not support pre-seeding package install/upgrade instructions"
end
- def reconfig_package(name, version)
+ def reconfig_package(name)
raise( Chef::Exceptions::UnsupportedAction, "#{self} does not support :reconfig" )
end
@@ -384,46 +356,6 @@ class Chef
target_version_already_installed?(current_version, new_version)
end
- # @todo: extract apt/dpkg specific preseeding to a helper class
- def get_preseed_file(name, version)
- resource = preseed_resource(name, version)
- resource.run_action(:create)
- logger.trace("#{new_resource} fetched preseed file to #{resource.path}")
-
- if resource.updated_by_last_action?
- resource.path
- else
- false
- end
- end
-
- # @todo: extract apt/dpkg specific preseeding to a helper class
- def preseed_resource(name, version)
- # A directory in our cache to store this cookbook's preseed files in
- file_cache_dir = Chef::FileCache.create_cache_path("preseed/#{new_resource.cookbook_name}")
- # The full path where the preseed file will be stored
- cache_seed_to = "#{file_cache_dir}/#{name}-#{version}.seed"
-
- logger.trace("#{new_resource} fetching preseed file to #{cache_seed_to}")
-
- if template_available?(new_resource.response_file)
- logger.trace("#{new_resource} fetching preseed file via Template")
- remote_file = Chef::Resource::Template.new(cache_seed_to, run_context)
- remote_file.variables(new_resource.response_file_variables)
- elsif cookbook_file_available?(new_resource.response_file)
- logger.trace("#{new_resource} fetching preseed file via cookbook_file")
- remote_file = Chef::Resource::CookbookFile.new(cache_seed_to, run_context)
- else
- message = "No template or cookbook file found for response file #{new_resource.response_file}"
- raise Chef::Exceptions::FileNotFound, message
- end
-
- remote_file.cookbook_name = new_resource.cookbook_name
- remote_file.source(new_resource.response_file)
- remote_file.backup(false)
- remote_file
- end
-
# helper method used by subclasses
#
def as_array(thing)
@@ -479,7 +411,6 @@ class Chef
@target_version_array ||=
begin
target_version_array = []
-
each_package do |package_name, new_version, current_version, candidate_version|
case action
when :upgrade
@@ -657,16 +588,6 @@ class Chef
end
end
- # @todo: extract apt/dpkg specific preseeding to a helper class
- def template_available?(path)
- run_context.has_template_in_cookbook?(new_resource.cookbook_name, path)
- end
-
- # @todo: extract apt/dpkg specific preseeding to a helper class
- def cookbook_file_available?(path)
- run_context.has_cookbook_file_in_cookbook?(new_resource.cookbook_name, path)
- end
-
def allow_downgrade
if new_resource.respond_to?("allow_downgrade")
new_resource.allow_downgrade
diff --git a/lib/chef/provider/package/apt.rb b/lib/chef/provider/package/apt.rb
index dfc7e602dd..75c7935805 100644
--- a/lib/chef/provider/package/apt.rb
+++ b/lib/chef/provider/package/apt.rb
@@ -17,12 +17,14 @@
#
require "chef/provider/package"
+require "chef/provider/package/deb"
require "chef/resource/apt_package"
class Chef
class Provider
class Package
class Apt < Chef::Provider::Package
+ include Chef::Provider::Package::Deb
use_multipackage_api
provides :package, platform_family: "debian"
@@ -114,16 +116,6 @@ class Chef
run_noninteractive("apt-get", "-q", "-y", options, "purge", package_name)
end
- def preseed_package(preseed_file)
- logger.info("#{new_resource} pre-seeding package installation instructions")
- run_noninteractive("debconf-set-selections", preseed_file)
- end
-
- def reconfig_package(name, version)
- logger.info("#{new_resource} reconfiguring")
- run_noninteractive("dpkg-reconfigure", name)
- end
-
def lock_package(name, version)
run_noninteractive("apt-mark", options, "hold", name)
end
@@ -161,13 +153,6 @@ class Chef
end
end
- # Runs command via shell_out with magic environment to disable
- # interactive prompts. Command is run with default localization rather
- # than forcing locale to "C", so command output may not be stable.
- def run_noninteractive(*args)
- shell_out!(*args, env: { "DEBIAN_FRONTEND" => "noninteractive" })
- end
-
def default_release_options
# Use apt::Default-Release option only if provider supports it
if new_resource.respond_to?(:default_release) && new_resource.default_release
diff --git a/lib/chef/provider/package/deb.rb b/lib/chef/provider/package/deb.rb
new file mode 100644
index 0000000000..439127e18a
--- /dev/null
+++ b/lib/chef/provider/package/deb.rb
@@ -0,0 +1,131 @@
+#
+# Author:: Kapil Chouhan (<kapil.chouhan@msystechnologies.com>)
+# Copyright:: Copyright 2010-2019, Chef Software Inc.
+# License:: Apache License, Version 2.0
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+require "chef/provider/package"
+
+class Chef
+ class Provider
+ class Package
+ module Deb
+ def self.included(base)
+ base.class_eval do
+ use_multipackage_api
+
+ action :reconfig do
+ if current_resource.version.nil?
+ logger.trace("#{new_resource} is NOT installed - nothing to do")
+ return
+ end
+
+ unless new_resource.response_file
+ logger.trace("#{new_resource} no response_file provided - nothing to do")
+ return
+ end
+
+ 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)
+ multipackage_api_adapter(new_resource.package_name, current_resource.version) do |name, _version|
+ reconfig_package(name)
+ end
+ logger.info("#{new_resource} reconfigured")
+ end
+ else
+ logger.trace("#{new_resource} preseeding has not changed - nothing to do")
+ end
+ end
+
+ # This method is used for getting preseed file
+ # it will return preseed file path or false if response_file is present
+ def prepare_for_installation
+ if new_resource.response_file && preseed_file = get_preseed_file(package_names_for_targets, versions_for_targets)
+ converge_by("preseed package #{package_names_for_targets}") do
+ preseed_package(preseed_file)
+ end
+ end
+ end
+
+ def get_preseed_file(name, version)
+ resource = preseed_resource(name, version)
+ resource.run_action(:create)
+ logger.trace("#{new_resource} fetched preseed file to #{resource.path}")
+
+ if resource.updated_by_last_action?
+ resource.path
+ else
+ false
+ end
+ end
+
+ def preseed_resource(name, version)
+ # A directory in our cache to store this cookbook's preseed files in
+ file_cache_dir = Chef::FileCache.create_cache_path("preseed/#{new_resource.cookbook_name}")
+ # The full path where the preseed file will be stored
+ cache_seed_to = "#{file_cache_dir}/#{name}-#{version}.seed"
+
+ logger.trace("#{new_resource} fetching preseed file to #{cache_seed_to}")
+
+ if template_available?(new_resource.response_file)
+ logger.trace("#{new_resource} fetching preseed file via Template")
+ remote_file = Chef::Resource::Template.new(cache_seed_to, run_context)
+ remote_file.variables(new_resource.response_file_variables)
+ elsif cookbook_file_available?(new_resource.response_file)
+ logger.trace("#{new_resource} fetching preseed file via cookbook_file")
+ remote_file = Chef::Resource::CookbookFile.new(cache_seed_to, run_context)
+ else
+ message = "No template or cookbook file found for response file #{new_resource.response_file}"
+ raise Chef::Exceptions::FileNotFound, message
+ end
+
+ remote_file.cookbook_name = new_resource.cookbook_name
+ remote_file.source(new_resource.response_file)
+ remote_file.backup(false)
+ remote_file
+ end
+
+ def preseed_package(preseed_file)
+ logger.info("#{new_resource} pre-seeding package installation instructions")
+ run_noninteractive("debconf-set-selections", preseed_file)
+ end
+
+ def reconfig_package(name)
+ logger.info("#{new_resource} reconfiguring")
+ run_noninteractive("dpkg-reconfigure", *name)
+ end
+
+ # Runs command via shell_out with magic environment to disable
+ # interactive prompts.
+ def run_noninteractive(*command)
+ shell_out!(*command, env: { "DEBIAN_FRONTEND" => "noninteractive" })
+ end
+
+ private
+
+ def template_available?(path)
+ run_context.has_template_in_cookbook?(new_resource.cookbook_name, path)
+ end
+
+ def cookbook_file_available?(path)
+ run_context.has_cookbook_file_in_cookbook?(new_resource.cookbook_name, path)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/chef/provider/package/dpkg.rb b/lib/chef/provider/package/dpkg.rb
index 38129c8931..25878797c1 100644
--- a/lib/chef/provider/package/dpkg.rb
+++ b/lib/chef/provider/package/dpkg.rb
@@ -17,12 +17,14 @@
#
require "chef/provider/package"
+require "chef/provider/package/deb"
require "chef/resource/package"
class Chef
class Provider
class Package
class Dpkg < Chef::Provider::Package
+ include Chef::Provider::Package::Deb
DPKG_REMOVED = /^Status: deinstall ok config-files/.freeze
DPKG_INSTALLED = /^Status: install ok installed/.freeze
DPKG_VERSION = /^Version: (.+)$/.freeze
@@ -91,16 +93,6 @@ class Chef
install_package(name, version)
end
- def preseed_package(preseed_file)
- logger.info("#{new_resource} pre-seeding package installation instructions")
- run_noninteractive("debconf-set-selections", *preseed_file)
- end
-
- def reconfig_package(name, version)
- logger.info("#{new_resource} reconfiguring")
- run_noninteractive("dpkg-reconfigure", *name)
- end
-
# Override the superclass check. Multiple sources are required here.
def check_resource_semantics!; end
@@ -149,12 +141,6 @@ class Chef
end
end
- # Runs command via shell_out with magic environment to disable
- # interactive prompts.
- def run_noninteractive(*command)
- shell_out!(*command, env: { "DEBIAN_FRONTEND" => "noninteractive" })
- end
-
# Returns true if all sources exist. Returns false if any do not, or if no
# sources were specified.
#