tylerrick-chef 0.10.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +201 -0
- data/README.rdoc +171 -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 +76 -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 +146 -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 +191 -0
- data/distro/common/html/chef-solr.8.html +165 -0
- data/distro/common/html/knife-bootstrap.1.html +243 -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 +384 -0
- data/distro/common/html/knife-data-bag.1.html +234 -0
- data/distro/common/html/knife-environment.1.html +267 -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 +157 -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 +321 -0
- data/distro/common/html/shef.1.html +283 -0
- data/distro/common/man/man1/knife-bootstrap.1 +197 -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 +345 -0
- data/distro/common/man/man1/knife-data-bag.1 +130 -0
- data/distro/common/man/man1/knife-environment.1 +178 -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 +83 -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 +292 -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 +158 -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 +142 -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 +117 -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 +72 -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 +220 -0
- data/distro/common/markdown/man1/shef.mkd +189 -0
- data/distro/common/markdown/man8/chef-client.mkd +75 -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 +4 -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 +185 -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 +110 -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/lib/chef.rb +41 -0
- data/lib/chef/api_client.rb +271 -0
- data/lib/chef/application.rb +152 -0
- data/lib/chef/application/agent.rb +18 -0
- data/lib/chef/application/client.rb +285 -0
- data/lib/chef/application/knife.rb +188 -0
- data/lib/chef/application/solo.rb +218 -0
- data/lib/chef/applications.rb +4 -0
- data/lib/chef/certificate.rb +194 -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 +189 -0
- data/lib/chef/client.rb +366 -0
- data/lib/chef/config.rb +248 -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 +173 -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 +88 -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 +154 -0
- data/lib/chef/cookbook_version.rb +1096 -0
- data/lib/chef/cookbook_version_selector.rb +168 -0
- data/lib/chef/couchdb.rb +246 -0
- data/lib/chef/daemon.rb +172 -0
- data/lib/chef/data_bag.rb +235 -0
- data/lib/chef/data_bag_item.rb +273 -0
- data/lib/chef/encrypted_data_bag_item.rb +139 -0
- data/lib/chef/environment.rb +455 -0
- data/lib/chef/exceptions.rb +154 -0
- data/lib/chef/file_access_control.rb +144 -0
- data/lib/chef/file_cache.rb +218 -0
- data/lib/chef/handler.rb +227 -0
- data/lib/chef/handler/error_report.rb +33 -0
- data/lib/chef/handler/json_file.rb +58 -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 +52 -0
- data/lib/chef/knife.rb +520 -0
- data/lib/chef/knife/bootstrap.rb +207 -0
- data/lib/chef/knife/bootstrap/archlinux-gems.erb +60 -0
- data/lib/chef/knife/bootstrap/centos5-gems.erb +56 -0
- data/lib/chef/knife/bootstrap/fedora13-gems.erb +43 -0
- data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +49 -0
- data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +50 -0
- data/lib/chef/knife/client_bulk_delete.rb +65 -0
- data/lib/chef/knife/client_create.rb +79 -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 +58 -0
- data/lib/chef/knife/client_show.rb +52 -0
- data/lib/chef/knife/configure.rb +149 -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 +274 -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 +70 -0
- data/lib/chef/knife/cookbook_site_install.rb +148 -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 +57 -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 +240 -0
- data/lib/chef/knife/core/bootstrap_context.rb +100 -0
- data/lib/chef/knife/core/cookbook_scm_repo.rb +148 -0
- data/lib/chef/knife/core/generic_presenter.rb +191 -0
- data/lib/chef/knife/core/node_editor.rb +127 -0
- data/lib/chef/knife/core/node_presenter.rb +136 -0
- data/lib/chef/knife/core/object_loader.rb +75 -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 +216 -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 +87 -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 +50 -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 +51 -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 +67 -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 +367 -0
- data/lib/chef/knife/status.rb +104 -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 +211 -0
- data/lib/chef/mixin/check_helper.rb +31 -0
- data/lib/chef/mixin/checksum.rb +32 -0
- data/lib/chef/mixin/command.rb +163 -0
- data/lib/chef/mixin/command/unix.rb +215 -0
- data/lib/chef/mixin/command/windows.rb +76 -0
- data/lib/chef/mixin/convert_to_class_name.rb +63 -0
- data/lib/chef/mixin/create_path.rb +57 -0
- data/lib/chef/mixin/deep_merge.rb +225 -0
- data/lib/chef/mixin/deprecation.rb +65 -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 +163 -0
- data/lib/chef/mixin/language_include_attribute.rb +61 -0
- data/lib/chef/mixin/language_include_recipe.rb +52 -0
- data/lib/chef/mixin/params_validate.rb +225 -0
- data/lib/chef/mixin/recipe_definition_dsl_core.rb +78 -0
- data/lib/chef/mixin/shell_out.rb +41 -0
- data/lib/chef/mixin/template.rb +95 -0
- data/lib/chef/mixin/xml_escape.rb +140 -0
- data/lib/chef/mixins.rb +15 -0
- data/lib/chef/monkey_patches/dir.rb +36 -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 +677 -0
- data/lib/chef/node/attribute.rb +487 -0
- data/lib/chef/openid_registration.rb +187 -0
- data/lib/chef/platform.rb +434 -0
- data/lib/chef/provider.rb +124 -0
- data/lib/chef/provider/breakpoint.rb +36 -0
- data/lib/chef/provider/cookbook_file.rb +100 -0
- data/lib/chef/provider/cron.rb +186 -0
- data/lib/chef/provider/cron/solaris.rb +195 -0
- data/lib/chef/provider/deploy.rb +418 -0
- data/lib/chef/provider/deploy/revision.rb +80 -0
- data/lib/chef/provider/deploy/timestamped.rb +33 -0
- data/lib/chef/provider/directory.rb +72 -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 +101 -0
- data/lib/chef/provider/execute.rb +65 -0
- data/lib/chef/provider/file.rb +226 -0
- data/lib/chef/provider/git.rb +243 -0
- data/lib/chef/provider/group.rb +133 -0
- data/lib/chef/provider/group/aix.rb +70 -0
- data/lib/chef/provider/group/dscl.rb +121 -0
- data/lib/chef/provider/group/gpasswd.rb +53 -0
- data/lib/chef/provider/group/groupadd.rb +91 -0
- data/lib/chef/provider/group/pw.rb +84 -0
- data/lib/chef/provider/group/suse.rb +53 -0
- data/lib/chef/provider/group/usermod.rb +57 -0
- data/lib/chef/provider/group/windows.rb +79 -0
- data/lib/chef/provider/http_request.rb +122 -0
- data/lib/chef/provider/ifconfig.rb +195 -0
- data/lib/chef/provider/link.rb +164 -0
- data/lib/chef/provider/log.rb +54 -0
- data/lib/chef/provider/mdadm.rb +91 -0
- data/lib/chef/provider/mount.rb +114 -0
- data/lib/chef/provider/mount/mount.rb +240 -0
- data/lib/chef/provider/mount/windows.rb +81 -0
- data/lib/chef/provider/ohai.rb +42 -0
- data/lib/chef/provider/package.rb +200 -0
- data/lib/chef/provider/package/apt.rb +145 -0
- data/lib/chef/provider/package/dpkg.rb +115 -0
- data/lib/chef/provider/package/easy_install.rb +136 -0
- data/lib/chef/provider/package/freebsd.rb +125 -0
- data/lib/chef/provider/package/macports.rb +105 -0
- data/lib/chef/provider/package/pacman.rb +101 -0
- data/lib/chef/provider/package/portage.rb +135 -0
- data/lib/chef/provider/package/rpm.rb +104 -0
- data/lib/chef/provider/package/rubygems.rb +465 -0
- data/lib/chef/provider/package/solaris.rb +130 -0
- data/lib/chef/provider/package/yum-dump.py +286 -0
- data/lib/chef/provider/package/yum.rb +1173 -0
- data/lib/chef/provider/package/zypper.rb +144 -0
- data/lib/chef/provider/remote_directory.rb +137 -0
- data/lib/chef/provider/remote_file.rb +118 -0
- data/lib/chef/provider/route.rb +193 -0
- data/lib/chef/provider/ruby_block.rb +34 -0
- data/lib/chef/provider/script.rb +55 -0
- data/lib/chef/provider/service.rb +122 -0
- data/lib/chef/provider/service/arch.rb +116 -0
- data/lib/chef/provider/service/debian.rb +130 -0
- data/lib/chef/provider/service/freebsd.rb +154 -0
- data/lib/chef/provider/service/gentoo.rb +53 -0
- data/lib/chef/provider/service/init.rb +71 -0
- data/lib/chef/provider/service/insserv.rb +52 -0
- data/lib/chef/provider/service/invokercd.rb +35 -0
- data/lib/chef/provider/service/redhat.rb +60 -0
- data/lib/chef/provider/service/simple.rb +120 -0
- data/lib/chef/provider/service/solaris.rb +85 -0
- data/lib/chef/provider/service/systemd.rb +102 -0
- data/lib/chef/provider/service/upstart.rb +198 -0
- data/lib/chef/provider/service/windows.rb +155 -0
- data/lib/chef/provider/subversion.rb +197 -0
- data/lib/chef/provider/template.rb +104 -0
- data/lib/chef/provider/user.rb +186 -0
- data/lib/chef/provider/user/dscl.rb +280 -0
- data/lib/chef/provider/user/pw.rb +113 -0
- data/lib/chef/provider/user/useradd.rb +137 -0
- data/lib/chef/provider/user/windows.rb +124 -0
- data/lib/chef/providers.rb +95 -0
- data/lib/chef/recipe.rb +129 -0
- data/lib/chef/resource.rb +609 -0
- data/lib/chef/resource/apt_package.rb +34 -0
- data/lib/chef/resource/bash.rb +33 -0
- data/lib/chef/resource/breakpoint.rb +35 -0
- data/lib/chef/resource/conditional.rb +90 -0
- data/lib/chef/resource/cookbook_file.rb +45 -0
- data/lib/chef/resource/cron.rb +188 -0
- data/lib/chef/resource/csh.rb +33 -0
- data/lib/chef/resource/deploy.rb +389 -0
- data/lib/chef/resource/deploy_revision.rb +40 -0
- data/lib/chef/resource/directory.rb +76 -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 +58 -0
- data/lib/chef/resource/erl_call.rb +83 -0
- data/lib/chef/resource/execute.rb +127 -0
- data/lib/chef/resource/file.rb +99 -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 +78 -0
- data/lib/chef/resource/http_request.rb +61 -0
- data/lib/chef/resource/ifconfig.rb +144 -0
- data/lib/chef/resource/link.rb +78 -0
- data/lib/chef/resource/log.rb +62 -0
- data/lib/chef/resource/macports_package.rb +29 -0
- data/lib/chef/resource/mdadm.rb +82 -0
- data/lib/chef/resource/mount.rb +134 -0
- data/lib/chef/resource/ohai.rb +40 -0
- data/lib/chef/resource/package.rb +80 -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 +109 -0
- data/lib/chef/resource/remote_file.rb +83 -0
- data/lib/chef/resource/route.rb +135 -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 +40 -0
- data/lib/chef/resource/scm.rb +147 -0
- data/lib/chef/resource/script.rb +60 -0
- data/lib/chef/resource/service.rb +151 -0
- data/lib/chef/resource/solaris_package.rb +36 -0
- data/lib/chef/resource/subversion.rb +36 -0
- data/lib/chef/resource/template.rb +69 -0
- data/lib/chef/resource/timestamped_deploy.rb +31 -0
- data/lib/chef/resource/user.rb +130 -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/resources.rb +64 -0
- data/lib/chef/rest.rb +400 -0
- data/lib/chef/rest/auth_credentials.rb +71 -0
- data/lib/chef/rest/cookie_jar.rb +31 -0
- data/lib/chef/rest/rest_request.rb +213 -0
- data/lib/chef/role.rb +343 -0
- data/lib/chef/run_context.rb +126 -0
- data/lib/chef/run_list.rb +165 -0
- data/lib/chef/run_list/run_list_expansion.rb +193 -0
- data/lib/chef/run_list/run_list_item.rb +92 -0
- data/lib/chef/run_list/versioned_recipe_list.rb +68 -0
- data/lib/chef/run_status.rb +121 -0
- data/lib/chef/runner.rb +105 -0
- data/lib/chef/sandbox.rb +153 -0
- data/lib/chef/search/query.rb +65 -0
- data/lib/chef/shef.rb +327 -0
- data/lib/chef/shef/ext.rb +569 -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 +285 -0
- data/lib/chef/shell_out.rb +249 -0
- data/lib/chef/shell_out/unix.rb +223 -0
- data/lib/chef/shell_out/windows.rb +588 -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 +122 -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
- metadata +764 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Seth Falcon (<seth@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright 2010-2011 Opscode, Inc.
|
|
4
|
+
# License:: Apache License, Version 2.0
|
|
5
|
+
#
|
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
# you may not use this file except in compliance with the License.
|
|
8
|
+
# You may obtain a copy of the License at
|
|
9
|
+
#
|
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
#
|
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
# See the License for the specific language governing permissions and
|
|
16
|
+
# limitations under the License.
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
require 'base64'
|
|
20
|
+
require 'openssl'
|
|
21
|
+
require 'chef/data_bag_item'
|
|
22
|
+
require 'yaml'
|
|
23
|
+
require 'open-uri'
|
|
24
|
+
|
|
25
|
+
# An EncryptedDataBagItem represents a read-only data bag item where
|
|
26
|
+
# all values, except for the value associated with the id key, have
|
|
27
|
+
# been encrypted.
|
|
28
|
+
#
|
|
29
|
+
# EncrypedDataBagItem can be used in recipes to decrypt data bag item
|
|
30
|
+
# members.
|
|
31
|
+
#
|
|
32
|
+
# Data bag item values are assumed to have been encrypted using the
|
|
33
|
+
# default symmetric encryption provided by Encryptor.encrypt where
|
|
34
|
+
# values are converted to YAML prior to encryption.
|
|
35
|
+
#
|
|
36
|
+
# If the shared secret is not specified at initialization or load,
|
|
37
|
+
# then the contents of the file referred to in
|
|
38
|
+
# Chef::Config[:encrypted_data_bag_secret] will be used as the
|
|
39
|
+
# secret. The default path is /etc/chef/encrypted_data_bag_secret
|
|
40
|
+
#
|
|
41
|
+
# EncryptedDataBagItem is intended to provide a means to avoid storing
|
|
42
|
+
# data bag items in the clear on the Chef server. This provides some
|
|
43
|
+
# protection against a breach of the Chef server or of Chef server
|
|
44
|
+
# backup data. Because the secret must be stored in the clear on any
|
|
45
|
+
# node needing access to an EncryptedDataBagItem, this approach
|
|
46
|
+
# provides no protection of data bag items from actors with access to
|
|
47
|
+
# such nodes in the infrastructure.
|
|
48
|
+
#
|
|
49
|
+
class Chef::EncryptedDataBagItem
|
|
50
|
+
DEFAULT_SECRET_FILE = "/etc/chef/encrypted_data_bag_secret"
|
|
51
|
+
ALGORITHM = 'aes-256-cbc'
|
|
52
|
+
|
|
53
|
+
def initialize(enc_hash, secret)
|
|
54
|
+
@enc_hash = enc_hash
|
|
55
|
+
@secret = secret
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def [](key)
|
|
59
|
+
value = @enc_hash[key]
|
|
60
|
+
if key == "id" || value.nil?
|
|
61
|
+
value
|
|
62
|
+
else
|
|
63
|
+
self.class.decrypt_value(value, @secret)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def []=(key, value)
|
|
68
|
+
raise ArgumentError, "assignment not supported for #{self.class}"
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def to_hash
|
|
72
|
+
@enc_hash.keys.inject({}) { |hash, key| hash[key] = self[key]; hash }
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def self.from_plain_hash(plain_hash, secret)
|
|
76
|
+
self.new(self.encrypt_data_bag_item(plain_hash, secret), secret)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def self.encrypt_data_bag_item(plain_hash, secret)
|
|
80
|
+
plain_hash.inject({}) do |h, (key, val)|
|
|
81
|
+
h[key] = if key != "id"
|
|
82
|
+
self.encrypt_value(val, secret)
|
|
83
|
+
else
|
|
84
|
+
val
|
|
85
|
+
end
|
|
86
|
+
h
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def self.load(data_bag, name, secret = nil)
|
|
91
|
+
path = "data/#{data_bag}/#{name}"
|
|
92
|
+
raw_hash = Chef::DataBagItem.load(data_bag, name)
|
|
93
|
+
secret = secret || self.load_secret
|
|
94
|
+
self.new(raw_hash, secret)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def self.encrypt_value(value, key)
|
|
98
|
+
Base64.encode64(self.cipher(:encrypt, value.to_yaml, key))
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def self.decrypt_value(value, key)
|
|
102
|
+
YAML.load(self.cipher(:decrypt, Base64.decode64(value), key))
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def self.load_secret(path=nil)
|
|
106
|
+
path = path || Chef::Config[:encrypted_data_bag_secret] || DEFAULT_SECRET_FILE
|
|
107
|
+
secret = case path
|
|
108
|
+
when /^\w+:\/\//
|
|
109
|
+
# We have a remote key
|
|
110
|
+
begin
|
|
111
|
+
Kernel.open(path).read.strip
|
|
112
|
+
rescue Errno::ECONNREFUSED
|
|
113
|
+
raise ArgumentError, "Remote key not available from '#{path}'"
|
|
114
|
+
rescue OpenURI::HTTPError
|
|
115
|
+
raise ArgumentError, "Remote key not found at '#{path}'"
|
|
116
|
+
end
|
|
117
|
+
else
|
|
118
|
+
if !File.exists?(path)
|
|
119
|
+
raise Errno::ENOENT, "file not found '#{path}'"
|
|
120
|
+
end
|
|
121
|
+
IO.read(path).strip
|
|
122
|
+
end
|
|
123
|
+
if secret.size < 1
|
|
124
|
+
raise ArgumentError, "invalid zero length secret in '#{path}'"
|
|
125
|
+
end
|
|
126
|
+
secret
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
protected
|
|
130
|
+
|
|
131
|
+
def self.cipher(direction, data, key)
|
|
132
|
+
cipher = OpenSSL::Cipher::Cipher.new(ALGORITHM)
|
|
133
|
+
cipher.send(direction)
|
|
134
|
+
cipher.pkcs5_keyivgen(key)
|
|
135
|
+
ans = cipher.update(data)
|
|
136
|
+
ans << cipher.final
|
|
137
|
+
ans
|
|
138
|
+
end
|
|
139
|
+
end
|
|
@@ -0,0 +1,455 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Stephen Delano (<stephen@opscode.com>)
|
|
3
|
+
# Author:: Seth Falcon (<seth@opscode.com>)
|
|
4
|
+
# Author:: John Keiser (<jkeiser@ospcode.com>)
|
|
5
|
+
# Copyright:: Copyright 2010-2011 Opscode, Inc.
|
|
6
|
+
# License:: Apache License, Version 2.0
|
|
7
|
+
#
|
|
8
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
9
|
+
# you may not use this file except in compliance with the License.
|
|
10
|
+
# You may obtain a copy of the License at
|
|
11
|
+
#
|
|
12
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
13
|
+
#
|
|
14
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
15
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
16
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
17
|
+
# See the License for the specific language governing permissions and
|
|
18
|
+
# limitations under the License.
|
|
19
|
+
#
|
|
20
|
+
|
|
21
|
+
require 'chef/config'
|
|
22
|
+
require 'chef/mash'
|
|
23
|
+
require 'chef/mixin/params_validate'
|
|
24
|
+
require 'chef/mixin/from_file'
|
|
25
|
+
require 'chef/couchdb'
|
|
26
|
+
require 'chef/index_queue'
|
|
27
|
+
require 'chef/version_constraint'
|
|
28
|
+
|
|
29
|
+
class Chef
|
|
30
|
+
class Environment
|
|
31
|
+
|
|
32
|
+
DEFAULT = "default"
|
|
33
|
+
|
|
34
|
+
include Chef::Mixin::ParamsValidate
|
|
35
|
+
include Chef::Mixin::FromFile
|
|
36
|
+
include Chef::IndexQueue::Indexable
|
|
37
|
+
|
|
38
|
+
COMBINED_COOKBOOK_CONSTRAINT = /(.+)(?:[\s]+)((?:#{Chef::VersionConstraint::OPS.join('|')})(?:[\s]+).+)$/.freeze
|
|
39
|
+
|
|
40
|
+
attr_accessor :couchdb, :couchdb_rev
|
|
41
|
+
attr_reader :couchdb_id
|
|
42
|
+
|
|
43
|
+
DESIGN_DOCUMENT = {
|
|
44
|
+
"version" => 1,
|
|
45
|
+
"language" => "javascript",
|
|
46
|
+
"views" => {
|
|
47
|
+
"all" => {
|
|
48
|
+
"map" => <<-EOJS
|
|
49
|
+
function(doc) {
|
|
50
|
+
if (doc.chef_type == "environment") {
|
|
51
|
+
emit(doc.name, doc);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
EOJS
|
|
55
|
+
},
|
|
56
|
+
"all_id" => {
|
|
57
|
+
"map" => <<-EOJS
|
|
58
|
+
function(doc) {
|
|
59
|
+
if (doc.chef_type == "environment") {
|
|
60
|
+
emit(doc.name, doc.name);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
EOJS
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
def initialize(couchdb=nil)
|
|
69
|
+
@name = ''
|
|
70
|
+
@description = ''
|
|
71
|
+
@default_attributes = Mash.new
|
|
72
|
+
@override_attributes = Mash.new
|
|
73
|
+
@cookbook_versions = Hash.new
|
|
74
|
+
@couchdb_rev = nil
|
|
75
|
+
@couchdb_id = nil
|
|
76
|
+
@couchdb = couchdb || Chef::CouchDB.new
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def couchdb_id=(value)
|
|
80
|
+
@couchdb_id = value
|
|
81
|
+
self.index_id = value
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def chef_server_rest
|
|
85
|
+
Chef::REST.new(Chef::Config[:chef_server_url])
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def self.chef_server_rest
|
|
89
|
+
Chef::REST.new(Chef::Config[:chef_server_url])
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def name(arg=nil)
|
|
93
|
+
set_or_return(
|
|
94
|
+
:name,
|
|
95
|
+
arg,
|
|
96
|
+
{ :regex => /^[\-[:alnum:]_]+$/, :kind_of => String }
|
|
97
|
+
)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def description(arg=nil)
|
|
101
|
+
set_or_return(
|
|
102
|
+
:description,
|
|
103
|
+
arg,
|
|
104
|
+
:kind_of => String
|
|
105
|
+
)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def default_attributes(arg=nil)
|
|
109
|
+
set_or_return(
|
|
110
|
+
:default_attributes,
|
|
111
|
+
arg,
|
|
112
|
+
:kind_of => Hash
|
|
113
|
+
)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def override_attributes(arg=nil)
|
|
117
|
+
set_or_return(
|
|
118
|
+
:override_attributes,
|
|
119
|
+
arg,
|
|
120
|
+
:kind_of => Hash
|
|
121
|
+
)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def cookbook_versions(arg=nil)
|
|
125
|
+
set_or_return(
|
|
126
|
+
:cookbook_versions,
|
|
127
|
+
arg,
|
|
128
|
+
{
|
|
129
|
+
:kind_of => Hash,
|
|
130
|
+
:callbacks => {
|
|
131
|
+
"should be a valid set of cookbook version requirements" => lambda { |cv| Chef::Environment.validate_cookbook_versions(cv) }
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
)
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def cookbook(cookbook, version)
|
|
138
|
+
validate({
|
|
139
|
+
:version => version
|
|
140
|
+
},{
|
|
141
|
+
:version => {
|
|
142
|
+
:callbacks => { "should be a valid version requirement" => lambda { |v| Chef::Environment.validate_cookbook_version(v) } }
|
|
143
|
+
}
|
|
144
|
+
})
|
|
145
|
+
@cookbook_versions[cookbook] = version
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def to_hash
|
|
149
|
+
result = {
|
|
150
|
+
"name" => @name,
|
|
151
|
+
"description" => @description,
|
|
152
|
+
"cookbook_versions" => @cookbook_versions,
|
|
153
|
+
"json_class" => self.class.name,
|
|
154
|
+
"chef_type" => "environment",
|
|
155
|
+
"default_attributes" => @default_attributes,
|
|
156
|
+
"override_attributes" => @override_attributes
|
|
157
|
+
}
|
|
158
|
+
result["_rev"] = couchdb_rev if couchdb_rev
|
|
159
|
+
result
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def to_json(*a)
|
|
163
|
+
to_hash.to_json(*a)
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def update_from!(o)
|
|
167
|
+
description(o.description)
|
|
168
|
+
cookbook_versions(o.cookbook_versions)
|
|
169
|
+
default_attributes(o.default_attributes)
|
|
170
|
+
override_attributes(o.override_attributes)
|
|
171
|
+
self
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def update_attributes_from_params(params)
|
|
176
|
+
unless params[:default_attributes].nil? || params[:default_attributes].size == 0
|
|
177
|
+
default_attributes(Chef::JSONCompat.from_json(params[:default_attributes]))
|
|
178
|
+
end
|
|
179
|
+
unless params[:override_attributes].nil? || params[:override_attributes].size == 0
|
|
180
|
+
override_attributes(Chef::JSONCompat.from_json(params[:override_attributes]))
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def update_from_params(params)
|
|
185
|
+
# reset because everything we need will be in the params, this is necessary because certain constraints
|
|
186
|
+
# may have been removed in the params and need to be removed from cookbook_versions as well.
|
|
187
|
+
bkup_cb_versions = cookbook_versions
|
|
188
|
+
cookbook_versions(Hash.new)
|
|
189
|
+
valid = true
|
|
190
|
+
|
|
191
|
+
begin
|
|
192
|
+
name(params[:name])
|
|
193
|
+
rescue Chef::Exceptions::ValidationFailed => e
|
|
194
|
+
invalid_fields[:name] = e.message
|
|
195
|
+
valid = false
|
|
196
|
+
end
|
|
197
|
+
description(params[:description])
|
|
198
|
+
|
|
199
|
+
unless params[:cookbook_version].nil?
|
|
200
|
+
params[:cookbook_version].each do |index, cookbook_constraint_spec|
|
|
201
|
+
unless (cookbook_constraint_spec.nil? || cookbook_constraint_spec.size == 0)
|
|
202
|
+
valid = valid && update_cookbook_constraint_from_param(index, cookbook_constraint_spec)
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
update_attributes_from_params(params)
|
|
208
|
+
|
|
209
|
+
valid = validate_required_attrs_present && valid
|
|
210
|
+
cookbook_versions(bkup_cb_versions) unless valid # restore the old cookbook_versions if valid is false
|
|
211
|
+
valid
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
def update_cookbook_constraint_from_param(index, cookbook_constraint_spec)
|
|
215
|
+
valid = true
|
|
216
|
+
md = cookbook_constraint_spec.match(COMBINED_COOKBOOK_CONSTRAINT)
|
|
217
|
+
if md.nil? || md[2].nil?
|
|
218
|
+
valid = false
|
|
219
|
+
add_cookbook_constraint_error(index, cookbook_constraint_spec)
|
|
220
|
+
elsif self.class.validate_cookbook_version(md[2])
|
|
221
|
+
cookbook_versions[md[1]] = md[2]
|
|
222
|
+
else
|
|
223
|
+
valid = false
|
|
224
|
+
add_cookbook_constraint_error(index, cookbook_constraint_spec)
|
|
225
|
+
end
|
|
226
|
+
valid
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
def add_cookbook_constraint_error(index, cookbook_constraint_spec)
|
|
230
|
+
invalid_fields[:cookbook_version] ||= {}
|
|
231
|
+
invalid_fields[:cookbook_version][index] = "#{cookbook_constraint_spec} is not a valid cookbook constraint"
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
def invalid_fields
|
|
235
|
+
@invalid_fields ||= {}
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
def validate_required_attrs_present
|
|
239
|
+
if name.nil? || name.size == 0
|
|
240
|
+
invalid_fields[:name] ||= "name cannot be empty"
|
|
241
|
+
false
|
|
242
|
+
else
|
|
243
|
+
true
|
|
244
|
+
end
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def self.json_create(o)
|
|
249
|
+
environment = new
|
|
250
|
+
environment.name(o["name"])
|
|
251
|
+
environment.description(o["description"])
|
|
252
|
+
environment.cookbook_versions(o["cookbook_versions"])
|
|
253
|
+
environment.default_attributes(o["default_attributes"])
|
|
254
|
+
environment.override_attributes(o["override_attributes"])
|
|
255
|
+
environment.couchdb_rev = o["_rev"] if o.has_key?("_rev")
|
|
256
|
+
environment.couchdb_id = o["_id"] if o.has_key?("_id")
|
|
257
|
+
environment
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
def self.cdb_list(inflate=false, couchdb=nil)
|
|
261
|
+
es = (couchdb || Chef::CouchDB.new).list("environments", inflate)
|
|
262
|
+
lookup = (inflate ? "value" : "key")
|
|
263
|
+
es["rows"].collect { |e| e[lookup] }
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
def self.list(inflate=false)
|
|
267
|
+
if inflate
|
|
268
|
+
# TODO: index the environments and use search to inflate - don't inflate for now :(
|
|
269
|
+
chef_server_rest.get_rest("environments")
|
|
270
|
+
else
|
|
271
|
+
chef_server_rest.get_rest("environments")
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
def self.cdb_load(name, couchdb=nil)
|
|
276
|
+
(couchdb || Chef::CouchDB.new).load("environment", name)
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
def self.load(name)
|
|
280
|
+
chef_server_rest.get_rest("environments/#{name}")
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
def self.exists?(name, couchdb)
|
|
284
|
+
begin
|
|
285
|
+
self.cdb_load(name, couchdb)
|
|
286
|
+
rescue Chef::Exceptions::CouchDBNotFound
|
|
287
|
+
nil
|
|
288
|
+
end
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
def cdb_destroy
|
|
292
|
+
couchdb.delete("environment", @name, couchdb_rev)
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
def destroy
|
|
296
|
+
chef_server_rest.delete_rest("environments/#{@name}")
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
def cdb_save
|
|
300
|
+
self.couchdb_rev = couchdb.store("environment", @name, self)["rev"]
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
def save
|
|
304
|
+
begin
|
|
305
|
+
chef_server_rest.put_rest("environments/#{@name}", self)
|
|
306
|
+
rescue Net::HTTPServerException => e
|
|
307
|
+
raise e unless e.response.code == "404"
|
|
308
|
+
chef_server_rest.post_rest("environments", self)
|
|
309
|
+
end
|
|
310
|
+
self
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
def create
|
|
314
|
+
chef_server_rest.post_rest("environments", self)
|
|
315
|
+
self
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
# Set up our CouchDB design document
|
|
319
|
+
def self.create_design_document(couchdb=nil)
|
|
320
|
+
(couchdb || Chef::CouchDB.new).create_design_document("environments", DESIGN_DOCUMENT)
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
# Loads the set of Chef::CookbookVersion objects available to a given environment
|
|
324
|
+
# === Returns
|
|
325
|
+
# Hash
|
|
326
|
+
# i.e.
|
|
327
|
+
# {
|
|
328
|
+
# "cookbook_name" => [ Chef::CookbookVersion ... ] ## the array of CookbookVersions is sorted highest to lowest
|
|
329
|
+
# }
|
|
330
|
+
#
|
|
331
|
+
# There will be a key for every cookbook. If no CookbookVersions
|
|
332
|
+
# are available for the specified environment the value will be an
|
|
333
|
+
# empty list.
|
|
334
|
+
#
|
|
335
|
+
def self.cdb_load_filtered_cookbook_versions(name, couchdb=nil)
|
|
336
|
+
version_constraints = cdb_load(name, couchdb).cookbook_versions.inject({}) {|res, (k,v)| res[k] = Chef::VersionConstraint.new(v); res}
|
|
337
|
+
|
|
338
|
+
# inject all cookbooks into the hash while filtering out restricted versions, then sort the individual arrays
|
|
339
|
+
cookbook_list = Chef::CookbookVersion.cdb_list(true, couchdb)
|
|
340
|
+
|
|
341
|
+
filtered_list = cookbook_list.inject({}) do |res, cookbook|
|
|
342
|
+
# FIXME: should cookbook.version return a Chef::Version?
|
|
343
|
+
version = Chef::Version.new(cookbook.version)
|
|
344
|
+
requirement_satisfied = version_constraints.has_key?(cookbook.name) ? version_constraints[cookbook.name].include?(version) : true
|
|
345
|
+
# we want a key for every cookbook, even if no versions are available
|
|
346
|
+
res[cookbook.name] ||= []
|
|
347
|
+
res[cookbook.name] << cookbook if requirement_satisfied
|
|
348
|
+
res
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
sorted_list = filtered_list.inject({}) do |res, (cookbook_name, versions)|
|
|
352
|
+
res[cookbook_name] = versions.sort.reverse
|
|
353
|
+
res
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
sorted_list
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
# Like +cdb_load_filtered_cookbook_versions+, loads the set of
|
|
360
|
+
# cookbooks available in a given environment. The difference is that
|
|
361
|
+
# this method will load Chef::MinimalCookbookVersion objects that
|
|
362
|
+
# contain only the information necessary for solving a cookbook
|
|
363
|
+
# collection for a given run list. The user of this method must call
|
|
364
|
+
# Chef::MinimalCookbookVersion.load_full_versions_of() after solving
|
|
365
|
+
# the cookbook collection to get the full objects.
|
|
366
|
+
# === Returns
|
|
367
|
+
# Hash
|
|
368
|
+
# i.e.
|
|
369
|
+
# {
|
|
370
|
+
# "cookbook_name" => [ Chef::CookbookVersion ... ] ## the array of CookbookVersions is sorted highest to lowest
|
|
371
|
+
# }
|
|
372
|
+
#
|
|
373
|
+
# There will be a key for every cookbook. If no CookbookVersions
|
|
374
|
+
# are available for the specified environment the value will be an
|
|
375
|
+
# empty list.
|
|
376
|
+
def self.cdb_minimal_filtered_versions(name, couchdb=nil)
|
|
377
|
+
version_constraints = cdb_load(name, couchdb).cookbook_versions.inject({}) {|res, (k,v)| res[k] = Chef::VersionConstraint.new(v); res}
|
|
378
|
+
|
|
379
|
+
# inject all cookbooks into the hash while filtering out restricted versions, then sort the individual arrays
|
|
380
|
+
cookbook_list = Chef::MinimalCookbookVersion.load_all(couchdb)
|
|
381
|
+
|
|
382
|
+
filtered_list = cookbook_list.inject({}) do |res, cookbook|
|
|
383
|
+
# FIXME: should cookbook.version return a Chef::Version?
|
|
384
|
+
version = Chef::Version.new(cookbook.version)
|
|
385
|
+
requirement_satisfied = version_constraints.has_key?(cookbook.name) ? version_constraints[cookbook.name].include?(version) : true
|
|
386
|
+
# we want a key for every cookbook, even if no versions are available
|
|
387
|
+
res[cookbook.name] ||= []
|
|
388
|
+
res[cookbook.name] << cookbook if requirement_satisfied
|
|
389
|
+
res
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
sorted_list = filtered_list.inject({}) do |res, (cookbook_name, versions)|
|
|
393
|
+
res[cookbook_name] = versions.sort.reverse
|
|
394
|
+
res
|
|
395
|
+
end
|
|
396
|
+
|
|
397
|
+
sorted_list
|
|
398
|
+
end
|
|
399
|
+
|
|
400
|
+
def self.cdb_load_filtered_recipe_list(name, couchdb=nil)
|
|
401
|
+
cdb_load_filtered_cookbook_versions(name, couchdb).map do |cb_name, cb|
|
|
402
|
+
if cb.empty? # no available versions
|
|
403
|
+
[] # empty list elided with flatten
|
|
404
|
+
else
|
|
405
|
+
latest_version = cb.first
|
|
406
|
+
latest_version.recipe_filenames_by_name.keys.map do |recipe|
|
|
407
|
+
case recipe
|
|
408
|
+
when DEFAULT
|
|
409
|
+
cb_name
|
|
410
|
+
else
|
|
411
|
+
"#{cb_name}::#{recipe}"
|
|
412
|
+
end
|
|
413
|
+
end
|
|
414
|
+
end
|
|
415
|
+
end.flatten
|
|
416
|
+
end
|
|
417
|
+
|
|
418
|
+
def self.load_filtered_recipe_list(environment)
|
|
419
|
+
chef_server_rest.get_rest("environments/#{environment}/recipes")
|
|
420
|
+
end
|
|
421
|
+
|
|
422
|
+
def to_s
|
|
423
|
+
@name
|
|
424
|
+
end
|
|
425
|
+
|
|
426
|
+
def self.validate_cookbook_versions(cv)
|
|
427
|
+
return false unless cv.kind_of?(Hash)
|
|
428
|
+
cv.each do |cookbook, version|
|
|
429
|
+
return false unless Chef::Environment.validate_cookbook_version(version)
|
|
430
|
+
end
|
|
431
|
+
true
|
|
432
|
+
end
|
|
433
|
+
|
|
434
|
+
def self.validate_cookbook_version(version)
|
|
435
|
+
begin
|
|
436
|
+
Chef::VersionConstraint.new version
|
|
437
|
+
true
|
|
438
|
+
rescue ArgumentError
|
|
439
|
+
false
|
|
440
|
+
end
|
|
441
|
+
end
|
|
442
|
+
|
|
443
|
+
def self.create_default_environment(couchdb=nil)
|
|
444
|
+
couchdb = couchdb || Chef::CouchDB.new
|
|
445
|
+
begin
|
|
446
|
+
Chef::Environment.cdb_load('_default', couchdb)
|
|
447
|
+
rescue Chef::Exceptions::CouchDBNotFound
|
|
448
|
+
env = Chef::Environment.new(couchdb)
|
|
449
|
+
env.name '_default'
|
|
450
|
+
env.description 'The default Chef environment'
|
|
451
|
+
env.cdb_save
|
|
452
|
+
end
|
|
453
|
+
end
|
|
454
|
+
end
|
|
455
|
+
end
|