chef 10.34.6 → 11.0.0.beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CONTRIBUTING.md +155 -0
- data/README.md +89 -0
- data/Rakefile +4 -12
- data/bin/chef-apply +25 -0
- data/bin/chef-shell +34 -0
- data/bin/shef +6 -5
- data/distro/common/html/chef-client.8.html +4 -4
- data/distro/common/html/chef-expander.8.html +4 -4
- data/distro/common/html/chef-expanderctl.8.html +4 -4
- data/distro/common/html/chef-server-webui.8.html +4 -4
- data/distro/common/html/chef-server.8.html +4 -4
- data/distro/common/html/{shef.1.html → chef-shell.1.html} +49 -46
- data/distro/common/html/chef-solo.8.html +18 -12
- data/distro/common/html/chef-solr.8.html +4 -4
- data/distro/common/html/knife-bootstrap.1.html +4 -4
- data/distro/common/html/knife-client.1.html +4 -4
- data/distro/common/html/knife-configure.1.html +4 -4
- data/distro/common/html/knife-cookbook-site.1.html +4 -4
- data/distro/common/html/knife-cookbook.1.html +10 -7
- data/distro/common/html/knife-data-bag.1.html +10 -7
- data/distro/common/html/knife-environment.1.html +8 -6
- data/distro/common/html/knife-exec.1.html +9 -9
- data/distro/common/html/knife-index.1.html +4 -4
- data/distro/common/html/knife-node.1.html +4 -4
- data/distro/common/html/knife-role.1.html +4 -4
- data/distro/common/html/knife-search.1.html +4 -4
- data/distro/common/html/knife-ssh.1.html +4 -4
- data/distro/common/html/knife-status.1.html +4 -4
- data/distro/common/html/knife-tag.1.html +4 -4
- data/distro/common/html/knife.1.html +8 -13
- data/distro/common/man/man1/{shef.1 → chef-shell.1} +21 -57
- data/distro/common/man/man1/knife-bootstrap.1 +1 -1
- data/distro/common/man/man1/knife-client.1 +1 -1
- data/distro/common/man/man1/knife-configure.1 +1 -1
- data/distro/common/man/man1/knife-cookbook-site.1 +1 -1
- data/distro/common/man/man1/knife-cookbook.1 +15 -2
- data/distro/common/man/man1/knife-data-bag.1 +15 -2
- data/distro/common/man/man1/knife-environment.1 +12 -2
- data/distro/common/man/man1/knife-exec.1 +4 -7
- data/distro/common/man/man1/knife-index.1 +1 -1
- data/distro/common/man/man1/knife-node.1 +1 -1
- data/distro/common/man/man1/knife-role.1 +1 -1
- data/distro/common/man/man1/knife-search.1 +1 -1
- data/distro/common/man/man1/knife-ssh.1 +1 -1
- data/distro/common/man/man1/knife-status.1 +1 -1
- data/distro/common/man/man1/knife-tag.1 +1 -1
- data/distro/common/man/man1/knife.1 +3 -6
- data/distro/common/man/man8/chef-client.8 +1 -1
- data/distro/common/man/man8/chef-expander.8 +1 -1
- data/distro/common/man/man8/chef-expanderctl.8 +1 -1
- data/distro/common/man/man8/chef-server-webui.8 +1 -1
- data/distro/common/man/man8/chef-server.8 +1 -1
- data/distro/common/man/man8/chef-solo.8 +36 -4
- data/distro/common/man/man8/chef-solr.8 +1 -1
- data/distro/common/markdown/man1/{shef.mkd → chef-shell.mkd} +49 -43
- data/distro/common/markdown/man1/knife-exec.mkd +11 -6
- data/distro/common/markdown/man1/knife.mkd +4 -9
- data/distro/debian/etc/default/chef-client +0 -1
- data/distro/debian/etc/init.d/chef-client +2 -2
- data/lib/chef.rb +2 -5
- data/lib/chef/api_client.rb +20 -130
- data/lib/chef/api_client/registration.rb +126 -0
- data/lib/chef/application.rb +71 -14
- data/lib/chef/application/apply.rb +160 -0
- data/lib/chef/application/client.rb +25 -18
- data/lib/chef/application/knife.rb +0 -2
- data/lib/chef/application/solo.rb +23 -8
- data/lib/chef/application/windows_service.rb +5 -2
- data/lib/chef/applications.rb +1 -0
- data/lib/chef/chef_fs.rb +11 -0
- data/lib/chef/chef_fs/command_line.rb +232 -0
- data/lib/chef/chef_fs/file_pattern.rb +312 -0
- data/lib/chef/chef_fs/file_system.rb +358 -0
- data/lib/chef/chef_fs/file_system/base_fs_dir.rb +47 -0
- data/lib/chef/chef_fs/file_system/base_fs_object.rb +121 -0
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +109 -0
- data/{spec/unit/monkey_patches/uri_spec.rb → lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb} +12 -15
- data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +84 -0
- data/lib/chef/chef_fs/file_system/cookbook_dir.rb +188 -0
- data/lib/chef/chef_fs/file_system/cookbook_file.rb +78 -0
- data/lib/chef/chef_fs/file_system/cookbook_subdir.rb +54 -0
- data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +68 -0
- data/lib/chef/chef_fs/file_system/data_bag_dir.rb +78 -0
- data/lib/chef/chef_fs/file_system/data_bag_item.rb +59 -0
- data/lib/chef/chef_fs/file_system/data_bags_dir.rb +66 -0
- data/lib/chef/chef_fs/file_system/file_system_entry.rb +90 -0
- data/lib/chef/{index_queue.rb → chef_fs/file_system/file_system_error.rb} +14 -12
- data/lib/chef/{resource/whyrun_safe_ruby_block.rb → chef_fs/file_system/file_system_root_dir.rb} +10 -10
- data/lib/chef/chef_fs/file_system/must_delete_recursively_error.rb +31 -0
- data/lib/chef/chef_fs/file_system/nodes_dir.rb +47 -0
- data/lib/chef/{provider/whyrun_safe_ruby_block.rb → chef_fs/file_system/nonexistent_fs_object.rb} +19 -9
- data/lib/chef/chef_fs/file_system/not_found_error.rb +31 -0
- data/lib/chef/chef_fs/file_system/rest_list_dir.rb +84 -0
- data/lib/chef/chef_fs/file_system/rest_list_entry.rb +123 -0
- data/lib/chef/chef_fs/knife.rb +77 -0
- data/lib/chef/chef_fs/path_utils.rb +64 -0
- data/lib/chef/client.rb +44 -21
- data/lib/chef/config.rb +52 -43
- data/lib/chef/cookbook/synchronizer.rb +6 -8
- data/lib/chef/cookbook/syntax_check.rb +61 -14
- data/lib/chef/cookbook_loader.rb +39 -26
- data/lib/chef/cookbook_uploader.rb +17 -19
- data/lib/chef/cookbook_version.rb +3 -302
- data/lib/chef/daemon.rb +3 -18
- data/lib/chef/data_bag.rb +4 -97
- data/lib/chef/data_bag_item.rb +2 -65
- data/lib/chef/digester.rb +73 -0
- data/lib/chef/dsl.rb +6 -0
- data/lib/chef/dsl/data_query.rb +66 -0
- data/lib/chef/dsl/include_attribute.rb +60 -0
- data/lib/chef/dsl/include_recipe.rb +42 -0
- data/lib/chef/dsl/platform_introspection.rb +213 -0
- data/lib/chef/dsl/recipe.rb +84 -0
- data/lib/chef/dsl/registry_helper.rb +59 -0
- data/lib/chef/encrypted_data_bag_item.rb +74 -19
- data/lib/chef/environment.rb +9 -180
- data/lib/chef/exceptions.rb +87 -14
- data/lib/chef/formatters/base.rb +4 -1
- data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +0 -4
- data/lib/chef/json_compat.rb +1 -97
- data/lib/chef/knife.rb +90 -41
- data/lib/chef/knife/bootstrap/archlinux-gems.erb +2 -2
- data/lib/chef/knife/bootstrap/centos5-gems.erb +2 -2
- data/lib/chef/knife/bootstrap/chef-full.erb +3 -3
- data/lib/chef/knife/bootstrap/fedora13-gems.erb +2 -2
- data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +2 -2
- data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +2 -2
- data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +2 -2
- data/lib/chef/knife/configure.rb +1 -2
- data/lib/chef/knife/cookbook_metadata.rb +1 -0
- data/lib/chef/knife/cookbook_test.rb +3 -2
- data/lib/chef/knife/cookbook_upload.rb +12 -7
- data/lib/chef/knife/core/bootstrap_context.rb +1 -1
- data/lib/chef/knife/core/generic_presenter.rb +26 -13
- data/lib/chef/knife/core/node_editor.rb +36 -16
- data/lib/chef/knife/core/node_presenter.rb +1 -1
- data/lib/chef/knife/core/text_formatter.rb +23 -37
- data/lib/chef/knife/core/ui.rb +15 -9
- data/lib/chef/knife/delete.rb +39 -0
- data/lib/chef/knife/diff.rb +46 -0
- data/lib/chef/knife/download.rb +50 -0
- data/lib/chef/knife/environment_show.rb +7 -0
- data/lib/chef/knife/exec.rb +5 -5
- data/lib/chef/knife/help_topics.rb +1 -1
- data/lib/chef/knife/index_rebuild.rb +91 -7
- data/lib/chef/knife/list.rb +109 -0
- data/lib/chef/knife/raw.rb +108 -0
- data/lib/chef/knife/search.rb +40 -22
- data/lib/chef/knife/show.rb +32 -0
- data/lib/chef/knife/ssh.rb +6 -2
- data/lib/chef/knife/upload.rb +50 -0
- data/lib/chef/mixin/checksum.rb +3 -3
- data/lib/chef/mixin/deep_merge.rb +55 -197
- data/lib/chef/mixin/language.rb +9 -222
- data/lib/chef/mixin/language_include_attribute.rb +6 -38
- data/lib/chef/mixin/language_include_recipe.rb +3 -35
- data/lib/chef/mixin/params_validate.rb +6 -19
- data/lib/chef/mixin/recipe_definition_dsl_core.rb +8 -61
- data/lib/chef/mixin/securable.rb +32 -7
- data/lib/chef/mixin/template.rb +40 -0
- data/lib/chef/mixins.rb +0 -4
- data/lib/chef/monkey_patches/net_http.rb +0 -34
- data/lib/chef/node.rb +133 -309
- data/lib/chef/node/attribute.rb +333 -473
- data/lib/chef/node/attribute_collections.rb +199 -0
- data/lib/chef/node/immutable_collections.rb +186 -0
- data/lib/chef/platform.rb +7 -22
- data/lib/chef/provider.rb +2 -49
- data/lib/chef/provider/breakpoint.rb +6 -6
- data/lib/chef/provider/cookbook_file.rb +5 -33
- data/lib/chef/provider/deploy.rb +2 -1
- data/lib/chef/provider/directory.rb +14 -17
- data/lib/chef/provider/file.rb +19 -52
- data/lib/chef/provider/group.rb +31 -51
- data/lib/chef/provider/group/dscl.rb +13 -53
- data/lib/chef/provider/group/gpasswd.rb +19 -14
- data/lib/chef/provider/group/groupadd.rb +1 -41
- data/lib/chef/provider/group/groupmod.rb +36 -46
- data/lib/chef/provider/group/pw.rb +16 -59
- data/lib/chef/provider/group/suse.rb +13 -16
- data/lib/chef/provider/group/usermod.rb +18 -40
- data/lib/chef/provider/group/windows.rb +6 -13
- data/lib/chef/provider/http_request.rb +25 -42
- data/lib/chef/provider/link.rb +2 -0
- data/lib/chef/provider/lwrp_base.rb +150 -0
- data/lib/chef/provider/package/portage.rb +4 -9
- data/lib/chef/provider/package/rpm.rb +2 -2
- data/lib/chef/provider/package/rubygems.rb +9 -41
- data/lib/chef/provider/package/yum.rb +12 -19
- data/lib/chef/provider/registry_key.rb +156 -0
- data/lib/chef/provider/remote_directory.rb +2 -0
- data/lib/chef/provider/remote_file.rb +21 -12
- data/lib/chef/provider/ruby_block.rb +5 -2
- data/lib/chef/provider/service.rb +15 -0
- data/lib/chef/provider/service/init.rb +9 -7
- data/lib/chef/provider/service/macosx.rb +15 -73
- data/lib/chef/provider/service/simple.rb +1 -1
- data/lib/chef/provider/service/solaris.rb +3 -3
- data/lib/chef/provider/template.rb +22 -25
- data/lib/chef/provider/template_finder.rb +61 -0
- data/lib/chef/provider/user.rb +0 -1
- data/lib/chef/provider/user/dscl.rb +175 -568
- data/lib/chef/provider/user/useradd.rb +30 -47
- data/lib/chef/providers.rb +3 -2
- data/lib/chef/recipe.rb +14 -8
- data/lib/chef/resource.rb +13 -154
- data/lib/chef/resource/group.rb +1 -11
- data/lib/chef/resource/http_request.rb +2 -1
- data/lib/chef/resource/lwrp_base.rb +127 -0
- data/lib/chef/resource/mount.rb +10 -11
- data/lib/chef/resource/registry_key.rb +86 -0
- data/lib/chef/resource/remote_directory.rb +6 -5
- data/lib/chef/resource/remote_file.rb +22 -31
- data/lib/chef/resource/ruby_block.rb +2 -2
- data/lib/chef/resource/service.rb +14 -0
- data/lib/chef/resource/user.rb +0 -18
- data/lib/chef/resource_collection.rb +25 -21
- data/lib/chef/resources.rb +2 -1
- data/lib/chef/rest.rb +50 -131
- data/lib/chef/rest/auth_credentials.rb +4 -20
- data/lib/chef/rest/rest_request.rb +2 -7
- data/lib/chef/role.rb +1 -97
- data/lib/chef/run_context.rb +108 -130
- data/lib/chef/run_context/cookbook_compiler.rb +280 -0
- data/lib/chef/run_list.rb +0 -2
- data/lib/chef/run_list/run_list_expansion.rb +0 -15
- data/lib/chef/run_lock.rb +90 -0
- data/lib/chef/runner.rb +28 -5
- data/lib/chef/sandbox.rb +15 -148
- data/lib/chef/scan_access_control.rb +2 -4
- data/lib/chef/shef/ext.rb +3 -575
- data/lib/chef/{shef.rb → shell.rb} +35 -40
- data/lib/chef/shell/ext.rb +593 -0
- data/lib/chef/{shef → shell}/model_wrapper.rb +3 -3
- data/lib/chef/{shef/shef_rest.rb → shell/shell_rest.rb} +4 -4
- data/lib/chef/{shef/shef_session.rb → shell/shell_session.rb} +17 -15
- data/lib/chef/shell_out.rb +7 -0
- data/lib/chef/util/windows/net_group.rb +1 -5
- data/lib/chef/version.rb +3 -3
- data/lib/chef/win32/api/process.rb +0 -1
- data/lib/chef/win32/handle.rb +1 -8
- data/lib/chef/win32/registry.rb +371 -0
- data/spec/data/big_json.json +1 -2
- data/spec/data/big_json_plus_one.json +1 -2
- data/spec/data/cookbooks/openldap/attributes/default.rb +10 -9
- data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
- data/spec/data/lwrp/providers/inline_compiler.rb +26 -0
- data/spec/data/nodes/default.rb +3 -3
- data/spec/data/nodes/test.example.com.rb +3 -3
- data/spec/data/nodes/test.rb +3 -3
- data/spec/data/partial_one.erb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +4 -0
- data/spec/data/run_context/cookbooks/circular-dep1/definitions/circular_dep1_res.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep1/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep1/metadata.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep1/providers/provider.rb +1 -0
- data/spec/data/{knife-home/.chef/plugins/knife/example_home_subcommand.rb → run_context/cookbooks/circular-dep1/recipes/default.rb} +0 -0
- data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/circular-dep2/definitions/circular_dep2_res.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep2/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep2/metadata.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep2/providers/provider.rb +1 -0
- data/spec/data/{lwrp_const_scoping/resources/conflict.rb → run_context/cookbooks/circular-dep2/recipes/default.rb} +0 -0
- data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +3 -0
- data/spec/data/run_context/cookbooks/dependency1/definitions/dependency1_res.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency1/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency1/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency1/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/dependency2/definitions/dependency2_res.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency2/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency2/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency2/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +3 -0
- data/spec/data/run_context/cookbooks/no-default-attr/definitions/no_default-attr_res.rb +1 -0
- data/spec/data/run_context/cookbooks/no-default-attr/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/no-default-attr/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/definitions/test_with-circular-deps_res.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/metadata.rb +2 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/test-with-deps/definitions/test_with-deps_res.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/libraries/lib.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/metadata.rb +3 -0
- data/spec/data/run_context/cookbooks/test-with-deps/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/test-with-deps/recipes/server.rb +0 -0
- data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/test/attributes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -1
- data/spec/data/run_context/cookbooks/test/definitions/test_res.rb +1 -0
- data/spec/data/run_context/cookbooks/test/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/test/resources/resource.rb +1 -0
- data/spec/data/shef-config.rb +7 -0
- data/spec/functional/dsl/registry_helper_spec.rb +63 -0
- data/spec/functional/knife/cookbook_delete_spec.rb +1 -1
- data/spec/functional/knife/exec_spec.rb +2 -2
- data/spec/functional/knife/ssh_spec.rb +5 -1
- data/spec/functional/resource/cookbook_file_spec.rb +7 -19
- data/spec/functional/resource/directory_spec.rb +4 -0
- data/spec/functional/resource/file_spec.rb +56 -22
- data/spec/functional/resource/link_spec.rb +2 -0
- data/spec/functional/resource/registry_spec.rb +576 -0
- data/spec/functional/resource/remote_directory_spec.rb +142 -36
- data/spec/functional/resource/remote_file_spec.rb +18 -0
- data/spec/functional/resource/template_spec.rb +23 -2
- data/spec/functional/run_lock_spec.rb +106 -0
- data/spec/functional/shell_spec.rb +100 -0
- data/spec/functional/win32/registry_helper_spec.rb +632 -0
- data/spec/spec_helper.rb +5 -29
- data/spec/stress/win32/security_spec.rb +1 -1
- data/spec/support/chef_helpers.rb +0 -2
- data/spec/support/platform_helpers.rb +8 -15
- data/spec/support/shared/functional/directory_resource.rb +84 -22
- data/spec/support/shared/functional/file_resource.rb +169 -71
- data/spec/support/shared/functional/securable_resource.rb +143 -119
- data/spec/support/shared/functional/securable_resource_with_reporting.rb +375 -0
- data/spec/support/shared/unit/file_system_support.rb +110 -0
- data/spec/support/shared/unit/platform_introspector.rb +162 -0
- data/spec/unit/api_client/registration_spec.rb +175 -0
- data/spec/unit/api_client_spec.rb +78 -156
- data/spec/unit/application/apply.rb +84 -0
- data/spec/unit/application/client_spec.rb +1 -37
- data/spec/unit/application/knife_spec.rb +5 -0
- data/spec/unit/application_spec.rb +57 -2
- data/spec/unit/checksum/storage/filesystem_spec.rb +1 -1
- data/spec/unit/chef_fs/diff_spec.rb +328 -0
- data/spec/unit/chef_fs/file_pattern_spec.rb +526 -0
- data/spec/unit/chef_fs/file_system/chef_server_root_dir_spec.rb +237 -0
- data/spec/unit/chef_fs/file_system/cookbooks_dir_spec.rb +568 -0
- data/spec/unit/chef_fs/file_system/data_bags_dir_spec.rb +220 -0
- data/spec/unit/chef_fs/file_system_spec.rb +136 -0
- data/spec/unit/client_spec.rb +124 -33
- data/spec/unit/config_spec.rb +46 -13
- data/spec/unit/cookbook/synchronizer_spec.rb +1 -49
- data/spec/unit/cookbook/syntax_check_spec.rb +48 -109
- data/spec/unit/cookbook_loader_spec.rb +153 -91
- data/spec/unit/cookbook_manifest_spec.rb +81 -81
- data/spec/unit/cookbook_spec.rb +3 -20
- data/spec/unit/cookbook_version_spec.rb +23 -122
- data/spec/unit/daemon_spec.rb +3 -24
- data/spec/unit/data_bag_spec.rb +6 -4
- data/spec/unit/digester_spec.rb +50 -0
- data/spec/unit/dsl/data_query_spec.rb +66 -0
- data/spec/unit/dsl/platform_introspection_spec.rb +130 -0
- data/spec/unit/dsl/regsitry_helper_spec.rb +55 -0
- data/spec/unit/encrypted_data_bag_item_spec.rb +50 -105
- data/spec/unit/environment_spec.rb +0 -130
- data/spec/unit/exceptions_spec.rb +2 -3
- data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +3 -3
- data/spec/unit/json_compat_spec.rb +15 -7
- data/spec/unit/knife/bootstrap_spec.rb +2 -0
- data/spec/unit/knife/configure_spec.rb +20 -14
- data/spec/unit/knife/cookbook_metadata_spec.rb +11 -4
- data/spec/unit/knife/cookbook_test_spec.rb +1 -0
- data/spec/unit/knife/cookbook_upload_spec.rb +43 -8
- data/spec/unit/knife/core/bootstrap_context_spec.rb +1 -1
- data/spec/unit/knife/core/ui_spec.rb +156 -125
- data/spec/unit/knife/data_bag_create_spec.rb +9 -0
- data/spec/unit/knife/data_bag_edit_spec.rb +1 -4
- data/spec/unit/knife/data_bag_from_file_spec.rb +4 -6
- data/spec/unit/knife/data_bag_show_spec.rb +11 -4
- data/spec/unit/knife/index_rebuild_spec.rb +96 -33
- data/spec/unit/knife/knife_help.rb +7 -7
- data/spec/unit/knife/node_edit_spec.rb +6 -33
- data/spec/unit/knife/node_run_list_remove_spec.rb +2 -1
- data/spec/unit/knife/ssh_spec.rb +12 -15
- data/spec/unit/knife/status_spec.rb +2 -2
- data/spec/unit/knife_spec.rb +53 -0
- data/spec/unit/lwrp_spec.rb +59 -42
- data/spec/unit/mixin/checksum_spec.rb +2 -2
- data/spec/unit/mixin/deep_merge_spec.rb +101 -799
- data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +6 -1
- data/spec/unit/mixin/params_validate_spec.rb +4 -37
- data/spec/unit/mixin/securable_spec.rb +5 -3
- data/spec/unit/mixin/template_spec.rb +119 -0
- data/spec/unit/node/attribute_spec.rb +195 -173
- data/spec/unit/node/immutable_collections_spec.rb +139 -0
- data/spec/unit/node_spec.rb +366 -370
- data/spec/unit/platform_spec.rb +9 -10
- data/spec/unit/provider/breakpoint_spec.rb +8 -8
- data/spec/unit/provider/cookbook_file_spec.rb +4 -8
- data/spec/unit/provider/directory_spec.rb +96 -64
- data/spec/unit/provider/env_spec.rb +2 -2
- data/spec/unit/provider/file_spec.rb +48 -39
- data/spec/unit/provider/group/dscl_spec.rb +0 -36
- data/spec/unit/provider/group/gpasswd_spec.rb +9 -16
- data/spec/unit/provider/group/groupadd_spec.rb +4 -3
- data/spec/unit/provider/group/groupmod_spec.rb +1 -0
- data/spec/unit/provider/group/pw_spec.rb +15 -12
- data/spec/unit/provider/group/usermod_spec.rb +6 -21
- data/spec/unit/provider/group/windows_spec.rb +8 -0
- data/spec/unit/provider/group_spec.rb +6 -28
- data/spec/unit/provider/http_request_spec.rb +28 -69
- data/spec/unit/provider/ifconfig_spec.rb +2 -2
- data/spec/unit/provider/ohai_spec.rb +4 -4
- data/spec/unit/provider/package/apt_spec.rb +0 -1
- data/spec/unit/provider/package/ips_spec.rb +0 -1
- data/spec/unit/provider/package/portage_spec.rb +0 -44
- data/spec/unit/provider/package/rpm_spec.rb +0 -12
- data/spec/unit/provider/package/rubygems_spec.rb +1 -44
- data/spec/unit/provider/package/yum_spec.rb +39 -36
- data/spec/unit/provider/package_spec.rb +7 -5
- data/spec/unit/provider/registry_key_spec.rb +269 -0
- data/spec/unit/provider/remote_directory_spec.rb +7 -3
- data/spec/unit/provider/remote_file_spec.rb +36 -0
- data/spec/unit/provider/route_spec.rb +4 -3
- data/spec/unit/provider/ruby_block_spec.rb +8 -0
- data/spec/unit/provider/service/arch_service_spec.rb +5 -5
- data/spec/unit/provider/service/debian_service_spec.rb +1 -1
- data/spec/unit/provider/service/freebsd_service_spec.rb +5 -5
- data/spec/unit/provider/service/init_service_spec.rb +27 -4
- data/spec/unit/provider/service/insserv_service_spec.rb +1 -1
- data/spec/unit/provider/service/invokercd_service_spec.rb +4 -4
- data/spec/unit/provider/service/macosx_spec.rb +11 -66
- data/spec/unit/provider/service/redhat_spec.rb +1 -1
- data/spec/unit/provider/service/simple_service_spec.rb +3 -3
- data/spec/unit/provider/service/upstart_service_spec.rb +9 -9
- data/spec/unit/provider/subversion_spec.rb +1 -1
- data/spec/unit/provider/template_spec.rb +35 -11
- data/spec/unit/provider/user/dscl_spec.rb +285 -681
- data/spec/unit/provider/user/useradd_spec.rb +1 -22
- data/spec/unit/provider/user_spec.rb +1 -1
- data/spec/unit/recipe_spec.rb +10 -8
- data/spec/unit/registry_helper_spec.rb +374 -0
- data/spec/unit/resource/mount_spec.rb +0 -11
- data/spec/unit/resource/registry_key_spec.rb +171 -0
- data/spec/unit/resource/remote_file_spec.rb +21 -23
- data/spec/unit/resource/ruby_block_spec.rb +7 -3
- data/spec/unit/resource/service_spec.rb +11 -0
- data/spec/unit/resource_spec.rb +4 -19
- data/spec/unit/rest/auth_credentials_spec.rb +2 -19
- data/spec/unit/rest_spec.rb +130 -284
- data/spec/unit/run_context/cookbook_compiler_spec.rb +181 -0
- data/spec/unit/run_context_spec.rb +18 -4
- data/spec/unit/run_list_spec.rb +0 -209
- data/spec/unit/run_lock_spec.rb +37 -0
- data/spec/unit/runner_spec.rb +101 -2
- data/spec/unit/scan_access_control_spec.rb +4 -4
- data/spec/unit/{shef → shell}/model_wrapper_spec.rb +5 -5
- data/spec/unit/{shef/shef_ext_spec.rb → shell/shell_ext_spec.rb} +21 -21
- data/spec/unit/{shef/shef_session_spec.rb → shell/shell_session_spec.rb} +14 -69
- data/spec/unit/shell_out_spec.rb +18 -0
- data/spec/unit/{shef_spec.rb → shell_spec.rb} +20 -20
- metadata +275 -234
- checksums.yaml +0 -15
- data/README.rdoc +0 -177
- data/distro/common/html/knife-recipe.1.html +0 -92
- data/lib/chef/certificate.rb +0 -161
- data/lib/chef/checksum.rb +0 -167
- data/lib/chef/checksum_cache.rb +0 -190
- data/lib/chef/cookbook_version_selector.rb +0 -168
- data/lib/chef/couchdb.rb +0 -246
- data/lib/chef/index_queue/amqp_client.rb +0 -116
- data/lib/chef/index_queue/consumer.rb +0 -76
- data/lib/chef/index_queue/indexable.rb +0 -109
- data/lib/chef/knife/bootstrap/ubuntu12.10-gems.erb +0 -60
- data/lib/chef/monkey_patches/moneta.rb +0 -50
- data/lib/chef/monkey_patches/uri.rb +0 -70
- data/lib/chef/openid_registration.rb +0 -187
- data/lib/chef/provider/user/solaris.rb +0 -90
- data/lib/chef/solr_query.rb +0 -187
- data/lib/chef/solr_query/lucene.treetop +0 -150
- data/lib/chef/solr_query/lucene_nodes.rb +0 -285
- data/lib/chef/solr_query/query_transform.rb +0 -65
- data/lib/chef/solr_query/solr_http_request.rb +0 -132
- data/lib/chef/webui_user.rb +0 -231
- data/spec/data/cookbooks/openldap/files/default/.dotfile +0 -1
- data/spec/data/cookbooks/openldap/files/default/.ssh/id_rsa +0 -1
- data/spec/data/cookbooks/openldap/files/default/remotedir/.a_dotdir/.a_dotfile_in_a_dotdir +0 -1
- data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/.a_dotfile +0 -1
- data/spec/data/mac_users/10.7-8.plist.xml +0 -559
- data/spec/data/mac_users/10.7-8.shadow.xml +0 -11
- data/spec/data/mac_users/10.7.plist.xml +0 -559
- data/spec/data/mac_users/10.7.shadow.xml +0 -11
- data/spec/data/mac_users/10.8.plist.xml +0 -559
- data/spec/data/mac_users/10.8.shadow.xml +0 -21
- data/spec/data/mac_users/10.9.plist.xml +0 -560
- data/spec/data/mac_users/10.9.shadow.xml +0 -21
- data/spec/functional/resource/base.rb +0 -40
- data/spec/functional/resource/group_spec.rb +0 -343
- data/spec/functional/resource/user/dscl_spec.rb +0 -199
- data/spec/unit/certificate_spec.rb +0 -76
- data/spec/unit/checksum_cache_spec.rb +0 -209
- data/spec/unit/checksum_spec.rb +0 -94
- data/spec/unit/couchdb_spec.rb +0 -274
- data/spec/unit/index_queue_spec.rb +0 -391
- data/spec/unit/mixin/language_spec.rb +0 -305
- data/spec/unit/openid_registration_spec.rb +0 -153
- data/spec/unit/provider/user/solaris_spec.rb +0 -414
- data/spec/unit/provider/whyrun_safe_ruby_block_spec.rb +0 -47
- data/spec/unit/solr_query/query_transform_spec.rb +0 -454
- data/spec/unit/solr_query/solr_http_request_spec.rb +0 -244
- data/spec/unit/solr_query_spec.rb +0 -203
- data/spec/unit/webui_user_spec.rb +0 -238
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require 'chef/chef_fs/knife'
|
|
2
|
+
require 'chef/chef_fs/file_system'
|
|
3
|
+
|
|
4
|
+
class Chef
|
|
5
|
+
class Knife
|
|
6
|
+
class Show < Chef::ChefFS::Knife
|
|
7
|
+
banner "knife show [PATTERN1 ... PATTERNn]"
|
|
8
|
+
|
|
9
|
+
common_options
|
|
10
|
+
|
|
11
|
+
def run
|
|
12
|
+
# Get the matches (recursively)
|
|
13
|
+
pattern_args.each do |pattern|
|
|
14
|
+
Chef::ChefFS::FileSystem.list(chef_fs, pattern) do |result|
|
|
15
|
+
if result.dir?
|
|
16
|
+
STDERR.puts "#{result.path_for_printing}: is a directory" if pattern.exact_path
|
|
17
|
+
else
|
|
18
|
+
begin
|
|
19
|
+
value = result.read
|
|
20
|
+
puts "#{result.path_for_printing}:"
|
|
21
|
+
output(format_for_display(value))
|
|
22
|
+
rescue Chef::ChefFS::FileSystem::NotFoundError
|
|
23
|
+
STDERR.puts "#{result.path_for_printing}: No such file or directory"
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
data/lib/chef/knife/ssh.rb
CHANGED
|
@@ -146,9 +146,9 @@ class Chef
|
|
|
146
146
|
if !config[:override_attribute] && item[:cloud] and item[:cloud][:public_hostname]
|
|
147
147
|
i = item[:cloud][:public_hostname]
|
|
148
148
|
elsif config[:override_attribute]
|
|
149
|
-
i =
|
|
149
|
+
i = extract_nested_value(item, config[:override_attribute])
|
|
150
150
|
else
|
|
151
|
-
i =
|
|
151
|
+
i = extract_nested_value(item, config[:attribute])
|
|
152
152
|
end
|
|
153
153
|
# next if we couldn't find the specified attribute in the returned node object
|
|
154
154
|
next if i.nil?
|
|
@@ -415,6 +415,10 @@ class Chef
|
|
|
415
415
|
Chef::Config[:knife][:ssh_identity_file])
|
|
416
416
|
end
|
|
417
417
|
|
|
418
|
+
def extract_nested_value(data_structure, path_spec)
|
|
419
|
+
ui.presenter.extract_nested_value(data_structure, path_spec)
|
|
420
|
+
end
|
|
421
|
+
|
|
418
422
|
def run
|
|
419
423
|
extend Chef::Mixin::Command
|
|
420
424
|
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
require 'chef/chef_fs/knife'
|
|
2
|
+
require 'chef/chef_fs/command_line'
|
|
3
|
+
|
|
4
|
+
class Chef
|
|
5
|
+
class Knife
|
|
6
|
+
class Upload < Chef::ChefFS::Knife
|
|
7
|
+
banner "knife upload PATTERNS"
|
|
8
|
+
|
|
9
|
+
common_options
|
|
10
|
+
|
|
11
|
+
option :recurse,
|
|
12
|
+
:long => '--[no-]recurse',
|
|
13
|
+
:boolean => true,
|
|
14
|
+
:default => true,
|
|
15
|
+
:description => "List directories recursively."
|
|
16
|
+
|
|
17
|
+
option :purge,
|
|
18
|
+
:long => '--[no-]purge',
|
|
19
|
+
:boolean => true,
|
|
20
|
+
:default => false,
|
|
21
|
+
:description => "Delete matching local files and directories that do not exist remotely."
|
|
22
|
+
|
|
23
|
+
option :force,
|
|
24
|
+
:long => '--[no-]force',
|
|
25
|
+
:boolean => true,
|
|
26
|
+
:default => false,
|
|
27
|
+
:description => "Force upload of files even if they match (quicker and harmless, but doesn't print out what it changed)"
|
|
28
|
+
|
|
29
|
+
option :dry_run,
|
|
30
|
+
:long => '--dry-run',
|
|
31
|
+
:short => '-n',
|
|
32
|
+
:boolean => true,
|
|
33
|
+
:default => false,
|
|
34
|
+
:description => "Don't take action, only print what would happen"
|
|
35
|
+
|
|
36
|
+
def run
|
|
37
|
+
if name_args.length == 0
|
|
38
|
+
show_usage
|
|
39
|
+
ui.fatal("Must specify at least one argument. If you want to upload everything in this directory, type \"knife upload .\"")
|
|
40
|
+
exit 1
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
pattern_args.each do |pattern|
|
|
44
|
+
Chef::ChefFS::FileSystem.copy_to(pattern, local_fs, chef_fs, config[:recurse] ? nil : 1, config)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
data/lib/chef/mixin/checksum.rb
CHANGED
|
@@ -17,16 +17,16 @@
|
|
|
17
17
|
#
|
|
18
18
|
|
|
19
19
|
require 'digest/sha2'
|
|
20
|
-
require 'chef/
|
|
20
|
+
require 'chef/digester'
|
|
21
21
|
|
|
22
22
|
class Chef
|
|
23
23
|
module Mixin
|
|
24
24
|
module Checksum
|
|
25
25
|
|
|
26
26
|
def checksum(file)
|
|
27
|
-
Chef::
|
|
27
|
+
Chef::Digester.checksum_for_file(file)
|
|
28
28
|
end
|
|
29
|
-
|
|
29
|
+
|
|
30
30
|
end
|
|
31
31
|
end
|
|
32
32
|
end
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
9
9
|
# you may not use this file except in compliance with the License.
|
|
10
10
|
# You may obtain a copy of the License at
|
|
11
|
-
#
|
|
11
|
+
#
|
|
12
12
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
13
|
-
#
|
|
13
|
+
#
|
|
14
14
|
# Unless required by applicable law or agreed to in writing, software
|
|
15
15
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
16
16
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
@@ -26,20 +26,25 @@ class Chef
|
|
|
26
26
|
# deep_merge is available under the MIT license from
|
|
27
27
|
# http://trac.misuse.org/science/wiki/DeepMerge
|
|
28
28
|
module DeepMerge
|
|
29
|
-
extend self
|
|
30
29
|
|
|
31
|
-
|
|
32
|
-
first = Mash.new(first) unless first.kind_of?(Mash)
|
|
33
|
-
second = Mash.new(second) unless second.kind_of?(Mash)
|
|
30
|
+
class InvalidSubtractiveMerge < ArgumentError; end
|
|
34
31
|
|
|
35
|
-
DeepMerge.deep_merge(second, first, {:preserve_unmergeables => false})
|
|
36
|
-
end
|
|
37
32
|
|
|
38
|
-
|
|
33
|
+
OLD_KNOCKOUT_PREFIX = "!merge:".freeze
|
|
34
|
+
|
|
35
|
+
# Regex to match the "knockout prefix" that was used to indicate
|
|
36
|
+
# subtractive merging in Chef 10.x and previous. Subtractive merging is
|
|
37
|
+
# removed as of Chef 11, but we detect attempted use of it and raise an
|
|
38
|
+
# error (see: raise_if_knockout_used!)
|
|
39
|
+
OLD_KNOCKOUT_MATCH = %r[!merge].freeze
|
|
40
|
+
|
|
41
|
+
extend self
|
|
42
|
+
|
|
43
|
+
def merge(first, second)
|
|
39
44
|
first = Mash.new(first) unless first.kind_of?(Mash)
|
|
40
45
|
second = Mash.new(second) unless second.kind_of?(Mash)
|
|
41
46
|
|
|
42
|
-
DeepMerge.deep_merge(second, first
|
|
47
|
+
DeepMerge.deep_merge(second, first)
|
|
43
48
|
end
|
|
44
49
|
|
|
45
50
|
# Inherited roles use the knockout_prefix array subtraction functionality
|
|
@@ -48,7 +53,7 @@ class Chef
|
|
|
48
53
|
first = Mash.new(first) unless first.kind_of?(Mash)
|
|
49
54
|
second = Mash.new(second) unless second.kind_of?(Mash)
|
|
50
55
|
|
|
51
|
-
DeepMerge.deep_merge(second, first
|
|
56
|
+
DeepMerge.deep_merge(second, first)
|
|
52
57
|
end
|
|
53
58
|
|
|
54
59
|
class InvalidParameter < StandardError; end
|
|
@@ -67,217 +72,70 @@ class Chef
|
|
|
67
72
|
# Results: {:x => [1,2,3,4,5,'6'], :y => 2}
|
|
68
73
|
# By default, "deep_merge!" will overwrite any unmergeables and merge everything else.
|
|
69
74
|
# To avoid this, use "deep_merge" (no bang/exclamation mark)
|
|
70
|
-
|
|
71
|
-
# Options:
|
|
72
|
-
# Options are specified in the last parameter passed, which should be in hash format:
|
|
73
|
-
# hash.deep_merge!({:x => [1,2]}, {:knockout_prefix => '!merge'})
|
|
74
|
-
# :preserve_unmergeables DEFAULT: false
|
|
75
|
-
# Set to true to skip any unmergeable elements from source
|
|
76
|
-
# :knockout_prefix DEFAULT: nil
|
|
77
|
-
# Set to string value to signify prefix which deletes elements from existing element
|
|
78
|
-
# A colon is appended when indicating a specific value, eg:
|
|
79
|
-
# :knockout_prefix => "dontmerge", is referenced as "dontmerge:foobar" in an array
|
|
80
|
-
# :sort_merged_arrays DEFAULT: false
|
|
81
|
-
# Set to true to sort all arrays that are merged together
|
|
82
|
-
# :unpack_arrays DEFAULT: nil
|
|
83
|
-
# Set to string value to run "Array::join" then "String::split" against all arrays
|
|
84
|
-
# :merge_debug DEFAULT: false
|
|
85
|
-
# Set to true to get console output of merge process for debugging
|
|
86
|
-
#
|
|
87
|
-
# Selected Options Details:
|
|
88
|
-
# :knockout_prefix => The purpose of this is to provide a way to remove elements
|
|
89
|
-
# from existing Hash by specifying them in a special way in incoming hash
|
|
90
|
-
# source = {:x => ['!merge:1', '2']}
|
|
91
|
-
# dest = {:x => ['1', '3']}
|
|
92
|
-
# dest.ko_deep_merge!(source)
|
|
93
|
-
# Results: {:x => ['2','3']}
|
|
94
|
-
# Additionally, if the knockout_prefix is passed alone as a string, it will cause
|
|
95
|
-
# the entire element to be removed:
|
|
96
|
-
# source = {:x => '!merge'}
|
|
97
|
-
# dest = {:x => [1,2,3]}
|
|
98
|
-
# dest.ko_deep_merge!(source)
|
|
99
|
-
# Results: {:x => ""}
|
|
100
|
-
# :unpack_arrays => The purpose of this is to permit compound elements to be passed
|
|
101
|
-
# in as strings and to be converted into discrete array elements
|
|
102
|
-
# irsource = {:x => ['1,2,3', '4']}
|
|
103
|
-
# dest = {:x => ['5','6','7,8']}
|
|
104
|
-
# dest.deep_merge!(source, {:unpack_arrays => ','})
|
|
105
|
-
# Results: {:x => ['1','2','3','4','5','6','7','8'}
|
|
106
|
-
# Why: If receiving data from an HTML form, this makes it easy for a checkbox
|
|
107
|
-
# to pass multiple values from within a single HTML element
|
|
108
|
-
#
|
|
109
|
-
# There are many tests for this library - and you can learn more about the features
|
|
110
|
-
# and usages of deep_merge! by just browsing the test examples
|
|
111
|
-
def deep_merge!(source, dest, options = {})
|
|
112
|
-
# turn on this line for stdout debugging text
|
|
113
|
-
merge_debug = options[:merge_debug] || false
|
|
114
|
-
overwrite_unmergeable = !options[:preserve_unmergeables]
|
|
115
|
-
knockout_prefix = options[:knockout_prefix] || nil
|
|
116
|
-
raise InvalidParameter, "knockout_prefix cannot be an empty string in deep_merge!" if knockout_prefix == ""
|
|
117
|
-
raise InvalidParameter, "overwrite_unmergeable must be true if knockout_prefix is specified in deep_merge!" if knockout_prefix && !overwrite_unmergeable
|
|
118
|
-
# if present: we will split and join arrays on this char before merging
|
|
119
|
-
array_split_char = options[:unpack_arrays] || false
|
|
120
|
-
# request that we sort together any arrays when they are merged
|
|
121
|
-
sort_merged_arrays = options[:sort_merged_arrays] || false
|
|
122
|
-
di = options[:debug_indent] || ''
|
|
123
|
-
# do nothing if source is nil
|
|
124
|
-
return dest if source.nil?
|
|
75
|
+
def deep_merge!(source, dest)
|
|
125
76
|
# if dest doesn't exist, then simply copy source to it
|
|
126
|
-
if dest.nil?
|
|
77
|
+
if dest.nil?
|
|
127
78
|
dest = source; return dest
|
|
128
79
|
end
|
|
129
80
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
81
|
+
raise_if_knockout_used!(source)
|
|
82
|
+
raise_if_knockout_used!(dest)
|
|
83
|
+
case source
|
|
84
|
+
when nil
|
|
85
|
+
dest
|
|
86
|
+
when Hash
|
|
133
87
|
source.each do |src_key, src_value|
|
|
134
88
|
if dest.kind_of?(Hash)
|
|
135
|
-
puts "#{di} looping: #{src_key.inspect} => #{src_value.inspect} :: #{dest.inspect}" if merge_debug
|
|
136
89
|
if dest[src_key]
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
# NOTE: We are doing this via deep_merge! because the
|
|
142
|
-
# src_value can still contain merge directives such as
|
|
143
|
-
# knockout_prefix.
|
|
144
|
-
# Historically we have been dup'ing the src_value here
|
|
145
|
-
# and merging src_value with src_value.dup. This logic
|
|
146
|
-
# is not applicable anymore because it results in
|
|
147
|
-
# duplicates when merging two array values with
|
|
148
|
-
# :horizontal_precedence = true.
|
|
149
|
-
if src_value.nil?
|
|
150
|
-
# Nothing to compute with an extra deep_merge!
|
|
151
|
-
dest[src_key] = src_value
|
|
152
|
-
else
|
|
153
|
-
dest[src_key] = deep_merge!(src_value, { }, options.merge(:debug_indent => di + ' '))
|
|
154
|
-
end
|
|
155
|
-
end
|
|
156
|
-
else # dest isn't a hash, so we overwrite it completely (if permitted)
|
|
157
|
-
if overwrite_unmergeable
|
|
158
|
-
puts "#{di} overwriting dest: #{src_key.inspect} => #{src_value.inspect} -over-> #{dest.inspect}" if merge_debug
|
|
159
|
-
dest = overwrite_unmergeables(source, dest, options)
|
|
90
|
+
dest[src_key] = deep_merge!(src_value, dest[src_key])
|
|
91
|
+
else # dest[src_key] doesn't exist so we take whatever source has
|
|
92
|
+
raise_if_knockout_used!(src_value)
|
|
93
|
+
dest[src_key] = src_value
|
|
160
94
|
end
|
|
95
|
+
else # dest isn't a hash, so we overwrite it completely
|
|
96
|
+
dest = source
|
|
161
97
|
end
|
|
162
98
|
end
|
|
163
|
-
|
|
164
|
-
puts "#{di}Arrays: #{source.inspect} :: #{dest.inspect}" if merge_debug
|
|
165
|
-
# if we are instructed, join/split any source arrays before processing
|
|
166
|
-
if array_split_char
|
|
167
|
-
puts "#{di} split/join on source: #{source.inspect}" if merge_debug
|
|
168
|
-
source = source.join(array_split_char).split(array_split_char)
|
|
169
|
-
if dest.kind_of?(Array)
|
|
170
|
-
dest = dest.join(array_split_char).split(array_split_char)
|
|
171
|
-
end
|
|
172
|
-
end
|
|
173
|
-
# if there's a naked knockout_prefix in source, that means we are to truncate dest
|
|
174
|
-
ko_variants = [ knockout_prefix, "#{knockout_prefix}:" ]
|
|
175
|
-
ko_variants.each do |ko|
|
|
176
|
-
if source.index(ko)
|
|
177
|
-
dest = clear_or_nil(dest); source.delete(ko)
|
|
178
|
-
end
|
|
179
|
-
end
|
|
99
|
+
when Array
|
|
180
100
|
if dest.kind_of?(Array)
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
source.delete_if do |ko_item|
|
|
185
|
-
retval = false
|
|
186
|
-
item = ko_item.respond_to?(:gsub) ? ko_item.gsub(%r{^#{knockout_prefix}:}, "") : ko_item
|
|
187
|
-
if item != ko_item
|
|
188
|
-
print "#{ko_item} - " if merge_debug
|
|
189
|
-
dest.delete(item)
|
|
190
|
-
dest.delete(ko_item)
|
|
191
|
-
retval = true
|
|
192
|
-
end
|
|
193
|
-
retval
|
|
194
|
-
end
|
|
195
|
-
puts if merge_debug
|
|
196
|
-
end
|
|
197
|
-
puts "#{di} merging arrays: #{source.inspect} :: #{dest.inspect}" if merge_debug
|
|
198
|
-
# Behavior of merging arrays has changed with CHEF-4631.
|
|
199
|
-
# Old behavior was to deduplicate and merge the
|
|
200
|
-
# arrays. New behavior is to concatanate the arrays if the
|
|
201
|
-
# merge is happening on the same attribute precedence
|
|
202
|
-
# level and pick the value from the higher precedence
|
|
203
|
-
# level if merge is being done across the precedence
|
|
204
|
-
# levels.
|
|
205
|
-
# Old behavior can still be used by setting
|
|
206
|
-
# :deep_merge_array_concat to false in config.
|
|
207
|
-
if Chef::Config[:deep_merge_array_concat]
|
|
208
|
-
# If :horizontal_precedence is set, this means we are
|
|
209
|
-
# merging two arrays at the same precendence level so
|
|
210
|
-
# concatanate them. Otherwise this is a merge across
|
|
211
|
-
# precedence levels which means we will pick the one
|
|
212
|
-
# from higher precedence level.
|
|
213
|
-
if options[:horizontal_precedence]
|
|
214
|
-
dest += source
|
|
215
|
-
else
|
|
216
|
-
dest = source
|
|
217
|
-
end
|
|
218
|
-
else
|
|
219
|
-
# Pre CHEF-4631 behavior for array merging
|
|
220
|
-
dest = dest | source
|
|
221
|
-
end
|
|
222
|
-
dest.sort! if sort_merged_arrays
|
|
223
|
-
elsif overwrite_unmergeable
|
|
224
|
-
puts "#{di} overwriting dest: #{source.inspect} -over-> #{dest.inspect}" if merge_debug
|
|
225
|
-
dest = overwrite_unmergeables(source, dest, options)
|
|
101
|
+
dest = dest | source
|
|
102
|
+
else
|
|
103
|
+
dest = source
|
|
226
104
|
end
|
|
105
|
+
when String
|
|
106
|
+
dest = source
|
|
227
107
|
else # src_hash is not an array or hash, so we'll have to overwrite dest
|
|
228
|
-
|
|
229
|
-
dest = overwrite_unmergeables(source, dest, options)
|
|
108
|
+
dest = source
|
|
230
109
|
end
|
|
231
|
-
puts "#{di}Returning #{dest.inspect}" if merge_debug
|
|
232
110
|
dest
|
|
233
111
|
end # deep_merge!
|
|
234
112
|
|
|
235
|
-
#
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
if knockout_prefix && overwrite_unmergeable
|
|
242
|
-
if source.kind_of?(String) # remove knockout string from source before overwriting dest
|
|
243
|
-
if source == knockout_prefix
|
|
244
|
-
src_tmp = ""
|
|
245
|
-
else
|
|
246
|
-
src_tmp = source.gsub(%r{^#{knockout_prefix}:},"")
|
|
247
|
-
end
|
|
248
|
-
elsif source.kind_of?(Array) # remove all knockout elements before overwriting dest
|
|
249
|
-
src_tmp = source.delete_if {|ko_item| ko_item.kind_of?(String) && ko_item.match(%r{^#{knockout_prefix}:}) }
|
|
250
|
-
else
|
|
251
|
-
src_tmp = source
|
|
252
|
-
end
|
|
253
|
-
if src_tmp == source # if we didn't find a knockout_prefix then we just overwrite dest
|
|
254
|
-
puts "#{di}#{src_tmp.inspect} -over-> #{dest.inspect}" if merge_debug
|
|
255
|
-
dest = src_tmp
|
|
256
|
-
else # if we do find a knockout_prefix, then we just delete dest
|
|
257
|
-
puts "#{di}\"\" -over-> #{dest.inspect}" if merge_debug
|
|
258
|
-
dest = ""
|
|
259
|
-
end
|
|
260
|
-
elsif overwrite_unmergeable
|
|
261
|
-
dest = source
|
|
113
|
+
# Checks for attempted use of subtractive merge, which was removed for
|
|
114
|
+
# Chef 11.0. If subtractive merge use is detected, will raise an
|
|
115
|
+
# InvalidSubtractiveMerge exception.
|
|
116
|
+
def raise_if_knockout_used!(obj)
|
|
117
|
+
if uses_knockout?(obj)
|
|
118
|
+
raise InvalidSubtractiveMerge, "subtractive merge with !merge is no longer supported"
|
|
262
119
|
end
|
|
263
|
-
dest
|
|
264
|
-
end
|
|
265
|
-
|
|
266
|
-
def deep_merge(source, dest, options = {})
|
|
267
|
-
deep_merge!(source.dup, dest.dup, options)
|
|
268
120
|
end
|
|
269
121
|
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
122
|
+
# Checks for attempted use of subtractive merge in +obj+.
|
|
123
|
+
def uses_knockout?(obj)
|
|
124
|
+
case obj
|
|
125
|
+
when String
|
|
126
|
+
obj =~ OLD_KNOCKOUT_MATCH
|
|
127
|
+
when Array
|
|
128
|
+
obj.any? {|element| element.respond_to?(:gsub) && element =~ OLD_KNOCKOUT_MATCH }
|
|
273
129
|
else
|
|
274
|
-
|
|
130
|
+
false
|
|
275
131
|
end
|
|
276
|
-
obj
|
|
277
132
|
end
|
|
278
133
|
|
|
279
|
-
|
|
134
|
+
def deep_merge(source, dest)
|
|
135
|
+
deep_merge!(source.dup, dest.dup)
|
|
136
|
+
end
|
|
280
137
|
|
|
138
|
+
end
|
|
281
139
|
end
|
|
282
140
|
end
|
|
283
141
|
|
data/lib/chef/mixin/language.rb
CHANGED
|
@@ -16,233 +16,20 @@
|
|
|
16
16
|
# limitations under the License.
|
|
17
17
|
#
|
|
18
18
|
|
|
19
|
-
require 'chef/
|
|
20
|
-
require 'chef/
|
|
21
|
-
require 'chef/data_bag_item'
|
|
22
|
-
require 'chef/encrypted_data_bag_item'
|
|
19
|
+
require 'chef/dsl/platform_introspection'
|
|
20
|
+
require 'chef/dsl/data_query'
|
|
23
21
|
|
|
24
22
|
class Chef
|
|
25
23
|
module Mixin
|
|
26
|
-
module Language
|
|
27
|
-
|
|
28
|
-
# Implementation class for determining platform dependent values
|
|
29
|
-
class PlatformDependentValue
|
|
30
|
-
|
|
31
|
-
# Create a platform dependent value object.
|
|
32
|
-
# === Arguments
|
|
33
|
-
# platform_hash (Hash) a hash of the same structure as Chef::Platform,
|
|
34
|
-
# like this:
|
|
35
|
-
# {
|
|
36
|
-
# :debian => {:default => 'the value for all debian'}
|
|
37
|
-
# [:centos, :redhat, :fedora] => {:default => "value for all EL variants"}
|
|
38
|
-
# :ubuntu => { :default => "default for ubuntu", '10.04' => "value for 10.04 only"},
|
|
39
|
-
# :default => "the default when nothing else matches"
|
|
40
|
-
# }
|
|
41
|
-
# * platforms can be specified as Symbols or Strings
|
|
42
|
-
# * multiple platforms can be grouped by using an Array as the key
|
|
43
|
-
# * values for platforms need to be Hashes of the form:
|
|
44
|
-
# {platform_version => value_for_that_version}
|
|
45
|
-
# * the exception to the above is the default value, which is given as
|
|
46
|
-
# :default => default_value
|
|
47
|
-
def initialize(platform_hash)
|
|
48
|
-
@values = {}
|
|
49
|
-
platform_hash.each { |platforms, value| set(platforms, value)}
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def value_for_node(node)
|
|
53
|
-
platform, version = node[:platform].to_s, node[:platform_version].to_s
|
|
54
|
-
if @values.key?(platform) && @values[platform].key?(version)
|
|
55
|
-
@values[platform][version]
|
|
56
|
-
elsif @values.key?(platform) && @values[platform].key?("default")
|
|
57
|
-
@values[platform]["default"]
|
|
58
|
-
elsif @values.key?("default")
|
|
59
|
-
@values["default"]
|
|
60
|
-
else
|
|
61
|
-
nil
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
private
|
|
66
|
-
|
|
67
|
-
def set(platforms, value)
|
|
68
|
-
if platforms.to_s == 'default'
|
|
69
|
-
@values["default"] = value
|
|
70
|
-
else
|
|
71
|
-
assert_valid_platform_values!(platforms, value)
|
|
72
|
-
Array(platforms).each { |platform| @values[platform.to_s] = normalize_keys(value)}
|
|
73
|
-
value
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
def normalize_keys(hash)
|
|
78
|
-
hash.inject({}) do |h, key_value|
|
|
79
|
-
keys, value = *key_value
|
|
80
|
-
Array(keys).each do |key|
|
|
81
|
-
h[key.to_s] = value
|
|
82
|
-
end
|
|
83
|
-
h
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
def assert_valid_platform_values!(platforms, value)
|
|
88
|
-
unless value.kind_of?(Hash)
|
|
89
|
-
msg = "platform dependent values must be specified in the format :platform => {:version => value} "
|
|
90
|
-
msg << "you gave a value #{value.inspect} for platform(s) #{platforms}"
|
|
91
|
-
raise ArgumentError, msg
|
|
92
|
-
end
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
# Given a hash similar to the one we use for Platforms, select a value from the hash. Supports
|
|
99
|
-
# per platform defaults, along with a single base default. Arrays may be passed as hash keys and
|
|
100
|
-
# will be expanded.
|
|
101
|
-
#
|
|
102
|
-
# === Parameters
|
|
103
|
-
# platform_hash:: A platform-style hash.
|
|
104
|
-
#
|
|
105
|
-
# === Returns
|
|
106
|
-
# value:: Whatever the most specific value of the hash is.
|
|
107
|
-
def value_for_platform(platform_hash)
|
|
108
|
-
PlatformDependentValue.new(platform_hash).value_for_node(node)
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
# Given a list of platforms, returns true if the current recipe is being run on a node with
|
|
112
|
-
# that platform, false otherwise.
|
|
113
|
-
#
|
|
114
|
-
# === Parameters
|
|
115
|
-
# args:: A list of platforms. Each platform can be in string or symbol format.
|
|
116
|
-
#
|
|
117
|
-
# === Returns
|
|
118
|
-
# true:: If the current platform is in the list
|
|
119
|
-
# false:: If the current platform is not in the list
|
|
120
|
-
def platform?(*args)
|
|
121
|
-
has_platform = false
|
|
122
24
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
# Implementation class for determining platform family dependent values
|
|
133
|
-
class PlatformFamilyDependentValue
|
|
134
|
-
|
|
135
|
-
# Create a platform family dependent value object.
|
|
136
|
-
# === Arguments
|
|
137
|
-
# platform_family_hash (Hash) a map of platform families to values.
|
|
138
|
-
# like this:
|
|
139
|
-
# {
|
|
140
|
-
# :rhel => "value for all EL variants"
|
|
141
|
-
# :fedora => "value for fedora variants fedora and amazon" ,
|
|
142
|
-
# [:fedora, :rhel] => "value for all known redhat variants"
|
|
143
|
-
# :debian => "value for debian variants including debian, ubuntu, mint" ,
|
|
144
|
-
# :default => "the default when nothing else matches"
|
|
145
|
-
# }
|
|
146
|
-
# * platform families can be specified as Symbols or Strings
|
|
147
|
-
# * multiple platform families can be grouped by using an Array as the key
|
|
148
|
-
# * values for platform families can be any object, with no restrictions. Some examples:
|
|
149
|
-
# - [:stop, :start]
|
|
150
|
-
# - "mysql-devel"
|
|
151
|
-
# - { :key => "value" }
|
|
152
|
-
def initialize(platform_family_hash)
|
|
153
|
-
@values = {}
|
|
154
|
-
@values["default"] = nil
|
|
155
|
-
platform_family_hash.each { |platform_families, value| set(platform_families, value)}
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
def value_for_node(node)
|
|
159
|
-
if node.key?(:platform_family)
|
|
160
|
-
platform_family = node[:platform_family].to_s
|
|
161
|
-
if @values.key?(platform_family)
|
|
162
|
-
@values[platform_family]
|
|
163
|
-
else
|
|
164
|
-
@values["default"]
|
|
165
|
-
end
|
|
166
|
-
else
|
|
167
|
-
@values["default"]
|
|
168
|
-
end
|
|
169
|
-
end
|
|
170
|
-
|
|
171
|
-
private
|
|
172
|
-
|
|
173
|
-
def set(platform_family, value)
|
|
174
|
-
if platform_family.to_s == 'default'
|
|
175
|
-
@values["default"] = value
|
|
176
|
-
else
|
|
177
|
-
Array(platform_family).each { |family| @values[family.to_s] = value }
|
|
178
|
-
value
|
|
179
|
-
end
|
|
180
|
-
end
|
|
181
|
-
end
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
# Given a hash mapping platform families to values, select a value from the hash. Supports a single
|
|
185
|
-
# base default if platform family is not in the map. Arrays may be passed as hash keys and will be
|
|
186
|
-
# expanded.
|
|
187
|
-
#
|
|
188
|
-
# === Parameters
|
|
189
|
-
# platform_family_hash:: A hash in the form { platform_family_name => value }
|
|
190
|
-
#
|
|
191
|
-
# === Returns
|
|
192
|
-
# value:: Whatever the most specific value of the hash is.
|
|
193
|
-
def value_for_platform_family(platform_family_hash)
|
|
194
|
-
PlatformFamilyDependentValue.new(platform_family_hash).value_for_node(node)
|
|
195
|
-
end
|
|
196
|
-
|
|
197
|
-
# Given a list of platform families, returns true if the current recipe is being run on a
|
|
198
|
-
# node within that platform family, false otherwise.
|
|
199
|
-
#
|
|
200
|
-
# === Parameters
|
|
201
|
-
# args:: A list of platform families. Each platform family can be in string or symbol format.
|
|
202
|
-
#
|
|
203
|
-
# === Returns
|
|
204
|
-
# true:: if the current node platform family is in the list.
|
|
205
|
-
# false:: if the current node platform family is not in the list.
|
|
206
|
-
def platform_family?(*args)
|
|
207
|
-
has_pf = false
|
|
208
|
-
args.flatten.each do |platform_family|
|
|
209
|
-
has_pf = true if platform_family.to_s == node[:platform_family]
|
|
210
|
-
end
|
|
211
|
-
has_pf
|
|
212
|
-
end
|
|
213
|
-
|
|
214
|
-
def search(*args, &block)
|
|
215
|
-
# If you pass a block, or have at least the start argument, do raw result parsing
|
|
216
|
-
#
|
|
217
|
-
# Otherwise, do the iteration for the end user
|
|
218
|
-
if Kernel.block_given? || args.length >= 4
|
|
219
|
-
Chef::Search::Query.new.search(*args, &block)
|
|
220
|
-
else
|
|
221
|
-
results = Array.new
|
|
222
|
-
Chef::Search::Query.new.search(*args) do |o|
|
|
223
|
-
results << o
|
|
224
|
-
end
|
|
225
|
-
results
|
|
226
|
-
end
|
|
227
|
-
end
|
|
228
|
-
|
|
229
|
-
def data_bag(bag)
|
|
230
|
-
DataBag.validate_name!(bag.to_s)
|
|
231
|
-
rbag = DataBag.load(bag)
|
|
232
|
-
rbag.keys
|
|
233
|
-
rescue Exception
|
|
234
|
-
Log.error("Failed to list data bag items in data bag: #{bag.inspect}")
|
|
235
|
-
raise
|
|
236
|
-
end
|
|
25
|
+
# == [DEPRECATED] Chef::Mixin::Language
|
|
26
|
+
# This module is deprecated and remains only for backwards compatibility.
|
|
27
|
+
#
|
|
28
|
+
# See Chef::DSL::PlatformIntrospection and Chef::DSL::DataQuery
|
|
29
|
+
module Language
|
|
237
30
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
DataBagItem.validate_id!(item)
|
|
241
|
-
DataBagItem.load(bag, item)
|
|
242
|
-
rescue Exception
|
|
243
|
-
Log.error("Failed to load data bag item: #{bag.inspect} #{item.inspect}")
|
|
244
|
-
raise
|
|
245
|
-
end
|
|
31
|
+
include Chef::DSL::PlatformIntrospection
|
|
32
|
+
include Chef::DSL::DataQuery
|
|
246
33
|
|
|
247
34
|
end
|
|
248
35
|
end
|