chef 10.28.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 +7 -0
- data/LICENSE +201 -0
- data/README.rdoc +177 -0
- data/Rakefile +128 -0
- data/bin/chef-client +26 -0
- data/bin/chef-solo +25 -0
- data/bin/knife +26 -0
- data/bin/shef +34 -0
- data/distro/README +2 -0
- data/distro/arch/etc/conf.d/chef-client.conf +5 -0
- data/distro/arch/etc/conf.d/chef-expander.conf +8 -0
- data/distro/arch/etc/conf.d/chef-server-webui.conf +10 -0
- data/distro/arch/etc/conf.d/chef-server.conf +10 -0
- data/distro/arch/etc/conf.d/chef-solr.conf +8 -0
- data/distro/arch/etc/rc.d/chef-client +90 -0
- data/distro/arch/etc/rc.d/chef-expander +78 -0
- data/distro/arch/etc/rc.d/chef-server +78 -0
- data/distro/arch/etc/rc.d/chef-server-webui +78 -0
- data/distro/arch/etc/rc.d/chef-solr +78 -0
- data/distro/common/html/chef-client.8.html +145 -0
- data/distro/common/html/chef-expander.8.html +164 -0
- data/distro/common/html/chef-expanderctl.8.html +146 -0
- data/distro/common/html/chef-server-webui.8.html +185 -0
- data/distro/common/html/chef-server.8.html +182 -0
- data/distro/common/html/chef-solo.8.html +185 -0
- data/distro/common/html/chef-solr.8.html +165 -0
- data/distro/common/html/knife-bootstrap.1.html +241 -0
- data/distro/common/html/knife-client.1.html +219 -0
- data/distro/common/html/knife-configure.1.html +170 -0
- data/distro/common/html/knife-cookbook-site.1.html +241 -0
- data/distro/common/html/knife-cookbook.1.html +381 -0
- data/distro/common/html/knife-data-bag.1.html +235 -0
- data/distro/common/html/knife-environment.1.html +265 -0
- data/distro/common/html/knife-exec.1.html +134 -0
- data/distro/common/html/knife-index.1.html +125 -0
- data/distro/common/html/knife-node.1.html +250 -0
- data/distro/common/html/knife-recipe.1.html +92 -0
- data/distro/common/html/knife-role.1.html +200 -0
- data/distro/common/html/knife-search.1.html +288 -0
- data/distro/common/html/knife-ssh.1.html +156 -0
- data/distro/common/html/knife-status.1.html +128 -0
- data/distro/common/html/knife-tag.1.html +137 -0
- data/distro/common/html/knife.1.html +320 -0
- data/distro/common/html/shef.1.html +283 -0
- data/distro/common/man/man1/knife-bootstrap.1 +201 -0
- data/distro/common/man/man1/knife-client.1 +99 -0
- data/distro/common/man/man1/knife-configure.1 +88 -0
- data/distro/common/man/man1/knife-cookbook-site.1 +145 -0
- data/distro/common/man/man1/knife-cookbook.1 +332 -0
- data/distro/common/man/man1/knife-data-bag.1 +123 -0
- data/distro/common/man/man1/knife-environment.1 +168 -0
- data/distro/common/man/man1/knife-exec.1 +46 -0
- data/distro/common/man/man1/knife-index.1 +29 -0
- data/distro/common/man/man1/knife-node.1 +134 -0
- data/distro/common/man/man1/knife-role.1 +88 -0
- data/distro/common/man/man1/knife-search.1 +280 -0
- data/distro/common/man/man1/knife-ssh.1 +79 -0
- data/distro/common/man/man1/knife-status.1 +29 -0
- data/distro/common/man/man1/knife-tag.1 +43 -0
- data/distro/common/man/man1/knife.1 +288 -0
- data/distro/common/man/man1/shef.1 +256 -0
- data/distro/common/man/man8/chef-client.8 +104 -0
- data/distro/common/man/man8/chef-expander.8 +97 -0
- data/distro/common/man/man8/chef-expanderctl.8 +62 -0
- data/distro/common/man/man8/chef-server-webui.8 +155 -0
- data/distro/common/man/man8/chef-server.8 +147 -0
- data/distro/common/man/man8/chef-solo.8 +126 -0
- data/distro/common/man/man8/chef-solr.8 +122 -0
- data/distro/common/markdown/README +3 -0
- data/distro/common/markdown/man1/knife-bootstrap.mkd +141 -0
- data/distro/common/markdown/man1/knife-client.mkd +103 -0
- data/distro/common/markdown/man1/knife-configure.mkd +70 -0
- data/distro/common/markdown/man1/knife-cookbook-site.mkd +123 -0
- data/distro/common/markdown/man1/knife-cookbook.mkd +263 -0
- data/distro/common/markdown/man1/knife-data-bag.mkd +121 -0
- data/distro/common/markdown/man1/knife-environment.mkd +151 -0
- data/distro/common/markdown/man1/knife-exec.mkd +37 -0
- data/distro/common/markdown/man1/knife-index.mkd +30 -0
- data/distro/common/markdown/man1/knife-node.mkd +130 -0
- data/distro/common/markdown/man1/knife-role.mkd +85 -0
- data/distro/common/markdown/man1/knife-search.mkd +180 -0
- data/distro/common/markdown/man1/knife-ssh.mkd +69 -0
- data/distro/common/markdown/man1/knife-status.mkd +36 -0
- data/distro/common/markdown/man1/knife-tag.mkd +39 -0
- data/distro/common/markdown/man1/knife.mkd +218 -0
- data/distro/common/markdown/man1/shef.mkd +189 -0
- data/distro/common/markdown/man8/chef-client.mkd +74 -0
- data/distro/common/markdown/man8/chef-expander.mkd +82 -0
- data/distro/common/markdown/man8/chef-expanderctl.mkd +58 -0
- data/distro/common/markdown/man8/chef-server-webui.mkd +121 -0
- data/distro/common/markdown/man8/chef-server.mkd +121 -0
- data/distro/common/markdown/man8/chef-solo.mkd +107 -0
- data/distro/common/markdown/man8/chef-solr.mkd +89 -0
- data/distro/debian/etc/default/chef-client +5 -0
- data/distro/debian/etc/default/chef-expander +8 -0
- data/distro/debian/etc/default/chef-server +9 -0
- data/distro/debian/etc/default/chef-server-webui +9 -0
- data/distro/debian/etc/default/chef-solr +8 -0
- data/distro/debian/etc/init.d/chef-client +210 -0
- data/distro/debian/etc/init.d/chef-expander +176 -0
- data/distro/debian/etc/init.d/chef-server +122 -0
- data/distro/debian/etc/init.d/chef-server-webui +123 -0
- data/distro/debian/etc/init.d/chef-solr +176 -0
- data/distro/debian/etc/init/chef-client.conf +17 -0
- data/distro/debian/etc/init/chef-expander.conf +17 -0
- data/distro/debian/etc/init/chef-server-webui.conf +17 -0
- data/distro/debian/etc/init/chef-server.conf +17 -0
- data/distro/debian/etc/init/chef-solr.conf +17 -0
- data/distro/redhat/etc/init.d/chef-client +121 -0
- data/distro/redhat/etc/init.d/chef-expander +104 -0
- data/distro/redhat/etc/init.d/chef-server +112 -0
- data/distro/redhat/etc/init.d/chef-server-webui +112 -0
- data/distro/redhat/etc/init.d/chef-solr +104 -0
- data/distro/redhat/etc/logrotate.d/chef-client +8 -0
- data/distro/redhat/etc/logrotate.d/chef-expander +8 -0
- data/distro/redhat/etc/logrotate.d/chef-server +8 -0
- data/distro/redhat/etc/logrotate.d/chef-server-webui +8 -0
- data/distro/redhat/etc/logrotate.d/chef-solr +8 -0
- data/distro/redhat/etc/sysconfig/chef-client +15 -0
- data/distro/redhat/etc/sysconfig/chef-expander +7 -0
- data/distro/redhat/etc/sysconfig/chef-server +14 -0
- data/distro/redhat/etc/sysconfig/chef-server-webui +14 -0
- data/distro/redhat/etc/sysconfig/chef-solr +8 -0
- data/distro/windows/service_manager.rb +164 -0
- data/lib/chef.rb +41 -0
- data/lib/chef/api_client.rb +293 -0
- data/lib/chef/application.rb +168 -0
- data/lib/chef/application/agent.rb +18 -0
- data/lib/chef/application/client.rb +322 -0
- data/lib/chef/application/knife.rb +183 -0
- data/lib/chef/application/solo.rb +248 -0
- data/lib/chef/application/windows_service.rb +227 -0
- data/lib/chef/applications.rb +4 -0
- data/lib/chef/certificate.rb +161 -0
- data/lib/chef/checksum.rb +167 -0
- data/lib/chef/checksum/storage.rb +18 -0
- data/lib/chef/checksum/storage/filesystem.rb +56 -0
- data/lib/chef/checksum_cache.rb +190 -0
- data/lib/chef/client.rb +499 -0
- data/lib/chef/config.rb +330 -0
- data/lib/chef/cookbook/chefignore.rb +66 -0
- data/lib/chef/cookbook/cookbook_collection.rb +45 -0
- data/lib/chef/cookbook/cookbook_version_loader.rb +171 -0
- data/lib/chef/cookbook/file_system_file_vendor.rb +56 -0
- data/lib/chef/cookbook/file_vendor.rb +48 -0
- data/lib/chef/cookbook/metadata.rb +629 -0
- data/lib/chef/cookbook/remote_file_vendor.rb +84 -0
- data/lib/chef/cookbook/synchronizer.rb +218 -0
- data/lib/chef/cookbook/syntax_check.rb +136 -0
- data/lib/chef/cookbook_loader.rb +121 -0
- data/lib/chef/cookbook_site_streaming_uploader.rb +244 -0
- data/lib/chef/cookbook_uploader.rb +173 -0
- data/lib/chef/cookbook_version.rb +1081 -0
- data/lib/chef/cookbook_version_selector.rb +168 -0
- data/lib/chef/couchdb.rb +246 -0
- data/lib/chef/daemon.rb +187 -0
- data/lib/chef/data_bag.rb +239 -0
- data/lib/chef/data_bag_item.rb +277 -0
- data/lib/chef/encrypted_data_bag_item.rb +268 -0
- data/lib/chef/environment.rb +458 -0
- data/lib/chef/event_dispatch/base.rb +311 -0
- data/lib/chef/event_dispatch/dispatcher.rb +42 -0
- data/lib/chef/exceptions.rb +192 -0
- data/lib/chef/file_access_control.rb +75 -0
- data/lib/chef/file_access_control/unix.rb +216 -0
- data/lib/chef/file_access_control/windows.rb +310 -0
- data/lib/chef/file_cache.rb +220 -0
- data/lib/chef/formatters/base.rb +247 -0
- data/lib/chef/formatters/doc.rb +236 -0
- data/lib/chef/formatters/error_descriptor.rb +66 -0
- data/lib/chef/formatters/error_inspectors.rb +19 -0
- data/lib/chef/formatters/error_inspectors/api_error_formatting.rb +111 -0
- data/lib/chef/formatters/error_inspectors/compile_error_inspector.rb +106 -0
- data/lib/chef/formatters/error_inspectors/cookbook_resolve_error_inspector.rb +146 -0
- data/lib/chef/formatters/error_inspectors/cookbook_sync_error_inspector.rb +80 -0
- data/lib/chef/formatters/error_inspectors/node_load_error_inspector.rb +125 -0
- data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +137 -0
- data/lib/chef/formatters/error_inspectors/resource_failure_inspector.rb +109 -0
- data/lib/chef/formatters/error_inspectors/run_list_expansion_error_inspector.rb +118 -0
- data/lib/chef/formatters/error_mapper.rb +85 -0
- data/lib/chef/formatters/minimal.rb +235 -0
- data/lib/chef/handler.rb +235 -0
- data/lib/chef/handler/error_report.rb +33 -0
- data/lib/chef/handler/json_file.rb +64 -0
- data/lib/chef/index_queue.rb +29 -0
- data/lib/chef/index_queue/amqp_client.rb +116 -0
- data/lib/chef/index_queue/consumer.rb +76 -0
- data/lib/chef/index_queue/indexable.rb +109 -0
- data/lib/chef/json_compat.rb +149 -0
- data/lib/chef/knife.rb +537 -0
- data/lib/chef/knife/bootstrap.rb +233 -0
- data/lib/chef/knife/bootstrap/archlinux-gems.erb +62 -0
- data/lib/chef/knife/bootstrap/centos5-gems.erb +62 -0
- data/lib/chef/knife/bootstrap/chef-full.erb +60 -0
- data/lib/chef/knife/bootstrap/fedora13-gems.erb +44 -0
- data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +53 -0
- data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +48 -0
- data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +46 -0
- data/lib/chef/knife/bootstrap/ubuntu12.10-gems.erb +60 -0
- data/lib/chef/knife/client_bulk_delete.rb +65 -0
- data/lib/chef/knife/client_create.rb +80 -0
- data/lib/chef/knife/client_delete.rb +46 -0
- data/lib/chef/knife/client_edit.rb +45 -0
- data/lib/chef/knife/client_list.rb +42 -0
- data/lib/chef/knife/client_reregister.rb +59 -0
- data/lib/chef/knife/client_show.rb +52 -0
- data/lib/chef/knife/configure.rb +168 -0
- data/lib/chef/knife/configure_client.rb +50 -0
- data/lib/chef/knife/cookbook_bulk_delete.rb +72 -0
- data/lib/chef/knife/cookbook_create.rb +447 -0
- data/lib/chef/knife/cookbook_delete.rb +151 -0
- data/lib/chef/knife/cookbook_download.rb +137 -0
- data/lib/chef/knife/cookbook_list.rb +47 -0
- data/lib/chef/knife/cookbook_metadata.rb +107 -0
- data/lib/chef/knife/cookbook_metadata_from_file.rb +44 -0
- data/lib/chef/knife/cookbook_show.rb +102 -0
- data/lib/chef/knife/cookbook_site_download.rb +109 -0
- data/lib/chef/knife/cookbook_site_install.rb +164 -0
- data/lib/chef/knife/cookbook_site_list.rb +62 -0
- data/lib/chef/knife/cookbook_site_search.rb +51 -0
- data/lib/chef/knife/cookbook_site_share.rb +114 -0
- data/lib/chef/knife/cookbook_site_show.rb +60 -0
- data/lib/chef/knife/cookbook_site_unshare.rb +56 -0
- data/lib/chef/knife/cookbook_site_vendor.rb +46 -0
- data/lib/chef/knife/cookbook_test.rb +93 -0
- data/lib/chef/knife/cookbook_upload.rb +290 -0
- data/lib/chef/knife/core/bootstrap_context.rb +106 -0
- data/lib/chef/knife/core/cookbook_scm_repo.rb +160 -0
- data/lib/chef/knife/core/generic_presenter.rb +191 -0
- data/lib/chef/knife/core/node_editor.rb +130 -0
- data/lib/chef/knife/core/node_presenter.rb +137 -0
- data/lib/chef/knife/core/object_loader.rb +112 -0
- data/lib/chef/knife/core/subcommand_loader.rb +112 -0
- data/lib/chef/knife/core/text_formatter.rb +100 -0
- data/lib/chef/knife/core/ui.rb +217 -0
- data/lib/chef/knife/data_bag_create.rb +93 -0
- data/lib/chef/knife/data_bag_delete.rb +51 -0
- data/lib/chef/knife/data_bag_edit.rb +94 -0
- data/lib/chef/knife/data_bag_from_file.rb +136 -0
- data/lib/chef/knife/data_bag_list.rb +46 -0
- data/lib/chef/knife/data_bag_show.rb +81 -0
- data/lib/chef/knife/environment_create.rb +53 -0
- data/lib/chef/knife/environment_delete.rb +45 -0
- data/lib/chef/knife/environment_edit.rb +45 -0
- data/lib/chef/knife/environment_from_file.rb +83 -0
- data/lib/chef/knife/environment_list.rb +42 -0
- data/lib/chef/knife/environment_show.rb +46 -0
- data/lib/chef/knife/exec.rb +86 -0
- data/lib/chef/knife/help.rb +103 -0
- data/lib/chef/knife/help_topics.rb +4 -0
- data/lib/chef/knife/index_rebuild.rb +50 -0
- data/lib/chef/knife/node_bulk_delete.rb +80 -0
- data/lib/chef/knife/node_create.rb +50 -0
- data/lib/chef/knife/node_delete.rb +47 -0
- data/lib/chef/knife/node_edit.rb +72 -0
- data/lib/chef/knife/node_from_file.rb +50 -0
- data/lib/chef/knife/node_list.rb +46 -0
- data/lib/chef/knife/node_run_list_add.rb +75 -0
- data/lib/chef/knife/node_run_list_remove.rb +48 -0
- data/lib/chef/knife/node_show.rb +73 -0
- data/lib/chef/knife/recipe_list.rb +32 -0
- data/lib/chef/knife/role_bulk_delete.rb +70 -0
- data/lib/chef/knife/role_create.rb +55 -0
- data/lib/chef/knife/role_delete.rb +47 -0
- data/lib/chef/knife/role_edit.rb +48 -0
- data/lib/chef/knife/role_from_file.rb +56 -0
- data/lib/chef/knife/role_list.rb +43 -0
- data/lib/chef/knife/role_show.rb +54 -0
- data/lib/chef/knife/search.rb +141 -0
- data/lib/chef/knife/ssh.rb +459 -0
- data/lib/chef/knife/status.rb +119 -0
- data/lib/chef/knife/tag_create.rb +52 -0
- data/lib/chef/knife/tag_delete.rb +60 -0
- data/lib/chef/knife/tag_list.rb +47 -0
- data/lib/chef/log.rb +39 -0
- data/lib/chef/mash.rb +225 -0
- data/lib/chef/mixin/check_helper.rb +31 -0
- data/lib/chef/mixin/checksum.rb +32 -0
- data/lib/chef/mixin/command.rb +164 -0
- data/lib/chef/mixin/command/unix.rb +220 -0
- data/lib/chef/mixin/command/windows.rb +76 -0
- data/lib/chef/mixin/convert_to_class_name.rb +65 -0
- data/lib/chef/mixin/create_path.rb +57 -0
- data/lib/chef/mixin/deep_merge.rb +247 -0
- data/lib/chef/mixin/deprecation.rb +65 -0
- data/lib/chef/mixin/enforce_ownership_and_permissions.rb +39 -0
- data/lib/chef/mixin/file_class.rb +46 -0
- data/lib/chef/mixin/from_file.rb +50 -0
- data/lib/chef/mixin/get_source_from_package.rb +42 -0
- data/lib/chef/mixin/language.rb +249 -0
- data/lib/chef/mixin/language_include_attribute.rb +61 -0
- data/lib/chef/mixin/language_include_recipe.rb +58 -0
- data/lib/chef/mixin/params_validate.rb +238 -0
- data/lib/chef/mixin/path_sanity.rb +67 -0
- data/lib/chef/mixin/recipe_definition_dsl_core.rb +86 -0
- data/lib/chef/mixin/securable.rb +180 -0
- data/lib/chef/mixin/shell_out.rb +69 -0
- data/lib/chef/mixin/template.rb +100 -0
- data/lib/chef/mixin/why_run.rb +332 -0
- data/lib/chef/mixin/xml_escape.rb +140 -0
- data/lib/chef/mixins.rb +18 -0
- data/lib/chef/monkey_patches/dir.rb +36 -0
- data/lib/chef/monkey_patches/fileutils.rb +65 -0
- data/lib/chef/monkey_patches/moneta.rb +50 -0
- data/lib/chef/monkey_patches/net_http.rb +22 -0
- data/lib/chef/monkey_patches/numeric.rb +15 -0
- data/lib/chef/monkey_patches/object.rb +9 -0
- data/lib/chef/monkey_patches/regexp.rb +34 -0
- data/lib/chef/monkey_patches/string.rb +49 -0
- data/lib/chef/monkey_patches/tempfile.rb +64 -0
- data/lib/chef/nil_argument.rb +3 -0
- data/lib/chef/node.rb +682 -0
- data/lib/chef/node/attribute.rb +504 -0
- data/lib/chef/openid_registration.rb +187 -0
- data/lib/chef/platform.rb +520 -0
- data/lib/chef/provider.rb +223 -0
- data/lib/chef/provider/breakpoint.rb +36 -0
- data/lib/chef/provider/cookbook_file.rb +105 -0
- data/lib/chef/provider/cron.rb +214 -0
- data/lib/chef/provider/cron/solaris.rb +56 -0
- data/lib/chef/provider/deploy.rb +474 -0
- data/lib/chef/provider/deploy/revision.rb +80 -0
- data/lib/chef/provider/deploy/timestamped.rb +32 -0
- data/lib/chef/provider/directory.rb +128 -0
- data/lib/chef/provider/env.rb +152 -0
- data/lib/chef/provider/env/windows.rb +75 -0
- data/lib/chef/provider/erl_call.rb +106 -0
- data/lib/chef/provider/execute.rb +68 -0
- data/lib/chef/provider/file.rb +355 -0
- data/lib/chef/provider/git.rb +260 -0
- data/lib/chef/provider/group.rb +159 -0
- data/lib/chef/provider/group/aix.rb +70 -0
- data/lib/chef/provider/group/dscl.rb +129 -0
- data/lib/chef/provider/group/gpasswd.rb +65 -0
- data/lib/chef/provider/group/groupadd.rb +96 -0
- data/lib/chef/provider/group/groupmod.rb +120 -0
- data/lib/chef/provider/group/pw.rb +93 -0
- data/lib/chef/provider/group/suse.rb +60 -0
- data/lib/chef/provider/group/usermod.rb +68 -0
- data/lib/chef/provider/group/windows.rb +79 -0
- data/lib/chef/provider/http_request.rb +136 -0
- data/lib/chef/provider/ifconfig.rb +214 -0
- data/lib/chef/provider/link.rb +130 -0
- data/lib/chef/provider/log.rb +54 -0
- data/lib/chef/provider/mdadm.rb +92 -0
- data/lib/chef/provider/mount.rb +128 -0
- data/lib/chef/provider/mount/mount.rb +252 -0
- data/lib/chef/provider/mount/windows.rb +81 -0
- data/lib/chef/provider/ohai.rb +47 -0
- data/lib/chef/provider/package.rb +229 -0
- data/lib/chef/provider/package/apt.rb +147 -0
- data/lib/chef/provider/package/dpkg.rb +128 -0
- data/lib/chef/provider/package/easy_install.rb +136 -0
- data/lib/chef/provider/package/freebsd.rb +149 -0
- data/lib/chef/provider/package/ips.rb +101 -0
- data/lib/chef/provider/package/macports.rb +105 -0
- data/lib/chef/provider/package/pacman.rb +111 -0
- data/lib/chef/provider/package/portage.rb +143 -0
- data/lib/chef/provider/package/rpm.rb +121 -0
- data/lib/chef/provider/package/rubygems.rb +580 -0
- data/lib/chef/provider/package/smartos.rb +84 -0
- data/lib/chef/provider/package/solaris.rb +139 -0
- data/lib/chef/provider/package/yum-dump.py +307 -0
- data/lib/chef/provider/package/yum.rb +1261 -0
- data/lib/chef/provider/package/zypper.rb +144 -0
- data/lib/chef/provider/remote_directory.rb +178 -0
- data/lib/chef/provider/remote_file.rb +126 -0
- data/lib/chef/provider/resource_update.rb +55 -0
- data/lib/chef/provider/route.rb +223 -0
- data/lib/chef/provider/ruby_block.rb +39 -0
- data/lib/chef/provider/script.rb +57 -0
- data/lib/chef/provider/service.rb +158 -0
- data/lib/chef/provider/service/arch.rb +113 -0
- data/lib/chef/provider/service/debian.rb +152 -0
- data/lib/chef/provider/service/freebsd.rb +175 -0
- data/lib/chef/provider/service/gentoo.rb +67 -0
- data/lib/chef/provider/service/init.rb +87 -0
- data/lib/chef/provider/service/insserv.rb +52 -0
- data/lib/chef/provider/service/invokercd.rb +35 -0
- data/lib/chef/provider/service/macosx.rb +144 -0
- data/lib/chef/provider/service/redhat.rb +77 -0
- data/lib/chef/provider/service/simple.rb +172 -0
- data/lib/chef/provider/service/solaris.rb +86 -0
- data/lib/chef/provider/service/systemd.rb +115 -0
- data/lib/chef/provider/service/upstart.rb +232 -0
- data/lib/chef/provider/service/windows.rb +163 -0
- data/lib/chef/provider/subversion.rb +214 -0
- data/lib/chef/provider/template.rb +117 -0
- data/lib/chef/provider/user.rb +207 -0
- data/lib/chef/provider/user/dscl.rb +280 -0
- data/lib/chef/provider/user/pw.rb +113 -0
- data/lib/chef/provider/user/solaris.rb +90 -0
- data/lib/chef/provider/user/useradd.rb +153 -0
- data/lib/chef/provider/user/windows.rb +124 -0
- data/lib/chef/providers.rb +101 -0
- data/lib/chef/recipe.rb +129 -0
- data/lib/chef/reserved_names.rb +9 -0
- data/lib/chef/resource.rb +912 -0
- data/lib/chef/resource/apt_package.rb +43 -0
- data/lib/chef/resource/bash.rb +33 -0
- data/lib/chef/resource/breakpoint.rb +35 -0
- data/lib/chef/resource/chef_gem.rb +53 -0
- data/lib/chef/resource/conditional.rb +101 -0
- data/lib/chef/resource/cookbook_file.rb +52 -0
- data/lib/chef/resource/cron.rb +202 -0
- data/lib/chef/resource/csh.rb +33 -0
- data/lib/chef/resource/deploy.rb +403 -0
- data/lib/chef/resource/deploy_revision.rb +40 -0
- data/lib/chef/resource/directory.rb +65 -0
- data/lib/chef/resource/dpkg_package.rb +34 -0
- data/lib/chef/resource/easy_install_package.rb +57 -0
- data/lib/chef/resource/env.rb +63 -0
- data/lib/chef/resource/erl_call.rb +86 -0
- data/lib/chef/resource/execute.rb +132 -0
- data/lib/chef/resource/file.rb +96 -0
- data/lib/chef/resource/freebsd_package.rb +35 -0
- data/lib/chef/resource/gem_package.rb +53 -0
- data/lib/chef/resource/git.rb +46 -0
- data/lib/chef/resource/group.rb +83 -0
- data/lib/chef/resource/http_request.rb +64 -0
- data/lib/chef/resource/ifconfig.rb +149 -0
- data/lib/chef/resource/ips_package.rb +42 -0
- data/lib/chef/resource/link.rb +92 -0
- data/lib/chef/resource/log.rb +74 -0
- data/lib/chef/resource/macports_package.rb +29 -0
- data/lib/chef/resource/mdadm.rb +105 -0
- data/lib/chef/resource/mount.rb +139 -0
- data/lib/chef/resource/ohai.rb +54 -0
- data/lib/chef/resource/package.rb +84 -0
- data/lib/chef/resource/pacman_package.rb +33 -0
- data/lib/chef/resource/perl.rb +33 -0
- data/lib/chef/resource/portage_package.rb +33 -0
- data/lib/chef/resource/python.rb +33 -0
- data/lib/chef/resource/remote_directory.rb +125 -0
- data/lib/chef/resource/remote_file.rb +90 -0
- data/lib/chef/resource/route.rb +140 -0
- data/lib/chef/resource/rpm_package.rb +34 -0
- data/lib/chef/resource/ruby.rb +33 -0
- data/lib/chef/resource/ruby_block.rb +51 -0
- data/lib/chef/resource/scm.rb +151 -0
- data/lib/chef/resource/script.rb +63 -0
- data/lib/chef/resource/service.rb +164 -0
- data/lib/chef/resource/smartos_package.rb +36 -0
- data/lib/chef/resource/solaris_package.rb +36 -0
- data/lib/chef/resource/subversion.rb +37 -0
- data/lib/chef/resource/template.rb +76 -0
- data/lib/chef/resource/timestamped_deploy.rb +31 -0
- data/lib/chef/resource/user.rb +134 -0
- data/lib/chef/resource/yum_package.rb +63 -0
- data/lib/chef/resource_collection.rb +217 -0
- data/lib/chef/resource_collection/stepable_iterator.rb +124 -0
- data/lib/chef/resource_definition.rb +67 -0
- data/lib/chef/resource_definition_list.rb +38 -0
- data/lib/chef/resource_platform_map.rb +151 -0
- data/lib/chef/resource_reporter.rb +281 -0
- data/lib/chef/resources.rb +67 -0
- data/lib/chef/rest.rb +510 -0
- data/lib/chef/rest/auth_credentials.rb +73 -0
- data/lib/chef/rest/cookie_jar.rb +31 -0
- data/lib/chef/rest/rest_request.rb +229 -0
- data/lib/chef/role.rb +349 -0
- data/lib/chef/run_context.rb +236 -0
- data/lib/chef/run_list.rb +165 -0
- data/lib/chef/run_list/run_list_expansion.rb +206 -0
- data/lib/chef/run_list/run_list_item.rb +99 -0
- data/lib/chef/run_list/versioned_recipe_list.rb +68 -0
- data/lib/chef/run_status.rb +124 -0
- data/lib/chef/runner.rb +95 -0
- data/lib/chef/sandbox.rb +153 -0
- data/lib/chef/scan_access_control.rb +135 -0
- data/lib/chef/search/query.rb +65 -0
- data/lib/chef/shef.rb +327 -0
- data/lib/chef/shef/ext.rb +591 -0
- data/lib/chef/shef/model_wrapper.rb +120 -0
- data/lib/chef/shef/shef_rest.rb +28 -0
- data/lib/chef/shef/shef_session.rb +296 -0
- data/lib/chef/shell_out.rb +6 -0
- data/lib/chef/solr_query.rb +187 -0
- data/lib/chef/solr_query/lucene.treetop +150 -0
- data/lib/chef/solr_query/lucene_nodes.rb +285 -0
- data/lib/chef/solr_query/query_transform.rb +65 -0
- data/lib/chef/solr_query/solr_http_request.rb +132 -0
- data/lib/chef/streaming_cookbook_uploader.rb +201 -0
- data/lib/chef/tasks/chef_repo.rake +334 -0
- data/lib/chef/util/file_edit.rb +132 -0
- data/lib/chef/util/windows.rb +56 -0
- data/lib/chef/util/windows/net_group.rb +101 -0
- data/lib/chef/util/windows/net_use.rb +121 -0
- data/lib/chef/util/windows/net_user.rb +198 -0
- data/lib/chef/util/windows/volume.rb +59 -0
- data/lib/chef/version.rb +23 -0
- data/lib/chef/version_class.rb +70 -0
- data/lib/chef/version_constraint.rb +116 -0
- data/lib/chef/webui_user.rb +231 -0
- data/lib/chef/win32/api.rb +364 -0
- data/lib/chef/win32/api/error.rb +921 -0
- data/lib/chef/win32/api/file.rb +535 -0
- data/lib/chef/win32/api/memory.rb +105 -0
- data/lib/chef/win32/api/process.rb +41 -0
- data/lib/chef/win32/api/psapi.rb +51 -0
- data/lib/chef/win32/api/security.rb +341 -0
- data/lib/chef/win32/api/system.rb +192 -0
- data/lib/chef/win32/api/unicode.rb +178 -0
- data/lib/chef/win32/error.rb +73 -0
- data/lib/chef/win32/file.rb +167 -0
- data/lib/chef/win32/file/info.rb +100 -0
- data/lib/chef/win32/handle.rb +55 -0
- data/lib/chef/win32/memory.rb +101 -0
- data/lib/chef/win32/process.rb +84 -0
- data/lib/chef/win32/security.rb +489 -0
- data/lib/chef/win32/security/ace.rb +125 -0
- data/lib/chef/win32/security/acl.rb +101 -0
- data/lib/chef/win32/security/securable_object.rb +109 -0
- data/lib/chef/win32/security/security_descriptor.rb +93 -0
- data/lib/chef/win32/security/sid.rb +199 -0
- data/lib/chef/win32/security/token.rb +64 -0
- data/lib/chef/win32/unicode.rb +43 -0
- data/lib/chef/win32/version.rb +119 -0
- data/spec/data/bad-config.rb +1 -0
- data/spec/data/big_json.json +2 -0
- data/spec/data/big_json_plus_one.json +2 -0
- data/spec/data/bootstrap/test-hints.erb +12 -0
- data/spec/data/bootstrap/test.erb +1 -0
- data/spec/data/cb_version_cookbooks/tatft/README.rdoc +3 -0
- data/spec/data/cb_version_cookbooks/tatft/attributes/default.rb +1 -0
- data/spec/data/cb_version_cookbooks/tatft/definitions/runit_service.rb +1 -0
- data/spec/data/cb_version_cookbooks/tatft/files/default/giant_blob.tgz +1 -0
- data/spec/data/cb_version_cookbooks/tatft/libraries/ownage.rb +1 -0
- data/spec/data/cb_version_cookbooks/tatft/providers/lwp.rb +1 -0
- data/spec/data/cb_version_cookbooks/tatft/recipes/default.rb +1 -0
- data/spec/data/cb_version_cookbooks/tatft/resources/lwr.rb +1 -0
- data/spec/data/cb_version_cookbooks/tatft/templates/default/configuration.erb +0 -0
- data/spec/data/checksum/random.txt +1 -0
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-600hhz-0 +1 -0
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-6m8zdk-0 +0 -0
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ahd2gq-0 +1 -0
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-api8ux-0 +1 -0
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-b0r1m1-0 +1 -0
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-bfygsi-0 +1 -0
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-el14l6-0 +1 -0
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ivrl3y-0 +1 -0
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-kkbs85-0 +1 -0
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ory1ux-0 +1 -0
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-pgsq76-0 +1 -0
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ra8uim-0 +1 -0
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-t7k1g-0 +1 -0
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-t8g0sv-0 +1 -0
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ufy6g3-0 +1 -0
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-x2d6j9-0 +1 -0
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-xi0l6h-0 +1 -0
- data/spec/data/config.rb +6 -0
- data/spec/data/cookbooks/angrybash/recipes/default.rb +8 -0
- data/spec/data/cookbooks/apache2/files/default/apache2_module_conf_generate.pl +2 -0
- data/spec/data/cookbooks/apache2/recipes/default.rb +3 -0
- data/spec/data/cookbooks/borken/recipes/default.rb +2 -0
- data/spec/data/cookbooks/borken/templates/default/borken.erb +2 -0
- data/spec/data/cookbooks/chefignore +8 -0
- data/spec/data/cookbooks/java/files/default/java.response +2 -0
- data/spec/data/cookbooks/openldap/attributes/default.rb +15 -0
- data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -0
- data/spec/data/cookbooks/openldap/definitions/client.rb +5 -0
- data/spec/data/cookbooks/openldap/definitions/server.rb +5 -0
- data/spec/data/cookbooks/openldap/files/default/.dotfile +1 -0
- data/spec/data/cookbooks/openldap/files/default/.ssh/id_rsa +1 -0
- data/spec/data/cookbooks/openldap/files/default/remotedir/.a_dotdir/.a_dotfile_in_a_dotdir +1 -0
- data/spec/data/cookbooks/openldap/files/default/remotedir/remote_dir_file1.txt +3 -0
- data/spec/data/cookbooks/openldap/files/default/remotedir/remote_dir_file2.txt +3 -0
- data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/.a_dotfile +1 -0
- data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/remote_subdir_file1.txt +3 -0
- data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/remote_subdir_file2.txt +3 -0
- data/spec/data/cookbooks/openldap/files/default/remotedir/subdir_with_no_file_just_a_subsubdir/the_subsubdir/some_file.txt +3 -0
- data/spec/data/cookbooks/openldap/recipes/default.rb +3 -0
- data/spec/data/cookbooks/openldap/recipes/gigantor.rb +3 -0
- data/spec/data/cookbooks/openldap/recipes/one.rb +15 -0
- data/spec/data/cookbooks/openldap/templates/default/openldap_stuff.conf.erb +1 -0
- data/spec/data/cookbooks/openldap/templates/default/openldap_variable_stuff.conf.erb +1 -0
- data/spec/data/cookbooks/openldap/templates/default/test.erb +1 -0
- data/spec/data/definitions/test.rb +5 -0
- data/spec/data/environment-config.rb +5 -0
- data/spec/data/fileedit/blank +0 -0
- data/spec/data/fileedit/hosts +4 -0
- data/spec/data/gems/chef-integration-test-0.1.0.gem +0 -0
- data/spec/data/git_bundles/sinatra-test-app-with-callback-files.gitbundle +0 -0
- data/spec/data/git_bundles/sinatra-test-app-with-symlinks.gitbundle +0 -0
- data/spec/data/git_bundles/sinatra-test-app.gitbundle +0 -0
- data/spec/data/kitchen/chefignore +6 -0
- data/spec/data/kitchen/openldap/attributes/default.rb +3 -0
- data/spec/data/kitchen/openldap/attributes/robinson.rb +3 -0
- data/spec/data/kitchen/openldap/definitions/client.rb +3 -0
- data/spec/data/kitchen/openldap/definitions/drewbarrymore.rb +3 -0
- data/spec/data/kitchen/openldap/recipes/gigantor.rb +3 -0
- data/spec/data/kitchen/openldap/recipes/ignoreme.rb +3 -0
- data/spec/data/kitchen/openldap/recipes/woot.rb +3 -0
- data/spec/data/knife-home/.chef/plugins/knife/example_home_subcommand.rb +0 -0
- data/spec/data/knife-site-subcommands/plugins/knife/example_subcommand.rb +0 -0
- data/spec/data/knife_subcommand/test_explicit_category.rb +7 -0
- data/spec/data/knife_subcommand/test_name_mapping.rb +4 -0
- data/spec/data/knife_subcommand/test_yourself.rb +13 -0
- data/spec/data/lwrp/providers/buck_passer.rb +3 -0
- data/spec/data/lwrp/providers/buck_passer_2.rb +10 -0
- data/spec/data/lwrp/providers/embedded_resource_accesses_providers_scope.rb +16 -0
- data/spec/data/lwrp/providers/monkey_name_printer.rb +5 -0
- data/spec/data/lwrp/providers/paint_drying_watcher.rb +7 -0
- data/spec/data/lwrp/providers/thumb_twiddler.rb +7 -0
- data/spec/data/lwrp/resources/bar.rb +1 -0
- data/spec/data/lwrp/resources/foo.rb +3 -0
- data/spec/data/lwrp/resources_with_default_attributes/nodeattr.rb +1 -0
- data/spec/data/lwrp_const_scoping/resources/conflict.rb +0 -0
- data/spec/data/lwrp_override/providers/buck_passer.rb +10 -0
- data/spec/data/lwrp_override/resources/foo.rb +4 -0
- data/spec/data/metadata/quick_start/metadata.rb +19 -0
- data/spec/data/nodes/default.rb +15 -0
- data/spec/data/nodes/test.example.com.rb +17 -0
- data/spec/data/nodes/test.rb +15 -0
- data/spec/data/object_loader/environments/test.json +5 -0
- data/spec/data/object_loader/environments/test.rb +2 -0
- data/spec/data/object_loader/environments/test_json_class.json +6 -0
- data/spec/data/object_loader/nodes/test.json +5 -0
- data/spec/data/object_loader/nodes/test.rb +2 -0
- data/spec/data/object_loader/nodes/test_json_class.json +6 -0
- data/spec/data/object_loader/roles/test.json +5 -0
- data/spec/data/object_loader/roles/test.rb +2 -0
- data/spec/data/object_loader/roles/test_json_class.json +6 -0
- data/spec/data/old_home_dir/my-dot-emacs +0 -0
- data/spec/data/old_home_dir/my-dot-vim +0 -0
- data/spec/data/recipes/test.rb +7 -0
- data/spec/data/remote_directory_data/remote_dir_file.txt +1 -0
- data/spec/data/remote_directory_data/remote_subdirectory/remote_subdir_file.txt +1 -0
- data/spec/data/remote_file/nyan_cat.png +0 -0
- data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -0
- data/spec/data/run_context/cookbooks/test/definitions/new_animals.rb +9 -0
- data/spec/data/run_context/cookbooks/test/definitions/new_cat.rb +5 -0
- data/spec/data/run_context/cookbooks/test/recipes/default.rb +5 -0
- data/spec/data/run_context/cookbooks/test/recipes/one.rb +7 -0
- data/spec/data/run_context/cookbooks/test/recipes/two.rb +7 -0
- data/spec/data/run_context/nodes/run_context.rb +5 -0
- data/spec/data/search_queries_to_transform.txt +98 -0
- data/spec/data/ssl/5e707473.0 +18 -0
- data/spec/data/ssl/chef-rspec.cert +27 -0
- data/spec/data/ssl/chef-rspec.key +27 -0
- data/spec/data/ssl/key.pem +15 -0
- data/spec/data/ssl/private_key.pem +27 -0
- data/spec/data/ssl/private_key_with_whitespace.pem +32 -0
- data/spec/data/templates/seattle.txt +1 -0
- data/spec/functional/knife/cookbook_delete_spec.rb +160 -0
- data/spec/functional/knife/exec_spec.rb +60 -0
- data/spec/functional/knife/ssh_spec.rb +268 -0
- data/spec/functional/resource/cookbook_file_spec.rb +75 -0
- data/spec/functional/resource/deploy_revision_spec.rb +515 -0
- data/spec/functional/resource/directory_spec.rb +39 -0
- data/spec/functional/resource/file_spec.rb +69 -0
- data/spec/functional/resource/link_spec.rb +572 -0
- data/spec/functional/resource/remote_directory_spec.rb +114 -0
- data/spec/functional/resource/remote_file_spec.rb +65 -0
- data/spec/functional/resource/template_spec.rb +68 -0
- data/spec/functional/tiny_server_spec.rb +78 -0
- data/spec/rcov.opts +2 -0
- data/spec/spec_helper.rb +82 -0
- data/spec/stress/win32/file_spec.rb +37 -0
- data/spec/stress/win32/memory_spec.rb +22 -0
- data/spec/stress/win32/security_spec.rb +69 -0
- data/spec/support/chef_helpers.rb +65 -0
- data/spec/support/lib/chef/provider/easy.rb +35 -0
- data/spec/support/lib/chef/provider/snakeoil.rb +40 -0
- data/spec/support/lib/chef/resource/cat.rb +41 -0
- data/spec/support/lib/chef/resource/one_two_three_four.rb +43 -0
- data/spec/support/lib/chef/resource/zen_master.rb +46 -0
- data/spec/support/matchers/leak.rb +96 -0
- data/spec/support/mock/constant.rb +52 -0
- data/spec/support/mock/platform.rb +18 -0
- data/spec/support/platform_helpers.rb +39 -0
- data/spec/support/platforms/prof/gc.rb +54 -0
- data/spec/support/platforms/prof/win32.rb +46 -0
- data/spec/support/shared/functional/directory_resource.rb +85 -0
- data/spec/support/shared/functional/file_resource.rb +202 -0
- data/spec/support/shared/functional/knife.rb +37 -0
- data/spec/support/shared/functional/securable_resource.rb +402 -0
- data/spec/support/shared/unit/api_error_inspector.rb +192 -0
- data/spec/tiny_server.rb +202 -0
- data/spec/unit/api_client_spec.rb +257 -0
- data/spec/unit/application/agent_spec.rb +0 -0
- data/spec/unit/application/client_spec.rb +171 -0
- data/spec/unit/application/knife_spec.rb +152 -0
- data/spec/unit/application/server_spec.rb +0 -0
- data/spec/unit/application/solo_spec.rb +167 -0
- data/spec/unit/application_spec.rb +239 -0
- data/spec/unit/certificate_spec.rb +76 -0
- data/spec/unit/checksum/storage/filesystem_spec.rb +69 -0
- data/spec/unit/checksum_cache_spec.rb +209 -0
- data/spec/unit/checksum_spec.rb +94 -0
- data/spec/unit/chef_spec.rb +25 -0
- data/spec/unit/client_spec.rb +290 -0
- data/spec/unit/config_spec.rb +223 -0
- data/spec/unit/cookbook/chefignore_spec.rb +39 -0
- data/spec/unit/cookbook/metadata_spec.rb +627 -0
- data/spec/unit/cookbook/synchronizer_spec.rb +306 -0
- data/spec/unit/cookbook/syntax_check_spec.rb +211 -0
- data/spec/unit/cookbook_loader_spec.rb +145 -0
- data/spec/unit/cookbook_manifest_spec.rb +554 -0
- data/spec/unit/cookbook_spec.rb +101 -0
- data/spec/unit/cookbook_version_spec.rb +406 -0
- data/spec/unit/couchdb_spec.rb +274 -0
- data/spec/unit/daemon_spec.rb +302 -0
- data/spec/unit/data_bag_item_spec.rb +280 -0
- data/spec/unit/data_bag_spec.rb +169 -0
- data/spec/unit/encrypted_data_bag_item_spec.rb +293 -0
- data/spec/unit/environment_spec.rb +492 -0
- data/spec/unit/exceptions_spec.rb +74 -0
- data/spec/unit/file_access_control_spec.rb +282 -0
- data/spec/unit/file_cache_spec.rb +114 -0
- data/spec/unit/formatters/error_inspectors/compile_error_inspector_spec.rb +202 -0
- data/spec/unit/formatters/error_inspectors/cookbook_resolve_error_inspector_spec.rb +93 -0
- data/spec/unit/formatters/error_inspectors/cookbook_sync_error_inspector_spec.rb +43 -0
- data/spec/unit/formatters/error_inspectors/node_load_error_inspector_spec.rb +27 -0
- data/spec/unit/formatters/error_inspectors/registration_error_inspector_spec.rb +27 -0
- data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +182 -0
- data/spec/unit/formatters/error_inspectors/run_list_expansion_error_inspector_spec.rb +93 -0
- data/spec/unit/handler/json_file_spec.rb +64 -0
- data/spec/unit/handler_spec.rb +216 -0
- data/spec/unit/index_queue_spec.rb +391 -0
- data/spec/unit/json_compat_spec.rb +61 -0
- data/spec/unit/knife/bootstrap_spec.rb +265 -0
- data/spec/unit/knife/client_bulk_delete_spec.rb +78 -0
- data/spec/unit/knife/client_create_spec.rb +74 -0
- data/spec/unit/knife/client_delete_spec.rb +40 -0
- data/spec/unit/knife/client_edit_spec.rb +40 -0
- data/spec/unit/knife/client_list_spec.rb +34 -0
- data/spec/unit/knife/client_reregister_spec.rb +62 -0
- data/spec/unit/knife/client_show_spec.rb +42 -0
- data/spec/unit/knife/config_file_selection_spec.rb +118 -0
- data/spec/unit/knife/configure_client_spec.rb +83 -0
- data/spec/unit/knife/configure_spec.rb +229 -0
- data/spec/unit/knife/cookbook_bulk_delete_spec.rb +87 -0
- data/spec/unit/knife/cookbook_create_spec.rb +271 -0
- data/spec/unit/knife/cookbook_delete_spec.rb +239 -0
- data/spec/unit/knife/cookbook_download_spec.rb +217 -0
- data/spec/unit/knife/cookbook_list_spec.rb +88 -0
- data/spec/unit/knife/cookbook_metadata_from_file_spec.rb +65 -0
- data/spec/unit/knife/cookbook_metadata_spec.rb +172 -0
- data/spec/unit/knife/cookbook_show_spec.rb +223 -0
- data/spec/unit/knife/cookbook_site_download_spec.rb +151 -0
- data/spec/unit/knife/cookbook_site_install_spec.rb +148 -0
- data/spec/unit/knife/cookbook_site_share_spec.rb +146 -0
- data/spec/unit/knife/cookbook_site_unshare_spec.rb +77 -0
- data/spec/unit/knife/cookbook_test_spec.rb +83 -0
- data/spec/unit/knife/cookbook_upload_spec.rb +148 -0
- data/spec/unit/knife/core/bootstrap_context_spec.rb +135 -0
- data/spec/unit/knife/core/cookbook_scm_repo_spec.rb +187 -0
- data/spec/unit/knife/core/object_loader_spec.rb +81 -0
- data/spec/unit/knife/core/subcommand_loader_spec.rb +54 -0
- data/spec/unit/knife/core/ui_spec.rb +160 -0
- data/spec/unit/knife/data_bag_create_spec.rb +101 -0
- data/spec/unit/knife/data_bag_edit_spec.rb +96 -0
- data/spec/unit/knife/data_bag_from_file_spec.rb +198 -0
- data/spec/unit/knife/data_bag_show_spec.rb +105 -0
- data/spec/unit/knife/environment_create_spec.rb +91 -0
- data/spec/unit/knife/environment_delete_spec.rb +71 -0
- data/spec/unit/knife/environment_edit_spec.rb +79 -0
- data/spec/unit/knife/environment_from_file_spec.rb +89 -0
- data/spec/unit/knife/environment_list_spec.rb +54 -0
- data/spec/unit/knife/environment_show_spec.rb +52 -0
- data/spec/unit/knife/index_rebuild_spec.rb +65 -0
- data/spec/unit/knife/knife_help.rb +92 -0
- data/spec/unit/knife/node_bulk_delete_spec.rb +97 -0
- data/spec/unit/knife/node_delete_spec.rb +68 -0
- data/spec/unit/knife/node_edit_spec.rb +88 -0
- data/spec/unit/knife/node_from_file_spec.rb +59 -0
- data/spec/unit/knife/node_list_spec.rb +63 -0
- data/spec/unit/knife/node_run_list_add_spec.rb +125 -0
- data/spec/unit/knife/node_run_list_remove_spec.rb +73 -0
- data/spec/unit/knife/node_show_spec.rb +48 -0
- data/spec/unit/knife/role_bulk_delete_spec.rb +80 -0
- data/spec/unit/knife/role_create_spec.rb +80 -0
- data/spec/unit/knife/role_delete_spec.rb +67 -0
- data/spec/unit/knife/role_edit_spec.rb +79 -0
- data/spec/unit/knife/role_from_file_spec.rb +69 -0
- data/spec/unit/knife/role_list_spec.rb +56 -0
- data/spec/unit/knife/ssh_spec.rb +293 -0
- data/spec/unit/knife/status_spec.rb +43 -0
- data/spec/unit/knife/tag_create_spec.rb +23 -0
- data/spec/unit/knife/tag_delete_spec.rb +25 -0
- data/spec/unit/knife/tag_list_spec.rb +23 -0
- data/spec/unit/knife_spec.rb +295 -0
- data/spec/unit/log_spec.rb +24 -0
- data/spec/unit/lwrp_spec.rb +256 -0
- data/spec/unit/mash_spec.rb +51 -0
- data/spec/unit/mixin/checksum_spec.rb +41 -0
- data/spec/unit/mixin/command_spec.rb +105 -0
- data/spec/unit/mixin/convert_to_class_name_spec.rb +50 -0
- data/spec/unit/mixin/deep_merge_spec.rb +786 -0
- data/spec/unit/mixin/deprecation_spec.rb +34 -0
- data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +90 -0
- data/spec/unit/mixin/language_spec.rb +305 -0
- data/spec/unit/mixin/params_validate_spec.rb +405 -0
- data/spec/unit/mixin/path_sanity_spec.rb +80 -0
- data/spec/unit/mixin/securable_spec.rb +254 -0
- data/spec/unit/mixin/shell_out_spec.rb +109 -0
- data/spec/unit/mixin/template_spec.rb +104 -0
- data/spec/unit/mixin/xml_escape_spec.rb +54 -0
- data/spec/unit/monkey_patches/string_spec.rb +37 -0
- data/spec/unit/node/attribute_spec.rb +1033 -0
- data/spec/unit/node_spec.rb +744 -0
- data/spec/unit/openid_registration_spec.rb +153 -0
- data/spec/unit/platform_spec.rb +241 -0
- data/spec/unit/provider/breakpoint_spec.rb +54 -0
- data/spec/unit/provider/cookbook_file_spec.rb +218 -0
- data/spec/unit/provider/cron/solaris_spec.rb +121 -0
- data/spec/unit/provider/cron_spec.rb +812 -0
- data/spec/unit/provider/deploy/revision_spec.rb +103 -0
- data/spec/unit/provider/deploy/timestamped_spec.rb +40 -0
- data/spec/unit/provider/deploy_spec.rb +620 -0
- data/spec/unit/provider/directory_spec.rb +156 -0
- data/spec/unit/provider/env_spec.rb +232 -0
- data/spec/unit/provider/erl_call_spec.rb +86 -0
- data/spec/unit/provider/execute_spec.rb +63 -0
- data/spec/unit/provider/file_spec.rb +505 -0
- data/spec/unit/provider/git_spec.rb +342 -0
- data/spec/unit/provider/group/dscl_spec.rb +294 -0
- data/spec/unit/provider/group/gpasswd_spec.rb +108 -0
- data/spec/unit/provider/group/groupadd_spec.rb +161 -0
- data/spec/unit/provider/group/groupmod_spec.rb +134 -0
- data/spec/unit/provider/group/pw_spec.rb +140 -0
- data/spec/unit/provider/group/usermod_spec.rb +95 -0
- data/spec/unit/provider/group/windows_spec.rb +94 -0
- data/spec/unit/provider/group_spec.rb +259 -0
- data/spec/unit/provider/http_request_spec.rb +178 -0
- data/spec/unit/provider/ifconfig_spec.rb +213 -0
- data/spec/unit/provider/link_spec.rb +252 -0
- data/spec/unit/provider/log_spec.rb +81 -0
- data/spec/unit/provider/mdadm_spec.rb +128 -0
- data/spec/unit/provider/mount/mount_spec.rb +398 -0
- data/spec/unit/provider/mount/windows_spec.rb +134 -0
- data/spec/unit/provider/mount_spec.rb +160 -0
- data/spec/unit/provider/ohai_spec.rb +85 -0
- data/spec/unit/provider/package/apt_spec.rb +352 -0
- data/spec/unit/provider/package/dpkg_spec.rb +216 -0
- data/spec/unit/provider/package/easy_install_spec.rb +112 -0
- data/spec/unit/provider/package/freebsd_spec.rb +259 -0
- data/spec/unit/provider/package/ips_spec.rb +210 -0
- data/spec/unit/provider/package/macports_spec.rb +203 -0
- data/spec/unit/provider/package/pacman_spec.rb +206 -0
- data/spec/unit/provider/package/portage_spec.rb +320 -0
- data/spec/unit/provider/package/rpm_spec.rb +152 -0
- data/spec/unit/provider/package/rubygems_spec.rb +639 -0
- data/spec/unit/provider/package/smartos_spec.rb +83 -0
- data/spec/unit/provider/package/solaris_spec.rb +181 -0
- data/spec/unit/provider/package/yum_spec.rb +1856 -0
- data/spec/unit/provider/package/zypper_spec.rb +159 -0
- data/spec/unit/provider/package_spec.rb +427 -0
- data/spec/unit/provider/remote_directory_spec.rb +222 -0
- data/spec/unit/provider/remote_file_spec.rb +288 -0
- data/spec/unit/provider/route_spec.rb +226 -0
- data/spec/unit/provider/ruby_block_spec.rb +38 -0
- data/spec/unit/provider/script_spec.rb +96 -0
- data/spec/unit/provider/service/arch_service_spec.rb +330 -0
- data/spec/unit/provider/service/debian_service_spec.rb +254 -0
- data/spec/unit/provider/service/freebsd_service_spec.rb +379 -0
- data/spec/unit/provider/service/gentoo_service_spec.rb +144 -0
- data/spec/unit/provider/service/init_service_spec.rb +212 -0
- data/spec/unit/provider/service/insserv_service_spec.rb +76 -0
- data/spec/unit/provider/service/invokercd_service_spec.rb +212 -0
- data/spec/unit/provider/service/macosx_spec.rb +229 -0
- data/spec/unit/provider/service/redhat_spec.rb +156 -0
- data/spec/unit/provider/service/simple_service_spec.rb +171 -0
- data/spec/unit/provider/service/solaris_smf_service_spec.rb +140 -0
- data/spec/unit/provider/service/systemd_service_spec.rb +239 -0
- data/spec/unit/provider/service/upstart_service_spec.rb +314 -0
- data/spec/unit/provider/service/windows_spec.rb +235 -0
- data/spec/unit/provider/service_spec.rb +169 -0
- data/spec/unit/provider/subversion_spec.rb +281 -0
- data/spec/unit/provider/template_spec.rb +196 -0
- data/spec/unit/provider/user/dscl_spec.rb +454 -0
- data/spec/unit/provider/user/pw_spec.rb +235 -0
- data/spec/unit/provider/user/solaris_spec.rb +414 -0
- data/spec/unit/provider/user/useradd_spec.rb +386 -0
- data/spec/unit/provider/user/windows_spec.rb +178 -0
- data/spec/unit/provider/user_spec.rb +468 -0
- data/spec/unit/provider_spec.rb +169 -0
- data/spec/unit/recipe_spec.rb +268 -0
- data/spec/unit/resource/apt_package_spec.rb +43 -0
- data/spec/unit/resource/bash_spec.rb +40 -0
- data/spec/unit/resource/breakpoint_spec.rb +43 -0
- data/spec/unit/resource/chef_gem_spec.rb +49 -0
- data/spec/unit/resource/conditional_spec.rb +147 -0
- data/spec/unit/resource/cookbook_file_spec.rb +89 -0
- data/spec/unit/resource/cron_spec.rb +181 -0
- data/spec/unit/resource/csh_spec.rb +40 -0
- data/spec/unit/resource/deploy_revision_spec.rb +47 -0
- data/spec/unit/resource/deploy_spec.rb +259 -0
- data/spec/unit/resource/directory_spec.rb +82 -0
- data/spec/unit/resource/dpkg_package_spec.rb +38 -0
- data/spec/unit/resource/easy_install_package_spec.rb +48 -0
- data/spec/unit/resource/env_spec.rb +85 -0
- data/spec/unit/resource/erl_call_spec.rb +81 -0
- data/spec/unit/resource/execute_spec.rb +124 -0
- data/spec/unit/resource/file_spec.rb +121 -0
- data/spec/unit/resource/freebsd_package_spec.rb +39 -0
- data/spec/unit/resource/gem_package_spec.rb +49 -0
- data/spec/unit/resource/git_spec.rb +46 -0
- data/spec/unit/resource/group_spec.rb +148 -0
- data/spec/unit/resource/http_request_spec.rb +59 -0
- data/spec/unit/resource/ifconfig_spec.rb +46 -0
- data/spec/unit/resource/ips_package_spec.rb +43 -0
- data/spec/unit/resource/link_spec.rb +118 -0
- data/spec/unit/resource/log_spec.rb +70 -0
- data/spec/unit/resource/macports_package_spec.rb +37 -0
- data/spec/unit/resource/mdadm_spec.rb +102 -0
- data/spec/unit/resource/mount_spec.rb +158 -0
- data/spec/unit/resource/ohai_spec.rb +62 -0
- data/spec/unit/resource/package_spec.rb +80 -0
- data/spec/unit/resource/pacman_package_spec.rb +38 -0
- data/spec/unit/resource/perl_spec.rb +40 -0
- data/spec/unit/resource/portage_package_spec.rb +38 -0
- data/spec/unit/resource/python_spec.rb +40 -0
- data/spec/unit/resource/remote_directory_spec.rb +97 -0
- data/spec/unit/resource/remote_file_spec.rb +125 -0
- data/spec/unit/resource/route_spec.rb +107 -0
- data/spec/unit/resource/rpm_package_spec.rb +38 -0
- data/spec/unit/resource/ruby_block_spec.rb +57 -0
- data/spec/unit/resource/ruby_spec.rb +40 -0
- data/spec/unit/resource/scm_spec.rb +159 -0
- data/spec/unit/resource/script_spec.rb +69 -0
- data/spec/unit/resource/service_spec.rb +165 -0
- data/spec/unit/resource/smartos_package_spec.rb +38 -0
- data/spec/unit/resource/subversion_spec.rb +58 -0
- data/spec/unit/resource/template_spec.rb +108 -0
- data/spec/unit/resource/timestamped_deploy_spec.rb +28 -0
- data/spec/unit/resource/user_spec.rb +122 -0
- data/spec/unit/resource/yum_package_spec.rb +85 -0
- data/spec/unit/resource_collection/stepable_iterator_spec.rb +144 -0
- data/spec/unit/resource_collection_spec.rb +257 -0
- data/spec/unit/resource_definition_spec.rb +119 -0
- data/spec/unit/resource_platform_map_spec.rb +164 -0
- data/spec/unit/resource_reporter_spec.rb +591 -0
- data/spec/unit/resource_spec.rb +721 -0
- data/spec/unit/rest/auth_credentials_spec.rb +431 -0
- data/spec/unit/rest_spec.rb +644 -0
- data/spec/unit/role_spec.rb +275 -0
- data/spec/unit/run_context_spec.rb +64 -0
- data/spec/unit/run_list/run_list_expansion_spec.rb +129 -0
- data/spec/unit/run_list/run_list_item_spec.rb +117 -0
- data/spec/unit/run_list/versioned_recipe_list_spec.rb +123 -0
- data/spec/unit/run_list_spec.rb +521 -0
- data/spec/unit/run_status_spec.rb +145 -0
- data/spec/unit/runner_spec.rb +303 -0
- data/spec/unit/scan_access_control_spec.rb +182 -0
- data/spec/unit/search/query_spec.rb +99 -0
- data/spec/unit/shef/model_wrapper_spec.rb +97 -0
- data/spec/unit/shef/shef_ext_spec.rb +153 -0
- data/spec/unit/shef/shef_session_spec.rb +154 -0
- data/spec/unit/shef_spec.rb +161 -0
- data/spec/unit/solr_query/query_transform_spec.rb +454 -0
- data/spec/unit/solr_query/solr_http_request_spec.rb +244 -0
- data/spec/unit/solr_query_spec.rb +203 -0
- data/spec/unit/util/file_edit_spec.rb +135 -0
- data/spec/unit/version_class_spec.rb +172 -0
- data/spec/unit/version_constraint_spec.rb +134 -0
- data/spec/unit/webui_user_spec.rb +238 -0
- data/tasks/rspec.rb +75 -0
- metadata +1548 -0
@@ -0,0 +1,431 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
3
|
+
# Author:: Christopher Brown (<cb@opscode.com>)
|
4
|
+
# Author:: Daniel DeLeo (<dan@opscode.com>)
|
5
|
+
# Copyright:: Copyright (c) 2008 Opscode, Inc.
|
6
|
+
# Copyright:: Copyright (c) 2010 Opscode, Inc.
|
7
|
+
# License:: Apache License, Version 2.0
|
8
|
+
#
|
9
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
10
|
+
# you may not use this file except in compliance with the License.
|
11
|
+
# You may obtain a copy of the License at
|
12
|
+
#
|
13
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
14
|
+
#
|
15
|
+
# Unless required by applicable law or agreed to in writing, software
|
16
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
17
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
18
|
+
# See the License for the specific language governing permissions and
|
19
|
+
# limitations under the License.
|
20
|
+
#
|
21
|
+
|
22
|
+
require 'spec_helper'
|
23
|
+
require 'uri'
|
24
|
+
require 'net/https'
|
25
|
+
|
26
|
+
KEY_DOT_PEM=<<-END_RSA_KEY
|
27
|
+
-----BEGIN RSA PRIVATE KEY-----
|
28
|
+
MIIEpAIBAAKCAQEA49TA0y81ps0zxkOpmf5V4/c4IeR5yVyQFpX3JpxO4TquwnRh
|
29
|
+
8VSUhrw8kkTLmB3cS39Db+3HadvhoqCEbqPE6915kXSuk/cWIcNozujLK7tkuPEy
|
30
|
+
YVsyTioQAddSdfe+8EhQVf3oHxaKmUd6waXrWqYCnhxgOjxocenREYNhZ/OETIei
|
31
|
+
PbOku47vB4nJK/0GhKBytL2XnsRgfKgDxf42BqAi1jglIdeq8lAWZNF9TbNBU21A
|
32
|
+
O1iuT7Pm6LyQujhggPznR5FJhXKRUARXBJZawxpGV4dGtdcahwXNE4601aXPra+x
|
33
|
+
PcRd2puCNoEDBzgVuTSsLYeKBDMSfs173W1QYwIDAQABAoIBAGF05q7vqOGbMaSD
|
34
|
+
2Q7YbuE/JTHKTBZIlBI1QC2x+0P5GDxyEFttNMOVzcs7xmNhkpRw8eX1LrInrpMk
|
35
|
+
WsIBKAFFEfWYlf0RWtRChJjNl+szE9jQxB5FJnWtJH/FHa78tR6PsF24aQyzVcJP
|
36
|
+
g0FGujBihwgfV0JSCNOBkz8MliQihjQA2i8PGGmo4R4RVzGfxYKTIq9vvRq/+QEa
|
37
|
+
Q4lpVLoBqnENpnY/9PTl6JMMjW2b0spbLjOPVwDaIzXJ0dChjNXo15K5SHI5mALJ
|
38
|
+
I5gN7ODGb8PKUf4619ez194FXq+eob5YJdilTFKensIUvt3YhP1ilGMM+Chi5Vi/
|
39
|
+
/RCTw3ECgYEA9jTw4wv9pCswZ9wbzTaBj9yZS3YXspGg26y6Ohq3ZmvHz4jlT6uR
|
40
|
+
xK+DDcUiK4072gci8S4Np0fIVS7q6ivqcOdzXPrTF5/j+MufS32UrBbUTPiM1yoO
|
41
|
+
ECcy+1szl/KoLEV09bghPbvC58PFSXV71evkaTETYnA/F6RK12lEepcCgYEA7OSy
|
42
|
+
bsMrGDVU/MKJtwqyGP9ubA53BorM4Pp9VVVSCrGGVhb9G/XNsjO5wJC8J30QAo4A
|
43
|
+
s59ZzCpyNRy046AB8jwRQuSwEQbejSdeNgQGXhZ7aIVUtuDeFFdaIz/zjVgxsfj4
|
44
|
+
DPOuzieMmJ2MLR4F71ocboxNoDI7xruPSE8dDhUCgYA3vx732cQxgtHwAkeNPJUz
|
45
|
+
dLiE/JU7CnxIoSB9fYUfPLI+THnXgzp7NV5QJN2qzMzLfigsQcg3oyo6F2h7Yzwv
|
46
|
+
GkjlualIRRzCPaCw4Btkp7qkPvbs1QngIHALt8fD1N69P3DPHkTwjG4COjKWgnJq
|
47
|
+
qoHKS6Fe/ZlbigikI6KsuwKBgQCTlSLoyGRHr6oj0hqz01EDK9ciMJzMkZp0Kvn8
|
48
|
+
OKxlBxYW+jlzut4MQBdgNYtS2qInxUoAnaz2+hauqhSzntK3k955GznpUatCqx0R
|
49
|
+
b857vWviwPX2/P6+E3GPdl8IVsKXCvGWOBZWTuNTjQtwbDzsUepWoMgXnlQJSn5I
|
50
|
+
YSlLxQKBgQD16Gw9kajpKlzsPa6XoQeGmZALT6aKWJQlrKtUQIrsIWM0Z6eFtX12
|
51
|
+
2jjHZ0awuCQ4ldqwl8IfRogWMBkHOXjTPVK0YKWWlxMpD/5+bGPARa5fir8O1Zpo
|
52
|
+
Y6S6MeZ69Rp89ma4ttMZ+kwi1+XyHqC/dlcVRW42Zl5Dc7BALRlJjQ==
|
53
|
+
-----END RSA PRIVATE KEY-----
|
54
|
+
END_RSA_KEY
|
55
|
+
|
56
|
+
|
57
|
+
describe Chef::REST::AuthCredentials do
|
58
|
+
before do
|
59
|
+
@key_file_fixture = CHEF_SPEC_DATA + '/ssl/private_key.pem'
|
60
|
+
@auth_credentials = Chef::REST::AuthCredentials.new("client-name", @key_file_fixture)
|
61
|
+
end
|
62
|
+
|
63
|
+
it "has a key file value" do
|
64
|
+
@auth_credentials.key_file.should == @key_file_fixture
|
65
|
+
end
|
66
|
+
|
67
|
+
it "has a client name" do
|
68
|
+
@auth_credentials.client_name.should == "client-name"
|
69
|
+
end
|
70
|
+
|
71
|
+
it "loads the private key when initialized with the path to the key" do
|
72
|
+
@auth_credentials.key.should respond_to(:private_encrypt)
|
73
|
+
@auth_credentials.key.to_s.should == KEY_DOT_PEM
|
74
|
+
end
|
75
|
+
|
76
|
+
describe "when loading the private key" do
|
77
|
+
it "raises PrivateKeyMissing when the key file doesn't exist" do
|
78
|
+
lambda {Chef::REST::AuthCredentials.new("client-name", "/dev/null/nothing_here")}.should raise_error(Chef::Exceptions::PrivateKeyMissing)
|
79
|
+
end
|
80
|
+
|
81
|
+
it "raises InvalidPrivateKey when the key file doesnt' look like a key" do
|
82
|
+
invalid_key_file = CHEF_SPEC_DATA + "/bad-config.rb"
|
83
|
+
lambda {Chef::REST::AuthCredentials.new("client-name", invalid_key_file)}.should raise_error(Chef::Exceptions::InvalidPrivateKey)
|
84
|
+
end
|
85
|
+
|
86
|
+
it "strips extra whitespace before checking the key" do
|
87
|
+
key_file_fixture = CHEF_SPEC_DATA + '/ssl/private_key_with_whitespace.pem'
|
88
|
+
lambda {Chef::REST::AuthCredentials.new("client-name", @key_file_fixture)}.should_not raise_error
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
describe "generating signature headers for a request" do
|
93
|
+
before do
|
94
|
+
@request_time = Time.at(1270920860)
|
95
|
+
@request_params = {:http_method => :POST, :path => "/clients", :body => '{"some":"json"}', :host => "localhost"}
|
96
|
+
end
|
97
|
+
|
98
|
+
it "generates signature headers for the request" do
|
99
|
+
Time.stub!(:now).and_return(@request_time)
|
100
|
+
actual = @auth_credentials.signature_headers(@request_params)
|
101
|
+
actual["HOST"].should == "localhost"
|
102
|
+
actual["X-OPS-AUTHORIZATION-1"].should == "kBssX1ENEwKtNYFrHElN9vYGWS7OeowepN9EsYc9csWfh8oUovryPKDxytQ/"
|
103
|
+
actual["X-OPS-AUTHORIZATION-2"].should == "Wc2/nSSyxdWJjjfHzrE+YrqNQTaArOA7JkAf5p75eTUonCWcvNPjFrZVgKGS"
|
104
|
+
actual["X-OPS-AUTHORIZATION-3"].should == "yhzHJQh+lcVA9wwARg5Hu9q+ddS8xBOdm3Vp5atl5NGHiP0loiigMYvAvzPO"
|
105
|
+
actual["X-OPS-AUTHORIZATION-4"].should == "r9853eIxwYMhn5hLGhAGFQznJbE8+7F/lLU5Zmk2t2MlPY8q3o1Q61YD8QiJ"
|
106
|
+
actual["X-OPS-AUTHORIZATION-5"].should == "M8lIt53ckMyUmSU0DDURoiXLVkE9mag/6Yq2tPNzWq2AdFvBqku9h2w+DY5k"
|
107
|
+
actual["X-OPS-AUTHORIZATION-6"].should == "qA5Rnzw5rPpp3nrWA9jKkPw4Wq3+4ufO2Xs6w7GCjA=="
|
108
|
+
actual["X-OPS-CONTENT-HASH"].should == "1tuzs5XKztM1ANrkGNPah6rW9GY="
|
109
|
+
actual["X-OPS-SIGN"].should =~ %r{(version=1\.0)|(algorithm=sha1;version=1.0;)}
|
110
|
+
actual["X-OPS-TIMESTAMP"].should == "2010-04-10T17:34:20Z"
|
111
|
+
actual["X-OPS-USERID"].should == "client-name"
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
describe "when configured for version 1.1 of the authn protocol" do
|
116
|
+
before do
|
117
|
+
Chef::Config[:authentication_protocol_version] = "1.1"
|
118
|
+
end
|
119
|
+
|
120
|
+
after do
|
121
|
+
Chef::Config[:authentication_protocol_version] = "1.0"
|
122
|
+
end
|
123
|
+
|
124
|
+
it "generates the correct signature for version 1.1" do
|
125
|
+
Time.stub!(:now).and_return(@request_time)
|
126
|
+
actual = @auth_credentials.signature_headers(@request_params)
|
127
|
+
actual["HOST"].should == "localhost"
|
128
|
+
actual["X-OPS-CONTENT-HASH"].should == "1tuzs5XKztM1ANrkGNPah6rW9GY="
|
129
|
+
actual["X-OPS-SIGN"].should == "algorithm=sha1;version=1.1;"
|
130
|
+
actual["X-OPS-TIMESTAMP"].should == "2010-04-10T17:34:20Z"
|
131
|
+
actual["X-OPS-USERID"].should == "client-name"
|
132
|
+
|
133
|
+
# mixlib-authN will test the actual signature stuff for each version of
|
134
|
+
# the protocol so we won't test it again here.
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
describe Chef::REST::RESTRequest do
|
141
|
+
def new_request(method=nil)
|
142
|
+
method ||= :POST
|
143
|
+
Chef::REST::RESTRequest.new(method, @url, @req_body, @headers)
|
144
|
+
end
|
145
|
+
|
146
|
+
before do
|
147
|
+
@auth_credentials = Chef::REST::AuthCredentials.new("client-name", CHEF_SPEC_DATA + '/ssl/private_key.pem')
|
148
|
+
@url = URI.parse("http://chef.example.com:4000/?q=chef_is_awesome")
|
149
|
+
@req_body = '{"json_data":"as_a_string"}'
|
150
|
+
@headers = {"Content-type" =>"application/json", "Accept"=>"application/json", "Accept-Encoding" => Chef::REST::RESTRequest::ENCODING_GZIP_DEFLATE}
|
151
|
+
@request = Chef::REST::RESTRequest.new(:POST, @url, @req_body, @headers)
|
152
|
+
end
|
153
|
+
|
154
|
+
it "stores the url it was created with" do
|
155
|
+
@request.url.should == @url
|
156
|
+
end
|
157
|
+
|
158
|
+
it "stores the HTTP method" do
|
159
|
+
@request.method.should == :POST
|
160
|
+
end
|
161
|
+
|
162
|
+
it "adds the chef version header" do
|
163
|
+
@request.headers.should == @headers.merge("X-Chef-Version" => ::Chef::VERSION)
|
164
|
+
end
|
165
|
+
|
166
|
+
describe "configuring the HTTP request" do
|
167
|
+
it "configures GET requests" do
|
168
|
+
@req_body = nil
|
169
|
+
rest_req = new_request(:GET)
|
170
|
+
rest_req.http_request.should be_a_kind_of(Net::HTTP::Get)
|
171
|
+
rest_req.http_request.path.should == "/?q=chef_is_awesome"
|
172
|
+
rest_req.http_request.body.should be_nil
|
173
|
+
end
|
174
|
+
|
175
|
+
it "configures POST requests, including the body" do
|
176
|
+
@request.http_request.should be_a_kind_of(Net::HTTP::Post)
|
177
|
+
@request.http_request.path.should == "/?q=chef_is_awesome"
|
178
|
+
@request.http_request.body.should == @req_body
|
179
|
+
end
|
180
|
+
|
181
|
+
it "configures PUT requests, including the body" do
|
182
|
+
rest_req = new_request(:PUT)
|
183
|
+
rest_req.http_request.should be_a_kind_of(Net::HTTP::Put)
|
184
|
+
rest_req.http_request.path.should == "/?q=chef_is_awesome"
|
185
|
+
rest_req.http_request.body.should == @req_body
|
186
|
+
end
|
187
|
+
|
188
|
+
it "configures DELETE requests" do
|
189
|
+
rest_req = new_request(:DELETE)
|
190
|
+
rest_req.http_request.should be_a_kind_of(Net::HTTP::Delete)
|
191
|
+
rest_req.http_request.path.should == "/?q=chef_is_awesome"
|
192
|
+
rest_req.http_request.body.should be_nil
|
193
|
+
end
|
194
|
+
|
195
|
+
it "configures HTTP basic auth" do
|
196
|
+
@url = URI.parse("http://homie:theclown@chef.example.com:4000/?q=chef_is_awesome")
|
197
|
+
rest_req = new_request(:GET)
|
198
|
+
rest_req.http_request.to_hash["authorization"].should == ["Basic aG9taWU6dGhlY2xvd24="]
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
describe "configuring the HTTP client" do
|
203
|
+
it "configures the HTTP client for the host and port" do
|
204
|
+
http_client = new_request.http_client
|
205
|
+
http_client.address.should == "chef.example.com"
|
206
|
+
http_client.port.should == 4000
|
207
|
+
end
|
208
|
+
|
209
|
+
it "configures the HTTP client with the read timeout set in the config file" do
|
210
|
+
Chef::Config[:rest_timeout] = 9001
|
211
|
+
new_request.http_client.read_timeout.should == 9001
|
212
|
+
end
|
213
|
+
|
214
|
+
describe "for SSL" do
|
215
|
+
before do
|
216
|
+
Chef::Config[:ssl_client_cert] = nil
|
217
|
+
Chef::Config[:ssl_client_key] = nil
|
218
|
+
Chef::Config[:ssl_ca_path] = nil
|
219
|
+
Chef::Config[:ssl_ca_file] = nil
|
220
|
+
end
|
221
|
+
|
222
|
+
after do
|
223
|
+
Chef::Config[:ssl_client_cert] = nil
|
224
|
+
Chef::Config[:ssl_client_key] = nil
|
225
|
+
Chef::Config[:ssl_ca_path] = nil
|
226
|
+
Chef::Config[:ssl_verify_mode] = :verify_none
|
227
|
+
Chef::Config[:ssl_ca_file] = nil
|
228
|
+
end
|
229
|
+
|
230
|
+
describe "when configured with :ssl_verify_mode set to :verify peer" do
|
231
|
+
before do
|
232
|
+
@url = URI.parse("https://chef.example.com:4443/")
|
233
|
+
Chef::Config[:ssl_verify_mode] = :verify_peer
|
234
|
+
@request = new_request
|
235
|
+
end
|
236
|
+
|
237
|
+
it "configures the HTTP client to use SSL when given a URL with the https protocol" do
|
238
|
+
@request.http_client.use_ssl?.should be_true
|
239
|
+
end
|
240
|
+
|
241
|
+
it "sets the OpenSSL verify mode to verify_peer" do
|
242
|
+
@request.http_client.verify_mode.should == OpenSSL::SSL::VERIFY_PEER
|
243
|
+
end
|
244
|
+
|
245
|
+
it "raises a ConfigurationError if :ssl_ca_path is set to a path that doesn't exist" do
|
246
|
+
Chef::Config[:ssl_ca_path] = "/dev/null/nothing_here"
|
247
|
+
lambda {new_request}.should raise_error(Chef::Exceptions::ConfigurationError)
|
248
|
+
end
|
249
|
+
|
250
|
+
it "should set the CA path if that is set in the configuration" do
|
251
|
+
Chef::Config[:ssl_ca_path] = File.join(CHEF_SPEC_DATA, "ssl")
|
252
|
+
new_request.http_client.ca_path.should == File.join(CHEF_SPEC_DATA, "ssl")
|
253
|
+
end
|
254
|
+
|
255
|
+
it "raises a ConfigurationError if :ssl_ca_file is set to a file that does not exist" do
|
256
|
+
Chef::Config[:ssl_ca_file] = "/dev/null/nothing_here"
|
257
|
+
lambda {new_request}.should raise_error(Chef::Exceptions::ConfigurationError)
|
258
|
+
end
|
259
|
+
|
260
|
+
it "should set the CA file if that is set in the configuration" do
|
261
|
+
Chef::Config[:ssl_ca_file] = CHEF_SPEC_DATA + '/ssl/5e707473.0'
|
262
|
+
new_request.http_client.ca_file.should == CHEF_SPEC_DATA + '/ssl/5e707473.0'
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
266
|
+
describe "when configured with :ssl_verify_mode set to :verify peer" do
|
267
|
+
before do
|
268
|
+
@url = URI.parse("https://chef.example.com:4443/")
|
269
|
+
Chef::Config[:ssl_verify_mode] = :verify_none
|
270
|
+
end
|
271
|
+
|
272
|
+
it "sets the OpenSSL verify mode to :verify_none" do
|
273
|
+
new_request.http_client.verify_mode.should == OpenSSL::SSL::VERIFY_NONE
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
describe "when configured with a client certificate" do
|
278
|
+
before {@url = URI.parse("https://chef.example.com:4443/")}
|
279
|
+
|
280
|
+
it "raises ConfigurationError if the certificate file doesn't exist" do
|
281
|
+
Chef::Config[:ssl_client_cert] = "/dev/null/nothing_here"
|
282
|
+
Chef::Config[:ssl_client_key] = CHEF_SPEC_DATA + '/ssl/chef-rspec.key'
|
283
|
+
lambda {new_request}.should raise_error(Chef::Exceptions::ConfigurationError)
|
284
|
+
end
|
285
|
+
|
286
|
+
it "raises ConfigurationError if the certificate file doesn't exist" do
|
287
|
+
Chef::Config[:ssl_client_cert] = CHEF_SPEC_DATA + '/ssl/chef-rspec.cert'
|
288
|
+
Chef::Config[:ssl_client_key] = "/dev/null/nothing_here"
|
289
|
+
lambda {new_request}.should raise_error(Chef::Exceptions::ConfigurationError)
|
290
|
+
end
|
291
|
+
|
292
|
+
it "raises a ConfigurationError if one of :ssl_client_cert and :ssl_client_key is set but not both" do
|
293
|
+
Chef::Config[:ssl_client_cert] = "/dev/null/nothing_here"
|
294
|
+
Chef::Config[:ssl_client_key] = nil
|
295
|
+
lambda {new_request}.should raise_error(Chef::Exceptions::ConfigurationError)
|
296
|
+
end
|
297
|
+
|
298
|
+
it "configures the HTTP client's cert and private key" do
|
299
|
+
Chef::Config[:ssl_client_cert] = CHEF_SPEC_DATA + '/ssl/chef-rspec.cert'
|
300
|
+
Chef::Config[:ssl_client_key] = CHEF_SPEC_DATA + '/ssl/chef-rspec.key'
|
301
|
+
http_client = new_request.http_client
|
302
|
+
http_client.cert.to_s.should == OpenSSL::X509::Certificate.new(IO.read(CHEF_SPEC_DATA + '/ssl/chef-rspec.cert')).to_s
|
303
|
+
http_client.key.to_s.should == IO.read(CHEF_SPEC_DATA + '/ssl/chef-rspec.key')
|
304
|
+
end
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
308
|
+
describe "for proxy" do
|
309
|
+
before do
|
310
|
+
Chef::Config[:http_proxy] = "http://proxy.example.com:3128"
|
311
|
+
Chef::Config[:https_proxy] = "http://sproxy.example.com:3129"
|
312
|
+
Chef::Config[:http_proxy_user] = nil
|
313
|
+
Chef::Config[:https_proxy_pass] = nil
|
314
|
+
Chef::Config[:https_proxy_user] = nil
|
315
|
+
Chef::Config[:https_proxy_pass] = nil
|
316
|
+
Chef::Config[:no_proxy] = nil
|
317
|
+
end
|
318
|
+
|
319
|
+
after do
|
320
|
+
Chef::Config[:http_proxy] = nil
|
321
|
+
Chef::Config[:https_proxy] = nil
|
322
|
+
Chef::Config[:http_proxy_user] = nil
|
323
|
+
Chef::Config[:https_proxy_pass] = nil
|
324
|
+
Chef::Config[:https_proxy_user] = nil
|
325
|
+
Chef::Config[:https_proxy_pass] = nil
|
326
|
+
Chef::Config[:no_proxy] = nil
|
327
|
+
end
|
328
|
+
|
329
|
+
describe "with :no_proxy nil" do
|
330
|
+
it "configures the proxy address and port when using http scheme" do
|
331
|
+
http_client = new_request.http_client
|
332
|
+
http_client.proxy?.should == true
|
333
|
+
http_client.proxy_address.should == "proxy.example.com"
|
334
|
+
http_client.proxy_port.should == 3128
|
335
|
+
http_client.proxy_user.should be_nil
|
336
|
+
http_client.proxy_pass.should be_nil
|
337
|
+
end
|
338
|
+
|
339
|
+
it "configures the proxy address and port when using https scheme" do
|
340
|
+
@url.scheme = "https"
|
341
|
+
http_client = new_request.http_client
|
342
|
+
http_client.proxy?.should == true
|
343
|
+
http_client.proxy_address.should == "sproxy.example.com"
|
344
|
+
http_client.proxy_port.should == 3129
|
345
|
+
http_client.proxy_user.should be_nil
|
346
|
+
http_client.proxy_pass.should be_nil
|
347
|
+
end
|
348
|
+
end
|
349
|
+
|
350
|
+
describe "with :no_proxy set" do
|
351
|
+
before do
|
352
|
+
Chef::Config[:no_proxy] = "10.*,*.example.com"
|
353
|
+
end
|
354
|
+
|
355
|
+
it "does not configure the proxy address and port when using http scheme" do
|
356
|
+
http_client = new_request.http_client
|
357
|
+
http_client.proxy?.should == false
|
358
|
+
http_client.proxy_address.should be_nil
|
359
|
+
http_client.proxy_port.should be_nil
|
360
|
+
http_client.proxy_user.should be_nil
|
361
|
+
http_client.proxy_pass.should be_nil
|
362
|
+
end
|
363
|
+
|
364
|
+
it "does not configure the proxy address and port when using https scheme" do
|
365
|
+
@url.scheme = "https"
|
366
|
+
http_client = new_request.http_client
|
367
|
+
http_client.proxy?.should == false
|
368
|
+
http_client.proxy_address.should be_nil
|
369
|
+
http_client.proxy_port.should be_nil
|
370
|
+
http_client.proxy_user.should be_nil
|
371
|
+
http_client.proxy_pass.should be_nil
|
372
|
+
end
|
373
|
+
end
|
374
|
+
|
375
|
+
describe "with :http_proxy_user and :http_proxy_pass set" do
|
376
|
+
before do
|
377
|
+
Chef::Config[:http_proxy_user] = "homie"
|
378
|
+
Chef::Config[:http_proxy_pass] = "theclown"
|
379
|
+
end
|
380
|
+
|
381
|
+
after do
|
382
|
+
Chef::Config[:http_proxy_user] = nil
|
383
|
+
Chef::Config[:http_proxy_pass] = nil
|
384
|
+
end
|
385
|
+
|
386
|
+
it "configures the proxy user and pass when using http scheme" do
|
387
|
+
http_client = new_request.http_client
|
388
|
+
http_client.proxy?.should == true
|
389
|
+
http_client.proxy_user.should == "homie"
|
390
|
+
http_client.proxy_pass.should == "theclown"
|
391
|
+
end
|
392
|
+
|
393
|
+
it "does not configure the proxy user and pass when using https scheme" do
|
394
|
+
@url.scheme = "https"
|
395
|
+
http_client = new_request.http_client
|
396
|
+
http_client.proxy?.should == true
|
397
|
+
http_client.proxy_user.should be_nil
|
398
|
+
http_client.proxy_pass.should be_nil
|
399
|
+
end
|
400
|
+
end
|
401
|
+
|
402
|
+
describe "with :https_proxy_user and :https_proxy_pass set" do
|
403
|
+
before do
|
404
|
+
Chef::Config[:https_proxy_user] = "homie"
|
405
|
+
Chef::Config[:https_proxy_pass] = "theclown"
|
406
|
+
end
|
407
|
+
|
408
|
+
after do
|
409
|
+
Chef::Config[:https_proxy_user] = nil
|
410
|
+
Chef::Config[:https_proxy_pass] = nil
|
411
|
+
end
|
412
|
+
|
413
|
+
it "does not configure the proxy user and pass when using http scheme" do
|
414
|
+
http_client = new_request.http_client
|
415
|
+
http_client.proxy?.should == true
|
416
|
+
http_client.proxy_user.should be_nil
|
417
|
+
http_client.proxy_pass.should be_nil
|
418
|
+
end
|
419
|
+
|
420
|
+
it "configures the proxy user and pass when using https scheme" do
|
421
|
+
@url.scheme = "https"
|
422
|
+
http_client = new_request.http_client
|
423
|
+
http_client.proxy?.should == true
|
424
|
+
http_client.proxy_user.should == "homie"
|
425
|
+
http_client.proxy_pass.should == "theclown"
|
426
|
+
end
|
427
|
+
end
|
428
|
+
end
|
429
|
+
end
|
430
|
+
|
431
|
+
end
|
@@ -0,0 +1,644 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
3
|
+
# Author:: Christopher Brown (<cb@opscode.com>)
|
4
|
+
# Author:: Daniel DeLeo (<dan@opscode.com>)
|
5
|
+
# Copyright:: Copyright (c) 2008 Opscode, Inc.
|
6
|
+
# Copyright:: Copyright (c) 2010 Opscode, Inc.
|
7
|
+
# License:: Apache License, Version 2.0
|
8
|
+
#
|
9
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
10
|
+
# you may not use this file except in compliance with the License.
|
11
|
+
# You may obtain a copy of the License at
|
12
|
+
#
|
13
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
14
|
+
#
|
15
|
+
# Unless required by applicable law or agreed to in writing, software
|
16
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
17
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
18
|
+
# See the License for the specific language governing permissions and
|
19
|
+
# limitations under the License.
|
20
|
+
#
|
21
|
+
|
22
|
+
require 'spec_helper'
|
23
|
+
require 'uri'
|
24
|
+
require 'net/https'
|
25
|
+
require 'stringio'
|
26
|
+
|
27
|
+
SIGNING_KEY_DOT_PEM="-----BEGIN RSA PRIVATE KEY-----
|
28
|
+
MIIEpAIBAAKCAQEA49TA0y81ps0zxkOpmf5V4/c4IeR5yVyQFpX3JpxO4TquwnRh
|
29
|
+
8VSUhrw8kkTLmB3cS39Db+3HadvhoqCEbqPE6915kXSuk/cWIcNozujLK7tkuPEy
|
30
|
+
YVsyTioQAddSdfe+8EhQVf3oHxaKmUd6waXrWqYCnhxgOjxocenREYNhZ/OETIei
|
31
|
+
PbOku47vB4nJK/0GhKBytL2XnsRgfKgDxf42BqAi1jglIdeq8lAWZNF9TbNBU21A
|
32
|
+
O1iuT7Pm6LyQujhggPznR5FJhXKRUARXBJZawxpGV4dGtdcahwXNE4601aXPra+x
|
33
|
+
PcRd2puCNoEDBzgVuTSsLYeKBDMSfs173W1QYwIDAQABAoIBAGF05q7vqOGbMaSD
|
34
|
+
2Q7YbuE/JTHKTBZIlBI1QC2x+0P5GDxyEFttNMOVzcs7xmNhkpRw8eX1LrInrpMk
|
35
|
+
WsIBKAFFEfWYlf0RWtRChJjNl+szE9jQxB5FJnWtJH/FHa78tR6PsF24aQyzVcJP
|
36
|
+
g0FGujBihwgfV0JSCNOBkz8MliQihjQA2i8PGGmo4R4RVzGfxYKTIq9vvRq/+QEa
|
37
|
+
Q4lpVLoBqnENpnY/9PTl6JMMjW2b0spbLjOPVwDaIzXJ0dChjNXo15K5SHI5mALJ
|
38
|
+
I5gN7ODGb8PKUf4619ez194FXq+eob5YJdilTFKensIUvt3YhP1ilGMM+Chi5Vi/
|
39
|
+
/RCTw3ECgYEA9jTw4wv9pCswZ9wbzTaBj9yZS3YXspGg26y6Ohq3ZmvHz4jlT6uR
|
40
|
+
xK+DDcUiK4072gci8S4Np0fIVS7q6ivqcOdzXPrTF5/j+MufS32UrBbUTPiM1yoO
|
41
|
+
ECcy+1szl/KoLEV09bghPbvC58PFSXV71evkaTETYnA/F6RK12lEepcCgYEA7OSy
|
42
|
+
bsMrGDVU/MKJtwqyGP9ubA53BorM4Pp9VVVSCrGGVhb9G/XNsjO5wJC8J30QAo4A
|
43
|
+
s59ZzCpyNRy046AB8jwRQuSwEQbejSdeNgQGXhZ7aIVUtuDeFFdaIz/zjVgxsfj4
|
44
|
+
DPOuzieMmJ2MLR4F71ocboxNoDI7xruPSE8dDhUCgYA3vx732cQxgtHwAkeNPJUz
|
45
|
+
dLiE/JU7CnxIoSB9fYUfPLI+THnXgzp7NV5QJN2qzMzLfigsQcg3oyo6F2h7Yzwv
|
46
|
+
GkjlualIRRzCPaCw4Btkp7qkPvbs1QngIHALt8fD1N69P3DPHkTwjG4COjKWgnJq
|
47
|
+
qoHKS6Fe/ZlbigikI6KsuwKBgQCTlSLoyGRHr6oj0hqz01EDK9ciMJzMkZp0Kvn8
|
48
|
+
OKxlBxYW+jlzut4MQBdgNYtS2qInxUoAnaz2+hauqhSzntK3k955GznpUatCqx0R
|
49
|
+
b857vWviwPX2/P6+E3GPdl8IVsKXCvGWOBZWTuNTjQtwbDzsUepWoMgXnlQJSn5I
|
50
|
+
YSlLxQKBgQD16Gw9kajpKlzsPa6XoQeGmZALT6aKWJQlrKtUQIrsIWM0Z6eFtX12
|
51
|
+
2jjHZ0awuCQ4ldqwl8IfRogWMBkHOXjTPVK0YKWWlxMpD/5+bGPARa5fir8O1Zpo
|
52
|
+
Y6S6MeZ69Rp89ma4ttMZ+kwi1+XyHqC/dlcVRW42Zl5Dc7BALRlJjQ==
|
53
|
+
-----END RSA PRIVATE KEY-----"
|
54
|
+
|
55
|
+
describe Chef::REST do
|
56
|
+
before(:each) do
|
57
|
+
@log_stringio = StringIO.new
|
58
|
+
Chef::Log.init(@log_stringio)
|
59
|
+
|
60
|
+
Chef::REST::CookieJar.stub!(:instance).and_return({})
|
61
|
+
@base_url = "http://chef.example.com:4000"
|
62
|
+
@monkey_uri = URI.parse("http://chef.example.com:4000/monkey")
|
63
|
+
@rest = Chef::REST.new(@base_url, nil, nil)
|
64
|
+
|
65
|
+
Chef::REST::CookieJar.instance.clear
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
describe "calling an HTTP verb on a path or absolute URL" do
|
70
|
+
it "adds a relative URL to the base url it was initialized with" do
|
71
|
+
@rest.create_url("foo/bar/baz").should == URI.parse(@base_url + "/foo/bar/baz")
|
72
|
+
end
|
73
|
+
|
74
|
+
it "replaces the base URL when given an absolute URL" do
|
75
|
+
@rest.create_url("http://chef-rulez.example.com:9000").should == URI.parse("http://chef-rulez.example.com:9000")
|
76
|
+
end
|
77
|
+
|
78
|
+
it "makes a :GET request with the composed url object" do
|
79
|
+
@rest.should_receive(:api_request).with(:GET, @monkey_uri, {})
|
80
|
+
@rest.get_rest("monkey")
|
81
|
+
end
|
82
|
+
|
83
|
+
it "makes a :GET reqest for a streaming download with the composed url" do
|
84
|
+
@rest.should_receive(:streaming_request).with(@monkey_uri, {})
|
85
|
+
@rest.get_rest("monkey", true)
|
86
|
+
end
|
87
|
+
|
88
|
+
it "makes a :DELETE request with the composed url object" do
|
89
|
+
@rest.should_receive(:api_request).with(:DELETE, @monkey_uri, {})
|
90
|
+
@rest.delete_rest("monkey")
|
91
|
+
end
|
92
|
+
|
93
|
+
it "makes a :POST request with the composed url object and data" do
|
94
|
+
@rest.should_receive(:api_request).with(:POST, @monkey_uri, {}, "data")
|
95
|
+
@rest.post_rest("monkey", "data")
|
96
|
+
end
|
97
|
+
|
98
|
+
it "makes a :PUT request with the composed url object and data" do
|
99
|
+
@rest.should_receive(:api_request).with(:PUT, @monkey_uri, {}, "data")
|
100
|
+
@rest.put_rest("monkey", "data")
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
describe "when configured to authenticate to the Chef server" do
|
106
|
+
before do
|
107
|
+
@url = URI.parse("http://chef.example.com:4000")
|
108
|
+
Chef::Config[:node_name] = "webmonkey.example.com"
|
109
|
+
Chef::Config[:client_key] = CHEF_SPEC_DATA + "/ssl/private_key.pem"
|
110
|
+
@rest = Chef::REST.new(@url)
|
111
|
+
end
|
112
|
+
|
113
|
+
it "configures itself to use the node_name and client_key in the config by default" do
|
114
|
+
@rest.client_name.should == "webmonkey.example.com"
|
115
|
+
@rest.signing_key_filename.should == CHEF_SPEC_DATA + "/ssl/private_key.pem"
|
116
|
+
end
|
117
|
+
|
118
|
+
it "provides access to the raw key data" do
|
119
|
+
@rest.signing_key.should == SIGNING_KEY_DOT_PEM
|
120
|
+
end
|
121
|
+
|
122
|
+
it "does not error out when initialized without credentials" do
|
123
|
+
@rest = Chef::REST.new(@url, nil, nil) #should_not raise_error hides the bt from you, so screw it.
|
124
|
+
@rest.client_name.should be_nil
|
125
|
+
@rest.signing_key.should be_nil
|
126
|
+
end
|
127
|
+
|
128
|
+
it "indicates that requests should not be signed when it has no credentials" do
|
129
|
+
@rest = Chef::REST.new(@url, nil, nil)
|
130
|
+
@rest.sign_requests?.should be_false
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
134
|
+
|
135
|
+
context "when making REST requests" do
|
136
|
+
before(:each) do
|
137
|
+
Chef::Config[:ssl_client_cert] = nil
|
138
|
+
Chef::Config[:ssl_client_key] = nil
|
139
|
+
@url = URI.parse("https://one:80/?foo=bar")
|
140
|
+
|
141
|
+
@http_response = Net::HTTPSuccess.new("1.1", "200", "successful rest req")
|
142
|
+
@http_response.stub!(:read_body)
|
143
|
+
@http_response.stub!(:body).and_return("ninja")
|
144
|
+
@http_response.add_field("Content-Length", "5")
|
145
|
+
|
146
|
+
@http_client = Net::HTTP.new(@url.host, @url.port)
|
147
|
+
Net::HTTP.stub!(:new).and_return(@http_client)
|
148
|
+
@http_client.stub!(:request).and_yield(@http_response).and_return(@http_response)
|
149
|
+
|
150
|
+
@base_headers = { 'Accept' => 'application/json',
|
151
|
+
'X-Chef-Version' => Chef::VERSION,
|
152
|
+
'Accept-Encoding' => Chef::REST::RESTRequest::ENCODING_GZIP_DEFLATE}
|
153
|
+
@req_with_body_headers = @base_headers.merge("Content-Type" => "application/json", "Content-Length" => '13')
|
154
|
+
end
|
155
|
+
|
156
|
+
describe "using the run_request API" do
|
157
|
+
it "should build a new HTTP GET request" do
|
158
|
+
request = Net::HTTP::Get.new(@url.path)
|
159
|
+
Net::HTTP::Get.should_receive(:new).with("/?foo=bar", @base_headers).and_return(request)
|
160
|
+
@rest.run_request(:GET, @url, {})
|
161
|
+
end
|
162
|
+
|
163
|
+
it "should build a new HTTP POST request" do
|
164
|
+
request = Net::HTTP::Post.new(@url.path)
|
165
|
+
|
166
|
+
Net::HTTP::Post.should_receive(:new).with("/?foo=bar", @req_with_body_headers).and_return(request)
|
167
|
+
@rest.run_request(:POST, @url, {}, {:one=>:two})
|
168
|
+
request.body.should == '{"one":"two"}'
|
169
|
+
end
|
170
|
+
|
171
|
+
it "should build a new HTTP PUT request" do
|
172
|
+
request = Net::HTTP::Put.new(@url.path)
|
173
|
+
expected_headers = @base_headers.merge("Content-Length" => '13')
|
174
|
+
Net::HTTP::Put.should_receive(:new).with("/?foo=bar", @req_with_body_headers).and_return(request)
|
175
|
+
@rest.run_request(:PUT, @url, {}, {:one=>:two})
|
176
|
+
request.body.should == '{"one":"two"}'
|
177
|
+
end
|
178
|
+
|
179
|
+
it "should build a new HTTP DELETE request" do
|
180
|
+
request = Net::HTTP::Delete.new(@url.path)
|
181
|
+
Net::HTTP::Delete.should_receive(:new).with("/?foo=bar", @base_headers).and_return(request)
|
182
|
+
@rest.run_request(:DELETE, @url)
|
183
|
+
end
|
184
|
+
|
185
|
+
it "should raise an error if the method is not GET/PUT/POST/DELETE" do
|
186
|
+
lambda { @rest.api_request(:MONKEY, @url) }.should raise_error(ArgumentError)
|
187
|
+
end
|
188
|
+
|
189
|
+
it "returns the response body when the response is successful but content-type is not JSON" do
|
190
|
+
@rest.run_request(:GET, @url).should == "ninja"
|
191
|
+
end
|
192
|
+
|
193
|
+
it "should call read_body without a block if the request is not raw" do
|
194
|
+
@http_response.should_receive(:body)
|
195
|
+
@rest.run_request(:GET, @url, {}, nil, false)
|
196
|
+
end
|
197
|
+
|
198
|
+
it "should inflate the body as to an object if JSON is returned" do
|
199
|
+
@http_response.add_field("content-type", "application/json")
|
200
|
+
Chef::JSONCompat.should_receive(:from_json).with("ninja").and_return("ohai2u_success")
|
201
|
+
@rest.run_request(:GET, @url, {}).should == "ohai2u_success"
|
202
|
+
end
|
203
|
+
|
204
|
+
it "should return false on a Not Modified response" do
|
205
|
+
http_response = Net::HTTPNotModified.new("1.1", "304", "It's old Bob")
|
206
|
+
@http_client.stub!(:request).and_yield(http_response).and_return(http_response)
|
207
|
+
http_response.stub!(:read_body)
|
208
|
+
@rest.run_request(:GET, @url).should be_false
|
209
|
+
end
|
210
|
+
|
211
|
+
%w[ HTTPFound HTTPMovedPermanently HTTPSeeOther HTTPUseProxy HTTPTemporaryRedirect HTTPMultipleChoice ].each do |resp_name|
|
212
|
+
it "should call run_request again on a #{resp_name} response" do
|
213
|
+
resp_cls = Net.const_get(resp_name)
|
214
|
+
resp_code = Net::HTTPResponse::CODE_TO_OBJ.keys.detect { |k| Net::HTTPResponse::CODE_TO_OBJ[k] == resp_cls }
|
215
|
+
http_response = resp_cls.new("1.1", resp_code, "bob somewhere else")
|
216
|
+
http_response.add_field("location", @url.path)
|
217
|
+
http_response.stub!(:read_body)
|
218
|
+
|
219
|
+
@http_client.stub!(:request).and_yield(http_response).and_return(http_response)
|
220
|
+
lambda { @rest.run_request(:GET, @url) }.should raise_error(Chef::Exceptions::RedirectLimitExceeded)
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
# CHEF-3140
|
225
|
+
context "when configured to disable compression" do
|
226
|
+
before do
|
227
|
+
@rest = Chef::REST.new(@base_url, nil, nil, :disable_gzip => true)
|
228
|
+
end
|
229
|
+
|
230
|
+
it "does not accept encoding gzip" do
|
231
|
+
@rest.send(:build_headers, :GET, @url, {}).should_not have_key("Accept-Encoding")
|
232
|
+
end
|
233
|
+
|
234
|
+
it "does not decompress a response encoded as gzip" do
|
235
|
+
@http_response.add_field("content-encoding", "gzip")
|
236
|
+
request = Net::HTTP::Get.new(@url.path)
|
237
|
+
Net::HTTP::Get.should_receive(:new).and_return(request)
|
238
|
+
# will raise a Zlib error if incorrect
|
239
|
+
@rest.api_request(:GET, @url, {}).should == "ninja"
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
it "should show the JSON error message on an unsuccessful request" do
|
244
|
+
http_response = Net::HTTPServerError.new("1.1", "500", "drooling from inside of mouth")
|
245
|
+
http_response.add_field("content-type", "application/json")
|
246
|
+
http_response.stub!(:body).and_return('{ "error":[ "Ears get sore!", "Not even four" ] }')
|
247
|
+
http_response.stub!(:read_body)
|
248
|
+
@http_client.stub!(:request).and_yield(http_response).and_return(http_response)
|
249
|
+
@rest.stub!(:sleep)
|
250
|
+
lambda {@rest.run_request(:GET, @url)}.should raise_error(Net::HTTPFatalError)
|
251
|
+
@log_stringio.string.should match(Regexp.escape('WARN: HTTP Request Returned 500 drooling from inside of mouth: Ears get sore!, Not even four'))
|
252
|
+
end
|
253
|
+
|
254
|
+
it "should raise an exception on an unsuccessful request" do
|
255
|
+
@http_response = Net::HTTPServerError.new("1.1", "500", "drooling from inside of mouth")
|
256
|
+
http_response = Net::HTTPServerError.new("1.1", "500", "drooling from inside of mouth")
|
257
|
+
http_response.stub!(:read_body)
|
258
|
+
@rest.stub!(:sleep)
|
259
|
+
@http_client.stub!(:request).and_yield(http_response).and_return(http_response)
|
260
|
+
lambda {@rest.run_request(:GET, @url)}.should raise_error(Net::HTTPFatalError)
|
261
|
+
end
|
262
|
+
|
263
|
+
it "adds the rest_request object to any http exception raised" do
|
264
|
+
@http_response = Net::HTTPServerError.new("1.1", "500", "drooling from inside of mouth")
|
265
|
+
http_response = Net::HTTPServerError.new("1.1", "500", "drooling from inside of mouth")
|
266
|
+
http_response.stub!(:read_body)
|
267
|
+
@rest.stub!(:sleep)
|
268
|
+
@http_client.stub!(:request).and_yield(http_response).and_return(http_response)
|
269
|
+
exception = begin
|
270
|
+
@rest.api_request(:GET, @url, {})
|
271
|
+
rescue => e
|
272
|
+
e
|
273
|
+
end
|
274
|
+
|
275
|
+
e.chef_rest_request.url.should == @url
|
276
|
+
e.chef_rest_request.method.should == :GET
|
277
|
+
end
|
278
|
+
|
279
|
+
describe "streaming downloads to a tempfile" do
|
280
|
+
before do
|
281
|
+
@tempfile = Tempfile.open("chef-rspec-rest_spec-line-#{__LINE__}--")
|
282
|
+
Tempfile.stub!(:new).with("chef-rest").and_return(@tempfile)
|
283
|
+
Tempfile.stub!(:open).and_return(@tempfile)
|
284
|
+
|
285
|
+
@request_mock = {}
|
286
|
+
Net::HTTP::Get.stub!(:new).and_return(@request_mock)
|
287
|
+
|
288
|
+
@http_response_mock = mock("Net::HTTP Response mock")
|
289
|
+
end
|
290
|
+
|
291
|
+
after do
|
292
|
+
@tempfile.rspec_reset
|
293
|
+
@tempfile.close!
|
294
|
+
end
|
295
|
+
|
296
|
+
it "should build a new HTTP GET request without the application/json accept header" do
|
297
|
+
expected_headers = {'X-Chef-Version' => Chef::VERSION, 'Accept-Encoding' => Chef::REST::RESTRequest::ENCODING_GZIP_DEFLATE}
|
298
|
+
Net::HTTP::Get.should_receive(:new).with("/?foo=bar", expected_headers).and_return(@request_mock)
|
299
|
+
@rest.run_request(:GET, @url, {}, false, nil, true)
|
300
|
+
end
|
301
|
+
|
302
|
+
it "should create a tempfile for the output of a raw request" do
|
303
|
+
@rest.run_request(:GET, @url, {}, false, nil, true).should equal(@tempfile)
|
304
|
+
end
|
305
|
+
|
306
|
+
it "should read the body of the response in chunks on a raw request" do
|
307
|
+
@http_response.should_receive(:read_body).and_return(true)
|
308
|
+
@rest.run_request(:GET, @url, {}, false, nil, true)
|
309
|
+
end
|
310
|
+
|
311
|
+
it "should populate the tempfile with the value of the raw request" do
|
312
|
+
@http_response_mock.stub!(:read_body).and_yield("ninja")
|
313
|
+
@tempfile.should_receive(:write).with("ninja").once.and_return(true)
|
314
|
+
@rest.run_request(:GET, @url, {}, false, nil, true)
|
315
|
+
end
|
316
|
+
|
317
|
+
it "should close the tempfile if we're doing a raw request" do
|
318
|
+
@tempfile.should_receive(:close).once.and_return(true)
|
319
|
+
@rest.run_request(:GET, @url, {}, false, nil, true)
|
320
|
+
end
|
321
|
+
|
322
|
+
it "should not raise a divide by zero exception if the size is 0" do
|
323
|
+
@http_response_mock.stub!(:header).and_return({ 'Content-Length' => "5" })
|
324
|
+
@http_response_mock.stub!(:read_body).and_yield('')
|
325
|
+
lambda { @rest.run_request(:GET, @url, {}, false, nil, true) }.should_not raise_error(ZeroDivisionError)
|
326
|
+
end
|
327
|
+
|
328
|
+
it "should not raise a divide by zero exception if the Content-Length is 0" do
|
329
|
+
@http_response_mock.stub!(:header).and_return({ 'Content-Length' => "0" })
|
330
|
+
@http_response_mock.stub!(:read_body).and_yield("ninja")
|
331
|
+
lambda { @rest.run_request(:GET, @url, {}, false, nil, true) }.should_not raise_error(ZeroDivisionError)
|
332
|
+
end
|
333
|
+
|
334
|
+
end
|
335
|
+
|
336
|
+
end
|
337
|
+
|
338
|
+
describe "as JSON API requests" do
|
339
|
+
before do
|
340
|
+
@request_mock = {}
|
341
|
+
Net::HTTP::Get.stub!(:new).and_return(@request_mock)
|
342
|
+
|
343
|
+
@base_headers = {"Accept" => "application/json",
|
344
|
+
"X-Chef-Version" => Chef::VERSION,
|
345
|
+
"Accept-Encoding" => Chef::REST::RESTRequest::ENCODING_GZIP_DEFLATE
|
346
|
+
}
|
347
|
+
end
|
348
|
+
|
349
|
+
it "should always include the X-Chef-Version header" do
|
350
|
+
Net::HTTP::Get.should_receive(:new).with("/?foo=bar", @base_headers).and_return(@request_mock)
|
351
|
+
@rest.api_request(:GET, @url, {})
|
352
|
+
end
|
353
|
+
|
354
|
+
it "sets the user agent to chef-client" do
|
355
|
+
# must reset to default b/c knife changes the UA
|
356
|
+
Chef::REST::RESTRequest.user_agent = Chef::REST::RESTRequest::DEFAULT_UA
|
357
|
+
@rest.api_request(:GET, @url, {})
|
358
|
+
@request_mock['User-Agent'].should match /^Chef Client\/#{Chef::VERSION}/
|
359
|
+
end
|
360
|
+
|
361
|
+
context "when configured with custom http headers" do
|
362
|
+
before(:each) do
|
363
|
+
@custom_headers = {
|
364
|
+
'X-Custom-ChefSecret' => 'sharpknives',
|
365
|
+
'X-Custom-RequestPriority' => 'extremely low'
|
366
|
+
}
|
367
|
+
Chef::Config[:custom_http_headers] = @custom_headers
|
368
|
+
end
|
369
|
+
|
370
|
+
after(:each) do
|
371
|
+
Chef::Config[:custom_http_headers] = nil
|
372
|
+
end
|
373
|
+
|
374
|
+
it "should set them on the http request" do
|
375
|
+
url_string = an_instance_of(String)
|
376
|
+
header_hash = hash_including(@custom_headers)
|
377
|
+
Net::HTTP::Get.should_receive(:new).with(url_string, header_hash)
|
378
|
+
@rest.api_request(:GET, @url, {})
|
379
|
+
end
|
380
|
+
end
|
381
|
+
|
382
|
+
it "should set the cookie for this request if one exists for the given host:port" do
|
383
|
+
Chef::REST::CookieJar.instance["#{@url.host}:#{@url.port}"] = "cookie monster"
|
384
|
+
Net::HTTP::Get.should_receive(:new).with("/?foo=bar", @base_headers.merge('Cookie' => "cookie monster")).and_return(@request_mock)
|
385
|
+
@rest.api_request(:GET, @url, {})
|
386
|
+
end
|
387
|
+
|
388
|
+
it "should build a new HTTP GET request" do
|
389
|
+
Net::HTTP::Get.should_receive(:new).with("/?foo=bar", @base_headers).and_return(@request_mock)
|
390
|
+
@rest.api_request(:GET, @url, {})
|
391
|
+
end
|
392
|
+
|
393
|
+
it "should build a new HTTP POST request" do
|
394
|
+
request = Net::HTTP::Post.new(@url.path)
|
395
|
+
expected_headers = @base_headers.merge("Content-Type" => 'application/json', 'Content-Length' => '13')
|
396
|
+
|
397
|
+
Net::HTTP::Post.should_receive(:new).with("/?foo=bar", expected_headers).and_return(request)
|
398
|
+
@rest.api_request(:POST, @url, {}, {:one=>:two})
|
399
|
+
request.body.should == '{"one":"two"}'
|
400
|
+
end
|
401
|
+
|
402
|
+
it "should build a new HTTP PUT request" do
|
403
|
+
request = Net::HTTP::Put.new(@url.path)
|
404
|
+
expected_headers = @base_headers.merge("Content-Type" => 'application/json', 'Content-Length' => '13')
|
405
|
+
Net::HTTP::Put.should_receive(:new).with("/?foo=bar",expected_headers).and_return(request)
|
406
|
+
@rest.api_request(:PUT, @url, {}, {:one=>:two})
|
407
|
+
request.body.should == '{"one":"two"}'
|
408
|
+
end
|
409
|
+
|
410
|
+
it "should build a new HTTP DELETE request" do
|
411
|
+
Net::HTTP::Delete.should_receive(:new).with("/?foo=bar", @base_headers).and_return(@request_mock)
|
412
|
+
@rest.api_request(:DELETE, @url)
|
413
|
+
end
|
414
|
+
|
415
|
+
it "should raise an error if the method is not GET/PUT/POST/DELETE" do
|
416
|
+
lambda { @rest.api_request(:MONKEY, @url) }.should raise_error(ArgumentError)
|
417
|
+
end
|
418
|
+
|
419
|
+
it "returns nil when the response is successful but content-type is not JSON" do
|
420
|
+
@rest.api_request(:GET, @url).should == "ninja"
|
421
|
+
end
|
422
|
+
|
423
|
+
it "should inflate the body as to an object if JSON is returned" do
|
424
|
+
@http_response.add_field('content-type', "application/json")
|
425
|
+
@http_response.stub!(:body).and_return('{"ohai2u":"json_api"}')
|
426
|
+
@rest.api_request(:GET, @url, {}).should == {"ohai2u"=>"json_api"}
|
427
|
+
end
|
428
|
+
|
429
|
+
%w[ HTTPFound HTTPMovedPermanently HTTPSeeOther HTTPUseProxy HTTPTemporaryRedirect HTTPMultipleChoice ].each do |resp_name|
|
430
|
+
it "should call api_request again on a #{resp_name} response" do
|
431
|
+
resp_cls = Net.const_get(resp_name)
|
432
|
+
resp_code = Net::HTTPResponse::CODE_TO_OBJ.keys.detect { |k| Net::HTTPResponse::CODE_TO_OBJ[k] == resp_cls }
|
433
|
+
http_response = Net::HTTPFound.new("1.1", resp_code, "bob is somewhere else again")
|
434
|
+
http_response.add_field("location", @url.path)
|
435
|
+
http_response.stub!(:read_body)
|
436
|
+
|
437
|
+
@http_client.stub!(:request).and_yield(http_response).and_return(http_response)
|
438
|
+
|
439
|
+
lambda { @rest.api_request(:GET, @url) }.should raise_error(Chef::Exceptions::RedirectLimitExceeded)
|
440
|
+
end
|
441
|
+
end
|
442
|
+
|
443
|
+
it "should show the JSON error message on an unsuccessful request" do
|
444
|
+
http_response = Net::HTTPServerError.new("1.1", "500", "drooling from inside of mouth")
|
445
|
+
http_response.add_field("content-type", "application/json")
|
446
|
+
http_response.stub!(:body).and_return('{ "error":[ "Ears get sore!", "Not even four" ] }')
|
447
|
+
http_response.stub!(:read_body)
|
448
|
+
@rest.stub!(:sleep)
|
449
|
+
@http_client.stub!(:request).and_yield(http_response).and_return(http_response)
|
450
|
+
|
451
|
+
lambda {@rest.run_request(:GET, @url)}.should raise_error(Net::HTTPFatalError)
|
452
|
+
@log_stringio.string.should match(Regexp.escape('WARN: HTTP Request Returned 500 drooling from inside of mouth: Ears get sore!, Not even four'))
|
453
|
+
end
|
454
|
+
|
455
|
+
it "decompresses the JSON error message on an unsuccessful request" do
|
456
|
+
http_response = Net::HTTPServerError.new("1.1", "500", "drooling from inside of mouth")
|
457
|
+
http_response.add_field("content-type", "application/json")
|
458
|
+
http_response.add_field("content-encoding", "deflate")
|
459
|
+
unzipped_body = '{ "error":[ "Ears get sore!", "Not even four" ] }'
|
460
|
+
gzipped_body = Zlib::Deflate.deflate(unzipped_body, 1)
|
461
|
+
http_response.stub!(:body).and_return gzipped_body
|
462
|
+
http_response.stub!(:read_body)
|
463
|
+
@rest.stub!(:sleep)
|
464
|
+
@http_client.stub!(:request).and_yield(http_response).and_return(http_response)
|
465
|
+
|
466
|
+
lambda {@rest.run_request(:GET, @url)}.should raise_error(Net::HTTPFatalError)
|
467
|
+
@log_stringio.string.should match(Regexp.escape('WARN: HTTP Request Returned 500 drooling from inside of mouth: Ears get sore!, Not even four'))
|
468
|
+
end
|
469
|
+
|
470
|
+
it "should raise an exception on an unsuccessful request" do
|
471
|
+
http_response = Net::HTTPServerError.new("1.1", "500", "drooling from inside of mouth")
|
472
|
+
http_response.stub!(:body)
|
473
|
+
http_response.stub!(:read_body)
|
474
|
+
@rest.stub!(:sleep)
|
475
|
+
@http_client.stub!(:request).and_yield(http_response).and_return(http_response)
|
476
|
+
lambda {@rest.api_request(:GET, @url)}.should raise_error(Net::HTTPFatalError)
|
477
|
+
end
|
478
|
+
end
|
479
|
+
|
480
|
+
context "when streaming downloads to a tempfile" do
|
481
|
+
before do
|
482
|
+
@tempfile = Tempfile.open("chef-rspec-rest_spec-line-#{__LINE__}--")
|
483
|
+
Tempfile.stub!(:new).with("chef-rest").and_return(@tempfile)
|
484
|
+
@request_mock = {}
|
485
|
+
Net::HTTP::Get.stub!(:new).and_return(@request_mock)
|
486
|
+
|
487
|
+
@http_response = Net::HTTPSuccess.new("1.1",200, "it-works")
|
488
|
+
@http_response.stub!(:read_body)
|
489
|
+
@http_client.stub!(:request).and_yield(@http_response).and_return(@http_response)
|
490
|
+
end
|
491
|
+
|
492
|
+
after do
|
493
|
+
@tempfile.rspec_reset
|
494
|
+
@tempfile.close!
|
495
|
+
end
|
496
|
+
|
497
|
+
it " build a new HTTP GET request without the application/json accept header" do
|
498
|
+
expected_headers = {'X-Chef-Version' => Chef::VERSION, 'Accept-Encoding' => Chef::REST::RESTRequest::ENCODING_GZIP_DEFLATE}
|
499
|
+
Net::HTTP::Get.should_receive(:new).with("/?foo=bar", expected_headers).and_return(@request_mock)
|
500
|
+
@rest.streaming_request(@url, {})
|
501
|
+
end
|
502
|
+
|
503
|
+
it "returns a tempfile containing the streamed response body" do
|
504
|
+
@rest.streaming_request(@url, {}).should equal(@tempfile)
|
505
|
+
end
|
506
|
+
|
507
|
+
it "writes the response body to a tempfile" do
|
508
|
+
@http_response.stub!(:read_body).and_yield("real").and_yield("ultimate").and_yield("power")
|
509
|
+
@rest.streaming_request(@url, {})
|
510
|
+
IO.read(@tempfile.path).chomp.should == "realultimatepower"
|
511
|
+
end
|
512
|
+
|
513
|
+
it "closes the tempfile" do
|
514
|
+
@rest.streaming_request(@url, {})
|
515
|
+
@tempfile.should be_closed
|
516
|
+
end
|
517
|
+
|
518
|
+
it "yields the tempfile containing the streamed response body and then unlinks it when given a block" do
|
519
|
+
@http_response.stub!(:read_body).and_yield("real").and_yield("ultimate").and_yield("power")
|
520
|
+
tempfile_path = nil
|
521
|
+
@rest.streaming_request(@url, {}) do |tempfile|
|
522
|
+
tempfile_path = tempfile.path
|
523
|
+
File.exist?(tempfile.path).should be_true
|
524
|
+
IO.read(@tempfile.path).chomp.should == "realultimatepower"
|
525
|
+
end
|
526
|
+
File.exist?(tempfile_path).should be_false
|
527
|
+
end
|
528
|
+
|
529
|
+
it "does not raise a divide by zero exception if the content's actual size is 0" do
|
530
|
+
@http_response.add_field('Content-Length', "5")
|
531
|
+
@http_response.stub!(:read_body).and_yield('')
|
532
|
+
lambda { @rest.streaming_request(@url, {}) }.should_not raise_error(ZeroDivisionError)
|
533
|
+
end
|
534
|
+
|
535
|
+
it "does not raise a divide by zero exception when the Content-Length is 0" do
|
536
|
+
@http_response.add_field('Content-Length', "0")
|
537
|
+
@http_response.stub!(:read_body).and_yield("ninja")
|
538
|
+
lambda { @rest.streaming_request(@url, {}) }.should_not raise_error(ZeroDivisionError)
|
539
|
+
end
|
540
|
+
|
541
|
+
it "fetches a file and yields the tempfile it is streamed to" do
|
542
|
+
@http_response.stub!(:read_body).and_yield("real").and_yield("ultimate").and_yield("power")
|
543
|
+
tempfile_path = nil
|
544
|
+
@rest.fetch("cookbooks/a_cookbook") do |tempfile|
|
545
|
+
tempfile_path = tempfile.path
|
546
|
+
IO.read(@tempfile.path).chomp.should == "realultimatepower"
|
547
|
+
end
|
548
|
+
File.exist?(tempfile_path).should be_false
|
549
|
+
end
|
550
|
+
|
551
|
+
it "closes and unlinks the tempfile if there is an error while streaming the content to the tempfile" do
|
552
|
+
path = @tempfile.path
|
553
|
+
path.should_not be_nil
|
554
|
+
@tempfile.stub!(:write).and_raise(IOError)
|
555
|
+
@rest.fetch("cookbooks/a_cookbook") {|tmpfile| "shouldn't get here"}
|
556
|
+
File.exists?(path).should be_false
|
557
|
+
end
|
558
|
+
|
559
|
+
it "closes and unlinks the tempfile when the response is a redirect" do
|
560
|
+
Tempfile.rspec_reset
|
561
|
+
tempfile = mock("die", :path => "/tmp/ragefist", :close => true, :binmode => nil)
|
562
|
+
tempfile.should_receive(:close!).at_least(2).times
|
563
|
+
Tempfile.stub!(:new).with("chef-rest").and_return(tempfile)
|
564
|
+
|
565
|
+
http_response = Net::HTTPFound.new("1.1", "302", "bob is taking care of that one for me today")
|
566
|
+
http_response.add_field("location", @url.path)
|
567
|
+
http_response.stub!(:read_body)
|
568
|
+
|
569
|
+
@http_client.stub!(:request).and_yield(http_response).and_yield(@http_response).and_return(http_response, @http_response)
|
570
|
+
@rest.fetch("cookbooks/a_cookbook") {|tmpfile| "shouldn't get here"}
|
571
|
+
end
|
572
|
+
|
573
|
+
it "passes the original block to the redirected request" do
|
574
|
+
Tempfile.rspec_reset
|
575
|
+
|
576
|
+
http_response = Net::HTTPFound.new("1.1", "302", "bob is taking care of that one for me today")
|
577
|
+
http_response.add_field("location","/that-thing-is-here-now")
|
578
|
+
http_response.stub!(:read_body)
|
579
|
+
|
580
|
+
block_called = false
|
581
|
+
@http_client.stub!(:request).and_yield(@http_response).and_return(http_response, @http_response)
|
582
|
+
@rest.fetch("cookbooks/a_cookbook") do |tmpfile|
|
583
|
+
block_called = true
|
584
|
+
end
|
585
|
+
block_called.should be_true
|
586
|
+
end
|
587
|
+
end
|
588
|
+
end
|
589
|
+
|
590
|
+
context "when following redirects" do
|
591
|
+
before do
|
592
|
+
Chef::Config[:node_name] = "webmonkey.example.com"
|
593
|
+
Chef::Config[:client_key] = CHEF_SPEC_DATA + "/ssl/private_key.pem"
|
594
|
+
@rest = Chef::REST.new(@url)
|
595
|
+
end
|
596
|
+
|
597
|
+
it "raises a RedirectLimitExceeded when redirected more than 10 times" do
|
598
|
+
redirected = lambda {@rest.follow_redirect { redirected.call }}
|
599
|
+
lambda {redirected.call}.should raise_error(Chef::Exceptions::RedirectLimitExceeded)
|
600
|
+
end
|
601
|
+
|
602
|
+
it "does not count redirects from previous calls against the redirect limit" do
|
603
|
+
total_redirects = 0
|
604
|
+
redirected = lambda do
|
605
|
+
@rest.follow_redirect do
|
606
|
+
total_redirects += 1
|
607
|
+
redirected.call unless total_redirects >= 9
|
608
|
+
end
|
609
|
+
end
|
610
|
+
lambda {redirected.call}.should_not raise_error(Chef::Exceptions::RedirectLimitExceeded)
|
611
|
+
total_redirects = 0
|
612
|
+
lambda {redirected.call}.should_not raise_error(Chef::Exceptions::RedirectLimitExceeded)
|
613
|
+
end
|
614
|
+
|
615
|
+
it "does not sign the redirected request when sign_on_redirect is false" do
|
616
|
+
@rest.sign_on_redirect = false
|
617
|
+
@rest.follow_redirect { @rest.sign_requests?.should be_false }
|
618
|
+
end
|
619
|
+
|
620
|
+
it "resets sign_requests to the original value after following an unsigned redirect" do
|
621
|
+
@rest.sign_on_redirect = false
|
622
|
+
@rest.sign_requests?.should be_true
|
623
|
+
|
624
|
+
@rest.follow_redirect { @rest.sign_requests?.should be_false }
|
625
|
+
@rest.sign_requests?.should be_true
|
626
|
+
end
|
627
|
+
|
628
|
+
it "configures the redirect limit" do
|
629
|
+
total_redirects = 0
|
630
|
+
redirected = lambda do
|
631
|
+
@rest.follow_redirect do
|
632
|
+
total_redirects += 1
|
633
|
+
redirected.call unless total_redirects >= 9
|
634
|
+
end
|
635
|
+
end
|
636
|
+
lambda {redirected.call}.should_not raise_error(Chef::Exceptions::RedirectLimitExceeded)
|
637
|
+
|
638
|
+
total_redirects = 0
|
639
|
+
@rest.redirect_limit = 3
|
640
|
+
lambda {redirected.call}.should raise_error(Chef::Exceptions::RedirectLimitExceeded)
|
641
|
+
end
|
642
|
+
|
643
|
+
end
|
644
|
+
end
|