chef 16.3.38-universal-mingw32 → 16.5.64-universal-mingw32
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 +1 -1
- data/Rakefile +2 -2
- data/bin/knife +1 -1
- data/chef-universal-mingw32.gemspec +0 -1
- data/chef.gemspec +2 -1
- data/distro/templates/powershell/chef/chef.psm1.erb +18 -18
- data/ext/win32-eventlog/Rakefile +2 -2
- data/ext/win32-eventlog/chef-log.man.erb +4 -4
- data/lib/chef/action_collection.rb +4 -0
- data/lib/chef/api_client/registration.rb +2 -2
- data/lib/chef/application.rb +19 -17
- data/lib/chef/application/apply.rb +17 -12
- data/lib/chef/application/base.rb +26 -23
- data/lib/chef/application/client.rb +10 -4
- data/lib/chef/application/exit_code.rb +13 -4
- data/lib/chef/application/knife.rb +22 -11
- data/lib/chef/application/solo.rb +2 -1
- data/lib/chef/application/windows_service.rb +39 -39
- data/lib/chef/application/windows_service_manager.rb +6 -6
- 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/file_system/chef_server/acl_entry.rb +10 -10
- 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/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/knife.rb +2 -2
- data/lib/chef/chef_fs/parallelizer.rb +0 -1
- data/lib/chef/client.rb +21 -22
- data/lib/chef/cookbook/cookbook_version_loader.rb +1 -1
- data/lib/chef/cookbook/synchronizer.rb +2 -2
- data/lib/chef/cookbook_site_streaming_uploader.rb +13 -11
- data/lib/chef/cookbook_uploader.rb +1 -1
- data/lib/chef/data_collector.rb +6 -5
- data/lib/chef/data_collector/config_validation.rb +22 -13
- data/lib/chef/data_collector/run_end_message.rb +13 -3
- data/lib/chef/data_collector/run_start_message.rb +1 -1
- data/lib/chef/deprecated.rb +1 -1
- data/lib/chef/deprecation/warnings.rb +2 -2
- data/lib/chef/digester.rb +2 -2
- data/lib/chef/dsl/chef_vault.rb +1 -1
- data/lib/chef/dsl/data_query.rb +2 -2
- data/lib/chef/dsl/platform_introspection.rb +9 -9
- data/lib/chef/encrypted_data_bag_item.rb +3 -4
- data/lib/chef/encrypted_data_bag_item/decryptor.rb +3 -3
- data/lib/chef/encrypted_data_bag_item/encryptor.rb +3 -3
- data/lib/chef/environment.rb +4 -4
- data/lib/chef/event_loggers/windows_eventlog.rb +2 -2
- data/lib/chef/exceptions.rb +5 -5
- data/lib/chef/file_access_control/windows.rb +5 -1
- data/lib/chef/file_content_management/tempfile.rb +9 -9
- data/lib/chef/formatters/doc.rb +7 -6
- data/lib/chef/formatters/error_inspectors/api_error_formatting.rb +6 -5
- data/lib/chef/formatters/error_inspectors/node_load_error_inspector.rb +3 -3
- data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +9 -9
- data/lib/chef/formatters/error_inspectors/resource_failure_inspector.rb +2 -2
- data/lib/chef/formatters/error_inspectors/run_list_expansion_error_inspector.rb +3 -3
- data/lib/chef/formatters/minimal.rb +5 -4
- data/lib/chef/handler.rb +2 -0
- data/lib/chef/http.rb +15 -13
- data/lib/chef/http/auth_credentials.rb +5 -1
- data/lib/chef/http/authenticator.rb +3 -1
- data/lib/chef/http/basic_client.rb +4 -2
- data/lib/chef/http/decompressor.rb +1 -1
- data/lib/chef/http/http_request.rb +7 -5
- data/lib/chef/http/socketless_chef_zero_client.rb +5 -2
- data/lib/chef/http/ssl_policies.rb +1 -1
- data/lib/chef/json_compat.rb +2 -2
- data/lib/chef/knife.rb +4 -4
- data/lib/chef/knife/bootstrap.rb +18 -16
- data/lib/chef/knife/bootstrap/chef_vault_handler.rb +1 -1
- data/lib/chef/knife/bootstrap/templates/chef-full.erb +3 -3
- data/lib/chef/knife/bootstrap/templates/windows-chef-client-msi.erb +7 -7
- data/lib/chef/knife/client_create.rb +3 -3
- data/lib/chef/knife/config_get.rb +8 -97
- data/lib/chef/knife/config_get_profile.rb +9 -9
- data/lib/chef/knife/config_list.rb +139 -0
- data/lib/chef/knife/config_list_profiles.rb +8 -98
- data/lib/chef/knife/config_show.rb +127 -0
- data/lib/chef/knife/config_use.rb +61 -0
- data/lib/chef/knife/config_use_profile.rb +9 -24
- data/lib/chef/knife/configure.rb +4 -2
- 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 +23 -23
- data/lib/chef/knife/core/bootstrap_context.rb +2 -2
- data/lib/chef/knife/core/generic_presenter.rb +1 -1
- data/lib/chef/knife/core/hashed_command_loader.rb +2 -2
- data/lib/chef/knife/core/object_loader.rb +1 -1
- data/lib/chef/knife/core/windows_bootstrap_context.rb +42 -34
- data/lib/chef/knife/delete.rb +15 -15
- data/lib/chef/knife/exec.rb +4 -4
- data/lib/chef/knife/node_show.rb +2 -2
- data/lib/chef/knife/serve.rb +3 -3
- data/lib/chef/knife/ssh.rb +22 -7
- data/lib/chef/knife/ssl_check.rb +3 -3
- data/lib/chef/knife/status.rb +2 -2
- data/lib/chef/knife/user_create.rb +2 -2
- data/lib/chef/knife/xargs.rb +19 -19
- data/lib/chef/knife/yaml_convert.rb +1 -1
- data/lib/chef/local_mode.rb +2 -2
- data/lib/chef/log/syslog.rb +2 -2
- data/lib/chef/log/winevt.rb +2 -2
- data/lib/chef/mixin/checksum.rb +0 -1
- data/lib/chef/mixin/deep_merge.rb +35 -18
- data/lib/chef/mixin/openssl_helper.rb +4 -5
- data/lib/chef/mixin/shell_out.rb +1 -1
- data/lib/chef/mixin/template.rb +2 -2
- data/lib/chef/mixin/uris.rb +2 -2
- data/lib/chef/mixin/versioned_api.rb +1 -2
- data/lib/chef/mixin/which.rb +1 -1
- data/lib/chef/monkey_patches/net_http.rb +4 -4
- data/lib/chef/monkey_patches/webrick-utils.rb +10 -10
- data/lib/chef/node/attribute.rb +2 -4
- data/lib/chef/node_map.rb +2 -2
- data/lib/chef/platform/service_helpers.rb +1 -1
- data/lib/chef/policy_builder/policyfile.rb +2 -2
- data/lib/chef/property.rb +1 -1
- data/lib/chef/provider.rb +0 -4
- data/lib/chef/provider/cron/unix.rb +0 -2
- data/lib/chef/provider/file.rb +2 -2
- data/lib/chef/provider/git.rb +5 -5
- 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/launchd.rb +2 -2
- data/lib/chef/provider/mount.rb +0 -2
- data/lib/chef/provider/mount/linux.rb +63 -0
- data/lib/chef/provider/package.rb +0 -2
- data/lib/chef/provider/package/rubygems.rb +22 -19
- data/lib/chef/provider/package/snap.rb +1 -2
- data/lib/chef/provider/package/windows.rb +2 -2
- data/lib/chef/provider/package/windows/registry_uninstall_entry.rb +12 -10
- data/lib/chef/provider/package/zypper.rb +1 -1
- data/lib/chef/provider/powershell_script.rb +21 -5
- data/lib/chef/provider/remote_file/content.rb +3 -0
- data/lib/chef/provider/remote_file/ftp.rb +6 -4
- data/lib/chef/provider/remote_file/sftp.rb +6 -4
- data/lib/chef/provider/route.rb +2 -6
- 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 +4 -4
- 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/template_finder.rb +2 -10
- data/lib/chef/provider/user/dscl.rb +5 -5
- data/lib/chef/provider/user/mac.rb +10 -10
- data/lib/chef/provider/windows_task.rb +1 -5
- data/lib/chef/provider/zypper_repository.rb +2 -3
- data/lib/chef/provider_resolver.rb +1 -1
- data/lib/chef/providers.rb +1 -1
- data/lib/chef/recipe.rb +2 -2
- data/lib/chef/resource.rb +7 -11
- data/lib/chef/resource/apt_repository.rb +2 -11
- data/lib/chef/resource/bff_package.rb +22 -0
- data/lib/chef/resource/breakpoint.rb +57 -2
- data/lib/chef/resource/build_essential.rb +1 -1
- data/lib/chef/resource/cab_package.rb +29 -0
- data/lib/chef/resource/chef_client_cron.rb +32 -25
- data/lib/chef/resource/chef_client_launchd.rb +194 -0
- data/lib/chef/resource/chef_client_scheduled_task.rb +21 -18
- data/lib/chef/resource/chef_client_systemd_timer.rb +26 -19
- data/lib/chef/resource/chef_client_trusted_certificate.rb +101 -0
- data/lib/chef/resource/chef_gem.rb +10 -10
- data/lib/chef/resource/chef_handler.rb +148 -4
- data/lib/chef/resource/chef_sleep.rb +2 -2
- data/lib/chef/resource/chef_vault_secret.rb +14 -14
- data/lib/chef/resource/cookbook_file.rb +2 -2
- data/lib/chef/resource/cron/cron_d.rb +0 -1
- data/lib/chef/resource/dnf_package.rb +2 -2
- data/lib/chef/resource/dsc_resource.rb +0 -1
- data/lib/chef/resource/dsc_script.rb +2 -2
- data/lib/chef/resource/execute.rb +8 -9
- data/lib/chef/resource/file.rb +4 -4
- data/lib/chef/resource/gem_package.rb +5 -5
- data/lib/chef/resource/homebrew_package.rb +3 -3
- data/lib/chef/resource/homebrew_update.rb +7 -7
- data/lib/chef/resource/hostname.rb +19 -19
- data/lib/chef/resource/launchd.rb +2 -1
- data/lib/chef/resource/locale.rb +2 -2
- data/lib/chef/resource/macos_userdefaults.rb +3 -3
- data/lib/chef/resource/notify_group.rb +0 -1
- data/lib/chef/resource/ohai.rb +46 -3
- data/lib/chef/resource/ohai_hint.rb +33 -0
- data/lib/chef/resource/openssl_dhparam.rb +29 -5
- data/lib/chef/resource/openssl_ec_private_key.rb +8 -3
- data/lib/chef/resource/openssl_ec_public_key.rb +4 -2
- data/lib/chef/resource/openssl_rsa_private_key.rb +8 -3
- data/lib/chef/resource/openssl_rsa_public_key.rb +2 -0
- data/lib/chef/resource/openssl_x509_certificate.rb +38 -35
- data/lib/chef/resource/openssl_x509_crl.rb +21 -10
- data/lib/chef/resource/openssl_x509_request.rb +37 -36
- data/lib/chef/resource/osx_profile.rb +292 -6
- data/lib/chef/resource/plist.rb +1 -1
- data/lib/chef/resource/powershell_package_source.rb +6 -6
- data/lib/chef/resource/powershell_script.rb +24 -30
- data/lib/chef/resource/reboot.rb +2 -2
- data/lib/chef/resource/remote_file.rb +3 -3
- data/lib/chef/resource/rhsm_register.rb +22 -10
- data/lib/chef/resource/ruby_block.rb +2 -2
- data/lib/chef/resource/scm/subversion.rb +2 -2
- data/lib/chef/resource/service.rb +3 -3
- data/lib/chef/resource/ssh_known_hosts_entry.rb +2 -2
- data/lib/chef/resource/sudo.rb +1 -1
- data/lib/chef/resource/support/cron.d.erb +1 -1
- data/lib/chef/resource/support/cron_access.erb +1 -1
- data/lib/chef/resource/support/sudoer.erb +1 -1
- data/lib/chef/resource/support/ulimit.erb +1 -1
- data/lib/chef/resource/sysctl.rb +6 -10
- data/lib/chef/resource/systemd_unit.rb +2 -2
- data/lib/chef/resource/template.rb +2 -2
- data/lib/chef/resource/timezone.rb +112 -73
- data/lib/chef/resource/windows_ad_join.rb +12 -3
- 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 +8 -4
- 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 +10 -7
- 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 +24 -20
- data/lib/chef/resource/windows_firewall_rule.rb +5 -3
- data/lib/chef/resource/windows_font.rb +3 -1
- data/lib/chef/resource/windows_package.rb +28 -5
- data/lib/chef/resource/windows_pagefile.rb +4 -0
- data/lib/chef/resource/windows_printer.rb +22 -21
- data/lib/chef/resource/windows_printer_port.rb +20 -17
- data/lib/chef/resource/windows_security_policy.rb +2 -0
- 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 +54 -53
- data/lib/chef/resource/windows_workgroup.rb +5 -6
- data/lib/chef/resource/yum_package.rb +2 -2
- data/lib/chef/resource_collection/stepable_iterator.rb +1 -2
- data/lib/chef/resources.rb +3 -1
- data/lib/chef/role.rb +2 -2
- data/lib/chef/run_context.rb +2 -2
- data/lib/chef/run_context/cookbook_compiler.rb +21 -21
- data/lib/chef/run_lock.rb +2 -2
- data/lib/chef/run_status.rb +2 -6
- data/lib/chef/search/query.rb +4 -5
- data/lib/chef/server_api_versions.rb +4 -0
- data/lib/chef/shell.rb +32 -27
- data/lib/chef/shell/ext.rb +11 -11
- data/lib/chef/shell/shell_session.rb +2 -2
- data/lib/chef/train_transport.rb +5 -104
- data/lib/chef/util/backup.rb +1 -1
- data/lib/chef/util/diff.rb +14 -14
- data/lib/chef/util/powershell/cmdlet.rb +4 -2
- data/lib/chef/util/powershell/ps_credential.rb +18 -14
- data/lib/chef/util/threaded_job_queue.rb +0 -2
- data/lib/chef/version.rb +1 -1
- data/lib/chef/win32/crypto.rb +1 -1
- 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/shef-config.rb +1 -1
- data/spec/data/ssl/chef-rspec.cert +15 -15
- data/spec/functional/event_loggers/windows_eventlog_spec.rb +6 -5
- data/spec/functional/resource/aix_service_spec.rb +2 -2
- data/spec/functional/resource/aixinit_service_spec.rb +8 -8
- data/spec/functional/resource/bff_spec.rb +2 -2
- data/spec/functional/resource/cookbook_file_spec.rb +1 -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/group_spec.rb +6 -6
- data/spec/functional/resource/insserv_spec.rb +5 -5
- data/spec/functional/resource/link_spec.rb +20 -20
- data/spec/functional/resource/powershell_script_spec.rb +4 -4
- data/spec/functional/resource/rpm_spec.rb +2 -2
- data/spec/functional/resource/user/dscl_spec.rb +1 -1
- data/spec/functional/resource/user/mac_user_spec.rb +1 -1
- 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_security_policy_spec.rb +0 -3
- data/spec/functional/resource/windows_task_spec.rb +13 -13
- data/spec/functional/run_lock_spec.rb +24 -24
- data/spec/functional/version_spec.rb +3 -3
- data/spec/functional/win32/registry_spec.rb +8 -8
- data/spec/functional/win32/service_manager_spec.rb +1 -1
- data/spec/integration/client/client_spec.rb +4 -4
- data/spec/integration/client/exit_code_spec.rb +3 -2
- data/spec/integration/client/ipv6_spec.rb +1 -1
- data/spec/integration/knife/common_options_spec.rb +12 -12
- data/spec/integration/knife/config_list_spec.rb +220 -0
- data/spec/integration/knife/config_show_spec.rb +192 -0
- data/spec/integration/knife/config_use_spec.rb +198 -0
- data/spec/integration/knife/cookbook_api_ipv6_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/serve_spec.rb +5 -5
- data/spec/integration/knife/upload_spec.rb +3 -1
- data/spec/integration/ohai/ohai_spec.rb +61 -0
- data/spec/integration/recipes/lwrp_inline_resources_spec.rb +1 -1
- data/spec/integration/recipes/remote_directory.rb +1 -1
- data/spec/integration/solo/solo_spec.rb +5 -5
- data/spec/spec_helper.rb +12 -9
- data/spec/stress/win32/file_spec.rb +1 -1
- data/spec/support/chef_helpers.rb +2 -2
- data/spec/support/matchers/leak.rb +2 -2
- data/spec/support/platform_helpers.rb +17 -35
- 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 -20
- data/spec/support/shared/functional/securable_resource.rb +108 -27
- data/spec/support/shared/functional/win32_service.rb +2 -2
- data/spec/support/shared/functional/windows_script.rb +3 -3
- data/spec/support/shared/integration/integration_helper.rb +22 -52
- data/spec/support/shared/unit/application_dot_d.rb +5 -3
- data/spec/support/shared/unit/script_resource.rb +6 -20
- data/spec/support/shared/unit/windows_script_resource.rb +15 -28
- data/spec/tiny_server.rb +0 -1
- data/spec/unit/application/client_spec.rb +2 -2
- data/spec/unit/application/exit_code_spec.rb +10 -0
- data/spec/unit/application_spec.rb +4 -6
- data/spec/unit/chef_fs/parallelizer_spec.rb +5 -1
- data/spec/unit/chef_fs/path_util_spec.rb +1 -1
- data/spec/unit/cookbook/synchronizer_spec.rb +2 -2
- data/spec/unit/cookbook_spec.rb +2 -2
- data/spec/unit/data_collector/config_validation_spec.rb +208 -0
- data/spec/unit/data_collector_spec.rb +28 -113
- data/spec/unit/dsl/declare_resource_spec.rb +1 -1
- data/spec/unit/environment_spec.rb +7 -7
- data/spec/unit/file_access_control_spec.rb +1 -1
- data/spec/unit/http/api_versions_spec.rb +19 -1
- data/spec/unit/knife/bootstrap_spec.rb +20 -20
- data/spec/unit/knife/cookbook_download_spec.rb +4 -4
- data/spec/unit/knife/cookbook_metadata_from_file_spec.rb +1 -1
- data/spec/unit/knife/core/hashed_command_loader_spec.rb +3 -3
- data/spec/unit/knife/core/ui_spec.rb +1 -0
- data/spec/unit/knife/core/windows_bootstrap_context_spec.rb +21 -12
- data/spec/unit/knife/ssh_spec.rb +2 -2
- data/spec/unit/knife/supermarket_share_spec.rb +1 -1
- data/spec/unit/lwrp_spec.rb +3 -3
- data/spec/unit/mixin/deep_merge_spec.rb +15 -0
- data/spec/unit/mixin/openssl_helper_spec.rb +1 -1
- data/spec/unit/mixin/powershell_exec_spec.rb +1 -1
- data/spec/unit/mixin/securable_spec.rb +2 -2
- data/spec/unit/mixin/template_spec.rb +30 -30
- data/spec/unit/mixin/windows_architecture_helper_spec.rb +4 -4
- data/spec/unit/node/immutable_collections_spec.rb +8 -4
- data/spec/unit/node_spec.rb +5 -5
- data/spec/unit/provider/mount/linux_spec.rb +97 -0
- data/spec/unit/provider/package/chocolatey_spec.rb +1 -1
- data/spec/unit/provider/package/powershell_spec.rb +1 -1
- data/spec/unit/provider/package/rubygems_spec.rb +4 -1
- data/spec/unit/provider/powershell_script_spec.rb +11 -4
- data/spec/unit/provider/remote_directory_spec.rb +9 -9
- data/spec/unit/provider/route_spec.rb +0 -2
- 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 +2 -2
- data/spec/unit/provider/service/upstart_service_spec.rb +3 -3
- data/spec/unit/provider_resolver_spec.rb +6 -6
- data/spec/unit/recipe_spec.rb +1 -1
- data/spec/unit/resource/batch_spec.rb +6 -6
- data/spec/unit/resource/chef_client_cron_spec.rb +35 -14
- data/spec/unit/resource/chef_client_launchd_spec.rb +127 -0
- data/spec/unit/resource/chef_client_systemd_timer_spec.rb +36 -1
- data/spec/unit/resource/chef_client_trusted_certificate_spec.rb +54 -0
- data/spec/unit/resource/execute_spec.rb +113 -118
- data/spec/unit/resource/launchd_spec.rb +8 -0
- data/spec/unit/resource/osx_profile_spec.rb +299 -0
- data/spec/unit/resource/powershell_script_spec.rb +11 -29
- data/spec/unit/resource/rhsm_register_spec.rb +56 -18
- data/spec/unit/resource/script_spec.rb +6 -1
- data/spec/unit/resource/timezone_spec.rb +63 -0
- data/spec/unit/resource/windows_feature_powershell_spec.rb +30 -4
- data/spec/unit/resource/windows_uac_spec.rb +1 -1
- data/spec/unit/resource/windows_user_privilege_spec.rb +55 -0
- data/spec/unit/role_spec.rb +11 -11
- data/spec/unit/run_lock_spec.rb +5 -1
- data/spec/unit/runner_spec.rb +1 -2
- data/spec/unit/server_api_spec.rb +43 -16
- data/spec/unit/shell/shell_ext_spec.rb +46 -3
- data/spec/unit/shell/shell_session_spec.rb +35 -64
- data/spec/unit/shell_spec.rb +16 -19
- data/spec/unit/train_transport_spec.rb +14 -13
- data/spec/unit/util/selinux_spec.rb +2 -0
- data/tasks/rspec.rb +1 -3
- metadata +42 -33
- data/lib/chef/dist.rb +0 -68
- data/lib/chef/provider/osx_profile.rb +0 -255
- data/spec/integration/knife/config_get_profile_spec.rb +0 -113
- data/spec/integration/knife/config_get_spec.rb +0 -191
- data/spec/integration/knife/config_list_profiles_spec.rb +0 -218
- data/spec/integration/knife/config_use_profile_spec.rb +0 -154
- data/spec/unit/provider/osx_profile_spec.rb +0 -255
@@ -47,17 +47,17 @@ class Chef
|
|
47
47
|
# ACL writes are fun.
|
48
48
|
acls = data_handler.normalize(Chef::JSONCompat.parse(file_contents), self)
|
49
49
|
PERMISSIONS.each do |permission|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
end
|
50
|
+
|
51
|
+
rest.put("#{api_path}/#{permission}", { permission => acls[permission] })
|
52
|
+
rescue Timeout::Error => e
|
53
|
+
raise Chef::ChefFS::FileSystem::OperationFailedError.new(:write, self, e, "Timeout writing: #{e}")
|
54
|
+
rescue Net::HTTPClientException => e
|
55
|
+
if e.response.code == "404"
|
56
|
+
raise Chef::ChefFS::FileSystem::NotFoundError.new(self, e)
|
57
|
+
else
|
58
|
+
raise Chef::ChefFS::FileSystem::OperationFailedError.new(:write, self, e, "HTTP error writing: #{e}")
|
60
59
|
end
|
60
|
+
|
61
61
|
end
|
62
62
|
end
|
63
63
|
end
|
@@ -44,15 +44,15 @@ class Chef
|
|
44
44
|
actual_invites = _read_json.inject({}) { |h, val| h[val["username"]] = val["id"]; h }
|
45
45
|
invites = actual_invites.keys
|
46
46
|
(desired_invites - invites).each do |invite|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
end
|
47
|
+
|
48
|
+
rest.post(api_path, { "user" => invite })
|
49
|
+
rescue Net::HTTPClientException => e
|
50
|
+
if e.response.code == "409"
|
51
|
+
Chef::Log.warn("Could not invite #{invite} to organization #{org}: #{api_error_text(e.response)}")
|
52
|
+
else
|
53
|
+
raise
|
55
54
|
end
|
55
|
+
|
56
56
|
end
|
57
57
|
(invites - desired_invites).each do |invite|
|
58
58
|
rest.delete(File.join(api_path, actual_invites[invite]))
|
@@ -43,15 +43,15 @@ class Chef
|
|
43
43
|
desired_members = minimize_value(Chef::JSONCompat.parse(contents, create_additions: false))
|
44
44
|
members = minimize_value(_read_json)
|
45
45
|
(desired_members - members).each do |member|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
end
|
46
|
+
|
47
|
+
rest.post(api_path, "username" => member)
|
48
|
+
rescue Net::HTTPClientException => e
|
49
|
+
if %w{404 405}.include?(e.response.code)
|
50
|
+
raise "Chef server at #{api_path} does not allow you to directly add members. Please either upgrade your Chef server or move the users you want into invitations.json instead of members.json."
|
51
|
+
else
|
52
|
+
raise
|
54
53
|
end
|
54
|
+
|
55
55
|
end
|
56
56
|
(members - desired_members).each do |member|
|
57
57
|
rest.delete(File.join(api_path, member))
|
@@ -76,7 +76,7 @@ class Chef
|
|
76
76
|
|
77
77
|
# Write out .uploaded-cookbook-version.json
|
78
78
|
# cookbook_file_path = File.join(file_path, cookbook_name) <- this should be the same as self.file_path
|
79
|
-
unless File.
|
79
|
+
unless File.exist?(file_path)
|
80
80
|
FileUtils.mkdir_p(file_path)
|
81
81
|
end
|
82
82
|
uploaded_cookbook_version_path = File.join(file_path, Chef::Cookbook::CookbookVersionLoader::UPLOADED_COOKBOOK_VERSION_FILE)
|
@@ -132,7 +132,7 @@ class Chef
|
|
132
132
|
end
|
133
133
|
|
134
134
|
def can_upload?
|
135
|
-
File.
|
135
|
+
File.exist?(uploaded_cookbook_version_path) || children.size > 0
|
136
136
|
end
|
137
137
|
|
138
138
|
protected
|
@@ -109,23 +109,23 @@ class Chef
|
|
109
109
|
child = root_dir.create_child(name, file_contents)
|
110
110
|
else
|
111
111
|
child_paths[name].each do |path|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
end
|
127
|
-
rescue Errno::EEXIST
|
112
|
+
|
113
|
+
::FileUtils.mkdir_p(path)
|
114
|
+
::FileUtils.chmod(0700, path)
|
115
|
+
if ChefUtils.windows?
|
116
|
+
all_mask = Chef::ReservedNames::Win32::API::Security::GENERIC_ALL
|
117
|
+
administrators = Chef::ReservedNames::Win32::Security::SID.Administrators
|
118
|
+
owner = Chef::ReservedNames::Win32::Security::SID.default_security_object_owner
|
119
|
+
dacl = Chef::ReservedNames::Win32::Security::ACL.create([
|
120
|
+
Chef::ReservedNames::Win32::Security::ACE.access_allowed(owner, all_mask),
|
121
|
+
Chef::ReservedNames::Win32::Security::ACE.access_allowed(administrators, all_mask),
|
122
|
+
])
|
123
|
+
so = Chef::ReservedNames::Win32::Security::SecurableObject.new(path)
|
124
|
+
so.owner = owner
|
125
|
+
so.set_dacl(dacl, false)
|
128
126
|
end
|
127
|
+
rescue Errno::EEXIST
|
128
|
+
|
129
129
|
end
|
130
130
|
child = make_child_entry(name)
|
131
131
|
end
|
@@ -161,7 +161,7 @@ class Chef
|
|
161
161
|
# members.json and org.json may be found.
|
162
162
|
#
|
163
163
|
def root_dir
|
164
|
-
existing_paths = root_paths.select { |path| File.
|
164
|
+
existing_paths = root_paths.select { |path| File.exist?(path) }
|
165
165
|
if existing_paths.size > 0
|
166
166
|
MultiplexedDir.new(existing_paths.map do |path|
|
167
167
|
dir = FileSystemEntry.new(name, parent, path)
|
@@ -184,7 +184,7 @@ class Chef
|
|
184
184
|
return root_dir.child(name)
|
185
185
|
end
|
186
186
|
|
187
|
-
paths = (child_paths[name] || []).select { |path| File.
|
187
|
+
paths = (child_paths[name] || []).select { |path| File.exist?(path) }
|
188
188
|
if paths.size == 0
|
189
189
|
return NonexistentFSObject.new(name, self)
|
190
190
|
end
|
data/lib/chef/chef_fs/knife.rb
CHANGED
@@ -18,7 +18,7 @@
|
|
18
18
|
|
19
19
|
require_relative "../knife"
|
20
20
|
require "pathname" unless defined?(Pathname)
|
21
|
-
|
21
|
+
require "chef-utils/dist" unless defined?(ChefUtils::Dist)
|
22
22
|
|
23
23
|
class Chef
|
24
24
|
module ChefFS
|
@@ -49,7 +49,7 @@ class Chef
|
|
49
49
|
|
50
50
|
option :chef_repo_path,
|
51
51
|
long: "--chef-repo-path PATH",
|
52
|
-
description: "Overrides the location of #{
|
52
|
+
description: "Overrides the location of #{ChefUtils::Dist::Infra::PRODUCT} repo. Default is specified by chef_repo_path in the config"
|
53
53
|
|
54
54
|
option :concurrency,
|
55
55
|
long: "--concurrency THREADS",
|
data/lib/chef/client.rb
CHANGED
@@ -29,7 +29,7 @@ require_relative "api_client/registration"
|
|
29
29
|
require_relative "node"
|
30
30
|
require_relative "role"
|
31
31
|
require_relative "file_cache"
|
32
|
-
|
32
|
+
Chef.autoload :RunContext, File.expand_path("run_context", __dir__)
|
33
33
|
require_relative "runner"
|
34
34
|
require_relative "run_status"
|
35
35
|
require_relative "cookbook/cookbook_collection"
|
@@ -48,14 +48,13 @@ require_relative "action_collection"
|
|
48
48
|
require_relative "resource_reporter"
|
49
49
|
require_relative "data_collector"
|
50
50
|
require_relative "run_lock"
|
51
|
-
|
51
|
+
Chef.autoload :PolicyBuilder, File.expand_path("policy_builder", __dir__)
|
52
52
|
require_relative "request_id"
|
53
53
|
require_relative "platform/rebooter"
|
54
54
|
require_relative "mixin/deprecation"
|
55
55
|
require "chef-utils" unless defined?(ChefUtils::CANARY)
|
56
56
|
require "ohai" unless defined?(Ohai::System)
|
57
|
-
require "rbconfig"
|
58
|
-
require_relative "dist"
|
57
|
+
require "rbconfig" unless defined?(RbConfig)
|
59
58
|
require "forwardable" unless defined?(Forwardable)
|
60
59
|
|
61
60
|
class Chef
|
@@ -245,11 +244,11 @@ class Chef
|
|
245
244
|
|
246
245
|
events.run_start(Chef::VERSION, run_status)
|
247
246
|
|
248
|
-
logger.info("*** #{
|
247
|
+
logger.info("*** #{ChefUtils::Dist::Infra::PRODUCT} #{Chef::VERSION} ***")
|
249
248
|
logger.info("Platform: #{RUBY_PLATFORM}")
|
250
|
-
logger.info "#{
|
249
|
+
logger.info "#{ChefUtils::Dist::Infra::CLIENT.capitalize} pid: #{Process.pid}"
|
251
250
|
logger.info "Targeting node: #{Chef::Config.target_mode.host}" if Chef::Config.target_mode?
|
252
|
-
logger.debug("#{
|
251
|
+
logger.debug("#{ChefUtils::Dist::Infra::CLIENT.capitalize} request_id: #{request_id}")
|
253
252
|
ENV["PATH"] = ChefUtils::DSL::DefaultPaths.default_paths if Chef::Config[:enforce_default_paths] || Chef::Config[:enforce_path_sanity]
|
254
253
|
|
255
254
|
if Chef::Config.target_mode?
|
@@ -273,7 +272,7 @@ class Chef
|
|
273
272
|
build_node
|
274
273
|
|
275
274
|
run_status.start_clock
|
276
|
-
logger.info("Starting #{
|
275
|
+
logger.info("Starting #{ChefUtils::Dist::Infra::PRODUCT} Run for #{node.name}")
|
277
276
|
run_started
|
278
277
|
|
279
278
|
do_windows_admin_check
|
@@ -288,7 +287,7 @@ class Chef
|
|
288
287
|
converge_and_save(run_context)
|
289
288
|
|
290
289
|
run_status.stop_clock
|
291
|
-
logger.info("#{
|
290
|
+
logger.info("#{ChefUtils::Dist::Infra::PRODUCT} Run complete in #{run_status.elapsed_time} seconds")
|
292
291
|
run_completed_successfully
|
293
292
|
events.run_completed(node, run_status)
|
294
293
|
|
@@ -334,7 +333,7 @@ class Chef
|
|
334
333
|
eol_year = 2006 + Gem::Version.new(Chef::VERSION).segments.first
|
335
334
|
|
336
335
|
if Time.now > Time.new(eol_year, 5, 01)
|
337
|
-
logger.warn("This release of #{
|
336
|
+
logger.warn("This release of #{ChefUtils::Dist::Infra::PRODUCT} became end of life (EOL) on May 1st #{eol_year}. Please update to a supported release to receive new features, bug fixes, and security updates.")
|
338
337
|
end
|
339
338
|
end
|
340
339
|
|
@@ -707,16 +706,16 @@ class Chef
|
|
707
706
|
#
|
708
707
|
def converge(run_context)
|
709
708
|
catch(:end_client_run_early) do
|
710
|
-
|
711
|
-
|
712
|
-
|
713
|
-
|
714
|
-
|
715
|
-
|
716
|
-
|
717
|
-
|
718
|
-
|
719
|
-
|
709
|
+
|
710
|
+
events.converge_start(run_context)
|
711
|
+
logger.debug("Converging node #{node_name}")
|
712
|
+
@runner = Chef::Runner.new(run_context)
|
713
|
+
@runner.converge
|
714
|
+
events.converge_complete
|
715
|
+
rescue Exception => e
|
716
|
+
events.converge_failed(e)
|
717
|
+
raise e
|
718
|
+
|
720
719
|
end
|
721
720
|
end
|
722
721
|
|
@@ -763,7 +762,7 @@ class Chef
|
|
763
762
|
logger.trace("Checking for administrator privileges....")
|
764
763
|
|
765
764
|
if !has_admin_privileges?
|
766
|
-
message = "#{
|
765
|
+
message = "#{ChefUtils::Dist::Infra::CLIENT} doesn't have administrator privileges on node #{node_name}."
|
767
766
|
if Chef::Config[:fatal_windows_admin_check]
|
768
767
|
logger.fatal(message)
|
769
768
|
logger.fatal("fatal_windows_admin_check is set to TRUE.")
|
@@ -772,7 +771,7 @@ class Chef
|
|
772
771
|
logger.warn("#{message} This might cause unexpected resource failures.")
|
773
772
|
end
|
774
773
|
else
|
775
|
-
logger.trace("#{
|
774
|
+
logger.trace("#{ChefUtils::Dist::Infra::CLIENT} has administrator privileges on node #{node_name}.")
|
776
775
|
end
|
777
776
|
end
|
778
777
|
end
|
@@ -17,7 +17,7 @@ require_relative "../client"
|
|
17
17
|
require_relative "../util/threaded_job_queue"
|
18
18
|
require_relative "../server_api"
|
19
19
|
require "singleton" unless defined?(Singleton)
|
20
|
-
|
20
|
+
require "chef-utils/dist" unless defined?(ChefUtils::Dist)
|
21
21
|
|
22
22
|
class Chef
|
23
23
|
|
@@ -65,7 +65,7 @@ class Chef
|
|
65
65
|
# manifest.
|
66
66
|
cache.find(File.join(%w{cookbooks ** {*,.*}})).each do |cache_filename|
|
67
67
|
unless @valid_cache_entries[cache_filename]
|
68
|
-
Chef::Log.info("Removing #{cache_filename} from the cache; it is no longer needed by #{
|
68
|
+
Chef::Log.info("Removing #{cache_filename} from the cache; it is no longer needed by #{ChefUtils::Dist::Infra::CLIENT}.")
|
69
69
|
cache.delete(cache_filename)
|
70
70
|
end
|
71
71
|
end
|
@@ -18,11 +18,17 @@
|
|
18
18
|
# limitations under the License.
|
19
19
|
#
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
21
|
+
autoload :URI, "uri"
|
22
|
+
module Net
|
23
|
+
autoload :HTTP, File.expand_path("monkey_patches/net_http", __dir__)
|
24
|
+
end
|
25
|
+
autoload :OpenSSL, "openssl"
|
26
|
+
module Mixlib
|
27
|
+
module Authentication
|
28
|
+
autoload :SignedHeaderAuth, "mixlib/authentication/signedheaderauth"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
require "chef-utils/dist" unless defined?(ChefUtils::Dist)
|
26
32
|
|
27
33
|
class Chef
|
28
34
|
# == Chef::CookbookSiteStreamingUploader
|
@@ -37,7 +43,7 @@ class Chef
|
|
37
43
|
class << self
|
38
44
|
|
39
45
|
def create_build_dir(cookbook)
|
40
|
-
tmp_cookbook_path = Tempfile.new("#{
|
46
|
+
tmp_cookbook_path = Tempfile.new("#{ChefUtils::Dist::Infra::SHORT}-#{cookbook.name}-build")
|
41
47
|
tmp_cookbook_path.close
|
42
48
|
tmp_cookbook_dir = tmp_cookbook_path.path
|
43
49
|
File.unlink(tmp_cookbook_dir)
|
@@ -225,11 +231,7 @@ class Chef
|
|
225
231
|
@part_no += 1
|
226
232
|
@part_offset = 0
|
227
233
|
next_part = read(how_much_next_part)
|
228
|
-
result = current_part +
|
229
|
-
next_part
|
230
|
-
else
|
231
|
-
""
|
232
|
-
end
|
234
|
+
result = current_part + (next_part || "")
|
233
235
|
else
|
234
236
|
@part_offset += how_much_current_part
|
235
237
|
result = current_part
|
data/lib/chef/data_collector.rb
CHANGED
@@ -21,12 +21,12 @@
|
|
21
21
|
require_relative "server_api"
|
22
22
|
require_relative "http/simple_json"
|
23
23
|
require_relative "event_dispatch/base"
|
24
|
-
|
24
|
+
autoload :Set, "set"
|
25
25
|
require_relative "data_collector/run_end_message"
|
26
26
|
require_relative "data_collector/run_start_message"
|
27
27
|
require_relative "data_collector/config_validation"
|
28
28
|
require_relative "data_collector/error_handlers"
|
29
|
-
|
29
|
+
require "chef-utils/dist" unless defined?(ChefUtils::Dist)
|
30
30
|
|
31
31
|
class Chef
|
32
32
|
class DataCollector
|
@@ -197,7 +197,7 @@ class Chef
|
|
197
197
|
else
|
198
198
|
if code == "404"
|
199
199
|
# Make the message non-scary for folks who don't have automate:
|
200
|
-
msg << " (This is normal if you do not have #{
|
200
|
+
msg << " (This is normal if you do not have #{ChefUtils::Dist::Automate::PRODUCT})"
|
201
201
|
Chef::Log.debug(msg)
|
202
202
|
else
|
203
203
|
Chef::Log.warn(msg)
|
@@ -212,8 +212,9 @@ class Chef
|
|
212
212
|
def send_to_output_locations(message)
|
213
213
|
return unless Chef::Config[:data_collector][:output_locations]
|
214
214
|
|
215
|
+
Chef::DataCollector::ConfigValidation.validate_output_locations!
|
215
216
|
Chef::Config[:data_collector][:output_locations].each do |type, locations|
|
216
|
-
locations.each do |location|
|
217
|
+
Array(locations).each do |location|
|
217
218
|
send_to_file_location(location, message) if type == :files
|
218
219
|
send_to_http_location(location, message) if type == :urls
|
219
220
|
end
|
@@ -226,7 +227,7 @@ class Chef
|
|
226
227
|
# @param message [Hash] the message to render as JSON
|
227
228
|
#
|
228
229
|
def send_to_file_location(file_name, message)
|
229
|
-
File.open(file_name, "a") do |fh|
|
230
|
+
File.open(File.expand_path(file_name), "a") do |fh|
|
230
231
|
fh.puts Chef::JSONCompat.to_json(message, validate_utf8: false)
|
231
232
|
end
|
232
233
|
end
|
@@ -16,6 +16,7 @@
|
|
16
16
|
#
|
17
17
|
|
18
18
|
require "uri" unless defined?(URI)
|
19
|
+
require "chef-utils/dist" unless defined?(ChefUtils::Dist)
|
19
20
|
|
20
21
|
class Chef
|
21
22
|
class DataCollector
|
@@ -46,14 +47,14 @@ class Chef
|
|
46
47
|
return unless output_locations
|
47
48
|
|
48
49
|
# but deliberately setting an empty output_location we consider to be an error (XXX: but should we?)
|
49
|
-
|
50
|
+
unless valid_hash_with_keys?(output_locations, :urls, :files)
|
50
51
|
raise Chef::Exceptions::ConfigurationError,
|
51
52
|
"Chef::Config[:data_collector][:output_locations] is empty. Please supply an hash of valid URLs and / or local file paths."
|
52
53
|
end
|
53
54
|
|
54
55
|
# loop through all the types and locations and validate each one-by-one
|
55
56
|
output_locations.each do |type, locations|
|
56
|
-
locations.each do |location|
|
57
|
+
Array(locations).each do |location|
|
57
58
|
validate_url!(location) if type == :urls
|
58
59
|
validate_file!(location) if type == :files
|
59
60
|
end
|
@@ -86,15 +87,20 @@ class Chef
|
|
86
87
|
false
|
87
88
|
when running_mode == :client && Chef::Config[:data_collector][:token]
|
88
89
|
Chef::Log.warn("Data collector token authentication is not recommended for client-server mode. " \
|
89
|
-
"Please upgrade #{
|
90
|
+
"Please upgrade #{ChefUtils::Dist::Server::PRODUCT} to 12.11 or later and remove the token from your config file " \
|
90
91
|
"to use key based authentication instead")
|
91
92
|
true
|
92
|
-
when Chef::Config[:data_collector][:output_locations] && Chef::Config[:data_collector][:output_locations]
|
93
|
+
when Chef::Config[:data_collector][:output_locations] && !valid_hash_with_keys?(Chef::Config[:data_collector][:output_locations], :urls)
|
93
94
|
# we can run fine to a file without a token, even in solo mode.
|
95
|
+
unless valid_hash_with_keys?(Chef::Config[:data_collector][:output_locations], :files)
|
96
|
+
raise Chef::Exceptions::ConfigurationError,
|
97
|
+
"Chef::Config[:data_collector][:output_locations] is empty. Please supply an hash of valid URLs and / or local file paths."
|
98
|
+
end
|
99
|
+
|
94
100
|
true
|
95
101
|
when running_mode == :solo && !Chef::Config[:data_collector][:token]
|
96
102
|
# we are in solo mode and are not logging to a file, so must have a token
|
97
|
-
Chef::Log.trace("Data collector token must be configured to use #{
|
103
|
+
Chef::Log.trace("Data collector token must be configured to use #{ChefUtils::Dist::Automate::PRODUCT} data collector with #{ChefUtils::Dist::Solo::PRODUCT}")
|
98
104
|
false
|
99
105
|
else
|
100
106
|
true
|
@@ -105,16 +111,10 @@ class Chef
|
|
105
111
|
|
106
112
|
# validate an output_location file
|
107
113
|
def validate_file!(file)
|
108
|
-
|
109
|
-
|
114
|
+
return true if Chef::Config.path_accessible?(File.expand_path(file))
|
115
|
+
|
110
116
|
raise Chef::Exceptions::ConfigurationError,
|
111
117
|
"Chef::Config[:data_collector][:output_locations][:files] contains the location #{file}, which is a non existent file path."
|
112
|
-
rescue Errno::EACCES
|
113
|
-
raise Chef::Exceptions::ConfigurationError,
|
114
|
-
"Chef::Config[:data_collector][:output_locations][:files] contains the location #{file}, which cannot be written to by Chef."
|
115
|
-
rescue Exception => e
|
116
|
-
raise Chef::Exceptions::ConfigurationError,
|
117
|
-
"Chef::Config[:data_collector][:output_locations][:files] contains the location #{file}, which is invalid: #{e.message}."
|
118
118
|
end
|
119
119
|
|
120
120
|
# validate an output_location url
|
@@ -125,6 +125,15 @@ class Chef
|
|
125
125
|
"Chef::Config[:data_collector][:output_locations][:urls] contains the url #{url} which is not valid."
|
126
126
|
end
|
127
127
|
|
128
|
+
# Validate the hash contains at least one of the given keys.
|
129
|
+
#
|
130
|
+
# @param hash [Hash] the hash to be validated.
|
131
|
+
# @param keys [Array] an array of keys to check existence of in the hash.
|
132
|
+
# @return [Boolean] true if the hash contains any of the given keys.
|
133
|
+
#
|
134
|
+
def valid_hash_with_keys?(hash, *keys)
|
135
|
+
hash.is_a?(Hash) && keys.any? { |k| hash.key?(k) }
|
136
|
+
end
|
128
137
|
end
|
129
138
|
end
|
130
139
|
end
|