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
|
@@ -27,13 +27,18 @@ describe Chef::Mixin::EnforceOwnershipAndPermissions do
|
|
|
27
27
|
@node.name "make_believe"
|
|
28
28
|
@events = Chef::EventDispatch::Dispatcher.new
|
|
29
29
|
@run_context = Chef::RunContext.new(@node, {}, @events)
|
|
30
|
-
@
|
|
30
|
+
@tmpdir = Dir.mktmpdir
|
|
31
|
+
@resource = Chef::Resource::File.new("#{@tmpdir}/madeup.txt")
|
|
31
32
|
FileUtils.touch @resource.path
|
|
32
33
|
@resource.owner "adam"
|
|
33
34
|
@provider = Chef::Provider::File.new(@resource, @run_context)
|
|
34
35
|
@provider.current_resource = @resource
|
|
35
36
|
end
|
|
36
37
|
|
|
38
|
+
after(:each) do
|
|
39
|
+
FileUtils.rm_rf(@tmpdir)
|
|
40
|
+
end
|
|
41
|
+
|
|
37
42
|
it "should call set_all on the file access control object" do
|
|
38
43
|
Chef::FileAccessControl.any_instance.should_receive(:set_all)
|
|
39
44
|
@provider.enforce_ownership_and_permissions
|
|
@@ -330,10 +330,12 @@ describe Chef::Mixin::ParamsValidate do
|
|
|
330
330
|
|
|
331
331
|
it "asserts that a value returns false from a predicate method" do
|
|
332
332
|
lambda do
|
|
333
|
-
@vo.validate({:not_blank => "should pass"},
|
|
333
|
+
@vo.validate({:not_blank => "should pass"},
|
|
334
|
+
{:not_blank => {:cannot_be => :nil, :cannot_be => :empty}})
|
|
334
335
|
end.should_not raise_error
|
|
335
336
|
lambda do
|
|
336
|
-
@vo.validate({:not_blank => ""},
|
|
337
|
+
@vo.validate({:not_blank => ""},
|
|
338
|
+
{:not_blank => {:cannot_be => :nil, :cannot_be => :empty}})
|
|
337
339
|
end.should raise_error(Chef::Exceptions::ValidationFailed)
|
|
338
340
|
end
|
|
339
341
|
|
|
@@ -366,40 +368,5 @@ describe Chef::Mixin::ParamsValidate do
|
|
|
366
368
|
@vo.set_or_return(:name, value, { }).object_id.should == value.object_id
|
|
367
369
|
@vo.set_or_return(:foo, nil, { :name_attribute => true }).object_id.should == value.object_id
|
|
368
370
|
end
|
|
369
|
-
|
|
370
|
-
it "should allow DelayedEvaluator instance to be set for value regardless of restriction" do
|
|
371
|
-
value = Chef::DelayedEvaluator.new{ 'test' }
|
|
372
|
-
@vo.set_or_return(:test, value, {:kind_of => Numeric})
|
|
373
|
-
end
|
|
374
|
-
|
|
375
|
-
it "should raise an error when delayed evaluated attribute is not valid" do
|
|
376
|
-
value = Chef::DelayedEvaluator.new{ 'test' }
|
|
377
|
-
@vo.set_or_return(:test, value, {:kind_of => Numeric})
|
|
378
|
-
lambda do
|
|
379
|
-
@vo.set_or_return(:test, nil, {:kind_of => Numeric})
|
|
380
|
-
end.should raise_error(Chef::Exceptions::ValidationFailed)
|
|
381
|
-
end
|
|
382
|
-
|
|
383
|
-
it "should create DelayedEvaluator instance when #lazy is used" do
|
|
384
|
-
@vo.set_or_return(:delayed, @vo.lazy{ 'test' }, {})
|
|
385
|
-
@vo.instance_variable_get(:@delayed).should be_a(Chef::DelayedEvaluator)
|
|
386
|
-
end
|
|
387
|
-
|
|
388
|
-
it "should execute block on each call when DelayedEvaluator" do
|
|
389
|
-
value = 'fubar'
|
|
390
|
-
@vo.set_or_return(:test, @vo.lazy{ value }, {})
|
|
391
|
-
@vo.set_or_return(:test, nil, {}).should == 'fubar'
|
|
392
|
-
value = 'foobar'
|
|
393
|
-
@vo.set_or_return(:test, nil, {}).should == 'foobar'
|
|
394
|
-
value = 'fauxbar'
|
|
395
|
-
@vo.set_or_return(:test, nil, {}).should == 'fauxbar'
|
|
396
|
-
end
|
|
397
|
-
|
|
398
|
-
it "should not evaluate non DelayedEvaluator instances" do
|
|
399
|
-
value = lambda{ 'test' }
|
|
400
|
-
@vo.set_or_return(:test, value, {})
|
|
401
|
-
@vo.set_or_return(:test, nil, {}).object_id.should == value.object_id
|
|
402
|
-
@vo.set_or_return(:test, nil, {}).should be_a(Proc)
|
|
403
|
-
end
|
|
404
371
|
|
|
405
372
|
end
|
|
@@ -112,9 +112,11 @@ describe Chef::Mixin::Securable do
|
|
|
112
112
|
@original_config = Chef::Config.hash_dup
|
|
113
113
|
load File.join(File.dirname(__FILE__), "..", "..", "..", "lib", "chef", "config.rb")
|
|
114
114
|
load File.join(File.dirname(__FILE__), "..", "..", "..", "lib", "chef", "mixin", "securable.rb")
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
115
|
+
SECURABLE_CLASS = Class.new do
|
|
116
|
+
include Chef::Mixin::Securable
|
|
117
|
+
include Chef::Mixin::ParamsValidate
|
|
118
|
+
end
|
|
119
|
+
@securable = SECURABLE_CLASS.new
|
|
118
120
|
end
|
|
119
121
|
end
|
|
120
122
|
|
|
@@ -44,6 +44,125 @@ describe Chef::Mixin::Template, "render_template" do
|
|
|
44
44
|
end
|
|
45
45
|
end
|
|
46
46
|
|
|
47
|
+
describe "with a template resource" do
|
|
48
|
+
before :each do
|
|
49
|
+
@cookbook_repo = File.expand_path(File.join(CHEF_SPEC_DATA, "cookbooks"))
|
|
50
|
+
Chef::Cookbook::FileVendor.on_create { |manifest| Chef::Cookbook::FileSystemFileVendor.new(manifest, @cookbook_repo) }
|
|
51
|
+
|
|
52
|
+
@node = Chef::Node.new
|
|
53
|
+
cl = Chef::CookbookLoader.new(@cookbook_repo)
|
|
54
|
+
cl.load_cookbooks
|
|
55
|
+
@cookbook_collection = Chef::CookbookCollection.new(cl)
|
|
56
|
+
@events = Chef::EventDispatch::Dispatcher.new
|
|
57
|
+
@run_context = Chef::RunContext.new(@node, @cookbook_collection, @events)
|
|
58
|
+
|
|
59
|
+
@rendered_file_location = Dir.tmpdir + '/openldap_stuff.conf'
|
|
60
|
+
|
|
61
|
+
@resource = Chef::Resource::Template.new(@rendered_file_location)
|
|
62
|
+
@resource.cookbook_name = 'openldap'
|
|
63
|
+
|
|
64
|
+
@provider = Chef::Provider::Template.new(@resource, @run_context)
|
|
65
|
+
@current_resource = @resource.dup
|
|
66
|
+
@provider.current_resource = @current_resource
|
|
67
|
+
@access_controls = mock("access controls")
|
|
68
|
+
@provider.stub!(:access_controls).and_return(@access_controls)
|
|
69
|
+
|
|
70
|
+
@template_context = {}
|
|
71
|
+
@template_context[:node] = @node
|
|
72
|
+
@template_context[:template_finder] = Chef::Provider::TemplateFinder.new(@run_context, @resource.cookbook_name, @node)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
it "should provide a render method" do
|
|
76
|
+
@provider.render_template("before {<%= render 'test.erb' %>} after", @template_context) do |tmp|
|
|
77
|
+
tmp.open.read.should == "before {We could be diving for pearls!\n} after"
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
it "should render local files" do
|
|
82
|
+
begin
|
|
83
|
+
tf = Tempfile.new("partial")
|
|
84
|
+
tf.puts "test"
|
|
85
|
+
tf.rewind
|
|
86
|
+
|
|
87
|
+
@provider.render_template("before {<%= render '#{tf.path}', :local => true %>} after", @template_context) do |tmp|
|
|
88
|
+
tmp.open.read.should == "before {test\n} after"
|
|
89
|
+
end
|
|
90
|
+
ensure
|
|
91
|
+
tf.close
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
it "should render partials from a different cookbook" do
|
|
96
|
+
@template_context[:template_finder] = Chef::Provider::TemplateFinder.new(@run_context, 'apache2', @node)
|
|
97
|
+
|
|
98
|
+
@provider.render_template("before {<%= render 'test.erb', :cookbook => 'openldap' %>} after", @template_context) do |tmp|
|
|
99
|
+
tmp.open.read.should == "before {We could be diving for pearls!\n} after"
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
it "should render using the source argument if provided" do
|
|
104
|
+
begin
|
|
105
|
+
tf = Tempfile.new("partial")
|
|
106
|
+
tf.puts "test"
|
|
107
|
+
tf.rewind
|
|
108
|
+
|
|
109
|
+
@provider.render_template("before {<%= render 'something', :local => true, :source => '#{tf.path}' %>} after", @template_context) do |tmp|
|
|
110
|
+
tmp.open.read.should == "before {test\n} after"
|
|
111
|
+
end
|
|
112
|
+
ensure
|
|
113
|
+
tf.close
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
it "should pass the node to partials" do
|
|
118
|
+
@node.normal[:slappiness] = "happiness"
|
|
119
|
+
|
|
120
|
+
@provider.render_template("before {<%= render 'openldap_stuff.conf.erb' %>} after", @template_context) do |tmp|
|
|
121
|
+
tmp.open.read.should == "before {slappiness is happiness} after"
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
it "should pass the original variables to partials" do
|
|
126
|
+
@template_context[:secret] = 'candy'
|
|
127
|
+
|
|
128
|
+
@provider.render_template("before {<%= render 'openldap_variable_stuff.conf.erb' %>} after", @template_context) do |tmp|
|
|
129
|
+
tmp.open.read.should == "before {super secret is candy} after"
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
it "should pass variables to partials" do
|
|
134
|
+
@provider.render_template("before {<%= render 'openldap_variable_stuff.conf.erb', :variables => {:secret => 'whatever' } %>} after", @template_context) do |tmp|
|
|
135
|
+
tmp.open.read.should == "before {super secret is whatever} after"
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
it "should pass variables to partials even if they are named the same" do
|
|
140
|
+
@template_context[:secret] = 'one'
|
|
141
|
+
|
|
142
|
+
@provider.render_template("before {<%= render 'openldap_variable_stuff.conf.erb', :variables => {:secret => 'two' } %>} after <%= @secret %>", @template_context) do |tmp|
|
|
143
|
+
tmp.open.read.should == "before {super secret is two} after one"
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
it "should pass nil for missing variables in partials" do
|
|
148
|
+
@provider.render_template("before {<%= render 'openldap_variable_stuff.conf.erb', :variables => {} %>} after", @template_context) do |tmp|
|
|
149
|
+
tmp.open.read.should == "before {super secret is } after"
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
@provider.render_template("before {<%= render 'openldap_variable_stuff.conf.erb' %>} after", @template_context) do |tmp|
|
|
153
|
+
tmp.open.read.should == "before {super secret is } after"
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
it "should render nested partials" do
|
|
158
|
+
path = File.expand_path(File.join(CHEF_SPEC_DATA, "partial_one.erb"))
|
|
159
|
+
|
|
160
|
+
@provider.render_template("before {<%= render '#{path}', :local => true %>} after", @template_context) do |tmp|
|
|
161
|
+
tmp.open.read.should == "before {partial one We could be diving for pearls!\n calling home\n} after"
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
47
166
|
describe "when an exception is raised in the template" do
|
|
48
167
|
def do_raise
|
|
49
168
|
@context = {:chef => "cool"}
|
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
8
|
# you may not use this file except in compliance with the License.
|
|
9
9
|
# You may obtain a copy of the License at
|
|
10
|
-
#
|
|
10
|
+
#
|
|
11
11
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
-
#
|
|
12
|
+
#
|
|
13
13
|
# Unless required by applicable law or agreed to in writing, software
|
|
14
14
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
15
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
@@ -20,9 +20,9 @@
|
|
|
20
20
|
require 'spec_helper'
|
|
21
21
|
require 'chef/node/attribute'
|
|
22
22
|
|
|
23
|
-
describe Chef::Node::Attribute do
|
|
23
|
+
describe Chef::Node::Attribute do
|
|
24
24
|
before(:each) do
|
|
25
|
-
@attribute_hash =
|
|
25
|
+
@attribute_hash =
|
|
26
26
|
{"dmi"=>{},
|
|
27
27
|
"command"=>{"ps"=>"ps -ef"},
|
|
28
28
|
"platform_version"=>"10.5.7",
|
|
@@ -193,7 +193,7 @@ describe Chef::Node::Attribute do
|
|
|
193
193
|
@default_hash = {
|
|
194
194
|
"domain" => "opscode.com",
|
|
195
195
|
"hot" => { "day" => "saturday" },
|
|
196
|
-
"music" => {
|
|
196
|
+
"music" => {
|
|
197
197
|
"jimmy_eat_world" => "is fun!",
|
|
198
198
|
"mastodon" => "rocks",
|
|
199
199
|
"mars_volta" => "is loud and nutty",
|
|
@@ -225,30 +225,93 @@ describe Chef::Node::Attribute do
|
|
|
225
225
|
[ :normal, :default, :override, :automatic ].each do |accessor|
|
|
226
226
|
it "should set #{accessor}" do
|
|
227
227
|
na = Chef::Node::Attribute.new({ :normal => true }, { :default => true }, { :override => true }, { :automatic => true })
|
|
228
|
-
na.send(accessor).should == { accessor => true }
|
|
228
|
+
na.send(accessor).should == { accessor.to_s => true }
|
|
229
229
|
end
|
|
230
230
|
end
|
|
231
231
|
|
|
232
|
-
it "should allow you to set the initial state" do
|
|
233
|
-
attrs = {"first" => {"second" => {"third" => {"jackpot" => "jackpot!"}}}}
|
|
234
|
-
na = Chef::Node::Attribute.new(attrs, {}, {}, {}, [ "first", "second", "third" ])
|
|
235
|
-
na.should have_key("jackpot")
|
|
236
|
-
end
|
|
237
|
-
|
|
238
232
|
it "should be enumerable" do
|
|
239
233
|
@attributes.should be_is_a(Enumerable)
|
|
240
234
|
end
|
|
241
235
|
end
|
|
242
236
|
|
|
243
|
-
describe "
|
|
244
|
-
|
|
245
|
-
@attributes.
|
|
237
|
+
describe "when fetching values based on precedence" do
|
|
238
|
+
before do
|
|
239
|
+
@attributes.default["default"] = "cookbook default"
|
|
240
|
+
@attributes.override["override"] = "cookbook override"
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
it "prefers 'forced default' over any other default" do
|
|
244
|
+
@attributes.default!["default"] = "force default"
|
|
245
|
+
@attributes.role_default["default"] = "role default"
|
|
246
|
+
@attributes.env_default["default"] = "environment default"
|
|
247
|
+
@attributes["default"].should == "force default"
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
it "prefers role_default over environment or cookbook default" do
|
|
251
|
+
@attributes.role_default["default"] = "role default"
|
|
252
|
+
@attributes.env_default["default"] = "environment default"
|
|
253
|
+
@attributes["default"].should == "role default"
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
it "prefers environment default over cookbook default" do
|
|
257
|
+
@attributes.env_default["default"] = "environment default"
|
|
258
|
+
@attributes["default"].should == "environment default"
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
it "returns the cookbook default when no other default values are present" do
|
|
262
|
+
@attributes["default"].should == "cookbook default"
|
|
246
263
|
end
|
|
247
264
|
|
|
248
|
-
it "
|
|
249
|
-
|
|
250
|
-
@attributes.
|
|
265
|
+
it "prefers 'forced overrides' over role or cookbook overrides" do
|
|
266
|
+
@attributes.override!["override"] = "force override"
|
|
267
|
+
@attributes.env_override["override"] = "environment override"
|
|
268
|
+
@attributes.role_override["override"] = "role override"
|
|
269
|
+
@attributes["override"].should == "force override"
|
|
251
270
|
end
|
|
271
|
+
|
|
272
|
+
it "prefers environment overrides over role or cookbook overrides" do
|
|
273
|
+
@attributes.env_override["override"] = "environment override"
|
|
274
|
+
@attributes.role_override["override"] = "role override"
|
|
275
|
+
@attributes["override"].should == "environment override"
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
it "prefers role overrides over cookbook overrides" do
|
|
279
|
+
@attributes.role_override["override"] = "role override"
|
|
280
|
+
@attributes["override"].should == "role override"
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
it "returns cookbook overrides when no other overrides are present" do
|
|
284
|
+
@attributes["override"].should == "cookbook override"
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
describe "when reading combined default or override values" do
|
|
290
|
+
before do
|
|
291
|
+
@attributes.default["cd"] = "cookbook default"
|
|
292
|
+
@attributes.role_default["rd"] = "role default"
|
|
293
|
+
@attributes.env_default["ed"] = "env default"
|
|
294
|
+
@attributes.default!["fd"] = "force default"
|
|
295
|
+
@attributes.override["co"] = "cookbook override"
|
|
296
|
+
@attributes.role_override["ro"] = "role override"
|
|
297
|
+
@attributes.env_override["eo"] = "env override"
|
|
298
|
+
@attributes.override!["fo"] = "force override"
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
it "merges all types of overrides into a combined override" do
|
|
302
|
+
@attributes.combined_override["co"].should == "cookbook override"
|
|
303
|
+
@attributes.combined_override["ro"].should == "role override"
|
|
304
|
+
@attributes.combined_override["eo"].should == "env override"
|
|
305
|
+
@attributes.combined_override["fo"].should == "force override"
|
|
306
|
+
end
|
|
307
|
+
|
|
308
|
+
it "merges all types of defaults into a combined default" do
|
|
309
|
+
@attributes.combined_default["cd"].should == "cookbook default"
|
|
310
|
+
@attributes.combined_default["rd"].should == "role default"
|
|
311
|
+
@attributes.combined_default["ed"].should == "env default"
|
|
312
|
+
@attributes.combined_default["fd"].should == "force default"
|
|
313
|
+
end
|
|
314
|
+
|
|
252
315
|
end
|
|
253
316
|
|
|
254
317
|
describe "[]" do
|
|
@@ -282,67 +345,31 @@ describe Chef::Node::Attribute do
|
|
|
282
345
|
|
|
283
346
|
it "should return the merged hash if all three have values" do
|
|
284
347
|
result = @attributes["music"]
|
|
285
|
-
result["mars_volta"]
|
|
286
|
-
result["jimmy_eat_world"]
|
|
287
|
-
result["mastodon"]
|
|
348
|
+
result["mars_volta"].should == "cicatriz"
|
|
349
|
+
result["jimmy_eat_world"].should == "nice"
|
|
350
|
+
result["mastodon"].should == "rocks"
|
|
288
351
|
end
|
|
289
352
|
end
|
|
290
353
|
|
|
291
|
-
describe "
|
|
292
|
-
it "should
|
|
293
|
-
@attributes.
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
it "should raise an exception if the key does exist and does not respond to has_key?" do
|
|
297
|
-
lambda { @attributes.auto_vivifiy({ "one" => "value" }) }.should raise_error(ArgumentError)
|
|
298
|
-
end
|
|
299
|
-
|
|
300
|
-
it "should not alter the value if the key exists and responds to has_key?" do
|
|
301
|
-
@attributes.auto_vivifiy({ "one" => { "will" => true } }, "one")["one"].should have_key("will")
|
|
302
|
-
end
|
|
303
|
-
end
|
|
304
|
-
|
|
305
|
-
describe "set_value" do
|
|
306
|
-
it "should set the value for a top level key" do
|
|
307
|
-
to_check = {}
|
|
308
|
-
@attributes.set_value(to_check, "one", "some value")
|
|
309
|
-
to_check["one"].should == "some value"
|
|
310
|
-
end
|
|
311
|
-
|
|
312
|
-
it "should set the value for a second level key" do
|
|
313
|
-
to_check = {}
|
|
314
|
-
@attributes[ "one" ]
|
|
315
|
-
@attributes.set_value(to_check, "two", "some value")
|
|
316
|
-
to_check["one"]["two"].should == "some value"
|
|
317
|
-
end
|
|
318
|
-
|
|
319
|
-
it "should set the value for a very deep key" do
|
|
320
|
-
to_check = {}
|
|
321
|
-
attributes = Chef::Node::Attribute.new({}, {}, {}, {}, %w{one two three four five})
|
|
322
|
-
attributes.set_value(to_check, "six", "some value")
|
|
323
|
-
to_check["one"]["two"]["three"]["four"]["five"]["six"].should == "some value"
|
|
354
|
+
describe "[]=" do
|
|
355
|
+
it "should error out when the type of attribute to set has not been specified" do
|
|
356
|
+
@attributes.normal["the_ghost"] = { }
|
|
357
|
+
lambda { @attributes["the_ghost"]["exterminate"] = false }.should raise_error(Chef::Exceptions::ImmutableAttributeModification)
|
|
324
358
|
end
|
|
325
|
-
end
|
|
326
359
|
|
|
327
|
-
describe "[]=" do
|
|
328
360
|
it "should let you set an attribute value when another hash has an intermediate value" do
|
|
329
361
|
@attributes.normal["the_ghost"] = { "exterminate" => "the future" }
|
|
330
|
-
@attributes.
|
|
331
|
-
@attributes.auto_vivifiy_on_read = true
|
|
332
|
-
lambda { @attributes["the_ghost"]["exterminate"]["tomorrow"] = false }.should_not raise_error(NoMethodError)
|
|
362
|
+
lambda { @attributes.normal["the_ghost"]["exterminate"]["tomorrow"] = false }.should_not raise_error(NoMethodError)
|
|
333
363
|
end
|
|
334
364
|
|
|
335
365
|
it "should set the attribute value" do
|
|
336
|
-
@attributes["longboard"] = "surfing"
|
|
337
|
-
@attributes["longboard"].should == "surfing"
|
|
338
|
-
@attributes.
|
|
366
|
+
@attributes.normal["longboard"] = "surfing"
|
|
367
|
+
@attributes.normal["longboard"].should == "surfing"
|
|
368
|
+
@attributes.normal["longboard"].should == "surfing"
|
|
339
369
|
end
|
|
340
370
|
|
|
341
|
-
it "should set deeply nested attribute
|
|
342
|
-
@attributes.
|
|
343
|
-
@attributes.auto_vivifiy_on_read = true
|
|
344
|
-
@attributes["deftones"]["hunters"]["nap"] = "surfing"
|
|
345
|
-
@attributes.reset
|
|
371
|
+
it "should set deeply nested attribute values when a precedence level is specified" do
|
|
372
|
+
@attributes.normal["deftones"]["hunters"]["nap"] = "surfing"
|
|
346
373
|
@attributes.normal["deftones"]["hunters"]["nap"].should == "surfing"
|
|
347
374
|
end
|
|
348
375
|
|
|
@@ -351,45 +378,23 @@ describe Chef::Node::Attribute do
|
|
|
351
378
|
end
|
|
352
379
|
|
|
353
380
|
it "should let you set attributes manually without vivification" do
|
|
354
|
-
@attributes["foo"] = Mash.new
|
|
355
|
-
@attributes["foo"]["bar"] = :baz
|
|
356
|
-
@attributes["foo"]["bar"].should == :baz
|
|
381
|
+
@attributes.normal["foo"] = Mash.new
|
|
382
|
+
@attributes.normal["foo"]["bar"] = :baz
|
|
383
|
+
@attributes.normal["foo"]["bar"].should == :baz
|
|
357
384
|
end
|
|
358
385
|
|
|
359
386
|
it "should optionally skip setting the value if one already exists" do
|
|
360
387
|
@attributes.set_unless_value_present = true
|
|
361
|
-
@attributes["hostname"] = "bar"
|
|
388
|
+
@attributes.normal["hostname"] = "bar"
|
|
362
389
|
@attributes["hostname"].should == "latte"
|
|
363
390
|
end
|
|
364
391
|
|
|
365
|
-
it "
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
@attributes["foo"]
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
describe "get_value" do
|
|
373
|
-
it "should get a value from a top level key" do
|
|
374
|
-
@attributes.get_value(@default_hash, "domain").should == "opscode.com"
|
|
375
|
-
end
|
|
376
|
-
|
|
377
|
-
it "should return nil for a top level key that does not exist" do
|
|
378
|
-
@attributes.get_value(@default_hash, "domainz").should == nil
|
|
379
|
-
end
|
|
380
|
-
|
|
381
|
-
it "should get a value based on the state of the object" do
|
|
382
|
-
@attributes.auto_vivifiy_on_read = true
|
|
383
|
-
@attributes.set_type = :normal
|
|
384
|
-
@attributes[:foo][:bar][:baz] = "snack"
|
|
385
|
-
@attributes.get_value(@attribute_hash, :baz).should == "snack"
|
|
386
|
-
end
|
|
387
|
-
|
|
388
|
-
it "should return nil based on the state of the object if the key does not exist" do
|
|
389
|
-
@attributes.auto_vivifiy_on_read = true
|
|
390
|
-
@attributes.set_type = :normal
|
|
391
|
-
@attributes[:foo][:bar][:baz] = "snack"
|
|
392
|
-
@attributes.get_value(@attribute_hash, :baznatch).should == nil
|
|
392
|
+
it "does not support ||= when setting" do
|
|
393
|
+
# This is a limitation of auto-vivification.
|
|
394
|
+
# Users who need this behavior can use set_unless and friends
|
|
395
|
+
@attributes.normal["foo"] = Mash.new
|
|
396
|
+
@attributes.normal["foo"]["bar"] ||= "stop the world"
|
|
397
|
+
@attributes.normal["foo"]["bar"].should == {}
|
|
393
398
|
end
|
|
394
399
|
end
|
|
395
400
|
|
|
@@ -403,21 +408,6 @@ describe Chef::Node::Attribute do
|
|
|
403
408
|
hash.class.should == Hash
|
|
404
409
|
hash["day"].should == "sunday"
|
|
405
410
|
end
|
|
406
|
-
|
|
407
|
-
# Regression test for CHEF-4631
|
|
408
|
-
context "when merging array values" do
|
|
409
|
-
before do
|
|
410
|
-
@default_attrs = {"foo" => {"bar" => ["default"]}}
|
|
411
|
-
@override_attrs = {"foo" => {"bar" => ["override"]}}
|
|
412
|
-
|
|
413
|
-
#(normal, default, override, automatic, state=[])
|
|
414
|
-
@attributes = Chef::Node::Attribute.new({ }, @default_attrs, @override_attrs, { })
|
|
415
|
-
end
|
|
416
|
-
|
|
417
|
-
it "should return the override" do
|
|
418
|
-
@attributes["foo"].to_hash["bar"].should == [ "override" ]
|
|
419
|
-
end
|
|
420
|
-
end
|
|
421
411
|
end
|
|
422
412
|
|
|
423
413
|
describe "has_key?" do
|
|
@@ -438,14 +428,8 @@ describe Chef::Node::Attribute do
|
|
|
438
428
|
end
|
|
439
429
|
|
|
440
430
|
it "should return true if an attribute exists but is set to false" do
|
|
441
|
-
@attributes
|
|
442
|
-
@attributes.has_key?("apophis").should == true
|
|
443
|
-
end
|
|
444
|
-
|
|
445
|
-
it "should find keys at the current nesting level" do
|
|
446
|
-
@attributes["music"]
|
|
447
|
-
@attributes.has_key?("mastodon").should == true
|
|
448
|
-
@attributes.has_key?("whitesnake").should == false
|
|
431
|
+
@attributes.has_key?("music")
|
|
432
|
+
@attributes["music"].has_key?("apophis").should == true
|
|
449
433
|
end
|
|
450
434
|
|
|
451
435
|
it "does not find keys above the current nesting level" do
|
|
@@ -458,7 +442,7 @@ describe Chef::Node::Attribute do
|
|
|
458
442
|
|
|
459
443
|
[:include?, :key?, :member?].each do |method|
|
|
460
444
|
it "should alias the method #{method} to itself" do
|
|
461
|
-
@attributes.should respond_to(method)
|
|
445
|
+
@attributes.should respond_to(method)
|
|
462
446
|
end
|
|
463
447
|
|
|
464
448
|
it "#{method} should behave like has_key?" do
|
|
@@ -476,11 +460,6 @@ describe Chef::Node::Attribute do
|
|
|
476
460
|
@attributes.attribute?("ninja").should == false
|
|
477
461
|
end
|
|
478
462
|
|
|
479
|
-
it "should be looking at the current position of the object" do
|
|
480
|
-
@attributes["music"]
|
|
481
|
-
@attributes.attribute?("mastodon").should == true
|
|
482
|
-
@attributes.attribute?("whitesnake").should == false
|
|
483
|
-
end
|
|
484
463
|
end
|
|
485
464
|
|
|
486
465
|
describe "method_missing" do
|
|
@@ -488,16 +467,10 @@ describe Chef::Node::Attribute do
|
|
|
488
467
|
@attributes.music.mastodon.should == "rocks"
|
|
489
468
|
end
|
|
490
469
|
|
|
491
|
-
it "should behave like a []= lookup if the last method has an argument" do
|
|
492
|
-
@attributes.music.mastodon(["dream", "still", "shining"])
|
|
493
|
-
@attributes.reset
|
|
494
|
-
@attributes.music.mastodon.should == ["dream", "still", "shining"]
|
|
495
|
-
end
|
|
496
|
-
|
|
497
470
|
it "should allow the last method to set a value if it has an = sign on the end" do
|
|
498
|
-
@attributes.music.mastodon = [ "dream", "still", "shining" ]
|
|
471
|
+
@attributes.normal.music.mastodon = [ "dream", "still", "shining" ]
|
|
499
472
|
@attributes.reset
|
|
500
|
-
@attributes.music.mastodon.should == [ "dream", "still", "shining" ]
|
|
473
|
+
@attributes.normal.music.mastodon.should == [ "dream", "still", "shining" ]
|
|
501
474
|
end
|
|
502
475
|
end
|
|
503
476
|
|
|
@@ -531,7 +504,7 @@ describe Chef::Node::Attribute do
|
|
|
531
504
|
collect.include?("snakes").should == true
|
|
532
505
|
collect.include?("snack").should == true
|
|
533
506
|
collect.include?("place").should == true
|
|
534
|
-
collect.length.should == 5
|
|
507
|
+
collect.length.should == 5
|
|
535
508
|
end
|
|
536
509
|
|
|
537
510
|
it "should yield lower if we go deeper" do
|
|
@@ -542,7 +515,7 @@ describe Chef::Node::Attribute do
|
|
|
542
515
|
collect.include?("two").should == true
|
|
543
516
|
collect.include?("four").should == true
|
|
544
517
|
collect.include?("six").should == true
|
|
545
|
-
collect.length.should == 3
|
|
518
|
+
collect.length.should == 3
|
|
546
519
|
end
|
|
547
520
|
|
|
548
521
|
it "should not raise an exception if one of the hashes has a nil value on a deep lookup" do
|
|
@@ -616,7 +589,7 @@ describe Chef::Node::Attribute do
|
|
|
616
589
|
@attributes.each_key do |k|
|
|
617
590
|
collect << k
|
|
618
591
|
end
|
|
619
|
-
|
|
592
|
+
|
|
620
593
|
collect.should include("one")
|
|
621
594
|
collect.should include("snack")
|
|
622
595
|
collect.should include("hut")
|
|
@@ -659,7 +632,7 @@ describe Chef::Node::Attribute do
|
|
|
659
632
|
collect["snack"].should == "cookies"
|
|
660
633
|
end
|
|
661
634
|
end
|
|
662
|
-
|
|
635
|
+
|
|
663
636
|
describe "each_value" do
|
|
664
637
|
before do
|
|
665
638
|
@attributes = Chef::Node::Attribute.new(
|
|
@@ -938,8 +911,8 @@ describe Chef::Node::Attribute do
|
|
|
938
911
|
end
|
|
939
912
|
end
|
|
940
913
|
|
|
941
|
-
it "should return an empty array for a block containing nil" do
|
|
942
|
-
@attributes.select { nil }.should ==
|
|
914
|
+
it "should return an empty hash/array (ruby-version-dependent) for a block containing nil" do
|
|
915
|
+
@attributes.select { nil }.should == {}.select { nil }
|
|
943
916
|
end
|
|
944
917
|
|
|
945
918
|
# sorted for spec clarity
|
|
@@ -1013,56 +986,105 @@ describe Chef::Node::Attribute do
|
|
|
1013
986
|
|
|
1014
987
|
describe "inspect" do
|
|
1015
988
|
it "should be readable" do
|
|
1016
|
-
|
|
1017
|
-
|
|
989
|
+
# NOTE: previous implementation hid the values, showing @automatic={...}
|
|
990
|
+
# That is nice and compact, but hides a lot of info, which seems counter
|
|
991
|
+
# to the point of calling #inspect...
|
|
992
|
+
@attributes.inspect.should =~ /@automatic=\{.*\}/
|
|
993
|
+
@attributes.inspect.should =~ /@normal=\{.*\}/
|
|
1018
994
|
end
|
|
1019
995
|
end
|
|
1020
996
|
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
997
|
+
# For expedience, this test is implementation-heavy.
|
|
998
|
+
describe "when a component attribute is mutated" do
|
|
999
|
+
[
|
|
1000
|
+
:clear,
|
|
1001
|
+
:shift
|
|
1002
|
+
].each do |mutator|
|
|
1003
|
+
it "resets the cache when the mutator #{mutator} is called" do
|
|
1004
|
+
@attributes.should_receive(:reset_cache)
|
|
1005
|
+
@attributes.default.send(mutator)
|
|
1006
|
+
end
|
|
1007
|
+
end
|
|
1027
1008
|
|
|
1028
|
-
|
|
1029
|
-
@attributes
|
|
1009
|
+
it "resets the cache when the mutator delete is called" do
|
|
1010
|
+
@attributes.should_receive(:reset_cache)
|
|
1011
|
+
@attributes.default.delete(:music)
|
|
1030
1012
|
end
|
|
1031
1013
|
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1014
|
+
[
|
|
1015
|
+
:merge!,
|
|
1016
|
+
:update,
|
|
1017
|
+
:replace
|
|
1018
|
+
].each do |mutator|
|
|
1019
|
+
it "resets the cache when the mutator #{mutator} is called" do
|
|
1020
|
+
# Implementation of Mash means that this could get called many times. That's okay.
|
|
1021
|
+
@attributes.should_receive(:reset_cache).at_least(1).times
|
|
1022
|
+
@attributes.default.send(mutator, {:foo => :bar})
|
|
1023
|
+
end
|
|
1040
1024
|
end
|
|
1041
1025
|
|
|
1042
|
-
|
|
1043
|
-
|
|
1026
|
+
[
|
|
1027
|
+
:delete_if,
|
|
1028
|
+
:keep_if,
|
|
1029
|
+
:reject!,
|
|
1030
|
+
:select!,
|
|
1031
|
+
].each do |mutator|
|
|
1032
|
+
it "resets the cache when the mutator #{mutator} is called" do
|
|
1033
|
+
# Implementation of Mash means that this could get called many times. That's okay.
|
|
1034
|
+
@attributes.should_receive(:reset_cache).at_least(1).times
|
|
1035
|
+
block = lambda {|k,v| true }
|
|
1036
|
+
@attributes.default.send(mutator, &block)
|
|
1037
|
+
end
|
|
1044
1038
|
end
|
|
1045
1039
|
end
|
|
1046
1040
|
|
|
1047
|
-
describe "
|
|
1048
|
-
before(:each) do
|
|
1049
|
-
@default_attrs = {"foo" => {"bar" => ["default"]}}
|
|
1050
|
-
@override_attrs = {"foo" => {"bar" => ["override"]}}
|
|
1041
|
+
describe "when not mutated" do
|
|
1051
1042
|
|
|
1052
|
-
|
|
1053
|
-
@attributes =
|
|
1043
|
+
it "does not reset the cache when dup'd [CHEF-3680]" do
|
|
1044
|
+
@attributes.default[:foo][:bar] = "set on original"
|
|
1045
|
+
subtree = @attributes[:foo]
|
|
1046
|
+
@attributes.default[:foo].dup[:bar] = "set on dup"
|
|
1047
|
+
subtree[:bar].should == "set on original"
|
|
1054
1048
|
end
|
|
1055
1049
|
|
|
1056
|
-
|
|
1057
|
-
@default_attrs = {"foo" => {"bar" => ["1", "2"]}}
|
|
1058
|
-
@attributes = Chef::Node::Attribute.new({ }, @default_attrs, { }, { })
|
|
1050
|
+
end
|
|
1059
1051
|
|
|
1060
|
-
|
|
1052
|
+
describe "when setting a component attribute to a new value" do
|
|
1053
|
+
it "converts the input in to a VividMash tree (default)" do
|
|
1054
|
+
@attributes.default = {}
|
|
1055
|
+
@attributes.default.foo = "bar"
|
|
1056
|
+
@attributes.merged_attributes[:foo].should == "bar"
|
|
1057
|
+
end
|
|
1058
|
+
|
|
1059
|
+
it "converts the input in to a VividMash tree (normal)" do
|
|
1060
|
+
@attributes.normal = {}
|
|
1061
|
+
@attributes.normal.foo = "bar"
|
|
1062
|
+
@attributes.merged_attributes[:foo].should == "bar"
|
|
1063
|
+
end
|
|
1064
|
+
|
|
1065
|
+
it "converts the input in to a VividMash tree (override)" do
|
|
1066
|
+
@attributes.override = {}
|
|
1067
|
+
@attributes.override.foo = "bar"
|
|
1068
|
+
@attributes.merged_attributes[:foo].should == "bar"
|
|
1069
|
+
end
|
|
1061
1070
|
|
|
1071
|
+
it "converts the input in to a VividMash tree (automatic)" do
|
|
1072
|
+
@attributes.automatic = {}
|
|
1073
|
+
@attributes.automatic.foo = "bar"
|
|
1074
|
+
@attributes.merged_attributes[:foo].should == "bar"
|
|
1075
|
+
end
|
|
1076
|
+
end
|
|
1077
|
+
|
|
1078
|
+
describe "when attemping to write without specifying precedence" do
|
|
1079
|
+
it "raises an error when using []=" do
|
|
1080
|
+
lambda { @attributes[:new_key] = "new value" }.should raise_error(Chef::Exceptions::ImmutableAttributeModification)
|
|
1062
1081
|
end
|
|
1063
1082
|
|
|
1064
|
-
it "
|
|
1083
|
+
it "raises an error when using `attr=value`" do
|
|
1084
|
+
lambda { @attributes.new_key = "new value" }.should raise_error(Chef::Exceptions::ImmutableAttributeModification)
|
|
1065
1085
|
end
|
|
1086
|
+
|
|
1066
1087
|
end
|
|
1067
1088
|
|
|
1068
1089
|
end
|
|
1090
|
+
|