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,358 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: John Keiser (<jkeiser@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2012 Opscode, Inc.
|
|
4
|
+
# License:: Apache License, Version 2.0
|
|
5
|
+
#
|
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
# you may not use this file except in compliance with the License.
|
|
8
|
+
# You may obtain a copy of the License at
|
|
9
|
+
#
|
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
#
|
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
# See the License for the specific language governing permissions and
|
|
16
|
+
# limitations under the License.
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
require 'chef/chef_fs/path_utils'
|
|
20
|
+
|
|
21
|
+
class Chef
|
|
22
|
+
module ChefFS
|
|
23
|
+
module FileSystem
|
|
24
|
+
# Yields a list of all things under (and including) this entry that match the
|
|
25
|
+
# given pattern.
|
|
26
|
+
#
|
|
27
|
+
# ==== Attributes
|
|
28
|
+
#
|
|
29
|
+
# * +entry+ - Entry to start listing under
|
|
30
|
+
# * +pattern+ - Chef::ChefFS::FilePattern to match children under
|
|
31
|
+
#
|
|
32
|
+
def self.list(entry, pattern, &block)
|
|
33
|
+
# Include self in results if it matches
|
|
34
|
+
if pattern.match?(entry.path)
|
|
35
|
+
block.call(entry)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
if entry.dir? && pattern.could_match_children?(entry.path)
|
|
39
|
+
# If it's possible that our children could match, descend in and add matches.
|
|
40
|
+
exact_child_name = pattern.exact_child_name_under(entry.path)
|
|
41
|
+
|
|
42
|
+
# If we've got an exact name, don't bother listing children; just grab the
|
|
43
|
+
# child with the given name.
|
|
44
|
+
if exact_child_name
|
|
45
|
+
exact_child = entry.child(exact_child_name)
|
|
46
|
+
if exact_child
|
|
47
|
+
list(exact_child, pattern, &block)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Otherwise, go through all children and find any matches
|
|
51
|
+
else
|
|
52
|
+
entry.children.each do |child|
|
|
53
|
+
list(child, pattern, &block)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Resolve the given path against the entry, returning
|
|
60
|
+
# the entry at the end of the path.
|
|
61
|
+
#
|
|
62
|
+
# ==== Attributes
|
|
63
|
+
#
|
|
64
|
+
# * +entry+ - the entry to start looking under. Relative
|
|
65
|
+
# paths will be resolved from here.
|
|
66
|
+
# * +path+ - the path to resolve. If it starts with +/+,
|
|
67
|
+
# the path will be resolved starting from +entry.root+.
|
|
68
|
+
#
|
|
69
|
+
# ==== Examples
|
|
70
|
+
#
|
|
71
|
+
# Chef::ChefFS::FileSystem.resolve_path(root_path, 'cookbooks/java/recipes/default.rb')
|
|
72
|
+
#
|
|
73
|
+
def self.resolve_path(entry, path)
|
|
74
|
+
return entry if path.length == 0
|
|
75
|
+
return resolve_path(entry.root, path) if path[0,1] == "/" && entry.root != entry
|
|
76
|
+
if path[0,1] == "/"
|
|
77
|
+
path = path[1,path.length-1]
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
result = entry
|
|
81
|
+
Chef::ChefFS::PathUtils::split(path).each do |part|
|
|
82
|
+
result = result.child(part)
|
|
83
|
+
end
|
|
84
|
+
result
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Copy everything matching the given pattern from src to dest.
|
|
88
|
+
#
|
|
89
|
+
# After this method completes, everything in dest matching the
|
|
90
|
+
# given pattern will look identical to src.
|
|
91
|
+
#
|
|
92
|
+
# ==== Attributes
|
|
93
|
+
#
|
|
94
|
+
# * +pattern+ - Chef::ChefFS::FilePattern to match children under
|
|
95
|
+
# * +src_root+ - the root from which things will be copied
|
|
96
|
+
# * +dest_root+ - the root to which things will be copied
|
|
97
|
+
# * +recurse_depth+ - the maximum depth to copy things. +nil+
|
|
98
|
+
# means infinite depth. 0 means no recursion.
|
|
99
|
+
# * +options+ - hash of options:
|
|
100
|
+
# - +purge+ - if +true+, items in +dest+ that are not in +src+
|
|
101
|
+
# will be deleted from +dest+. If +false+, these items will
|
|
102
|
+
# be left alone.
|
|
103
|
+
# - +force+ - if +true+, matching files are always copied from
|
|
104
|
+
# +src+ to +dest+. If +false+, they will only be copied if
|
|
105
|
+
# actually different (which will take time to determine).
|
|
106
|
+
# - +dry_run+ - if +true+, action will not actually be taken;
|
|
107
|
+
# things will be printed out instead.
|
|
108
|
+
#
|
|
109
|
+
# ==== Examples
|
|
110
|
+
#
|
|
111
|
+
# Chef::ChefFS::FileSystem.copy_to(FilePattern.new('/cookbooks'),
|
|
112
|
+
# chef_fs, local_fs, nil, true) do |message|
|
|
113
|
+
# puts message
|
|
114
|
+
# end
|
|
115
|
+
#
|
|
116
|
+
def self.copy_to(pattern, src_root, dest_root, recurse_depth, options)
|
|
117
|
+
found_result = false
|
|
118
|
+
list_pairs(pattern, src_root, dest_root) do |src, dest|
|
|
119
|
+
found_result = true
|
|
120
|
+
new_dest_parent = get_or_create_parent(dest, options)
|
|
121
|
+
copy_entries(src, dest, new_dest_parent, recurse_depth, options)
|
|
122
|
+
end
|
|
123
|
+
if !found_result && pattern.exact_path
|
|
124
|
+
puts "#{pattern}: No such file or directory on remote or local"
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# Yield entries for children that are in either +a_root+ or +b_root+, with
|
|
129
|
+
# matching pairs matched up.
|
|
130
|
+
#
|
|
131
|
+
# ==== Yields
|
|
132
|
+
#
|
|
133
|
+
# Yields matching entries in pairs:
|
|
134
|
+
#
|
|
135
|
+
# [ a_entry, b_entry ]
|
|
136
|
+
#
|
|
137
|
+
# ==== Example
|
|
138
|
+
#
|
|
139
|
+
# Chef::ChefFS::FileSystem.list_pairs(FilePattern.new('**x.txt', a_root, b_root)) do |a, b|
|
|
140
|
+
# ...
|
|
141
|
+
# end
|
|
142
|
+
#
|
|
143
|
+
def self.list_pairs(pattern, a_root, b_root)
|
|
144
|
+
# Make sure everything on the server is also on the filesystem, and diff
|
|
145
|
+
found_paths = Set.new
|
|
146
|
+
Chef::ChefFS::FileSystem.list(a_root, pattern) do |a|
|
|
147
|
+
found_paths << a.path
|
|
148
|
+
b = Chef::ChefFS::FileSystem.resolve_path(b_root, a.path)
|
|
149
|
+
yield [ a, b ]
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# Check the outer regex pattern to see if it matches anything on the
|
|
153
|
+
# filesystem that isn't on the server
|
|
154
|
+
Chef::ChefFS::FileSystem.list(b_root, pattern) do |b|
|
|
155
|
+
if !found_paths.include?(b.path)
|
|
156
|
+
a = Chef::ChefFS::FileSystem.resolve_path(a_root, b.path)
|
|
157
|
+
yield [ a, b ]
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
# Get entries for children of either a or b, with matching pairs matched up.
|
|
163
|
+
#
|
|
164
|
+
# ==== Returns
|
|
165
|
+
#
|
|
166
|
+
# An array of child pairs.
|
|
167
|
+
#
|
|
168
|
+
# [ [ a_child, b_child ], ... ]
|
|
169
|
+
#
|
|
170
|
+
# If a child is only in a or only in b, the other child entry will be
|
|
171
|
+
# retrieved by name (and will most likely be a "nonexistent child").
|
|
172
|
+
#
|
|
173
|
+
# ==== Example
|
|
174
|
+
#
|
|
175
|
+
# Chef::ChefFS::FileSystem.child_pairs(a, b).length
|
|
176
|
+
#
|
|
177
|
+
def self.child_pairs(a, b)
|
|
178
|
+
# If both are directories, recurse into them and diff the children instead of returning ourselves.
|
|
179
|
+
result = []
|
|
180
|
+
a_children_names = Set.new
|
|
181
|
+
a.children.each do |a_child|
|
|
182
|
+
a_children_names << a_child.name
|
|
183
|
+
result << [ a_child, b.child(a_child.name) ]
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
# Check b for children that aren't in a
|
|
187
|
+
b.children.each do |b_child|
|
|
188
|
+
if !a_children_names.include?(b_child.name)
|
|
189
|
+
result << [ a.child(b_child.name), b_child ]
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
result
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
def self.compare(a, b)
|
|
196
|
+
are_same, a_value, b_value = a.compare_to(b)
|
|
197
|
+
if are_same.nil?
|
|
198
|
+
are_same, b_value, a_value = b.compare_to(a)
|
|
199
|
+
end
|
|
200
|
+
if are_same.nil?
|
|
201
|
+
begin
|
|
202
|
+
a_value = a.read if a_value.nil?
|
|
203
|
+
rescue Chef::ChefFS::FileSystem::NotFoundError
|
|
204
|
+
a_value = :none
|
|
205
|
+
end
|
|
206
|
+
begin
|
|
207
|
+
b_value = b.read if b_value.nil?
|
|
208
|
+
rescue Chef::ChefFS::FileSystem::NotFoundError
|
|
209
|
+
b_value = :none
|
|
210
|
+
end
|
|
211
|
+
are_same = (a_value == b_value)
|
|
212
|
+
end
|
|
213
|
+
[ are_same, a_value, b_value ]
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
private
|
|
217
|
+
|
|
218
|
+
# Copy two entries (could be files or dirs)
|
|
219
|
+
def self.copy_entries(src_entry, dest_entry, new_dest_parent, recurse_depth, options)
|
|
220
|
+
# A NOTE about this algorithm:
|
|
221
|
+
# There are cases where this algorithm does too many network requests.
|
|
222
|
+
# knife upload with a specific filename will first check if the file
|
|
223
|
+
# exists (a "dir" in the parent) before deciding whether to POST or
|
|
224
|
+
# PUT it. If we just tried PUT (or POST) and then tried the other if
|
|
225
|
+
# the conflict failed, we wouldn't need to check existence.
|
|
226
|
+
# On the other hand, we may already have DONE the request, in which
|
|
227
|
+
# case we shouldn't waste time trying PUT if we know the file doesn't
|
|
228
|
+
# exist.
|
|
229
|
+
# Will need to decide how that works with checksums, though.
|
|
230
|
+
|
|
231
|
+
if !src_entry.exists?
|
|
232
|
+
if options[:purge]
|
|
233
|
+
# If we would not have uploaded it, we will not purge it.
|
|
234
|
+
if src_entry.parent.can_have_child?(dest_entry.name, dest_entry.dir?)
|
|
235
|
+
if options[:dry_run]
|
|
236
|
+
puts "Would delete #{dest_entry.path_for_printing}"
|
|
237
|
+
else
|
|
238
|
+
dest_entry.delete(true)
|
|
239
|
+
puts "Deleted extra entry #{dest_entry.path_for_printing} (purge is on)"
|
|
240
|
+
end
|
|
241
|
+
else
|
|
242
|
+
Chef::Log.info("Not deleting extra entry #{dest_entry.path_for_printing} (purge is off)")
|
|
243
|
+
end
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
elsif !dest_entry.exists?
|
|
247
|
+
if new_dest_parent.can_have_child?(src_entry.name, src_entry.dir?)
|
|
248
|
+
# If the entry can do a copy directly from filesystem, do that.
|
|
249
|
+
if new_dest_parent.respond_to?(:create_child_from)
|
|
250
|
+
if options[:dry_run]
|
|
251
|
+
puts "Would create #{dest_entry.path_for_printing}"
|
|
252
|
+
else
|
|
253
|
+
new_dest_parent.create_child_from(src_entry)
|
|
254
|
+
puts "Created #{dest_entry.path_for_printing}"
|
|
255
|
+
end
|
|
256
|
+
return
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
if src_entry.dir?
|
|
260
|
+
if options[:dry_run]
|
|
261
|
+
puts "Would create #{dest_entry.path_for_printing}"
|
|
262
|
+
new_dest_dir = new_dest_parent.child(src_entry.name)
|
|
263
|
+
else
|
|
264
|
+
new_dest_dir = new_dest_parent.create_child(src_entry.name, nil)
|
|
265
|
+
puts "Created #{dest_entry.path_for_printing}/"
|
|
266
|
+
end
|
|
267
|
+
# Directory creation is recursive.
|
|
268
|
+
if recurse_depth != 0
|
|
269
|
+
src_entry.children.each do |src_child|
|
|
270
|
+
new_dest_child = new_dest_dir.child(src_child.name)
|
|
271
|
+
copy_entries(src_child, new_dest_child, new_dest_dir, recurse_depth ? recurse_depth - 1 : recurse_depth, options)
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
else
|
|
275
|
+
if options[:dry_run]
|
|
276
|
+
puts "Would create #{dest_entry.path_for_printing}"
|
|
277
|
+
else
|
|
278
|
+
new_dest_parent.create_child(src_entry.name, src_entry.read)
|
|
279
|
+
puts "Created #{dest_entry.path_for_printing}"
|
|
280
|
+
end
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
else
|
|
285
|
+
# Both exist.
|
|
286
|
+
|
|
287
|
+
# If the entry can do a copy directly, do that.
|
|
288
|
+
if dest_entry.respond_to?(:copy_from)
|
|
289
|
+
if options[:force] || compare(src_entry, dest_entry)[0] == false
|
|
290
|
+
if options[:dry_run]
|
|
291
|
+
puts "Would update #{dest_entry.path_for_printing}"
|
|
292
|
+
else
|
|
293
|
+
dest_entry.copy_from(src_entry)
|
|
294
|
+
puts "Updated #{dest_entry.path_for_printing}"
|
|
295
|
+
end
|
|
296
|
+
end
|
|
297
|
+
return
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
# If they are different types, log an error.
|
|
301
|
+
if src_entry.dir?
|
|
302
|
+
if dest_entry.dir?
|
|
303
|
+
# If both are directories, recurse into their children
|
|
304
|
+
if recurse_depth != 0
|
|
305
|
+
child_pairs(src_entry, dest_entry).each do |src_child, dest_child|
|
|
306
|
+
copy_entries(src_child, dest_child, dest_entry, recurse_depth ? recurse_depth - 1 : recurse_depth, options)
|
|
307
|
+
end
|
|
308
|
+
end
|
|
309
|
+
else
|
|
310
|
+
# If they are different types.
|
|
311
|
+
Chef::Log.error("File #{dest_entry.path_for_printing} is a directory while file #{dest_entry.path_for_printing} is a regular file\n")
|
|
312
|
+
return
|
|
313
|
+
end
|
|
314
|
+
else
|
|
315
|
+
if dest_entry.dir?
|
|
316
|
+
Chef::Log.error("File #{dest_entry.path_for_printing} is a directory while file #{dest_entry.path_for_printing} is a regular file\n")
|
|
317
|
+
return
|
|
318
|
+
else
|
|
319
|
+
|
|
320
|
+
# Both are files! Copy them unless we're sure they are the same.
|
|
321
|
+
if options[:force]
|
|
322
|
+
should_copy = true
|
|
323
|
+
src_value = nil
|
|
324
|
+
else
|
|
325
|
+
are_same, src_value, dest_value = compare(src_entry, dest_entry)
|
|
326
|
+
should_copy = !are_same
|
|
327
|
+
end
|
|
328
|
+
if should_copy
|
|
329
|
+
if options[:dry_run]
|
|
330
|
+
puts "Would update #{dest_entry.path_for_printing}"
|
|
331
|
+
else
|
|
332
|
+
src_value = src_entry.read if src_value.nil?
|
|
333
|
+
dest_entry.write(src_value)
|
|
334
|
+
puts "Updated #{dest_entry.path_for_printing}"
|
|
335
|
+
end
|
|
336
|
+
end
|
|
337
|
+
end
|
|
338
|
+
end
|
|
339
|
+
end
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
def self.get_or_create_parent(entry, options)
|
|
343
|
+
parent = entry.parent
|
|
344
|
+
if parent && !parent.exists?
|
|
345
|
+
parent_parent = get_or_create_parent(entry.parent, options)
|
|
346
|
+
if options[:dry_run]
|
|
347
|
+
puts "Would create #{parent.path_for_printing}"
|
|
348
|
+
else
|
|
349
|
+
parent = parent_parent.create_child(parent.name, true)
|
|
350
|
+
puts "Created #{parent.path_for_printing}"
|
|
351
|
+
end
|
|
352
|
+
end
|
|
353
|
+
return parent
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
end
|
|
357
|
+
end
|
|
358
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: John Keiser (<jkeiser@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2012 Opscode, Inc.
|
|
4
|
+
# License:: Apache License, Version 2.0
|
|
5
|
+
#
|
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
# you may not use this file except in compliance with the License.
|
|
8
|
+
# You may obtain a copy of the License at
|
|
9
|
+
#
|
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
#
|
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
# See the License for the specific language governing permissions and
|
|
16
|
+
# limitations under the License.
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
require 'chef/chef_fs/file_system/base_fs_object'
|
|
20
|
+
require 'chef/chef_fs/file_system/nonexistent_fs_object'
|
|
21
|
+
|
|
22
|
+
class Chef
|
|
23
|
+
module ChefFS
|
|
24
|
+
module FileSystem
|
|
25
|
+
class BaseFSDir < BaseFSObject
|
|
26
|
+
def initialize(name, parent)
|
|
27
|
+
super
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def dir?
|
|
31
|
+
true
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Override child(name) to provide a child object by name without the network read
|
|
35
|
+
def child(name)
|
|
36
|
+
children.select { |child| child.name == name }.first || NonexistentFSObject.new(name, self)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def can_have_child?(name, is_dir)
|
|
40
|
+
true
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Abstract: children
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: John Keiser (<jkeiser@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2012 Opscode, Inc.
|
|
4
|
+
# License:: Apache License, Version 2.0
|
|
5
|
+
#
|
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
# you may not use this file except in compliance with the License.
|
|
8
|
+
# You may obtain a copy of the License at
|
|
9
|
+
#
|
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
#
|
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
# See the License for the specific language governing permissions and
|
|
16
|
+
# limitations under the License.
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
require 'chef/chef_fs/path_utils'
|
|
20
|
+
|
|
21
|
+
class Chef
|
|
22
|
+
module ChefFS
|
|
23
|
+
module FileSystem
|
|
24
|
+
class BaseFSObject
|
|
25
|
+
def initialize(name, parent)
|
|
26
|
+
@parent = parent
|
|
27
|
+
@name = name
|
|
28
|
+
if parent
|
|
29
|
+
@path = Chef::ChefFS::PathUtils::join(parent.path, name)
|
|
30
|
+
else
|
|
31
|
+
if name != ''
|
|
32
|
+
raise ArgumentError, "Name of root object must be empty string: was '#{name}' instead"
|
|
33
|
+
end
|
|
34
|
+
@path = '/'
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
attr_reader :name
|
|
39
|
+
attr_reader :parent
|
|
40
|
+
attr_reader :path
|
|
41
|
+
|
|
42
|
+
def root
|
|
43
|
+
parent ? parent.root : self
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def path_for_printing
|
|
47
|
+
if parent
|
|
48
|
+
parent_path = parent.path_for_printing
|
|
49
|
+
if parent_path == '.'
|
|
50
|
+
name
|
|
51
|
+
else
|
|
52
|
+
Chef::ChefFS::PathUtils::join(parent.path_for_printing, name)
|
|
53
|
+
end
|
|
54
|
+
else
|
|
55
|
+
name
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def dir?
|
|
60
|
+
false
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def exists?
|
|
64
|
+
true
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def child(name)
|
|
68
|
+
NonexistentFSObject.new(name, self)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Override can_have_child? to report whether a given file *could* be added
|
|
72
|
+
# to this directory. (Some directories can't have subdirs, some can only have .json
|
|
73
|
+
# files, etc.)
|
|
74
|
+
def can_have_child?(name, is_dir)
|
|
75
|
+
false
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Override this if you have a special comparison algorithm that can tell
|
|
79
|
+
# you whether this entry is the same as another--either a quicker or a
|
|
80
|
+
# more reliable one. Callers will use this to decide whether to upload,
|
|
81
|
+
# download or diff an object.
|
|
82
|
+
#
|
|
83
|
+
# You should not override this if you're going to do the standard
|
|
84
|
+
# +self.read == other.read+. If you return +nil+, the caller will call
|
|
85
|
+
# +other.compare_to(you)+ instead. Give them a chance :)
|
|
86
|
+
#
|
|
87
|
+
# ==== Parameters
|
|
88
|
+
#
|
|
89
|
+
# * +other+ - the entry to compare to
|
|
90
|
+
#
|
|
91
|
+
# ==== Returns
|
|
92
|
+
#
|
|
93
|
+
# * +[ are_same, value, other_value ]+
|
|
94
|
+
# +are_same+ may be +true+, +false+ or +nil+ (which means "don't know").
|
|
95
|
+
# +value+ and +other_value+ must either be the text of +self+ or +other+,
|
|
96
|
+
# +:none+ (if the entry does not exist or has no value) or +nil+ if the
|
|
97
|
+
# value was not retrieved.
|
|
98
|
+
# * +nil+ if a definitive answer cannot be had and nothing was retrieved.
|
|
99
|
+
#
|
|
100
|
+
# ==== Example
|
|
101
|
+
#
|
|
102
|
+
# are_same, value, other_value = entry.compare_to(other)
|
|
103
|
+
# if are_same.nil?
|
|
104
|
+
# are_same, other_value, value = other.compare_to(entry)
|
|
105
|
+
# end
|
|
106
|
+
# if are_same.nil?
|
|
107
|
+
# value = entry.read if value.nil?
|
|
108
|
+
# other_value = entry.read if other_value.nil?
|
|
109
|
+
# are_same = (value == other_value)
|
|
110
|
+
# end
|
|
111
|
+
def compare_to(other)
|
|
112
|
+
return nil
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Important directory attributes: name, parent, path, root
|
|
116
|
+
# Overridable attributes: dir?, child(name), path_for_printing
|
|
117
|
+
# Abstract: read, write, delete, children
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|