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/node.rb
ADDED
|
@@ -0,0 +1,601 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
3
|
+
# Author:: Christopher Brown (<cb@opscode.com>)
|
|
4
|
+
# Author:: Christopher Walters (<cw@opscode.com>)
|
|
5
|
+
# Author:: Tim Hinderliter (<tim@opscode.com>)
|
|
6
|
+
# Copyright:: Copyright (c) 2008-2010 Opscode, Inc.
|
|
7
|
+
# License:: Apache License, Version 2.0
|
|
8
|
+
#
|
|
9
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
10
|
+
# you may not use this file except in compliance with the License.
|
|
11
|
+
# You may obtain a copy of the License at
|
|
12
|
+
#
|
|
13
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
14
|
+
#
|
|
15
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
16
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
17
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
18
|
+
# See the License for the specific language governing permissions and
|
|
19
|
+
# limitations under the License.
|
|
20
|
+
#
|
|
21
|
+
|
|
22
|
+
require 'chef/config'
|
|
23
|
+
require 'chef/cookbook/cookbook_collection'
|
|
24
|
+
require 'chef/mixin/check_helper'
|
|
25
|
+
require 'chef/mixin/params_validate'
|
|
26
|
+
require 'chef/mixin/from_file'
|
|
27
|
+
require 'chef/mixin/language_include_attribute'
|
|
28
|
+
require 'chef/mixin/deep_merge'
|
|
29
|
+
require 'chef/couchdb'
|
|
30
|
+
require 'chef/rest'
|
|
31
|
+
require 'chef/run_list'
|
|
32
|
+
require 'chef/node/attribute'
|
|
33
|
+
require 'chef/index_queue'
|
|
34
|
+
require 'extlib'
|
|
35
|
+
require 'json'
|
|
36
|
+
|
|
37
|
+
class Chef
|
|
38
|
+
class Node
|
|
39
|
+
|
|
40
|
+
attr_accessor :recipe_list, :couchdb, :couchdb_rev, :run_state, :run_list
|
|
41
|
+
attr_accessor :override_attrs, :default_attrs, :normal_attrs, :automatic_attrs
|
|
42
|
+
attr_reader :couchdb_id
|
|
43
|
+
|
|
44
|
+
# TODO: 5/18/2010 cw/timh. cookbook_collection should be removed
|
|
45
|
+
# from here and for any place it's needed, it should be accessed
|
|
46
|
+
# through a Chef::RunContext
|
|
47
|
+
attr_accessor :cookbook_collection
|
|
48
|
+
|
|
49
|
+
include Chef::Mixin::CheckHelper
|
|
50
|
+
include Chef::Mixin::FromFile
|
|
51
|
+
include Chef::Mixin::ParamsValidate
|
|
52
|
+
include Chef::Mixin::LanguageIncludeAttribute
|
|
53
|
+
include Chef::IndexQueue::Indexable
|
|
54
|
+
|
|
55
|
+
DESIGN_DOCUMENT = {
|
|
56
|
+
"version" => 9,
|
|
57
|
+
"language" => "javascript",
|
|
58
|
+
"views" => {
|
|
59
|
+
"all" => {
|
|
60
|
+
"map" => <<-EOJS
|
|
61
|
+
function(doc) {
|
|
62
|
+
if (doc.chef_type == "node") {
|
|
63
|
+
emit(doc.name, doc);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
EOJS
|
|
67
|
+
},
|
|
68
|
+
"all_id" => {
|
|
69
|
+
"map" => <<-EOJS
|
|
70
|
+
function(doc) {
|
|
71
|
+
if (doc.chef_type == "node") {
|
|
72
|
+
emit(doc.name, doc.name);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
EOJS
|
|
76
|
+
},
|
|
77
|
+
"status" => {
|
|
78
|
+
"map" => <<-EOJS
|
|
79
|
+
function(doc) {
|
|
80
|
+
if (doc.chef_type == "node") {
|
|
81
|
+
var to_emit = { "name": doc.name };
|
|
82
|
+
if (doc["attributes"]["fqdn"]) {
|
|
83
|
+
to_emit["fqdn"] = doc["attributes"]["fqdn"];
|
|
84
|
+
} else {
|
|
85
|
+
to_emit["fqdn"] = "Undefined";
|
|
86
|
+
}
|
|
87
|
+
if (doc["attributes"]["ipaddress"]) {
|
|
88
|
+
to_emit["ipaddress"] = doc["attributes"]["ipaddress"];
|
|
89
|
+
} else {
|
|
90
|
+
to_emit["ipaddress"] = "Undefined";
|
|
91
|
+
}
|
|
92
|
+
if (doc["attributes"]["ohai_time"]) {
|
|
93
|
+
to_emit["ohai_time"] = doc["attributes"]["ohai_time"];
|
|
94
|
+
} else {
|
|
95
|
+
to_emit["ohai_time"] = "Undefined";
|
|
96
|
+
}
|
|
97
|
+
if (doc["attributes"]["uptime"]) {
|
|
98
|
+
to_emit["uptime"] = doc["attributes"]["uptime"];
|
|
99
|
+
} else {
|
|
100
|
+
to_emit["uptime"] = "Undefined";
|
|
101
|
+
}
|
|
102
|
+
if (doc["attributes"]["platform"]) {
|
|
103
|
+
to_emit["platform"] = doc["attributes"]["platform"];
|
|
104
|
+
} else {
|
|
105
|
+
to_emit["platform"] = "Undefined";
|
|
106
|
+
}
|
|
107
|
+
if (doc["attributes"]["platform_version"]) {
|
|
108
|
+
to_emit["platform_version"] = doc["attributes"]["platform_version"];
|
|
109
|
+
} else {
|
|
110
|
+
to_emit["platform_version"] = "Undefined";
|
|
111
|
+
}
|
|
112
|
+
if (doc["run_list"]) {
|
|
113
|
+
to_emit["run_list"] = doc["run_list"];
|
|
114
|
+
} else {
|
|
115
|
+
to_emit["run_list"] = "Undefined";
|
|
116
|
+
}
|
|
117
|
+
emit(doc.name, to_emit);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
EOJS
|
|
121
|
+
},
|
|
122
|
+
"by_run_list" => {
|
|
123
|
+
"map" => <<-EOJS
|
|
124
|
+
function(doc) {
|
|
125
|
+
if (doc.chef_type == "node") {
|
|
126
|
+
if (doc['run_list']) {
|
|
127
|
+
for (var i=0; i < doc.run_list.length; i++) {
|
|
128
|
+
emit(doc['run_list'][i], doc.name);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
EOJS
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
# Create a new Chef::Node object.
|
|
139
|
+
def initialize(couchdb=nil)
|
|
140
|
+
@name = nil
|
|
141
|
+
|
|
142
|
+
@normal_attrs = Mash.new
|
|
143
|
+
@override_attrs = Mash.new
|
|
144
|
+
@default_attrs = Mash.new
|
|
145
|
+
@automatic_attrs = Mash.new
|
|
146
|
+
@run_list = Chef::RunList.new
|
|
147
|
+
|
|
148
|
+
@couchdb_rev = nil
|
|
149
|
+
@couchdb_id = nil
|
|
150
|
+
@couchdb = couchdb || Chef::CouchDB.new
|
|
151
|
+
|
|
152
|
+
@run_state = {
|
|
153
|
+
:template_cache => Hash.new,
|
|
154
|
+
:seen_recipes => Hash.new,
|
|
155
|
+
:seen_attributes => Hash.new
|
|
156
|
+
}
|
|
157
|
+
# TODO: 5/20/2010 need this here as long as other objects try to access
|
|
158
|
+
# the cookbook collection via Node, otherwise get NoMethodError on nil.
|
|
159
|
+
@cookbook_collection = CookbookCollection.new
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def couchdb_id=(value)
|
|
163
|
+
@couchdb_id = value
|
|
164
|
+
@index_id = value
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
# Used by DSL
|
|
168
|
+
def node
|
|
169
|
+
self
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
def chef_server_rest
|
|
173
|
+
Chef::REST.new(Chef::Config[:chef_server_url])
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
# Find a recipe for this Chef::Node by fqdn. Will search first for
|
|
177
|
+
# Chef::Config["node_path"]/fqdn.rb, then hostname.rb, then default.rb.
|
|
178
|
+
#
|
|
179
|
+
# Returns a new Chef::Node object.
|
|
180
|
+
#
|
|
181
|
+
# Raises an ArgumentError if it cannot find the node.
|
|
182
|
+
def find_file(fqdn)
|
|
183
|
+
host_parts = fqdn.split(".")
|
|
184
|
+
hostname = host_parts[0]
|
|
185
|
+
|
|
186
|
+
[fqdn, hostname, "default"].each { |fname|
|
|
187
|
+
node_file = File.join(Chef::Config[:node_path], "#{fname.to_s}.rb")
|
|
188
|
+
return self.from_file(node_file) if File.exists?(node_file)
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
raise ArgumentError, "Cannot find a node matching #{fqdn}, not even with default.rb!"
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
# Set the name of this Node, or return the current name.
|
|
195
|
+
def name(arg=nil)
|
|
196
|
+
if arg != nil
|
|
197
|
+
validate(
|
|
198
|
+
{:name => arg },
|
|
199
|
+
{:name => { :kind_of => String,
|
|
200
|
+
:cannot_be => :blank,
|
|
201
|
+
:regex => /^[\-[:alnum:]_:.]+$/}
|
|
202
|
+
})
|
|
203
|
+
@name = arg
|
|
204
|
+
else
|
|
205
|
+
@name
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
# Used by the DSL
|
|
210
|
+
def attribute
|
|
211
|
+
construct_attributes
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
def construct_attributes
|
|
215
|
+
Chef::Node::Attribute.new(normal_attrs, default_attrs, override_attrs, automatic_attrs)
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
def attribute=(value)
|
|
219
|
+
self.normal_attrs = value
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
# Return an attribute of this node. Returns nil if the attribute is not found.
|
|
223
|
+
def [](attrib)
|
|
224
|
+
construct_attributes[attrib]
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
# Set an attribute of this node
|
|
228
|
+
def []=(attrib, value)
|
|
229
|
+
construct_attributes[attrib] = value
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
def store(attrib, value)
|
|
233
|
+
self[attrib] = value
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
# Set a normal attribute of this node, but auto-vivifiy any Mashes that
|
|
237
|
+
# might be missing
|
|
238
|
+
def normal
|
|
239
|
+
attrs = construct_attributes
|
|
240
|
+
attrs.set_type = :normal
|
|
241
|
+
attrs.auto_vivifiy_on_read = true
|
|
242
|
+
attrs
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
alias_method :set, :normal
|
|
246
|
+
|
|
247
|
+
# Set a normal attribute of this node, auto-vivifiying any mashes that are
|
|
248
|
+
# missing, but if the final value already exists, don't set it
|
|
249
|
+
def normal_unless
|
|
250
|
+
attrs = construct_attributes
|
|
251
|
+
attrs.set_type = :normal
|
|
252
|
+
attrs.auto_vivifiy_on_read = true
|
|
253
|
+
attrs.set_unless_value_present = true
|
|
254
|
+
attrs
|
|
255
|
+
end
|
|
256
|
+
alias_method :set_unless, :normal_unless
|
|
257
|
+
|
|
258
|
+
# Set a default of this node, but auto-vivifiy any Mashes that might
|
|
259
|
+
# be missing
|
|
260
|
+
def default
|
|
261
|
+
attrs = construct_attributes
|
|
262
|
+
attrs.set_type = :default
|
|
263
|
+
attrs.auto_vivifiy_on_read = true
|
|
264
|
+
attrs
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
# Set a default attribute of this node, auto-vivifiying any mashes that are
|
|
268
|
+
# missing, but if the final value already exists, don't set it
|
|
269
|
+
def default_unless
|
|
270
|
+
attrs = construct_attributes
|
|
271
|
+
attrs.set_type = :default
|
|
272
|
+
attrs.auto_vivifiy_on_read = true
|
|
273
|
+
attrs.set_unless_value_present = true
|
|
274
|
+
attrs
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
# Set an override attribute of this node, but auto-vivifiy any Mashes that
|
|
278
|
+
# might be missing
|
|
279
|
+
def override
|
|
280
|
+
attrs = construct_attributes
|
|
281
|
+
attrs.set_type = :override
|
|
282
|
+
attrs.auto_vivifiy_on_read = true
|
|
283
|
+
attrs
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
# Set an override attribute of this node, auto-vivifiying any mashes that
|
|
287
|
+
# are missing, but if the final value already exists, don't set it
|
|
288
|
+
def override_unless
|
|
289
|
+
attrs = construct_attributes
|
|
290
|
+
attrs.set_type = :override
|
|
291
|
+
attrs.auto_vivifiy_on_read = true
|
|
292
|
+
attrs.set_unless_value_present = true
|
|
293
|
+
attrs
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
# Return true if this Node has a given attribute, false if not. Takes either a symbol or
|
|
297
|
+
# a string.
|
|
298
|
+
#
|
|
299
|
+
# Only works on the top level. Preferred way is to use the normal [] style
|
|
300
|
+
# lookup and call attribute?()
|
|
301
|
+
def attribute?(attrib)
|
|
302
|
+
construct_attributes.attribute?(attrib)
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
# Yield each key of the top level to the block.
|
|
306
|
+
def each(&block)
|
|
307
|
+
construct_attributes.each(&block)
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
# Iterates over each attribute, passing the attribute and value to the block.
|
|
311
|
+
def each_attribute(&block)
|
|
312
|
+
construct_attributes.each_attribute(&block)
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
# Encouraged to only get used for lookups - while you can do sets from here, it's not as explicit
|
|
316
|
+
# as using the normal/default/override interface.
|
|
317
|
+
def method_missing(symbol, *args)
|
|
318
|
+
attrs = construct_attributes
|
|
319
|
+
attrs.send(symbol, *args)
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
# Returns true if this Node expects a given recipe, false if not.
|
|
323
|
+
#
|
|
324
|
+
# First, the run list is consulted to see whether the recipe is
|
|
325
|
+
# explicitly included. If it's not there, it looks in
|
|
326
|
+
# run_state[:seen_recipes], which is populated by include_recipe
|
|
327
|
+
# statements in the DSL (and thus would not be in the run list).
|
|
328
|
+
#
|
|
329
|
+
# NOTE: We believe this is dead code, but if it's not, please
|
|
330
|
+
# email chef-dev@opscode.com. [cw,timh]
|
|
331
|
+
# def recipe?(recipe_name)
|
|
332
|
+
# run_list.include?(recipe_name) || run_state[:seen_recipes].include?(recipe_name)
|
|
333
|
+
# end
|
|
334
|
+
|
|
335
|
+
# Returns true if this Node expects a given role, false if not.
|
|
336
|
+
def role?(role_name)
|
|
337
|
+
run_list.include?("role[#{role_name}]")
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
# Returns an Array of roles and recipes, in the order they will be applied.
|
|
341
|
+
# If you call it with arguments, they will become the new list of roles and recipes.
|
|
342
|
+
def run_list(*args)
|
|
343
|
+
args.length > 0 ? @run_list.reset!(args) : @run_list
|
|
344
|
+
end
|
|
345
|
+
|
|
346
|
+
def recipes(*args)
|
|
347
|
+
Chef::Log.warn "Chef::Node#recipes method is deprecated. Please use Chef::Node#run_list"
|
|
348
|
+
run_list(*args)
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
# Returns true if this Node expects a given role, false if not.
|
|
352
|
+
def run_list?(item)
|
|
353
|
+
run_list.detect { |r| r == item } ? true : false
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
# Consume data from ohai and Attributes provided as JSON on the command line.
|
|
357
|
+
def consume_external_attrs(ohai_data, json_cli_attrs)
|
|
358
|
+
Chef::Log.debug("Extracting run list from JSON attributes provided on command line")
|
|
359
|
+
consume_attributes(json_cli_attrs)
|
|
360
|
+
|
|
361
|
+
@automatic_attrs = ohai_data
|
|
362
|
+
|
|
363
|
+
platform, version = Chef::Platform.find_platform_and_version(self)
|
|
364
|
+
Chef::Log.debug("Platform is #{platform} version #{version}")
|
|
365
|
+
@automatic_attrs[:platform] = platform
|
|
366
|
+
@automatic_attrs[:platform_version] = version
|
|
367
|
+
end
|
|
368
|
+
|
|
369
|
+
# Consumes the combined run_list and other attributes in +attrs+
|
|
370
|
+
def consume_attributes(attrs)
|
|
371
|
+
normal_attrs_to_merge = consume_run_list(attrs)
|
|
372
|
+
Chef::Log.debug("Applying attributes from json file")
|
|
373
|
+
@normal_attrs = Chef::Mixin::DeepMerge.merge(@normal_attrs,normal_attrs_to_merge)
|
|
374
|
+
self[:tags] = Array.new unless attribute?(:tags)
|
|
375
|
+
end
|
|
376
|
+
|
|
377
|
+
# Extracts the run list from +attrs+ and applies it. Returns the remaining attributes
|
|
378
|
+
def consume_run_list(attrs)
|
|
379
|
+
attrs = attrs ? attrs.dup : {}
|
|
380
|
+
if new_run_list = attrs.delete("recipes") || attrs.delete("run_list")
|
|
381
|
+
if attrs.key?("recipes") || attrs.key?("run_list")
|
|
382
|
+
raise Chef::Exceptions::AmbiguousRunlistSpecification, "please set the node's run list using the 'run_list' attribute only."
|
|
383
|
+
end
|
|
384
|
+
Chef::Log.info("Setting the run_list to #{new_run_list.inspect} from JSON")
|
|
385
|
+
run_list(new_run_list)
|
|
386
|
+
end
|
|
387
|
+
attrs
|
|
388
|
+
end
|
|
389
|
+
|
|
390
|
+
# Clear defaults and overrides, so that any deleted attributes between runs are
|
|
391
|
+
# still gone.
|
|
392
|
+
def reset_defaults_and_overrides
|
|
393
|
+
@default_attrs = Mash.new
|
|
394
|
+
@override_attrs = Mash.new
|
|
395
|
+
end
|
|
396
|
+
|
|
397
|
+
# Expands the node's run list and deep merges the default and
|
|
398
|
+
# override attributes. Also applies stored attributes (from json provided
|
|
399
|
+
# on the command line)
|
|
400
|
+
#
|
|
401
|
+
# Returns the fully-expanded list of recipes.
|
|
402
|
+
#
|
|
403
|
+
# TODO: timh/cw, 5-14-2010: Should this method exist? Should we
|
|
404
|
+
# instead modify default_attrs and override_attrs whenever our
|
|
405
|
+
# run_list is mutated? Or perhaps do something smarter like
|
|
406
|
+
# on-demand generation of default_attrs and override_attrs,
|
|
407
|
+
# invalidated only when run_list is mutated?
|
|
408
|
+
def expand!
|
|
409
|
+
# This call should only be called on a chef-client run.
|
|
410
|
+
expansion = run_list.expand('server')
|
|
411
|
+
raise Chef::Exceptions::MissingRole if expansion.errors?
|
|
412
|
+
|
|
413
|
+
self[:tags] = Array.new unless attribute?(:tags)
|
|
414
|
+
@default_attrs = Chef::Mixin::DeepMerge.merge(default_attrs, expansion.default_attrs)
|
|
415
|
+
@override_attrs = Chef::Mixin::DeepMerge.merge(override_attrs, expansion.override_attrs)
|
|
416
|
+
|
|
417
|
+
@automatic_attrs[:recipes] = expansion.recipes
|
|
418
|
+
@automatic_attrs[:roles] = expansion.roles
|
|
419
|
+
|
|
420
|
+
expansion.recipes
|
|
421
|
+
end
|
|
422
|
+
|
|
423
|
+
# Transform the node to a Hash
|
|
424
|
+
def to_hash
|
|
425
|
+
index_hash = Hash.new
|
|
426
|
+
index_hash["chef_type"] = "node"
|
|
427
|
+
index_hash["name"] = name
|
|
428
|
+
attribute.each do |key, value|
|
|
429
|
+
index_hash[key] = value
|
|
430
|
+
end
|
|
431
|
+
index_hash["recipe"] = run_list.recipe_names if run_list.recipe_names.length > 0
|
|
432
|
+
index_hash["role"] = run_list.role_names if run_list.role_names.length > 0
|
|
433
|
+
index_hash["run_list"] = run_list.run_list if run_list.run_list.length > 0
|
|
434
|
+
index_hash
|
|
435
|
+
end
|
|
436
|
+
|
|
437
|
+
# Serialize this object as a hash
|
|
438
|
+
def to_json(*a)
|
|
439
|
+
result = {
|
|
440
|
+
"name" => name,
|
|
441
|
+
'json_class' => self.class.name,
|
|
442
|
+
"automatic" => automatic_attrs,
|
|
443
|
+
"normal" => normal_attrs,
|
|
444
|
+
"chef_type" => "node",
|
|
445
|
+
"default" => default_attrs,
|
|
446
|
+
"override" => override_attrs,
|
|
447
|
+
"run_list" => run_list.run_list
|
|
448
|
+
}
|
|
449
|
+
result["_rev"] = couchdb_rev if couchdb_rev
|
|
450
|
+
result.to_json(*a)
|
|
451
|
+
end
|
|
452
|
+
|
|
453
|
+
# Create a Chef::Node from JSON
|
|
454
|
+
def self.json_create(o)
|
|
455
|
+
node = new
|
|
456
|
+
node.name(o["name"])
|
|
457
|
+
|
|
458
|
+
if o.has_key?("attributes")
|
|
459
|
+
node.normal_attrs = o["attributes"]
|
|
460
|
+
end
|
|
461
|
+
node.automatic_attrs = Mash.new(o["automatic"]) if o.has_key?("automatic")
|
|
462
|
+
node.normal_attrs = Mash.new(o["normal"]) if o.has_key?("normal")
|
|
463
|
+
node.default_attrs = Mash.new(o["default"]) if o.has_key?("default")
|
|
464
|
+
node.override_attrs = Mash.new(o["override"]) if o.has_key?("override")
|
|
465
|
+
|
|
466
|
+
if o.has_key?("run_list")
|
|
467
|
+
node.run_list.reset!(o["run_list"])
|
|
468
|
+
else
|
|
469
|
+
o["recipes"].each { |r| node.recipes << r }
|
|
470
|
+
end
|
|
471
|
+
node.couchdb_rev = o["_rev"] if o.has_key?("_rev")
|
|
472
|
+
node.couchdb_id = o["_id"] if o.has_key?("_id")
|
|
473
|
+
node.index_id = node.couchdb_id
|
|
474
|
+
node
|
|
475
|
+
end
|
|
476
|
+
|
|
477
|
+
# List all the Chef::Node objects in the CouchDB. If inflate is set to true, you will get
|
|
478
|
+
# the full list of all Nodes, fully inflated.
|
|
479
|
+
def self.cdb_list(inflate=false, couchdb=nil)
|
|
480
|
+
rs =(couchdb || Chef::CouchDB.new).list("nodes", inflate)
|
|
481
|
+
lookup = (inflate ? "value" : "key")
|
|
482
|
+
rs["rows"].collect { |r| r[lookup] }
|
|
483
|
+
end
|
|
484
|
+
|
|
485
|
+
def self.list(inflate=false)
|
|
486
|
+
if inflate
|
|
487
|
+
response = Hash.new
|
|
488
|
+
Chef::Search::Query.new.search(:node) do |n|
|
|
489
|
+
response[n.name] = n unless n.nil?
|
|
490
|
+
end
|
|
491
|
+
response
|
|
492
|
+
else
|
|
493
|
+
Chef::REST.new(Chef::Config[:chef_server_url]).get_rest("nodes")
|
|
494
|
+
end
|
|
495
|
+
end
|
|
496
|
+
|
|
497
|
+
# Load a node by name from CouchDB
|
|
498
|
+
def self.cdb_load(name, couchdb=nil)
|
|
499
|
+
(couchdb || Chef::CouchDB.new).load("node", name)
|
|
500
|
+
end
|
|
501
|
+
|
|
502
|
+
def self.exists?(nodename, couchdb)
|
|
503
|
+
begin
|
|
504
|
+
self.cdb_load(nodename, couchdb)
|
|
505
|
+
rescue Chef::Exceptions::CouchDBNotFound
|
|
506
|
+
nil
|
|
507
|
+
end
|
|
508
|
+
end
|
|
509
|
+
|
|
510
|
+
def self.find_or_create(node_name)
|
|
511
|
+
load(node_name)
|
|
512
|
+
rescue Net::HTTPServerException => e
|
|
513
|
+
raise unless e.response.code == '404'
|
|
514
|
+
node = build(node_name)
|
|
515
|
+
node.create
|
|
516
|
+
end
|
|
517
|
+
|
|
518
|
+
def self.build(node_name)
|
|
519
|
+
node = new
|
|
520
|
+
node.name(node_name)
|
|
521
|
+
node
|
|
522
|
+
end
|
|
523
|
+
|
|
524
|
+
# Load a node by name
|
|
525
|
+
def self.load(name)
|
|
526
|
+
Chef::REST.new(Chef::Config[:chef_server_url]).get_rest("nodes/#{name}")
|
|
527
|
+
end
|
|
528
|
+
|
|
529
|
+
# Remove this node from the CouchDB
|
|
530
|
+
def cdb_destroy
|
|
531
|
+
couchdb.delete("node", name, couchdb_rev)
|
|
532
|
+
end
|
|
533
|
+
|
|
534
|
+
# Remove this node via the REST API
|
|
535
|
+
def destroy
|
|
536
|
+
chef_server_rest.delete_rest("nodes/#{name}")
|
|
537
|
+
end
|
|
538
|
+
|
|
539
|
+
# Save this node to the CouchDB
|
|
540
|
+
def cdb_save
|
|
541
|
+
@couchdb_rev = couchdb.store("node", name, self)["rev"]
|
|
542
|
+
end
|
|
543
|
+
|
|
544
|
+
# Save this node via the REST API
|
|
545
|
+
def save
|
|
546
|
+
# Try PUT. If the node doesn't yet exist, PUT will return 404,
|
|
547
|
+
# so then POST to create.
|
|
548
|
+
begin
|
|
549
|
+
chef_server_rest.put_rest("nodes/#{name}", self)
|
|
550
|
+
rescue Net::HTTPServerException => e
|
|
551
|
+
raise e unless e.response.code == "404"
|
|
552
|
+
chef_server_rest.post_rest("nodes", self)
|
|
553
|
+
end
|
|
554
|
+
self
|
|
555
|
+
end
|
|
556
|
+
|
|
557
|
+
# Create the node via the REST API
|
|
558
|
+
def create
|
|
559
|
+
chef_server_rest.post_rest("nodes", self)
|
|
560
|
+
self
|
|
561
|
+
end
|
|
562
|
+
|
|
563
|
+
# Set up our CouchDB design document
|
|
564
|
+
def self.create_design_document(couchdb=nil)
|
|
565
|
+
(couchdb || Chef::CouchDB.new).create_design_document("nodes", DESIGN_DOCUMENT)
|
|
566
|
+
end
|
|
567
|
+
|
|
568
|
+
def to_s
|
|
569
|
+
"node[#{name}]"
|
|
570
|
+
end
|
|
571
|
+
|
|
572
|
+
# Load all attribute files for all cookbooks associated with this
|
|
573
|
+
# node.
|
|
574
|
+
def load_attributes
|
|
575
|
+
cookbook_collection.values.each do |cookbook|
|
|
576
|
+
cookbook.segment_filenames(:attributes).each do |segment_filename|
|
|
577
|
+
Chef::Log.debug("node #{name} loading cookbook #{cookbook.name}'s attribute file #{segment_filename}")
|
|
578
|
+
self.from_file(segment_filename)
|
|
579
|
+
end
|
|
580
|
+
end
|
|
581
|
+
end
|
|
582
|
+
|
|
583
|
+
# Used by DSL.
|
|
584
|
+
# Loads the attribute file specified by the short name of the
|
|
585
|
+
# file, e.g., loads specified cookbook's
|
|
586
|
+
# "attributes/mailservers.rb"
|
|
587
|
+
# if passed
|
|
588
|
+
# "mailservers"
|
|
589
|
+
def load_attribute_by_short_filename(name, src_cookbook_name)
|
|
590
|
+
src_cookbook = cookbook_collection[src_cookbook_name]
|
|
591
|
+
raise Chef::Exceptions::CookbookNotFound, "could not find cookbook #{src_cookbook_name} while loading attribute #{name}" unless src_cookbook
|
|
592
|
+
|
|
593
|
+
attribute_filename = src_cookbook.attribute_filenames_by_short_filename[name]
|
|
594
|
+
raise Chef::Exceptions::AttributeNotFound, "could not find filename for attribute #{name} in cookbook #{src_cookbook_name}" unless attribute_filename
|
|
595
|
+
|
|
596
|
+
self.from_file(attribute_filename)
|
|
597
|
+
self
|
|
598
|
+
end
|
|
599
|
+
|
|
600
|
+
end
|
|
601
|
+
end
|