chef 11.4.4 → 11.6.0.hotfix.1
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/README.md +1 -1
- data/Rakefile +18 -1
- data/bin/chef-service-manager +37 -0
- 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/chef-shell.1.html +4 -4
- data/distro/common/html/chef-solo.8.html +12 -18
- 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 +7 -10
- data/distro/common/html/knife-data-bag.1.html +7 -10
- data/distro/common/html/knife-environment.1.html +6 -8
- data/distro/common/html/knife-exec.1.html +4 -4
- 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 +4 -4
- data/distro/common/man/man1/chef-shell.1 +1 -1
- 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 +2 -15
- data/distro/common/man/man1/knife-data-bag.1 +2 -15
- data/distro/common/man/man1/knife-environment.1 +2 -12
- data/distro/common/man/man1/knife-exec.1 +1 -1
- 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 +1 -1
- 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 +4 -36
- data/distro/common/man/man8/chef-solr.8 +1 -1
- data/distro/debian/etc/init.d/chef-client +4 -2
- data/distro/windows/service_manager.rb +2 -146
- data/lib/chef.rb +1 -1
- data/lib/chef/application.rb +5 -12
- data/lib/chef/application/apply.rb +2 -0
- data/lib/chef/application/client.rb +12 -12
- data/lib/chef/application/knife.rb +2 -2
- data/lib/chef/application/solo.rb +4 -5
- data/lib/chef/application/windows_service.rb +113 -56
- data/lib/chef/application/windows_service_manager.rb +179 -0
- data/lib/chef/chef_fs.rb +2 -4
- data/lib/chef/chef_fs/chef_fs_data_store.rb +371 -0
- data/lib/chef/chef_fs/command_line.rb +145 -93
- data/lib/chef/chef_fs/config.rb +205 -0
- data/lib/chef/chef_fs/data_handler/acl_data_handler.rb +26 -0
- data/lib/chef/chef_fs/data_handler/client_data_handler.rb +38 -0
- data/lib/chef/chef_fs/data_handler/container_data_handler.rb +29 -0
- data/lib/chef/chef_fs/data_handler/cookbook_data_handler.rb +38 -0
- data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +56 -0
- data/lib/chef/chef_fs/data_handler/data_handler_base.rb +128 -0
- data/lib/chef/chef_fs/data_handler/environment_data_handler.rb +40 -0
- data/lib/chef/chef_fs/data_handler/group_data_handler.rb +51 -0
- data/lib/chef/chef_fs/data_handler/node_data_handler.rb +36 -0
- data/lib/chef/chef_fs/data_handler/role_data_handler.rb +40 -0
- data/lib/chef/chef_fs/data_handler/user_data_handler.rb +27 -0
- data/lib/chef/chef_fs/file_system.rb +195 -127
- data/lib/chef/chef_fs/file_system/acl_dir.rb +64 -0
- data/lib/chef/chef_fs/file_system/acl_entry.rb +58 -0
- data/lib/chef/chef_fs/file_system/acls_dir.rb +68 -0
- data/lib/chef/chef_fs/file_system/already_exists_error.rb +31 -0
- data/lib/chef/chef_fs/file_system/base_fs_object.rb +98 -39
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_dir.rb +85 -0
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_entry.rb +71 -0
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbooks_dir.rb +55 -0
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_data_bags_dir.rb +36 -0
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +14 -63
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb +93 -3
- data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +35 -9
- data/lib/chef/chef_fs/file_system/cookbook_dir.rb +67 -32
- data/lib/chef/chef_fs/file_system/cookbook_file.rb +13 -6
- data/lib/chef/chef_fs/file_system/cookbook_frozen_error.rb +31 -0
- data/lib/chef/chef_fs/file_system/cookbooks_acl_dir.rb +41 -0
- data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +102 -21
- data/lib/chef/chef_fs/file_system/data_bag_dir.rb +12 -21
- data/lib/chef/chef_fs/file_system/data_bags_dir.rb +14 -8
- data/lib/chef/chef_fs/file_system/default_environment_cannot_be_modified_error.rb +36 -0
- data/lib/chef/chef_fs/file_system/environments_dir.rb +60 -0
- data/lib/chef/chef_fs/file_system/file_system_entry.rb +8 -8
- data/lib/chef/chef_fs/file_system/file_system_error.rb +3 -1
- data/lib/chef/chef_fs/file_system/memory_dir.rb +52 -0
- data/lib/chef/chef_fs/file_system/memory_file.rb +17 -0
- data/lib/chef/chef_fs/file_system/memory_root.rb +21 -0
- data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +48 -0
- data/lib/chef/chef_fs/file_system/must_delete_recursively_error.rb +2 -2
- data/lib/chef/chef_fs/file_system/nodes_dir.rb +17 -9
- data/lib/chef/chef_fs/file_system/nonexistent_fs_object.rb +0 -4
- data/lib/chef/chef_fs/file_system/not_found_error.rb +2 -2
- data/lib/chef/chef_fs/file_system/operation_failed_error.rb +34 -0
- data/lib/chef/chef_fs/file_system/operation_not_allowed_error.rb +48 -0
- data/lib/chef/chef_fs/file_system/rest_list_dir.rb +42 -13
- data/lib/chef/chef_fs/file_system/rest_list_entry.rb +81 -27
- data/lib/chef/chef_fs/knife.rb +68 -29
- data/lib/chef/chef_fs/parallelizer.rb +129 -0
- data/lib/chef/chef_fs/path_utils.rb +29 -3
- data/lib/chef/chef_fs/raw_request.rb +79 -0
- data/lib/chef/client.rb +46 -20
- data/lib/chef/config.rb +59 -61
- data/lib/chef/cookbook/chefignore.rb +2 -1
- data/lib/chef/cookbook/synchronizer.rb +8 -6
- data/lib/chef/cookbook/syntax_check.rb +17 -2
- data/lib/chef/cookbook_uploader.rb +10 -1
- data/lib/chef/cookbook_version.rb +0 -109
- data/lib/chef/data_bag.rb +15 -6
- data/lib/chef/deprecation/mixin/template.rb +49 -0
- data/lib/chef/deprecation/provider/cookbook_file.rb +55 -0
- data/lib/chef/deprecation/provider/file.rb +197 -0
- data/lib/chef/deprecation/provider/remote_file.rb +86 -0
- data/lib/chef/deprecation/provider/template.rb +63 -0
- data/lib/chef/deprecation/warnings.rb +38 -0
- data/lib/chef/encrypted_data_bag_item.rb +153 -61
- data/lib/chef/environment.rb +34 -3
- data/lib/chef/event_dispatch/base.rb +3 -0
- data/lib/chef/exceptions.rb +27 -2
- data/lib/chef/file_access_control/unix.rb +64 -7
- data/lib/chef/file_access_control/windows.rb +22 -11
- data/lib/chef/file_content_management/content_base.rb +56 -0
- data/lib/chef/file_content_management/deploy.rb +38 -0
- data/lib/chef/file_content_management/deploy/cp.rb +48 -0
- data/lib/chef/file_content_management/deploy/mv_unix.rb +77 -0
- data/lib/chef/file_content_management/deploy/mv_windows.rb +95 -0
- data/lib/chef/file_content_management/tempfile.rb +61 -0
- data/lib/chef/formatters/doc.rb +1 -1
- data/lib/chef/formatters/error_descriptor.rb +5 -4
- data/lib/chef/formatters/error_inspectors/cookbook_resolve_error_inspector.rb +23 -3
- data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +4 -0
- data/lib/chef/json_compat.rb +3 -0
- data/lib/chef/knife.rb +12 -3
- data/lib/chef/knife/bootstrap.rb +46 -2
- data/lib/chef/knife/bootstrap/archlinux-gems.erb +3 -3
- data/lib/chef/knife/bootstrap/centos5-gems.erb +3 -3
- data/lib/chef/knife/bootstrap/chef-full.erb +4 -4
- data/lib/chef/knife/bootstrap/fedora13-gems.erb +3 -3
- data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +3 -3
- data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +3 -3
- data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +3 -3
- data/lib/chef/knife/client_show.rb +2 -5
- data/lib/chef/knife/configure.rb +3 -3
- data/lib/chef/knife/cookbook_create.rb +6 -5
- data/lib/chef/knife/cookbook_download.rb +13 -5
- data/lib/chef/knife/cookbook_site_share.rb +1 -0
- data/lib/chef/knife/cookbook_test.rb +1 -0
- data/lib/chef/knife/cookbook_upload.rb +4 -9
- data/lib/chef/knife/core/bootstrap_context.rb +10 -4
- data/lib/chef/knife/core/generic_presenter.rb +16 -0
- data/lib/chef/knife/core/node_editor.rb +1 -1
- data/lib/chef/knife/core/subcommand_loader.rb +43 -12
- data/lib/chef/knife/core/ui.rb +19 -4
- data/lib/chef/knife/delete.rb +76 -9
- data/lib/chef/knife/deps.rb +139 -0
- data/lib/chef/knife/diff.rb +22 -5
- data/lib/chef/knife/download.rb +16 -3
- data/lib/chef/knife/edit.rb +76 -0
- data/lib/chef/knife/environment_show.rb +2 -7
- data/lib/chef/knife/list.rb +91 -47
- data/lib/chef/knife/node_run_list_set.rb +66 -0
- data/lib/chef/knife/node_show.rb +1 -7
- data/lib/chef/knife/raw.rb +20 -64
- data/lib/chef/knife/role_show.rb +2 -4
- data/lib/chef/knife/search.rb +5 -6
- data/lib/chef/knife/show.rb +34 -11
- data/lib/chef/knife/ssh.rb +8 -0
- data/lib/chef/knife/upload.rb +23 -4
- data/lib/chef/knife/user_show.rb +2 -5
- data/lib/chef/knife/xargs.rb +265 -0
- data/lib/chef/log.rb +2 -2
- data/lib/chef/mixin/file_class.rb +0 -9
- data/lib/chef/mixin/language_include_recipe.rb +1 -1
- data/lib/chef/mixin/params_validate.rb +19 -9
- data/lib/chef/mixin/template.rb +126 -36
- data/lib/chef/mixin/windows_architecture_helper.rb +91 -0
- data/lib/chef/monkey_patches/file.rb +26 -0
- data/lib/chef/monkey_patches/net-ssh-multi.rb +140 -0
- data/lib/chef/monkey_patches/securerandom.rb +44 -0
- data/lib/chef/monologger.rb +93 -0
- data/lib/chef/node.rb +4 -0
- data/lib/chef/platform.rb +4 -490
- data/lib/chef/platform/provider_mapping.rb +529 -0
- data/lib/chef/{monkey_patches/dir.rb → platform/query_helpers.rb} +25 -19
- data/lib/chef/provider.rb +12 -9
- data/lib/chef/provider/batch.rb +35 -0
- data/lib/chef/provider/cookbook_file.rb +9 -78
- data/lib/chef/provider/cookbook_file/content.rb +49 -0
- data/lib/chef/provider/deploy.rb +24 -20
- data/lib/chef/provider/deploy/revision.rb +27 -0
- data/lib/chef/provider/directory.rb +19 -22
- data/lib/chef/provider/execute.rb +22 -5
- data/lib/chef/provider/file.rb +299 -217
- data/lib/chef/provider/file/content.rb +39 -0
- data/lib/chef/provider/git.rb +76 -43
- data/lib/chef/provider/group/usermod.rb +2 -2
- data/lib/chef/provider/ifconfig.rb +25 -35
- data/lib/chef/provider/ifconfig/debian.rb +71 -0
- data/lib/chef/provider/ifconfig/redhat.rb +47 -0
- data/lib/chef/provider/link.rb +10 -3
- data/lib/chef/provider/mount.rb +1 -1
- data/lib/chef/provider/mount/mount.rb +8 -3
- data/lib/chef/provider/mount/windows.rb +4 -1
- data/lib/chef/provider/package/portage.rb +9 -4
- data/lib/chef/provider/package/rubygems.rb +45 -10
- data/lib/chef/provider/package/smartos.rb +47 -36
- data/lib/chef/provider/package/yum.rb +19 -12
- data/lib/chef/provider/package/zypper.rb +45 -55
- data/lib/chef/provider/powershell_script.rb +77 -0
- data/lib/chef/provider/remote_directory.rb +5 -6
- data/lib/chef/provider/remote_file.rb +12 -108
- data/lib/chef/provider/remote_file/cache_control_data.rb +165 -0
- data/lib/chef/provider/remote_file/content.rb +75 -0
- data/lib/chef/provider/remote_file/fetcher.rb +43 -0
- data/lib/chef/provider/remote_file/ftp.rb +183 -0
- data/lib/chef/provider/remote_file/http.rb +124 -0
- data/lib/chef/provider/remote_file/local_file.rb +47 -0
- data/lib/chef/provider/route.rb +6 -2
- data/lib/chef/provider/script.rb +14 -2
- data/lib/chef/provider/service/macosx.rb +16 -10
- data/lib/chef/provider/service/solaris.rb +6 -5
- data/lib/chef/provider/template.rb +16 -78
- data/lib/chef/provider/template/content.rb +61 -0
- data/lib/chef/provider/user/solaris.rb +90 -0
- data/lib/chef/provider/user/useradd.rb +76 -63
- data/lib/chef/provider/windows_script.rb +73 -0
- data/lib/chef/providers.rb +16 -0
- data/lib/chef/resource.rb +23 -2
- data/lib/chef/resource/batch.rb +31 -0
- data/lib/chef/resource/conditional.rb +4 -0
- data/lib/chef/resource/conditional_action_not_nothing.rb +48 -0
- data/lib/chef/resource/file.rb +31 -3
- data/lib/chef/resource/link.rb +17 -0
- data/lib/chef/resource/lwrp_base.rb +1 -1
- data/lib/chef/resource/mount.rb +29 -2
- data/lib/chef/resource/powershell_script.rb +31 -0
- data/lib/chef/resource/remote_file.rb +47 -1
- data/lib/chef/resource/route.rb +1 -1
- data/lib/chef/resource/template.rb +145 -0
- data/lib/chef/resource/windows_script.rb +62 -0
- data/lib/chef/resource_collection.rb +45 -11
- data/lib/chef/resource_reporter.rb +81 -52
- data/lib/chef/resources.rb +2 -0
- data/lib/chef/rest.rb +13 -4
- data/lib/chef/rest/rest_request.rb +5 -1
- data/lib/chef/run_context/cookbook_compiler.rb +3 -3
- data/lib/chef/run_list/run_list_expansion.rb +1 -1
- data/lib/chef/run_lock.rb +7 -1
- data/lib/chef/runner.rb +0 -1
- data/lib/chef/scan_access_control.rb +6 -1
- data/lib/chef/search/query.rb +2 -2
- data/lib/chef/shell/shell_session.rb +2 -2
- data/lib/chef/util/backup.rb +84 -0
- data/lib/chef/util/diff.rb +145 -0
- data/lib/chef/util/file_edit.rb +1 -1
- data/lib/chef/util/selinux.rb +100 -0
- data/lib/chef/util/windows/net_user.rb +14 -1
- data/lib/chef/util/windows/volume.rb +2 -2
- data/lib/chef/version.rb +1 -1
- data/lib/chef/version/platform.rb +42 -0
- data/lib/chef/version_class.rb +1 -1
- data/lib/chef/version_constraint.rb +6 -5
- data/lib/chef/version_constraint/platform.rb +26 -0
- data/lib/chef/win32/api/file.rb +8 -2
- data/lib/chef/win32/version.rb +25 -8
- data/spec/data/apt/chef-integration-test-1.0/debian/changelog +5 -0
- data/spec/data/apt/chef-integration-test-1.0/debian/compat +1 -0
- data/spec/data/apt/chef-integration-test-1.0/debian/control +13 -0
- data/spec/data/apt/chef-integration-test-1.0/debian/copyright +34 -0
- data/spec/data/apt/chef-integration-test-1.0/debian/files +1 -0
- data/spec/data/apt/chef-integration-test-1.0/debian/rules +13 -0
- data/spec/data/apt/chef-integration-test-1.0/debian/source/format +1 -0
- data/spec/data/apt/chef-integration-test-1.1/debian/changelog +11 -0
- data/spec/data/apt/chef-integration-test-1.1/debian/compat +1 -0
- data/spec/data/apt/chef-integration-test-1.1/debian/control +13 -0
- data/spec/data/apt/chef-integration-test-1.1/debian/copyright +34 -0
- data/spec/data/apt/chef-integration-test-1.1/debian/files +1 -0
- data/spec/data/apt/chef-integration-test-1.1/debian/rules +13 -0
- data/spec/data/apt/chef-integration-test-1.1/debian/source/format +1 -0
- data/spec/data/apt/chef-integration-test_1.0-1_amd64.changes +22 -0
- data/spec/data/apt/chef-integration-test_1.0-1_amd64.deb +0 -0
- data/spec/data/apt/chef-integration-test_1.0.orig.tar.gz +0 -0
- data/spec/data/apt/chef-integration-test_1.1-1_amd64.changes +22 -0
- data/spec/data/apt/chef-integration-test_1.1-1_amd64.deb +0 -0
- data/spec/data/apt/chef-integration-test_1.1.orig.tar.gz +0 -0
- data/spec/data/apt/var/www/apt/conf/distributions +7 -0
- data/spec/data/apt/var/www/apt/conf/incoming +4 -0
- data/spec/data/apt/var/www/apt/conf/pulls +3 -0
- data/spec/data/apt/var/www/apt/db/checksums.db +0 -0
- data/spec/data/apt/var/www/apt/db/contents.cache.db +0 -0
- data/spec/data/apt/var/www/apt/db/packages.db +0 -0
- data/spec/data/apt/var/www/apt/db/references.db +0 -0
- data/spec/data/apt/var/www/apt/db/release.caches.db +0 -0
- data/spec/data/apt/var/www/apt/db/version +4 -0
- data/spec/data/apt/var/www/apt/dists/sid/Release +19 -0
- data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages +16 -0
- data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages.gz +0 -0
- data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Release +5 -0
- data/spec/data/apt/var/www/apt/dists/sid/main/binary-i386/Packages +0 -0
- data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.0-1_amd64.deb +0 -0
- data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.1-1_amd64.deb +0 -0
- data/spec/data/bootstrap/encrypted_data_bag_secret +1 -0
- data/spec/data/bootstrap/secret.erb +9 -0
- data/spec/data/cookbooks/ignorken/recipes/default.rb +1 -0
- data/spec/data/cookbooks/ignorken/recipes/ignoreme.rb +2 -0
- data/spec/data/cookbooks/openldap/files/default/.dotfile +1 -0
- data/spec/data/cookbooks/openldap/files/default/.ssh/id_rsa +1 -0
- data/spec/data/cookbooks/openldap/files/default/remotedir/.a_dotdir/.a_dotfile_in_a_dotdir +1 -0
- data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/.a_dotfile +1 -0
- data/spec/data/cookbooks/openldap/templates/default/all_windows_line_endings.erb +4 -0
- data/spec/data/cookbooks/openldap/templates/default/helper_test.erb +1 -0
- data/spec/data/cookbooks/openldap/templates/default/helpers_via_partial_test.erb +1 -0
- data/spec/data/cookbooks/openldap/templates/default/no_windows_line_endings.erb +4 -0
- data/spec/data/cookbooks/openldap/templates/default/some_windows_line_endings.erb +4 -0
- data/spec/data/cookbooks/preseed/files/default/preseed-file.seed +1 -0
- data/spec/data/cookbooks/preseed/templates/default/preseed-template.seed +1 -0
- data/spec/data/file-providers-method-snapshot-chef-11-4.json +127 -0
- data/spec/data/git_bundles/example-repo.gitbundle +0 -0
- data/spec/data/knife-home/.chef/plugins/knife/example_home_subcommand.rb +0 -0
- data/spec/data/knife_subcommand/test_yourself.rb +8 -0
- data/spec/data/null_config.rb +1 -0
- data/spec/data/partial_one.erb +1 -1
- data/spec/data/remote_file/nyan_cat.png.gz +0 -0
- data/spec/functional/file_content_management/deploy_strategies_spec.rb +238 -0
- data/spec/functional/knife/exec_spec.rb +2 -2
- data/spec/functional/provider/remote_file/cache_control_data_spec.rb +101 -0
- data/spec/functional/resource/batch_spec.rb +64 -0
- data/spec/functional/resource/cookbook_file_spec.rb +2 -3
- data/spec/functional/resource/deploy_revision_spec.rb +180 -0
- data/spec/functional/resource/directory_spec.rb +2 -2
- data/spec/functional/resource/file_spec.rb +17 -1
- data/spec/functional/resource/git_spec.rb +259 -0
- data/spec/functional/resource/link_spec.rb +422 -388
- data/spec/functional/resource/package_spec.rb +297 -0
- data/spec/functional/resource/powershell_spec.rb +188 -0
- data/spec/functional/resource/registry_spec.rb +8 -4
- data/spec/functional/resource/remote_directory_spec.rb +2 -2
- data/spec/functional/resource/remote_file_spec.rb +97 -29
- data/spec/functional/resource/template_spec.rb +173 -17
- data/spec/functional/resource/user_spec.rb +547 -0
- data/spec/functional/run_lock_spec.rb +5 -0
- data/spec/functional/shell_spec.rb +2 -1
- data/spec/functional/win32/service_manager_spec.rb +269 -0
- data/spec/functional/win32/versions_spec.rb +78 -0
- data/spec/integration/knife/chef_repo_path_spec.rb +805 -0
- data/spec/integration/knife/chef_repository_file_system_spec.rb +276 -0
- data/spec/integration/knife/chefignore_spec.rb +271 -0
- data/spec/integration/knife/delete_spec.rb +944 -0
- data/spec/integration/knife/deps_spec.rb +648 -0
- data/spec/integration/knife/diff_spec.rb +536 -0
- data/spec/integration/knife/download_spec.rb +962 -0
- data/spec/integration/knife/list_spec.rb +633 -0
- data/spec/integration/knife/raw_spec.rb +166 -0
- data/spec/integration/knife/redirection_spec.rb +57 -0
- data/spec/integration/knife/show_spec.rb +158 -0
- data/spec/integration/knife/upload_spec.rb +1060 -0
- data/spec/integration/solo/solo_spec.rb +41 -0
- data/spec/spec_helper.rb +55 -1
- data/spec/support/chef_helpers.rb +32 -0
- data/spec/support/platform_helpers.rb +40 -0
- data/spec/support/platforms/win32/spec_service.rb +59 -0
- data/spec/support/shared/functional/directory_resource.rb +43 -16
- data/spec/support/shared/functional/file_resource.rb +661 -20
- data/spec/support/shared/functional/securable_resource.rb +109 -8
- data/spec/support/shared/functional/securable_resource_with_reporting.rb +39 -31
- data/spec/support/shared/integration/integration_helper.rb +166 -0
- data/spec/support/shared/integration/knife_support.rb +171 -0
- data/spec/support/shared/unit/execute_resource.rb +125 -0
- data/spec/support/shared/unit/file_system_support.rb +8 -48
- data/spec/support/shared/unit/provider/file.rb +609 -0
- data/spec/support/shared/unit/provider/useradd_based_user_provider.rb +407 -0
- data/spec/support/shared/unit/script_resource.rb +52 -0
- data/spec/support/shared/unit/windows_script_resource.rb +48 -0
- data/spec/tiny_server.rb +13 -11
- data/spec/unit/application/client_spec.rb +39 -1
- data/spec/unit/application/knife_spec.rb +12 -0
- data/spec/unit/application/solo_spec.rb +1 -1
- data/spec/unit/application_spec.rb +57 -2
- data/spec/unit/chef_fs/diff_spec.rb +30 -31
- data/spec/unit/chef_fs/file_pattern_spec.rb +2 -2
- data/spec/unit/chef_fs/file_system_spec.rb +2 -3
- data/spec/unit/client_spec.rb +20 -1
- data/spec/unit/config_spec.rb +70 -52
- data/spec/unit/cookbook/synchronizer_spec.rb +49 -1
- data/spec/unit/cookbook/syntax_check_spec.rb +28 -3
- data/spec/unit/cookbook_loader_spec.rb +3 -2
- data/spec/unit/daemon_spec.rb +7 -7
- data/spec/unit/data_bag_spec.rb +7 -0
- data/spec/unit/deprecation_spec.rb +86 -0
- data/spec/unit/encrypted_data_bag_item_spec.rb +183 -88
- data/spec/unit/environment_spec.rb +98 -0
- data/spec/unit/exceptions_spec.rb +6 -1
- data/spec/unit/file_access_control_spec.rb +21 -1
- data/spec/unit/file_content_management/deploy/cp_spec.rb +46 -0
- data/spec/unit/file_content_management/deploy/mv_unix_spec.rb +103 -0
- data/spec/unit/file_content_management/deploy/mv_windows_spec.rb +179 -0
- data/spec/unit/formatters/error_inspectors/cookbook_resolve_error_inspector_spec.rb +38 -2
- data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +3 -2
- data/spec/unit/knife/bootstrap_spec.rb +128 -29
- data/spec/unit/knife/configure_spec.rb +42 -26
- data/spec/unit/knife/cookbook_download_spec.rb +24 -3
- data/spec/unit/knife/cookbook_upload_spec.rb +8 -4
- data/spec/unit/knife/core/bootstrap_context_spec.rb +78 -61
- data/spec/unit/knife/core/subcommand_loader_spec.rb +20 -0
- data/spec/unit/knife/core/ui_spec.rb +41 -0
- data/spec/unit/knife/node_run_list_set_spec.rb +140 -0
- data/spec/unit/knife_spec.rb +21 -0
- data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +1 -0
- data/spec/unit/mixin/params_validate_spec.rb +35 -0
- data/spec/unit/mixin/template_spec.rb +69 -57
- data/spec/unit/mixin/windows_architecture_helper_spec.rb +83 -0
- data/spec/unit/node_spec.rb +7 -0
- data/spec/unit/platform_spec.rb +15 -1
- data/spec/unit/provider/cookbook_file/content_spec.rb +40 -0
- data/spec/unit/provider/cookbook_file_spec.rb +26 -183
- data/spec/unit/provider/cron/solaris_spec.rb +1 -1
- data/spec/unit/provider/deploy/revision_spec.rb +19 -11
- data/spec/unit/provider/deploy_spec.rb +2 -2
- data/spec/unit/provider/directory_spec.rb +23 -23
- data/spec/unit/provider/execute_spec.rb +27 -1
- data/spec/unit/provider/file/content_spec.rb +101 -0
- data/spec/unit/provider/file_spec.rb +25 -484
- data/spec/unit/provider/git_spec.rb +224 -28
- data/spec/unit/provider/group/usermod_spec.rb +3 -1
- data/spec/unit/provider/ifconfig/debian_spec.rb +89 -0
- data/spec/unit/provider/ifconfig/redhat_spec.rb +71 -0
- data/spec/unit/provider/ifconfig_spec.rb +0 -33
- data/spec/unit/provider/mount/mount_spec.rb +33 -2
- data/spec/unit/provider/mount/windows_spec.rb +4 -1
- data/spec/unit/provider/mount_spec.rb +16 -6
- data/spec/unit/provider/package/portage_spec.rb +44 -0
- data/spec/unit/provider/package/rubygems_spec.rb +44 -1
- data/spec/unit/provider/package/smartos_spec.rb +3 -2
- data/spec/unit/provider/package/yum_spec.rb +36 -39
- data/spec/unit/provider/package/zypper_spec.rb +84 -22
- data/spec/unit/provider/package_spec.rb +0 -4
- data/spec/unit/provider/powershell_spec.rb +38 -0
- data/spec/unit/provider/remote_directory_spec.rb +0 -4
- data/spec/unit/provider/remote_file/cache_control_data_spec.rb +211 -0
- data/spec/unit/provider/remote_file/content_spec.rb +230 -0
- data/spec/unit/provider/remote_file/fetcher_spec.rb +75 -0
- data/spec/unit/provider/remote_file/ftp_spec.rb +224 -0
- data/spec/unit/provider/remote_file/http_spec.rb +319 -0
- data/spec/unit/provider/remote_file/local_file_spec.rb +60 -0
- data/spec/unit/provider/remote_file_spec.rb +33 -295
- data/spec/unit/provider/route_spec.rb +25 -9
- data/spec/unit/provider/service/macosx_spec.rb +176 -152
- data/spec/unit/provider/service/solaris_smf_service_spec.rb +21 -18
- data/spec/unit/provider/service/systemd_service_spec.rb +2 -2
- data/spec/unit/provider/service/upstart_service_spec.rb +2 -2
- data/spec/unit/provider/service_spec.rb +3 -3
- data/spec/unit/provider/template/content_spec.rb +78 -0
- data/spec/unit/provider/template_spec.rb +52 -184
- data/spec/unit/provider/user/solaris_spec.rb +80 -0
- data/spec/unit/provider/user/useradd_spec.rb +12 -358
- data/spec/unit/resource/batch_spec.rb +48 -0
- data/spec/unit/resource/conditional_action_not_nothing_spec.rb +45 -0
- data/spec/unit/resource/execute_spec.rb +3 -101
- data/spec/unit/resource/file_spec.rb +0 -5
- data/spec/unit/resource/group_spec.rb +9 -0
- data/spec/unit/resource/ifconfig_spec.rb +60 -1
- data/spec/unit/resource/link_spec.rb +1 -0
- data/spec/unit/resource/mount_spec.rb +37 -0
- data/spec/unit/resource/powershell_spec.rb +48 -0
- data/spec/unit/resource/remote_file_spec.rb +44 -4
- data/spec/unit/resource/route_spec.rb +1 -1
- data/spec/unit/resource/script_spec.rb +13 -36
- data/spec/unit/resource/template_spec.rb +111 -8
- data/spec/unit/resource/user_spec.rb +7 -0
- data/spec/unit/resource_collection_spec.rb +61 -32
- data/spec/unit/resource_reporter_spec.rb +115 -102
- data/spec/unit/resource_spec.rb +170 -1
- data/spec/unit/rest/auth_credentials_spec.rb +2 -2
- data/spec/unit/rest_spec.rb +6 -2
- data/spec/unit/run_context/cookbook_compiler_spec.rb +9 -0
- data/spec/unit/runner_spec.rb +1 -1
- data/spec/unit/scan_access_control_spec.rb +4 -2
- data/spec/unit/shell/shell_session_spec.rb +15 -2
- data/spec/unit/util/backup_spec.rb +149 -0
- data/spec/unit/util/diff_spec.rb +596 -0
- data/spec/unit/util/selinux_spec.rb +172 -0
- data/spec/unit/version/platform_spec.rb +61 -0
- data/spec/unit/version_constraint/platform_spec.rb +46 -0
- data/spec/unit/version_constraint_spec.rb +5 -0
- metadata +233 -10
- data/lib/chef/chef_fs/file_system/data_bag_item.rb +0 -59
- data/spec/unit/chef_fs/file_system/chef_server_root_dir_spec.rb +0 -237
- data/spec/unit/chef_fs/file_system/cookbooks_dir_spec.rb +0 -568
- data/spec/unit/chef_fs/file_system/data_bags_dir_spec.rb +0 -220
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Lamont Granquist (<lamont@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2013 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 'spec_helper'
|
|
20
|
+
|
|
21
|
+
describe Chef::Provider::RemoteFile::Fetcher do
|
|
22
|
+
|
|
23
|
+
let(:current_resource) { mock("current resource") }
|
|
24
|
+
let(:new_resource) { mock("new resource") }
|
|
25
|
+
let(:fetcher_instance) { mock("fetcher") }
|
|
26
|
+
|
|
27
|
+
describe "when passed an http url" do
|
|
28
|
+
let(:uri) { mock("uri", :scheme => "http" ) }
|
|
29
|
+
before do
|
|
30
|
+
Chef::Provider::RemoteFile::HTTP.should_receive(:new).and_return(fetcher_instance)
|
|
31
|
+
end
|
|
32
|
+
it "returns an http fetcher" do
|
|
33
|
+
described_class.for_resource(uri, new_resource, current_resource).should == fetcher_instance
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
describe "when passed an https url" do
|
|
38
|
+
let(:uri) { mock("uri", :scheme => "https" ) }
|
|
39
|
+
before do
|
|
40
|
+
Chef::Provider::RemoteFile::HTTP.should_receive(:new).and_return(fetcher_instance)
|
|
41
|
+
end
|
|
42
|
+
it "returns an http fetcher" do
|
|
43
|
+
described_class.for_resource(uri, new_resource, current_resource).should == fetcher_instance
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
describe "when passed an ftp url" do
|
|
48
|
+
let(:uri) { mock("uri", :scheme => "ftp" ) }
|
|
49
|
+
before do
|
|
50
|
+
Chef::Provider::RemoteFile::FTP.should_receive(:new).and_return(fetcher_instance)
|
|
51
|
+
end
|
|
52
|
+
it "returns an ftp fetcher" do
|
|
53
|
+
described_class.for_resource(uri, new_resource, current_resource).should == fetcher_instance
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
describe "when passed a file url" do
|
|
58
|
+
let(:uri) { mock("uri", :scheme => "file" ) }
|
|
59
|
+
before do
|
|
60
|
+
Chef::Provider::RemoteFile::LocalFile.should_receive(:new).and_return(fetcher_instance)
|
|
61
|
+
end
|
|
62
|
+
it "returns a localfile fetcher" do
|
|
63
|
+
described_class.for_resource(uri, new_resource, current_resource).should == fetcher_instance
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
describe "when passed a url we do not recognize" do
|
|
68
|
+
let(:uri) { mock("uri", :scheme => "xyzzy" ) }
|
|
69
|
+
it "throws an ArgumentError exception" do
|
|
70
|
+
lambda { described_class.for_resource(uri, new_resource, current_resource) }.should raise_error(ArgumentError)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
end
|
|
75
|
+
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Jesse Campbell (<hikeit@gmail.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2013 Jesse Campbell
|
|
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 'spec_helper'
|
|
20
|
+
|
|
21
|
+
describe Chef::Provider::RemoteFile::FTP do
|
|
22
|
+
let(:enclosing_directory) {
|
|
23
|
+
canonicalize_path(File.expand_path(File.join(CHEF_SPEC_DATA, "templates")))
|
|
24
|
+
}
|
|
25
|
+
let(:resource_path) {
|
|
26
|
+
canonicalize_path(File.expand_path(File.join(enclosing_directory, "seattle.txt")))
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
let(:new_resource) do
|
|
30
|
+
r = Chef::Resource::RemoteFile.new("remote file ftp backend test (new resource)")
|
|
31
|
+
r.ftp_active_mode(false)
|
|
32
|
+
r.path(resource_path)
|
|
33
|
+
r
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
let(:current_resource) do
|
|
37
|
+
Chef::Resource::RemoteFile.new("remote file ftp backend test (current resource)'")
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
let(:ftp) do
|
|
41
|
+
ftp = mock(Net::FTP, { })
|
|
42
|
+
ftp.stub!(:connect)
|
|
43
|
+
ftp.stub!(:login)
|
|
44
|
+
ftp.stub!(:voidcmd)
|
|
45
|
+
ftp.stub!(:mtime).and_return(Time.now)
|
|
46
|
+
ftp.stub!(:getbinaryfile)
|
|
47
|
+
ftp.stub!(:close)
|
|
48
|
+
ftp.stub!(:passive=)
|
|
49
|
+
ftp
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
let(:tempfile_path) { "/tmp/somedir/remote-file-ftp-backend-spec-test" }
|
|
53
|
+
|
|
54
|
+
let(:tempfile) do
|
|
55
|
+
t = StringIO.new
|
|
56
|
+
t.stub(:path).and_return(tempfile_path)
|
|
57
|
+
t
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
let(:uri) { URI.parse("ftp://opscode.com/seattle.txt") }
|
|
61
|
+
|
|
62
|
+
before(:each) do
|
|
63
|
+
Net::FTP.stub!(:new).with().and_return(ftp)
|
|
64
|
+
Tempfile.stub!(:new).and_return(tempfile)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
describe "when first created" do
|
|
68
|
+
|
|
69
|
+
it "throws an argument exception when no path is given" do
|
|
70
|
+
uri.path = ""
|
|
71
|
+
lambda { Chef::Provider::RemoteFile::FTP.new(uri, new_resource, current_resource) }.should raise_error(ArgumentError)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
it "throws an argument exception when only a / is given" do
|
|
75
|
+
uri.path = "/"
|
|
76
|
+
lambda { Chef::Provider::RemoteFile::FTP.new(uri, new_resource, current_resource) }.should raise_error(ArgumentError)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it "throws an argument exception when no filename is given" do
|
|
80
|
+
uri.path = "/the/whole/path/"
|
|
81
|
+
lambda { Chef::Provider::RemoteFile::FTP.new(uri, new_resource, current_resource) }.should raise_error(ArgumentError)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it "throws an argument exception when the typecode is invalid" do
|
|
85
|
+
uri.typecode = "d"
|
|
86
|
+
lambda { Chef::Provider::RemoteFile::FTP.new(uri, new_resource, current_resource) }.should raise_error(ArgumentError)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it "does not use passive mode when new_resource sets ftp_active_mode to true" do
|
|
90
|
+
new_resource.ftp_active_mode(true)
|
|
91
|
+
fetcher = Chef::Provider::RemoteFile::FTP.new(uri, new_resource, current_resource)
|
|
92
|
+
fetcher.use_passive_mode?.should be_false
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
it "uses passive mode when new_resource sets ftp_active_mode to false" do
|
|
96
|
+
new_resource.ftp_active_mode(false)
|
|
97
|
+
fetcher = Chef::Provider::RemoteFile::FTP.new(uri, new_resource, current_resource)
|
|
98
|
+
fetcher.use_passive_mode?.should be_true
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
describe "when fetching the object" do
|
|
103
|
+
|
|
104
|
+
let(:cache_control_data) { Chef::Provider::RemoteFile::CacheControlData.new(uri) }
|
|
105
|
+
let(:current_resource_checksum) { "e2a8938cc31754f6c067b35aab1d0d4864272e9bf8504536ef3e79ebf8432305" }
|
|
106
|
+
|
|
107
|
+
subject(:fetcher) { Chef::Provider::RemoteFile::FTP.new(uri, new_resource, current_resource) }
|
|
108
|
+
|
|
109
|
+
before do
|
|
110
|
+
current_resource.checksum(current_resource_checksum)
|
|
111
|
+
#Chef::Provider::RemoteFile::CacheControlData.should_receive(:load_and_validate).with(uri, current_resource_checksum).and_return(cache_control_data)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
it "should connect to the host from the uri on the default port 21" do
|
|
115
|
+
ftp.should_receive(:connect).with("opscode.com", 21)
|
|
116
|
+
fetcher.fetch
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
it "should set passive true when ftp_active_mode is false" do
|
|
120
|
+
new_resource.ftp_active_mode(false)
|
|
121
|
+
ftp.should_receive(:passive=).with(true)
|
|
122
|
+
fetcher.fetch
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
it "should set passive false when ftp_active_mode is false" do
|
|
126
|
+
new_resource.ftp_active_mode(true)
|
|
127
|
+
ftp.should_receive(:passive=).with(false)
|
|
128
|
+
fetcher.fetch
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
it "should use anonymous ftp when no userinfo is provided" do
|
|
132
|
+
ftp.should_receive(:login).with("anonymous", nil)
|
|
133
|
+
fetcher.fetch
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
context "and the URI specifies an alternate port" do
|
|
137
|
+
let(:uri) { URI.parse("ftp://opscode.com:8021/seattle.txt") }
|
|
138
|
+
|
|
139
|
+
it "should connect on an alternate port when one is provided" do
|
|
140
|
+
uri = URI.parse("ftp://opscode.com:8021/seattle.txt")
|
|
141
|
+
ftp.should_receive(:connect).with("opscode.com", 8021)
|
|
142
|
+
fetcher.fetch
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
context "and the URI contains a username and password" do
|
|
148
|
+
let(:uri) { URI.parse("ftp://the_user:the_password@opscode.com/seattle.txt") }
|
|
149
|
+
|
|
150
|
+
it "should use authenticated ftp when userinfo is provided" do
|
|
151
|
+
ftp.should_receive(:login).with("the_user", "the_password")
|
|
152
|
+
fetcher.fetch
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
context "and the uri sets the typecode to ascii" do
|
|
157
|
+
let(:uri) { URI.parse("ftp://the_user:the_password@opscode.com/seattle.txt;type=a") }
|
|
158
|
+
|
|
159
|
+
it "fetches the file with ascii typecode set" do
|
|
160
|
+
ftp.should_receive(:voidcmd).with("TYPE A").once
|
|
161
|
+
fetcher.fetch
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
context "and the uri sets the typecode to image" do
|
|
167
|
+
let(:uri) { URI.parse("ftp://the_user:the_password@opscode.com/seattle.txt;type=i") }
|
|
168
|
+
|
|
169
|
+
it "should accept image for the typecode" do
|
|
170
|
+
ftp.should_receive(:voidcmd).with("TYPE I").once
|
|
171
|
+
fetcher.fetch
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
context "and the uri specifies a nested path" do
|
|
177
|
+
let(:uri) { URI.parse("ftp://opscode.com/the/whole/path/seattle.txt") }
|
|
178
|
+
|
|
179
|
+
it "should fetch the file from the correct path" do
|
|
180
|
+
ftp.should_receive(:voidcmd).with("CWD the").once
|
|
181
|
+
ftp.should_receive(:voidcmd).with("CWD whole").once
|
|
182
|
+
ftp.should_receive(:voidcmd).with("CWD path").once
|
|
183
|
+
ftp.should_receive(:getbinaryfile).with("seattle.txt", tempfile.path)
|
|
184
|
+
fetcher.fetch
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
context "when not using last modified based conditional fetching" do
|
|
190
|
+
before do
|
|
191
|
+
new_resource.use_last_modified(false)
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
it "should return a tempfile in the result" do
|
|
195
|
+
result = fetcher.fetch
|
|
196
|
+
result.should equal(tempfile)
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
context "and proxying is enabled" do
|
|
202
|
+
before do
|
|
203
|
+
@original_config = Chef::Config.hash_dup
|
|
204
|
+
Chef::Config[:ftp_proxy] = "socks5://socks.example.com:5000"
|
|
205
|
+
Chef::Config[:ftp_proxy_user] = "bill"
|
|
206
|
+
Chef::Config[:ftp_proxy_pass] = "ted"
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
after do
|
|
210
|
+
Chef::Config.configuration = @original_config
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
it "fetches the file via the proxy" do
|
|
214
|
+
current_socks_server = ENV["SOCKS_SERVER"]
|
|
215
|
+
ENV.should_receive(:[]=).with("SOCKS_SERVER", "socks5://bill:ted@socks.example.com:5000").ordered
|
|
216
|
+
ENV.should_receive(:[]=).with("SOCKS_SERVER", current_socks_server).ordered
|
|
217
|
+
result = fetcher.fetch
|
|
218
|
+
result.should equal(tempfile)
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
end
|
|
224
|
+
end
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Lamont Granquist (<lamont@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2013 Lamont Granquist
|
|
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 'spec_helper'
|
|
20
|
+
|
|
21
|
+
describe Chef::Provider::RemoteFile::HTTP do
|
|
22
|
+
|
|
23
|
+
let(:uri) { URI.parse("http://opscode.com/seattle.txt") }
|
|
24
|
+
|
|
25
|
+
let(:existing_file_source) { nil }
|
|
26
|
+
|
|
27
|
+
let(:current_resource_checksum) { "41e78735319af11327e9d2ca8535ea1c191e5ac1f76bb08d88fe6c3f93a8c8e5" }
|
|
28
|
+
|
|
29
|
+
let(:current_resource) do
|
|
30
|
+
current_resource = Chef::Resource::RemoteFile.new("/tmp/foo.txt")
|
|
31
|
+
current_resource.source(existing_file_source) if existing_file_source
|
|
32
|
+
current_resource.checksum(current_resource_checksum)
|
|
33
|
+
current_resource
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
let(:new_resource) do
|
|
37
|
+
Chef::Resource::RemoteFile.new("/tmp/foo.txt")
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
subject(:fetcher) do
|
|
41
|
+
Chef::Provider::RemoteFile::HTTP.new(uri, new_resource, current_resource)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
let(:cache_control_data) { Chef::Provider::RemoteFile::CacheControlData.new(uri) }
|
|
45
|
+
|
|
46
|
+
describe "generating cache control headers" do
|
|
47
|
+
|
|
48
|
+
context "and there is no valid cache control data for this URI on disk" do
|
|
49
|
+
|
|
50
|
+
before do
|
|
51
|
+
Chef::Provider::RemoteFile::CacheControlData.should_receive(:load_and_validate).with(uri, current_resource_checksum).and_return(cache_control_data)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "does not add conditional GET headers" do
|
|
55
|
+
fetcher.conditional_get_headers.should == {}
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
context "and the resource specifies custom headers" do
|
|
59
|
+
before do
|
|
60
|
+
new_resource.headers("x-myapp-header" => "custom-header-value")
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it "has the user-specified custom headers" do
|
|
64
|
+
fetcher.headers.should == {"x-myapp-header" => "custom-header-value"}
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
context "and the cache control data matches the existing file" do
|
|
71
|
+
|
|
72
|
+
# http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.26
|
|
73
|
+
let(:etag) { "\"a-strong-unique-identifier\"" }
|
|
74
|
+
|
|
75
|
+
# http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3
|
|
76
|
+
let(:mtime) { "Tue, 21 May 2013 19:19:23 GMT" }
|
|
77
|
+
|
|
78
|
+
before do
|
|
79
|
+
cache_control_data.etag = etag
|
|
80
|
+
cache_control_data.mtime = mtime
|
|
81
|
+
|
|
82
|
+
Chef::Provider::RemoteFile::CacheControlData.should_receive(:load_and_validate).with(uri, current_resource_checksum).and_return(cache_control_data)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
context "and no conditional get features are enabled" do
|
|
86
|
+
before do
|
|
87
|
+
new_resource.use_conditional_get(false)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
it "does not add headers to the request" do
|
|
91
|
+
fetcher.headers.should == {}
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
context "and conditional get is enabled" do
|
|
96
|
+
before do
|
|
97
|
+
new_resource.use_conditional_get(true)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
it "adds If-None-Match and If-Modified-Since headers to the request" do
|
|
101
|
+
headers = fetcher.headers
|
|
102
|
+
headers["if-none-match"].should == etag
|
|
103
|
+
headers["if-modified-since"].should == mtime
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
context "and custom headers are provided" do
|
|
107
|
+
before do
|
|
108
|
+
new_resource.headers("x-myapp-header" => "app-specific-header",
|
|
109
|
+
"if-none-match" => "custom-etag",
|
|
110
|
+
"if-modified-since" => "custom-last-modified")
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it "preserves non-conflicting headers" do
|
|
114
|
+
fetcher.headers["x-myapp-header"].should == "app-specific-header"
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
it "prefers user-supplied cache control headers" do
|
|
118
|
+
headers = fetcher.headers
|
|
119
|
+
headers["if-none-match"].should == "custom-etag"
|
|
120
|
+
headers["if-modified-since"].should == "custom-last-modified"
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
context "and etag support is enabled" do
|
|
127
|
+
before do
|
|
128
|
+
new_resource.use_conditional_get(false)
|
|
129
|
+
new_resource.use_etags(true)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
it "only adds If-None-Match headers to the request" do
|
|
133
|
+
headers = fetcher.headers
|
|
134
|
+
headers["if-none-match"].should == etag
|
|
135
|
+
headers.should_not have_key("if-modified-since")
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
context "and mtime support is enabled" do
|
|
140
|
+
before do
|
|
141
|
+
new_resource.use_conditional_get(false)
|
|
142
|
+
new_resource.use_last_modified(true)
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
it "only adds If-Modified-Since headers to the request" do
|
|
146
|
+
headers = fetcher.headers
|
|
147
|
+
headers["if-modified-since"].should == mtime
|
|
148
|
+
headers.should_not have_key("if-none-match")
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
describe "when fetching the uri" do
|
|
156
|
+
|
|
157
|
+
let(:expected_http_opts) { {} }
|
|
158
|
+
let(:expected_http_args) { [uri, nil, nil, expected_http_opts] }
|
|
159
|
+
|
|
160
|
+
let(:tempfile_path) { "/tmp/chef-mock-tempfile-abc123" }
|
|
161
|
+
|
|
162
|
+
let(:tempfile) { mock(Tempfile, :path => tempfile_path) }
|
|
163
|
+
|
|
164
|
+
let(:last_response) { {} }
|
|
165
|
+
|
|
166
|
+
let(:rest) do
|
|
167
|
+
rest = mock(Chef::REST)
|
|
168
|
+
rest.stub!(:streaming_request).and_return(tempfile)
|
|
169
|
+
rest.stub!(:last_response).and_return(last_response)
|
|
170
|
+
rest
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
before do
|
|
174
|
+
new_resource.headers({})
|
|
175
|
+
new_resource.use_last_modified(false)
|
|
176
|
+
Chef::Provider::RemoteFile::CacheControlData.should_receive(:load_and_validate).with(uri, current_resource_checksum).and_return(cache_control_data)
|
|
177
|
+
|
|
178
|
+
Chef::REST.should_receive(:new).with(*expected_http_args).and_return(rest)
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
describe "and the request does not return new content" do
|
|
183
|
+
|
|
184
|
+
it "should propagate non-304 exceptions to the caller" do
|
|
185
|
+
r = Net::HTTPBadRequest.new("one", "two", "three")
|
|
186
|
+
e = Net::HTTPServerException.new("fake exception", r)
|
|
187
|
+
rest.stub!(:streaming_request).and_raise(e)
|
|
188
|
+
lambda { fetcher.fetch }.should raise_error(Net::HTTPServerException)
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
it "should return HTTPRetriableError when Chef::REST returns a 301" do
|
|
192
|
+
r = Net::HTTPMovedPermanently.new("one", "two", "three")
|
|
193
|
+
e = Net::HTTPRetriableError.new("301", r)
|
|
194
|
+
rest.stub!(:streaming_request).and_raise(e)
|
|
195
|
+
lambda { fetcher.fetch }.should raise_error(Net::HTTPRetriableError)
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
it "should return a nil tempfile for a 304 HTTPNotModifed" do
|
|
199
|
+
r = Net::HTTPNotModified.new("one", "two", "three")
|
|
200
|
+
e = Net::HTTPRetriableError.new("304", r)
|
|
201
|
+
rest.stub!(:streaming_request).and_raise(e)
|
|
202
|
+
result = fetcher.fetch
|
|
203
|
+
result.should be_nil
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
describe "and the request returns new content" do
|
|
209
|
+
|
|
210
|
+
let(:fetched_content_checksum) { "e2a8938cc31754f6c067b35aab1d0d4864272e9bf8504536ef3e79ebf8432305" }
|
|
211
|
+
|
|
212
|
+
before do
|
|
213
|
+
cache_control_data.should_receive(:save)
|
|
214
|
+
Chef::Digester.should_receive(:checksum_for_file).with(tempfile_path).and_return(fetched_content_checksum)
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
it "should return a tempfile" do
|
|
218
|
+
result = fetcher.fetch
|
|
219
|
+
result.should == tempfile
|
|
220
|
+
cache_control_data.etag.should be_nil
|
|
221
|
+
cache_control_data.mtime.should be_nil
|
|
222
|
+
cache_control_data.checksum.should == fetched_content_checksum
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
context "and the response does not contain an etag" do
|
|
226
|
+
let(:last_response) { {"etag" => nil} }
|
|
227
|
+
it "does not include an etag in the result" do
|
|
228
|
+
fetcher.fetch
|
|
229
|
+
cache_control_data.etag.should be_nil
|
|
230
|
+
cache_control_data.mtime.should be_nil
|
|
231
|
+
cache_control_data.checksum.should == fetched_content_checksum
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
context "and the response has an etag header" do
|
|
236
|
+
let(:last_response) { {"etag" => "abc123"} }
|
|
237
|
+
|
|
238
|
+
it "includes the etag value in the response" do
|
|
239
|
+
fetcher.fetch
|
|
240
|
+
cache_control_data.etag.should == "abc123"
|
|
241
|
+
cache_control_data.mtime.should be_nil
|
|
242
|
+
cache_control_data.checksum.should == fetched_content_checksum
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
context "and the response has no Date or Last-Modified header" do
|
|
248
|
+
let(:last_response) { {"date" => nil, "last_modified" => nil} }
|
|
249
|
+
it "does not set an mtime in the result" do
|
|
250
|
+
# RFC 2616 suggests that servers that do not set a Date header do not
|
|
251
|
+
# have a reliable clock, so no use in making them deal with dates.
|
|
252
|
+
fetcher.fetch
|
|
253
|
+
cache_control_data.etag.should be_nil
|
|
254
|
+
cache_control_data.mtime.should be_nil
|
|
255
|
+
cache_control_data.checksum.should == fetched_content_checksum
|
|
256
|
+
end
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
context "and the response has a Last-Modified header" do
|
|
260
|
+
let(:last_response) do
|
|
261
|
+
# Last-Modified should be preferred to Date if both are set
|
|
262
|
+
{"date" => "Fri, 17 May 2013 23:23:23 GMT", "last_modified" => "Fri, 17 May 2013 11:11:11 GMT"}
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
it "sets the mtime to the Last-Modified time in the response" do
|
|
266
|
+
fetcher.fetch
|
|
267
|
+
cache_control_data.etag.should be_nil
|
|
268
|
+
cache_control_data.mtime.should == last_response["last_modified"]
|
|
269
|
+
end
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
context "and the response has a Date header but no Last-Modified header" do
|
|
273
|
+
let(:last_response) do
|
|
274
|
+
{"date" => "Fri, 17 May 2013 23:23:23 GMT", "last_modified" => nil}
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
it "sets the mtime to the Date in the response" do
|
|
278
|
+
fetcher.fetch
|
|
279
|
+
cache_control_data.etag.should be_nil
|
|
280
|
+
cache_control_data.mtime.should == last_response["date"]
|
|
281
|
+
cache_control_data.checksum.should == fetched_content_checksum
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
context "and the target file is a tarball [CHEF-3140]" do
|
|
287
|
+
|
|
288
|
+
let(:uri) { URI.parse("http://opscode.com/tarball.tgz") }
|
|
289
|
+
let(:expected_http_opts) { {:disable_gzip => true} }
|
|
290
|
+
|
|
291
|
+
# CHEF-3140
|
|
292
|
+
# Some servers return tarballs as content type tar and encoding gzip, which
|
|
293
|
+
# is totally wrong. When this happens and gzip isn't disabled, Chef::REST
|
|
294
|
+
# will decompress the file for you, which is not at all what you expected
|
|
295
|
+
# to happen (you end up with an uncomressed tar archive instead of the
|
|
296
|
+
# gzipped tar archive you expected). To work around this behavior, we
|
|
297
|
+
# detect when users are fetching gzipped files and turn off gzip in
|
|
298
|
+
# Chef::REST.
|
|
299
|
+
|
|
300
|
+
it "should disable gzip compression in the client" do
|
|
301
|
+
# Before block in the parent context has set an expectation on
|
|
302
|
+
# Chef::REST.new() being called with expected arguments. Here we fufil
|
|
303
|
+
# that expectation, so that we can explicitly set it for this test.
|
|
304
|
+
# This is intended to provide insurance that refactoring of the parent
|
|
305
|
+
# context does not negate the value of this particular example.
|
|
306
|
+
Chef::REST.new(*expected_http_args)
|
|
307
|
+
Chef::REST.should_receive(:new).once.with(*expected_http_args).and_return(rest)
|
|
308
|
+
fetcher.fetch
|
|
309
|
+
cache_control_data.etag.should be_nil
|
|
310
|
+
cache_control_data.mtime.should be_nil
|
|
311
|
+
cache_control_data.checksum.should == fetched_content_checksum
|
|
312
|
+
end
|
|
313
|
+
end
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
end
|
|
319
|
+
|