diff options
author | Kapil Chouhan <kapil.chouhan@msystechnologies.com> | 2019-03-19 16:47:26 +0530 |
---|---|---|
committer | Kapil Chouhan <kapil.chouhan@msystechnologies.com> | 2019-05-07 14:04:03 +0530 |
commit | 38c62c0c14794045154d886ffaf6f27778e659dd (patch) | |
tree | 0e563f420fce95ed1af6a7b21b187bc08e560647 /lib/chef/provider | |
parent | 66c0fdeb65c19d267bd501550e60cd16d7bb4901 (diff) | |
download | chef-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.rb | 91 | ||||
-rw-r--r-- | lib/chef/provider/package/apt.rb | 19 | ||||
-rw-r--r-- | lib/chef/provider/package/deb.rb | 131 | ||||
-rw-r--r-- | lib/chef/provider/package/dpkg.rb | 18 |
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. # |