mbailey-chef 0.9.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +201 -0
- data/README.rdoc +172 -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/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 +832 -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 +7 -0
- data/distro/debian/etc/default/chef-solr-indexer +7 -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/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 +177 -0
- data/distro/debian/etc/init.d/chef-solr-indexer +176 -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/api_client.rb +264 -0
- data/lib/chef/application/agent.rb +18 -0
- data/lib/chef/application/client.rb +246 -0
- data/lib/chef/application/knife.rb +171 -0
- data/lib/chef/application/solo.rb +215 -0
- data/lib/chef/application.rb +127 -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 +173 -0
- data/lib/chef/client.rb +304 -0
- data/lib/chef/config.rb +240 -0
- data/lib/chef/cookbook/cookbook_collection.rb +44 -0
- data/lib/chef/cookbook/file_system_file_vendor.rb +54 -0
- data/lib/chef/cookbook/file_vendor.rb +48 -0
- data/lib/chef/cookbook/metadata/version.rb +87 -0
- data/lib/chef/cookbook/metadata.rb +500 -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 +227 -0
- data/lib/chef/cookbook_site_streaming_uploader.rb +244 -0
- data/lib/chef/cookbook_uploader.rb +103 -0
- data/lib/chef/cookbook_version.rb +930 -0
- data/lib/chef/couchdb.rb +239 -0
- data/lib/chef/daemon.rb +172 -0
- data/lib/chef/data_bag.rb +215 -0
- data/lib/chef/data_bag_item.rb +228 -0
- data/lib/chef/exceptions.rb +66 -0
- data/lib/chef/file_access_control.rb +140 -0
- data/lib/chef/file_cache.rb +218 -0
- data/lib/chef/handler/json_file.rb +58 -0
- data/lib/chef/handler.rb +206 -0
- data/lib/chef/index_queue/amqp_client.rb +113 -0
- data/lib/chef/index_queue/consumer.rb +76 -0
- data/lib/chef/index_queue/indexable.rb +76 -0
- data/lib/chef/index_queue.rb +29 -0
- data/lib/chef/knife/bootstrap/archlinux-gems.erb +44 -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 +43 -0
- data/lib/chef/knife/bootstrap/windows-gems.erb +34 -0
- data/lib/chef/knife/bootstrap.rb +181 -0
- data/lib/chef/knife/client_bulk_delete.rb +40 -0
- data/lib/chef/knife/client_create.rb +70 -0
- data/lib/chef/knife/client_delete.rb +45 -0
- data/lib/chef/knife/client_edit.rb +45 -0
- data/lib/chef/knife/client_list.rb +40 -0
- data/lib/chef/knife/client_reregister.rb +56 -0
- data/lib/chef/knife/client_show.rb +50 -0
- data/lib/chef/knife/configure.rb +140 -0
- data/lib/chef/knife/configure_client.rb +52 -0
- data/lib/chef/knife/cookbook_bulk_delete.rb +58 -0
- data/lib/chef/knife/cookbook_create.rb +209 -0
- data/lib/chef/knife/cookbook_delete.rb +143 -0
- data/lib/chef/knife/cookbook_download.rb +130 -0
- data/lib/chef/knife/cookbook_list.rb +41 -0
- data/lib/chef/knife/cookbook_metadata.rb +82 -0
- data/lib/chef/knife/cookbook_metadata_from_file.rb +40 -0
- data/lib/chef/knife/cookbook_show.rb +98 -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 +109 -0
- data/lib/chef/knife/cookbook_site_show.rb +57 -0
- data/lib/chef/knife/cookbook_site_unshare.rb +52 -0
- data/lib/chef/knife/cookbook_site_vendor.rb +133 -0
- data/lib/chef/knife/cookbook_test.rb +82 -0
- data/lib/chef/knife/cookbook_upload.rb +95 -0
- data/lib/chef/knife/data_bag_create.rb +59 -0
- data/lib/chef/knife/data_bag_delete.rb +48 -0
- data/lib/chef/knife/data_bag_edit.rb +50 -0
- data/lib/chef/knife/data_bag_from_file.rb +44 -0
- data/lib/chef/knife/data_bag_list.rb +43 -0
- data/lib/chef/knife/data_bag_show.rb +41 -0
- data/lib/chef/knife/ec2_instance_data.rb +46 -0
- data/lib/chef/knife/ec2_server_create.rb +216 -0
- data/lib/chef/knife/ec2_server_delete.rb +90 -0
- data/lib/chef/knife/ec2_server_list.rb +88 -0
- data/lib/chef/knife/exec.rb +52 -0
- data/lib/chef/knife/index_rebuild.rb +51 -0
- data/lib/chef/knife/node_bulk_delete.rb +43 -0
- data/lib/chef/knife/node_create.rb +47 -0
- data/lib/chef/knife/node_delete.rb +44 -0
- data/lib/chef/knife/node_edit.rb +44 -0
- data/lib/chef/knife/node_from_file.rb +42 -0
- data/lib/chef/knife/node_list.rb +41 -0
- data/lib/chef/knife/node_run_list_add.rb +64 -0
- data/lib/chef/knife/node_run_list_remove.rb +45 -0
- data/lib/chef/knife/node_show.rb +54 -0
- data/lib/chef/knife/rackspace_server_create.rb +156 -0
- data/lib/chef/knife/rackspace_server_delete.rb +57 -0
- data/lib/chef/knife/rackspace_server_list.rb +59 -0
- data/lib/chef/knife/recipe_list.rb +32 -0
- data/lib/chef/knife/role_bulk_delete.rb +44 -0
- data/lib/chef/knife/role_create.rb +52 -0
- data/lib/chef/knife/role_delete.rb +44 -0
- data/lib/chef/knife/role_edit.rb +45 -0
- data/lib/chef/knife/role_from_file.rb +46 -0
- data/lib/chef/knife/role_list.rb +40 -0
- data/lib/chef/knife/role_show.rb +51 -0
- data/lib/chef/knife/search.rb +94 -0
- data/lib/chef/knife/slicehost_images_list.rb +53 -0
- data/lib/chef/knife/slicehost_server_create.rb +103 -0
- data/lib/chef/knife/slicehost_server_delete.rb +61 -0
- data/lib/chef/knife/slicehost_server_list.rb +64 -0
- data/lib/chef/knife/ssh.rb +328 -0
- data/lib/chef/knife/status.rb +87 -0
- data/lib/chef/knife/terremark_server_create.rb +152 -0
- data/lib/chef/knife/terremark_server_delete.rb +87 -0
- data/lib/chef/knife/terremark_server_list.rb +77 -0
- data/lib/chef/knife/windows_bootstrap.rb +154 -0
- data/lib/chef/knife.rb +522 -0
- data/lib/chef/log.rb +61 -0
- data/lib/chef/mixin/check_helper.rb +31 -0
- data/lib/chef/mixin/checksum.rb +32 -0
- data/lib/chef/mixin/command/unix.rb +215 -0
- data/lib/chef/mixin/command/windows.rb +72 -0
- data/lib/chef/mixin/command.rb +220 -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/find_preferred_file.rb +92 -0
- data/lib/chef/mixin/from_file.rb +50 -0
- data/lib/chef/mixin/language.rb +156 -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 +38 -0
- data/lib/chef/mixin/template.rb +95 -0
- data/lib/chef/mixin/xml_escape.rb +140 -0
- data/lib/chef/mixins.rb +16 -0
- data/lib/chef/monkey_patches/dir.rb +36 -0
- data/lib/chef/monkey_patches/string.rb +28 -0
- data/lib/chef/monkey_patches/tempfile.rb +64 -0
- data/lib/chef/node/attribute.rb +465 -0
- data/lib/chef/node.rb +601 -0
- data/lib/chef/openid_registration.rb +187 -0
- data/lib/chef/platform.rb +371 -0
- data/lib/chef/provider/breakpoint.rb +36 -0
- data/lib/chef/provider/cookbook_file.rb +100 -0
- data/lib/chef/provider/cron/solaris.rb +195 -0
- data/lib/chef/provider/cron.rb +186 -0
- data/lib/chef/provider/deploy/revision.rb +73 -0
- data/lib/chef/provider/deploy/timestamped.rb +33 -0
- data/lib/chef/provider/deploy.rb +319 -0
- data/lib/chef/provider/directory.rb +72 -0
- data/lib/chef/provider/env/windows.rb +75 -0
- data/lib/chef/provider/env.rb +152 -0
- data/lib/chef/provider/erl_call.rb +72 -0
- data/lib/chef/provider/execute.rb +58 -0
- data/lib/chef/provider/file.rb +213 -0
- data/lib/chef/provider/git.rb +211 -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 +78 -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/group.rb +133 -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/mount.rb +232 -0
- data/lib/chef/provider/mount/windows.rb +80 -0
- data/lib/chef/provider/mount.rb +117 -0
- data/lib/chef/provider/ohai.rb +41 -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 +114 -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 +124 -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 +222 -0
- data/lib/chef/provider/package/zypper.rb +133 -0
- data/lib/chef/provider/package.rb +160 -0
- data/lib/chef/provider/remote_directory.rb +140 -0
- data/lib/chef/provider/remote_file.rb +120 -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/arch.rb +109 -0
- data/lib/chef/provider/service/debian.rb +105 -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/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 +129 -0
- data/lib/chef/provider/service.rb +128 -0
- data/lib/chef/provider/subversion.rb +159 -0
- data/lib/chef/provider/template.rb +105 -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/provider/user.rb +187 -0
- data/lib/chef/provider.rb +124 -0
- data/lib/chef/providers.rb +91 -0
- data/lib/chef/recipe.rb +130 -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 +41 -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 +92 -0
- data/lib/chef/resource/freebsd_package.rb +35 -0
- data/lib/chef/resource/gem_package.rb +49 -0
- data/lib/chef/resource/git.rb +36 -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 +146 -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.rb +523 -0
- data/lib/chef/resource_collection/stepable_iterator.rb +124 -0
- data/lib/chef/resource_collection.rb +217 -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/auth_credentials.rb +78 -0
- data/lib/chef/rest/cookie_jar.rb +31 -0
- data/lib/chef/rest/rest_request.rb +188 -0
- data/lib/chef/rest.rb +394 -0
- data/lib/chef/role.rb +287 -0
- data/lib/chef/run_context.rb +110 -0
- data/lib/chef/run_list/run_list_expansion.rb +172 -0
- data/lib/chef/run_list/run_list_item.rb +78 -0
- data/lib/chef/run_list.rb +150 -0
- data/lib/chef/run_status.rb +121 -0
- data/lib/chef/runner.rb +107 -0
- data/lib/chef/sandbox.rb +153 -0
- data/lib/chef/search/query.rb +60 -0
- data/lib/chef/shef/ext.rb +568 -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 +271 -0
- data/lib/chef/shef.rb +325 -0
- data/lib/chef/shell_out.rb +413 -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/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/util/windows.rb +56 -0
- data/lib/chef/version.rb +21 -0
- data/lib/chef/webui_user.rb +231 -0
- data/lib/chef.rb +39 -0
- metadata +533 -0
data/lib/chef/role.rb
ADDED
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
3
|
+
# Author:: Nuo Yan (<nuo@opscode.com>)
|
|
4
|
+
# Author:: Christopher Brown (<cb@opscode.com>)
|
|
5
|
+
# Copyright:: Copyright (c) 2008 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/mixin/params_validate'
|
|
23
|
+
require 'chef/mixin/from_file'
|
|
24
|
+
require 'chef/couchdb'
|
|
25
|
+
require 'chef/run_list'
|
|
26
|
+
require 'chef/index_queue'
|
|
27
|
+
require 'extlib'
|
|
28
|
+
require 'json'
|
|
29
|
+
|
|
30
|
+
class Chef
|
|
31
|
+
class Role
|
|
32
|
+
|
|
33
|
+
include Chef::Mixin::FromFile
|
|
34
|
+
include Chef::Mixin::ParamsValidate
|
|
35
|
+
include Chef::IndexQueue::Indexable
|
|
36
|
+
|
|
37
|
+
DESIGN_DOCUMENT = {
|
|
38
|
+
"version" => 6,
|
|
39
|
+
"language" => "javascript",
|
|
40
|
+
"views" => {
|
|
41
|
+
"all" => {
|
|
42
|
+
"map" => <<-EOJS
|
|
43
|
+
function(doc) {
|
|
44
|
+
if (doc.chef_type == "role") {
|
|
45
|
+
emit(doc.name, doc);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
EOJS
|
|
49
|
+
},
|
|
50
|
+
"all_id" => {
|
|
51
|
+
"map" => <<-EOJS
|
|
52
|
+
function(doc) {
|
|
53
|
+
if (doc.chef_type == "role") {
|
|
54
|
+
emit(doc.name, doc.name);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
EOJS
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
attr_accessor :couchdb_rev, :couchdb
|
|
63
|
+
attr_reader :couchdb_id
|
|
64
|
+
|
|
65
|
+
# Create a new Chef::Role object.
|
|
66
|
+
def initialize(couchdb=nil)
|
|
67
|
+
@name = ''
|
|
68
|
+
@description = ''
|
|
69
|
+
@default_attributes = Mash.new
|
|
70
|
+
@override_attributes = Mash.new
|
|
71
|
+
@run_list = Chef::RunList.new
|
|
72
|
+
@couchdb_rev = nil
|
|
73
|
+
@couchdb_id = nil
|
|
74
|
+
@couchdb = couchdb || Chef::CouchDB.new
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def couchdb_id=(value)
|
|
78
|
+
@couchdb_id = value
|
|
79
|
+
self.index_id = value
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def chef_server_rest
|
|
83
|
+
Chef::REST.new(Chef::Config[:chef_server_url])
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def self.chef_server_rest
|
|
87
|
+
Chef::REST.new(Chef::Config[:chef_server_url])
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def name(arg=nil)
|
|
91
|
+
set_or_return(
|
|
92
|
+
:name,
|
|
93
|
+
arg,
|
|
94
|
+
:regex => /^[\-[:alnum:]_]+$/
|
|
95
|
+
)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def description(arg=nil)
|
|
99
|
+
set_or_return(
|
|
100
|
+
:description,
|
|
101
|
+
arg,
|
|
102
|
+
:kind_of => String
|
|
103
|
+
)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def run_list(*args)
|
|
107
|
+
(args.length > 0) ? @run_list.reset!(args) : @run_list
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
alias_method :recipes, :run_list
|
|
111
|
+
|
|
112
|
+
# def recipes(*args)
|
|
113
|
+
# Chef::Log.warn "Chef::Role#recipes method is deprecated. Please use Chef::Role#run_list"
|
|
114
|
+
# run_list(*args)
|
|
115
|
+
# end
|
|
116
|
+
|
|
117
|
+
def default_attributes(arg=nil)
|
|
118
|
+
set_or_return(
|
|
119
|
+
:default_attributes,
|
|
120
|
+
arg,
|
|
121
|
+
:kind_of => Hash
|
|
122
|
+
)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def override_attributes(arg=nil)
|
|
126
|
+
set_or_return(
|
|
127
|
+
:override_attributes,
|
|
128
|
+
arg,
|
|
129
|
+
:kind_of => Hash
|
|
130
|
+
)
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def to_hash
|
|
134
|
+
result = {
|
|
135
|
+
"name" => @name,
|
|
136
|
+
"description" => @description,
|
|
137
|
+
'json_class' => self.class.name,
|
|
138
|
+
"default_attributes" => @default_attributes,
|
|
139
|
+
"override_attributes" => @override_attributes,
|
|
140
|
+
"chef_type" => "role",
|
|
141
|
+
"run_list" => @run_list.run_list
|
|
142
|
+
}
|
|
143
|
+
result["_rev"] = couchdb_rev if couchdb_rev
|
|
144
|
+
result
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# Serialize this object as a hash
|
|
148
|
+
def to_json(*a)
|
|
149
|
+
to_hash.to_json(*a)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# Create a Chef::Role from JSON
|
|
153
|
+
def self.json_create(o)
|
|
154
|
+
role = new
|
|
155
|
+
role.name(o["name"])
|
|
156
|
+
role.description(o["description"])
|
|
157
|
+
role.default_attributes(o["default_attributes"])
|
|
158
|
+
role.override_attributes(o["override_attributes"])
|
|
159
|
+
role.run_list(if o.has_key?("run_list")
|
|
160
|
+
o["run_list"]
|
|
161
|
+
else
|
|
162
|
+
o["recipes"]
|
|
163
|
+
end)
|
|
164
|
+
role.couchdb_rev = o["_rev"] if o.has_key?("_rev")
|
|
165
|
+
role.index_id = role.couchdb_id
|
|
166
|
+
role.couchdb_id = o["_id"] if o.has_key?("_id")
|
|
167
|
+
role
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
# List all the Chef::Role objects in the CouchDB. If inflate is set to true, you will get
|
|
171
|
+
# the full list of all Roles, fully inflated.
|
|
172
|
+
def self.cdb_list(inflate=false, couchdb=nil)
|
|
173
|
+
rs = (couchdb || Chef::CouchDB.new).list("roles", inflate)
|
|
174
|
+
lookup = (inflate ? "value" : "key")
|
|
175
|
+
rs["rows"].collect { |r| r[lookup] }
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
# Get the list of all roles from the API.
|
|
179
|
+
def self.list(inflate=false)
|
|
180
|
+
if inflate
|
|
181
|
+
response = Hash.new
|
|
182
|
+
Chef::Search::Query.new.search(:role) do |n|
|
|
183
|
+
response[n.name] = n unless n.nil?
|
|
184
|
+
end
|
|
185
|
+
response
|
|
186
|
+
else
|
|
187
|
+
chef_server_rest.get_rest("roles")
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
# Load a role by name from CouchDB
|
|
192
|
+
def self.cdb_load(name, couchdb=nil)
|
|
193
|
+
(couchdb || Chef::CouchDB.new).load("role", name)
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
# Load a role by name from the API
|
|
197
|
+
def self.load(name)
|
|
198
|
+
chef_server_rest.get_rest("roles/#{name}")
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
def self.exists?(rolename, couchdb)
|
|
202
|
+
begin
|
|
203
|
+
self.cdb_load(rolename, couchdb)
|
|
204
|
+
rescue Chef::Exceptions::CouchDBNotFound
|
|
205
|
+
nil
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
# Remove this role from the CouchDB
|
|
210
|
+
def cdb_destroy
|
|
211
|
+
couchdb.delete("role", @name, couchdb_rev)
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
# Remove this role via the REST API
|
|
215
|
+
def destroy
|
|
216
|
+
chef_server_rest.delete_rest("roles/#{@name}")
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
# Save this role to the CouchDB
|
|
220
|
+
def cdb_save
|
|
221
|
+
self.couchdb_rev = couchdb.store("role", @name, self)["rev"]
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
# Save this role via the REST API
|
|
225
|
+
def save
|
|
226
|
+
begin
|
|
227
|
+
chef_server_rest.put_rest("roles/#{@name}", self)
|
|
228
|
+
rescue Net::HTTPServerException => e
|
|
229
|
+
raise e unless e.response.code == "404"
|
|
230
|
+
chef_server_rest.post_rest("roles", self)
|
|
231
|
+
end
|
|
232
|
+
self
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
# Create the role via the REST API
|
|
236
|
+
def create
|
|
237
|
+
chef_server_rest.post_rest("roles", self)
|
|
238
|
+
self
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
# Set up our CouchDB design document
|
|
242
|
+
def self.create_design_document(couchdb=nil)
|
|
243
|
+
(couchdb || Chef::CouchDB.new).create_design_document("roles", DESIGN_DOCUMENT)
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
# As a string
|
|
247
|
+
def to_s
|
|
248
|
+
"role[#{@name}]"
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
# Load a role from disk - prefers to load the JSON, but will happily load
|
|
252
|
+
# the raw rb files as well.
|
|
253
|
+
def self.from_disk(name, force=nil)
|
|
254
|
+
js_file = File.join(Chef::Config[:role_path], "#{name}.json")
|
|
255
|
+
rb_file = File.join(Chef::Config[:role_path], "#{name}.rb")
|
|
256
|
+
|
|
257
|
+
if File.exists?(js_file) || force == "json"
|
|
258
|
+
JSON.parse(IO.read(js_file))
|
|
259
|
+
elsif File.exists?(rb_file) || force == "ruby"
|
|
260
|
+
role = Chef::Role.new
|
|
261
|
+
role.name(name)
|
|
262
|
+
role.from_file(rb_file)
|
|
263
|
+
role
|
|
264
|
+
else
|
|
265
|
+
raise Chef::Exceptions::RoleNotFound, "Role '#{name}' could not be loaded from disk"
|
|
266
|
+
end
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
# Sync all the json roles with couchdb from disk
|
|
270
|
+
def self.sync_from_disk_to_couchdb
|
|
271
|
+
Dir[File.join(Chef::Config[:role_path], "*.json")].each do |role_file|
|
|
272
|
+
short_name = File.basename(role_file, ".json")
|
|
273
|
+
Chef::Log.warn("Loading #{short_name}")
|
|
274
|
+
r = Chef::Role.from_disk(short_name, "json")
|
|
275
|
+
begin
|
|
276
|
+
couch_role = Chef::Role.cdb_load(short_name)
|
|
277
|
+
r.couchdb_rev = couch_role.couchdb_rev
|
|
278
|
+
Chef::Log.debug("Replacing role #{short_name} with data from #{role_file}")
|
|
279
|
+
rescue Chef::Exceptions::CouchDBNotFound
|
|
280
|
+
Chef::Log.debug("Creating role #{short_name} with data from #{role_file}")
|
|
281
|
+
end
|
|
282
|
+
r.cdb_save
|
|
283
|
+
end
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
end
|
|
287
|
+
end
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
3
|
+
# Author:: Christopher Walters (<cw@opscode.com>)
|
|
4
|
+
# Author:: Tim Hinderliter (<tim@opscode.com>)
|
|
5
|
+
# Copyright:: Copyright (c) 2008-2010 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
|
+
require 'chef/resource_collection'
|
|
21
|
+
require 'chef/node'
|
|
22
|
+
require 'chef/role'
|
|
23
|
+
require 'chef/log'
|
|
24
|
+
require 'chef/mixin/language_include_recipe'
|
|
25
|
+
|
|
26
|
+
class Chef
|
|
27
|
+
# == Chef::RunContext
|
|
28
|
+
# Value object that loads and tracks the context of a Chef run
|
|
29
|
+
class RunContext
|
|
30
|
+
|
|
31
|
+
# Used to load the node's recipes after expanding its run list
|
|
32
|
+
include Chef::Mixin::LanguageIncludeRecipe
|
|
33
|
+
|
|
34
|
+
attr_reader :node, :cookbook_collection, :definitions
|
|
35
|
+
|
|
36
|
+
# Needs to be settable so deploy can run a resource_collection independent
|
|
37
|
+
# of any cookbooks.
|
|
38
|
+
attr_accessor :resource_collection
|
|
39
|
+
|
|
40
|
+
# Creates a new Chef::RunContext object and populates its fields. This object gets
|
|
41
|
+
# used by the Chef Server to generate a fully compiled recipe list for a node.
|
|
42
|
+
#
|
|
43
|
+
# === Returns
|
|
44
|
+
# object<Chef::RunContext>:: Duh. :)
|
|
45
|
+
def initialize(node, cookbook_collection)
|
|
46
|
+
@node = node
|
|
47
|
+
@cookbook_collection = cookbook_collection
|
|
48
|
+
@resource_collection = Chef::ResourceCollection.new
|
|
49
|
+
@definitions = Hash.new
|
|
50
|
+
|
|
51
|
+
# TODO: 5/18/2010 cw/timh - See note on Chef::Node's
|
|
52
|
+
# cookbook_collection attr_accessor
|
|
53
|
+
node.cookbook_collection = cookbook_collection
|
|
54
|
+
|
|
55
|
+
load
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def load
|
|
59
|
+
foreach_cookbook_load_segment(:libraries) do |cookbook_name, filename|
|
|
60
|
+
Chef::Log.debug("Loading cookbook #{cookbook_name}'s library file: #{filename}")
|
|
61
|
+
require filename
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
foreach_cookbook_load_segment(:providers) do |cookbook_name, filename|
|
|
65
|
+
Chef::Log.debug("Loading cookbook #{cookbook_name}'s providers from #{filename}")
|
|
66
|
+
Chef::Provider.build_from_file(cookbook_name, filename)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
foreach_cookbook_load_segment(:resources) do |cookbook_name, filename|
|
|
70
|
+
Chef::Log.debug("Loading cookbook #{cookbook_name}'s resources from #{filename}")
|
|
71
|
+
Chef::Resource.build_from_file(cookbook_name, filename)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
node.load_attributes
|
|
75
|
+
|
|
76
|
+
foreach_cookbook_load_segment(:definitions) do |cookbook_name, filename|
|
|
77
|
+
Chef::Log.debug("Loading cookbook #{cookbook_name}'s definitions from #{filename}")
|
|
78
|
+
resourcelist = Chef::ResourceDefinitionList.new
|
|
79
|
+
resourcelist.from_file(filename)
|
|
80
|
+
definitions.merge!(resourcelist.defines) do |key, oldval, newval|
|
|
81
|
+
Chef::Log.info("Overriding duplicate definition #{key}, new found in #{filename}")
|
|
82
|
+
newval
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Retrieve the fully expanded list of recipes for the node by
|
|
87
|
+
# resolving roles; this step also merges attributes into the
|
|
88
|
+
# node from the roles/recipes included.
|
|
89
|
+
recipe_names = node.expand!
|
|
90
|
+
|
|
91
|
+
recipe_names.each do |recipe_name|
|
|
92
|
+
# TODO: timh/cw, 5-14-2010: It's distasteful to be including
|
|
93
|
+
# the DSL in a class outside the context of the DSL
|
|
94
|
+
include_recipe(recipe_name)
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
private
|
|
99
|
+
|
|
100
|
+
def foreach_cookbook_load_segment(segment, &block)
|
|
101
|
+
cookbook_collection.each do |cookbook_name, cookbook|
|
|
102
|
+
segment_filenames = cookbook.segment_filenames(segment)
|
|
103
|
+
segment_filenames.each do |segment_filename|
|
|
104
|
+
block.call(cookbook_name, segment_filename)
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
end
|
|
110
|
+
end
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Daniel DeLeo (<dan@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2010 Opscode, Inc.
|
|
4
|
+
# License:: Apache License, Version 2.0
|
|
5
|
+
#
|
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
# you may not use this file except in compliance with the License.
|
|
8
|
+
# You may obtain a copy of the License at
|
|
9
|
+
#
|
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
#
|
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
# See the License for the specific language governing permissions and
|
|
16
|
+
# limitations under the License.
|
|
17
|
+
|
|
18
|
+
require 'extlib'
|
|
19
|
+
|
|
20
|
+
require 'chef/mixin/deep_merge'
|
|
21
|
+
|
|
22
|
+
require 'chef/role'
|
|
23
|
+
require 'chef/couchdb'
|
|
24
|
+
require 'chef/rest'
|
|
25
|
+
|
|
26
|
+
class Chef
|
|
27
|
+
class RunList
|
|
28
|
+
# Abstract Base class for expanding a run list. Subclasses must handle
|
|
29
|
+
# fetching roles from a data source by defining +fetch_role+
|
|
30
|
+
class RunListExpansion
|
|
31
|
+
|
|
32
|
+
attr_reader :run_list_items
|
|
33
|
+
|
|
34
|
+
attr_reader :recipes
|
|
35
|
+
|
|
36
|
+
attr_reader :default_attrs
|
|
37
|
+
|
|
38
|
+
attr_reader :override_attrs
|
|
39
|
+
|
|
40
|
+
attr_reader :errors
|
|
41
|
+
|
|
42
|
+
# The data source passed to the constructor. Not used in this class.
|
|
43
|
+
# In subclasses, this is a couchdb or Chef::REST object pre-configured
|
|
44
|
+
# to fetch roles from their correct location.
|
|
45
|
+
attr_reader :source
|
|
46
|
+
|
|
47
|
+
def initialize(run_list_items, source=nil)
|
|
48
|
+
@errors = Array.new
|
|
49
|
+
|
|
50
|
+
@run_list_items = run_list_items.dup
|
|
51
|
+
@source = source
|
|
52
|
+
|
|
53
|
+
@default_attrs = Mash.new
|
|
54
|
+
@override_attrs = Mash.new
|
|
55
|
+
|
|
56
|
+
@recipes = []
|
|
57
|
+
|
|
58
|
+
@applied_roles = {}
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Did we find any errors (expanding roles)?
|
|
62
|
+
def errors?
|
|
63
|
+
@errors.length > 0
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
alias :invalid? :errors?
|
|
67
|
+
|
|
68
|
+
# Iterates over the run list items, expanding roles. After this,
|
|
69
|
+
# +recipes+ will contain the fully expanded recipe list
|
|
70
|
+
def expand
|
|
71
|
+
@run_list_items.each_with_index do |entry, index|
|
|
72
|
+
case entry.type
|
|
73
|
+
when :recipe
|
|
74
|
+
recipes << entry.name unless recipes.include?(entry.name)
|
|
75
|
+
when :role
|
|
76
|
+
if role = inflate_role(entry.name)
|
|
77
|
+
apply_role_attributes(role)
|
|
78
|
+
@run_list_items.insert(index + 1, *role.run_list.run_list_items)
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Fetches and inflates a role
|
|
85
|
+
# === Returns
|
|
86
|
+
# Chef::Role in most cases
|
|
87
|
+
# false if the role has already been applied
|
|
88
|
+
# nil if the role does not exist
|
|
89
|
+
def inflate_role(role_name)
|
|
90
|
+
return false if applied_role?(role_name) # Prevent infinite loops
|
|
91
|
+
applied_role(role_name)
|
|
92
|
+
fetch_role(role_name)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def apply_role_attributes(role)
|
|
96
|
+
@default_attrs = Chef::Mixin::DeepMerge.merge(@default_attrs, role.default_attributes)
|
|
97
|
+
@override_attrs = Chef::Mixin::DeepMerge.merge(@override_attrs, role.override_attributes)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def applied_role?(role_name)
|
|
101
|
+
@applied_roles.has_key?(role_name)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def applied_role(role_name)
|
|
105
|
+
@applied_roles[role_name] = true
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def roles
|
|
109
|
+
@applied_roles.keys
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# In subclasses, this method will fetch the role from the data source.
|
|
113
|
+
def fetch_role(name)
|
|
114
|
+
raise NotImplementedError
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# When a role is not found, an error message is logged, but no
|
|
118
|
+
# exception is raised. We do add an entry in the errors collection.
|
|
119
|
+
# === Returns
|
|
120
|
+
# nil
|
|
121
|
+
def role_not_found(name)
|
|
122
|
+
Chef::Log.error("Role #{name} is in the runlist but does not exist. Skipping expand.")
|
|
123
|
+
@errors << name
|
|
124
|
+
nil
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# Expand a run list from disk. Suitable for chef-solo
|
|
129
|
+
class RunListExpansionFromDisk < RunListExpansion
|
|
130
|
+
|
|
131
|
+
def fetch_role(name)
|
|
132
|
+
Chef::Role.from_disk(name)
|
|
133
|
+
rescue Chef::Exceptions::RoleNotFound
|
|
134
|
+
role_not_found(name)
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# Expand a run list from the chef-server API.
|
|
140
|
+
class RunListExpansionFromAPI < RunListExpansion
|
|
141
|
+
|
|
142
|
+
def rest
|
|
143
|
+
@rest ||= (source || Chef::REST.new(Chef::Config[:role_url]))
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def fetch_role(name)
|
|
147
|
+
rest.get_rest("roles/#{name}")
|
|
148
|
+
rescue Net::HTTPServerException => e
|
|
149
|
+
if e.message == '404 "Not Found"'
|
|
150
|
+
role_not_found(name)
|
|
151
|
+
else
|
|
152
|
+
raise
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# Expand a run list from couchdb. Used in chef-server-api
|
|
158
|
+
class RunListExpansionFromCouchDB < RunListExpansion
|
|
159
|
+
|
|
160
|
+
def couchdb
|
|
161
|
+
source
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def fetch_role(name)
|
|
165
|
+
Chef::Role.cdb_load(name, couchdb)
|
|
166
|
+
rescue Chef::Exceptions::CouchDBNotFound
|
|
167
|
+
role_not_found(name)
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
end
|