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
@@ -49,7 +49,7 @@ class Chef
|
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
-
raise Chef::Exceptions::FileContentStagingError
|
52
|
+
raise Chef::Exceptions::FileContentStagingError, errors if tf.nil?
|
53
53
|
|
54
54
|
# We always process the tempfile in binmode so that we
|
55
55
|
# preserve the line endings of the content.
|
data/lib/chef/formatters/base.rb
CHANGED
data/lib/chef/formatters/doc.rb
CHANGED
@@ -22,18 +22,31 @@ class Chef
|
|
22
22
|
@failed_audits = 0
|
23
23
|
@start_time = Time.now
|
24
24
|
@end_time = @start_time
|
25
|
+
@skipped_resources = 0
|
25
26
|
end
|
26
27
|
|
27
28
|
def elapsed_time
|
28
29
|
end_time - start_time
|
29
30
|
end
|
30
31
|
|
32
|
+
def pretty_elapsed_time
|
33
|
+
time = elapsed_time
|
34
|
+
if time < 60 then
|
35
|
+
message = Time.at(time).utc.strftime("%S seconds")
|
36
|
+
elsif time < 3600 then
|
37
|
+
message = Time.at(time).utc.strftime("%M minutes %S seconds")
|
38
|
+
else
|
39
|
+
message = Time.at(time).utc.strftime("%H hours %M minutes %S seconds")
|
40
|
+
end
|
41
|
+
message
|
42
|
+
end
|
43
|
+
|
31
44
|
def run_start(version)
|
32
45
|
puts_line "Starting Chef Client, version #{version}"
|
33
46
|
end
|
34
47
|
|
35
48
|
def total_resources
|
36
|
-
@up_to_date_resources + @updated_resources
|
49
|
+
@up_to_date_resources + @updated_resources + @skipped_resources
|
37
50
|
end
|
38
51
|
|
39
52
|
def total_audits
|
@@ -42,10 +55,30 @@ class Chef
|
|
42
55
|
|
43
56
|
def run_completed(node)
|
44
57
|
@end_time = Time.now
|
58
|
+
# Print out deprecations.
|
59
|
+
if !deprecations.empty?
|
60
|
+
puts_line ""
|
61
|
+
puts_line "Deprecated features used!"
|
62
|
+
deprecations.each do |message, locations|
|
63
|
+
if locations.size == 1
|
64
|
+
puts_line " #{message} at #{locations.size} location:"
|
65
|
+
else
|
66
|
+
puts_line " #{message} at #{locations.size} locations:"
|
67
|
+
end
|
68
|
+
locations.each do |location|
|
69
|
+
prefix = " - "
|
70
|
+
Array(location).each do |line|
|
71
|
+
puts_line "#{prefix}#{line}"
|
72
|
+
prefix = " "
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
puts_line ""
|
77
|
+
end
|
45
78
|
if Chef::Config[:why_run]
|
46
79
|
puts_line "Chef Client finished, #{@updated_resources}/#{total_resources} resources would have been updated"
|
47
80
|
else
|
48
|
-
puts_line "Chef Client finished, #{@updated_resources}/#{total_resources} resources updated in #{
|
81
|
+
puts_line "Chef Client finished, #{@updated_resources}/#{total_resources} resources updated in #{pretty_elapsed_time}"
|
49
82
|
if total_audits > 0
|
50
83
|
puts_line " #{successful_audits}/#{total_audits} controls succeeded"
|
51
84
|
end
|
@@ -57,7 +90,7 @@ class Chef
|
|
57
90
|
if Chef::Config[:why_run]
|
58
91
|
puts_line "Chef Client failed. #{@updated_resources} resources would have been updated"
|
59
92
|
else
|
60
|
-
puts_line "Chef Client failed. #{@updated_resources} resources updated in #{
|
93
|
+
puts_line "Chef Client failed. #{@updated_resources} resources updated in #{pretty_elapsed_time}"
|
61
94
|
if total_audits > 0
|
62
95
|
puts_line " #{successful_audits} controls succeeded"
|
63
96
|
end
|
@@ -132,9 +165,9 @@ class Chef
|
|
132
165
|
indent
|
133
166
|
end
|
134
167
|
|
135
|
-
# Called when cookbook +
|
136
|
-
def synchronized_cookbook(cookbook_name)
|
137
|
-
puts_line "- #{
|
168
|
+
# Called when cookbook +cookbook+ has been sync'd
|
169
|
+
def synchronized_cookbook(cookbook_name, cookbook)
|
170
|
+
puts_line "- #{cookbook.name} (#{cookbook.version})"
|
138
171
|
end
|
139
172
|
|
140
173
|
# Called when an individual file in a cookbook has been updated
|
@@ -236,6 +269,7 @@ class Chef
|
|
236
269
|
|
237
270
|
# Called when a resource action has been skipped b/c of a conditional
|
238
271
|
def resource_skipped(resource, action, conditional)
|
272
|
+
@skipped_resources += 1
|
239
273
|
# TODO: more info about conditional
|
240
274
|
puts " (skipped due to #{conditional.short_description})", :stream => resource
|
241
275
|
unindent
|
@@ -334,6 +368,16 @@ class Chef
|
|
334
368
|
end
|
335
369
|
end
|
336
370
|
|
371
|
+
def deprecation(message, location=caller(2..2)[0])
|
372
|
+
if Chef::Config[:treat_deprecation_warnings_as_errors]
|
373
|
+
super
|
374
|
+
end
|
375
|
+
|
376
|
+
# Save deprecations to the screen until the end
|
377
|
+
deprecations[message] ||= Set.new
|
378
|
+
deprecations[message] << location
|
379
|
+
end
|
380
|
+
|
337
381
|
def indent
|
338
382
|
indent_by(2)
|
339
383
|
end
|
@@ -341,6 +385,12 @@ class Chef
|
|
341
385
|
def unindent
|
342
386
|
indent_by(-2)
|
343
387
|
end
|
388
|
+
|
389
|
+
protected
|
390
|
+
|
391
|
+
def deprecations
|
392
|
+
@deprecations ||= {}
|
393
|
+
end
|
344
394
|
end
|
345
395
|
end
|
346
396
|
end
|
@@ -44,6 +44,38 @@ class Chef
|
|
44
44
|
error_description.section("Cookbook Trace:", traceback)
|
45
45
|
error_description.section("Relevant File Content:", context)
|
46
46
|
end
|
47
|
+
|
48
|
+
if exception_message_modifying_frozen?
|
49
|
+
msg = <<-MESSAGE
|
50
|
+
Ruby objects are often frozen to prevent further modifications
|
51
|
+
when they would negatively impact the process (e.g. values inside
|
52
|
+
Ruby's ENV class) or to prevent polluting other objects when default
|
53
|
+
values are passed by reference to many instances of an object (e.g.
|
54
|
+
the empty Array as a Chef resource default, passed by reference
|
55
|
+
to every instance of the resource).
|
56
|
+
|
57
|
+
Chef uses Object#freeze to ensure the default values of properties
|
58
|
+
inside Chef resources are not modified, so that when a new instance
|
59
|
+
of a Chef resource is created, and Object#dup copies values by
|
60
|
+
reference, the new resource is not receiving a default value that
|
61
|
+
has been by a previous instance of that resource.
|
62
|
+
|
63
|
+
Instead of modifying an object that contains a default value for all
|
64
|
+
instances of a Chef resource, create a new object and assign it to
|
65
|
+
the resource's parameter, e.g.:
|
66
|
+
|
67
|
+
fruit_basket = resource(:fruit_basket, 'default')
|
68
|
+
|
69
|
+
# BAD: modifies 'contents' object for all new fruit_basket instances
|
70
|
+
fruit_basket.contents << 'apple'
|
71
|
+
|
72
|
+
# GOOD: allocates new array only owned by this fruit_basket instance
|
73
|
+
fruit_basket.contents %w(apple)
|
74
|
+
|
75
|
+
MESSAGE
|
76
|
+
|
77
|
+
error_description.section("Additional information:", msg.gsub(/^ {6}/, ''))
|
78
|
+
end
|
47
79
|
end
|
48
80
|
|
49
81
|
def context
|
@@ -111,6 +143,10 @@ class Chef
|
|
111
143
|
end
|
112
144
|
end
|
113
145
|
|
146
|
+
def exception_message_modifying_frozen?
|
147
|
+
exception.message.include?("can't modify frozen")
|
148
|
+
end
|
149
|
+
|
114
150
|
end
|
115
151
|
|
116
152
|
end
|
@@ -109,8 +109,8 @@ class Chef
|
|
109
109
|
puts "Synchronizing cookbooks"
|
110
110
|
end
|
111
111
|
|
112
|
-
# Called when cookbook +
|
113
|
-
def synchronized_cookbook(cookbook_name)
|
112
|
+
# Called when cookbook +cookbook+ has been sync'd
|
113
|
+
def synchronized_cookbook(cookbook_name, cookbook)
|
114
114
|
print "."
|
115
115
|
end
|
116
116
|
|
@@ -68,7 +68,9 @@ class Chef
|
|
68
68
|
run_action = action || @resource.action
|
69
69
|
|
70
70
|
begin
|
71
|
-
# Coerce to an array to be safe.
|
71
|
+
# Coerce to an array to be safe. This could happen with a legacy
|
72
|
+
# resource or something overriding the default_action code in a
|
73
|
+
# subclass.
|
72
74
|
Array(run_action).each {|action_to_run| @resource.run_action(action_to_run) }
|
73
75
|
resource_updated = @resource.updated
|
74
76
|
rescue Mixlib::ShellOut::ShellCommandFailed
|
@@ -40,7 +40,7 @@ class Chef
|
|
40
40
|
|
41
41
|
engine = defined?(RUBY_ENGINE) ? RUBY_ENGINE : "ruby"
|
42
42
|
|
43
|
-
UA_COMMON = "/#{::Chef::VERSION} (#{engine}-#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}; ohai-#{Ohai::VERSION}; #{RUBY_PLATFORM}; +
|
43
|
+
UA_COMMON = "/#{::Chef::VERSION} (#{engine}-#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}; ohai-#{Ohai::VERSION}; #{RUBY_PLATFORM}; +https://chef.io)"
|
44
44
|
DEFAULT_UA = "Chef Client" << UA_COMMON
|
45
45
|
|
46
46
|
USER_AGENT = "User-Agent".freeze
|
data/lib/chef/knife.rb
CHANGED
@@ -87,6 +87,7 @@ class Chef
|
|
87
87
|
def self.inherited(subclass)
|
88
88
|
unless subclass.unnamed?
|
89
89
|
subcommands[subclass.snake_case_name] = subclass
|
90
|
+
subcommand_files[subclass.snake_case_name] += [caller[0].split(/:\d+/).first]
|
90
91
|
end
|
91
92
|
end
|
92
93
|
|
@@ -121,17 +122,29 @@ class Chef
|
|
121
122
|
end
|
122
123
|
|
123
124
|
def self.subcommand_loader
|
124
|
-
@subcommand_loader ||= Knife::SubcommandLoader.
|
125
|
+
@subcommand_loader ||= Chef::Knife::SubcommandLoader.for_config(chef_config_dir)
|
125
126
|
end
|
126
127
|
|
127
128
|
def self.load_commands
|
128
129
|
@commands_loaded ||= subcommand_loader.load_commands
|
129
130
|
end
|
130
131
|
|
132
|
+
def self.guess_category(args)
|
133
|
+
subcommand_loader.guess_category(args)
|
134
|
+
end
|
135
|
+
|
136
|
+
def self.subcommand_class_from(args)
|
137
|
+
subcommand_loader.command_class_from(args) || subcommand_not_found!(args)
|
138
|
+
end
|
139
|
+
|
131
140
|
def self.subcommands
|
132
141
|
@@subcommands ||= {}
|
133
142
|
end
|
134
143
|
|
144
|
+
def self.subcommand_files
|
145
|
+
@@subcommand_files ||= Hash.new([])
|
146
|
+
end
|
147
|
+
|
135
148
|
def self.subcommands_by_category
|
136
149
|
unless @subcommands_by_category
|
137
150
|
@subcommands_by_category = Hash.new { |hash, key| hash[key] = [] }
|
@@ -142,30 +155,6 @@ class Chef
|
|
142
155
|
@subcommands_by_category
|
143
156
|
end
|
144
157
|
|
145
|
-
# Print the list of subcommands knife knows about. If +preferred_category+
|
146
|
-
# is given, only subcommands in that category are shown
|
147
|
-
def self.list_commands(preferred_category=nil)
|
148
|
-
load_commands
|
149
|
-
|
150
|
-
category_desc = preferred_category ? preferred_category + " " : ''
|
151
|
-
msg "Available #{category_desc}subcommands: (for details, knife SUB-COMMAND --help)\n\n"
|
152
|
-
|
153
|
-
if preferred_category && subcommands_by_category.key?(preferred_category)
|
154
|
-
commands_to_show = {preferred_category => subcommands_by_category[preferred_category]}
|
155
|
-
else
|
156
|
-
commands_to_show = subcommands_by_category
|
157
|
-
end
|
158
|
-
|
159
|
-
commands_to_show.sort.each do |category, commands|
|
160
|
-
next if category =~ /deprecated/i
|
161
|
-
msg "** #{category.upcase} COMMANDS **"
|
162
|
-
commands.sort.each do |command|
|
163
|
-
msg subcommands[command].banner if subcommands[command]
|
164
|
-
end
|
165
|
-
msg
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
158
|
# Shared with subclasses
|
170
159
|
@@chef_config_dir = nil
|
171
160
|
|
@@ -206,7 +195,6 @@ class Chef
|
|
206
195
|
Chef::Log.level(:debug)
|
207
196
|
end
|
208
197
|
|
209
|
-
load_commands
|
210
198
|
subcommand_class = subcommand_class_from(args)
|
211
199
|
subcommand_class.options = options.merge!(subcommand_class.options)
|
212
200
|
subcommand_class.load_deps
|
@@ -215,34 +203,6 @@ class Chef
|
|
215
203
|
instance.run_with_pretty_exceptions
|
216
204
|
end
|
217
205
|
|
218
|
-
def self.guess_category(args)
|
219
|
-
category_words = args.select {|arg| arg =~ /^(([[:alnum:]])[[:alnum:]\_\-]+)$/ }
|
220
|
-
category_words.map! {|w| w.split('-')}.flatten!
|
221
|
-
matching_category = nil
|
222
|
-
while (!matching_category) && (!category_words.empty?)
|
223
|
-
candidate_category = category_words.join(' ')
|
224
|
-
matching_category = candidate_category if subcommands_by_category.key?(candidate_category)
|
225
|
-
matching_category || category_words.pop
|
226
|
-
end
|
227
|
-
matching_category
|
228
|
-
end
|
229
|
-
|
230
|
-
def self.subcommand_class_from(args)
|
231
|
-
command_words = args.select {|arg| arg =~ /^(([[:alnum:]])[[:alnum:]\_\-]+)$/ }
|
232
|
-
|
233
|
-
subcommand_class = nil
|
234
|
-
|
235
|
-
while ( !subcommand_class ) && ( !command_words.empty? )
|
236
|
-
snake_case_class_name = command_words.join("_")
|
237
|
-
unless subcommand_class = subcommands[snake_case_class_name]
|
238
|
-
command_words.pop
|
239
|
-
end
|
240
|
-
end
|
241
|
-
# see if we got the command as e.g., knife node-list
|
242
|
-
subcommand_class ||= subcommands[args.first.gsub('-', '_')]
|
243
|
-
subcommand_class || subcommand_not_found!(args)
|
244
|
-
end
|
245
|
-
|
246
206
|
def self.dependency_loaders
|
247
207
|
@dependency_loaders ||= []
|
248
208
|
end
|
@@ -265,7 +225,13 @@ class Chef
|
|
265
225
|
# Error out and print usage. probably because the arguments given by the
|
266
226
|
# user could not be resolved to a subcommand.
|
267
227
|
def self.subcommand_not_found!(args)
|
268
|
-
ui.fatal("Cannot find
|
228
|
+
ui.fatal("Cannot find subcommand for: '#{args.join(' ')}'")
|
229
|
+
|
230
|
+
# Mention rehash when the subcommands cache(plugin_manifest.json) is used
|
231
|
+
if subcommand_loader.is_a?(Chef::Knife::SubcommandLoader::HashedCommandLoader) ||
|
232
|
+
subcommand_loader.is_a?(Chef::Knife::SubcommandLoader::CustomManifestLoader)
|
233
|
+
ui.info("If this is a recently installed plugin, please run 'knife rehash' to update the subcommands cache.")
|
234
|
+
end
|
269
235
|
|
270
236
|
if category_commands = guess_category(args)
|
271
237
|
list_commands(category_commands)
|
@@ -280,6 +246,20 @@ class Chef
|
|
280
246
|
exit 10
|
281
247
|
end
|
282
248
|
|
249
|
+
def self.list_commands(preferred_category=nil)
|
250
|
+
category_desc = preferred_category ? preferred_category + " " : ''
|
251
|
+
msg "Available #{category_desc}subcommands: (for details, knife SUB-COMMAND --help)\n\n"
|
252
|
+
subcommand_loader.list_commands(preferred_category).sort.each do |category, commands|
|
253
|
+
next if category =~ /deprecated/i
|
254
|
+
msg "** #{category.upcase} COMMANDS **"
|
255
|
+
commands.sort.each do |command|
|
256
|
+
subcommand_loader.load_command(command)
|
257
|
+
msg subcommands[command].banner if subcommands[command]
|
258
|
+
end
|
259
|
+
msg
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
283
263
|
def self.reset_config_path!
|
284
264
|
@@chef_config_dir = nil
|
285
265
|
end
|
data/lib/chef/knife/bootstrap.rb
CHANGED
@@ -143,6 +143,22 @@ class Chef
|
|
143
143
|
:proc => lambda { |o| o.split(/[\s,]+/) },
|
144
144
|
:default => []
|
145
145
|
|
146
|
+
option :policy_name,
|
147
|
+
:long => "--policy-name POLICY_NAME",
|
148
|
+
:description => "Policyfile name to use (--policy-group must also be given)",
|
149
|
+
:default => nil
|
150
|
+
|
151
|
+
option :policy_group,
|
152
|
+
:long => "--policy-group POLICY_GROUP",
|
153
|
+
:description => "Policy group name to use (--policy-name must also be given)",
|
154
|
+
:default => nil
|
155
|
+
|
156
|
+
option :tags,
|
157
|
+
:long => "--tags TAGS",
|
158
|
+
:description => "Comma separated list of tags to apply to the node",
|
159
|
+
:proc => lambda { |o| o.split(/[\s,]+/) },
|
160
|
+
:default => []
|
161
|
+
|
146
162
|
option :first_boot_attributes,
|
147
163
|
:short => "-j JSON_ATTRIBS",
|
148
164
|
:long => "--json-attributes",
|
@@ -309,6 +325,7 @@ class Chef
|
|
309
325
|
|
310
326
|
def run
|
311
327
|
validate_name_args!
|
328
|
+
validate_options!
|
312
329
|
|
313
330
|
$stdout.sync = true
|
314
331
|
|
@@ -357,6 +374,17 @@ class Chef
|
|
357
374
|
end
|
358
375
|
end
|
359
376
|
|
377
|
+
def validate_options!
|
378
|
+
if incomplete_policyfile_options?
|
379
|
+
ui.error("--policy-name and --policy-group must be specified together")
|
380
|
+
exit 1
|
381
|
+
elsif policyfile_and_run_list_given?
|
382
|
+
ui.error("Policyfile options and --run-list are exclusive")
|
383
|
+
exit 1
|
384
|
+
end
|
385
|
+
true
|
386
|
+
end
|
387
|
+
|
360
388
|
def knife_ssh
|
361
389
|
ssh = Chef::Knife::Ssh.new
|
362
390
|
ssh.ui = ui
|
@@ -389,6 +417,19 @@ class Chef
|
|
389
417
|
|
390
418
|
command
|
391
419
|
end
|
420
|
+
|
421
|
+
private
|
422
|
+
|
423
|
+
# True if policy_name and run_list are both given
|
424
|
+
def policyfile_and_run_list_given?
|
425
|
+
!config[:run_list].empty? && !!config[:policy_name]
|
426
|
+
end
|
427
|
+
|
428
|
+
# True if one of policy_name or policy_group was given, but not both
|
429
|
+
def incomplete_policyfile_options?
|
430
|
+
(!!config[:policy_name] ^ config[:policy_group])
|
431
|
+
end
|
432
|
+
|
392
433
|
end
|
393
434
|
end
|
394
435
|
end
|