Class: Chef::Provider::Package::Yum
- Inherits:
-
Chef::Provider::Package
- Object
- Chef::Provider
- Chef::Provider::Package
- Chef::Provider::Package::Yum
- Extended by:
- Mixin::ShellOut, Mixin::Which
- Includes:
- Mixin::GetSourceFromPackage
- Defined in:
- lib/chef/provider/package/yum.rb,
lib/chef/provider/package/yum/version.rb,
lib/chef/provider/package/yum/rpm_utils.rb,
lib/chef/provider/package/yum/yum_cache.rb,
lib/chef/provider/package/yum/python_helper.rb
Defined Under Namespace
Classes: PythonHelper, RPMDb, RPMDbPackage, RPMDependency, RPMPackage, RPMProvide, RPMRequire, RPMUtils, RPMVersion, Version, YumCache
Instance Attribute Summary
Attributes inherited from Chef::Provider
#action, #after_resource, #current_resource, #logger, #new_resource, #run_context
Instance Method Summary collapse
- #candidate_version ⇒ Object
- #define_resource_requirements ⇒ Object
- #get_current_versions ⇒ Object
- #install_package(names, versions) ⇒ Object (also: #upgrade_package)
- #load_after_resource ⇒ Object
- #load_current_resource ⇒ Object
-
#lock_package(names, versions) ⇒ Object
NB: the yum_package provider manages individual single packages, please do not submit issues or PRs to try to add wildcard support to lock / unlock.
- #magic_version_array ⇒ Object
-
#python_helper ⇒ Object
Most of the magic in this class happens in the python helper script.
- #remove_package(names, versions) ⇒ Object (also: #purge_package)
-
#unlock_package(names, versions) ⇒ Object
NB: the yum_package provider manages individual single packages, please do not submit issues or PRs to try to add wildcard support to lock / unlock.
Methods included from Mixin::GetSourceFromPackage
Methods inherited from Chef::Provider::Package
#as_array, #check_resource_semantics!, #expand_options, #have_any_matching_version?, #initialize, #multipackage_api_adapter, #options, #package_locked, #prepare_for_installation, #preseed_package, #reconfig_package, #removing_package?, #target_version_already_installed?, #version_requirement_satisfied?
Methods included from Mixin::SubclassDirective
Methods inherited from Chef::Provider
action, action_description, action_descriptions, #action_nothing, #check_resource_semantics!, #cleanup_after_converge, #compile_and_converge_action, #converge_by, #converge_if_changed, #cookbook_name, #description, #events, include_resource_dsl?, include_resource_dsl_module, #initialize, #introduced, #node, #process_resource_requirements, provides, provides?, #recipe_name, #requirements, #resource_collection, #resource_updated?, #run_action, #set_updated_status, supports?, use, use_inline_resources, #validate_required_properties!, #whyrun_mode?, #whyrun_supported?
Methods included from Mixin::Provides
#provided_as, #provides, #provides?
Methods included from Mixin::DescendantsTracker
#descendants, descendants, direct_descendants, #direct_descendants, find_descendants_by_name, #find_descendants_by_name, #inherited, store_inherited
Methods included from Mixin::LazyModuleInclude
#descendants, #include, #included
Methods included from Mixin::PowershellOut
#powershell_out, #powershell_out!
Methods included from Mixin::WindowsArchitectureHelper
#assert_valid_windows_architecture!, #disable_wow64_file_redirection, #forced_32bit_override_required?, #is_i386_process_on_x86_64_windows?, #node_supports_windows_architecture?, #node_windows_architecture, #restore_wow64_file_redirection, #valid_windows_architecture?, #with_os_architecture, #wow64_architecture_override_required?, #wow64_directory
Methods included from DSL::Secret
#default_secret_config, #default_secret_service, #secret, #with_secret_config, #with_secret_service
Methods included from DSL::RenderHelpers
#render_json, #render_toml, #render_yaml
Methods included from DSL::ReaderHelpers
#parse_file, #parse_json, #parse_toml, #parse_yaml
Methods included from DSL::Powershell
Methods included from DSL::RegistryHelper
#registry_data_exists?, #registry_get_subkeys, #registry_get_values, #registry_has_subkeys?, #registry_key_exists?, #registry_value_exists?
Methods included from DSL::ChefVault
#chef_vault, #chef_vault_item, #chef_vault_item_for_environment
Methods included from DSL::DataQuery
#data_bag, #data_bag_item, #search, #tagged?
Methods included from EncryptedDataBagItem::CheckEncrypted
Methods included from DSL::PlatformIntrospection
#older_than_win_2012_or_8?, #platform?, #platform_family?, #value_for_platform, #value_for_platform_family
Methods included from DSL::Recipe
#exec, #have_resource_class_for?, #resource_class_for
Methods included from DSL::Definitions
add_definition, #evaluate_resource_definition, #has_resource_definition?
Methods included from DSL::Resources
add_resource_dsl, remove_resource_dsl
Methods included from DSL::Cheffish
Methods included from DSL::RebootPending
Methods included from DSL::IncludeRecipe
Methods included from Mixin::NotifyingBlock
#notifying_block, #subcontext_block
Methods included from DSL::DeclareResource
#build_resource, #declare_resource, #delete_resource, #delete_resource!, #edit_resource, #edit_resource!, #find_resource, #find_resource!, #resources, #with_run_context
Methods included from DSL::Compliance
#include_input, #include_profile, #include_waiver
Instance Method Details
#candidate_version ⇒ Object
88 89 90 91 92 |
# File 'lib/chef/provider/package/yum.rb', line 88 def candidate_version package_name_array.each_with_index.map do |pkg, i| available_version(i).version_with_arch end end |
#define_resource_requirements ⇒ Object
78 79 80 81 82 83 84 85 86 |
# File 'lib/chef/provider/package/yum.rb', line 78 def define_resource_requirements requirements.assert(:install, :upgrade, :remove, :purge) do |a| a.assertion { !new_resource.source || ::File.exist?(new_resource.source) } a. Chef::Exceptions::Package, "Package #{new_resource.package_name} not found: #{new_resource.source}" a.whyrun "assuming #{new_resource.source} would have previously been created" end super end |
#get_current_versions ⇒ Object
100 101 102 103 104 |
# File 'lib/chef/provider/package/yum.rb', line 100 def get_current_versions package_name_array.each_with_index.map do |pkg, i| current_version(i).version_with_arch end end |
#install_package(names, versions) ⇒ Object Also known as: upgrade_package
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
# File 'lib/chef/provider/package/yum.rb', line 106 def install_package(names, versions) method = nil methods = [] names.each_with_index do |n, i| next if n.nil? av = available_version(i) name = av.name # resolve the name via the available/candidate version iv = python_helper.package_query(:whatinstalled, av.name_with_arch, options: ) method = "install" # If this is a package like the kernel that can be installed multiple times, we'll skip over this logic if new_resource.allow_downgrade && version_gt?(iv.version_with_arch, av.version_with_arch) && !python_helper.install_only_packages(name) # We allow downgrading only in the event of single-package # rules where the user explicitly allowed it method = "downgrade" end methods << method end # We could split this up into two commands if we wanted to, but # for now, just don't support this. if methods.uniq.length > 1 raise Chef::Exceptions::Package, "Multipackage rule has a mix of upgrade and downgrade packages. Cannot proceed." end if new_resource.source yum(, "-y", method, new_resource.source) else resolved_names = names.each_with_index.map { |name, i| available_version(i).to_s unless name.nil? } yum(, "-y", method, resolved_names) end flushcache end |
#load_after_resource ⇒ Object
68 69 70 71 72 73 74 75 76 |
# File 'lib/chef/provider/package/yum.rb', line 68 def load_after_resource # force the installed version array to repopulate @current_version = [] @after_resource = Chef::Resource::YumPackage.new(new_resource.name) after_resource.package_name(new_resource.package_name) after_resource.version(get_current_versions) after_resource end |
#load_current_resource ⇒ Object
58 59 60 61 62 63 64 65 66 |
# File 'lib/chef/provider/package/yum.rb', line 58 def load_current_resource flushcache if new_resource.flush_cache[:before] @current_resource = Chef::Resource::YumPackage.new(new_resource.name) current_resource.package_name(new_resource.package_name) current_resource.version(get_current_versions) current_resource end |
#lock_package(names, versions) ⇒ Object
NB: the yum_package provider manages individual single packages, please do not submit issues or PRs to try to add wildcard support to lock / unlock. The best solution is to write an execute resource which does a not_if ‘yum versionlock | grep ’^pattern“ kind of approach
160 161 162 |
# File 'lib/chef/provider/package/yum.rb', line 160 def lock_package(names, versions) yum("-d0", "-e0", "-y", , "versionlock", "add", resolved_package_lock_names(names)) end |
#magic_version_array ⇒ Object
94 95 96 97 98 |
# File 'lib/chef/provider/package/yum.rb', line 94 def magic_version_array package_name_array.each_with_index.map do |pkg, i| magical_version(i).version_with_arch end end |
#python_helper ⇒ Object
Most of the magic in this class happens in the python helper script. The ruby side of this provider knows only enough to translate Chef-style new_resource name+package+version into a request to the python side. The python side is then responsible for knowing everything about RPMs and what is installed and what is available. The ruby side of this class should remain a lightweight translation layer to translate Chef requests into RPC requests to python. This class knows nothing about how to compare RPM versions, and does not maintain any cached state of installed/available versions and should be kept that way.
54 55 56 |
# File 'lib/chef/provider/package/yum.rb', line 54 def python_helper @python_helper ||= PythonHelper.instance end |
#remove_package(names, versions) ⇒ Object Also known as: purge_package
146 147 148 149 150 |
# File 'lib/chef/provider/package/yum.rb', line 146 def remove_package(names, versions) resolved_names = names.each_with_index.map { |name, i| magical_version(i).to_s unless name.nil? } yum(, "-y", "remove", resolved_names) flushcache end |
#unlock_package(names, versions) ⇒ Object
NB: the yum_package provider manages individual single packages, please do not submit issues or PRs to try to add wildcard support to lock / unlock. The best solution is to write an execute resource which does a only_if ‘yum versionlock | grep ’^pattern“ kind of approach
166 167 168 169 |
# File 'lib/chef/provider/package/yum.rb', line 166 def unlock_package(names, versions) # yum versionlock delete on rhel6 needs the glob nonsense in the following command yum("-d0", "-e0", "-y", , "versionlock", "delete", resolved_package_lock_names(names).map { |n| "*:#{n}-*" }) end |