chef 17.10.95 → 18.1.0
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 +16 -8
- data/README.md +7 -7
- data/Rakefile +3 -22
- data/{chef-universal-mingw32.gemspec → chef-universal-mingw-ucrt.gemspec} +8 -7
- data/chef.gemspec +12 -5
- data/lib/chef/api_client_v1.rb +9 -1
- data/lib/chef/application/exit_code.rb +3 -3
- data/lib/chef/chef_fs/file_system.rb +21 -7
- data/lib/chef/client.rb +169 -17
- data/lib/chef/compliance/input.rb +1 -1
- data/lib/chef/compliance/profile.rb +1 -1
- data/lib/chef/compliance/profile_collection.rb +0 -1
- data/lib/chef/compliance/waiver.rb +1 -1
- data/lib/chef/cookbook/syntax_check.rb +2 -2
- data/lib/chef/dsl/reader_helpers.rb +1 -1
- data/lib/chef/dsl/rest_resource.rb +77 -0
- data/lib/chef/event_dispatch/base.rb +3 -0
- data/lib/chef/exceptions.rb +8 -0
- data/lib/chef/http/authenticator.rb +170 -3
- data/lib/chef/http/ssl_policies.rb +3 -3
- data/lib/chef/mixin/powershell_exec.rb +5 -28
- data/lib/chef/node/mixin/immutablize_array.rb +1 -0
- data/lib/chef/property.rb +13 -6
- data/lib/chef/provider/cron.rb +5 -1
- data/lib/chef/provider/group/windows.rb +1 -1
- data/lib/chef/provider/http_request.rb +11 -9
- data/lib/chef/provider/launchd.rb +1 -0
- data/lib/chef/provider/mount/linux.rb +5 -0
- data/lib/chef/provider/mount/mount.rb +8 -0
- data/lib/chef/provider/mount/windows.rb +1 -1
- data/lib/chef/provider/package/chocolatey.rb +1 -18
- data/lib/chef/provider/package/rubygems.rb +1 -1
- data/lib/chef/provider/package/snap.rb +1 -1
- data/lib/chef/provider/package/windows/msi.rb +2 -2
- data/lib/chef/provider/package/windows/registry_uninstall_entry.rb +1 -1
- data/lib/chef/provider/package/yum/yum_helper.py +5 -17
- data/lib/chef/provider/package/zypper/version.rb +60 -0
- data/lib/chef/provider/package/zypper.rb +47 -3
- data/lib/chef/provider/service/windows.rb +1 -1
- data/lib/chef/provider/user/aix.rb +5 -0
- data/lib/chef/provider/user/linux.rb +29 -0
- data/lib/chef/provider/user/mac.rb +1 -1
- data/lib/chef/provider/user.rb +46 -14
- data/lib/chef/provider/yum_repository.rb +13 -1
- data/lib/chef/provider.rb +1 -1
- data/lib/chef/recipe.rb +1 -1
- data/lib/chef/resource/_rest_resource.rb +389 -0
- data/lib/chef/resource/alternatives.rb +0 -1
- data/lib/chef/resource/apt_package.rb +2 -1
- data/lib/chef/resource/apt_preference.rb +0 -1
- data/lib/chef/resource/apt_repository.rb +0 -1
- data/lib/chef/resource/apt_update.rb +0 -1
- data/lib/chef/resource/archive_file.rb +0 -1
- data/lib/chef/resource/bash.rb +0 -1
- data/lib/chef/resource/batch.rb +0 -1
- data/lib/chef/resource/bff_package.rb +0 -1
- data/lib/chef/resource/breakpoint.rb +0 -1
- data/lib/chef/resource/build_essential.rb +0 -1
- data/lib/chef/resource/cab_package.rb +0 -1
- data/lib/chef/resource/chef_client_config.rb +12 -14
- data/lib/chef/resource/chef_client_cron.rb +1 -2
- data/lib/chef/resource/chef_client_launchd.rb +2 -2
- data/lib/chef/resource/chef_client_scheduled_task.rb +3 -3
- data/lib/chef/resource/chef_client_systemd_timer.rb +0 -1
- data/lib/chef/resource/chef_client_trusted_certificate.rb +0 -1
- data/lib/chef/resource/chef_gem.rb +0 -1
- data/lib/chef/resource/chef_handler.rb +0 -1
- data/lib/chef/resource/chef_sleep.rb +1 -3
- data/lib/chef/resource/chef_vault_secret.rb +0 -1
- data/lib/chef/resource/chocolatey_config.rb +0 -1
- data/lib/chef/resource/chocolatey_feature.rb +0 -1
- data/lib/chef/resource/chocolatey_package.rb +0 -1
- data/lib/chef/resource/chocolatey_source.rb +0 -1
- data/lib/chef/resource/cookbook_file.rb +0 -1
- data/lib/chef/resource/cron/_cron_shared.rb +0 -1
- data/lib/chef/resource/cron/cron.rb +0 -1
- data/lib/chef/resource/cron/cron_d.rb +15 -1
- data/lib/chef/resource/cron_access.rb +0 -1
- data/lib/chef/resource/csh.rb +0 -1
- data/lib/chef/resource/directory.rb +0 -1
- data/lib/chef/resource/dmg_package.rb +2 -1
- data/lib/chef/resource/dnf_package.rb +0 -1
- data/lib/chef/resource/dpkg_package.rb +0 -1
- data/lib/chef/resource/dsc_resource.rb +0 -1
- data/lib/chef/resource/dsc_script.rb +0 -1
- data/lib/chef/resource/execute.rb +0 -1
- data/lib/chef/resource/file.rb +0 -1
- data/lib/chef/resource/freebsd_package.rb +2 -1
- data/lib/chef/resource/gem_package.rb +2 -1
- data/lib/chef/resource/group.rb +25 -2
- data/lib/chef/resource/habitat/habitat_package.rb +0 -1
- data/lib/chef/resource/habitat/habitat_sup.rb +6 -7
- data/lib/chef/resource/habitat/habitat_sup_windows.rb +1 -1
- data/lib/chef/resource/habitat_config.rb +0 -1
- data/lib/chef/resource/habitat_install.rb +0 -1
- data/lib/chef/resource/habitat_service.rb +0 -1
- data/lib/chef/resource/habitat_user_toml.rb +0 -1
- data/lib/chef/resource/homebrew_cask.rb +0 -1
- data/lib/chef/resource/homebrew_package.rb +2 -1
- data/lib/chef/resource/homebrew_tap.rb +0 -1
- data/lib/chef/resource/homebrew_update.rb +0 -2
- data/lib/chef/resource/hostname.rb +0 -1
- data/lib/chef/resource/http_request.rb +0 -1
- data/lib/chef/resource/ifconfig.rb +0 -1
- data/lib/chef/resource/inspec_input.rb +0 -1
- data/lib/chef/resource/inspec_waiver.rb +0 -1
- data/lib/chef/resource/inspec_waiver_file_entry.rb +2 -3
- data/lib/chef/resource/ips_package.rb +0 -1
- data/lib/chef/resource/kernel_module.rb +0 -1
- data/lib/chef/resource/ksh.rb +0 -1
- data/lib/chef/resource/launchd.rb +3 -1
- data/lib/chef/resource/link.rb +0 -1
- data/lib/chef/resource/locale.rb +2 -6
- data/lib/chef/resource/log.rb +0 -1
- data/lib/chef/resource/lwrp_base.rb +0 -4
- data/lib/chef/resource/macos_userdefaults.rb +8 -13
- data/lib/chef/resource/macosx_service.rb +0 -1
- data/lib/chef/resource/macports_package.rb +2 -1
- data/lib/chef/resource/mdadm.rb +0 -1
- data/lib/chef/resource/mount.rb +0 -1
- data/lib/chef/resource/msu_package.rb +0 -1
- data/lib/chef/resource/notify_group.rb +0 -2
- data/lib/chef/resource/ohai.rb +0 -1
- data/lib/chef/resource/ohai_hint.rb +0 -1
- data/lib/chef/resource/openbsd_package.rb +2 -1
- data/lib/chef/resource/openssl_dhparam.rb +0 -2
- data/lib/chef/resource/openssl_ec_private_key.rb +0 -2
- data/lib/chef/resource/openssl_ec_public_key.rb +0 -2
- data/lib/chef/resource/openssl_rsa_private_key.rb +0 -2
- data/lib/chef/resource/openssl_rsa_public_key.rb +0 -2
- data/lib/chef/resource/openssl_x509_certificate.rb +0 -2
- data/lib/chef/resource/openssl_x509_crl.rb +0 -2
- data/lib/chef/resource/openssl_x509_request.rb +0 -2
- data/lib/chef/resource/osx_profile.rb +0 -1
- data/lib/chef/resource/package.rb +0 -1
- data/lib/chef/resource/pacman_package.rb +2 -1
- data/lib/chef/resource/paludis_package.rb +0 -1
- data/lib/chef/resource/perl.rb +0 -1
- data/lib/chef/resource/plist.rb +7 -3
- data/lib/chef/resource/portage_package.rb +2 -1
- data/lib/chef/resource/powershell_package.rb +0 -1
- data/lib/chef/resource/powershell_package_source.rb +0 -1
- data/lib/chef/resource/powershell_script.rb +0 -1
- data/lib/chef/resource/python.rb +0 -1
- data/lib/chef/resource/reboot.rb +0 -1
- data/lib/chef/resource/registry_key.rb +0 -1
- data/lib/chef/resource/remote_directory.rb +0 -1
- data/lib/chef/resource/remote_file.rb +0 -1
- data/lib/chef/resource/rhsm_errata.rb +0 -1
- data/lib/chef/resource/rhsm_errata_level.rb +0 -1
- data/lib/chef/resource/rhsm_register.rb +2 -4
- data/lib/chef/resource/rhsm_repo.rb +0 -1
- data/lib/chef/resource/rhsm_subscription.rb +0 -1
- data/lib/chef/resource/route.rb +0 -1
- data/lib/chef/resource/rpm_package.rb +2 -1
- data/lib/chef/resource/ruby.rb +0 -1
- data/lib/chef/resource/ruby_block.rb +0 -1
- data/lib/chef/resource/scm/_scm.rb +0 -2
- data/lib/chef/resource/scm/git.rb +0 -2
- data/lib/chef/resource/scm/subversion.rb +0 -2
- data/lib/chef/resource/script.rb +0 -1
- data/lib/chef/resource/selinux/common_helpers.rb +47 -0
- data/lib/chef/resource/selinux/selinux_debian.erb +18 -0
- data/lib/chef/resource/selinux/selinux_default.erb +15 -0
- data/lib/chef/resource/selinux_boolean.rb +101 -0
- data/lib/chef/resource/selinux_fcontext.rb +160 -0
- data/lib/chef/resource/selinux_install.rb +107 -0
- data/lib/chef/resource/selinux_module.rb +143 -0
- data/lib/chef/resource/selinux_permissive.rb +64 -0
- data/lib/chef/resource/selinux_port.rb +118 -0
- data/lib/chef/resource/selinux_state.rb +166 -0
- data/lib/chef/resource/service.rb +0 -1
- data/lib/chef/resource/smartos_package.rb +2 -1
- data/lib/chef/resource/snap_package.rb +2 -1
- data/lib/chef/resource/solaris_package.rb +2 -1
- data/lib/chef/resource/ssh_known_hosts_entry.rb +0 -1
- data/lib/chef/resource/sudo.rb +0 -1
- data/lib/chef/resource/support/client.erb +2 -2
- data/lib/chef/resource/swap_file.rb +0 -1
- data/lib/chef/resource/sysctl.rb +1 -2
- data/lib/chef/resource/systemd_unit.rb +0 -1
- data/lib/chef/resource/template.rb +0 -1
- data/lib/chef/resource/timezone.rb +0 -1
- data/lib/chef/resource/user/aix_user.rb +0 -1
- data/lib/chef/resource/user/linux_user.rb +0 -1
- data/lib/chef/resource/user/mac_user.rb +0 -1
- data/lib/chef/resource/user/pw_user.rb +0 -1
- data/lib/chef/resource/user/solaris_user.rb +0 -1
- data/lib/chef/resource/user/windows_user.rb +0 -1
- data/lib/chef/resource/user.rb +10 -1
- data/lib/chef/resource/user_ulimit.rb +0 -1
- data/lib/chef/resource/whyrun_safe_ruby_block.rb +0 -1
- data/lib/chef/resource/windows_ad_join.rb +0 -2
- data/lib/chef/resource/windows_audit_policy.rb +0 -2
- data/lib/chef/resource/windows_auto_run.rb +0 -1
- data/lib/chef/resource/windows_defender.rb +0 -1
- data/lib/chef/resource/windows_defender_exclusion.rb +0 -1
- data/lib/chef/resource/windows_dfs_folder.rb +0 -1
- data/lib/chef/resource/windows_dfs_namespace.rb +0 -1
- data/lib/chef/resource/windows_dfs_server.rb +0 -1
- data/lib/chef/resource/windows_dns_record.rb +0 -1
- data/lib/chef/resource/windows_dns_zone.rb +0 -1
- data/lib/chef/resource/windows_env.rb +0 -1
- data/lib/chef/resource/windows_feature.rb +0 -1
- data/lib/chef/resource/windows_feature_dism.rb +0 -1
- data/lib/chef/resource/windows_feature_powershell.rb +0 -1
- data/lib/chef/resource/windows_firewall_profile.rb +0 -2
- data/lib/chef/resource/windows_firewall_rule.rb +0 -1
- data/lib/chef/resource/windows_font.rb +2 -3
- data/lib/chef/resource/windows_package.rb +3 -4
- data/lib/chef/resource/windows_pagefile.rb +0 -2
- data/lib/chef/resource/windows_path.rb +0 -1
- data/lib/chef/resource/windows_printer.rb +0 -1
- data/lib/chef/resource/windows_printer_port.rb +0 -1
- data/lib/chef/resource/windows_script.rb +0 -2
- data/lib/chef/resource/windows_security_policy.rb +0 -1
- data/lib/chef/resource/windows_service.rb +0 -1
- data/lib/chef/resource/windows_share.rb +0 -1
- data/lib/chef/resource/windows_shortcut.rb +1 -2
- data/lib/chef/resource/windows_task.rb +0 -1
- data/lib/chef/resource/windows_uac.rb +0 -1
- data/lib/chef/resource/windows_update_settings.rb +0 -1
- data/lib/chef/resource/windows_user_privilege.rb +0 -1
- data/lib/chef/resource/windows_workgroup.rb +0 -1
- data/lib/chef/resource/yum_package.rb +2 -1
- data/lib/chef/resource/yum_repository.rb +4 -1
- data/lib/chef/resource/zypper_package.rb +2 -1
- data/lib/chef/resource/zypper_repository.rb +0 -1
- data/lib/chef/resource.rb +12 -5
- data/lib/chef/resources.rb +7 -0
- data/lib/chef/run_context.rb +3 -3
- data/lib/chef/secret_fetcher/azure_key_vault.rb +3 -3
- data/lib/chef/version.rb +1 -1
- data/lib/chef/win32/handle.rb +6 -7
- data/lib/chef/win32/registry.rb +7 -3
- data/spec/data/chef_guid +1 -0
- data/spec/data/nodes/mcwfhpowell.json +3 -0
- data/spec/data/rubygems.org/sexp_processor-info +2 -1
- data/spec/data/trusted_certs/example.crt +20 -29
- data/spec/data/trusted_certs/example_no_cn.crt +34 -30
- data/spec/data/trusted_certs/opscode.pem +54 -33
- data/spec/functional/assets/yumrepo-empty/repodata/01a3b489a465bcac22a43492163df43451dc6ce47d27f66de289756b91635523-filelists.sqlite.bz2 +0 -0
- data/spec/functional/assets/yumrepo-empty/repodata/401dc19bda88c82c403423fb835844d64345f7e95f5b9835888189c03834cc93-filelists.xml.gz +0 -0
- data/spec/functional/assets/yumrepo-empty/repodata/5dc1e6e73c84803f059bb3065e684e56adfc289a7e398946574d79dac6643945-primary.sqlite.bz2 +0 -0
- data/spec/functional/assets/yumrepo-empty/repodata/6bf9672d0862e8ef8b8ff05a2fd0208a922b1f5978e6589d87944c88259cb670-other.xml.gz +0 -0
- data/spec/functional/assets/yumrepo-empty/repodata/7c36572015e075add2b38b900837bcdbb8a504130ddff49b2351a7fc0affa3d4-other.sqlite.bz2 +0 -0
- data/spec/functional/assets/yumrepo-empty/repodata/dabe2ce5481d23de1f4f52bdcfee0f9af98316c9e0de2ce8123adeefa0dd08b9-primary.xml.gz +0 -0
- data/spec/functional/assets/yumrepo-empty/repodata/repomd.xml +55 -0
- data/spec/functional/resource/chocolatey_package_spec.rb +20 -32
- data/spec/functional/resource/dsc_script_spec.rb +1 -1
- data/spec/functional/resource/group_spec.rb +10 -6
- data/spec/functional/resource/link_spec.rb +8 -8
- data/spec/functional/resource/macos_userdefaults_spec.rb +4 -4
- data/spec/functional/resource/plist_spec.rb +25 -0
- data/spec/functional/resource/user/linux_user_spec.rb +127 -0
- data/spec/functional/resource/windows_certificate_spec.rb +1 -26
- data/spec/functional/resource/windows_font_spec.rb +12 -9
- data/spec/functional/resource/yum_package_spec.rb +17 -1
- data/spec/functional/resource/zypper_package_spec.rb +12 -0
- data/spec/functional/shell_spec.rb +1 -2
- data/spec/functional/version_spec.rb +1 -1
- data/spec/integration/client/client_spec.rb +82 -3
- data/spec/integration/client/exit_code_spec.rb +1 -1
- data/spec/integration/client/fips_spec.rb +20 -0
- data/spec/integration/client/ipv6_spec.rb +1 -1
- data/spec/integration/compliance/compliance_spec.rb +1 -1
- data/spec/integration/recipes/accumulator_spec.rb +1 -1
- data/spec/integration/recipes/lwrp_inline_resources_spec.rb +1 -1
- 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/remote_directory.rb +1 -1
- data/spec/integration/recipes/unified_mode_spec.rb +1 -1
- data/spec/integration/recipes/use_partial_spec.rb +2 -1
- data/spec/integration/solo/solo_spec.rb +2 -2
- data/spec/spec_helper.rb +5 -0
- data/spec/support/platform_helpers.rb +8 -0
- data/spec/support/ruby_installer.rb +1 -1
- data/spec/support/shared/functional/windows_script.rb +2 -2
- data/spec/unit/application/client_spec.rb +0 -10
- data/spec/unit/chef_fs/file_system_spec.rb +2 -0
- data/spec/unit/client_spec.rb +57 -8
- data/spec/unit/compliance/reporter/chef_server_automate_spec.rb +1 -1
- data/spec/unit/cookbook/syntax_check_spec.rb +3 -0
- data/spec/unit/http/authenticator_spec.rb +68 -0
- data/spec/unit/mixin/powershell_exec_spec.rb +5 -5
- data/spec/unit/platform/query_helpers_spec.rb +2 -17
- data/spec/unit/property/validation_spec.rb +30 -0
- data/spec/unit/provider/cron_spec.rb +36 -0
- data/spec/unit/provider/http_request_spec.rb +60 -72
- data/spec/unit/provider/mount/linux_spec.rb +10 -0
- data/spec/unit/provider/package/chocolatey_spec.rb +3 -19
- data/spec/unit/provider/package/rubygems_spec.rb +1 -1
- data/spec/unit/provider/package/zypper_spec.rb +32 -0
- data/spec/unit/provider/user/linux_spec.rb +51 -11
- data/spec/unit/provider/user_spec.rb +24 -6
- data/spec/unit/resource/archive_file_spec.rb +1 -1
- data/spec/unit/resource/chef_client_cron_spec.rb +5 -0
- data/spec/unit/resource/chef_client_launchd_spec.rb +5 -0
- data/spec/unit/resource/chef_client_scheduled_task_spec.rb +5 -0
- data/spec/unit/resource/chef_client_systemd_timer_spec.rb +1 -1
- data/spec/unit/resource/cron_d_spec.rb +37 -1
- data/spec/unit/resource/macos_user_defaults_spec.rb +4 -4
- data/spec/unit/resource/rest_resource_spec.rb +381 -0
- data/spec/unit/resource/selinux_boolean_spec.rb +92 -0
- data/spec/unit/resource/selinux_fcontext_spec.rb +65 -0
- data/spec/unit/resource/selinux_install_spec.rb +60 -0
- data/spec/unit/resource/selinux_module_spec.rb +55 -0
- data/spec/unit/resource/selinux_permissive_spec.rb +39 -0
- data/spec/unit/resource/selinux_port_spec.rb +42 -0
- data/spec/unit/resource/selinux_state_spec.rb +46 -0
- data/spec/unit/resource/sysctl_spec.rb +2 -2
- data/spec/unit/resource/user/linux_user_spec.rb +42 -0
- data/spec/unit/resource/yum_repository_spec.rb +4 -0
- data/spec/unit/resource_spec.rb +0 -1
- data/spec/unit/util/dsc/local_configuration_manager_spec.rb +1 -1
- data/tasks/rspec.rb +1 -1
- metadata +107 -31
- /data/spec/functional/assets/chocolatey_feed/{test-A.1.0.0.nupkg → test-A.1.0.nupkg} +0 -0
- /data/spec/functional/assets/chocolatey_feed/{test-A.1.5.0.nupkg → test-A.1.5.nupkg} +0 -0
- /data/spec/functional/assets/chocolatey_feed/{test-A.2.0.0.nupkg → test-A.2.0.nupkg} +0 -0
- /data/spec/functional/assets/chocolatey_feed/{test-B.1.0.0.nupkg → test-B.1.0.nupkg} +0 -0
- /data/spec/functional/assets/yumrepo/repodata/{01a3b-filelists.sqlite.bz2 → 4632d67cb92636e7575d911c24f0e04d3505a944e97c483abe0c3e73a7c62d33-filelists.sqlite.bz2} +0 -0
- /data/spec/functional/assets/yumrepo/repodata/{6bf96-other.xml.gz → 74599b793e54d877323837d2d81a1c3c594c44e4335f9528234bb490f7b9b439-other.xml.gz} +0 -0
- /data/spec/functional/assets/yumrepo/repodata/{5dc1e-primary.sqlite.bz2 → a845d418f919d2115ab95a56b2c76f6825ad0d0bede49181a55c04f58995d057-primary.sqlite.bz2} +0 -0
- /data/spec/functional/assets/yumrepo/repodata/{7c365-other.sqlite.bz2 → af9b7cf9ef23bd7b43068d74a460f3b5d06753d638e58e4a0c9edc35bfb9cdc4-other.sqlite.bz2} +0 -0
- /data/spec/functional/assets/yumrepo/repodata/{401dc-filelists.xml.gz → bdb4f5f1492a3b9532f22c43110a81500dd744f23da0aec5c33b2a41317c737d-filelists.xml.gz} +0 -0
- /data/spec/functional/assets/yumrepo/repodata/{dabe2-primary.xml.gz → c10d1d34ce99e02f12ec96ef68360543ab1bb7c3cb81a4a2bf78df7d8597e9df-primary.xml.gz} +0 -0
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright:: Copyright 2008-2016, Chef, Inc.
|
|
3
|
+
# License:: Apache License, Version 2.0
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
#
|
|
17
|
+
|
|
18
|
+
require "addressable/template" unless defined?(Addressable::Template)
|
|
19
|
+
require "rest-client" unless defined?(RestClient)
|
|
20
|
+
require "jmespath" unless defined?(JMESPath)
|
|
21
|
+
require "chef/dsl/rest_resource" unless defined?(Chef::DSL::RestResource)
|
|
22
|
+
|
|
23
|
+
extend Chef::DSL::RestResource
|
|
24
|
+
|
|
25
|
+
action_class do
|
|
26
|
+
def load_current_resource
|
|
27
|
+
@current_resource = new_resource.class.new(new_resource.name)
|
|
28
|
+
|
|
29
|
+
required_properties.each do |name|
|
|
30
|
+
requested = new_resource.send(name)
|
|
31
|
+
current_resource.send(name, requested)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
return @current_resource if rest_get_all.data.empty?
|
|
35
|
+
|
|
36
|
+
resource_data = rest_get.data rescue nil
|
|
37
|
+
return @current_resource if resource_data.nil? || resource_data.empty?
|
|
38
|
+
|
|
39
|
+
@resource_exists = true
|
|
40
|
+
|
|
41
|
+
# Map JSON contents to defined properties
|
|
42
|
+
current_resource.class.rest_property_map.each do |property, match_instruction|
|
|
43
|
+
property_value = json_to_property(match_instruction, property, resource_data)
|
|
44
|
+
current_resource.send(property, property_value) unless property_value.nil?
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
current_resource
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
action :configure do
|
|
52
|
+
if resource_exists?
|
|
53
|
+
converge_if_changed do
|
|
54
|
+
data = {}
|
|
55
|
+
|
|
56
|
+
new_resource.class.rest_property_map.each do |property, match_instruction|
|
|
57
|
+
# Skip "creation-only" properties on modifications
|
|
58
|
+
next if new_resource.class.rest_post_only_properties.include?(property)
|
|
59
|
+
|
|
60
|
+
deep_merge! data, property_to_json(property, match_instruction)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
deep_compact!(data)
|
|
64
|
+
|
|
65
|
+
rest_patch(data)
|
|
66
|
+
end
|
|
67
|
+
else
|
|
68
|
+
converge_by "creating resource" do
|
|
69
|
+
data = {}
|
|
70
|
+
|
|
71
|
+
new_resource.class.rest_property_map.each do |property, match_instruction|
|
|
72
|
+
deep_merge! data, property_to_json(property, match_instruction)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
deep_compact!(data)
|
|
76
|
+
|
|
77
|
+
rest_post(data)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
action :delete do
|
|
83
|
+
if resource_exists?
|
|
84
|
+
converge_by "deleting resource" do
|
|
85
|
+
rest_delete
|
|
86
|
+
end
|
|
87
|
+
else
|
|
88
|
+
logger.debug format("REST resource %<name>s of type %<type>s does not exist. Skipping.",
|
|
89
|
+
type: new_resource.name, name: id_property)
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
action_class do
|
|
94
|
+
# Override this for postprocessing device-specifics (paging, data conversion)
|
|
95
|
+
def rest_postprocess(response)
|
|
96
|
+
response
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# Override this for error handling of device-specifics (readable error messages)
|
|
100
|
+
def rest_errorhandler(error_obj)
|
|
101
|
+
error_obj
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
private
|
|
105
|
+
|
|
106
|
+
def resource_exists?
|
|
107
|
+
@resource_exists
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def required_properties
|
|
111
|
+
current_resource.class.properties.select { |_, v| v.required? }.except(:name).keys
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Return changed value or nil for delta current->new
|
|
115
|
+
def changed_value(property)
|
|
116
|
+
new_value = new_resource.send(property)
|
|
117
|
+
return new_value if current_resource.nil?
|
|
118
|
+
|
|
119
|
+
current_value = current_resource.send(property)
|
|
120
|
+
|
|
121
|
+
return current_value if required_properties.include? property
|
|
122
|
+
|
|
123
|
+
new_value == current_value ? nil : new_value
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def id_property
|
|
127
|
+
current_resource.class.identity_attr
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
# Map properties to their current values
|
|
131
|
+
def property_map
|
|
132
|
+
map = {}
|
|
133
|
+
|
|
134
|
+
current_resource.class.state_properties.each do |property|
|
|
135
|
+
name = property.options[:name]
|
|
136
|
+
|
|
137
|
+
map[name] = current_resource.send(name)
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
map[id_property] = current_resource.send(id_property)
|
|
141
|
+
|
|
142
|
+
map
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# Map part of a JSON (Hash) to resource property via JMESPath or user-supplied function
|
|
146
|
+
def json_to_property(match_instruction, property, resource_data)
|
|
147
|
+
case match_instruction
|
|
148
|
+
when String
|
|
149
|
+
JMESPath.search(match_instruction, resource_data)
|
|
150
|
+
when Symbol
|
|
151
|
+
function = "#{property}_from_json".to_sym
|
|
152
|
+
raise "#{new_resource.name} missing #{function} method" unless self.class.protected_method_defined?(function)
|
|
153
|
+
|
|
154
|
+
send(function, resource_data) || {}
|
|
155
|
+
else
|
|
156
|
+
raise TypeError, "Did not expect match type #{match_instruction.class}"
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# Map resource contents into a JSON (Hash) via JMESPath-like syntax or user-supplied function
|
|
161
|
+
def property_to_json(property, match_instruction)
|
|
162
|
+
case match_instruction
|
|
163
|
+
when String
|
|
164
|
+
bury(match_instruction, changed_value(property))
|
|
165
|
+
when Symbol
|
|
166
|
+
function = "#{property}_to_json".to_sym
|
|
167
|
+
raise "#{new_resource.name} missing #{function} method" unless self.class.protected_method_defined?(function)
|
|
168
|
+
|
|
169
|
+
value = new_resource.send(property)
|
|
170
|
+
changed_value(property).nil? ? {} : send(function, value)
|
|
171
|
+
else
|
|
172
|
+
raise TypeError, "Did not expect match type #{match_instruction.class}"
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
def rest_url_collection
|
|
177
|
+
current_resource.class.rest_api_collection
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
# Resource document URL after RFC 6570 template evaluation via properties substitution
|
|
181
|
+
def rest_url_document
|
|
182
|
+
template = ::Addressable::Template.new(current_resource.class.rest_api_document)
|
|
183
|
+
template.expand(property_map).to_s
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
# Convenience method for conditional requires
|
|
187
|
+
def conditionally_require_on_setting(property, dependent_properties)
|
|
188
|
+
dependent_properties = Array(dependent_properties)
|
|
189
|
+
|
|
190
|
+
requirements.assert(:configure) do |a|
|
|
191
|
+
a.assertion do
|
|
192
|
+
# Needs to be set and truthy to require dependent properties
|
|
193
|
+
if new_resource.send(property)
|
|
194
|
+
dependent_properties.all? { |dep_prop| new_resource.property_is_set?(dep_prop) }
|
|
195
|
+
else
|
|
196
|
+
true
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
message = format("Setting property :%<property>s requires properties :%<properties>s to be set as well on resource %<resource_name>s",
|
|
201
|
+
property: property,
|
|
202
|
+
properties: dependent_properties.join(", :"),
|
|
203
|
+
resource_name: current_resource.to_s)
|
|
204
|
+
|
|
205
|
+
a.failure_message message
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
# Generic REST helpers
|
|
210
|
+
|
|
211
|
+
def rest_get_all
|
|
212
|
+
response = api_connection.get(rest_url_collection)
|
|
213
|
+
|
|
214
|
+
rest_postprocess(response)
|
|
215
|
+
rescue RestClient::Exception => e
|
|
216
|
+
rest_errorhandler(e)
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
def rest_get
|
|
220
|
+
response = api_connection.get(rest_url_document)
|
|
221
|
+
|
|
222
|
+
response = rest_postprocess(response)
|
|
223
|
+
|
|
224
|
+
first_only = current_resource.class.rest_api_document_first_element_only
|
|
225
|
+
response.data = response.data.first if first_only && response.data.is_a?(Array)
|
|
226
|
+
|
|
227
|
+
response
|
|
228
|
+
rescue RestClient::Exception => e
|
|
229
|
+
rest_errorhandler(e)
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
def rest_post(data)
|
|
233
|
+
data.merge! rest_identity_values
|
|
234
|
+
|
|
235
|
+
response = api_connection.post(rest_url_collection, data: data)
|
|
236
|
+
|
|
237
|
+
rest_postprocess(response)
|
|
238
|
+
rescue RestClient::Exception => e
|
|
239
|
+
rest_errorhandler(e)
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
def rest_put(data)
|
|
243
|
+
data.merge! rest_identity_values
|
|
244
|
+
|
|
245
|
+
response = api_connection.put(rest_url_collection, data: data)
|
|
246
|
+
|
|
247
|
+
rest_postprocess(response)
|
|
248
|
+
rescue RestClient::Exception => e
|
|
249
|
+
rest_errorhandler(e)
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
def rest_patch(data)
|
|
253
|
+
response = api_connection.patch(rest_url_document, data: data)
|
|
254
|
+
|
|
255
|
+
rest_postprocess(response)
|
|
256
|
+
rescue RestClient::Exception => e
|
|
257
|
+
rest_errorhandler(e)
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
def rest_delete
|
|
261
|
+
response = api_connection.delete(rest_url_document)
|
|
262
|
+
|
|
263
|
+
rest_postprocess(response)
|
|
264
|
+
rescue RestClient::Exception => e
|
|
265
|
+
rest_errorhandler(e)
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
# REST parameter mapping
|
|
269
|
+
|
|
270
|
+
# Return number of parameters needed to identify a resource (pre- and post-creation)
|
|
271
|
+
def rest_arity
|
|
272
|
+
rest_identity_map.keys.count
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
# Return mapping of template placeholders to property value of identity parameters
|
|
276
|
+
def rest_identity_values
|
|
277
|
+
data = {}
|
|
278
|
+
|
|
279
|
+
rest_identity_map.each do |rfc_template, property|
|
|
280
|
+
property_value = new_resource.send(property)
|
|
281
|
+
data.merge! bury(rfc_template, property_value)
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
data
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
def rest_identity_map
|
|
288
|
+
rest_identity_explicit || rest_identity_implicit
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
# Accept direct mapping like { "svm.name" => :name } for specifying the x-ary identity of a resource
|
|
292
|
+
def rest_identity_explicit
|
|
293
|
+
current_resource.class.rest_identity_map
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
# Parse document URL for RFC 6570 templates and map them to resource properties.
|
|
297
|
+
#
|
|
298
|
+
# Examples:
|
|
299
|
+
# Query based: "/api/protocols/san/igroups?name={name}&svm.name={svm}": { "name" => :name, "svm.name" => :svm }
|
|
300
|
+
# Path based: "/api/v1/{address}": { "address" => :address }
|
|
301
|
+
#
|
|
302
|
+
def rest_identity_implicit
|
|
303
|
+
template_url = current_resource.class.rest_api_document
|
|
304
|
+
|
|
305
|
+
rfc_template = ::Addressable::Template.new(template_url)
|
|
306
|
+
rfc_template_vars = rfc_template.variables
|
|
307
|
+
|
|
308
|
+
# Shortcut for 0-ary resources
|
|
309
|
+
return {} if rfc_template_vars.empty?
|
|
310
|
+
|
|
311
|
+
if query_based_selection?
|
|
312
|
+
uri_query = URI.parse(template_url).query
|
|
313
|
+
|
|
314
|
+
if CGI.parse(uri_query).values.any?(&:empty?)
|
|
315
|
+
raise "Need explicit identity mapping, as URL does not contain query parameters for all templates"
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
path_variables = CGI.parse(uri_query).keys
|
|
319
|
+
elsif path_based_selection?
|
|
320
|
+
path_variables = rfc_template_vars
|
|
321
|
+
else
|
|
322
|
+
# There is also
|
|
323
|
+
raise "Unknown type of resource selection. Document URL does not seem to be path- or query-based?"
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
identity_map = {}
|
|
327
|
+
path_variables.each_with_index do |v, i|
|
|
328
|
+
next if rfc_template_vars[i].nil? # Not mapped to property, assume metaparameter
|
|
329
|
+
|
|
330
|
+
identity_map[v] = rfc_template_vars[i].to_sym
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
identity_map
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
def query_based_selection?
|
|
337
|
+
template_url = current_resource.class.rest_api_document
|
|
338
|
+
|
|
339
|
+
# Will throw exception on presence of RFC 6570 templates
|
|
340
|
+
URI.parse(template_url)
|
|
341
|
+
true
|
|
342
|
+
rescue URI::InvalidURIError => _e
|
|
343
|
+
false
|
|
344
|
+
end
|
|
345
|
+
|
|
346
|
+
def path_based_selection?
|
|
347
|
+
!query_based_selection?
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
def api_connection
|
|
351
|
+
Chef.run_context.transport.connection
|
|
352
|
+
end
|
|
353
|
+
|
|
354
|
+
# Remove all empty keys (recusively) from Hash.
|
|
355
|
+
# @see https://stackoverflow.com/questions/56457020/#answer-56458673
|
|
356
|
+
def deep_compact!(hsh)
|
|
357
|
+
raise TypeError unless hsh.is_a? Hash
|
|
358
|
+
|
|
359
|
+
hsh.each do |_, v|
|
|
360
|
+
deep_compact!(v) if v.is_a? Hash
|
|
361
|
+
end.reject! { |_, v| v.nil? || (v.respond_to?(:empty?) && v.empty?) }
|
|
362
|
+
end
|
|
363
|
+
|
|
364
|
+
# Deep merge two hashes
|
|
365
|
+
# @see https://stackoverflow.com/questions/41109599#answer-41109737
|
|
366
|
+
def deep_merge!(hsh1, hsh2)
|
|
367
|
+
raise TypeError unless hsh1.is_a?(Hash) && hsh2.is_a?(Hash)
|
|
368
|
+
|
|
369
|
+
hsh1.merge!(hsh2) { |_, v1, v2| deep_merge!(v1, v2) }
|
|
370
|
+
end
|
|
371
|
+
|
|
372
|
+
# Create nested hashes from JMESPath syntax.
|
|
373
|
+
def bury(path, value)
|
|
374
|
+
raise TypeError unless path.is_a?(String)
|
|
375
|
+
|
|
376
|
+
arr = path.split(".")
|
|
377
|
+
ret = {}
|
|
378
|
+
|
|
379
|
+
if arr.count == 1
|
|
380
|
+
ret[arr.first] = value
|
|
381
|
+
|
|
382
|
+
ret
|
|
383
|
+
else
|
|
384
|
+
partial_path = arr[0..-2].join(".")
|
|
385
|
+
|
|
386
|
+
bury(partial_path, bury(arr.last, value))
|
|
387
|
+
end
|
|
388
|
+
end
|
|
389
|
+
end
|
|
@@ -21,7 +21,6 @@ require_relative "package"
|
|
|
21
21
|
class Chef
|
|
22
22
|
class Resource
|
|
23
23
|
class AptPackage < Chef::Resource::Package
|
|
24
|
-
unified_mode true
|
|
25
24
|
|
|
26
25
|
provides :apt_package, target_mode: true
|
|
27
26
|
provides :package, platform_family: "debian", target_mode: true
|
|
@@ -57,6 +56,8 @@ class Chef
|
|
|
57
56
|
|
|
58
57
|
description "Use the **apt_package** resource to manage packages on Debian, Ubuntu, and other platforms that use the APT package system."
|
|
59
58
|
|
|
59
|
+
allowed_actions :install, :upgrade, :remove, :purge, :reconfig, :lock, :unlock
|
|
60
|
+
|
|
60
61
|
property :default_release, String,
|
|
61
62
|
description: "The default release. For example: `stable`.",
|
|
62
63
|
desired_state: false
|
data/lib/chef/resource/bash.rb
CHANGED
data/lib/chef/resource/batch.rb
CHANGED
|
@@ -20,7 +20,6 @@ require "chef-utils/dist" unless defined?(ChefUtils::Dist)
|
|
|
20
20
|
class Chef
|
|
21
21
|
class Resource
|
|
22
22
|
class ChefClientConfig < Chef::Resource
|
|
23
|
-
unified_mode true
|
|
24
23
|
|
|
25
24
|
provides :chef_client_config
|
|
26
25
|
|
|
@@ -253,21 +252,20 @@ class Chef
|
|
|
253
252
|
description: "The data collector token to interact with the data collector server URL (Automate). Note: If possible, use Chef Infra Server to do all data collection reporting, as this removes the need to distribute tokens to individual nodes.",
|
|
254
253
|
introduced: "17.8"
|
|
255
254
|
|
|
256
|
-
action :create, description: "Create a client.rb config file for configuring #{ChefUtils::Dist::Infra::PRODUCT}." do
|
|
257
|
-
|
|
258
|
-
|
|
255
|
+
action :create, description: "Create a client.rb config file and folders for configuring #{ChefUtils::Dist::Infra::PRODUCT}." do
|
|
256
|
+
[
|
|
257
|
+
new_resource.config_directory,
|
|
258
|
+
(::File.dirname(new_resource.log_location) if new_resource.log_location.is_a?(String) && !%w{STDOUT STDERR}.include?(new_resource.log_location) && !new_resource.log_location.empty?),
|
|
259
|
+
new_resource.file_backup_path,
|
|
260
|
+
new_resource.file_cache_path,
|
|
261
|
+
::File.join(new_resource.config_directory, "client.d"),
|
|
262
|
+
(::File.dirname(new_resource.pid_file) unless new_resource.pid_file.nil?),
|
|
263
|
+
].compact.each do |dir_path|
|
|
264
|
+
|
|
265
|
+
directory dir_path do
|
|
259
266
|
user new_resource.user unless new_resource.user.nil?
|
|
260
267
|
group new_resource.group unless new_resource.group.nil?
|
|
261
|
-
mode "0750"
|
|
262
|
-
recursive true
|
|
263
|
-
end
|
|
264
|
-
end
|
|
265
|
-
|
|
266
|
-
unless ::Dir.exist?(::File.join(new_resource.config_directory, "client.d"))
|
|
267
|
-
directory ::File.join(new_resource.config_directory, "client.d") do
|
|
268
|
-
user new_resource.user unless new_resource.user.nil?
|
|
269
|
-
group new_resource.group unless new_resource.group.nil?
|
|
270
|
-
mode "0750"
|
|
268
|
+
mode dir_path == ::File.dirname(new_resource.log_location.to_s) ? "0755" : "0750"
|
|
271
269
|
recursive true
|
|
272
270
|
end
|
|
273
271
|
end
|
|
@@ -22,7 +22,6 @@ require "digest/md5" unless defined?(Digest::MD5)
|
|
|
22
22
|
class Chef
|
|
23
23
|
class Resource
|
|
24
24
|
class ChefClientCron < Chef::Resource
|
|
25
|
-
unified_mode true
|
|
26
25
|
|
|
27
26
|
provides :chef_client_cron
|
|
28
27
|
|
|
@@ -99,7 +98,7 @@ class Chef
|
|
|
99
98
|
property :splay, [Integer, String],
|
|
100
99
|
default: 300,
|
|
101
100
|
coerce: proc { |x| Integer(x) },
|
|
102
|
-
callbacks: { "should be a positive number" => proc { |v| v
|
|
101
|
+
callbacks: { "should be a positive number" => proc { |v| v >= 0 } },
|
|
103
102
|
description: "A random number of seconds between 0 and X to add to interval so that all #{ChefUtils::Dist::Infra::CLIENT} commands don't execute at the same time."
|
|
104
103
|
|
|
105
104
|
property :mailto, String,
|
|
@@ -19,7 +19,6 @@ require "chef-utils/dist" unless defined?(ChefUtils::Dist)
|
|
|
19
19
|
class Chef
|
|
20
20
|
class Resource
|
|
21
21
|
class ChefClientLaunchd < Chef::Resource
|
|
22
|
-
unified_mode true
|
|
23
22
|
|
|
24
23
|
provides :chef_client_launchd
|
|
25
24
|
|
|
@@ -61,7 +60,7 @@ class Chef
|
|
|
61
60
|
property :splay, [Integer, String],
|
|
62
61
|
default: 300,
|
|
63
62
|
coerce: proc { |x| Integer(x) },
|
|
64
|
-
callbacks: { "should be a positive number" => proc { |v| v
|
|
63
|
+
callbacks: { "should be a positive number" => proc { |v| v >= 0 } },
|
|
65
64
|
description: "A random number of seconds between 0 and X to add to interval so that all #{ChefUtils::Dist::Infra::CLIENT} commands don't execute at the same time."
|
|
66
65
|
|
|
67
66
|
property :accept_chef_license, [true, false],
|
|
@@ -135,6 +134,7 @@ class Chef
|
|
|
135
134
|
program_arguments ["/bin/bash",
|
|
136
135
|
"-c",
|
|
137
136
|
"echo; echo #{ChefUtils::Dist::Infra::PRODUCT} launchd daemon config has been updated. Manually unloading and reloading the daemon; echo Now unloading the daemon; sudo /bin/launchctl unload /Library/LaunchDaemons/com.#{ChefUtils::Dist::Infra::SHORT}.#{ChefUtils::Dist::Infra::CLIENT}.plist; sleep 2; echo Now loading the daemon; sudo /bin/launchctl load /Library/LaunchDaemons/com.#{ChefUtils::Dist::Infra::SHORT}.#{ChefUtils::Dist::Infra::CLIENT}.plist"]
|
|
137
|
+
run_at_load true
|
|
138
138
|
action :enable # enable creates the plist & triggers service restarts on change
|
|
139
139
|
end
|
|
140
140
|
|
|
@@ -20,7 +20,6 @@ require "chef-utils/dist" unless defined?(ChefUtils::Dist)
|
|
|
20
20
|
class Chef
|
|
21
21
|
class Resource
|
|
22
22
|
class ChefClientScheduledTask < Chef::Resource
|
|
23
|
-
unified_mode true
|
|
24
23
|
|
|
25
24
|
provides :chef_client_scheduled_task
|
|
26
25
|
|
|
@@ -108,7 +107,7 @@ class Chef
|
|
|
108
107
|
|
|
109
108
|
property :splay, [Integer, String],
|
|
110
109
|
coerce: proc { |x| Integer(x) },
|
|
111
|
-
callbacks: { "should be a positive number" => proc { |v| v
|
|
110
|
+
callbacks: { "should be a positive number" => proc { |v| v >= 0 } },
|
|
112
111
|
description: "A random number of seconds between 0 and X to add to interval so that all #{ChefUtils::Dist::Infra::CLIENT} commands don't execute at the same time.",
|
|
113
112
|
default: 300
|
|
114
113
|
|
|
@@ -123,7 +122,8 @@ class Chef
|
|
|
123
122
|
|
|
124
123
|
property :config_directory, String,
|
|
125
124
|
description: "The path of the config directory.",
|
|
126
|
-
default: ChefConfig::Config.etc_chef_dir
|
|
125
|
+
default: ChefConfig::Config.etc_chef_dir,
|
|
126
|
+
default_description: ChefConfig::Config.c_chef_dir
|
|
127
127
|
|
|
128
128
|
property :log_directory, String,
|
|
129
129
|
description: "The path of the directory to create the log file in.",
|
|
@@ -22,8 +22,6 @@ class Chef
|
|
|
22
22
|
class ChefSleep < Chef::Resource
|
|
23
23
|
provides :chef_sleep
|
|
24
24
|
|
|
25
|
-
unified_mode true
|
|
26
|
-
|
|
27
25
|
description "Use the **chef_sleep** resource to pause (sleep) for a number of seconds during a #{ChefUtils::Dist::Infra::PRODUCT} run. Only use this resource when a command or service exits successfully but is not ready for the next step in a recipe."
|
|
28
26
|
introduced "15.5"
|
|
29
27
|
examples <<~DOC
|
|
@@ -47,7 +45,7 @@ class Chef
|
|
|
47
45
|
service 'Service that is slow to start and reports as started' do
|
|
48
46
|
service_name 'my_database'
|
|
49
47
|
action :start
|
|
50
|
-
notifies :sleep, chef_sleep[
|
|
48
|
+
notifies :sleep, 'chef_sleep[wait for service start]'
|
|
51
49
|
end
|
|
52
50
|
|
|
53
51
|
chef_sleep 'wait for service start' do
|