chef 10.34.6-x86-mingw32 → 11.6.2-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -13
- data/CONTRIBUTING.md +155 -0
- data/README.md +89 -0
- data/Rakefile +18 -1
- data/bin/chef-apply +25 -0
- data/bin/chef-service-manager +37 -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 +4 -4
- data/distro/common/html/chef-solr.8.html +5 -5
- 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 +4 -4
- data/distro/common/html/knife-data-bag.1.html +4 -4
- data/distro/common/html/knife-environment.1.html +4 -4
- 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 +0 -99
- 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 +1 -1
- data/distro/common/man/man1/knife-data-bag.1 +1 -1
- data/distro/common/man/man1/knife-environment.1 +0 -168
- 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 +1 -1
- 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 +6 -4
- data/distro/windows/service_manager.rb +2 -146
- data/lib/chef.rb +3 -6
- data/lib/chef/api_client.rb +20 -130
- data/lib/chef/api_client/registration.rb +126 -0
- data/lib/chef/application.rb +68 -18
- data/lib/chef/application/apply.rb +162 -0
- data/lib/chef/application/client.rb +37 -22
- data/lib/chef/application/knife.rb +2 -4
- data/lib/chef/application/solo.rb +27 -13
- data/lib/chef/application/windows_service.rb +114 -54
- data/lib/chef/application/windows_service_manager.rb +179 -0
- data/lib/chef/applications.rb +1 -0
- data/lib/chef/chef_fs.rb +9 -0
- data/lib/chef/chef_fs/chef_fs_data_store.rb +371 -0
- data/lib/chef/chef_fs/command_line.rb +284 -0
- 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_pattern.rb +312 -0
- data/lib/chef/chef_fs/file_system.rb +426 -0
- 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_dir.rb +47 -0
- data/lib/chef/chef_fs/file_system/base_fs_object.rb +180 -0
- 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 +60 -0
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb +121 -0
- data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +110 -0
- data/lib/chef/chef_fs/file_system/cookbook_dir.rb +223 -0
- data/lib/chef/chef_fs/file_system/cookbook_file.rb +85 -0
- data/lib/chef/chef_fs/file_system/cookbook_frozen_error.rb +31 -0
- data/lib/chef/chef_fs/file_system/cookbook_subdir.rb +54 -0
- data/lib/chef/chef_fs/file_system/cookbooks_acl_dir.rb +41 -0
- data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +149 -0
- data/lib/chef/chef_fs/file_system/data_bag_dir.rb +69 -0
- data/lib/chef/chef_fs/file_system/data_bags_dir.rb +72 -0
- 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 +90 -0
- data/lib/chef/chef_fs/file_system/file_system_error.rb +33 -0
- data/lib/chef/chef_fs/file_system/file_system_root_dir.rb +31 -0
- 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 +31 -0
- data/lib/chef/chef_fs/file_system/nodes_dir.rb +55 -0
- data/lib/chef/chef_fs/file_system/nonexistent_fs_object.rb +36 -0
- data/lib/chef/chef_fs/file_system/not_found_error.rb +31 -0
- 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 +113 -0
- data/lib/chef/chef_fs/file_system/rest_list_entry.rb +177 -0
- data/lib/chef/chef_fs/knife.rb +116 -0
- data/lib/chef/chef_fs/parallelizer.rb +129 -0
- data/lib/chef/chef_fs/path_utils.rb +90 -0
- data/lib/chef/chef_fs/raw_request.rb +79 -0
- data/lib/chef/client.rb +111 -34
- data/lib/chef/config.rb +111 -102
- data/lib/chef/cookbook/chefignore.rb +2 -1
- data/lib/chef/cookbook/metadata.rb +0 -2
- data/lib/chef/cookbook/syntax_check.rb +76 -14
- data/lib/chef/cookbook_loader.rb +39 -26
- data/lib/chef/cookbook_uploader.rb +16 -9
- data/lib/chef/cookbook_version.rb +2 -410
- data/lib/chef/daemon.rb +24 -19
- data/lib/chef/data_bag.rb +20 -104
- data/lib/chef/data_bag_item.rb +2 -65
- 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/digester.rb +73 -0
- data/lib/chef/dsl.rb +6 -0
- data/lib/chef/dsl/data_query.rb +71 -0
- data/lib/chef/dsl/include_attribute.rb +63 -0
- data/lib/chef/dsl/include_recipe.rb +45 -0
- data/lib/chef/dsl/platform_introspection.rb +218 -0
- data/lib/chef/dsl/recipe.rb +87 -0
- data/lib/chef/dsl/registry_helper.rb +59 -0
- data/lib/chef/encrypted_data_bag_item.rb +171 -24
- data/lib/chef/environment.rb +39 -179
- data/lib/chef/event_dispatch/base.rb +3 -0
- data/lib/chef/exceptions.rb +107 -8
- 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/base.rb +4 -1
- 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/resource_failure_inspector.rb +8 -0
- data/lib/chef/json_compat.rb +15 -14
- data/lib/chef/knife.rb +99 -41
- data/lib/chef/knife/bootstrap.rb +46 -2
- data/lib/chef/knife/bootstrap/archlinux-gems.erb +1 -1
- data/lib/chef/knife/bootstrap/centos5-gems.erb +1 -1
- data/lib/chef/knife/bootstrap/chef-full.erb +1 -1
- data/lib/chef/knife/bootstrap/fedora13-gems.erb +1 -1
- data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +1 -1
- data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +1 -1
- data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +1 -1
- data/lib/chef/knife/client_show.rb +2 -5
- data/lib/chef/knife/configure.rb +19 -17
- data/lib/chef/knife/cookbook_create.rb +6 -5
- data/lib/chef/knife/cookbook_download.rb +13 -5
- data/lib/chef/knife/cookbook_metadata.rb +1 -0
- data/lib/chef/knife/cookbook_site_share.rb +1 -0
- data/lib/chef/knife/cookbook_test.rb +4 -2
- data/lib/chef/knife/cookbook_upload.rb +4 -4
- data/lib/chef/knife/core/bootstrap_context.rb +11 -5
- data/lib/chef/knife/core/generic_presenter.rb +42 -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/subcommand_loader.rb +43 -12
- data/lib/chef/knife/core/text_formatter.rb +23 -37
- data/lib/chef/knife/core/ui.rb +34 -13
- data/lib/chef/knife/delete.rb +106 -0
- data/lib/chef/knife/deps.rb +139 -0
- data/lib/chef/knife/diff.rb +63 -0
- data/lib/chef/knife/download.rb +63 -0
- data/lib/chef/knife/edit.rb +76 -0
- data/lib/chef/knife/environment_show.rb +2 -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 +153 -0
- 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 +64 -0
- data/lib/chef/knife/role_show.rb +2 -4
- data/lib/chef/knife/search.rb +45 -28
- data/lib/chef/knife/show.rb +55 -0
- data/lib/chef/knife/ssh.rb +14 -2
- data/lib/chef/knife/upload.rb +69 -0
- data/lib/chef/knife/user_create.rb +93 -0
- data/lib/chef/knife/user_delete.rb +46 -0
- data/lib/chef/knife/user_edit.rb +53 -0
- data/lib/chef/{provider/whyrun_safe_ruby_block.rb → knife/user_list.rb} +21 -9
- data/lib/chef/knife/user_reregister.rb +59 -0
- data/lib/chef/knife/user_show.rb +49 -0
- data/lib/chef/knife/xargs.rb +265 -0
- data/lib/chef/log.rb +2 -2
- data/lib/chef/mixin/checksum.rb +3 -3
- data/lib/chef/mixin/deep_merge.rb +78 -194
- data/lib/chef/mixin/deprecation.rb +35 -0
- data/lib/chef/mixin/file_class.rb +0 -9
- data/lib/chef/mixin/language.rb +22 -223
- data/lib/chef/mixin/language_include_attribute.rb +10 -36
- data/lib/chef/mixin/language_include_recipe.rb +7 -33
- data/lib/chef/mixin/params_validate.rb +0 -3
- data/lib/chef/mixin/recipe_definition_dsl_core.rb +10 -61
- data/lib/chef/mixin/securable.rb +32 -7
- data/lib/chef/mixin/template.rb +156 -26
- data/lib/chef/mixin/windows_architecture_helper.rb +91 -0
- data/lib/chef/mixins.rb +1 -5
- data/{spec/unit/monkey_patches/uri_spec.rb → lib/chef/monkey_patches/file.rb} +6 -14
- data/lib/chef/monkey_patches/net-ssh-multi.rb +140 -0
- data/lib/chef/monkey_patches/net_http.rb +0 -34
- data/lib/chef/monkey_patches/securerandom.rb +44 -0
- data/lib/chef/monologger.rb +93 -0
- data/lib/chef/node.rb +139 -308
- data/lib/chef/node/attribute.rb +367 -473
- data/lib/chef/node/attribute_collections.rb +206 -0
- data/lib/chef/node/immutable_collections.rb +186 -0
- data/lib/chef/platform.rb +4 -496
- data/lib/chef/platform/provider_mapping.rb +529 -0
- data/lib/chef/{mixin/check_helper.rb → platform/query_helpers.rb} +20 -9
- data/lib/chef/provider.rb +14 -58
- data/lib/chef/provider/batch.rb +35 -0
- data/lib/chef/provider/breakpoint.rb +6 -6
- data/lib/chef/provider/cookbook_file.rb +11 -80
- data/lib/chef/provider/cookbook_file/content.rb +49 -0
- data/lib/chef/provider/deploy.rb +26 -21
- data/lib/chef/provider/deploy/revision.rb +27 -0
- data/lib/chef/provider/directory.rb +12 -18
- data/lib/chef/provider/execute.rb +22 -5
- data/lib/chef/provider/file.rb +297 -248
- data/lib/chef/provider/file/content.rb +39 -0
- data/lib/chef/provider/git.rb +76 -43
- 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/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 +12 -3
- data/lib/chef/provider/lwrp_base.rb +150 -0
- 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/rpm.rb +2 -2
- data/lib/chef/provider/package/rubygems.rb +4 -1
- data/lib/chef/provider/package/smartos.rb +47 -36
- data/lib/chef/provider/package/zypper.rb +45 -55
- data/lib/chef/provider/powershell_script.rb +77 -0
- data/lib/chef/provider/registry_key.rb +156 -0
- data/lib/chef/provider/remote_directory.rb +6 -5
- data/lib/chef/provider/remote_file.rb +13 -100
- 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/ruby_block.rb +5 -2
- data/lib/chef/provider/script.rb +14 -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 +29 -81
- data/lib/chef/provider/service/simple.rb +1 -1
- data/lib/chef/provider/service/solaris.rb +6 -5
- data/lib/chef/provider/template.rb +16 -81
- data/lib/chef/provider/template/content.rb +61 -0
- 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 +50 -54
- data/lib/chef/provider/windows_script.rb +73 -0
- data/lib/chef/providers.rb +18 -1
- data/lib/chef/recipe.rb +14 -8
- data/lib/chef/resource.rb +52 -146
- data/lib/chef/resource/{whyrun_safe_ruby_block.rb → batch.rb} +10 -10
- 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/group.rb +1 -11
- data/lib/chef/resource/http_request.rb +2 -1
- data/lib/chef/resource/link.rb +17 -0
- data/lib/chef/resource/lwrp_base.rb +132 -0
- data/lib/chef/resource/mount.rb +39 -13
- data/lib/chef/resource/powershell_script.rb +31 -0
- 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 +62 -25
- data/lib/chef/resource/route.rb +1 -1
- data/lib/chef/resource/ruby_block.rb +2 -2
- data/lib/chef/resource/service.rb +14 -0
- data/lib/chef/resource/template.rb +145 -0
- data/lib/chef/resource/user.rb +0 -18
- data/lib/chef/resource/windows_script.rb +62 -0
- data/lib/chef/resource_collection.rb +69 -31
- data/lib/chef/resource_reporter.rb +81 -52
- data/lib/chef/resources.rb +4 -1
- data/lib/chef/rest.rb +55 -127
- data/lib/chef/rest/auth_credentials.rb +4 -20
- data/lib/chef/rest/rest_request.rb +7 -8
- 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 +1 -16
- data/lib/chef/run_lock.rb +96 -0
- data/lib/chef/runner.rb +28 -6
- data/lib/chef/sandbox.rb +15 -148
- data/lib/chef/scan_access_control.rb +8 -5
- data/lib/chef/search/query.rb +2 -2
- 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} +15 -13
- data/lib/chef/shell_out.rb +7 -0
- data/lib/chef/user.rb +182 -0
- 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_group.rb +1 -5
- 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/{index_queue.rb → version_constraint/platform.rb} +11 -14
- data/lib/chef/win32/api/file.rb +8 -2
- data/lib/chef/win32/api/security.rb +45 -1
- data/lib/chef/win32/registry.rb +382 -0
- data/lib/chef/win32/security.rb +19 -0
- 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/attributes/default.rb +10 -9
- data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
- 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_subcommand/test_yourself.rb +8 -0
- 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/null_config.rb +1 -0
- data/spec/data/partial_one.erb +1 -0
- data/spec/data/remote_file/nyan_cat.png.gz +0 -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/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/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 +10 -0
- data/spec/functional/dsl/registry_helper_spec.rb +63 -0
- data/spec/functional/file_content_management/deploy_strategies_spec.rb +238 -0
- data/spec/functional/knife/cookbook_delete_spec.rb +1 -1
- data/spec/functional/knife/exec_spec.rb +3 -3
- data/spec/functional/knife/smoke_test.rb +34 -0
- data/spec/functional/knife/ssh_spec.rb +5 -1
- 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 +15 -9
- data/spec/functional/resource/deploy_revision_spec.rb +180 -0
- data/spec/functional/resource/directory_spec.rb +5 -1
- data/spec/functional/resource/file_spec.rb +71 -21
- data/spec/functional/resource/git_spec.rb +259 -0
- data/spec/functional/resource/link_spec.rb +424 -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 +576 -0
- data/spec/functional/resource/remote_directory_spec.rb +143 -37
- data/spec/functional/resource/remote_file_spec.rb +99 -13
- data/spec/functional/resource/template_spec.rb +180 -3
- data/spec/functional/resource/user_spec.rb +547 -0
- data/spec/functional/run_lock_spec.rb +243 -0
- data/spec/functional/shell_spec.rb +102 -0
- data/spec/functional/win32/registry_helper_spec.rb +632 -0
- data/spec/functional/win32/security_spec.rb +37 -0
- 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 +49 -13
- data/spec/stress/win32/security_spec.rb +1 -1
- data/spec/support/chef_helpers.rb +33 -3
- data/spec/support/lib/chef/resource/cat.rb +3 -5
- data/spec/support/lib/chef/resource/one_two_three_four.rb +8 -10
- data/spec/support/lib/chef/resource/zen_master.rb +8 -10
- data/spec/support/platform_helpers.rb +46 -13
- data/spec/support/platforms/win32/spec_service.rb +59 -0
- data/spec/support/shared/functional/diff_disabled.rb +10 -0
- data/spec/support/shared/functional/directory_resource.rb +129 -38
- data/spec/support/shared/functional/file_resource.rb +837 -71
- data/spec/support/shared/functional/securable_resource.rb +189 -58
- data/spec/support/shared/functional/securable_resource_with_reporting.rb +385 -0
- 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 +70 -0
- data/spec/support/shared/unit/platform_introspector.rb +162 -0
- 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/api_client/registration_spec.rb +172 -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 +16 -14
- data/spec/unit/application/knife_spec.rb +17 -0
- data/spec/unit/application/solo_spec.rb +1 -1
- data/spec/unit/application_spec.rb +113 -3
- 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_spec.rb +135 -0
- data/spec/unit/client_spec.rb +195 -23
- data/spec/unit/config_spec.rb +102 -51
- data/spec/unit/cookbook/syntax_check_spec.rb +75 -111
- data/spec/unit/cookbook_loader_spec.rb +154 -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 +24 -19
- data/spec/unit/data_bag_spec.rb +13 -4
- data/spec/unit/deprecation_spec.rb +86 -0
- 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 +197 -157
- data/spec/unit/environment_spec.rb +94 -126
- data/spec/unit/exceptions_spec.rb +8 -4
- 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 +6 -5
- data/spec/unit/json_compat_spec.rb +8 -0
- data/spec/unit/knife/bootstrap_spec.rb +130 -29
- data/spec/unit/knife/configure_spec.rb +64 -45
- data/spec/unit/knife/cookbook_download_spec.rb +24 -3
- 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 +39 -0
- data/spec/unit/knife/core/bootstrap_context_spec.rb +79 -62
- data/spec/unit/knife/core/subcommand_loader_spec.rb +20 -0
- data/spec/unit/knife/core/ui_spec.rb +196 -124
- 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/node_run_list_set_spec.rb +140 -0
- data/spec/unit/knife/ssh_spec.rb +12 -15
- data/spec/unit/knife/status_spec.rb +2 -2
- data/spec/unit/knife/user_create_spec.rb +86 -0
- data/spec/unit/knife/user_delete_spec.rb +39 -0
- data/spec/unit/knife/user_edit_spec.rb +42 -0
- data/spec/unit/knife/user_list_spec.rb +32 -0
- data/spec/unit/knife/user_reregister_spec.rb +53 -0
- data/spec/unit/knife/user_show_spec.rb +41 -0
- data/spec/unit/knife_spec.rb +74 -0
- data/spec/unit/lwrp_spec.rb +102 -60
- data/spec/unit/mixin/checksum_spec.rb +2 -2
- data/spec/unit/mixin/deep_merge_spec.rb +130 -791
- data/spec/unit/mixin/deprecation_spec.rb +23 -0
- data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +7 -1
- data/spec/unit/mixin/params_validate_spec.rb +4 -2
- data/spec/unit/mixin/securable_spec.rb +5 -3
- data/spec/unit/mixin/template_spec.rb +145 -14
- data/spec/unit/mixin/windows_architecture_helper_spec.rb +83 -0
- data/spec/unit/node/attribute_spec.rb +273 -173
- data/spec/unit/node/immutable_collections_spec.rb +139 -0
- data/spec/unit/node_spec.rb +418 -370
- data/spec/unit/platform_spec.rb +21 -8
- data/spec/unit/provider/breakpoint_spec.rb +8 -8
- data/spec/unit/provider/cookbook_file/content_spec.rb +40 -0
- data/spec/unit/provider/cookbook_file_spec.rb +26 -187
- 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 +99 -67
- data/spec/unit/provider/env_spec.rb +2 -2
- 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 -475
- data/spec/unit/provider/git_spec.rb +224 -28
- 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 +9 -22
- 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/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/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/rpm_spec.rb +0 -12
- data/spec/unit/provider/package/rubygems_spec.rb +1 -1
- data/spec/unit/provider/package/smartos_spec.rb +3 -2
- data/spec/unit/provider/package/zypper_spec.rb +84 -22
- data/spec/unit/provider/package_spec.rb +7 -9
- data/spec/unit/provider/powershell_spec.rb +38 -0
- data/spec/unit/provider/registry_key_spec.rb +269 -0
- data/spec/unit/provider/remote_directory_spec.rb +7 -7
- 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 -259
- data/spec/unit/provider/route_spec.rb +29 -12
- 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 +176 -207
- 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/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 +11 -11
- data/spec/unit/provider/service_spec.rb +3 -3
- data/spec/unit/provider/subversion_spec.rb +1 -1
- data/spec/unit/provider/template/content_spec.rb +78 -0
- data/spec/unit/provider/template_spec.rb +52 -160
- data/spec/unit/provider/user/dscl_spec.rb +285 -681
- data/spec/unit/provider/user/solaris_spec.rb +39 -373
- data/spec/unit/provider/user/useradd_spec.rb +12 -379
- data/spec/unit/provider/user_spec.rb +1 -1
- data/spec/unit/recipe_spec.rb +10 -8
- data/spec/unit/registry_helper_spec.rb +376 -0
- 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 -11
- data/spec/unit/resource/powershell_spec.rb +48 -0
- data/spec/unit/resource/registry_key_spec.rb +171 -0
- data/spec/unit/resource/remote_file_spec.rb +63 -25
- data/spec/unit/resource/route_spec.rb +1 -1
- data/spec/unit/resource/ruby_block_spec.rb +7 -3
- data/spec/unit/resource/script_spec.rb +13 -36
- data/spec/unit/resource/service_spec.rb +11 -0
- 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 +197 -5
- data/spec/unit/rest/auth_credentials_spec.rb +4 -21
- data/spec/unit/rest_spec.rb +134 -284
- data/spec/unit/run_context/cookbook_compiler_spec.rb +190 -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 +102 -3
- data/spec/unit/scan_access_control_spec.rb +8 -6
- 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} +16 -58
- data/spec/unit/shell_out_spec.rb +18 -0
- data/spec/unit/{shef_spec.rb → shell_spec.rb} +20 -20
- data/spec/unit/user_spec.rb +255 -0
- 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 +493 -264
- 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/dir.rb +0 -36
- 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/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/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/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,166 @@
|
|
1
|
+
#
|
2
|
+
# Author:: John Keiser (<jkeiser@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
|
+
require 'support/shared/integration/integration_helper'
|
19
|
+
require 'chef/knife/raw'
|
20
|
+
require 'chef/knife/show'
|
21
|
+
|
22
|
+
describe 'knife raw' do
|
23
|
+
extend IntegrationSupport
|
24
|
+
include KnifeSupport
|
25
|
+
|
26
|
+
when_the_chef_server "has one of each thing" do
|
27
|
+
client 'x', '{}'
|
28
|
+
cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"' }
|
29
|
+
data_bag 'x', { 'y' => '{}' }
|
30
|
+
environment 'x', '{}'
|
31
|
+
node 'x', '{}'
|
32
|
+
role 'x', '{}'
|
33
|
+
user 'x', '{}'
|
34
|
+
|
35
|
+
it 'knife raw /nodes/x returns the node', :pending => (RUBY_VERSION < "1.9") do
|
36
|
+
knife('raw /nodes/x').should_succeed <<EOM
|
37
|
+
{
|
38
|
+
"name": "x",
|
39
|
+
"json_class": "Chef::Node",
|
40
|
+
"chef_type": "node",
|
41
|
+
"chef_environment": "_default",
|
42
|
+
"override": {
|
43
|
+
},
|
44
|
+
"normal": {
|
45
|
+
},
|
46
|
+
"default": {
|
47
|
+
},
|
48
|
+
"automatic": {
|
49
|
+
},
|
50
|
+
"run_list": [
|
51
|
+
|
52
|
+
]
|
53
|
+
}
|
54
|
+
EOM
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'knife raw /blarghle returns 404' do
|
58
|
+
knife('raw /blarghle').should_fail(/ERROR: Server responded with error 404 "Not Found"/)
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'knife raw -m DELETE /roles/x succeeds', :pending => (RUBY_VERSION < "1.9") do
|
62
|
+
knife('raw -m DELETE /roles/x').should_succeed <<EOM
|
63
|
+
{
|
64
|
+
"name": "x",
|
65
|
+
"description": "",
|
66
|
+
"json_class": "Chef::Role",
|
67
|
+
"chef_type": "role",
|
68
|
+
"default_attributes": {
|
69
|
+
},
|
70
|
+
"override_attributes": {
|
71
|
+
},
|
72
|
+
"run_list": [
|
73
|
+
|
74
|
+
],
|
75
|
+
"env_run_lists": {
|
76
|
+
}
|
77
|
+
}
|
78
|
+
EOM
|
79
|
+
knife('show /roles/x.json').should_fail "ERROR: /roles/x.json: No such file or directory\n"
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'knife raw -m PUT -i blah.txt /roles/x succeeds', :pending => (RUBY_VERSION < "1.9") do
|
83
|
+
Tempfile.open('raw_put_input') do |file|
|
84
|
+
file.write <<EOM
|
85
|
+
{
|
86
|
+
"name": "x",
|
87
|
+
"description": "eek",
|
88
|
+
"json_class": "Chef::Role",
|
89
|
+
"chef_type": "role",
|
90
|
+
"default_attributes": {
|
91
|
+
},
|
92
|
+
"override_attributes": {
|
93
|
+
},
|
94
|
+
"run_list": [
|
95
|
+
|
96
|
+
],
|
97
|
+
"env_run_lists": {
|
98
|
+
}
|
99
|
+
}
|
100
|
+
EOM
|
101
|
+
file.close
|
102
|
+
|
103
|
+
knife("raw -m PUT -i #{file.path} /roles/x").should_succeed <<EOM
|
104
|
+
{
|
105
|
+
"name": "x",
|
106
|
+
"description": "eek",
|
107
|
+
"json_class": "Chef::Role",
|
108
|
+
"chef_type": "role",
|
109
|
+
"default_attributes": {
|
110
|
+
},
|
111
|
+
"override_attributes": {
|
112
|
+
},
|
113
|
+
"run_list": [
|
114
|
+
|
115
|
+
],
|
116
|
+
"env_run_lists": {
|
117
|
+
}
|
118
|
+
}
|
119
|
+
EOM
|
120
|
+
knife('show /roles/x.json').should_succeed <<EOM
|
121
|
+
/roles/x.json:
|
122
|
+
{
|
123
|
+
"name": "x",
|
124
|
+
"description": "eek"
|
125
|
+
}
|
126
|
+
EOM
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
it 'knife raw -m POST -i blah.txt /roles succeeds', :pending => (RUBY_VERSION < "1.9") do
|
131
|
+
Tempfile.open('raw_put_input') do |file|
|
132
|
+
file.write <<EOM
|
133
|
+
{
|
134
|
+
"name": "y",
|
135
|
+
"description": "eek",
|
136
|
+
"json_class": "Chef::Role",
|
137
|
+
"chef_type": "role",
|
138
|
+
"default_attributes": {
|
139
|
+
},
|
140
|
+
"override_attributes": {
|
141
|
+
},
|
142
|
+
"run_list": [
|
143
|
+
|
144
|
+
],
|
145
|
+
"env_run_lists": {
|
146
|
+
}
|
147
|
+
}
|
148
|
+
EOM
|
149
|
+
file.close
|
150
|
+
|
151
|
+
knife("raw -m POST -i #{file.path} /roles").should_succeed <<EOM
|
152
|
+
{
|
153
|
+
"uri": "#{ChefZero::RSpec.server.url}/roles/y"
|
154
|
+
}
|
155
|
+
EOM
|
156
|
+
knife('show /roles/y.json').should_succeed <<EOM
|
157
|
+
/roles/y.json:
|
158
|
+
{
|
159
|
+
"name": "y",
|
160
|
+
"description": "eek"
|
161
|
+
}
|
162
|
+
EOM
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
#
|
2
|
+
# Author:: John Keiser (<jkeiser@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
|
+
require 'puma'
|
19
|
+
require 'support/shared/integration/integration_helper'
|
20
|
+
require 'chef/knife/list'
|
21
|
+
|
22
|
+
describe 'redirection' do
|
23
|
+
extend IntegrationSupport
|
24
|
+
include KnifeSupport
|
25
|
+
|
26
|
+
when_the_chef_server 'has a role' do
|
27
|
+
role 'x', {}
|
28
|
+
|
29
|
+
context 'and another server redirects to it with 302' do
|
30
|
+
before :each do
|
31
|
+
@real_chef_server_url = Chef::Config.chef_server_url
|
32
|
+
Chef::Config.chef_server_url = "http://127.0.0.1:9018"
|
33
|
+
app = lambda do |env|
|
34
|
+
[302, {'Content-Type' => 'text','Location' => "#{@real_chef_server_url}#{env['PATH_INFO']}" }, ['302 found'] ]
|
35
|
+
end
|
36
|
+
@redirector_server = Puma::Server.new(app, Puma::Events.new(STDERR, STDOUT))
|
37
|
+
@redirector_server.add_tcp_listener("127.0.0.1", 9018)
|
38
|
+
@redirector_server.run
|
39
|
+
Timeout::timeout(5) do
|
40
|
+
until @redirector_server.running
|
41
|
+
sleep(0.01)
|
42
|
+
end
|
43
|
+
raise @server_error if @server_error
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
after :each do
|
48
|
+
Chef::Config.chef_server_url = @real_chef_server_url
|
49
|
+
@redirector_server.stop(true)
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'knife list /roles returns the role' do
|
53
|
+
knife('list /roles').should_succeed "/roles/x.json\n"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,158 @@
|
|
1
|
+
#
|
2
|
+
# Author:: John Keiser (<jkeiser@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
|
+
require 'support/shared/integration/integration_helper'
|
19
|
+
require 'chef/knife/show'
|
20
|
+
|
21
|
+
describe 'knife show' do
|
22
|
+
extend IntegrationSupport
|
23
|
+
include KnifeSupport
|
24
|
+
|
25
|
+
when_the_chef_server "has one of each thing" do
|
26
|
+
client 'x', '{}'
|
27
|
+
cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"' }
|
28
|
+
data_bag 'x', { 'y' => '{}' }
|
29
|
+
environment 'x', '{}'
|
30
|
+
node 'x', '{}'
|
31
|
+
role 'x', '{}'
|
32
|
+
user 'x', '{}'
|
33
|
+
|
34
|
+
when_the_repository 'also has one of each thing' do
|
35
|
+
file 'clients/x.json', { 'foo' => 'bar' }
|
36
|
+
file 'cookbooks/x/metadata.rb', 'version "1.0.1"'
|
37
|
+
file 'data_bags/x/y.json', { 'foo' => 'bar' }
|
38
|
+
file 'environments/_default.json', { 'foo' => 'bar' }
|
39
|
+
file 'environments/x.json', { 'foo' => 'bar' }
|
40
|
+
file 'nodes/x.json', { 'foo' => 'bar' }
|
41
|
+
file 'roles/x.json', { 'foo' => 'bar' }
|
42
|
+
file 'users/x.json', { 'foo' => 'bar' }
|
43
|
+
|
44
|
+
it 'knife show /cookbooks/x/metadata.rb shows the remote version' do
|
45
|
+
knife('show /cookbooks/x/metadata.rb').should_succeed <<EOM
|
46
|
+
/cookbooks/x/metadata.rb:
|
47
|
+
version "1.0.0"
|
48
|
+
EOM
|
49
|
+
end
|
50
|
+
it 'knife show --local /cookbooks/x/metadata.rb shows the local version' do
|
51
|
+
knife('show --local /cookbooks/x/metadata.rb').should_succeed <<EOM
|
52
|
+
/cookbooks/x/metadata.rb:
|
53
|
+
version "1.0.1"
|
54
|
+
EOM
|
55
|
+
end
|
56
|
+
it 'knife show /data_bags/x/y.json shows the remote version' do
|
57
|
+
knife('show /data_bags/x/y.json').should_succeed <<EOM
|
58
|
+
/data_bags/x/y.json:
|
59
|
+
{
|
60
|
+
"id": "y"
|
61
|
+
}
|
62
|
+
EOM
|
63
|
+
end
|
64
|
+
it 'knife show --local /data_bags/x/y.json shows the local version' do
|
65
|
+
knife('show --local /data_bags/x/y.json').should_succeed <<EOM
|
66
|
+
/data_bags/x/y.json:
|
67
|
+
{
|
68
|
+
"foo": "bar"
|
69
|
+
}
|
70
|
+
EOM
|
71
|
+
end
|
72
|
+
it 'knife show /environments/x.json shows the remote version', :pending => (RUBY_VERSION < "1.9") do
|
73
|
+
knife('show /environments/x.json').should_succeed <<EOM
|
74
|
+
/environments/x.json:
|
75
|
+
{
|
76
|
+
"name": "x"
|
77
|
+
}
|
78
|
+
EOM
|
79
|
+
end
|
80
|
+
it 'knife show --local /environments/x.json shows the local version' do
|
81
|
+
knife('show --local /environments/x.json').should_succeed <<EOM
|
82
|
+
/environments/x.json:
|
83
|
+
{
|
84
|
+
"foo": "bar"
|
85
|
+
}
|
86
|
+
EOM
|
87
|
+
end
|
88
|
+
it 'knife show /roles/x.json shows the remote version', :pending => (RUBY_VERSION < "1.9") do
|
89
|
+
knife('show /roles/x.json').should_succeed <<EOM
|
90
|
+
/roles/x.json:
|
91
|
+
{
|
92
|
+
"name": "x"
|
93
|
+
}
|
94
|
+
EOM
|
95
|
+
end
|
96
|
+
it 'knife show --local /roles/x.json shows the local version' do
|
97
|
+
knife('show --local /roles/x.json').should_succeed <<EOM
|
98
|
+
/roles/x.json:
|
99
|
+
{
|
100
|
+
"foo": "bar"
|
101
|
+
}
|
102
|
+
EOM
|
103
|
+
end
|
104
|
+
# show directory
|
105
|
+
it 'knife show /data_bags/x fails' do
|
106
|
+
knife('show /data_bags/x').should_fail "ERROR: /data_bags/x: is a directory\n"
|
107
|
+
end
|
108
|
+
it 'knife show --local /data_bags/x fails' do
|
109
|
+
knife('show --local /data_bags/x').should_fail "ERROR: /data_bags/x: is a directory\n"
|
110
|
+
end
|
111
|
+
# show nonexistent file
|
112
|
+
it 'knife show /environments/nonexistent.json fails' do
|
113
|
+
knife('show /environments/nonexistent.json').should_fail "ERROR: /environments/nonexistent.json: No such file or directory\n"
|
114
|
+
end
|
115
|
+
it 'knife show --local /environments/nonexistent.json fails' do
|
116
|
+
knife('show --local /environments/nonexistent.json').should_fail "ERROR: /environments/nonexistent.json: No such file or directory\n"
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
when_the_chef_server 'has a hash with multiple keys' do
|
122
|
+
environment 'x', {
|
123
|
+
'default_attributes' => { 'foo' => 'bar' },
|
124
|
+
'cookbook_versions' => { 'blah' => '= 1.0.0'},
|
125
|
+
'override_attributes' => { 'x' => 'y' },
|
126
|
+
'description' => 'woo',
|
127
|
+
'name' => 'x'
|
128
|
+
}
|
129
|
+
it 'knife show shows the attributes in a predetermined order', :pending => (RUBY_VERSION < "1.9") do
|
130
|
+
knife('show /environments/x.json').should_succeed <<EOM
|
131
|
+
/environments/x.json:
|
132
|
+
{
|
133
|
+
"name": "x",
|
134
|
+
"description": "woo",
|
135
|
+
"cookbook_versions": {
|
136
|
+
"blah": "= 1.0.0"
|
137
|
+
},
|
138
|
+
"default_attributes": {
|
139
|
+
"foo": "bar"
|
140
|
+
},
|
141
|
+
"override_attributes": {
|
142
|
+
"x": "y"
|
143
|
+
}
|
144
|
+
}
|
145
|
+
EOM
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
when_the_repository 'has an environment with bad JSON' do
|
150
|
+
file 'environments/x.json', '{'
|
151
|
+
it 'knife show succeeds' do
|
152
|
+
knife('show --local /environments/x.json').should_succeed <<EOM
|
153
|
+
/environments/x.json:
|
154
|
+
{
|
155
|
+
EOM
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
@@ -0,0 +1,1060 @@
|
|
1
|
+
#
|
2
|
+
# Author:: John Keiser (<jkeiser@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
|
+
require 'support/shared/integration/integration_helper'
|
19
|
+
require 'chef/knife/upload'
|
20
|
+
require 'chef/knife/diff'
|
21
|
+
require 'chef/knife/raw'
|
22
|
+
|
23
|
+
describe 'knife upload' do
|
24
|
+
extend IntegrationSupport
|
25
|
+
include KnifeSupport
|
26
|
+
|
27
|
+
context 'without versioned cookbooks' do
|
28
|
+
when_the_chef_server "has one of each thing" do
|
29
|
+
client 'x', {}
|
30
|
+
cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"' }
|
31
|
+
data_bag 'x', { 'y' => {} }
|
32
|
+
environment 'x', {}
|
33
|
+
node 'x', {}
|
34
|
+
role 'x', {}
|
35
|
+
user 'x', {}
|
36
|
+
|
37
|
+
when_the_repository 'has only top-level directories' do
|
38
|
+
directory 'clients'
|
39
|
+
directory 'cookbooks'
|
40
|
+
directory 'data_bags'
|
41
|
+
directory 'environments'
|
42
|
+
directory 'nodes'
|
43
|
+
directory 'roles'
|
44
|
+
directory 'users'
|
45
|
+
|
46
|
+
it 'knife upload does nothing' do
|
47
|
+
knife('upload /').should_succeed ''
|
48
|
+
knife('diff --name-status /').should_succeed <<EOM
|
49
|
+
D\t/clients/chef-validator.json
|
50
|
+
D\t/clients/chef-webui.json
|
51
|
+
D\t/clients/x.json
|
52
|
+
D\t/cookbooks/x
|
53
|
+
D\t/data_bags/x
|
54
|
+
D\t/environments/_default.json
|
55
|
+
D\t/environments/x.json
|
56
|
+
D\t/nodes/x.json
|
57
|
+
D\t/roles/x.json
|
58
|
+
D\t/users/admin.json
|
59
|
+
D\t/users/x.json
|
60
|
+
EOM
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'knife upload --purge deletes everything' do
|
64
|
+
knife('upload --purge /').should_succeed(<<EOM, :stderr => "WARNING: /environments/_default.json cannot be deleted (default environment cannot be modified).\n")
|
65
|
+
Deleted extra entry /clients/chef-validator.json (purge is on)
|
66
|
+
Deleted extra entry /clients/chef-webui.json (purge is on)
|
67
|
+
Deleted extra entry /clients/x.json (purge is on)
|
68
|
+
Deleted extra entry /cookbooks/x (purge is on)
|
69
|
+
Deleted extra entry /data_bags/x (purge is on)
|
70
|
+
Deleted extra entry /environments/x.json (purge is on)
|
71
|
+
Deleted extra entry /nodes/x.json (purge is on)
|
72
|
+
Deleted extra entry /roles/x.json (purge is on)
|
73
|
+
Deleted extra entry /users/admin.json (purge is on)
|
74
|
+
Deleted extra entry /users/x.json (purge is on)
|
75
|
+
EOM
|
76
|
+
knife('diff --name-status /').should_succeed <<EOM
|
77
|
+
D\t/environments/_default.json
|
78
|
+
EOM
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
when_the_repository 'has an identical copy of each thing' do
|
83
|
+
file 'clients/chef-validator.json', { 'validator' => true, 'public_key' => ChefZero::PUBLIC_KEY }
|
84
|
+
file 'clients/chef-webui.json', { 'admin' => true, 'public_key' => ChefZero::PUBLIC_KEY }
|
85
|
+
file 'clients/x.json', { 'public_key' => ChefZero::PUBLIC_KEY }
|
86
|
+
file 'cookbooks/x/metadata.rb', 'version "1.0.0"'
|
87
|
+
file 'data_bags/x/y.json', {}
|
88
|
+
file 'environments/_default.json', { "description" => "The default Chef environment" }
|
89
|
+
file 'environments/x.json', {}
|
90
|
+
file 'nodes/x.json', {}
|
91
|
+
file 'roles/x.json', {}
|
92
|
+
file 'users/admin.json', { 'admin' => true, 'public_key' => ChefZero::PUBLIC_KEY }
|
93
|
+
file 'users/x.json', { 'public_key' => ChefZero::PUBLIC_KEY }
|
94
|
+
|
95
|
+
it 'knife upload makes no changes' do
|
96
|
+
knife('upload /cookbooks/x').should_succeed ''
|
97
|
+
knife('diff --name-status /').should_succeed ''
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'knife upload --purge makes no changes' do
|
101
|
+
knife('upload --purge /').should_succeed ''
|
102
|
+
knife('diff --name-status /').should_succeed ''
|
103
|
+
end
|
104
|
+
|
105
|
+
context 'except the role file' do
|
106
|
+
file 'roles/x.json', { 'description' => 'blarghle' }
|
107
|
+
it 'knife upload changes the role' do
|
108
|
+
knife('upload /').should_succeed "Updated /roles/x.json\n"
|
109
|
+
knife('diff --name-status /').should_succeed ''
|
110
|
+
end
|
111
|
+
it 'knife upload --no-diff does not change the role' do
|
112
|
+
knife('upload --no-diff /').should_succeed ''
|
113
|
+
knife('diff --name-status /').should_succeed "M\t/roles/x.json\n"
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
context 'except the role file is textually different, but not ACTUALLY different' do
|
118
|
+
file 'roles/x.json', <<EOM
|
119
|
+
{
|
120
|
+
"chef_type": "role",
|
121
|
+
"default_attributes": {
|
122
|
+
},
|
123
|
+
"env_run_lists": {
|
124
|
+
},
|
125
|
+
"json_class": "Chef::Role",
|
126
|
+
"name": "x",
|
127
|
+
"description": "",
|
128
|
+
"override_attributes": {
|
129
|
+
},
|
130
|
+
"run_list": [
|
131
|
+
|
132
|
+
]
|
133
|
+
}
|
134
|
+
EOM
|
135
|
+
it 'knife upload / does not change anything' do
|
136
|
+
knife('upload /').should_succeed ''
|
137
|
+
knife('diff --name-status /').should_succeed ''
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
context 'as well as one extra copy of each thing' do
|
142
|
+
file 'clients/y.json', { 'public_key' => ChefZero::PUBLIC_KEY }
|
143
|
+
file 'cookbooks/x/blah.rb', ''
|
144
|
+
file 'cookbooks/y/metadata.rb', 'version "1.0.0"'
|
145
|
+
file 'data_bags/x/z.json', {}
|
146
|
+
file 'data_bags/y/zz.json', {}
|
147
|
+
file 'environments/y.json', {}
|
148
|
+
file 'nodes/y.json', {}
|
149
|
+
file 'roles/y.json', {}
|
150
|
+
file 'users/y.json', { 'public_key' => ChefZero::PUBLIC_KEY }
|
151
|
+
|
152
|
+
it 'knife upload adds the new files' do
|
153
|
+
knife('upload /').should_succeed <<EOM
|
154
|
+
Created /clients/y.json
|
155
|
+
Updated /cookbooks/x
|
156
|
+
Created /cookbooks/y
|
157
|
+
Created /data_bags/x/z.json
|
158
|
+
Created /data_bags/y
|
159
|
+
Created /data_bags/y/zz.json
|
160
|
+
Created /environments/y.json
|
161
|
+
Created /nodes/y.json
|
162
|
+
Created /roles/y.json
|
163
|
+
Created /users/y.json
|
164
|
+
EOM
|
165
|
+
knife('diff --name-status /').should_succeed ''
|
166
|
+
end
|
167
|
+
|
168
|
+
it 'knife upload --no-diff adds the new files' do
|
169
|
+
knife('upload --no-diff /').should_succeed <<EOM
|
170
|
+
Created /clients/y.json
|
171
|
+
Updated /cookbooks/x
|
172
|
+
Created /cookbooks/y
|
173
|
+
Created /data_bags/x/z.json
|
174
|
+
Created /data_bags/y
|
175
|
+
Created /data_bags/y/zz.json
|
176
|
+
Created /environments/y.json
|
177
|
+
Created /nodes/y.json
|
178
|
+
Created /roles/y.json
|
179
|
+
Created /users/y.json
|
180
|
+
EOM
|
181
|
+
knife('diff --name-status /').should_succeed ''
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
when_the_repository 'is empty' do
|
187
|
+
it 'knife upload does nothing' do
|
188
|
+
knife('upload /').should_succeed ''
|
189
|
+
knife('diff --name-status /').should_succeed <<EOM
|
190
|
+
D\t/clients
|
191
|
+
D\t/cookbooks
|
192
|
+
D\t/data_bags
|
193
|
+
D\t/environments
|
194
|
+
D\t/nodes
|
195
|
+
D\t/roles
|
196
|
+
D\t/users
|
197
|
+
EOM
|
198
|
+
end
|
199
|
+
|
200
|
+
it 'knife upload --purge deletes nothing' do
|
201
|
+
knife('upload --purge /').should_fail <<EOM
|
202
|
+
ERROR: /clients cannot be deleted.
|
203
|
+
ERROR: /cookbooks cannot be deleted.
|
204
|
+
ERROR: /data_bags cannot be deleted.
|
205
|
+
ERROR: /environments cannot be deleted.
|
206
|
+
ERROR: /nodes cannot be deleted.
|
207
|
+
ERROR: /roles cannot be deleted.
|
208
|
+
ERROR: /users cannot be deleted.
|
209
|
+
EOM
|
210
|
+
knife('diff --name-status /').should_succeed <<EOM
|
211
|
+
D\t/clients
|
212
|
+
D\t/cookbooks
|
213
|
+
D\t/data_bags
|
214
|
+
D\t/environments
|
215
|
+
D\t/nodes
|
216
|
+
D\t/roles
|
217
|
+
D\t/users
|
218
|
+
EOM
|
219
|
+
end
|
220
|
+
|
221
|
+
context 'when current directory is top level' do
|
222
|
+
cwd '.'
|
223
|
+
it 'knife upload with no parameters reports an error' do
|
224
|
+
knife('upload').should_fail "FATAL: Must specify at least one argument. If you want to upload everything in this directory, type \"knife upload .\"\n", :stdout => /USAGE/
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
when_the_chef_server 'is empty' do
|
231
|
+
when_the_repository 'has a data bag item' do
|
232
|
+
file 'data_bags/x/y.json', { 'foo' => 'bar' }
|
233
|
+
it 'knife upload of the data bag uploads only the values in the data bag item and no other' do
|
234
|
+
knife('upload /data_bags/x/y.json').should_succeed <<EOM
|
235
|
+
Created /data_bags/x
|
236
|
+
Created /data_bags/x/y.json
|
237
|
+
EOM
|
238
|
+
knife('diff --name-status /data_bags').should_succeed <<EOM
|
239
|
+
EOM
|
240
|
+
JSON.parse(knife('raw /data/x/y').stdout, :create_additions => false).keys.sort.should == [ 'foo', 'id' ]
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
when_the_repository 'has a data bag item with keys chef_type and data_bag' do
|
245
|
+
file 'data_bags/x/y.json', { 'chef_type' => 'aaa', 'data_bag' => 'bbb' }
|
246
|
+
it 'upload preserves chef_type and data_bag' do
|
247
|
+
knife('upload /data_bags/x/y.json').should_succeed <<EOM
|
248
|
+
Created /data_bags/x
|
249
|
+
Created /data_bags/x/y.json
|
250
|
+
EOM
|
251
|
+
knife('diff --name-status /data_bags').should_succeed ''
|
252
|
+
result = JSON.parse(knife('raw /data/x/y').stdout, :create_additions => false)
|
253
|
+
result.keys.sort.should == [ 'chef_type', 'data_bag', 'id' ]
|
254
|
+
result['chef_type'].should == 'aaa'
|
255
|
+
result['data_bag'].should == 'bbb'
|
256
|
+
end
|
257
|
+
end
|
258
|
+
|
259
|
+
# Test upload of an item when the other end doesn't even have the container
|
260
|
+
when_the_repository 'has two data bag items' do
|
261
|
+
file 'data_bags/x/y.json', {}
|
262
|
+
file 'data_bags/x/z.json', {}
|
263
|
+
it 'knife upload of one data bag item itself succeeds' do
|
264
|
+
knife('upload /data_bags/x/y.json').should_succeed <<EOM
|
265
|
+
Created /data_bags/x
|
266
|
+
Created /data_bags/x/y.json
|
267
|
+
EOM
|
268
|
+
knife('diff --name-status /data_bags').should_succeed <<EOM
|
269
|
+
A\t/data_bags/x/z.json
|
270
|
+
EOM
|
271
|
+
end
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
275
|
+
when_the_chef_server 'has three data bag items' do
|
276
|
+
data_bag 'x', { 'deleted' => {}, 'modified' => {}, 'unmodified' => {} }
|
277
|
+
|
278
|
+
when_the_repository 'has a modified, unmodified, added and deleted data bag item' do
|
279
|
+
file 'data_bags/x/added.json', {}
|
280
|
+
file 'data_bags/x/modified.json', { 'foo' => 'bar' }
|
281
|
+
file 'data_bags/x/unmodified.json', {}
|
282
|
+
|
283
|
+
it 'knife upload of the modified file succeeds' do
|
284
|
+
knife('upload /data_bags/x/modified.json').should_succeed <<EOM
|
285
|
+
Updated /data_bags/x/modified.json
|
286
|
+
EOM
|
287
|
+
knife('diff --name-status /data_bags').should_succeed <<EOM
|
288
|
+
D\t/data_bags/x/deleted.json
|
289
|
+
A\t/data_bags/x/added.json
|
290
|
+
EOM
|
291
|
+
end
|
292
|
+
it 'knife upload of the unmodified file does nothing' do
|
293
|
+
knife('upload /data_bags/x/unmodified.json').should_succeed ''
|
294
|
+
knife('diff --name-status /data_bags').should_succeed <<EOM
|
295
|
+
D\t/data_bags/x/deleted.json
|
296
|
+
M\t/data_bags/x/modified.json
|
297
|
+
A\t/data_bags/x/added.json
|
298
|
+
EOM
|
299
|
+
end
|
300
|
+
it 'knife upload of the added file succeeds' do
|
301
|
+
knife('upload /data_bags/x/added.json').should_succeed <<EOM
|
302
|
+
Created /data_bags/x/added.json
|
303
|
+
EOM
|
304
|
+
knife('diff --name-status /data_bags').should_succeed <<EOM
|
305
|
+
D\t/data_bags/x/deleted.json
|
306
|
+
M\t/data_bags/x/modified.json
|
307
|
+
EOM
|
308
|
+
end
|
309
|
+
it 'knife upload of the deleted file does nothing' do
|
310
|
+
knife('upload /data_bags/x/deleted.json').should_succeed ''
|
311
|
+
knife('diff --name-status /data_bags').should_succeed <<EOM
|
312
|
+
D\t/data_bags/x/deleted.json
|
313
|
+
M\t/data_bags/x/modified.json
|
314
|
+
A\t/data_bags/x/added.json
|
315
|
+
EOM
|
316
|
+
end
|
317
|
+
it 'knife upload --purge of the deleted file deletes it' do
|
318
|
+
knife('upload --purge /data_bags/x/deleted.json').should_succeed <<EOM
|
319
|
+
Deleted extra entry /data_bags/x/deleted.json (purge is on)
|
320
|
+
EOM
|
321
|
+
knife('diff --name-status /data_bags').should_succeed <<EOM
|
322
|
+
M\t/data_bags/x/modified.json
|
323
|
+
A\t/data_bags/x/added.json
|
324
|
+
EOM
|
325
|
+
end
|
326
|
+
it 'knife upload of the entire data bag uploads everything' do
|
327
|
+
knife('upload /data_bags/x').should_succeed <<EOM
|
328
|
+
Created /data_bags/x/added.json
|
329
|
+
Updated /data_bags/x/modified.json
|
330
|
+
EOM
|
331
|
+
knife('diff --name-status /data_bags').should_succeed <<EOM
|
332
|
+
D\t/data_bags/x/deleted.json
|
333
|
+
EOM
|
334
|
+
end
|
335
|
+
it 'knife upload --purge of the entire data bag uploads everything' do
|
336
|
+
knife('upload --purge /data_bags/x').should_succeed <<EOM
|
337
|
+
Created /data_bags/x/added.json
|
338
|
+
Updated /data_bags/x/modified.json
|
339
|
+
Deleted extra entry /data_bags/x/deleted.json (purge is on)
|
340
|
+
EOM
|
341
|
+
knife('diff --name-status /data_bags').should_succeed ''
|
342
|
+
end
|
343
|
+
context 'when cwd is the /data_bags directory' do
|
344
|
+
cwd 'data_bags'
|
345
|
+
it 'knife upload fails' do
|
346
|
+
knife('upload').should_fail "FATAL: Must specify at least one argument. If you want to upload everything in this directory, type \"knife upload .\"\n", :stdout => /USAGE/
|
347
|
+
end
|
348
|
+
it 'knife upload --purge . uploads everything' do
|
349
|
+
knife('upload --purge .').should_succeed <<EOM
|
350
|
+
Created x/added.json
|
351
|
+
Updated x/modified.json
|
352
|
+
Deleted extra entry x/deleted.json (purge is on)
|
353
|
+
EOM
|
354
|
+
knife('diff --name-status /data_bags').should_succeed ''
|
355
|
+
end
|
356
|
+
it 'knife upload --purge * uploads everything' do
|
357
|
+
knife('upload --purge *').should_succeed <<EOM
|
358
|
+
Created x/added.json
|
359
|
+
Updated x/modified.json
|
360
|
+
Deleted extra entry x/deleted.json (purge is on)
|
361
|
+
EOM
|
362
|
+
knife('diff --name-status /data_bags').should_succeed ''
|
363
|
+
end
|
364
|
+
end
|
365
|
+
end
|
366
|
+
end
|
367
|
+
|
368
|
+
# Cookbook upload is a funny thing ... direct cookbook upload works, but
|
369
|
+
# upload of a file is designed not to work at present. Make sure that is the
|
370
|
+
# case.
|
371
|
+
when_the_chef_server 'has a cookbook' do
|
372
|
+
cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'z.rb' => '' }
|
373
|
+
when_the_repository 'has a modified, extra and missing file for the cookbook' do
|
374
|
+
file 'cookbooks/x/metadata.rb', 'version "1.0.0"'
|
375
|
+
file 'cookbooks/x/y.rb', 'hi'
|
376
|
+
it 'knife upload of any individual file fails' do
|
377
|
+
knife('upload /cookbooks/x/metadata.rb').should_fail "ERROR: /cookbooks/x/metadata.rb cannot be updated.\n"
|
378
|
+
knife('upload /cookbooks/x/y.rb').should_fail "ERROR: /cookbooks/x cannot have a child created under it.\n"
|
379
|
+
knife('upload --purge /cookbooks/x/z.rb').should_fail "ERROR: /cookbooks/x/z.rb cannot be deleted.\n"
|
380
|
+
end
|
381
|
+
# TODO this is a bit of an inconsistency: if we didn't specify --purge,
|
382
|
+
# technically we shouldn't have deleted missing files. But ... cookbooks
|
383
|
+
# are a special case.
|
384
|
+
it 'knife upload of the cookbook itself succeeds' do
|
385
|
+
knife('upload /cookbooks/x').should_succeed <<EOM
|
386
|
+
Updated /cookbooks/x
|
387
|
+
EOM
|
388
|
+
knife('diff --name-status /cookbooks').should_succeed ''
|
389
|
+
end
|
390
|
+
it 'knife upload --purge of the cookbook itself succeeds' do
|
391
|
+
knife('upload /cookbooks/x').should_succeed <<EOM
|
392
|
+
Updated /cookbooks/x
|
393
|
+
EOM
|
394
|
+
knife('diff --name-status /cookbooks').should_succeed ''
|
395
|
+
end
|
396
|
+
end
|
397
|
+
when_the_repository 'has a missing file for the cookbook' do
|
398
|
+
file 'cookbooks/x/metadata.rb', 'version "1.0.0"'
|
399
|
+
it 'knife upload of the cookbook succeeds' do
|
400
|
+
knife('upload /cookbooks/x').should_succeed <<EOM
|
401
|
+
Updated /cookbooks/x
|
402
|
+
EOM
|
403
|
+
knife('diff --name-status /cookbooks').should_succeed ''
|
404
|
+
end
|
405
|
+
end
|
406
|
+
when_the_repository 'has an extra file for the cookbook' do
|
407
|
+
file 'cookbooks/x/metadata.rb', 'version "1.0.0"'
|
408
|
+
file 'cookbooks/x/z.rb', ''
|
409
|
+
file 'cookbooks/x/blah.rb', ''
|
410
|
+
it 'knife upload of the cookbook succeeds' do
|
411
|
+
knife('upload /cookbooks/x').should_succeed <<EOM
|
412
|
+
Updated /cookbooks/x
|
413
|
+
EOM
|
414
|
+
knife('diff --name-status /cookbooks').should_succeed ''
|
415
|
+
end
|
416
|
+
end
|
417
|
+
|
418
|
+
when_the_repository 'has a different file in the cookbook' do
|
419
|
+
file 'cookbooks/x/metadata.rb', 'version "1.0.0"'
|
420
|
+
|
421
|
+
it 'knife upload --freeze freezes the cookbook' do
|
422
|
+
knife('upload --freeze /cookbooks/x').should_succeed <<EOM
|
423
|
+
Updated /cookbooks/x
|
424
|
+
EOM
|
425
|
+
# Modify a file and attempt to upload
|
426
|
+
file 'cookbooks/x/metadata.rb', 'version "1.0.0" # This is different'
|
427
|
+
knife('upload /cookbooks/x').should_fail "ERROR: /cookbooks failed to write: Cookbook x is frozen\n"
|
428
|
+
end
|
429
|
+
end
|
430
|
+
end
|
431
|
+
|
432
|
+
when_the_chef_server 'has a frozen cookbook' do
|
433
|
+
cookbook 'frozencook', '1.0.0', {
|
434
|
+
'metadata.rb' => 'version "1.0.0"'
|
435
|
+
}, :frozen => true
|
436
|
+
|
437
|
+
when_the_repository 'has an update to said cookbook' do
|
438
|
+
file 'cookbooks/frozencook/metadata.rb', 'version "1.0.0" # This is different'
|
439
|
+
|
440
|
+
it 'knife upload fails to upload the frozen cookbook' do
|
441
|
+
knife('upload /cookbooks/frozencook').should_fail "ERROR: /cookbooks failed to write: Cookbook frozencook is frozen\n"
|
442
|
+
end
|
443
|
+
it 'knife upload --force uploads the frozen cookbook' do
|
444
|
+
knife('upload --force /cookbooks/frozencook').should_succeed <<EOM
|
445
|
+
Updated /cookbooks/frozencook
|
446
|
+
EOM
|
447
|
+
end
|
448
|
+
end
|
449
|
+
end
|
450
|
+
|
451
|
+
when_the_repository 'has a cookbook' do
|
452
|
+
file 'cookbooks/x/metadata.rb', 'version "1.0.0"'
|
453
|
+
file 'cookbooks/x/onlyin1.0.0.rb', 'old_text'
|
454
|
+
|
455
|
+
when_the_chef_server 'has a later version for the cookbook' do
|
456
|
+
cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'onlyin1.0.0.rb' => '' }
|
457
|
+
cookbook 'x', '1.0.1', { 'metadata.rb' => 'version "1.0.1"', 'onlyin1.0.1.rb' => 'hi' }
|
458
|
+
|
459
|
+
it 'knife upload /cookbooks/x uploads the local version' do
|
460
|
+
knife('diff --name-status /cookbooks').should_succeed <<EOM
|
461
|
+
M\t/cookbooks/x/metadata.rb
|
462
|
+
D\t/cookbooks/x/onlyin1.0.1.rb
|
463
|
+
A\t/cookbooks/x/onlyin1.0.0.rb
|
464
|
+
EOM
|
465
|
+
knife('upload --purge /cookbooks/x').should_succeed <<EOM
|
466
|
+
Updated /cookbooks/x
|
467
|
+
EOM
|
468
|
+
knife('diff --name-status /cookbooks').should_succeed <<EOM
|
469
|
+
M\t/cookbooks/x/metadata.rb
|
470
|
+
D\t/cookbooks/x/onlyin1.0.1.rb
|
471
|
+
A\t/cookbooks/x/onlyin1.0.0.rb
|
472
|
+
EOM
|
473
|
+
end
|
474
|
+
end
|
475
|
+
|
476
|
+
when_the_chef_server 'has an earlier version for the cookbook' do
|
477
|
+
cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'onlyin1.0.0.rb' => ''}
|
478
|
+
cookbook 'x', '0.9.9', { 'metadata.rb' => 'version "0.9.9"', 'onlyin0.9.9.rb' => 'hi' }
|
479
|
+
it 'knife upload /cookbooks/x uploads the local version' do
|
480
|
+
knife('upload --purge /cookbooks/x').should_succeed <<EOM
|
481
|
+
Updated /cookbooks/x
|
482
|
+
EOM
|
483
|
+
knife('diff --name-status /cookbooks').should_succeed ''
|
484
|
+
end
|
485
|
+
end
|
486
|
+
|
487
|
+
when_the_chef_server 'has a later version for the cookbook, and no current version' do
|
488
|
+
cookbook 'x', '1.0.1', { 'metadata.rb' => 'version "1.0.1"', 'onlyin1.0.1.rb' => 'hi' }
|
489
|
+
|
490
|
+
it 'knife upload /cookbooks/x uploads the local version' do
|
491
|
+
knife('diff --name-status /cookbooks').should_succeed <<EOM
|
492
|
+
M\t/cookbooks/x/metadata.rb
|
493
|
+
D\t/cookbooks/x/onlyin1.0.1.rb
|
494
|
+
A\t/cookbooks/x/onlyin1.0.0.rb
|
495
|
+
EOM
|
496
|
+
knife('upload --purge /cookbooks/x').should_succeed <<EOM
|
497
|
+
Updated /cookbooks/x
|
498
|
+
EOM
|
499
|
+
knife('diff --name-status /cookbooks').should_succeed <<EOM
|
500
|
+
M\t/cookbooks/x/metadata.rb
|
501
|
+
D\t/cookbooks/x/onlyin1.0.1.rb
|
502
|
+
A\t/cookbooks/x/onlyin1.0.0.rb
|
503
|
+
EOM
|
504
|
+
end
|
505
|
+
end
|
506
|
+
|
507
|
+
when_the_chef_server 'has an earlier version for the cookbook, and no current version' do
|
508
|
+
cookbook 'x', '0.9.9', { 'metadata.rb' => 'version "0.9.9"', 'onlyin0.9.9.rb' => 'hi' }
|
509
|
+
|
510
|
+
it 'knife upload /cookbooks/x uploads the new version' do
|
511
|
+
knife('upload --purge /cookbooks/x').should_succeed <<EOM
|
512
|
+
Updated /cookbooks/x
|
513
|
+
EOM
|
514
|
+
knife('diff --name-status /cookbooks').should_succeed ''
|
515
|
+
end
|
516
|
+
end
|
517
|
+
end
|
518
|
+
|
519
|
+
when_the_chef_server 'has an environment' do
|
520
|
+
environment 'x', {}
|
521
|
+
when_the_repository 'has an environment with bad JSON' do
|
522
|
+
file 'environments/x.json', '{'
|
523
|
+
it 'knife upload tries and fails' do
|
524
|
+
knife('upload /environments/x.json').should_fail "WARN: Parse error reading #{path_to('environments/x.json')} as JSON: A JSON text must at least contain two octets!\nERROR: /environments/x.json failed to write: Parse error reading JSON: A JSON text must at least contain two octets!\n"
|
525
|
+
knife('diff --name-status /environments/x.json').should_succeed "M\t/environments/x.json\n", :stderr => "WARN: Parse error reading #{path_to('environments/x.json')} as JSON: A JSON text must at least contain two octets!\n"
|
526
|
+
end
|
527
|
+
end
|
528
|
+
|
529
|
+
when_the_repository 'has the same environment with the wrong name in the file' do
|
530
|
+
file 'environments/x.json', { 'name' => 'y' }
|
531
|
+
it 'knife upload fails' do
|
532
|
+
knife('upload /environments/x.json').should_fail "ERROR: /environments/x.json failed to write: Name must be 'x' (is 'y')\n"
|
533
|
+
knife('diff --name-status /environments/x.json').should_succeed "M\t/environments/x.json\n"
|
534
|
+
end
|
535
|
+
end
|
536
|
+
|
537
|
+
when_the_repository 'has the same environment with no name in the file' do
|
538
|
+
file 'environments/x.json', { 'description' => 'hi' }
|
539
|
+
it 'knife upload succeeds' do
|
540
|
+
knife('upload /environments/x.json').should_succeed "Updated /environments/x.json\n"
|
541
|
+
knife('diff --name-status /environments/x.json').should_succeed ''
|
542
|
+
end
|
543
|
+
end
|
544
|
+
end
|
545
|
+
|
546
|
+
when_the_chef_server 'is empty' do
|
547
|
+
when_the_repository 'has an environment with bad JSON' do
|
548
|
+
file 'environments/x.json', '{'
|
549
|
+
it 'knife upload tries and fails' do
|
550
|
+
knife('upload /environments/x.json').should_fail "ERROR: /environments failed to create_child: Parse error reading JSON creating child 'x.json': A JSON text must at least contain two octets!\n"
|
551
|
+
knife('diff --name-status /environments/x.json').should_succeed "A\t/environments/x.json\n"
|
552
|
+
end
|
553
|
+
end
|
554
|
+
|
555
|
+
when_the_repository 'has an environment with the wrong name in the file' do
|
556
|
+
file 'environments/x.json', { 'name' => 'y' }
|
557
|
+
it 'knife upload fails' do
|
558
|
+
knife('upload /environments/x.json').should_fail "ERROR: /environments failed to create_child: Error creating 'x.json': Name must be 'x' (is 'y')\n"
|
559
|
+
knife('diff --name-status /environments/x.json').should_succeed "A\t/environments/x.json\n"
|
560
|
+
end
|
561
|
+
end
|
562
|
+
|
563
|
+
when_the_repository 'has an environment with no name in the file' do
|
564
|
+
file 'environments/x.json', { 'description' => 'hi' }
|
565
|
+
it 'knife upload succeeds' do
|
566
|
+
knife('upload /environments/x.json').should_succeed "Created /environments/x.json\n"
|
567
|
+
knife('diff --name-status /environments/x.json').should_succeed ''
|
568
|
+
end
|
569
|
+
end
|
570
|
+
|
571
|
+
when_the_repository 'has a data bag with no id in the file' do
|
572
|
+
file 'data_bags/bag/x.json', { 'foo' => 'bar' }
|
573
|
+
it 'knife upload succeeds' do
|
574
|
+
knife('upload /data_bags/bag/x.json').should_succeed "Created /data_bags/bag\nCreated /data_bags/bag/x.json\n"
|
575
|
+
knife('diff --name-status /data_bags/bag/x.json').should_succeed ''
|
576
|
+
end
|
577
|
+
end
|
578
|
+
end
|
579
|
+
end # without versioned cookbooks
|
580
|
+
|
581
|
+
with_versioned_cookbooks do
|
582
|
+
when_the_chef_server "has one of each thing" do
|
583
|
+
client 'x', {}
|
584
|
+
cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"' }
|
585
|
+
data_bag 'x', { 'y' => {} }
|
586
|
+
environment 'x', {}
|
587
|
+
node 'x', {}
|
588
|
+
role 'x', {}
|
589
|
+
user 'x', {}
|
590
|
+
|
591
|
+
when_the_repository 'has only top-level directories' do
|
592
|
+
directory 'clients'
|
593
|
+
directory 'cookbooks'
|
594
|
+
directory 'data_bags'
|
595
|
+
directory 'environments'
|
596
|
+
directory 'nodes'
|
597
|
+
directory 'roles'
|
598
|
+
directory 'users'
|
599
|
+
|
600
|
+
it 'knife upload does nothing' do
|
601
|
+
knife('upload /').should_succeed ''
|
602
|
+
knife('diff --name-status /').should_succeed <<EOM
|
603
|
+
D\t/clients/chef-validator.json
|
604
|
+
D\t/clients/chef-webui.json
|
605
|
+
D\t/clients/x.json
|
606
|
+
D\t/cookbooks/x-1.0.0
|
607
|
+
D\t/data_bags/x
|
608
|
+
D\t/environments/_default.json
|
609
|
+
D\t/environments/x.json
|
610
|
+
D\t/nodes/x.json
|
611
|
+
D\t/roles/x.json
|
612
|
+
D\t/users/admin.json
|
613
|
+
D\t/users/x.json
|
614
|
+
EOM
|
615
|
+
end
|
616
|
+
|
617
|
+
it 'knife upload --purge deletes everything' do
|
618
|
+
knife('upload --purge /').should_succeed(<<EOM, :stderr => "WARNING: /environments/_default.json cannot be deleted (default environment cannot be modified).\n")
|
619
|
+
Deleted extra entry /clients/chef-validator.json (purge is on)
|
620
|
+
Deleted extra entry /clients/chef-webui.json (purge is on)
|
621
|
+
Deleted extra entry /clients/x.json (purge is on)
|
622
|
+
Deleted extra entry /cookbooks/x-1.0.0 (purge is on)
|
623
|
+
Deleted extra entry /data_bags/x (purge is on)
|
624
|
+
Deleted extra entry /environments/x.json (purge is on)
|
625
|
+
Deleted extra entry /nodes/x.json (purge is on)
|
626
|
+
Deleted extra entry /roles/x.json (purge is on)
|
627
|
+
Deleted extra entry /users/admin.json (purge is on)
|
628
|
+
Deleted extra entry /users/x.json (purge is on)
|
629
|
+
EOM
|
630
|
+
knife('diff --name-status /').should_succeed <<EOM
|
631
|
+
D\t/environments/_default.json
|
632
|
+
EOM
|
633
|
+
end
|
634
|
+
end
|
635
|
+
|
636
|
+
when_the_repository 'has an identical copy of each thing' do
|
637
|
+
file 'clients/chef-validator.json', { 'validator' => true, 'public_key' => ChefZero::PUBLIC_KEY }
|
638
|
+
file 'clients/chef-webui.json', { 'admin' => true, 'public_key' => ChefZero::PUBLIC_KEY }
|
639
|
+
file 'clients/x.json', { 'public_key' => ChefZero::PUBLIC_KEY }
|
640
|
+
file 'cookbooks/x-1.0.0/metadata.rb', 'version "1.0.0"'
|
641
|
+
file 'data_bags/x/y.json', {}
|
642
|
+
file 'environments/_default.json', { 'description' => 'The default Chef environment' }
|
643
|
+
file 'environments/x.json', {}
|
644
|
+
file 'nodes/x.json', {}
|
645
|
+
file 'roles/x.json', {}
|
646
|
+
file 'users/admin.json', { 'admin' => true, 'public_key' => ChefZero::PUBLIC_KEY }
|
647
|
+
file 'users/x.json', { 'public_key' => ChefZero::PUBLIC_KEY }
|
648
|
+
|
649
|
+
it 'knife upload makes no changes' do
|
650
|
+
knife('upload /cookbooks/x-1.0.0').should_succeed ''
|
651
|
+
knife('diff --name-status /').should_succeed ''
|
652
|
+
end
|
653
|
+
|
654
|
+
it 'knife upload --purge makes no changes' do
|
655
|
+
knife('upload --purge /').should_succeed ''
|
656
|
+
knife('diff --name-status /').should_succeed ''
|
657
|
+
end
|
658
|
+
|
659
|
+
context 'except the role file' do
|
660
|
+
file 'roles/x.json', { 'description' => 'blarghle' }
|
661
|
+
|
662
|
+
it 'knife upload changes the role' do
|
663
|
+
knife('upload /').should_succeed "Updated /roles/x.json\n"
|
664
|
+
knife('diff --name-status /').should_succeed ''
|
665
|
+
end
|
666
|
+
end
|
667
|
+
|
668
|
+
context 'except the role file is textually different, but not ACTUALLY different' do
|
669
|
+
file 'roles/x.json', <<EOM
|
670
|
+
{
|
671
|
+
"chef_type": "role",
|
672
|
+
"default_attributes": {
|
673
|
+
},
|
674
|
+
"env_run_lists": {
|
675
|
+
},
|
676
|
+
"json_class": "Chef::Role",
|
677
|
+
"name": "x",
|
678
|
+
"description": "",
|
679
|
+
"override_attributes": {
|
680
|
+
},
|
681
|
+
"run_list": [
|
682
|
+
|
683
|
+
]
|
684
|
+
}
|
685
|
+
EOM
|
686
|
+
it 'knife upload / does not change anything' do
|
687
|
+
knife('upload /').should_succeed ''
|
688
|
+
knife('diff --name-status /').should_succeed ''
|
689
|
+
end
|
690
|
+
end
|
691
|
+
|
692
|
+
context 'as well as one extra copy of each thing' do
|
693
|
+
file 'clients/y.json', { 'public_key' => ChefZero::PUBLIC_KEY }
|
694
|
+
file 'cookbooks/x-1.0.0/blah.rb', ''
|
695
|
+
file 'cookbooks/x-2.0.0/metadata.rb', 'version "2.0.0"'
|
696
|
+
file 'cookbooks/y-1.0.0/metadata.rb', 'version "1.0.0"'
|
697
|
+
file 'data_bags/x/z.json', {}
|
698
|
+
file 'data_bags/y/zz.json', {}
|
699
|
+
file 'environments/y.json', {}
|
700
|
+
file 'nodes/y.json', {}
|
701
|
+
file 'roles/y.json', {}
|
702
|
+
file 'users/y.json', { 'public_key' => ChefZero::PUBLIC_KEY }
|
703
|
+
|
704
|
+
it 'knife upload adds the new files' do
|
705
|
+
knife('upload /').should_succeed <<EOM
|
706
|
+
Created /clients/y.json
|
707
|
+
Updated /cookbooks/x-1.0.0
|
708
|
+
Created /cookbooks/x-2.0.0
|
709
|
+
Created /cookbooks/y-1.0.0
|
710
|
+
Created /data_bags/x/z.json
|
711
|
+
Created /data_bags/y
|
712
|
+
Created /data_bags/y/zz.json
|
713
|
+
Created /environments/y.json
|
714
|
+
Created /nodes/y.json
|
715
|
+
Created /roles/y.json
|
716
|
+
Created /users/y.json
|
717
|
+
EOM
|
718
|
+
knife('diff --name-status /').should_succeed ''
|
719
|
+
end
|
720
|
+
end
|
721
|
+
end
|
722
|
+
|
723
|
+
when_the_repository 'is empty' do
|
724
|
+
it 'knife upload does nothing' do
|
725
|
+
knife('upload /').should_succeed ''
|
726
|
+
knife('diff --name-status /').should_succeed <<EOM
|
727
|
+
D\t/clients
|
728
|
+
D\t/cookbooks
|
729
|
+
D\t/data_bags
|
730
|
+
D\t/environments
|
731
|
+
D\t/nodes
|
732
|
+
D\t/roles
|
733
|
+
D\t/users
|
734
|
+
EOM
|
735
|
+
end
|
736
|
+
|
737
|
+
it 'knife upload --purge deletes nothing' do
|
738
|
+
knife('upload --purge /').should_fail <<EOM
|
739
|
+
ERROR: /clients cannot be deleted.
|
740
|
+
ERROR: /cookbooks cannot be deleted.
|
741
|
+
ERROR: /data_bags cannot be deleted.
|
742
|
+
ERROR: /environments cannot be deleted.
|
743
|
+
ERROR: /nodes cannot be deleted.
|
744
|
+
ERROR: /roles cannot be deleted.
|
745
|
+
ERROR: /users cannot be deleted.
|
746
|
+
EOM
|
747
|
+
knife('diff --name-status /').should_succeed <<EOM
|
748
|
+
D\t/clients
|
749
|
+
D\t/cookbooks
|
750
|
+
D\t/data_bags
|
751
|
+
D\t/environments
|
752
|
+
D\t/nodes
|
753
|
+
D\t/roles
|
754
|
+
D\t/users
|
755
|
+
EOM
|
756
|
+
end
|
757
|
+
|
758
|
+
context 'when current directory is top level' do
|
759
|
+
cwd '.'
|
760
|
+
it 'knife upload with no parameters reports an error' do
|
761
|
+
knife('upload').should_fail "FATAL: Must specify at least one argument. If you want to upload everything in this directory, type \"knife upload .\"\n", :stdout => /USAGE/
|
762
|
+
end
|
763
|
+
end
|
764
|
+
end
|
765
|
+
end
|
766
|
+
|
767
|
+
# Test upload of an item when the other end doesn't even have the container
|
768
|
+
when_the_chef_server 'is empty' do
|
769
|
+
when_the_repository 'has two data bag items' do
|
770
|
+
file 'data_bags/x/y.json', {}
|
771
|
+
file 'data_bags/x/z.json', {}
|
772
|
+
|
773
|
+
it 'knife upload of one data bag item itself succeeds' do
|
774
|
+
knife('upload /data_bags/x/y.json').should_succeed <<EOM
|
775
|
+
Created /data_bags/x
|
776
|
+
Created /data_bags/x/y.json
|
777
|
+
EOM
|
778
|
+
knife('diff --name-status /data_bags').should_succeed <<EOM
|
779
|
+
A\t/data_bags/x/z.json
|
780
|
+
EOM
|
781
|
+
end
|
782
|
+
end
|
783
|
+
end
|
784
|
+
|
785
|
+
when_the_chef_server 'has three data bag items' do
|
786
|
+
data_bag 'x', { 'deleted' => {}, 'modified' => {}, 'unmodified' => {} }
|
787
|
+
when_the_repository 'has a modified, unmodified, added and deleted data bag item' do
|
788
|
+
file 'data_bags/x/added.json', {}
|
789
|
+
file 'data_bags/x/modified.json', { 'foo' => 'bar' }
|
790
|
+
file 'data_bags/x/unmodified.json', {}
|
791
|
+
|
792
|
+
it 'knife upload of the modified file succeeds' do
|
793
|
+
knife('upload /data_bags/x/modified.json').should_succeed <<EOM
|
794
|
+
Updated /data_bags/x/modified.json
|
795
|
+
EOM
|
796
|
+
knife('diff --name-status /data_bags').should_succeed <<EOM
|
797
|
+
D\t/data_bags/x/deleted.json
|
798
|
+
A\t/data_bags/x/added.json
|
799
|
+
EOM
|
800
|
+
end
|
801
|
+
it 'knife upload of the unmodified file does nothing' do
|
802
|
+
knife('upload /data_bags/x/unmodified.json').should_succeed ''
|
803
|
+
knife('diff --name-status /data_bags').should_succeed <<EOM
|
804
|
+
D\t/data_bags/x/deleted.json
|
805
|
+
M\t/data_bags/x/modified.json
|
806
|
+
A\t/data_bags/x/added.json
|
807
|
+
EOM
|
808
|
+
end
|
809
|
+
it 'knife upload of the added file succeeds' do
|
810
|
+
knife('upload /data_bags/x/added.json').should_succeed <<EOM
|
811
|
+
Created /data_bags/x/added.json
|
812
|
+
EOM
|
813
|
+
knife('diff --name-status /data_bags').should_succeed <<EOM
|
814
|
+
D\t/data_bags/x/deleted.json
|
815
|
+
M\t/data_bags/x/modified.json
|
816
|
+
EOM
|
817
|
+
end
|
818
|
+
it 'knife upload of the deleted file does nothing' do
|
819
|
+
knife('upload /data_bags/x/deleted.json').should_succeed ''
|
820
|
+
knife('diff --name-status /data_bags').should_succeed <<EOM
|
821
|
+
D\t/data_bags/x/deleted.json
|
822
|
+
M\t/data_bags/x/modified.json
|
823
|
+
A\t/data_bags/x/added.json
|
824
|
+
EOM
|
825
|
+
end
|
826
|
+
it 'knife upload --purge of the deleted file deletes it' do
|
827
|
+
knife('upload --purge /data_bags/x/deleted.json').should_succeed <<EOM
|
828
|
+
Deleted extra entry /data_bags/x/deleted.json (purge is on)
|
829
|
+
EOM
|
830
|
+
knife('diff --name-status /data_bags').should_succeed <<EOM
|
831
|
+
M\t/data_bags/x/modified.json
|
832
|
+
A\t/data_bags/x/added.json
|
833
|
+
EOM
|
834
|
+
end
|
835
|
+
it 'knife upload of the entire data bag uploads everything' do
|
836
|
+
knife('upload /data_bags/x').should_succeed <<EOM
|
837
|
+
Created /data_bags/x/added.json
|
838
|
+
Updated /data_bags/x/modified.json
|
839
|
+
EOM
|
840
|
+
knife('diff --name-status /data_bags').should_succeed <<EOM
|
841
|
+
D\t/data_bags/x/deleted.json
|
842
|
+
EOM
|
843
|
+
end
|
844
|
+
it 'knife upload --purge of the entire data bag uploads everything' do
|
845
|
+
knife('upload --purge /data_bags/x').should_succeed <<EOM
|
846
|
+
Created /data_bags/x/added.json
|
847
|
+
Updated /data_bags/x/modified.json
|
848
|
+
Deleted extra entry /data_bags/x/deleted.json (purge is on)
|
849
|
+
EOM
|
850
|
+
knife('diff --name-status /data_bags').should_succeed ''
|
851
|
+
end
|
852
|
+
context 'when cwd is the /data_bags directory' do
|
853
|
+
cwd 'data_bags'
|
854
|
+
it 'knife upload fails' do
|
855
|
+
knife('upload').should_fail "FATAL: Must specify at least one argument. If you want to upload everything in this directory, type \"knife upload .\"\n", :stdout => /USAGE/
|
856
|
+
end
|
857
|
+
it 'knife upload --purge . uploads everything' do
|
858
|
+
knife('upload --purge .').should_succeed <<EOM
|
859
|
+
Created x/added.json
|
860
|
+
Updated x/modified.json
|
861
|
+
Deleted extra entry x/deleted.json (purge is on)
|
862
|
+
EOM
|
863
|
+
knife('diff --name-status /data_bags').should_succeed ''
|
864
|
+
end
|
865
|
+
it 'knife upload --purge * uploads everything' do
|
866
|
+
knife('upload --purge *').should_succeed <<EOM
|
867
|
+
Created x/added.json
|
868
|
+
Updated x/modified.json
|
869
|
+
Deleted extra entry x/deleted.json (purge is on)
|
870
|
+
EOM
|
871
|
+
knife('diff --name-status /data_bags').should_succeed ''
|
872
|
+
end
|
873
|
+
end
|
874
|
+
end
|
875
|
+
end
|
876
|
+
|
877
|
+
# Cookbook upload is a funny thing ... direct cookbook upload works, but
|
878
|
+
# upload of a file is designed not to work at present. Make sure that is the
|
879
|
+
# case.
|
880
|
+
when_the_chef_server 'has a cookbook' do
|
881
|
+
cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'z.rb' => '' }
|
882
|
+
|
883
|
+
when_the_repository 'has a modified, extra and missing file for the cookbook' do
|
884
|
+
file 'cookbooks/x-1.0.0/metadata.rb', 'version "1.0.0"'
|
885
|
+
file 'cookbooks/x-1.0.0/y.rb', 'hi'
|
886
|
+
|
887
|
+
it 'knife upload of any individual file fails' do
|
888
|
+
knife('upload /cookbooks/x-1.0.0/metadata.rb').should_fail "ERROR: /cookbooks/x-1.0.0/metadata.rb cannot be updated.\n"
|
889
|
+
knife('upload /cookbooks/x-1.0.0/y.rb').should_fail "ERROR: /cookbooks/x-1.0.0 cannot have a child created under it.\n"
|
890
|
+
knife('upload --purge /cookbooks/x-1.0.0/z.rb').should_fail "ERROR: /cookbooks/x-1.0.0/z.rb cannot be deleted.\n"
|
891
|
+
end
|
892
|
+
|
893
|
+
# TODO this is a bit of an inconsistency: if we didn't specify --purge,
|
894
|
+
# technically we shouldn't have deleted missing files. But ... cookbooks
|
895
|
+
# are a special case.
|
896
|
+
it 'knife upload of the cookbook itself succeeds' do
|
897
|
+
knife('upload /cookbooks/x-1.0.0').should_succeed <<EOM
|
898
|
+
Updated /cookbooks/x-1.0.0
|
899
|
+
EOM
|
900
|
+
knife('diff --name-status /cookbooks').should_succeed ''
|
901
|
+
end
|
902
|
+
|
903
|
+
it 'knife upload --purge of the cookbook itself succeeds' do
|
904
|
+
knife('upload /cookbooks/x-1.0.0').should_succeed <<EOM
|
905
|
+
Updated /cookbooks/x-1.0.0
|
906
|
+
EOM
|
907
|
+
knife('diff --name-status /cookbooks').should_succeed ''
|
908
|
+
end
|
909
|
+
end
|
910
|
+
|
911
|
+
when_the_repository 'has a missing file for the cookbook' do
|
912
|
+
file 'cookbooks/x-1.0.0/metadata.rb', 'version "1.0.0"'
|
913
|
+
|
914
|
+
it 'knife upload of the cookbook succeeds' do
|
915
|
+
knife('upload /cookbooks/x-1.0.0').should_succeed <<EOM
|
916
|
+
Updated /cookbooks/x-1.0.0
|
917
|
+
EOM
|
918
|
+
knife('diff --name-status /cookbooks').should_succeed ''
|
919
|
+
end
|
920
|
+
end
|
921
|
+
|
922
|
+
when_the_repository 'has an extra file for the cookbook' do
|
923
|
+
file 'cookbooks/x-1.0.0/metadata.rb', 'version "1.0.0"'
|
924
|
+
file 'cookbooks/x-1.0.0/z.rb', ''
|
925
|
+
file 'cookbooks/x-1.0.0/blah.rb', ''
|
926
|
+
|
927
|
+
it 'knife upload of the cookbook succeeds' do
|
928
|
+
knife('upload /cookbooks/x-1.0.0').should_succeed <<EOM
|
929
|
+
Updated /cookbooks/x-1.0.0
|
930
|
+
EOM
|
931
|
+
knife('diff --name-status /cookbooks').should_succeed ''
|
932
|
+
end
|
933
|
+
end
|
934
|
+
end
|
935
|
+
|
936
|
+
when_the_repository 'has a cookbook' do
|
937
|
+
file 'cookbooks/x-1.0.0/metadata.rb', 'version "1.0.0"'
|
938
|
+
file 'cookbooks/x-1.0.0/onlyin1.0.0.rb', 'old_text'
|
939
|
+
|
940
|
+
when_the_chef_server 'has a later version for the cookbook' do
|
941
|
+
cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'onlyin1.0.0.rb' => '' }
|
942
|
+
cookbook 'x', '1.0.1', { 'metadata.rb' => 'version "1.0.1"', 'onlyin1.0.1.rb' => 'hi' }
|
943
|
+
|
944
|
+
it 'knife upload /cookbooks uploads the local version' do
|
945
|
+
knife('diff --name-status /cookbooks').should_succeed <<EOM
|
946
|
+
M\t/cookbooks/x-1.0.0/onlyin1.0.0.rb
|
947
|
+
D\t/cookbooks/x-1.0.1
|
948
|
+
EOM
|
949
|
+
knife('upload --purge /cookbooks').should_succeed <<EOM
|
950
|
+
Updated /cookbooks/x-1.0.0
|
951
|
+
Deleted extra entry /cookbooks/x-1.0.1 (purge is on)
|
952
|
+
EOM
|
953
|
+
knife('diff --name-status /cookbooks').should_succeed ''
|
954
|
+
end
|
955
|
+
end
|
956
|
+
|
957
|
+
when_the_chef_server 'has an earlier version for the cookbook' do
|
958
|
+
cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'onlyin1.0.0.rb' => ''}
|
959
|
+
cookbook 'x', '0.9.9', { 'metadata.rb' => 'version "0.9.9"', 'onlyin0.9.9.rb' => 'hi' }
|
960
|
+
it 'knife upload /cookbooks uploads the local version' do
|
961
|
+
knife('upload --purge /cookbooks').should_succeed <<EOM
|
962
|
+
Updated /cookbooks/x-1.0.0
|
963
|
+
Deleted extra entry /cookbooks/x-0.9.9 (purge is on)
|
964
|
+
EOM
|
965
|
+
knife('diff --name-status /cookbooks').should_succeed ''
|
966
|
+
end
|
967
|
+
end
|
968
|
+
|
969
|
+
when_the_chef_server 'has a later version for the cookbook, and no current version' do
|
970
|
+
cookbook 'x', '1.0.1', { 'metadata.rb' => 'version "1.0.1"', 'onlyin1.0.1.rb' => 'hi' }
|
971
|
+
|
972
|
+
it 'knife upload /cookbooks/x uploads the local version' do
|
973
|
+
knife('diff --name-status /cookbooks').should_succeed <<EOM
|
974
|
+
D\t/cookbooks/x-1.0.1
|
975
|
+
A\t/cookbooks/x-1.0.0
|
976
|
+
EOM
|
977
|
+
knife('upload --purge /cookbooks').should_succeed <<EOM
|
978
|
+
Created /cookbooks/x-1.0.0
|
979
|
+
Deleted extra entry /cookbooks/x-1.0.1 (purge is on)
|
980
|
+
EOM
|
981
|
+
knife('diff --name-status /cookbooks').should_succeed ''
|
982
|
+
end
|
983
|
+
end
|
984
|
+
|
985
|
+
when_the_chef_server 'has an earlier version for the cookbook, and no current version' do
|
986
|
+
cookbook 'x', '0.9.9', { 'metadata.rb' => 'version "0.9.9"', 'onlyin0.9.9.rb' => 'hi' }
|
987
|
+
|
988
|
+
it 'knife upload /cookbooks/x uploads the new version' do
|
989
|
+
knife('upload --purge /cookbooks').should_succeed <<EOM
|
990
|
+
Created /cookbooks/x-1.0.0
|
991
|
+
Deleted extra entry /cookbooks/x-0.9.9 (purge is on)
|
992
|
+
EOM
|
993
|
+
knife('diff --name-status /cookbooks').should_succeed ''
|
994
|
+
end
|
995
|
+
end
|
996
|
+
end
|
997
|
+
|
998
|
+
when_the_chef_server 'has an environment' do
|
999
|
+
environment 'x', {}
|
1000
|
+
when_the_repository 'has an environment with bad JSON' do
|
1001
|
+
file 'environments/x.json', '{'
|
1002
|
+
it 'knife upload tries and fails' do
|
1003
|
+
knife('upload /environments/x.json').should_fail "WARN: Parse error reading #{path_to('environments/x.json')} as JSON: A JSON text must at least contain two octets!\nERROR: /environments/x.json failed to write: Parse error reading JSON: A JSON text must at least contain two octets!\n"
|
1004
|
+
knife('diff --name-status /environments/x.json').should_succeed "M\t/environments/x.json\n", :stderr => "WARN: Parse error reading #{path_to('environments/x.json')} as JSON: A JSON text must at least contain two octets!\n"
|
1005
|
+
end
|
1006
|
+
end
|
1007
|
+
|
1008
|
+
when_the_repository 'has the same environment with the wrong name in the file' do
|
1009
|
+
file 'environments/x.json', { 'name' => 'y' }
|
1010
|
+
it 'knife upload fails' do
|
1011
|
+
knife('upload /environments/x.json').should_fail "ERROR: /environments/x.json failed to write: Name must be 'x' (is 'y')\n"
|
1012
|
+
knife('diff --name-status /environments/x.json').should_succeed "M\t/environments/x.json\n"
|
1013
|
+
end
|
1014
|
+
end
|
1015
|
+
|
1016
|
+
when_the_repository 'has the same environment with no name in the file' do
|
1017
|
+
file 'environments/x.json', { 'description' => 'hi' }
|
1018
|
+
it 'knife upload succeeds' do
|
1019
|
+
knife('upload /environments/x.json').should_succeed "Updated /environments/x.json\n"
|
1020
|
+
knife('diff --name-status /environments/x.json').should_succeed ''
|
1021
|
+
end
|
1022
|
+
end
|
1023
|
+
end
|
1024
|
+
|
1025
|
+
when_the_chef_server 'is empty' do
|
1026
|
+
when_the_repository 'has an environment with bad JSON' do
|
1027
|
+
file 'environments/x.json', '{'
|
1028
|
+
it 'knife upload tries and fails' do
|
1029
|
+
knife('upload /environments/x.json').should_fail "ERROR: /environments failed to create_child: Parse error reading JSON creating child 'x.json': A JSON text must at least contain two octets!\n"
|
1030
|
+
knife('diff --name-status /environments/x.json').should_succeed "A\t/environments/x.json\n"
|
1031
|
+
end
|
1032
|
+
end
|
1033
|
+
|
1034
|
+
when_the_repository 'has an environment with the wrong name in the file' do
|
1035
|
+
file 'environments/x.json', { 'name' => 'y' }
|
1036
|
+
it 'knife upload fails' do
|
1037
|
+
knife('upload /environments/x.json').should_fail "ERROR: /environments failed to create_child: Error creating 'x.json': Name must be 'x' (is 'y')\n"
|
1038
|
+
knife('diff --name-status /environments/x.json').should_succeed "A\t/environments/x.json\n"
|
1039
|
+
end
|
1040
|
+
end
|
1041
|
+
|
1042
|
+
when_the_repository 'has an environment with no name in the file' do
|
1043
|
+
file 'environments/x.json', { 'description' => 'hi' }
|
1044
|
+
it 'knife upload succeeds' do
|
1045
|
+
knife('upload /environments/x.json').should_succeed "Created /environments/x.json\n"
|
1046
|
+
knife('diff --name-status /environments/x.json').should_succeed ''
|
1047
|
+
end
|
1048
|
+
end
|
1049
|
+
|
1050
|
+
when_the_repository 'has a data bag with no id in the file' do
|
1051
|
+
file 'data_bags/bag/x.json', { 'foo' => 'bar' }
|
1052
|
+
it 'knife upload succeeds' do
|
1053
|
+
knife('upload /data_bags/bag/x.json').should_succeed "Created /data_bags/bag\nCreated /data_bags/bag/x.json\n"
|
1054
|
+
knife('diff --name-status /data_bags/bag/x.json').should_succeed ''
|
1055
|
+
end
|
1056
|
+
end
|
1057
|
+
end
|
1058
|
+
end # with versioned cookbooks
|
1059
|
+
|
1060
|
+
end
|