chef 12.4.3-universal-mingw32 → 12.5.1-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/CONTRIBUTING.md +21 -25
- data/Gemfile +46 -0
- data/README.md +4 -4
- data/Rakefile +4 -110
- data/bin/chef-service-manager +3 -1
- data/distro/common/html/knife_cookbook_site.html +18 -18
- data/distro/common/man/man1/knife-cookbook-site.1 +11 -11
- data/lib/chef.rb +1 -1
- data/lib/chef/application.rb +1 -1
- data/lib/chef/application/apply.rb +19 -1
- data/lib/chef/application/client.rb +11 -5
- data/lib/chef/application/knife.rb +2 -2
- data/lib/chef/application/solo.rb +1 -1
- data/lib/chef/application/windows_service_manager.rb +19 -12
- data/lib/chef/chef_class.rb +46 -0
- data/lib/chef/chef_fs/config.rb +22 -24
- data/lib/chef/chef_fs/data_handler/client_data_handler.rb +3 -1
- data/lib/chef/chef_fs/file_pattern.rb +4 -15
- data/lib/chef/chef_fs/file_system/acl_dir.rb +3 -4
- data/lib/chef/chef_fs/file_system/acls_dir.rb +5 -1
- data/lib/chef/chef_fs/file_system/base_fs_dir.rb +0 -5
- data/lib/chef/chef_fs/file_system/base_fs_object.rb +5 -2
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_dir.rb +2 -9
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_entry.rb +2 -9
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbooks_dir.rb +10 -17
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +1 -12
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb +15 -11
- data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +8 -2
- data/lib/chef/chef_fs/file_system/cookbook_dir.rb +4 -4
- data/lib/chef/chef_fs/file_system/cookbooks_acl_dir.rb +1 -1
- data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +3 -11
- data/lib/chef/chef_fs/file_system/data_bags_dir.rb +3 -5
- data/lib/chef/chef_fs/file_system/environments_dir.rb +1 -1
- data/lib/chef/chef_fs/file_system/file_system_entry.rb +7 -4
- data/lib/chef/chef_fs/file_system/memory_dir.rb +2 -3
- data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +15 -0
- data/lib/chef/chef_fs/file_system/nodes_dir.rb +1 -1
- data/lib/chef/chef_fs/file_system/organization_members_entry.rb +2 -2
- data/lib/chef/chef_fs/file_system/rest_list_dir.rb +4 -9
- data/lib/chef/chef_fs/knife.rb +35 -7
- data/lib/chef/chef_fs/path_utils.rb +65 -34
- data/lib/chef/client.rb +2 -3
- data/lib/chef/config.rb +34 -2
- data/lib/chef/{mixin/wstring.rb → constants.rb} +9 -13
- data/lib/chef/cookbook/metadata.rb +25 -3
- data/lib/chef/cookbook/synchronizer.rb +1 -1
- data/lib/chef/cookbook_site_streaming_uploader.rb +1 -1
- data/lib/chef/cookbook_version.rb +3 -3
- data/lib/chef/delayed_evaluator.rb +21 -0
- data/lib/chef/deprecation/mixin/template.rb +1 -2
- data/lib/chef/deprecation/provider/cookbook_file.rb +1 -1
- data/lib/chef/deprecation/provider/file.rb +1 -1
- data/lib/chef/deprecation/provider/remote_directory.rb +52 -0
- data/lib/chef/deprecation/provider/remote_file.rb +1 -2
- data/lib/chef/deprecation/provider/template.rb +1 -1
- data/lib/chef/deprecation/warnings.rb +3 -4
- data/lib/chef/dsl/reboot_pending.rb +3 -2
- data/lib/chef/dsl/recipe.rb +26 -7
- data/lib/chef/dsl/resources.rb +2 -2
- data/lib/chef/event_dispatch/base.rb +51 -22
- data/lib/chef/event_dispatch/dispatcher.rb +21 -6
- data/lib/chef/event_dispatch/dsl.rb +64 -0
- data/lib/chef/exceptions.rb +28 -1
- data/lib/chef/file_content_management/tempfile.rb +1 -1
- data/lib/chef/formatters/base.rb +3 -0
- data/lib/chef/formatters/doc.rb +56 -6
- data/lib/chef/formatters/error_inspectors/compile_error_inspector.rb +36 -0
- data/lib/chef/formatters/minimal.rb +2 -2
- data/lib/chef/guard_interpreter/resource_guard_interpreter.rb +3 -1
- data/lib/chef/http/http_request.rb +1 -1
- data/lib/chef/knife.rb +35 -55
- data/lib/chef/knife/bootstrap.rb +41 -0
- data/lib/chef/knife/bootstrap/chef_vault_handler.rb +1 -0
- data/lib/chef/knife/bootstrap/client_builder.rb +16 -0
- data/lib/chef/knife/bootstrap/templates/README.md +3 -4
- data/lib/chef/knife/bootstrap/templates/chef-full.erb +1 -1
- data/lib/chef/knife/cookbook_create.rb +1 -1
- data/lib/chef/knife/cookbook_site_download.rb +1 -1
- data/lib/chef/knife/cookbook_site_install.rb +1 -1
- data/lib/chef/knife/cookbook_site_share.rb +6 -6
- data/lib/chef/knife/cookbook_site_unshare.rb +2 -2
- data/lib/chef/knife/core/bootstrap_context.rb +12 -4
- data/lib/chef/knife/core/custom_manifest_loader.rb +69 -0
- data/lib/chef/knife/core/gem_glob_loader.rb +138 -0
- data/lib/chef/knife/core/hashed_command_loader.rb +80 -0
- data/lib/chef/knife/core/node_presenter.rb +24 -1
- data/lib/chef/knife/core/object_loader.rb +1 -0
- data/lib/chef/knife/core/subcommand_loader.rb +131 -146
- data/lib/chef/knife/node_run_list_remove.rb +12 -1
- data/lib/chef/knife/null.rb +10 -0
- data/lib/chef/knife/rehash.rb +62 -0
- data/lib/chef/knife/search.rb +3 -3
- data/lib/chef/knife/ssh.rb +52 -30
- data/lib/chef/knife/ssl_check.rb +3 -2
- data/lib/chef/knife/user_edit.rb +1 -2
- data/lib/chef/local_mode.rb +5 -0
- data/lib/chef/log.rb +5 -1
- data/lib/chef/mixin/deprecation.rb +8 -8
- data/lib/chef/mixin/params_validate.rb +362 -135
- data/lib/chef/mixin/template.rb +48 -0
- data/lib/chef/mixin/which.rb +1 -1
- data/lib/chef/mixin/wide_string.rb +72 -0
- data/lib/chef/mixin/windows_architecture_helper.rb +15 -39
- data/lib/chef/mixin/windows_env_helper.rb +4 -1
- data/lib/chef/monkey_patches/webrick-utils.rb +51 -0
- data/lib/chef/monkey_patches/win32/registry.rb +72 -0
- data/lib/chef/node.rb +116 -3
- data/lib/chef/node_map.rb +2 -2
- data/lib/chef/platform/handler_map.rb +0 -5
- data/lib/chef/platform/provider_mapping.rb +5 -6
- data/lib/chef/platform/query_helpers.rb +46 -4
- data/lib/chef/platform/rebooter.rb +1 -1
- data/lib/chef/platform/service_helpers.rb +30 -32
- data/lib/chef/policy_builder.rb +1 -8
- data/lib/chef/policy_builder/dynamic.rb +186 -0
- data/lib/chef/policy_builder/expand_node_object.rb +30 -15
- data/lib/chef/policy_builder/policyfile.rb +155 -18
- data/lib/chef/property.rb +568 -0
- data/lib/chef/provider.rb +222 -13
- data/lib/chef/provider/batch.rb +8 -0
- data/lib/chef/provider/deploy.rb +5 -7
- data/lib/chef/provider/directory.rb +14 -2
- data/lib/chef/provider/dsc_resource.rb +5 -9
- data/lib/chef/provider/group/pw.rb +1 -1
- data/lib/chef/provider/ifconfig.rb +2 -2
- data/lib/chef/provider/lwrp_base.rb +1 -75
- data/lib/chef/provider/mount.rb +7 -3
- data/lib/chef/provider/package.rb +1 -1
- data/lib/chef/provider/package/dpkg.rb +5 -11
- data/lib/chef/provider/package/rpm.rb +2 -2
- data/lib/chef/provider/package/rubygems.rb +1 -1
- data/lib/chef/provider/package/windows/msi.rb +2 -2
- data/lib/chef/provider/package/yum.rb +17 -5
- data/lib/chef/provider/powershell_script.rb +59 -23
- data/lib/chef/provider/registry_key.rb +5 -5
- data/lib/chef/provider/remote_directory.rb +190 -102
- data/lib/chef/provider/service.rb +12 -2
- data/lib/chef/provider/service/aix.rb +1 -1
- data/lib/chef/provider/service/debian.rb +3 -5
- data/lib/chef/provider/service/freebsd.rb +1 -1
- data/lib/chef/provider/service/gentoo.rb +3 -3
- data/lib/chef/provider/service/init.rb +3 -3
- data/lib/chef/provider/service/insserv.rb +2 -4
- data/lib/chef/provider/service/invokercd.rb +2 -4
- data/lib/chef/provider/service/macosx.rb +5 -1
- data/lib/chef/provider/service/openbsd.rb +2 -1
- data/lib/chef/provider/service/redhat.rb +52 -16
- data/lib/chef/provider/service/simple.rb +2 -2
- data/lib/chef/provider/service/systemd.rb +3 -5
- data/lib/chef/provider/service/upstart.rb +4 -6
- data/lib/chef/provider/subversion.rb +13 -7
- data/lib/chef/provider/template/content.rb +16 -6
- data/lib/chef/provider/user/solaris.rb +32 -4
- data/lib/chef/provider/windows_script.rb +3 -5
- data/lib/chef/provider_resolver.rb +2 -2
- data/lib/chef/recipe.rb +1 -8
- data/lib/chef/resource.rb +563 -90
- data/lib/chef/resource/action_class.rb +83 -0
- data/lib/chef/resource/chef_gem.rb +3 -3
- data/lib/chef/resource/deploy.rb +8 -2
- data/lib/chef/resource/dsc_script.rb +2 -0
- data/lib/chef/resource/file/verification.rb +7 -1
- data/lib/chef/resource/lwrp_base.rb +1 -7
- data/lib/chef/resource/registry_key.rb +1 -1
- data/lib/chef/resource/service.rb +10 -2
- data/lib/chef/resource/subversion.rb +5 -0
- data/lib/chef/resource/windows_script.rb +6 -2
- data/lib/chef/resource/yum_package.rb +10 -1
- data/lib/chef/resource_resolver.rb +3 -3
- data/lib/chef/run_context.rb +402 -83
- data/lib/chef/run_list/versioned_recipe_list.rb +15 -0
- data/lib/chef/run_lock.rb +30 -21
- data/lib/chef/util/powershell/ps_credential.rb +4 -0
- data/lib/chef/util/windows.rb +0 -32
- data/lib/chef/util/windows/net_group.rb +85 -106
- data/lib/chef/util/windows/net_use.rb +35 -71
- data/lib/chef/util/windows/net_user.rb +0 -1
- data/lib/chef/util/windows/volume.rb +19 -19
- data/lib/chef/version.rb +3 -3
- data/lib/chef/win32/api.rb +1 -0
- data/lib/chef/win32/api/file.rb +20 -0
- data/lib/chef/win32/api/net.rb +163 -43
- data/lib/chef/win32/api/registry.rb +51 -0
- data/lib/chef/win32/api/system.rb +23 -0
- data/lib/chef/win32/api/unicode.rb +0 -43
- data/lib/chef/win32/crypto.rb +2 -1
- data/lib/chef/win32/file.rb +28 -3
- data/lib/chef/win32/mutex.rb +1 -2
- data/lib/chef/win32/net.rb +162 -8
- data/lib/chef/win32/process.rb +13 -0
- data/lib/chef/win32/registry.rb +35 -30
- data/lib/chef/win32/security.rb +1 -1
- data/lib/chef/win32/security/token.rb +1 -1
- data/lib/chef/win32/system.rb +62 -0
- data/lib/chef/win32/unicode.rb +7 -2
- data/lib/chef/win32/version.rb +0 -4
- data/lib/chef/workstation_config_loader.rb +3 -158
- data/spec/data/cookbooks/openldap/templates/default/helpers.erb +14 -0
- data/spec/data/cookbooks/openldap/templates/default/nested_openldap_partials.erb +1 -0
- data/spec/data/cookbooks/openldap/templates/default/nested_partial.erb +1 -0
- data/spec/data/dsc_lcm.pfx +0 -0
- data/spec/data/run_context/cookbooks/include/recipes/default.rb +24 -0
- data/spec/data/run_context/cookbooks/include/recipes/includee.rb +3 -0
- data/spec/functional/dsl/reboot_pending_spec.rb +33 -43
- data/spec/functional/knife/cookbook_delete_spec.rb +17 -7
- data/spec/functional/knife/ssh_spec.rb +16 -0
- data/spec/functional/rebooter_spec.rb +1 -1
- data/spec/functional/resource/deploy_revision_spec.rb +1 -1
- data/spec/functional/resource/dsc_resource_spec.rb +2 -0
- data/spec/functional/resource/dsc_script_spec.rb +91 -2
- data/spec/functional/resource/group_spec.rb +67 -44
- data/spec/functional/resource/{powershell_spec.rb → powershell_script_spec.rb} +107 -18
- data/spec/functional/resource/windows_service_spec.rb +1 -1
- data/spec/functional/run_lock_spec.rb +368 -189
- data/spec/functional/win32/{registry_helper_spec.rb → registry_spec.rb} +16 -23
- data/spec/functional/win32/service_manager_spec.rb +2 -2
- data/spec/integration/client/client_spec.rb +51 -0
- data/spec/integration/knife/chef_repo_path_spec.rb +13 -11
- data/spec/integration/knife/download_spec.rb +4 -0
- data/spec/integration/knife/list_spec.rb +8 -0
- data/spec/integration/knife/upload_spec.rb +1 -1
- data/spec/integration/recipes/recipe_dsl_spec.rb +1 -16
- data/spec/integration/recipes/remote_directory.rb +74 -0
- data/spec/integration/recipes/resource_action_spec.rb +363 -0
- data/spec/integration/recipes/resource_converge_if_changed_spec.rb +423 -0
- data/spec/integration/recipes/resource_load_spec.rb +206 -0
- data/spec/spec_helper.rb +9 -0
- data/spec/support/platform_helpers.rb +13 -0
- data/spec/support/shared/context/win32.rb +34 -0
- data/spec/support/shared/functional/win32_service.rb +2 -1
- data/spec/support/shared/functional/windows_script.rb +63 -26
- data/spec/support/shared/unit/mock_shellout.rb +46 -0
- data/spec/support/shared/unit/provider/file.rb +10 -4
- data/spec/unit/application/client_spec.rb +16 -3
- data/spec/unit/application/knife_spec.rb +2 -2
- data/spec/unit/application/solo_spec.rb +4 -3
- data/spec/unit/chef_class_spec.rb +23 -4
- data/spec/unit/chef_fs/path_util_spec.rb +108 -0
- data/spec/unit/client_spec.rb +6 -1
- data/spec/unit/config_spec.rb +31 -0
- data/spec/unit/cookbook/metadata_spec.rb +23 -3
- data/spec/unit/cookbook/syntax_check_spec.rb +3 -0
- data/spec/unit/deprecation_spec.rb +3 -6
- data/spec/unit/dsl/reboot_pending_spec.rb +12 -6
- data/spec/unit/event_dispatch/dispatcher_spec.rb +65 -3
- data/spec/unit/event_dispatch/dsl_spec.rb +83 -0
- data/spec/unit/formatters/doc_spec.rb +32 -0
- data/spec/unit/formatters/error_inspectors/compile_error_inspector_spec.rb +26 -0
- data/spec/unit/json_compat_spec.rb +4 -3
- data/spec/unit/knife/bootstrap/client_builder_spec.rb +27 -0
- data/spec/unit/knife/bootstrap_spec.rb +55 -3
- data/spec/unit/knife/cookbook_site_share_spec.rb +3 -3
- data/spec/unit/knife/core/bootstrap_context_spec.rb +21 -4
- data/spec/unit/knife/core/custom_manifest_loader_spec.rb +41 -0
- data/spec/unit/knife/core/gem_glob_loader_spec.rb +210 -0
- data/spec/unit/knife/core/hashed_command_loader_spec.rb +93 -0
- data/spec/unit/knife/core/subcommand_loader_spec.rb +16 -192
- data/spec/unit/knife/node_run_list_remove_spec.rb +17 -0
- data/spec/unit/knife/ssl_check_spec.rb +4 -0
- data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +10 -10
- data/spec/unit/mixin/params_validate_spec.rb +4 -2
- data/spec/unit/mixin/template_spec.rb +5 -1
- data/spec/unit/mixin/windows_architecture_helper_spec.rb +13 -8
- data/spec/unit/node_spec.rb +220 -0
- data/spec/unit/platform/query_helpers_spec.rb +146 -3
- data/spec/unit/policy_builder/dynamic_spec.rb +275 -0
- data/spec/unit/policy_builder/expand_node_object_spec.rb +37 -38
- data/spec/unit/policy_builder/policyfile_spec.rb +260 -46
- data/spec/unit/property/state_spec.rb +506 -0
- data/spec/unit/property/validation_spec.rb +663 -0
- data/spec/unit/property_spec.rb +1094 -0
- data/spec/unit/provider/deploy_spec.rb +5 -5
- data/spec/unit/provider/directory_spec.rb +35 -0
- data/spec/unit/provider/dsc_resource_spec.rb +3 -10
- data/spec/unit/provider/ifconfig_spec.rb +22 -2
- data/spec/unit/provider/mount/aix_spec.rb +2 -1
- data/spec/unit/provider/mount/mount_spec.rb +6 -0
- data/spec/unit/provider/mount/windows_spec.rb +14 -0
- data/spec/unit/provider/mount_spec.rb +12 -1
- data/spec/unit/provider/package/dpkg_spec.rb +8 -1
- data/spec/unit/provider/package/rpm_spec.rb +18 -1
- data/spec/unit/provider/package/rubygems_spec.rb +18 -0
- data/spec/unit/provider/package/yum_spec.rb +97 -24
- data/spec/unit/provider/powershell_script_spec.rb +106 -0
- data/spec/unit/provider/registry_key_spec.rb +12 -0
- data/spec/unit/provider/remote_directory_spec.rb +1 -2
- data/spec/unit/provider/service/aix_service_spec.rb +3 -3
- data/spec/unit/provider/service/gentoo_service_spec.rb +4 -4
- data/spec/unit/provider/service/macosx_spec.rb +4 -4
- data/spec/unit/provider/service/openbsd_service_spec.rb +10 -8
- data/spec/unit/provider/service/redhat_spec.rb +88 -8
- data/spec/unit/provider/service/upstart_service_spec.rb +11 -7
- data/spec/unit/provider/service/windows_spec.rb +211 -200
- data/spec/unit/provider/subversion_spec.rb +50 -31
- data/spec/unit/provider/template/content_spec.rb +93 -2
- data/spec/unit/provider/user/solaris_spec.rb +66 -9
- data/spec/unit/provider_resolver_spec.rb +707 -650
- data/spec/unit/provider_spec.rb +1 -3
- data/spec/unit/recipe_spec.rb +0 -4
- data/spec/unit/resource/deploy_spec.rb +7 -1
- data/spec/unit/resource/dsc_script_spec.rb +4 -0
- data/spec/unit/resource/file/verification_spec.rb +33 -5
- data/spec/unit/resource/{powershell_spec.rb → powershell_script_spec.rb} +17 -13
- data/spec/unit/resource/service_spec.rb +4 -4
- data/spec/unit/resource/subversion_spec.rb +4 -0
- data/spec/unit/resource/yum_package_spec.rb +10 -1
- data/spec/unit/resource_spec.rb +2 -2
- data/spec/unit/run_context/child_run_context_spec.rb +133 -0
- data/spec/unit/run_context_spec.rb +7 -0
- data/spec/unit/run_list/versioned_recipe_list_spec.rb +5 -0
- data/spec/unit/win32/registry_spec.rb +394 -0
- data/tasks/external_tests.rb +47 -23
- data/tasks/maintainers.rb +155 -14
- metadata +64 -53
- data/lib/chef/knife/bootstrap/templates/archlinux-gems.erb +0 -76
- data/lib/chef/knife/bootstrap/templates/chef-aix.erb +0 -72
- data/spec/unit/provider/powershell_spec.rb +0 -80
- data/spec/unit/registry_helper_spec.rb +0 -376
- data/spec/unit/workstation_config_loader_spec.rb +0 -283
data/lib/chef/mixin/template.rb
CHANGED
@@ -44,6 +44,52 @@ class Chef
|
|
44
44
|
|
45
45
|
attr_reader :_extension_modules
|
46
46
|
|
47
|
+
#
|
48
|
+
# Helpers for adding context of which resource is rendering the template (CHEF-5012)
|
49
|
+
#
|
50
|
+
|
51
|
+
# name of the cookbook containing the template resource, e.g.:
|
52
|
+
# test
|
53
|
+
#
|
54
|
+
# @return [String] cookbook name
|
55
|
+
attr_reader :cookbook_name
|
56
|
+
|
57
|
+
# name of the recipe containing the template resource, e.g.:
|
58
|
+
# default
|
59
|
+
#
|
60
|
+
# @return [String] recipe name
|
61
|
+
attr_reader :recipe_name
|
62
|
+
|
63
|
+
# string representation of the line in the recipe containing the template resource, e.g.:
|
64
|
+
# /Users/lamont/solo/cookbooks/test/recipes/default.rb:2:in `from_file'
|
65
|
+
#
|
66
|
+
# @return [String] recipe line
|
67
|
+
attr_reader :recipe_line_string
|
68
|
+
|
69
|
+
# path to the recipe containing the template resource, e.g.:
|
70
|
+
# /Users/lamont/solo/cookbooks/test/recipes/default.rb
|
71
|
+
#
|
72
|
+
# @return [String] recipe path
|
73
|
+
attr_reader :recipe_path
|
74
|
+
|
75
|
+
# line in the recipe containing the template reosurce, e.g.:
|
76
|
+
# 2
|
77
|
+
#
|
78
|
+
# @return [String] recipe line
|
79
|
+
attr_reader :recipe_line
|
80
|
+
|
81
|
+
# name of the template source itself, e.g.:
|
82
|
+
# foo.erb
|
83
|
+
#
|
84
|
+
# @return [String] template name
|
85
|
+
attr_reader :template_name
|
86
|
+
|
87
|
+
# path to the template source itself, e.g.:
|
88
|
+
# /Users/lamont/solo/cookbooks/test/templates/default/foo.erb
|
89
|
+
#
|
90
|
+
# @return [String] template path
|
91
|
+
attr_reader :template_path
|
92
|
+
|
47
93
|
def initialize(variables)
|
48
94
|
super
|
49
95
|
@_extension_modules = []
|
@@ -62,6 +108,7 @@ class Chef
|
|
62
108
|
"include a node variable if you plan to use it."
|
63
109
|
end
|
64
110
|
|
111
|
+
|
65
112
|
#
|
66
113
|
# Takes the name of the partial, plus a hash of options. Returns a
|
67
114
|
# string that contains the result of the evaluation of the partial.
|
@@ -89,6 +136,7 @@ class Chef
|
|
89
136
|
raise "You cannot render partials in this context" unless @template_finder
|
90
137
|
|
91
138
|
partial_variables = options.delete(:variables) || _public_instance_variables
|
139
|
+
partial_variables[:template_finder] = @template_finder
|
92
140
|
partial_context = self.class.new(partial_variables)
|
93
141
|
partial_context._extend_modules(@_extension_modules)
|
94
142
|
|
data/lib/chef/mixin/which.rb
CHANGED
@@ -28,7 +28,7 @@ class Chef
|
|
28
28
|
paths = ENV['PATH'].split(File::PATH_SEPARATOR) + extra_path
|
29
29
|
paths.each do |path|
|
30
30
|
filename = File.join(path, cmd)
|
31
|
-
return filename if File.executable?(filename)
|
31
|
+
return filename if File.executable?(Chef.path_to(filename))
|
32
32
|
end
|
33
33
|
false
|
34
34
|
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Jay Mundrawala(<jdm@chef.io>)
|
3
|
+
# Copyright:: Copyright 2015 Chef Software
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
class Chef
|
20
|
+
module Mixin
|
21
|
+
module WideString
|
22
|
+
|
23
|
+
def wstring(str)
|
24
|
+
if str.nil? || str.encoding == Encoding::UTF_16LE
|
25
|
+
str
|
26
|
+
else
|
27
|
+
utf8_to_wide(str)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def utf8_to_wide(ustring)
|
32
|
+
# ensure it is actually UTF-8
|
33
|
+
# Ruby likes to mark binary data as ASCII-8BIT
|
34
|
+
ustring = (ustring + "").force_encoding('UTF-8') if ustring.respond_to?(:force_encoding) && ustring.encoding.name != "UTF-8"
|
35
|
+
|
36
|
+
# ensure we have the double-null termination Windows Wide likes
|
37
|
+
ustring = ustring + "\000\000" if ustring.length == 0 or ustring[-1].chr != "\000"
|
38
|
+
|
39
|
+
# encode it all as UTF-16LE AKA Windows Wide Character AKA Windows Unicode
|
40
|
+
ustring = begin
|
41
|
+
if ustring.respond_to?(:encode)
|
42
|
+
ustring.encode('UTF-16LE')
|
43
|
+
else
|
44
|
+
require 'iconv'
|
45
|
+
Iconv.conv("UTF-16LE", "UTF-8", ustring)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
ustring
|
49
|
+
end
|
50
|
+
|
51
|
+
def wide_to_utf8(wstring)
|
52
|
+
# ensure it is actually UTF-16LE
|
53
|
+
# Ruby likes to mark binary data as ASCII-8BIT
|
54
|
+
wstring = wstring.force_encoding('UTF-16LE') if wstring.respond_to?(:force_encoding)
|
55
|
+
|
56
|
+
# encode it all as UTF-8
|
57
|
+
wstring = begin
|
58
|
+
if wstring.respond_to?(:encode)
|
59
|
+
wstring.encode('UTF-8')
|
60
|
+
else
|
61
|
+
require 'iconv'
|
62
|
+
Iconv.conv("UTF-8", "UTF-16LE", wstring)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
# remove trailing CRLF and NULL characters
|
66
|
+
wstring.strip!
|
67
|
+
wstring
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -19,19 +19,13 @@
|
|
19
19
|
|
20
20
|
require 'chef/exceptions'
|
21
21
|
require 'chef/platform/query_helpers'
|
22
|
-
require 'win32/
|
23
|
-
require 'chef/win32/
|
24
|
-
require 'chef/win32/api/error' if Chef::Platform.windows?
|
22
|
+
require 'chef/win32/process' if Chef::Platform.windows?
|
23
|
+
require 'chef/win32/system' if Chef::Platform.windows?
|
25
24
|
|
26
25
|
class Chef
|
27
26
|
module Mixin
|
28
27
|
module WindowsArchitectureHelper
|
29
28
|
|
30
|
-
if Chef::Platform.windows?
|
31
|
-
include Chef::ReservedNames::Win32::API::Process
|
32
|
-
include Chef::ReservedNames::Win32::API::Error
|
33
|
-
end
|
34
|
-
|
35
29
|
def node_windows_architecture(node)
|
36
30
|
node[:kernel][:machine].to_sym
|
37
31
|
end
|
@@ -42,6 +36,16 @@ class Chef
|
|
42
36
|
is_i386_process_on_x86_64_windows?
|
43
37
|
end
|
44
38
|
|
39
|
+
def forced_32bit_override_required?(node, desired_architecture)
|
40
|
+
desired_architecture == :i386 &&
|
41
|
+
node_windows_architecture(node) == :x86_64 &&
|
42
|
+
!is_i386_process_on_x86_64_windows?
|
43
|
+
end
|
44
|
+
|
45
|
+
def wow64_directory
|
46
|
+
Chef::ReservedNames::Win32::System.get_system_wow64_directory
|
47
|
+
end
|
48
|
+
|
45
49
|
def with_os_architecture(node, architecture: nil)
|
46
50
|
node ||= begin
|
47
51
|
os_arch = ENV['PROCESSOR_ARCHITEW6432'] ||
|
@@ -88,49 +92,21 @@ class Chef
|
|
88
92
|
|
89
93
|
def is_i386_process_on_x86_64_windows?
|
90
94
|
if Chef::Platform.windows?
|
91
|
-
|
92
|
-
|
93
|
-
# The return value of IsWow64Process is nonzero value if the API call succeeds.
|
94
|
-
# The result data are returned in the last parameter, not the return value.
|
95
|
-
call_succeeded = IsWow64Process(GetCurrentProcess(), is_64_bit_process_result)
|
96
|
-
|
97
|
-
# The result is nonzero if IsWow64Process's calling process, in the case here
|
98
|
-
# this process, is running under WOW64, i.e. the result is nonzero if this
|
99
|
-
# process is 32-bit (aka :i386).
|
100
|
-
result = (call_succeeded != 0) && (is_64_bit_process_result.get_int(0) != 0)
|
95
|
+
Chef::ReservedNames::Win32::Process.is_wow64_process
|
101
96
|
else
|
102
97
|
false
|
103
98
|
end
|
104
99
|
end
|
105
100
|
|
106
101
|
def disable_wow64_file_redirection( node )
|
107
|
-
original_redirection_state = ['0'].pack('P')
|
108
|
-
|
109
102
|
if ( ( node_windows_architecture(node) == :x86_64) && ::Chef::Platform.windows?)
|
110
|
-
|
111
|
-
::Win32::API.new('Wow64DisableWow64FsRedirection', 'P', 'L', 'kernel32')
|
112
|
-
|
113
|
-
succeeded = win32_wow_64_disable_wow_64_fs_redirection.call(original_redirection_state)
|
114
|
-
|
115
|
-
if succeeded == 0
|
116
|
-
raise Win32APIError "Failed to disable Wow64 file redirection"
|
117
|
-
end
|
118
|
-
|
103
|
+
Chef::ReservedNames::Win32::System.wow64_disable_wow64_fs_redirection
|
119
104
|
end
|
120
|
-
|
121
|
-
original_redirection_state
|
122
105
|
end
|
123
106
|
|
124
107
|
def restore_wow64_file_redirection( node, original_redirection_state )
|
125
108
|
if ( (node_windows_architecture(node) == :x86_64) && ::Chef::Platform.windows?)
|
126
|
-
|
127
|
-
::Win32::API.new('Wow64RevertWow64FsRedirection', 'P', 'L', 'kernel32')
|
128
|
-
|
129
|
-
succeeded = win32_wow_64_revert_wow_64_fs_redirection.call(original_redirection_state)
|
130
|
-
|
131
|
-
if succeeded == 0
|
132
|
-
raise Win32APIError "Failed to revert Wow64 file redirection"
|
133
|
-
end
|
109
|
+
Chef::ReservedNames::Win32::System.wow64_revert_wow64_fs_redirection(original_redirection_state)
|
134
110
|
end
|
135
111
|
end
|
136
112
|
|
@@ -18,6 +18,7 @@
|
|
18
18
|
|
19
19
|
|
20
20
|
require 'chef/exceptions'
|
21
|
+
require 'chef/mixin/wide_string'
|
21
22
|
require 'chef/platform/query_helpers'
|
22
23
|
require 'chef/win32/error' if Chef::Platform.windows?
|
23
24
|
require 'chef/win32/api/system' if Chef::Platform.windows?
|
@@ -26,6 +27,8 @@ require 'chef/win32/api/unicode' if Chef::Platform.windows?
|
|
26
27
|
class Chef
|
27
28
|
module Mixin
|
28
29
|
module WindowsEnvHelper
|
30
|
+
include Chef::Mixin::WideString
|
31
|
+
|
29
32
|
if Chef::Platform.windows?
|
30
33
|
include Chef::ReservedNames::Win32::API::System
|
31
34
|
end
|
@@ -45,7 +48,7 @@ class Chef
|
|
45
48
|
Chef::ReservedNames::Win32::Error.raise!
|
46
49
|
end
|
47
50
|
if ( SendMessageTimeoutW(HWND_BROADCAST, WM_SETTINGCHANGE, 0, FFI::MemoryPointer.from_string(
|
48
|
-
|
51
|
+
utf8_to_wide('Environment')
|
49
52
|
).address, flags, 5000, nil) == 0 )
|
50
53
|
Chef::ReservedNames::Win32::Error.raise!
|
51
54
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'webrick/utils'
|
2
|
+
|
3
|
+
module WEBrick
|
4
|
+
module Utils
|
5
|
+
##
|
6
|
+
# Creates TCP server sockets bound to +address+:+port+ and returns them.
|
7
|
+
#
|
8
|
+
# It will create IPV4 and IPV6 sockets on all interfaces.
|
9
|
+
#
|
10
|
+
# NOTE: We need to monkey patch this method because
|
11
|
+
# create_listeners on Windows with Ruby > 2.0.0 does not
|
12
|
+
# raise an error if we're already listening on a port.
|
13
|
+
#
|
14
|
+
def create_listeners(address, port, logger=nil)
|
15
|
+
#
|
16
|
+
# utils.rb -- Miscellaneous utilities
|
17
|
+
#
|
18
|
+
# Author: IPR -- Internet Programming with Ruby -- writers
|
19
|
+
# Copyright (c) 2001 TAKAHASHI Masayoshi, GOTOU Yuuzou
|
20
|
+
# Copyright (c) 2002 Internet Programming with Ruby writers. All rights
|
21
|
+
# reserved.
|
22
|
+
#
|
23
|
+
# $IPR: utils.rb,v 1.10 2003/02/16 22:22:54 gotoyuzo Exp $
|
24
|
+
unless port
|
25
|
+
raise ArgumentError, "must specify port"
|
26
|
+
end
|
27
|
+
res = Socket::getaddrinfo(address, port,
|
28
|
+
Socket::AF_UNSPEC, # address family
|
29
|
+
Socket::SOCK_STREAM, # socket type
|
30
|
+
0, # protocol
|
31
|
+
Socket::AI_PASSIVE) # flag
|
32
|
+
last_error = nil
|
33
|
+
sockets = []
|
34
|
+
res.each{|ai|
|
35
|
+
begin
|
36
|
+
logger.debug("TCPServer.new(#{ai[3]}, #{port})") if logger
|
37
|
+
sock = TCPServer.new(ai[3], port)
|
38
|
+
port = sock.addr[1] if port == 0
|
39
|
+
Utils::set_close_on_exec(sock)
|
40
|
+
sockets << sock
|
41
|
+
rescue => ex
|
42
|
+
logger.warn("TCPServer Error: #{ex}") if logger
|
43
|
+
last_error = ex
|
44
|
+
end
|
45
|
+
}
|
46
|
+
raise last_error if sockets.empty?
|
47
|
+
return sockets
|
48
|
+
end
|
49
|
+
module_function :create_listeners
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
#
|
2
|
+
# Copyright:: Copyright 2015 Chef Software, 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 'chef/win32/api/registry'
|
19
|
+
require 'chef/win32/unicode'
|
20
|
+
require 'win32/registry'
|
21
|
+
|
22
|
+
module Win32
|
23
|
+
class Registry
|
24
|
+
|
25
|
+
module API
|
26
|
+
|
27
|
+
extend Chef::ReservedNames::Win32::API::Registry
|
28
|
+
|
29
|
+
module_function
|
30
|
+
|
31
|
+
if RUBY_VERSION =~ /^2\.1/
|
32
|
+
# ::Win32::Registry#delete_value is broken in Ruby 2.1 (up to Ruby 2.1.6).
|
33
|
+
# This should be resolved in a later release (see note #9 in link below).
|
34
|
+
# https://bugs.ruby-lang.org/issues/10820
|
35
|
+
def DeleteValue(hkey, name)
|
36
|
+
check RegDeleteValueW(hkey, name.to_wstring)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# ::Win32::Registry#delete_key uses RegDeleteKeyW. We need to use
|
41
|
+
# RegDeleteKeyExW to properly support WOW64 systems.
|
42
|
+
def DeleteKey(hkey, name)
|
43
|
+
check RegDeleteKeyExW(hkey, name.to_wstring, 0, 0)
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
if RUBY_VERSION =~ /^2.1/
|
49
|
+
# ::Win32::Registry#write does not correctly handle data in Ruby 2.1 (up to Ruby 2.1.6).
|
50
|
+
# https://bugs.ruby-lang.org/issues/11439
|
51
|
+
def write(name, type, data)
|
52
|
+
case type
|
53
|
+
when REG_SZ, REG_EXPAND_SZ
|
54
|
+
data = data.to_s.encode(WCHAR) + WCHAR_NUL
|
55
|
+
when REG_MULTI_SZ
|
56
|
+
data = data.to_a.map {|s| s.encode(WCHAR)}.join(WCHAR_NUL) << WCHAR_NUL << WCHAR_NUL
|
57
|
+
when REG_BINARY
|
58
|
+
data = data.to_s
|
59
|
+
when REG_DWORD
|
60
|
+
data = API.packdw(data.to_i)
|
61
|
+
when REG_DWORD_BIG_ENDIAN
|
62
|
+
data = [data.to_i].pack('N')
|
63
|
+
when REG_QWORD
|
64
|
+
data = API.packqw(data.to_i)
|
65
|
+
else
|
66
|
+
raise TypeError, "Unsupported type #{type}"
|
67
|
+
end
|
68
|
+
API.SetValue(@hkey, name, type, data, data.bytesize)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
data/lib/chef/node.rb
CHANGED
@@ -63,6 +63,8 @@ class Chef
|
|
63
63
|
|
64
64
|
include Chef::Mixin::ParamsValidate
|
65
65
|
|
66
|
+
NULL_ARG = Object.new
|
67
|
+
|
66
68
|
# Create a new Chef::Node object.
|
67
69
|
def initialize(chef_server_rest: nil)
|
68
70
|
@chef_server_rest = chef_server_rest
|
@@ -72,6 +74,9 @@ class Chef
|
|
72
74
|
@primary_runlist = Chef::RunList.new
|
73
75
|
@override_runlist = Chef::RunList.new
|
74
76
|
|
77
|
+
@policy_name = nil
|
78
|
+
@policy_group = nil
|
79
|
+
|
75
80
|
@attributes = Chef::Node::Attribute.new({}, {}, {}, {})
|
76
81
|
|
77
82
|
@run_state = {}
|
@@ -132,6 +137,50 @@ class Chef
|
|
132
137
|
|
133
138
|
alias :environment :chef_environment
|
134
139
|
|
140
|
+
# The `policy_name` for this node. Setting this to a non-nil value will
|
141
|
+
# enable policyfile mode when `chef-client` is run. If set in the config
|
142
|
+
# file or in node json, running `chef-client` will update this value.
|
143
|
+
#
|
144
|
+
# @see Chef::PolicyBuilder::Dynamic
|
145
|
+
# @see Chef::PolicyBuilder::Policyfile
|
146
|
+
#
|
147
|
+
# @param arg [String] the new policy_name value
|
148
|
+
# @return [String] the current policy_name, or the one you just set
|
149
|
+
def policy_name(arg=NULL_ARG)
|
150
|
+
return @policy_name if arg.equal?(NULL_ARG)
|
151
|
+
validate({policy_name: arg}, { policy_name: { kind_of: [ String, NilClass ], regex: /^[\-:.[:alnum:]_]+$/ } })
|
152
|
+
@policy_name = arg
|
153
|
+
end
|
154
|
+
|
155
|
+
# A "non-DSL-style" setter for `policy_name`
|
156
|
+
#
|
157
|
+
# @see #policy_name
|
158
|
+
def policy_name=(policy_name)
|
159
|
+
policy_name(policy_name)
|
160
|
+
end
|
161
|
+
|
162
|
+
# The `policy_group` for this node. Setting this to a non-nil value will
|
163
|
+
# enable policyfile mode when `chef-client` is run. If set in the config
|
164
|
+
# file or in node json, running `chef-client` will update this value.
|
165
|
+
#
|
166
|
+
# @see Chef::PolicyBuilder::Dynamic
|
167
|
+
# @see Chef::PolicyBuilder::Policyfile
|
168
|
+
#
|
169
|
+
# @param arg [String] the new policy_group value
|
170
|
+
# @return [String] the current policy_group, or the one you just set
|
171
|
+
def policy_group(arg=NULL_ARG)
|
172
|
+
return @policy_group if arg.equal?(NULL_ARG)
|
173
|
+
validate({policy_group: arg}, { policy_group: { kind_of: [ String, NilClass ], regex: /^[\-:.[:alnum:]_]+$/ } })
|
174
|
+
@policy_group = arg
|
175
|
+
end
|
176
|
+
|
177
|
+
# A "non-DSL-style" setter for `policy_group`
|
178
|
+
#
|
179
|
+
# @see #policy_group
|
180
|
+
def policy_group=(policy_group)
|
181
|
+
policy_group(policy_group)
|
182
|
+
end
|
183
|
+
|
135
184
|
def attributes
|
136
185
|
@attributes
|
137
186
|
end
|
@@ -315,6 +364,7 @@ class Chef
|
|
315
364
|
# Consumes the combined run_list and other attributes in +attrs+
|
316
365
|
def consume_attributes(attrs)
|
317
366
|
normal_attrs_to_merge = consume_run_list(attrs)
|
367
|
+
normal_attrs_to_merge = consume_chef_environment(normal_attrs_to_merge)
|
318
368
|
Chef::Log.debug("Applying attributes from json file")
|
319
369
|
self.normal_attrs = Chef::Mixin::DeepMerge.merge(normal_attrs,normal_attrs_to_merge)
|
320
370
|
self.tags # make sure they're defined
|
@@ -347,6 +397,24 @@ class Chef
|
|
347
397
|
attrs
|
348
398
|
end
|
349
399
|
|
400
|
+
# chef_environment when set in -j JSON will take precedence over
|
401
|
+
# -E ENVIRONMENT. Ideally, IMO, the order of precedence should be (lowest to
|
402
|
+
# highest):
|
403
|
+
# config_file
|
404
|
+
# -j JSON
|
405
|
+
# -E ENVIRONMENT
|
406
|
+
# so that users could reuse their JSON and override the chef_environment
|
407
|
+
# configured within it with -E ENVIRONMENT. Because command line options are
|
408
|
+
# merged with Chef::Config there is currently no way to distinguish between
|
409
|
+
# an environment set via config from an environment set via command line.
|
410
|
+
def consume_chef_environment(attrs)
|
411
|
+
attrs = attrs ? attrs.dup : {}
|
412
|
+
if env = attrs.delete("chef_environment")
|
413
|
+
chef_environment(env)
|
414
|
+
end
|
415
|
+
attrs
|
416
|
+
end
|
417
|
+
|
350
418
|
# Clear defaults and overrides, so that any deleted attributes
|
351
419
|
# between runs are still gone.
|
352
420
|
def reset_defaults_and_overrides
|
@@ -372,7 +440,7 @@ class Chef
|
|
372
440
|
|
373
441
|
self.tags # make sure they're defined
|
374
442
|
|
375
|
-
automatic_attrs[:recipes] = expansion.recipes.
|
443
|
+
automatic_attrs[:recipes] = expansion.recipes.with_duplicate_names
|
376
444
|
automatic_attrs[:expanded_run_list] = expansion.recipes.with_fully_qualified_names_and_version_constraints
|
377
445
|
automatic_attrs[:roles] = expansion.roles
|
378
446
|
|
@@ -442,6 +510,14 @@ class Chef
|
|
442
510
|
#Render correctly for run_list items so malformed json does not result
|
443
511
|
"run_list" => @primary_runlist.run_list.map { |item| item.to_s }
|
444
512
|
}
|
513
|
+
# Chef Server rejects node JSON with extra keys; prior to 12.3,
|
514
|
+
# "policy_name" and "policy_group" are unknown; after 12.3 they are
|
515
|
+
# optional, therefore only including them in the JSON if present
|
516
|
+
# maximizes compatibility for most people.
|
517
|
+
unless policy_group.nil? && policy_name.nil?
|
518
|
+
result["policy_name"] = policy_name
|
519
|
+
result["policy_group"] = policy_group
|
520
|
+
end
|
445
521
|
result
|
446
522
|
end
|
447
523
|
|
@@ -473,6 +549,10 @@ class Chef
|
|
473
549
|
else
|
474
550
|
o["recipes"].each { |r| node.recipes << r }
|
475
551
|
end
|
552
|
+
|
553
|
+
node.policy_name = o["policy_name"] if o.has_key?("policy_name")
|
554
|
+
node.policy_group = o["policy_group"] if o.has_key?("policy_group")
|
555
|
+
|
476
556
|
node
|
477
557
|
end
|
478
558
|
|
@@ -534,8 +614,16 @@ class Chef
|
|
534
614
|
chef_server_rest.put_rest("nodes/#{name}", data_for_save)
|
535
615
|
end
|
536
616
|
rescue Net::HTTPServerException => e
|
537
|
-
|
538
|
-
|
617
|
+
if e.response.code == "404"
|
618
|
+
chef_server_rest.post_rest("nodes", data_for_save)
|
619
|
+
# Chef Server before 12.3 rejects node JSON with 'policy_name' or
|
620
|
+
# 'policy_group' keys, but 'policy_name' will be detected first.
|
621
|
+
# Backcompat can be removed in 13.0
|
622
|
+
elsif e.response.code == "400" && e.response.body.include?("Invalid key policy_name")
|
623
|
+
save_without_policyfile_attrs
|
624
|
+
else
|
625
|
+
raise
|
626
|
+
end
|
539
627
|
end
|
540
628
|
self
|
541
629
|
end
|
@@ -544,6 +632,15 @@ class Chef
|
|
544
632
|
def create
|
545
633
|
chef_server_rest.post_rest("nodes", data_for_save)
|
546
634
|
self
|
635
|
+
rescue Net::HTTPServerException => e
|
636
|
+
# Chef Server before 12.3 rejects node JSON with 'policy_name' or
|
637
|
+
# 'policy_group' keys, but 'policy_name' will be detected first.
|
638
|
+
# Backcompat can be removed in 13.0
|
639
|
+
if e.response.code == "400" && e.response.body.include?("Invalid key policy_name")
|
640
|
+
chef_server_rest.post_rest("nodes", data_for_save_without_policyfile_attrs)
|
641
|
+
else
|
642
|
+
raise
|
643
|
+
end
|
547
644
|
end
|
548
645
|
|
549
646
|
def to_s
|
@@ -556,6 +653,22 @@ class Chef
|
|
556
653
|
|
557
654
|
private
|
558
655
|
|
656
|
+
def save_without_policyfile_attrs
|
657
|
+
trimmed_data = data_for_save_without_policyfile_attrs
|
658
|
+
|
659
|
+
chef_server_rest.put_rest("nodes/#{name}", trimmed_data)
|
660
|
+
rescue Net::HTTPServerException => e
|
661
|
+
raise e unless e.response.code == "404"
|
662
|
+
chef_server_rest.post_rest("nodes", trimmed_data)
|
663
|
+
end
|
664
|
+
|
665
|
+
def data_for_save_without_policyfile_attrs
|
666
|
+
data_for_save.tap do |trimmed_data|
|
667
|
+
trimmed_data.delete("policy_name")
|
668
|
+
trimmed_data.delete("policy_group")
|
669
|
+
end
|
670
|
+
end
|
671
|
+
|
559
672
|
def data_for_save
|
560
673
|
data = for_json
|
561
674
|
["automatic", "default", "normal", "override"].each do |level|
|