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
@@ -67,7 +67,12 @@ class Chef
|
|
67
67
|
result = {}
|
68
68
|
|
69
69
|
result["name"] = node.name
|
70
|
-
|
70
|
+
if node.policy_name.nil? && node.policy_group.nil?
|
71
|
+
result["chef_environment"] = node.chef_environment
|
72
|
+
else
|
73
|
+
result["policy_name"] = node.policy_name
|
74
|
+
result["policy_group"] = node.policy_group
|
75
|
+
end
|
71
76
|
result["run_list"] = node.run_list
|
72
77
|
result["normal"] = node.normal_attrs
|
73
78
|
|
@@ -95,11 +100,29 @@ class Chef
|
|
95
100
|
|
96
101
|
summarized=<<-SUMMARY
|
97
102
|
#{ui.color('Node Name:', :bold)} #{ui.color(node.name, :bold)}
|
103
|
+
SUMMARY
|
104
|
+
show_policy = !(node.policy_name.nil? && node.policy_group.nil?)
|
105
|
+
if show_policy
|
106
|
+
summarized << <<-POLICY
|
107
|
+
#{key('Policy Name:')} #{node.policy_name}
|
108
|
+
#{key('Policy Group:')} #{node.policy_group}
|
109
|
+
POLICY
|
110
|
+
else
|
111
|
+
summarized << <<-ENV
|
98
112
|
#{key('Environment:')} #{node.chef_environment}
|
113
|
+
ENV
|
114
|
+
end
|
115
|
+
summarized << <<-SUMMARY
|
99
116
|
#{key('FQDN:')} #{node[:fqdn]}
|
100
117
|
#{key('IP:')} #{ip}
|
101
118
|
#{key('Run List:')} #{node.run_list}
|
119
|
+
SUMMARY
|
120
|
+
unless show_policy
|
121
|
+
summarized << <<-ROLES
|
102
122
|
#{key('Roles:')} #{Array(node[:roles]).join(', ')}
|
123
|
+
ROLES
|
124
|
+
end
|
125
|
+
summarized << <<-SUMMARY
|
103
126
|
#{key('Recipes:')} #{Array(node[:recipes]).join(', ')}
|
104
127
|
#{key('Platform:')} #{node[:platform]} #{node[:platform_version]}
|
105
128
|
#{key('Tags:')} #{Array(node[:tags]).join(', ')}
|
@@ -18,105 +18,120 @@
|
|
18
18
|
|
19
19
|
require 'chef/version'
|
20
20
|
require 'chef/util/path_helper'
|
21
|
+
require 'chef/knife/core/gem_glob_loader'
|
22
|
+
require 'chef/knife/core/hashed_command_loader'
|
23
|
+
require 'chef/knife/core/custom_manifest_loader'
|
24
|
+
|
21
25
|
class Chef
|
22
26
|
class Knife
|
27
|
+
#
|
28
|
+
# Public Methods of a Subcommand Loader
|
29
|
+
#
|
30
|
+
# load_commands - loads all available subcommands
|
31
|
+
# load_command(args) - loads subcommands for the given args
|
32
|
+
# list_commands(args) - lists all available subcommands,
|
33
|
+
# optionally filtering by category
|
34
|
+
# subcommand_files - returns an array of all subcommand files
|
35
|
+
# that could be loaded
|
36
|
+
# commnad_class_from(args) - returns the subcommand class for the
|
37
|
+
# user-requested command
|
38
|
+
#
|
23
39
|
class SubcommandLoader
|
24
|
-
|
25
|
-
MATCHES_CHEF_GEM = %r{/chef-[\d]+\.[\d]+\.[\d]+}.freeze
|
26
|
-
MATCHES_THIS_CHEF_GEM = %r{/chef-#{Chef::VERSION}(-\w+)?(-\w+)?/}.freeze
|
27
|
-
|
28
40
|
attr_reader :chef_config_dir
|
29
41
|
attr_reader :env
|
30
42
|
|
31
|
-
|
43
|
+
# A small factory method. Eventually, this is the only place
|
44
|
+
# where SubcommandLoader should know about its subclasses, but
|
45
|
+
# to maintain backwards compatibility many of the instance
|
46
|
+
# methods in this base class contain default implementations
|
47
|
+
# of the functions sub classes should otherwise provide
|
48
|
+
# or directly instantiate the appropriate subclass
|
49
|
+
def self.for_config(chef_config_dir)
|
50
|
+
if autogenerated_manifest?
|
51
|
+
Chef::Log.debug("Using autogenerated hashed command manifest #{plugin_manifest_path}")
|
52
|
+
Knife::SubcommandLoader::HashedCommandLoader.new(chef_config_dir, plugin_manifest)
|
53
|
+
elsif custom_manifest?
|
54
|
+
Chef.log_deprecation("Using custom manifest #{plugin_manifest_path} is deprecated. Please use a `knife rehash` autogenerated manifest instead.")
|
55
|
+
Knife::SubcommandLoader::CustomManifestLoader.new(chef_config_dir, plugin_manifest)
|
56
|
+
else
|
57
|
+
Knife::SubcommandLoader::GemGlobLoader.new(chef_config_dir)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.plugin_manifest?
|
62
|
+
plugin_manifest_path && File.exist?(plugin_manifest_path)
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.autogenerated_manifest?
|
66
|
+
plugin_manifest? && plugin_manifest.key?(HashedCommandLoader::KEY)
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.custom_manifest?
|
70
|
+
plugin_manifest? && plugin_manifest.key?("plugins")
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.plugin_manifest
|
74
|
+
Chef::JSONCompat.from_json(File.read(plugin_manifest_path))
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.plugin_manifest_path
|
78
|
+
Chef::Util::PathHelper.home('.chef', 'plugin_manifest.json')
|
79
|
+
end
|
80
|
+
|
81
|
+
def initialize(chef_config_dir, env = nil)
|
32
82
|
@chef_config_dir = chef_config_dir
|
33
|
-
@forced_activate = {}
|
34
83
|
|
35
84
|
# Deprecated and un-used instance variable.
|
36
85
|
@env = env
|
37
86
|
unless env.nil?
|
38
|
-
Chef
|
87
|
+
Chef.log_deprecation("The env argument to Chef::Knife::SubcommandLoader is deprecated. If you are using env to inject/mock HOME, consider mocking Chef::Util::PathHelper.home instead.")
|
39
88
|
end
|
40
89
|
end
|
41
90
|
|
42
91
|
# Load all the sub-commands
|
43
92
|
def load_commands
|
93
|
+
return true if @loaded
|
44
94
|
subcommand_files.each { |subcommand| Kernel.load subcommand }
|
45
|
-
true
|
95
|
+
@loaded = true
|
46
96
|
end
|
47
97
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
if chef_config_dir
|
54
|
-
user_specific_files.concat Dir.glob(File.expand_path("plugins/knife/*.rb", Chef::Util::PathHelper.escape_glob(chef_config_dir)))
|
55
|
-
end
|
56
|
-
|
57
|
-
# finally search ~/.chef/plugins/knife/*.rb
|
58
|
-
Chef::Util::PathHelper.home('.chef', 'plugins', 'knife') do |p|
|
59
|
-
user_specific_files.concat Dir.glob(File.join(Chef::Util::PathHelper.escape_glob(p), '*.rb'))
|
60
|
-
end
|
98
|
+
def force_load
|
99
|
+
@loaded=false
|
100
|
+
load_commands
|
101
|
+
end
|
61
102
|
|
62
|
-
|
103
|
+
def load_command(_command_args)
|
104
|
+
load_commands
|
63
105
|
end
|
64
106
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
# Note: the "right" way to load the plugins is to require the relative path, i.e.,
|
70
|
-
# require 'chef/knife/command'
|
71
|
-
# but we're getting frustrated by bugs at every turn, and it's slow besides. So
|
72
|
-
# subcommand loader has been modified to load the plugins by using Kernel.load
|
73
|
-
# with the absolute path.
|
74
|
-
def gem_and_builtin_subcommands
|
75
|
-
if have_plugin_manifest?
|
76
|
-
find_subcommands_via_manifest
|
107
|
+
def list_commands(pref_cat = nil)
|
108
|
+
load_commands
|
109
|
+
if pref_cat && Chef::Knife.subcommands_by_category.key?(pref_cat)
|
110
|
+
{ pref_cat => Chef::Knife.subcommands_by_category[pref_cat] }
|
77
111
|
else
|
78
|
-
|
79
|
-
require 'rubygems'
|
80
|
-
find_subcommands_via_rubygems
|
112
|
+
Chef::Knife.subcommands_by_category
|
81
113
|
end
|
82
|
-
rescue LoadError
|
83
|
-
find_subcommands_via_dirglob
|
84
114
|
end
|
85
115
|
|
86
|
-
def
|
87
|
-
|
116
|
+
def command_class_from(args)
|
117
|
+
cmd_words = positional_arguments(args)
|
118
|
+
load_command(cmd_words)
|
119
|
+
result = Chef::Knife.subcommands[find_longest_key(Chef::Knife.subcommands,
|
120
|
+
cmd_words, '_')]
|
121
|
+
result || Chef::Knife.subcommands[args.first.gsub('-', '_')]
|
88
122
|
end
|
89
123
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
# "knife-ec2": {
|
96
|
-
# "paths": [
|
97
|
-
# "/home/alice/.rubymanagerthing/gems/knife-ec2-x.y.z/lib/chef/knife/ec2_server_create.rb",
|
98
|
-
# "/home/alice/.rubymanagerthing/gems/knife-ec2-x.y.z/lib/chef/knife/ec2_server_delete.rb"
|
99
|
-
# ]
|
100
|
-
# }
|
101
|
-
# }
|
102
|
-
# }
|
103
|
-
#
|
104
|
-
# Extraneous content in this file is ignored. This intentional so that we
|
105
|
-
# can adapt the file format for potential behavior changes to knife in
|
106
|
-
# the future.
|
107
|
-
def find_subcommands_via_manifest
|
108
|
-
# Format of subcommand_files is "relative_path" (something you can
|
109
|
-
# Kernel.require()) => full_path. The relative path isn't used
|
110
|
-
# currently, so we just map full_path => full_path.
|
111
|
-
subcommand_files = {}
|
112
|
-
plugin_manifest["plugins"].each do |plugin_name, plugin_manifest|
|
113
|
-
plugin_manifest["paths"].each do |cmd_path|
|
114
|
-
subcommand_files[cmd_path] = cmd_path
|
115
|
-
end
|
116
|
-
end
|
117
|
-
subcommand_files.merge(find_subcommands_via_dirglob)
|
124
|
+
def guess_category(args)
|
125
|
+
category_words = positional_arguments(args)
|
126
|
+
category_words.map! { |w| w.split('-') }.flatten!
|
127
|
+
find_longest_key(Chef::Knife.subcommands_by_category,
|
128
|
+
category_words, ' ')
|
118
129
|
end
|
119
130
|
|
131
|
+
|
132
|
+
#
|
133
|
+
# This is shared between the custom_manifest_loader and the gem_glob_loader
|
134
|
+
#
|
120
135
|
def find_subcommands_via_dirglob
|
121
136
|
# The "require paths" of the core knife subcommands bundled with chef
|
122
137
|
files = Dir[File.join(Chef::Util::PathHelper.escape_glob(File.expand_path('../../../knife', __FILE__)), '*.rb')]
|
@@ -128,95 +143,65 @@ class Chef
|
|
128
143
|
subcommand_files
|
129
144
|
end
|
130
145
|
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
subcommand_files[rel_path] = file
|
145
|
-
end
|
146
|
-
|
147
|
-
subcommand_files.merge(find_subcommands_via_dirglob)
|
148
|
-
end
|
149
|
-
|
150
|
-
def have_plugin_manifest?
|
151
|
-
plugin_manifest_path && File.exist?(plugin_manifest_path)
|
152
|
-
end
|
153
|
-
|
154
|
-
def plugin_manifest
|
155
|
-
Chef::JSONCompat.from_json(File.read(plugin_manifest_path))
|
156
|
-
end
|
157
|
-
|
158
|
-
def plugin_manifest_path
|
159
|
-
Chef::Util::PathHelper.home('.chef', 'plugin_manifest.json')
|
146
|
+
#
|
147
|
+
# Subclassses should define this themselves. Eventually, this will raise a
|
148
|
+
# NotImplemented error, but for now, we mimic the behavior the user was likely
|
149
|
+
# to get in the past.
|
150
|
+
#
|
151
|
+
def subcommand_files
|
152
|
+
Chef.log_deprecation "Using Chef::Knife::SubcommandLoader directly is deprecated.
|
153
|
+
Please use Chef::Knife::SubcommandLoader.for_config(chef_config_dir, env)"
|
154
|
+
@subcommand_files ||= if Chef::Knife::SubcommandLoader.plugin_manifest?
|
155
|
+
Chef::Knife::SubcommandLoader::CustomManifestLoader.new(chef_config_dir, env).subcommand_files
|
156
|
+
else
|
157
|
+
Chef::Knife::SubcommandLoader::GemGlobLoader.new(chef_config_dir, env).subcommand_files
|
158
|
+
end
|
160
159
|
end
|
161
160
|
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
gem_files = latest_gem_specs.map do |spec|
|
174
|
-
# Gem::Specification#matches_for_glob wasn't added until RubyGems 1.8
|
175
|
-
if spec.respond_to? :matches_for_glob
|
176
|
-
spec.matches_for_glob("#{glob}#{Gem.suffix_pattern}")
|
161
|
+
#
|
162
|
+
# Utility function for finding an element in a hash given an array
|
163
|
+
# of words and a separator. We find the the longest key in the
|
164
|
+
# hash composed of the given words joined by the separator.
|
165
|
+
#
|
166
|
+
def find_longest_key(hash, words, sep = '_')
|
167
|
+
match = nil
|
168
|
+
until match || words.empty?
|
169
|
+
candidate = words.join(sep)
|
170
|
+
if hash.key?(candidate)
|
171
|
+
match = candidate
|
177
172
|
else
|
178
|
-
|
173
|
+
words.pop
|
179
174
|
end
|
180
|
-
end.flatten
|
181
|
-
|
182
|
-
files.concat gem_files
|
183
|
-
files.uniq! if check_load_path
|
184
|
-
|
185
|
-
return files
|
186
|
-
end
|
187
|
-
|
188
|
-
def latest_gem_specs
|
189
|
-
@latest_gem_specs ||= if Gem::Specification.respond_to? :latest_specs
|
190
|
-
Gem::Specification.latest_specs(true) # find prerelease gems
|
191
|
-
else
|
192
|
-
Gem.source_index.latest_specs(true)
|
193
175
|
end
|
176
|
+
match
|
194
177
|
end
|
195
178
|
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
Dir[glob].map { |f| f.untaint }
|
179
|
+
#
|
180
|
+
# The positional arguments from the argument list provided by the
|
181
|
+
# users. Used to search for subcommands and categories.
|
182
|
+
#
|
183
|
+
# @return [Array<String>]
|
184
|
+
#
|
185
|
+
def positional_arguments(args)
|
186
|
+
args.select { |arg| arg =~ /^(([[:alnum:]])[[:alnum:]\_\-]+)$/ }
|
206
187
|
end
|
207
188
|
|
208
|
-
|
209
|
-
|
210
|
-
|
189
|
+
# Returns an Array of paths to knife commands located in
|
190
|
+
# chef_config_dir/plugins/knife/ and ~/.chef/plugins/knife/
|
191
|
+
def site_subcommands
|
192
|
+
user_specific_files = []
|
211
193
|
|
212
|
-
|
213
|
-
|
214
|
-
|
194
|
+
if chef_config_dir
|
195
|
+
user_specific_files.concat Dir.glob(File.expand_path("plugins/knife/*.rb", Chef::Util::PathHelper.escape_glob(chef_config_dir)))
|
196
|
+
end
|
215
197
|
|
216
|
-
|
217
|
-
|
218
|
-
|
198
|
+
# finally search ~/.chef/plugins/knife/*.rb
|
199
|
+
Chef::Util::PathHelper.home('.chef', 'plugins', 'knife') do |p|
|
200
|
+
user_specific_files.concat Dir.glob(File.join(Chef::Util::PathHelper.escape_glob(p), '*.rb'))
|
201
|
+
end
|
219
202
|
|
203
|
+
user_specific_files
|
204
|
+
end
|
220
205
|
end
|
221
206
|
end
|
222
207
|
end
|
@@ -42,7 +42,18 @@ class Chef
|
|
42
42
|
entries = @name_args[1].split(',').map { |e| e.strip }
|
43
43
|
end
|
44
44
|
|
45
|
-
|
45
|
+
# iterate over the list of things to remove,
|
46
|
+
# warning if one of them was not found
|
47
|
+
entries.each do |e|
|
48
|
+
if node.run_list.find { |rli| e == rli.to_s }
|
49
|
+
node.run_list.remove(e)
|
50
|
+
else
|
51
|
+
ui.warn "#{e} is not in the run list"
|
52
|
+
unless e =~ /^(recipe|role)\[/
|
53
|
+
ui.warn '(did you forget recipe[] or role[] around it?)'
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
46
57
|
|
47
58
|
node.save
|
48
59
|
|
@@ -0,0 +1,62 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Steven Danna <steve@chef.io>
|
3
|
+
# Copyright:: Copyright (c) 2015 Chef Software, Inc
|
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
|
+
require 'chef/knife'
|
20
|
+
require 'chef/knife/core/subcommand_loader'
|
21
|
+
|
22
|
+
class Chef
|
23
|
+
class Knife
|
24
|
+
class Rehash < Chef::Knife
|
25
|
+
banner "knife rehash"
|
26
|
+
|
27
|
+
def run
|
28
|
+
if ! Chef::Knife::SubcommandLoader.autogenerated_manifest?
|
29
|
+
ui.msg "Using knife-rehash will speed up knife's load time by caching the location of subcommands on disk."
|
30
|
+
ui.msg "However, you will need to update the cache by running `knife rehash` anytime you install a new knife plugin."
|
31
|
+
else
|
32
|
+
reload_plugins
|
33
|
+
end
|
34
|
+
write_hash(generate_hash)
|
35
|
+
end
|
36
|
+
|
37
|
+
def reload_plugins
|
38
|
+
Chef::Knife::SubcommandLoader::GemGlobLoader.new(@@chef_config_dir).load_commands
|
39
|
+
end
|
40
|
+
|
41
|
+
def generate_hash
|
42
|
+
output = if Chef::Knife::SubcommandLoader.plugin_manifest?
|
43
|
+
Chef::Knife::SubcommandLoader.plugin_manifest
|
44
|
+
else
|
45
|
+
{ Chef::Knife::SubcommandLoader::HashedCommandLoader::KEY => {}}
|
46
|
+
end
|
47
|
+
output[Chef::Knife::SubcommandLoader::HashedCommandLoader::KEY]['plugins_paths'] = Chef::Knife.subcommand_files
|
48
|
+
output[Chef::Knife::SubcommandLoader::HashedCommandLoader::KEY]['plugins_by_category'] = Chef::Knife.subcommands_by_category
|
49
|
+
output
|
50
|
+
end
|
51
|
+
|
52
|
+
def write_hash(data)
|
53
|
+
plugin_manifest_dir = File.expand_path('..', Chef::Knife::SubcommandLoader.plugin_manifest_path)
|
54
|
+
FileUtils.mkdir_p(plugin_manifest_dir) unless File.directory?(plugin_manifest_dir)
|
55
|
+
File.open(Chef::Knife::SubcommandLoader.plugin_manifest_path, 'w') do |f|
|
56
|
+
f.write(Chef::JSONCompat.to_json_pretty(data))
|
57
|
+
ui.msg "Knife subcommands are cached in #{Chef::Knife::SubcommandLoader.plugin_manifest_path}. Delete this file to disable the caching."
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|