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