TrueCar-chef 0.10.0.beta.3
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-server-webui.conf +10 -0
- data/distro/arch/etc/conf.d/chef-server.conf +10 -0
- data/distro/arch/etc/conf.d/chef-solr-indexer.conf +8 -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-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/arch/etc/rc.d/chef-solr-indexer +78 -0
- data/distro/common/man/man1/chef-indexer.1 +42 -0
- data/distro/common/man/man1/chef-server-webui.1 +106 -0
- data/distro/common/man/man1/chef-server.1 +107 -0
- data/distro/common/man/man1/chef-solr-indexer.1 +55 -0
- data/distro/common/man/man1/chef-solr.1 +55 -0
- data/distro/common/man/man8/chef-client.8 +63 -0
- data/distro/common/man/man8/chef-solo.8 +57 -0
- data/distro/common/man/man8/chef-solr-rebuild.8 +37 -0
- data/distro/common/man/man8/knife.8 +1349 -0
- data/distro/common/man/man8/shef.8 +45 -0
- data/distro/common/markdown/README +3 -0
- data/distro/common/markdown/knife.mkd +865 -0
- data/distro/debian/etc/default/chef-client +4 -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/default/chef-solr-indexer +7 -0
- data/distro/debian/etc/init.d/chef-client +175 -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.d/chef-solr-indexer +176 -0
- data/distro/debian/etc/init/chef-client.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-indexer.conf +17 -0
- data/distro/debian/etc/init/chef-solr.conf +17 -0
- data/distro/redhat/etc/init.d/chef-client +106 -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/init.d/chef-solr-indexer +104 -0
- data/distro/redhat/etc/logrotate.d/chef-client +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/logrotate.d/chef-solr-indexer +8 -0
- data/distro/redhat/etc/sysconfig/chef-client +15 -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/redhat/etc/sysconfig/chef-solr-indexer +7 -0
- data/lib/chef.rb +40 -0
- data/lib/chef/api_client.rb +264 -0
- data/lib/chef/application.rb +137 -0
- data/lib/chef/application/agent.rb +18 -0
- data/lib/chef/application/client.rb +242 -0
- data/lib/chef/application/knife.rb +169 -0
- data/lib/chef/application/solo.rb +217 -0
- data/lib/chef/applications.rb +4 -0
- data/lib/chef/certificate.rb +194 -0
- data/lib/chef/checksum.rb +182 -0
- data/lib/chef/checksum_cache.rb +189 -0
- data/lib/chef/client.rb +362 -0
- data/lib/chef/config.rb +244 -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 +151 -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 +592 -0
- data/lib/chef/cookbook/remote_file_vendor.rb +87 -0
- data/lib/chef/cookbook/syntax_check.rb +136 -0
- data/lib/chef/cookbook_loader.rb +103 -0
- data/lib/chef/cookbook_site_streaming_uploader.rb +244 -0
- data/lib/chef/cookbook_uploader.rb +125 -0
- data/lib/chef/cookbook_version.rb +979 -0
- data/lib/chef/cookbook_version_selector.rb +163 -0
- data/lib/chef/couchdb.rb +247 -0
- data/lib/chef/daemon.rb +172 -0
- data/lib/chef/data_bag.rb +223 -0
- data/lib/chef/data_bag_item.rb +267 -0
- data/lib/chef/encrypted_data_bag_item.rb +126 -0
- data/lib/chef/environment.rb +386 -0
- data/lib/chef/exceptions.rb +153 -0
- data/lib/chef/file_access_control.rb +140 -0
- data/lib/chef/file_cache.rb +218 -0
- data/lib/chef/handler.rb +206 -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 +424 -0
- data/lib/chef/knife/bootstrap.rb +185 -0
- data/lib/chef/knife/bootstrap/archlinux-gems.erb +47 -0
- data/lib/chef/knife/bootstrap/centos5-gems.erb +41 -0
- data/lib/chef/knife/bootstrap/client-install.vbs +80 -0
- data/lib/chef/knife/bootstrap/fedora13-gems.erb +38 -0
- data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +32 -0
- data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +46 -0
- data/lib/chef/knife/bootstrap/windows-gems.erb +34 -0
- data/lib/chef/knife/client_bulk_delete.rb +43 -0
- data/lib/chef/knife/client_create.rb +73 -0
- data/lib/chef/knife/client_delete.rb +48 -0
- data/lib/chef/knife/client_edit.rb +48 -0
- data/lib/chef/knife/client_list.rb +43 -0
- data/lib/chef/knife/client_reregister.rb +59 -0
- data/lib/chef/knife/client_show.rb +53 -0
- data/lib/chef/knife/configure.rb +136 -0
- data/lib/chef/knife/configure_client.rb +52 -0
- data/lib/chef/knife/cookbook_bulk_delete.rb +61 -0
- data/lib/chef/knife/cookbook_create.rb +274 -0
- data/lib/chef/knife/cookbook_delete.rb +149 -0
- data/lib/chef/knife/cookbook_download.rb +134 -0
- data/lib/chef/knife/cookbook_list.rb +50 -0
- data/lib/chef/knife/cookbook_metadata.rb +102 -0
- data/lib/chef/knife/cookbook_metadata_from_file.rb +44 -0
- data/lib/chef/knife/cookbook_show.rb +101 -0
- data/lib/chef/knife/cookbook_site_download.rb +58 -0
- data/lib/chef/knife/cookbook_site_list.rb +56 -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 +145 -0
- data/lib/chef/knife/cookbook_test.rb +82 -0
- data/lib/chef/knife/cookbook_upload.rb +146 -0
- data/lib/chef/knife/data_bag_create.rb +94 -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 +85 -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 +39 -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/index_rebuild.rb +50 -0
- data/lib/chef/knife/node_bulk_delete.rb +46 -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 +163 -0
- data/lib/chef/knife/node_from_file.rb +45 -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 +62 -0
- data/lib/chef/knife/recipe_list.rb +33 -0
- data/lib/chef/knife/role_bulk_delete.rb +47 -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 +49 -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 +123 -0
- data/lib/chef/knife/ssh.rb +318 -0
- data/lib/chef/knife/status.rb +90 -0
- data/lib/chef/knife/subcommand_loader.rb +101 -0
- data/lib/chef/knife/tag_create.rb +31 -0
- data/lib/chef/knife/tag_delete.rb +31 -0
- data/lib/chef/knife/tag_list.rb +29 -0
- data/lib/chef/knife/ui.rb +227 -0
- data/lib/chef/knife/windows_bootstrap.rb +157 -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 +221 -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 +56 -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/language.rb +165 -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 +81 -0
- data/lib/chef/mixin/shell_out.rb +40 -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 +7 -0
- data/lib/chef/monkey_patches/regexp.rb +34 -0
- data/lib/chef/monkey_patches/string.rb +28 -0
- data/lib/chef/monkey_patches/tempfile.rb +64 -0
- data/lib/chef/nil_argument.rb +3 -0
- data/lib/chef/node.rb +661 -0
- data/lib/chef/node/attribute.rb +487 -0
- data/lib/chef/openid_registration.rb +187 -0
- data/lib/chef/platform.rb +409 -0
- data/lib/chef/provider.rb +124 -0
- data/lib/chef/provider/breakpoint.rb +36 -0
- data/lib/chef/provider/cookbook_file.rb +101 -0
- data/lib/chef/provider/cron.rb +186 -0
- data/lib/chef/provider/cron/solaris.rb +195 -0
- data/lib/chef/provider/deploy.rb +320 -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 +100 -0
- data/lib/chef/provider/execute.rb +60 -0
- data/lib/chef/provider/file.rb +222 -0
- data/lib/chef/provider/git.rb +221 -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 +81 -0
- data/lib/chef/provider/group/pw.rb +84 -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 +132 -0
- data/lib/chef/provider/link.rb +161 -0
- data/lib/chef/provider/log.rb +54 -0
- data/lib/chef/provider/mdadm.rb +91 -0
- data/lib/chef/provider/mount.rb +117 -0
- data/lib/chef/provider/mount/mount.rb +232 -0
- data/lib/chef/provider/mount/windows.rb +80 -0
- data/lib/chef/provider/ohai.rb +41 -0
- data/lib/chef/provider/package.rb +160 -0
- data/lib/chef/provider/package/apt.rb +110 -0
- data/lib/chef/provider/package/dpkg.rb +112 -0
- data/lib/chef/provider/package/easy_install.rb +136 -0
- data/lib/chef/provider/package/freebsd.rb +123 -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 +101 -0
- data/lib/chef/provider/package/rubygems.rb +462 -0
- data/lib/chef/provider/package/solaris.rb +127 -0
- data/lib/chef/provider/package/yum-dump.py +128 -0
- data/lib/chef/provider/package/yum.rb +261 -0
- data/lib/chef/provider/package/zypper.rb +133 -0
- data/lib/chef/provider/remote_directory.rb +138 -0
- data/lib/chef/provider/remote_file.rb +119 -0
- data/lib/chef/provider/route.rb +195 -0
- data/lib/chef/provider/ruby_block.rb +33 -0
- data/lib/chef/provider/script.rb +55 -0
- data/lib/chef/provider/service.rb +128 -0
- data/lib/chef/provider/service/arch.rb +109 -0
- data/lib/chef/provider/service/debian.rb +130 -0
- data/lib/chef/provider/service/freebsd.rb +156 -0
- data/lib/chef/provider/service/gentoo.rb +54 -0
- data/lib/chef/provider/service/init.rb +71 -0
- data/lib/chef/provider/service/insserv.rb +52 -0
- data/lib/chef/provider/service/redhat.rb +60 -0
- data/lib/chef/provider/service/simple.rb +118 -0
- data/lib/chef/provider/service/solaris.rb +85 -0
- data/lib/chef/provider/service/upstart.rb +192 -0
- data/lib/chef/provider/service/windows.rb +146 -0
- data/lib/chef/provider/subversion.rb +194 -0
- data/lib/chef/provider/template.rb +105 -0
- data/lib/chef/provider/user.rb +187 -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 +93 -0
- data/lib/chef/recipe.rb +128 -0
- data/lib/chef/resource.rb +530 -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/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 +371 -0
- data/lib/chef/resource/deploy_revision.rb +35 -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 +37 -0
- data/lib/chef/resource/group.rb +70 -0
- data/lib/chef/resource/http_request.rb +61 -0
- data/lib/chef/resource/ifconfig.rb +134 -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 +135 -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 +160 -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 +43 -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 +386 -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 +188 -0
- data/lib/chef/role.rb +341 -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 +99 -0
- data/lib/chef/sandbox.rb +153 -0
- data/lib/chef/search/query.rb +65 -0
- data/lib/chef/shef.rb +326 -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 +284 -0
- data/lib/chef/shell_out.rb +238 -0
- data/lib/chef/shell_out/unix.rb +223 -0
- data/lib/chef/shell_out/windows.rb +98 -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 +118 -0
- data/lib/chef/streaming_cookbook_uploader.rb +201 -0
- data/lib/chef/tasks/chef_repo.rake +256 -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 +600 -0
data/lib/chef/recipe.rb
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
3
|
+
# Author:: Christopher Walters (<cw@opscode.com>)
|
|
4
|
+
# Copyright:: Copyright (c) 2008, 2009 Opscode, Inc.
|
|
5
|
+
# License:: Apache License, Version 2.0
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
# you may not use this file except in compliance with the License.
|
|
9
|
+
# You may obtain a copy of the License at
|
|
10
|
+
#
|
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
#
|
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
# See the License for the specific language governing permissions and
|
|
17
|
+
# limitations under the License.
|
|
18
|
+
#
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
require 'chef/mixin/recipe_definition_dsl_core'
|
|
22
|
+
require 'chef/mixin/from_file'
|
|
23
|
+
require 'chef/mixin/language'
|
|
24
|
+
require 'chef/mixin/language_include_recipe'
|
|
25
|
+
|
|
26
|
+
require 'chef/mixin/deprecation'
|
|
27
|
+
|
|
28
|
+
class Chef
|
|
29
|
+
# == Chef::Recipe
|
|
30
|
+
# A Recipe object is the context in which Chef recipes are evaluated.
|
|
31
|
+
class Recipe
|
|
32
|
+
|
|
33
|
+
include Chef::Mixin::FromFile
|
|
34
|
+
include Chef::Mixin::Language
|
|
35
|
+
include Chef::Mixin::LanguageIncludeRecipe
|
|
36
|
+
include Chef::Mixin::RecipeDefinitionDSLCore
|
|
37
|
+
include Chef::Mixin::Deprecation
|
|
38
|
+
|
|
39
|
+
attr_accessor :cookbook_name, :recipe_name, :recipe, :params, :run_context
|
|
40
|
+
|
|
41
|
+
# Parses a potentially fully-qualified recipe name into its
|
|
42
|
+
# cookbook name and recipe short name.
|
|
43
|
+
#
|
|
44
|
+
# For example:
|
|
45
|
+
# "aws::elastic_ip" returns [:aws, "elastic_ip"]
|
|
46
|
+
# "aws" returns [:aws, "default"]
|
|
47
|
+
#--
|
|
48
|
+
# TODO: Duplicates functionality of RunListItem
|
|
49
|
+
def self.parse_recipe_name(recipe_name)
|
|
50
|
+
rmatch = recipe_name.match(/(.+?)::(.+)/)
|
|
51
|
+
if rmatch
|
|
52
|
+
[ rmatch[1].to_sym, rmatch[2] ]
|
|
53
|
+
else
|
|
54
|
+
[ recipe_name.to_sym, "default" ]
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def initialize(cookbook_name, recipe_name, run_context)
|
|
59
|
+
@cookbook_name = cookbook_name
|
|
60
|
+
@recipe_name = recipe_name
|
|
61
|
+
@run_context = run_context
|
|
62
|
+
# TODO: 5/19/2010 cw/tim: determine whether this can be removed
|
|
63
|
+
@params = Hash.new
|
|
64
|
+
@node = deprecated_ivar(run_context.node, :node, :warn)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Used in DSL mixins
|
|
68
|
+
def node
|
|
69
|
+
run_context.node
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Used by the DSL to look up resources when executing in the context of a
|
|
73
|
+
# recipe.
|
|
74
|
+
def resources(*args)
|
|
75
|
+
run_context.resource_collection.find(*args)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Sets a tag, or list of tags, for this node. Syntactic sugar for
|
|
79
|
+
# run_context.node[:tags].
|
|
80
|
+
#
|
|
81
|
+
# With no arguments, returns the list of tags.
|
|
82
|
+
#
|
|
83
|
+
# === Parameters
|
|
84
|
+
# tags<Array>:: A list of tags to add - can be a single string
|
|
85
|
+
#
|
|
86
|
+
# === Returns
|
|
87
|
+
# tags<Array>:: The contents of run_context.node[:tags]
|
|
88
|
+
def tag(*tags)
|
|
89
|
+
if tags.length > 0
|
|
90
|
+
tags.each do |tag|
|
|
91
|
+
run_context.node[:tags] << tag unless run_context.node[:tags].include?(tag)
|
|
92
|
+
end
|
|
93
|
+
run_context.node[:tags]
|
|
94
|
+
else
|
|
95
|
+
run_context.node[:tags]
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# Returns true if the node is tagged with *all* of the supplied +tags+.
|
|
100
|
+
#
|
|
101
|
+
# === Parameters
|
|
102
|
+
# tags<Array>:: A list of tags
|
|
103
|
+
#
|
|
104
|
+
# === Returns
|
|
105
|
+
# true<TrueClass>:: If all the parameters are present
|
|
106
|
+
# false<FalseClass>:: If any of the parameters are missing
|
|
107
|
+
def tagged?(*tags)
|
|
108
|
+
tags.each do |tag|
|
|
109
|
+
return false unless run_context.node[:tags].include?(tag)
|
|
110
|
+
end
|
|
111
|
+
true
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Removes the list of tags from the node.
|
|
115
|
+
#
|
|
116
|
+
# === Parameters
|
|
117
|
+
# tags<Array>:: A list of tags
|
|
118
|
+
#
|
|
119
|
+
# === Returns
|
|
120
|
+
# tags<Array>:: The current list of run_context.node[:tags]
|
|
121
|
+
def untag(*tags)
|
|
122
|
+
tags.each do |tag|
|
|
123
|
+
run_context.node[:tags].delete(tag)
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
end
|
|
128
|
+
end
|
|
@@ -0,0 +1,530 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
3
|
+
# Author:: Christopher Walters (<cw@opscode.com>)
|
|
4
|
+
# Copyright:: Copyright (c) 2008 Opscode, Inc.
|
|
5
|
+
# License:: Apache License, Version 2.0
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
# you may not use this file except in compliance with the License.
|
|
9
|
+
# You may obtain a copy of the License at
|
|
10
|
+
#
|
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
#
|
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
# See the License for the specific language governing permissions and
|
|
17
|
+
# limitations under the License.
|
|
18
|
+
#
|
|
19
|
+
|
|
20
|
+
require 'chef/mixin/params_validate'
|
|
21
|
+
require 'chef/mixin/check_helper'
|
|
22
|
+
require 'chef/mixin/language'
|
|
23
|
+
require 'chef/mixin/convert_to_class_name'
|
|
24
|
+
require 'chef/mixin/command'
|
|
25
|
+
require 'chef/resource_collection'
|
|
26
|
+
require 'chef/node'
|
|
27
|
+
|
|
28
|
+
require 'chef/mixin/deprecation'
|
|
29
|
+
|
|
30
|
+
class Chef
|
|
31
|
+
class Resource
|
|
32
|
+
class Notification < Struct.new(:resource, :action, :notifying_resource)
|
|
33
|
+
|
|
34
|
+
def duplicates?(other_notification)
|
|
35
|
+
unless other_notification.respond_to?(:resource) && other_notification.respond_to?(:action)
|
|
36
|
+
msg = "only duck-types of Chef::Resource::Notification can be checked for duplication "\
|
|
37
|
+
"you gave #{other_notification.inspect}"
|
|
38
|
+
raise ArgumentError, msg
|
|
39
|
+
end
|
|
40
|
+
other_notification.resource == resource && other_notification.action == action
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def resolve_resource_reference(resource_collection)
|
|
44
|
+
return resource if resource.kind_of?(Chef::Resource)
|
|
45
|
+
|
|
46
|
+
matching_resource = resource_collection.find(resource)
|
|
47
|
+
if Array(matching_resource).size > 1
|
|
48
|
+
msg = "Notification #{self} from #{notifying_resource} was created with a reference to multiple resources, "\
|
|
49
|
+
"but can only notify one resource. Notifying resource was defined on #{notifying_resource.source_line}"
|
|
50
|
+
raise Chef::Exceptions::InvalidResourceReference, msg
|
|
51
|
+
end
|
|
52
|
+
self.resource = matching_resource
|
|
53
|
+
rescue Chef::Exceptions::ResourceNotFound => e
|
|
54
|
+
err = Chef::Exceptions::ResourceNotFound.new(<<-FAIL)
|
|
55
|
+
Resource #{notifying_resource} is configured to notify resource #{resource} with action #{action}, \
|
|
56
|
+
but #{resource} cannot be found in the resource collection. #{notifying_resource} is defined in \
|
|
57
|
+
#{notifying_resource.source_line}
|
|
58
|
+
FAIL
|
|
59
|
+
err.set_backtrace(e.backtrace)
|
|
60
|
+
raise err
|
|
61
|
+
rescue Chef::Exceptions::InvalidResourceSpecification => e
|
|
62
|
+
err = Chef::Exceptions::InvalidResourceSpecification.new(<<-F)
|
|
63
|
+
Resource #{notifying_resource} is configured to notify resource #{resource} with action #{action}, \
|
|
64
|
+
but #{resource.inspect} is not valid syntax to look up a resource in the resource collection. Notification \
|
|
65
|
+
is defined near #{notifying_resource.source_line}
|
|
66
|
+
F
|
|
67
|
+
err.set_backtrace(e.backtrace)
|
|
68
|
+
raise err
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
HIDDEN_IVARS = [:@allowed_actions, :@resource_name, :@source_line, :@run_context, :@name, :@node]
|
|
74
|
+
|
|
75
|
+
include Chef::Mixin::CheckHelper
|
|
76
|
+
include Chef::Mixin::ParamsValidate
|
|
77
|
+
include Chef::Mixin::Language
|
|
78
|
+
include Chef::Mixin::ConvertToClassName
|
|
79
|
+
include Chef::Mixin::Deprecation
|
|
80
|
+
|
|
81
|
+
attr_accessor :params
|
|
82
|
+
attr_accessor :provider
|
|
83
|
+
attr_accessor :allowed_actions
|
|
84
|
+
attr_accessor :run_context
|
|
85
|
+
attr_accessor :cookbook_name
|
|
86
|
+
attr_accessor :recipe_name
|
|
87
|
+
attr_accessor :enclosing_provider
|
|
88
|
+
attr_accessor :source_line
|
|
89
|
+
|
|
90
|
+
attr_reader :updated
|
|
91
|
+
|
|
92
|
+
attr_reader :resource_name
|
|
93
|
+
attr_reader :not_if_args
|
|
94
|
+
attr_reader :only_if_args
|
|
95
|
+
|
|
96
|
+
# Each notify entry is a resource/action pair, modeled as an
|
|
97
|
+
# Struct with a #resource and #action member
|
|
98
|
+
attr_reader :immediate_notifications
|
|
99
|
+
attr_reader :delayed_notifications
|
|
100
|
+
|
|
101
|
+
def initialize(name, run_context=nil)
|
|
102
|
+
@name = name
|
|
103
|
+
@run_context = run_context
|
|
104
|
+
@noop = nil
|
|
105
|
+
@before = nil
|
|
106
|
+
@params = Hash.new
|
|
107
|
+
@provider = nil
|
|
108
|
+
@allowed_actions = [ :nothing ]
|
|
109
|
+
@action = :nothing
|
|
110
|
+
@updated = false
|
|
111
|
+
@updated_by_last_action = false
|
|
112
|
+
@supports = {}
|
|
113
|
+
@ignore_failure = false
|
|
114
|
+
@not_if = nil
|
|
115
|
+
@not_if_args = {}
|
|
116
|
+
@only_if = nil
|
|
117
|
+
@only_if_args = {}
|
|
118
|
+
@immediate_notifications = Array.new
|
|
119
|
+
@delayed_notifications = Array.new
|
|
120
|
+
@source_line = nil
|
|
121
|
+
|
|
122
|
+
@node = run_context ? deprecated_ivar(run_context.node, :node, :warn) : nil
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def updated=(true_or_false)
|
|
126
|
+
Chef::Log.warn("Chef::Resource#updated=(true|false) is deprecated. Please call #updated_by_last_action(true|false) instead.")
|
|
127
|
+
Chef::Log.warn("Called from:")
|
|
128
|
+
caller[0..3].each {|line| Chef::Log.warn(line)}
|
|
129
|
+
updated_by_last_action(true_or_false)
|
|
130
|
+
@updated = true_or_false
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def node
|
|
134
|
+
run_context && run_context.node
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# If an unknown method is invoked, determine whether the enclosing Provider's
|
|
138
|
+
# lexical scope can fulfill the request. E.g. This happens when the Resource's
|
|
139
|
+
# block invokes new_resource.
|
|
140
|
+
def method_missing(method_symbol, *args, &block)
|
|
141
|
+
if enclosing_provider && enclosing_provider.respond_to?(method_symbol)
|
|
142
|
+
enclosing_provider.send(method_symbol, *args, &block)
|
|
143
|
+
else
|
|
144
|
+
raise NoMethodError, "undefined method `#{method_symbol.to_s}' for #{self.class.to_s}"
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def load_prior_resource
|
|
149
|
+
begin
|
|
150
|
+
prior_resource = run_context.resource_collection.lookup(self.to_s)
|
|
151
|
+
Chef::Log.debug("Setting #{self.to_s} to the state of the prior #{self.to_s}")
|
|
152
|
+
prior_resource.instance_variables.each do |iv|
|
|
153
|
+
unless iv.to_sym == :@source_line || iv.to_sym == :@action
|
|
154
|
+
self.instance_variable_set(iv, prior_resource.instance_variable_get(iv))
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
true
|
|
158
|
+
rescue Chef::Exceptions::ResourceNotFound => e
|
|
159
|
+
true
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def supports(args={})
|
|
164
|
+
if args.any?
|
|
165
|
+
@supports = args
|
|
166
|
+
else
|
|
167
|
+
@supports
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
def provider(arg=nil)
|
|
172
|
+
klass = if arg.kind_of?(String) || arg.kind_of?(Symbol)
|
|
173
|
+
lookup_provider_constant(arg)
|
|
174
|
+
else
|
|
175
|
+
arg
|
|
176
|
+
end
|
|
177
|
+
set_or_return(
|
|
178
|
+
:provider,
|
|
179
|
+
klass,
|
|
180
|
+
:kind_of => [ Class ]
|
|
181
|
+
)
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def action(arg=nil)
|
|
185
|
+
if arg
|
|
186
|
+
action_list = arg.kind_of?(Array) ? arg : [ arg ]
|
|
187
|
+
action_list = action_list.collect { |a| a.to_sym }
|
|
188
|
+
action_list.each do |action|
|
|
189
|
+
validate(
|
|
190
|
+
{
|
|
191
|
+
:action => action,
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
:action => { :kind_of => Symbol, :equal_to => @allowed_actions },
|
|
195
|
+
}
|
|
196
|
+
)
|
|
197
|
+
end
|
|
198
|
+
@action = action_list
|
|
199
|
+
else
|
|
200
|
+
@action
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def name(name=nil)
|
|
205
|
+
set_if_args(@name, name) do
|
|
206
|
+
raise ArgumentError, "name must be a string!" unless name.kind_of?(String)
|
|
207
|
+
@name = name
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
def noop(tf=nil)
|
|
212
|
+
set_if_args(@noop, tf) do
|
|
213
|
+
raise ArgumentError, "noop must be true or false!" unless tf == true || tf == false
|
|
214
|
+
@noop = tf
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
def ignore_failure(arg=nil)
|
|
219
|
+
set_or_return(
|
|
220
|
+
:ignore_failure,
|
|
221
|
+
arg,
|
|
222
|
+
:kind_of => [ TrueClass, FalseClass ]
|
|
223
|
+
)
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
def epic_fail(arg=nil)
|
|
227
|
+
ignore_failure(arg)
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
def notifies(*args)
|
|
231
|
+
unless ( args.size > 0 && args.size < 4)
|
|
232
|
+
raise ArgumentError, "Wrong number of arguments for notifies: should be 1-3 arguments, you gave #{args.inspect}"
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
if args.size > 1 # notifies(:action, resource) OR notifies(:action, resource, :immediately)
|
|
236
|
+
add_notification(*args)
|
|
237
|
+
else
|
|
238
|
+
# This syntax is so weird. surely people will just give us one hash?
|
|
239
|
+
notifications = args.flatten
|
|
240
|
+
notifications.each do |resources_notifications|
|
|
241
|
+
resources_notifications.each do |resource, notification|
|
|
242
|
+
action, timing = notification[0], notification[1]
|
|
243
|
+
Chef::Log.debug "adding notification from resource #{self} to `#{resource.inspect}' => `#{notification.inspect}'"
|
|
244
|
+
add_notification(action, resource, timing)
|
|
245
|
+
end
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
rescue NoMethodError
|
|
249
|
+
Chef::Log.fatal("Error processing notifies(#{args.inspect}) on #{self}")
|
|
250
|
+
raise
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
def add_notification(action, resources, timing=:delayed)
|
|
254
|
+
resources = [resources].flatten
|
|
255
|
+
resources.each do |resource|
|
|
256
|
+
case timing.to_s
|
|
257
|
+
when 'delayed'
|
|
258
|
+
notifies_delayed(action, resource)
|
|
259
|
+
when 'immediate', 'immediately'
|
|
260
|
+
notifies_immediately(action, resource)
|
|
261
|
+
else
|
|
262
|
+
raise ArgumentError, "invalid timing: #{timing} for notifies(#{action}, #{resources.inspect}, #{timing}) resource #{self} "\
|
|
263
|
+
"Valid timings are: :delayed, :immediate, :immediately"
|
|
264
|
+
end
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
true
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
# Iterates over all immediate and delayed notifications, calling
|
|
271
|
+
# resolve_resource_reference on each in turn, causing them to
|
|
272
|
+
# resolve lazy/forward references.
|
|
273
|
+
def resolve_notification_references
|
|
274
|
+
@immediate_notifications.each { |n| n.resolve_resource_reference(run_context.resource_collection) }
|
|
275
|
+
@delayed_notifications.each {|n| n.resolve_resource_reference(run_context.resource_collection) }
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
def notifies_immediately(action, resource_spec)
|
|
279
|
+
@immediate_notifications << Notification.new(resource_spec, action, self)
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
def notifies_delayed(action, resource_spec)
|
|
283
|
+
@delayed_notifications << Notification.new(resource_spec, action, self)
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
def resources(*args)
|
|
287
|
+
run_context.resource_collection.find(*args)
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
def subscribes(action, resources, timing=:delayed)
|
|
291
|
+
resources = [resources].flatten
|
|
292
|
+
resources.each do |resource|
|
|
293
|
+
resource.notifies(action, self, timing)
|
|
294
|
+
end
|
|
295
|
+
true
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
def is(*args)
|
|
299
|
+
if args.size == 1
|
|
300
|
+
args.first
|
|
301
|
+
else
|
|
302
|
+
return *args
|
|
303
|
+
end
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
def to_s
|
|
307
|
+
"#{@resource_name}[#{@name}]"
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
def to_text
|
|
311
|
+
ivars = instance_variables.map { |ivar| ivar.to_sym } - HIDDEN_IVARS
|
|
312
|
+
text = "# Declared in #{@source_line}\n"
|
|
313
|
+
text << convert_to_snake_case(self.class.name, 'Chef::Resource') + "(\"#{name}\") do\n"
|
|
314
|
+
ivars.each do |ivar|
|
|
315
|
+
if (value = instance_variable_get(ivar)) && !(value.respond_to?(:empty?) && value.empty?)
|
|
316
|
+
text << " #{ivar.to_s.sub(/^@/,'')}(#{value.inspect})\n"
|
|
317
|
+
end
|
|
318
|
+
end
|
|
319
|
+
text << "end\n"
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
def inspect
|
|
323
|
+
ivars = instance_variables.map { |ivar| ivar.to_sym } - HIDDEN_IVARS
|
|
324
|
+
ivars.inject("<#{to_s}") do |str, ivar|
|
|
325
|
+
str << " #{ivar}: #{instance_variable_get(ivar).inspect}"
|
|
326
|
+
end << ">"
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
# Serialize this object as a hash
|
|
330
|
+
def to_json(*a)
|
|
331
|
+
instance_vars = Hash.new
|
|
332
|
+
self.instance_variables.each do |iv|
|
|
333
|
+
unless iv == "@run_context"
|
|
334
|
+
instance_vars[iv] = self.instance_variable_get(iv)
|
|
335
|
+
end
|
|
336
|
+
end
|
|
337
|
+
results = {
|
|
338
|
+
'json_class' => self.class.name,
|
|
339
|
+
'instance_vars' => instance_vars
|
|
340
|
+
}
|
|
341
|
+
results.to_json(*a)
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
def to_hash
|
|
345
|
+
instance_vars = Hash.new
|
|
346
|
+
self.instance_variables.each do |iv|
|
|
347
|
+
key = iv.to_s.sub(/^@/,'').to_sym
|
|
348
|
+
instance_vars[key] = self.instance_variable_get(iv) unless (key == :run_context) || (key == :node)
|
|
349
|
+
end
|
|
350
|
+
instance_vars
|
|
351
|
+
end
|
|
352
|
+
|
|
353
|
+
def only_if(arg=nil, args = {}, &blk)
|
|
354
|
+
if Kernel.block_given?
|
|
355
|
+
@only_if = blk
|
|
356
|
+
@only_if_args = args
|
|
357
|
+
else
|
|
358
|
+
@only_if = arg if arg
|
|
359
|
+
@only_if_args = args if arg
|
|
360
|
+
end
|
|
361
|
+
@only_if
|
|
362
|
+
end
|
|
363
|
+
|
|
364
|
+
def not_if(arg=nil, args = {}, &blk)
|
|
365
|
+
if Kernel.block_given?
|
|
366
|
+
@not_if = blk
|
|
367
|
+
@not_if_args = args
|
|
368
|
+
else
|
|
369
|
+
@not_if = arg if arg
|
|
370
|
+
@not_if_args = args if arg
|
|
371
|
+
end
|
|
372
|
+
@not_if
|
|
373
|
+
end
|
|
374
|
+
|
|
375
|
+
def run_action(action)
|
|
376
|
+
# ensure that we don't leave @updated_by_last_action set to true
|
|
377
|
+
# on accident
|
|
378
|
+
updated_by_last_action(false)
|
|
379
|
+
|
|
380
|
+
# Check if this resource has an only_if block -- if it does,
|
|
381
|
+
# evaluate the only_if block and skip the resource if
|
|
382
|
+
# appropriate.
|
|
383
|
+
if only_if
|
|
384
|
+
unless Chef::Mixin::Command.only_if(only_if, only_if_args)
|
|
385
|
+
Chef::Log.debug("Skipping #{self} due to only_if")
|
|
386
|
+
return
|
|
387
|
+
end
|
|
388
|
+
end
|
|
389
|
+
|
|
390
|
+
# Check if this resource has a not_if block -- if it does,
|
|
391
|
+
# evaluate the not_if block and skip the resource if
|
|
392
|
+
# appropriate.
|
|
393
|
+
if not_if
|
|
394
|
+
unless Chef::Mixin::Command.not_if(not_if, not_if_args)
|
|
395
|
+
Chef::Log.debug("Skipping #{self} due to not_if")
|
|
396
|
+
return
|
|
397
|
+
end
|
|
398
|
+
end
|
|
399
|
+
|
|
400
|
+
provider = Chef::Platform.provider_for_resource(self)
|
|
401
|
+
provider.load_current_resource
|
|
402
|
+
provider.send("action_#{action}")
|
|
403
|
+
end
|
|
404
|
+
|
|
405
|
+
def updated_by_last_action(true_or_false)
|
|
406
|
+
@updated ||= true_or_false
|
|
407
|
+
@updated_by_last_action = true_or_false
|
|
408
|
+
end
|
|
409
|
+
|
|
410
|
+
def updated_by_last_action?
|
|
411
|
+
@updated_by_last_action
|
|
412
|
+
end
|
|
413
|
+
|
|
414
|
+
def updated?
|
|
415
|
+
updated
|
|
416
|
+
end
|
|
417
|
+
|
|
418
|
+
class << self
|
|
419
|
+
|
|
420
|
+
def json_create(o)
|
|
421
|
+
resource = self.new(o["instance_vars"]["@name"])
|
|
422
|
+
o["instance_vars"].each do |k,v|
|
|
423
|
+
resource.instance_variable_set(k.to_sym, v)
|
|
424
|
+
end
|
|
425
|
+
resource
|
|
426
|
+
end
|
|
427
|
+
|
|
428
|
+
include Chef::Mixin::ConvertToClassName
|
|
429
|
+
|
|
430
|
+
def attribute(attr_name, validation_opts={})
|
|
431
|
+
# This atrocity is the only way to support 1.8 and 1.9 at the same time
|
|
432
|
+
# When you're ready to drop 1.8 support, do this:
|
|
433
|
+
# define_method attr_name.to_sym do |arg=nil|
|
|
434
|
+
# etc.
|
|
435
|
+
shim_method=<<-SHIM
|
|
436
|
+
def #{attr_name}(arg=nil)
|
|
437
|
+
_set_or_return_#{attr_name}(arg)
|
|
438
|
+
end
|
|
439
|
+
SHIM
|
|
440
|
+
class_eval(shim_method)
|
|
441
|
+
|
|
442
|
+
define_method("_set_or_return_#{attr_name.to_s}".to_sym) do |arg|
|
|
443
|
+
set_or_return(attr_name.to_sym, arg, validation_opts)
|
|
444
|
+
end
|
|
445
|
+
end
|
|
446
|
+
|
|
447
|
+
def build_from_file(cookbook_name, filename)
|
|
448
|
+
rname = filename_to_qualified_string(cookbook_name, filename)
|
|
449
|
+
|
|
450
|
+
# Add log entry if we override an existing light-weight resource.
|
|
451
|
+
class_name = convert_to_class_name(rname)
|
|
452
|
+
overriding = Chef::Resource.const_defined?(class_name)
|
|
453
|
+
Chef::Log.info("#{class_name} light-weight resource already initialized -- overriding!") if overriding
|
|
454
|
+
|
|
455
|
+
new_resource_class = Class.new self do |cls|
|
|
456
|
+
|
|
457
|
+
# default initialize method that ensures that when initialize is finally
|
|
458
|
+
# wrapped (see below), super is called in the event that the resource
|
|
459
|
+
# definer does not implement initialize
|
|
460
|
+
def initialize(name, run_context)
|
|
461
|
+
super(name, run_context)
|
|
462
|
+
end
|
|
463
|
+
|
|
464
|
+
@actions_to_create = []
|
|
465
|
+
|
|
466
|
+
class << cls
|
|
467
|
+
include Chef::Mixin::FromFile
|
|
468
|
+
|
|
469
|
+
def actions_to_create
|
|
470
|
+
@actions_to_create
|
|
471
|
+
end
|
|
472
|
+
|
|
473
|
+
define_method(:actions) do |*action_names|
|
|
474
|
+
actions_to_create.push(*action_names)
|
|
475
|
+
end
|
|
476
|
+
end
|
|
477
|
+
|
|
478
|
+
# load resource definition from file
|
|
479
|
+
cls.class_from_file(filename)
|
|
480
|
+
|
|
481
|
+
# create a new constructor that wraps the old one and adds the actions
|
|
482
|
+
# specified in the DSL
|
|
483
|
+
old_init = instance_method(:initialize)
|
|
484
|
+
|
|
485
|
+
define_method(:initialize) do |name, *optional_args|
|
|
486
|
+
args_run_context = optional_args.shift
|
|
487
|
+
@resource_name = rname.to_sym
|
|
488
|
+
old_init.bind(self).call(name, args_run_context)
|
|
489
|
+
allowed_actions.push(self.class.actions_to_create).flatten!
|
|
490
|
+
end
|
|
491
|
+
end
|
|
492
|
+
|
|
493
|
+
# register new class as a Chef::Resource
|
|
494
|
+
class_name = convert_to_class_name(rname)
|
|
495
|
+
Chef::Resource.const_set(class_name, new_resource_class)
|
|
496
|
+
Chef::Log.debug("Loaded contents of #{filename} into a resource named #{rname} defined in Chef::Resource::#{class_name}")
|
|
497
|
+
|
|
498
|
+
new_resource_class
|
|
499
|
+
end
|
|
500
|
+
|
|
501
|
+
# Resources that want providers namespaced somewhere other than
|
|
502
|
+
# Chef::Provider can set the namespace with +provider_base+
|
|
503
|
+
# Ex:
|
|
504
|
+
# class MyResource < Chef::Resource
|
|
505
|
+
# provider_base Chef::Provider::Deploy
|
|
506
|
+
# # ...other stuff
|
|
507
|
+
# end
|
|
508
|
+
def provider_base(arg=nil)
|
|
509
|
+
@provider_base ||= arg
|
|
510
|
+
@provider_base ||= Chef::Provider
|
|
511
|
+
end
|
|
512
|
+
|
|
513
|
+
end
|
|
514
|
+
|
|
515
|
+
private
|
|
516
|
+
|
|
517
|
+
def lookup_provider_constant(name)
|
|
518
|
+
begin
|
|
519
|
+
self.class.provider_base.const_get(convert_to_class_name(name.to_s))
|
|
520
|
+
rescue NameError => e
|
|
521
|
+
if e.to_s =~ /#{Regexp.escape(self.class.provider_base.to_s)}/
|
|
522
|
+
raise ArgumentError, "No provider found to match '#{name}'"
|
|
523
|
+
else
|
|
524
|
+
raise e
|
|
525
|
+
end
|
|
526
|
+
end
|
|
527
|
+
end
|
|
528
|
+
|
|
529
|
+
end
|
|
530
|
+
end
|