chef 16.2.44 → 16.4.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +4 -4
- data/Rakefile +3 -16
- data/chef-universal-mingw32.gemspec +2 -3
- data/chef.gemspec +4 -3
- data/lib/chef/action_collection.rb +4 -0
- data/lib/chef/api_client/registration.rb +8 -8
- data/lib/chef/application.rb +18 -1
- data/lib/chef/application/apply.rb +6 -5
- data/lib/chef/application/base.rb +2 -0
- data/lib/chef/application/client.rb +3 -0
- data/lib/chef/application/windows_service.rb +27 -27
- data/lib/chef/{whitelist.rb → attribute_allowlist.rb} +11 -11
- data/lib/chef/{blacklist.rb → attribute_blocklist.rb} +9 -9
- data/lib/chef/chef_class.rb +0 -1
- data/lib/chef/chef_fs/chef_fs_data_store.rb +54 -54
- data/lib/chef/chef_fs/data_handler/organization_data_handler.rb +1 -2
- data/lib/chef/chef_fs/file_system/chef_server/acl_entry.rb +10 -10
- data/lib/chef/chef_fs/file_system/chef_server/cookbook_file.rb +2 -2
- data/lib/chef/chef_fs/file_system/chef_server/cookbooks_dir.rb +1 -5
- data/lib/chef/chef_fs/file_system/chef_server/organization_invites_entry.rb +8 -8
- data/lib/chef/chef_fs/file_system/chef_server/organization_members_entry.rb +8 -8
- data/lib/chef/chef_fs/file_system/repository/base_file.rb +1 -0
- data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_dir.rb +2 -2
- data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_entry.rb +1 -1
- data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_root_dir.rb +18 -18
- data/lib/chef/chef_fs/file_system/repository/directory.rb +1 -1
- data/lib/chef/chef_fs/file_system/repository/file_system_entry.rb +1 -1
- data/lib/chef/chef_fs/parallelizer/parallel_enumerable.rb +1 -1
- data/lib/chef/client.rb +14 -14
- data/lib/chef/cookbook/remote_file_vendor.rb +1 -3
- data/lib/chef/cookbook/syntax_check.rb +1 -2
- data/lib/chef/cookbook_loader.rb +15 -29
- data/lib/chef/data_bag.rb +1 -2
- data/lib/chef/data_collector/run_end_message.rb +11 -1
- data/lib/chef/deprecated.rb +8 -0
- data/lib/chef/digester.rb +3 -2
- data/lib/chef/dsl/platform_introspection.rb +9 -7
- data/lib/chef/encrypted_data_bag_item/decryptor.rb +1 -1
- data/lib/chef/environment.rb +3 -4
- data/lib/chef/exceptions.rb +4 -1
- data/lib/chef/file_access_control/windows.rb +2 -2
- data/lib/chef/file_content_management/deploy/mv_unix.rb +1 -1
- data/lib/chef/file_content_management/tempfile.rb +9 -9
- data/lib/chef/handler.rb +2 -0
- data/lib/chef/http.rb +12 -12
- data/lib/chef/http/authenticator.rb +3 -1
- data/lib/chef/json_compat.rb +1 -1
- data/lib/chef/knife.rb +4 -4
- data/lib/chef/knife/bootstrap.rb +18 -15
- data/lib/chef/knife/bootstrap/train_connector.rb +1 -0
- data/lib/chef/knife/config_get.rb +1 -0
- data/lib/chef/knife/config_list_profiles.rb +4 -1
- data/lib/chef/knife/config_use_profile.rb +15 -5
- data/lib/chef/knife/configure.rb +1 -1
- data/lib/chef/knife/cookbook_download.rb +1 -1
- data/lib/chef/knife/cookbook_metadata.rb +1 -1
- data/lib/chef/knife/cookbook_upload.rb +29 -37
- data/lib/chef/knife/core/bootstrap_context.rb +1 -1
- data/lib/chef/knife/core/gem_glob_loader.rb +1 -1
- data/lib/chef/knife/core/generic_presenter.rb +1 -1
- data/lib/chef/knife/core/hashed_command_loader.rb +3 -2
- data/lib/chef/knife/core/subcommand_loader.rb +20 -1
- data/lib/chef/knife/core/ui.rb +8 -2
- data/lib/chef/knife/core/windows_bootstrap_context.rb +33 -26
- data/lib/chef/knife/delete.rb +15 -15
- data/lib/chef/knife/exec.rb +2 -2
- data/lib/chef/knife/rehash.rb +3 -21
- data/lib/chef/knife/ssh.rb +11 -7
- data/lib/chef/knife/xargs.rb +19 -19
- data/lib/chef/knife/yaml_convert.rb +1 -1
- data/lib/chef/log.rb +7 -2
- data/lib/chef/mixin/checksum.rb +0 -1
- data/{spec/functional/resource/base.rb → lib/chef/mixin/chef_utils_wiring.rb} +24 -12
- data/lib/chef/mixin/deep_merge.rb +35 -6
- data/{spec/unit/log_spec.rb → lib/chef/mixin/default_paths.rb} +13 -5
- data/lib/chef/mixin/openssl_helper.rb +30 -6
- data/lib/chef/mixin/path_sanity.rb +5 -4
- data/lib/chef/mixin/shell_out.rb +4 -188
- data/lib/chef/mixin/template.rb +1 -0
- data/lib/chef/mixin/which.rb +6 -3
- data/lib/chef/mixins.rb +1 -0
- data/lib/chef/monkey_patches/webrick-utils.rb +10 -10
- data/lib/chef/node.rb +36 -12
- data/lib/chef/node/attribute.rb +2 -4
- data/lib/chef/node_map.rb +21 -18
- data/lib/chef/platform/service_helpers.rb +31 -28
- data/lib/chef/property.rb +1 -1
- data/lib/chef/provider/cron/unix.rb +0 -2
- data/lib/chef/provider/git.rb +17 -9
- data/lib/chef/provider/group.rb +0 -2
- data/lib/chef/provider/group/suse.rb +5 -5
- data/lib/chef/provider/ifconfig.rb +1 -4
- data/lib/chef/provider/mount.rb +0 -2
- data/lib/chef/provider/mount/solaris.rb +0 -1
- data/lib/chef/provider/package.rb +0 -2
- data/lib/chef/provider/package/rubygems.rb +1 -1
- data/lib/chef/provider/package/snap.rb +3 -4
- data/lib/chef/provider/package/windows.rb +9 -4
- data/lib/chef/provider/package/windows/registry_uninstall_entry.rb +9 -9
- data/lib/chef/provider/package/zypper.rb +0 -1
- data/lib/chef/provider/powershell_script.rb +21 -5
- data/lib/chef/provider/route.rb +1 -1
- data/lib/chef/provider/service.rb +2 -2
- data/lib/chef/provider/service/arch.rb +1 -1
- data/lib/chef/provider/service/debian.rb +1 -1
- data/lib/chef/provider/service/gentoo.rb +2 -2
- data/lib/chef/provider/service/macosx.rb +2 -2
- data/lib/chef/provider/service/openbsd.rb +1 -4
- data/lib/chef/provider/service/redhat.rb +2 -2
- data/lib/chef/provider/service/upstart.rb +1 -1
- data/lib/chef/provider/service/windows.rb +10 -10
- data/lib/chef/provider/systemd_unit.rb +0 -2
- data/lib/chef/provider/template/content.rb +1 -0
- data/lib/chef/provider/user/dscl.rb +2 -2
- data/lib/chef/provider/user/mac.rb +9 -9
- data/lib/chef/provider/windows_task.rb +0 -3
- data/lib/chef/provider/yum_repository.rb +1 -1
- data/lib/chef/provider/zypper_repository.rb +1 -2
- data/lib/chef/providers.rb +0 -1
- data/lib/chef/recipe.rb +1 -1
- data/lib/chef/resource.rb +9 -11
- data/lib/chef/resource/alternatives.rb +1 -1
- data/lib/chef/resource/apt_repository.rb +1 -10
- data/lib/chef/resource/build_essential.rb +2 -2
- data/lib/chef/resource/chef_client_scheduled_task.rb +1 -1
- data/lib/chef/resource/chef_client_systemd_timer.rb +2 -2
- data/lib/chef/resource/chef_gem.rb +57 -21
- data/lib/chef/resource/chef_vault_secret.rb +13 -13
- data/lib/chef/resource/chocolatey_feature.rb +1 -2
- data/lib/chef/resource/cron/cron_d.rb +1 -1
- data/lib/chef/resource/cron_access.rb +2 -2
- data/lib/chef/resource/dmg_package.rb +2 -2
- data/lib/chef/resource/execute.rb +4 -5
- data/lib/chef/resource/gem_package.rb +35 -2
- data/lib/chef/resource/homebrew_update.rb +2 -2
- data/lib/chef/resource/hostname.rb +18 -18
- data/lib/chef/resource/launchd.rb +1 -1
- data/lib/chef/resource/lwrp_base.rb +1 -0
- data/lib/chef/resource/macos_userdefaults.rb +176 -61
- data/lib/chef/resource/openssl_dhparam.rb +2 -0
- data/lib/chef/resource/openssl_ec_private_key.rb +2 -0
- data/lib/chef/resource/openssl_ec_public_key.rb +2 -0
- data/lib/chef/resource/openssl_rsa_private_key.rb +2 -0
- data/lib/chef/resource/openssl_rsa_public_key.rb +2 -0
- data/lib/chef/resource/openssl_x509_certificate.rb +35 -35
- data/lib/chef/resource/openssl_x509_crl.rb +3 -2
- data/lib/chef/resource/openssl_x509_request.rb +23 -20
- data/lib/chef/resource/osx_profile.rb +227 -5
- data/lib/chef/resource/powershell_package_source.rb +1 -1
- data/lib/chef/resource/powershell_script.rb +24 -30
- data/lib/chef/resource/service.rb +2 -2
- data/lib/chef/resource/ssh_known_hosts_entry.rb +16 -1
- data/lib/chef/resource/sudo.rb +31 -4
- data/lib/chef/resource/swap_file.rb +17 -0
- data/lib/chef/resource/sysctl.rb +5 -5
- data/lib/chef/resource/timezone.rb +15 -0
- data/lib/chef/resource/user_ulimit.rb +1 -1
- data/lib/chef/resource/windows_ad_join.rb +2 -0
- data/lib/chef/resource/windows_audit_policy.rb +3 -0
- data/lib/chef/resource/windows_auto_run.rb +2 -0
- data/lib/chef/resource/windows_certificate.rb +2 -0
- data/lib/chef/resource/windows_dfs_folder.rb +2 -0
- data/lib/chef/resource/windows_dfs_namespace.rb +2 -0
- data/lib/chef/resource/windows_dfs_server.rb +2 -0
- data/lib/chef/resource/windows_dns_record.rb +25 -5
- data/lib/chef/resource/windows_dns_zone.rb +12 -7
- data/lib/chef/resource/windows_feature.rb +2 -0
- data/lib/chef/resource/windows_feature_dism.rb +10 -0
- data/lib/chef/resource/windows_feature_powershell.rb +14 -2
- data/lib/chef/resource/windows_firewall_profile.rb +199 -0
- data/lib/chef/resource/windows_firewall_rule.rb +5 -3
- data/lib/chef/resource/windows_font.rb +3 -1
- data/lib/chef/resource/windows_pagefile.rb +4 -0
- data/lib/chef/resource/windows_printer.rb +17 -18
- data/lib/chef/resource/windows_printer_port.rb +14 -13
- data/lib/chef/resource/windows_security_policy.rb +52 -21
- data/lib/chef/resource/windows_share.rb +5 -3
- data/lib/chef/resource/windows_shortcut.rb +2 -0
- data/lib/chef/resource/windows_uac.rb +2 -0
- data/lib/chef/resource/windows_user_privilege.rb +27 -2
- data/lib/chef/resource/windows_workgroup.rb +2 -3
- data/lib/chef/resource_collection/stepable_iterator.rb +1 -2
- data/lib/chef/resource_inspector.rb +7 -1
- data/lib/chef/resources.rb +1 -0
- data/lib/chef/role.rb +3 -4
- data/lib/chef/run_context/cookbook_compiler.rb +20 -20
- data/lib/chef/run_status.rb +2 -6
- data/lib/chef/server_api_versions.rb +4 -0
- data/lib/chef/shell.rb +1 -1
- data/lib/chef/shell/shell_session.rb +2 -0
- data/lib/chef/util/backup.rb +1 -1
- data/lib/chef/util/diff.rb +11 -12
- data/lib/chef/util/powershell/cmdlet.rb +1 -1
- data/lib/chef/version.rb +2 -2
- data/lib/chef/win32/file.rb +2 -2
- data/lib/chef/win32/file/version_info.rb +5 -5
- data/lib/chef/win32/registry.rb +1 -2
- data/spec/data/ssl/chef-rspec.cert +15 -15
- data/spec/functional/knife/configure_spec.rb +1 -1
- data/spec/functional/knife/ssh_spec.rb +5 -16
- data/spec/functional/resource/aix_service_spec.rb +9 -2
- data/spec/functional/resource/aixinit_service_spec.rb +8 -9
- data/spec/functional/resource/apt_package_spec.rb +0 -1
- data/spec/functional/resource/bash_spec.rb +3 -2
- data/spec/functional/resource/bff_spec.rb +3 -3
- data/spec/functional/resource/chocolatey_package_spec.rb +4 -0
- data/spec/functional/resource/cookbook_file_spec.rb +1 -1
- data/spec/functional/resource/cron_spec.rb +10 -2
- data/spec/functional/resource/dnf_package_spec.rb +4 -1
- data/spec/functional/resource/dsc_resource_spec.rb +1 -1
- data/spec/functional/resource/dsc_script_spec.rb +0 -1
- data/spec/functional/resource/execute_spec.rb +1 -1
- data/spec/functional/resource/git_spec.rb +23 -1
- data/spec/functional/resource/group_spec.rb +21 -9
- data/spec/functional/resource/ifconfig_spec.rb +9 -1
- data/spec/functional/resource/insserv_spec.rb +7 -7
- data/spec/functional/resource/link_spec.rb +22 -25
- data/spec/functional/resource/mount_spec.rb +9 -1
- data/spec/functional/resource/msu_package_spec.rb +9 -3
- data/spec/functional/resource/powershell_script_spec.rb +8 -8
- data/spec/functional/resource/remote_file_spec.rb +7 -13
- data/spec/functional/resource/rpm_spec.rb +3 -3
- data/spec/functional/resource/timezone_spec.rb +2 -0
- data/spec/functional/resource/windows_certificate_spec.rb +3 -3
- data/spec/functional/resource/windows_font_spec.rb +49 -0
- data/spec/functional/resource/windows_package_spec.rb +0 -1
- data/spec/functional/resource/windows_path_spec.rb +4 -0
- data/spec/functional/resource/windows_security_policy_spec.rb +0 -4
- data/spec/functional/resource/windows_service_spec.rb +4 -0
- data/spec/functional/resource/windows_task_spec.rb +4 -3
- data/spec/functional/resource/windows_user_privilege_spec.rb +1 -2
- data/spec/functional/resource/yum_package_spec.rb +4 -1
- data/spec/functional/resource/zypper_package_spec.rb +4 -1
- data/spec/functional/run_lock_spec.rb +26 -25
- data/spec/functional/shell_spec.rb +5 -6
- data/spec/functional/util/powershell/cmdlet_spec.rb +1 -1
- data/spec/functional/version_spec.rb +1 -1
- data/spec/functional/win32/crypto_spec.rb +1 -1
- data/spec/functional/win32/registry_spec.rb +8 -8
- data/spec/functional/win32/service_manager_spec.rb +1 -1
- data/spec/integration/knife/common_options_spec.rb +12 -12
- data/spec/integration/knife/config_get_profile_spec.rb +69 -68
- data/spec/integration/knife/config_get_spec.rb +126 -125
- data/spec/integration/knife/config_list_profiles_spec.rb +181 -152
- data/spec/integration/knife/config_use_profile_spec.rb +115 -61
- data/spec/integration/knife/cookbook_upload_spec.rb +28 -1
- data/spec/integration/knife/data_bag_from_file_spec.rb +1 -1
- data/spec/integration/knife/diff_spec.rb +3 -1
- data/spec/integration/knife/download_spec.rb +3 -1
- data/spec/integration/knife/environment_from_file_spec.rb +1 -1
- data/spec/integration/knife/node_from_file_spec.rb +1 -1
- data/spec/integration/knife/role_from_file_spec.rb +1 -1
- data/spec/integration/knife/serve_spec.rb +5 -5
- data/spec/integration/knife/upload_spec.rb +3 -1
- data/spec/integration/recipes/accumulator_spec.rb +1 -1
- data/spec/integration/recipes/lwrp_inline_resources_spec.rb +2 -2
- data/spec/integration/recipes/lwrp_spec.rb +1 -1
- data/spec/integration/recipes/notifies_spec.rb +1 -1
- data/spec/integration/recipes/notifying_block_spec.rb +1 -1
- data/spec/integration/recipes/recipe_dsl_spec.rb +5 -1
- data/spec/integration/recipes/resource_converge_if_changed_spec.rb +2 -0
- data/spec/integration/recipes/resource_load_spec.rb +4 -2
- data/spec/integration/recipes/unified_mode_spec.rb +1 -1
- data/spec/integration/recipes/use_partial_spec.rb +1 -1
- data/spec/scripts/ssl-serve.rb +1 -1
- data/spec/spec_helper.rb +16 -10
- data/spec/support/chef_helpers.rb +1 -20
- data/spec/support/platform_helpers.rb +9 -11
- data/spec/support/platforms/win32/spec_service.rb +1 -1
- data/spec/support/shared/functional/directory_resource.rb +1 -1
- data/spec/support/shared/functional/execute_resource.rb +1 -1
- data/spec/support/shared/functional/file_resource.rb +20 -21
- data/spec/support/shared/functional/securable_resource.rb +1 -2
- data/spec/support/shared/functional/securable_resource_with_reporting.rb +0 -1
- data/spec/support/shared/functional/win32_service.rb +1 -1
- data/spec/support/shared/functional/windows_script.rb +5 -5
- data/spec/support/shared/integration/integration_helper.rb +22 -52
- data/spec/support/shared/integration/knife_support.rb +2 -9
- data/spec/support/shared/unit/application_dot_d.rb +0 -1
- data/spec/support/shared/unit/provider/file.rb +12 -8
- data/spec/support/shared/unit/script_resource.rb +6 -20
- data/spec/support/shared/unit/windows_script_resource.rb +15 -28
- data/spec/unit/application/solo_spec.rb +4 -2
- data/spec/unit/application_spec.rb +4 -2
- data/spec/unit/chef_fs/config_spec.rb +2 -2
- data/spec/unit/chef_fs/diff_spec.rb +8 -8
- data/spec/unit/chef_fs/file_system/operation_failed_error_spec.rb +2 -4
- data/spec/unit/chef_fs/{parallelizer.rb → parallelizer_spec.rb} +1 -1
- data/spec/unit/client_spec.rb +4 -1
- data/spec/unit/cookbook/gem_installer_spec.rb +2 -1
- data/spec/unit/cookbook/synchronizer_spec.rb +26 -24
- data/spec/unit/data_bag_spec.rb +6 -3
- data/spec/unit/data_collector_spec.rb +23 -1
- data/spec/unit/decorator_spec.rb +23 -23
- data/spec/unit/dsl/platform_introspection_spec.rb +1 -0
- data/spec/unit/environment_spec.rb +12 -8
- data/spec/unit/event_dispatch/dispatcher_spec.rb +3 -0
- data/spec/unit/guard_interpreter_spec.rb +1 -1
- data/spec/unit/http/api_versions_spec.rb +20 -2
- data/spec/unit/json_compat_spec.rb +1 -1
- data/spec/unit/knife/bootstrap_spec.rb +17 -20
- data/spec/unit/knife/cookbook_download_spec.rb +6 -6
- data/spec/unit/knife/cookbook_metadata_from_file_spec.rb +1 -1
- data/spec/unit/knife/cookbook_show_spec.rb +6 -7
- data/spec/unit/knife/cookbook_upload_spec.rb +7 -10
- data/spec/unit/knife/core/hashed_command_loader_spec.rb +3 -3
- data/spec/unit/knife/core/windows_bootstrap_context_spec.rb +21 -12
- data/spec/unit/knife/data_bag_edit_spec.rb +1 -1
- data/spec/unit/knife/supermarket_share_spec.rb +1 -1
- data/spec/unit/log/syslog_spec.rb +6 -10
- data/spec/unit/log/winevt_spec.rb +21 -13
- data/spec/unit/lwrp_spec.rb +9 -6
- data/spec/unit/mixin/{path_sanity_spec.rb → default_paths_spec.rb} +14 -14
- data/spec/unit/mixin/powershell_exec_spec.rb +1 -1
- data/spec/unit/mixin/powershell_out_spec.rb +2 -4
- data/spec/unit/mixin/powershell_type_coercions_spec.rb +1 -1
- data/spec/unit/mixin/securable_spec.rb +0 -1
- data/spec/unit/mixin/shell_out_spec.rb +25 -26
- data/spec/unit/mixin/subclass_directive_spec.rb +2 -2
- data/spec/unit/mixin/template_spec.rb +30 -30
- data/spec/unit/mixin/unformatter_spec.rb +2 -2
- data/spec/unit/mixin/uris_spec.rb +1 -1
- data/spec/unit/mixin/which.rb +8 -0
- data/spec/unit/mixin/windows_architecture_helper_spec.rb +4 -4
- data/spec/unit/node/immutable_collections_spec.rb +6 -2
- data/spec/unit/node_spec.rb +103 -16
- data/spec/unit/property_spec.rb +5 -5
- data/spec/unit/provider/batch_spec.rb +1 -1
- data/spec/unit/provider/cron/unix_spec.rb +1 -1
- data/spec/unit/provider/dsc_resource_spec.rb +22 -38
- data/spec/unit/provider/dsc_script_spec.rb +10 -10
- data/spec/unit/provider/execute_spec.rb +1 -8
- data/spec/unit/provider/git_spec.rb +3 -3
- data/spec/unit/provider/ifconfig_spec.rb +0 -1
- data/spec/unit/provider/mdadm_spec.rb +1 -3
- data/spec/unit/provider/package/dnf/python_helper_spec.rb +1 -1
- data/spec/unit/provider/package/openbsd_spec.rb +1 -1
- data/spec/unit/provider/package/pacman_spec.rb +17 -20
- data/spec/unit/provider/package/rubygems_spec.rb +5 -10
- data/spec/unit/provider/package/smartos_spec.rb +1 -1
- data/spec/unit/provider/package/windows/registry_uninstall_entry_spec.rb +3 -3
- data/spec/unit/provider/package/windows_spec.rb +30 -53
- data/spec/unit/provider/powershell_script_spec.rb +11 -4
- data/spec/unit/provider/remote_directory_spec.rb +9 -9
- data/spec/unit/provider/service/arch_service_spec.rb +3 -2
- data/spec/unit/provider/service/debian_service_spec.rb +1 -1
- data/spec/unit/provider/service/gentoo_service_spec.rb +7 -7
- data/spec/unit/provider/service/macosx_spec.rb +3 -3
- data/spec/unit/provider/service/redhat_spec.rb +3 -3
- data/spec/unit/provider/service/upstart_service_spec.rb +3 -3
- data/spec/unit/provider/service/windows_spec.rb +2 -6
- data/spec/unit/provider/systemd_unit_spec.rb +28 -24
- data/spec/unit/provider/user/dscl_spec.rb +2 -2
- data/spec/unit/provider/windows_env_spec.rb +5 -4
- data/spec/unit/provider_resolver_spec.rb +6 -6
- data/spec/unit/provider_spec.rb +1 -0
- data/spec/unit/resource/batch_spec.rb +6 -6
- data/spec/unit/resource/chef_client_cron_spec.rb +23 -7
- data/spec/unit/resource/chef_client_systemd_timer_spec.rb +7 -4
- data/spec/unit/resource/execute_spec.rb +123 -118
- data/spec/unit/resource/file/verification_spec.rb +2 -1
- data/spec/unit/resource/macos_user_defaults_spec.rb +103 -2
- data/spec/unit/resource/osx_profile_spec.rb +233 -0
- data/spec/unit/resource/powershell_script_spec.rb +11 -29
- data/spec/unit/resource/script_spec.rb +6 -1
- data/spec/unit/resource/windows_feature_powershell_spec.rb +30 -4
- data/spec/unit/resource/windows_firewall_profile_spec.rb +77 -0
- data/spec/unit/resource/windows_package_spec.rb +1 -0
- data/spec/unit/resource_reporter_spec.rb +1 -1
- data/spec/unit/resource_spec.rb +25 -8
- data/spec/unit/role_spec.rb +30 -28
- data/spec/unit/run_context/cookbook_compiler_spec.rb +1 -1
- data/spec/unit/run_lock_spec.rb +1 -1
- data/spec/unit/scan_access_control_spec.rb +1 -1
- data/spec/unit/server_api_spec.rb +43 -16
- data/spec/unit/util/backup_spec.rb +1 -1
- data/spec/unit/util/diff_spec.rb +1 -15
- data/spec/unit/util/powershell/ps_credential_spec.rb +2 -2
- data/spec/unit/util/selinux_spec.rb +2 -1
- data/spec/unit/win32/security_spec.rb +4 -3
- data/tasks/rspec.rb +1 -1
- metadata +45 -24
- data/lib/chef/provider/osx_profile.rb +0 -255
- data/spec/unit/provider/osx_profile_spec.rb +0 -255
|
@@ -27,7 +27,7 @@ class Chef
|
|
|
27
27
|
# bootstrap templates. For backwards compatibility, they +must+ set the
|
|
28
28
|
# following instance variables:
|
|
29
29
|
# * @config - a hash of knife's config values
|
|
30
|
-
# * @run_list - the run list for the node to
|
|
30
|
+
# * @run_list - the run list for the node to bootstrap
|
|
31
31
|
#
|
|
32
32
|
class WindowsBootstrapContext < BootstrapContext
|
|
33
33
|
attr_accessor :config
|
|
@@ -41,21 +41,6 @@ class Chef
|
|
|
41
41
|
super(config, run_list, chef_config, secret)
|
|
42
42
|
end
|
|
43
43
|
|
|
44
|
-
# This is a duplicate of ChefConfig::PathHelper.cleanpath, however
|
|
45
|
-
# this presumes Windows so we can avoid changing the method definitions
|
|
46
|
-
# across Chef, ChefConfig, and ChefUtils for the circumstance where
|
|
47
|
-
# the methods are being run for a system other than the one Ruby is
|
|
48
|
-
# executing on.
|
|
49
|
-
#
|
|
50
|
-
# We only need to cleanpath the paths that we are passing to cmd.exe,
|
|
51
|
-
# anything written to a configuration file or passed as an argument
|
|
52
|
-
# will be interpreted by ruby later and do the right thing.
|
|
53
|
-
def cleanpath(path)
|
|
54
|
-
path = Pathname.new(path).cleanpath.to_s
|
|
55
|
-
path = path.gsub(File::SEPARATOR, '\\')
|
|
56
|
-
path
|
|
57
|
-
end
|
|
58
|
-
|
|
59
44
|
def validation_key
|
|
60
45
|
if File.exist?(File.expand_path(chef_config[:validation_key]))
|
|
61
46
|
IO.read(File.expand_path(chef_config[:validation_key]))
|
|
@@ -73,12 +58,21 @@ class Chef
|
|
|
73
58
|
end
|
|
74
59
|
|
|
75
60
|
def config_content
|
|
61
|
+
# The windows: true / windows: false in the block that follows is more than a bit weird. The way to read this is that we need
|
|
62
|
+
# the e.g. var_chef_dir to be rendered for the windows value ("C:\chef"), but then we are rendering into a file to be read by
|
|
63
|
+
# ruby, so we don't actually care about forward-vs-backslashes and by rendering into unix we avoid having to deal with the
|
|
64
|
+
# double-backwhacking of everything. So we expect to see:
|
|
65
|
+
#
|
|
66
|
+
# file_cache_path "C:/chef"
|
|
67
|
+
#
|
|
68
|
+
# Which is mildly odd, but should be entirely correct as far as ruby cares.
|
|
69
|
+
#
|
|
76
70
|
client_rb = <<~CONFIG
|
|
77
71
|
chef_server_url "#{chef_config[:chef_server_url]}"
|
|
78
72
|
validation_client_name "#{chef_config[:validation_client_name]}"
|
|
79
|
-
file_cache_path "#{ChefConfig::Config.var_chef_dir(true)}
|
|
80
|
-
file_backup_path "#{ChefConfig::Config.var_chef_dir(true)}
|
|
81
|
-
cache_options ({:path => "#{ChefConfig::Config.etc_chef_dir(true)}
|
|
73
|
+
file_cache_path "#{ChefConfig::PathHelper.escapepath(ChefConfig::Config.var_chef_dir(windows: true))}\\\\cache"
|
|
74
|
+
file_backup_path "#{ChefConfig::PathHelper.escapepath(ChefConfig::Config.var_chef_dir(windows: true))}\\\\backup"
|
|
75
|
+
cache_options ({:path => "#{ChefConfig::PathHelper.escapepath(ChefConfig::Config.etc_chef_dir(windows: true))}\\\\cache\\\\checksums", :skip_expires => true})
|
|
82
76
|
CONFIG
|
|
83
77
|
|
|
84
78
|
unless chef_config[:chef_license].nil?
|
|
@@ -91,8 +85,8 @@ class Chef
|
|
|
91
85
|
client_rb << "# Using default node name (fqdn)\n"
|
|
92
86
|
end
|
|
93
87
|
|
|
94
|
-
if
|
|
95
|
-
client_rb << %Q{log_level :#{
|
|
88
|
+
if config[:config_log_level]
|
|
89
|
+
client_rb << %Q{log_level :#{config[:config_log_level]}\n}
|
|
96
90
|
else
|
|
97
91
|
client_rb << "log_level :auto\n"
|
|
98
92
|
end
|
|
@@ -141,11 +135,11 @@ class Chef
|
|
|
141
135
|
end
|
|
142
136
|
|
|
143
137
|
if config[:secret]
|
|
144
|
-
client_rb << %Q{encrypted_data_bag_secret "#{ChefConfig::Config.etc_chef_dir(true)}/encrypted_data_bag_secret"\n}
|
|
138
|
+
client_rb << %Q{encrypted_data_bag_secret "#{ChefConfig::Config.etc_chef_dir(windows: true)}/encrypted_data_bag_secret"\n}
|
|
145
139
|
end
|
|
146
140
|
|
|
147
141
|
unless trusted_certs_script.empty?
|
|
148
|
-
client_rb << %Q{trusted_certs_dir "#{ChefConfig::Config.etc_chef_dir(true)}/trusted_certs"\n}
|
|
142
|
+
client_rb << %Q{trusted_certs_dir "#{ChefConfig::Config.etc_chef_dir(windows: true)}/trusted_certs"\n}
|
|
149
143
|
end
|
|
150
144
|
|
|
151
145
|
if chef_config[:fips]
|
|
@@ -174,9 +168,14 @@ class Chef
|
|
|
174
168
|
end
|
|
175
169
|
|
|
176
170
|
def start_chef
|
|
171
|
+
c_opscode_dir = ChefConfig::PathHelper.cleanpath(ChefConfig::Config.c_opscode_dir, windows: true)
|
|
172
|
+
client_rb = clean_etc_chef_file("client.rb")
|
|
173
|
+
first_boot = clean_etc_chef_file("first-boot.json")
|
|
174
|
+
|
|
177
175
|
bootstrap_environment_option = bootstrap_environment.nil? ? "" : " -E #{bootstrap_environment}"
|
|
178
|
-
|
|
179
|
-
start_chef
|
|
176
|
+
|
|
177
|
+
start_chef = "SET \"PATH=%SYSTEM32%;%SystemRoot%;%SYSTEM32%\\Wbem;%SYSTEM32%\\WindowsPowerShell\\v1.0\\;C:\\ruby\\bin;#{c_opscode_dir}\\bin;#{c_opscode_dir}\\embedded\\bin\;%PATH%\"\n"
|
|
178
|
+
start_chef << "#{Chef::Dist::CLIENT} -c #{client_rb} -j #{first_boot}#{bootstrap_environment_option}\n"
|
|
180
179
|
end
|
|
181
180
|
|
|
182
181
|
def win_wget
|
|
@@ -276,8 +275,16 @@ class Chef
|
|
|
276
275
|
install_command('"') + "\n" + fallback_install_task_command
|
|
277
276
|
end
|
|
278
277
|
|
|
278
|
+
def clean_etc_chef_file(path)
|
|
279
|
+
ChefConfig::PathHelper.cleanpath(etc_chef_file(path), windows: true)
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
def etc_chef_file(path)
|
|
283
|
+
"#{bootstrap_directory}/#{path}"
|
|
284
|
+
end
|
|
285
|
+
|
|
279
286
|
def bootstrap_directory
|
|
280
|
-
|
|
287
|
+
ChefConfig::Config.etc_chef_dir(windows: true)
|
|
281
288
|
end
|
|
282
289
|
|
|
283
290
|
def local_download_path
|
data/lib/chef/knife/delete.rb
CHANGED
|
@@ -96,21 +96,21 @@ class Chef
|
|
|
96
96
|
found_any = false
|
|
97
97
|
error = false
|
|
98
98
|
results.each do |result|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
99
|
+
|
|
100
|
+
result.delete(config[:recurse])
|
|
101
|
+
deleted_any = true
|
|
102
|
+
found_any = true
|
|
103
|
+
rescue Chef::ChefFS::FileSystem::NotFoundError
|
|
104
|
+
# This is not an error unless *all* of them were not found
|
|
105
|
+
rescue Chef::ChefFS::FileSystem::MustDeleteRecursivelyError => e
|
|
106
|
+
ui.error "#{format_path_with_root(e.entry)} must be deleted recursively! Pass -r to knife delete."
|
|
107
|
+
found_any = true
|
|
108
|
+
error = true
|
|
109
|
+
rescue Chef::ChefFS::FileSystem::OperationNotAllowedError => e
|
|
110
|
+
ui.error "#{format_path_with_root(e.entry)} #{e.reason}."
|
|
111
|
+
found_any = true
|
|
112
|
+
error = true
|
|
113
|
+
|
|
114
114
|
end
|
|
115
115
|
if deleted_any
|
|
116
116
|
output("Deleted #{format_path(results[0])}")
|
data/lib/chef/knife/exec.rb
CHANGED
|
@@ -76,7 +76,7 @@ class Chef::Knife::Exec < Chef::Knife
|
|
|
76
76
|
def find_script(x)
|
|
77
77
|
# Try to find a script. First try expanding the path given.
|
|
78
78
|
script = File.expand_path(x)
|
|
79
|
-
return script if File.
|
|
79
|
+
return script if File.exist?(script)
|
|
80
80
|
|
|
81
81
|
# Failing that, try searching the script path. If we can't find
|
|
82
82
|
# anything, fail gracefully.
|
|
@@ -86,7 +86,7 @@ class Chef::Knife::Exec < Chef::Knife
|
|
|
86
86
|
path = File.expand_path(path)
|
|
87
87
|
test = File.join(path, x)
|
|
88
88
|
Chef::Log.trace("Testing: #{test}")
|
|
89
|
-
if File.
|
|
89
|
+
if File.exist?(test)
|
|
90
90
|
script = test
|
|
91
91
|
Chef::Log.trace("Found: #{test}")
|
|
92
92
|
return script
|
data/lib/chef/knife/rehash.rb
CHANGED
|
@@ -34,7 +34,9 @@ class Chef
|
|
|
34
34
|
else
|
|
35
35
|
reload_plugins
|
|
36
36
|
end
|
|
37
|
-
|
|
37
|
+
|
|
38
|
+
ui.msg "Knife subcommands are cached in #{Chef::Knife::SubcommandLoader.plugin_manifest_path}. Delete this file to disable the caching."
|
|
39
|
+
Chef::Knife::SubcommandLoader.write_hash(Chef::Knife::SubcommandLoader.generate_hash)
|
|
38
40
|
end
|
|
39
41
|
|
|
40
42
|
def reload_plugins
|
|
@@ -43,26 +45,6 @@ class Chef
|
|
|
43
45
|
# loaded plugins and `load_commands` shouldn't have an effect.
|
|
44
46
|
Chef::Knife.subcommand_loader.load_commands
|
|
45
47
|
end
|
|
46
|
-
|
|
47
|
-
def generate_hash
|
|
48
|
-
output = if Chef::Knife::SubcommandLoader.plugin_manifest?
|
|
49
|
-
Chef::Knife::SubcommandLoader.plugin_manifest
|
|
50
|
-
else
|
|
51
|
-
{ Chef::Knife::SubcommandLoader::HashedCommandLoader::KEY => {} }
|
|
52
|
-
end
|
|
53
|
-
output[Chef::Knife::SubcommandLoader::HashedCommandLoader::KEY]["plugins_paths"] = Chef::Knife.subcommand_files
|
|
54
|
-
output[Chef::Knife::SubcommandLoader::HashedCommandLoader::KEY]["plugins_by_category"] = Chef::Knife.subcommands_by_category
|
|
55
|
-
output
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def write_hash(data)
|
|
59
|
-
plugin_manifest_dir = File.expand_path("..", Chef::Knife::SubcommandLoader.plugin_manifest_path)
|
|
60
|
-
FileUtils.mkdir_p(plugin_manifest_dir) unless File.directory?(plugin_manifest_dir)
|
|
61
|
-
File.open(Chef::Knife::SubcommandLoader.plugin_manifest_path, "w") do |f|
|
|
62
|
-
f.write(Chef::JSONCompat.to_json_pretty(data))
|
|
63
|
-
ui.msg "Knife subcommands are cached in #{Chef::Knife::SubcommandLoader.plugin_manifest_path}. Delete this file to disable the caching."
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
48
|
end
|
|
67
49
|
end
|
|
68
50
|
end
|
data/lib/chef/knife/ssh.rb
CHANGED
|
@@ -296,6 +296,10 @@ class Chef
|
|
|
296
296
|
opts[:keepalive] = true
|
|
297
297
|
opts[:keepalive_interval] = ssh_config[:keepalive_interval]
|
|
298
298
|
end
|
|
299
|
+
# maintain support for legacy key types / ciphers / key exchange algorithms.
|
|
300
|
+
# most importantly this adds back support for DSS host keys
|
|
301
|
+
# See https://github.com/net-ssh/net-ssh/pull/709
|
|
302
|
+
opts[:append_all_supported_algorithms] = true
|
|
299
303
|
end
|
|
300
304
|
end
|
|
301
305
|
|
|
@@ -384,7 +388,7 @@ class Chef
|
|
|
384
388
|
end
|
|
385
389
|
|
|
386
390
|
def prompt_for_password(prompt = "Enter your password: ")
|
|
387
|
-
ui.ask(prompt
|
|
391
|
+
ui.ask(prompt, echo: false)
|
|
388
392
|
end
|
|
389
393
|
|
|
390
394
|
# Present the prompt and read a single line from the console. It also
|
|
@@ -521,12 +525,12 @@ class Chef
|
|
|
521
525
|
def cssh
|
|
522
526
|
cssh_cmd = nil
|
|
523
527
|
%w{csshX cssh}.each do |cmd|
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
528
|
+
|
|
529
|
+
# Unix and Mac only
|
|
530
|
+
cssh_cmd = shell_out!("which #{cmd}").stdout.strip
|
|
531
|
+
break
|
|
532
|
+
rescue Mixlib::ShellOut::ShellCommandFailed
|
|
533
|
+
|
|
530
534
|
end
|
|
531
535
|
raise Chef::Exceptions::Exec, "no command found for cssh" unless cssh_cmd
|
|
532
536
|
|
data/lib/chef/knife/xargs.rb
CHANGED
|
@@ -204,25 +204,25 @@ class Chef
|
|
|
204
204
|
error = false
|
|
205
205
|
# Create the temporary files
|
|
206
206
|
tempfiles.each_pair do |tempfile, file|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
207
|
+
|
|
208
|
+
value = file[:file].read
|
|
209
|
+
file[:value] = value
|
|
210
|
+
tempfile.open
|
|
211
|
+
tempfile.write(value)
|
|
212
|
+
tempfile.close
|
|
213
|
+
rescue Chef::ChefFS::FileSystem::OperationNotAllowedError => e
|
|
214
|
+
ui.error "#{format_path(e.entry)}: #{e.reason}."
|
|
215
|
+
error = true
|
|
216
|
+
tempfile.close!
|
|
217
|
+
tempfiles.delete(tempfile)
|
|
218
|
+
next
|
|
219
|
+
rescue Chef::ChefFS::FileSystem::NotFoundError => e
|
|
220
|
+
ui.error "#{format_path(e.entry)}: No such file or directory"
|
|
221
|
+
error = true
|
|
222
|
+
tempfile.close!
|
|
223
|
+
tempfiles.delete(tempfile)
|
|
224
|
+
next
|
|
225
|
+
|
|
226
226
|
end
|
|
227
227
|
|
|
228
228
|
return error if error && tempfiles.size == 0
|
data/lib/chef/log.rb
CHANGED
|
@@ -28,8 +28,13 @@ class Chef
|
|
|
28
28
|
class Log
|
|
29
29
|
extend Mixlib::Log
|
|
30
30
|
|
|
31
|
+
def self.setup!
|
|
32
|
+
init(MonoLogger.new(STDOUT))
|
|
33
|
+
nil
|
|
34
|
+
end
|
|
35
|
+
|
|
31
36
|
# Force initialization of the primary log device (@logger)
|
|
32
|
-
|
|
37
|
+
setup!
|
|
33
38
|
|
|
34
39
|
class Formatter
|
|
35
40
|
def self.show_time=(*args)
|
|
@@ -47,7 +52,7 @@ class Chef
|
|
|
47
52
|
def self.caller_location
|
|
48
53
|
# Pick the first caller that is *not* part of the Chef gem, that's the
|
|
49
54
|
# thing the user wrote. Or failing that, the most recent caller.
|
|
50
|
-
chef_gem_path = File.expand_path("
|
|
55
|
+
chef_gem_path = File.expand_path("..", __dir__)
|
|
51
56
|
caller(0..20).find { |c| !c.start_with?(chef_gem_path) } || caller(0..1)[0]
|
|
52
57
|
end
|
|
53
58
|
|
data/lib/chef/mixin/checksum.rb
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
# Author:: Kaustubh Deorukhkar (<kaustubh@clogeny.com>)
|
|
1
|
+
#--
|
|
3
2
|
# Copyright:: Copyright (c) Chef Software Inc.
|
|
4
3
|
# License:: Apache License, Version 2.0
|
|
5
4
|
#
|
|
@@ -7,22 +6,35 @@
|
|
|
7
6
|
# you may not use this file except in compliance with the License.
|
|
8
7
|
# You may obtain a copy of the License at
|
|
9
8
|
#
|
|
10
|
-
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
10
|
#
|
|
12
11
|
# Unless required by applicable law or agreed to in writing, software
|
|
13
12
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
13
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
14
|
# See the License for the specific language governing permissions and
|
|
16
15
|
# limitations under the License.
|
|
17
|
-
#
|
|
18
16
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
17
|
+
require_relative "../log"
|
|
18
|
+
require_relative "../config"
|
|
19
|
+
require_relative "../chef_class"
|
|
20
|
+
|
|
21
|
+
class Chef
|
|
22
|
+
module Mixin
|
|
23
|
+
# Common Dependency Injection wiring for ChefUtils-related modules
|
|
24
|
+
module ChefUtilsWiring
|
|
25
|
+
private
|
|
26
|
+
|
|
27
|
+
def __config
|
|
28
|
+
Chef::Config
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def __log
|
|
32
|
+
Chef::Log
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def __transport_connection
|
|
36
|
+
Chef.run_context&.transport_connection
|
|
37
|
+
end
|
|
38
|
+
end
|
|
27
39
|
end
|
|
28
40
|
end
|
|
@@ -19,16 +19,33 @@
|
|
|
19
19
|
|
|
20
20
|
class Chef
|
|
21
21
|
module Mixin
|
|
22
|
-
# == Chef::Mixin::DeepMerge
|
|
23
22
|
# Implements a deep merging algorithm for nested data structures.
|
|
24
|
-
#
|
|
25
|
-
#
|
|
26
|
-
#
|
|
27
|
-
#
|
|
23
|
+
#
|
|
24
|
+
# This code was originally imported from deep_merge by Steve Midgley.
|
|
25
|
+
# deep_merge is available under the MIT license from
|
|
26
|
+
# http://trac.misuse.org/science/wiki/DeepMerge
|
|
27
|
+
#
|
|
28
|
+
# Note that this is not considered a public interface. It is technically
|
|
29
|
+
# public and has been used and we cannot break the API, but continued
|
|
30
|
+
# external use is discouraged. We are unlikely to change the shape of
|
|
31
|
+
# the API and break anyone, but this code does not serve the purposes of
|
|
32
|
+
# cookbook authors and customers. It is intended only for the purposes
|
|
33
|
+
# of the internal use in the chef-client codebase. We do not accept
|
|
34
|
+
# pull requests to extend the functionality of this algorithm. Users
|
|
35
|
+
# who find this does nearly what they want, should copy and paste the
|
|
36
|
+
# algorithm and tune to their needs. We will not maintain any additional
|
|
37
|
+
# use cases.
|
|
38
|
+
#
|
|
39
|
+
# "It is what it is, and if it isn't what you want, you need to build
|
|
40
|
+
# that yourself"
|
|
41
|
+
#
|
|
42
|
+
# @api private
|
|
43
|
+
#
|
|
28
44
|
module DeepMerge
|
|
29
45
|
|
|
30
46
|
extend self
|
|
31
47
|
|
|
48
|
+
# @api private
|
|
32
49
|
def merge(first, second)
|
|
33
50
|
first = Mash.new(first) unless first.is_a?(Mash)
|
|
34
51
|
second = Mash.new(second) unless second.is_a?(Mash)
|
|
@@ -38,20 +55,25 @@ class Chef
|
|
|
38
55
|
|
|
39
56
|
class InvalidParameter < StandardError; end
|
|
40
57
|
|
|
41
|
-
# Deep Merge core documentation.
|
|
42
58
|
# deep_merge! method permits merging of arbitrary child elements. The two top level
|
|
43
59
|
# elements must be hashes. These hashes can contain unlimited (to stack limit) levels
|
|
44
60
|
# of child elements. These child elements to not have to be of the same types.
|
|
45
61
|
# Where child elements are of the same type, deep_merge will attempt to merge them together.
|
|
46
62
|
# Where child elements are not of the same type, deep_merge will skip or optionally overwrite
|
|
47
63
|
# the destination element with the contents of the source element at that level.
|
|
64
|
+
#
|
|
48
65
|
# So if you have two hashes like this:
|
|
66
|
+
#
|
|
49
67
|
# source = {:x => [1,2,3], :y => 2}
|
|
50
68
|
# dest = {:x => [4,5,'6'], :y => [7,8,9]}
|
|
51
69
|
# dest.deep_merge!(source)
|
|
52
70
|
# Results: {:x => [1,2,3,4,5,'6'], :y => 2}
|
|
71
|
+
#
|
|
53
72
|
# By default, "deep_merge!" will overwrite any unmergeables and merge everything else.
|
|
54
73
|
# To avoid this, use "deep_merge" (no bang/exclamation mark)
|
|
74
|
+
#
|
|
75
|
+
# @api private
|
|
76
|
+
#
|
|
55
77
|
def deep_merge!(source, dest)
|
|
56
78
|
# if dest doesn't exist, then simply copy source to it
|
|
57
79
|
if dest.nil?
|
|
@@ -87,10 +109,12 @@ class Chef
|
|
|
87
109
|
dest
|
|
88
110
|
end # deep_merge!
|
|
89
111
|
|
|
112
|
+
# @api private
|
|
90
113
|
def hash_only_merge(merge_onto, merge_with)
|
|
91
114
|
hash_only_merge!(safe_dup(merge_onto), safe_dup(merge_with))
|
|
92
115
|
end
|
|
93
116
|
|
|
117
|
+
# @api private
|
|
94
118
|
def safe_dup(thing)
|
|
95
119
|
thing.dup
|
|
96
120
|
rescue TypeError
|
|
@@ -101,6 +125,9 @@ class Chef
|
|
|
101
125
|
# `merge_onto` is the object that will "lose" in case of conflict.
|
|
102
126
|
# `merge_with` is the object whose values will replace `merge_onto`s
|
|
103
127
|
# values when there is a conflict.
|
|
128
|
+
#
|
|
129
|
+
# @api private
|
|
130
|
+
#
|
|
104
131
|
def hash_only_merge!(merge_onto, merge_with)
|
|
105
132
|
# If there are two Hashes, recursively merge.
|
|
106
133
|
if merge_onto.is_a?(Hash) && merge_with.is_a?(Hash)
|
|
@@ -131,6 +158,8 @@ class Chef
|
|
|
131
158
|
end
|
|
132
159
|
end
|
|
133
160
|
|
|
161
|
+
# @api private
|
|
162
|
+
#
|
|
134
163
|
def deep_merge(source, dest)
|
|
135
164
|
deep_merge!(safe_dup(source), safe_dup(dest))
|
|
136
165
|
end
|