chef 10.34.6 → 11.0.0.beta.0
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/CONTRIBUTING.md +155 -0
- data/README.md +89 -0
- data/Rakefile +4 -12
- data/bin/chef-apply +25 -0
- data/bin/chef-shell +34 -0
- data/bin/shef +6 -5
- data/distro/common/html/chef-client.8.html +4 -4
- data/distro/common/html/chef-expander.8.html +4 -4
- data/distro/common/html/chef-expanderctl.8.html +4 -4
- data/distro/common/html/chef-server-webui.8.html +4 -4
- data/distro/common/html/chef-server.8.html +4 -4
- data/distro/common/html/{shef.1.html → chef-shell.1.html} +49 -46
- data/distro/common/html/chef-solo.8.html +18 -12
- data/distro/common/html/chef-solr.8.html +4 -4
- data/distro/common/html/knife-bootstrap.1.html +4 -4
- data/distro/common/html/knife-client.1.html +4 -4
- data/distro/common/html/knife-configure.1.html +4 -4
- data/distro/common/html/knife-cookbook-site.1.html +4 -4
- data/distro/common/html/knife-cookbook.1.html +10 -7
- data/distro/common/html/knife-data-bag.1.html +10 -7
- data/distro/common/html/knife-environment.1.html +8 -6
- data/distro/common/html/knife-exec.1.html +9 -9
- data/distro/common/html/knife-index.1.html +4 -4
- data/distro/common/html/knife-node.1.html +4 -4
- data/distro/common/html/knife-role.1.html +4 -4
- data/distro/common/html/knife-search.1.html +4 -4
- data/distro/common/html/knife-ssh.1.html +4 -4
- data/distro/common/html/knife-status.1.html +4 -4
- data/distro/common/html/knife-tag.1.html +4 -4
- data/distro/common/html/knife.1.html +8 -13
- data/distro/common/man/man1/{shef.1 → chef-shell.1} +21 -57
- data/distro/common/man/man1/knife-bootstrap.1 +1 -1
- data/distro/common/man/man1/knife-client.1 +1 -1
- data/distro/common/man/man1/knife-configure.1 +1 -1
- data/distro/common/man/man1/knife-cookbook-site.1 +1 -1
- data/distro/common/man/man1/knife-cookbook.1 +15 -2
- data/distro/common/man/man1/knife-data-bag.1 +15 -2
- data/distro/common/man/man1/knife-environment.1 +12 -2
- data/distro/common/man/man1/knife-exec.1 +4 -7
- data/distro/common/man/man1/knife-index.1 +1 -1
- data/distro/common/man/man1/knife-node.1 +1 -1
- data/distro/common/man/man1/knife-role.1 +1 -1
- data/distro/common/man/man1/knife-search.1 +1 -1
- data/distro/common/man/man1/knife-ssh.1 +1 -1
- data/distro/common/man/man1/knife-status.1 +1 -1
- data/distro/common/man/man1/knife-tag.1 +1 -1
- data/distro/common/man/man1/knife.1 +3 -6
- data/distro/common/man/man8/chef-client.8 +1 -1
- data/distro/common/man/man8/chef-expander.8 +1 -1
- data/distro/common/man/man8/chef-expanderctl.8 +1 -1
- data/distro/common/man/man8/chef-server-webui.8 +1 -1
- data/distro/common/man/man8/chef-server.8 +1 -1
- data/distro/common/man/man8/chef-solo.8 +36 -4
- data/distro/common/man/man8/chef-solr.8 +1 -1
- data/distro/common/markdown/man1/{shef.mkd → chef-shell.mkd} +49 -43
- data/distro/common/markdown/man1/knife-exec.mkd +11 -6
- data/distro/common/markdown/man1/knife.mkd +4 -9
- data/distro/debian/etc/default/chef-client +0 -1
- data/distro/debian/etc/init.d/chef-client +2 -2
- data/lib/chef.rb +2 -5
- data/lib/chef/api_client.rb +20 -130
- data/lib/chef/api_client/registration.rb +126 -0
- data/lib/chef/application.rb +71 -14
- data/lib/chef/application/apply.rb +160 -0
- data/lib/chef/application/client.rb +25 -18
- data/lib/chef/application/knife.rb +0 -2
- data/lib/chef/application/solo.rb +23 -8
- data/lib/chef/application/windows_service.rb +5 -2
- data/lib/chef/applications.rb +1 -0
- data/lib/chef/chef_fs.rb +11 -0
- data/lib/chef/chef_fs/command_line.rb +232 -0
- data/lib/chef/chef_fs/file_pattern.rb +312 -0
- data/lib/chef/chef_fs/file_system.rb +358 -0
- data/lib/chef/chef_fs/file_system/base_fs_dir.rb +47 -0
- data/lib/chef/chef_fs/file_system/base_fs_object.rb +121 -0
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +109 -0
- data/{spec/unit/monkey_patches/uri_spec.rb → lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb} +12 -15
- data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +84 -0
- data/lib/chef/chef_fs/file_system/cookbook_dir.rb +188 -0
- data/lib/chef/chef_fs/file_system/cookbook_file.rb +78 -0
- data/lib/chef/chef_fs/file_system/cookbook_subdir.rb +54 -0
- data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +68 -0
- data/lib/chef/chef_fs/file_system/data_bag_dir.rb +78 -0
- data/lib/chef/chef_fs/file_system/data_bag_item.rb +59 -0
- data/lib/chef/chef_fs/file_system/data_bags_dir.rb +66 -0
- data/lib/chef/chef_fs/file_system/file_system_entry.rb +90 -0
- data/lib/chef/{index_queue.rb → chef_fs/file_system/file_system_error.rb} +14 -12
- data/lib/chef/{resource/whyrun_safe_ruby_block.rb → chef_fs/file_system/file_system_root_dir.rb} +10 -10
- data/lib/chef/chef_fs/file_system/must_delete_recursively_error.rb +31 -0
- data/lib/chef/chef_fs/file_system/nodes_dir.rb +47 -0
- data/lib/chef/{provider/whyrun_safe_ruby_block.rb → chef_fs/file_system/nonexistent_fs_object.rb} +19 -9
- data/lib/chef/chef_fs/file_system/not_found_error.rb +31 -0
- data/lib/chef/chef_fs/file_system/rest_list_dir.rb +84 -0
- data/lib/chef/chef_fs/file_system/rest_list_entry.rb +123 -0
- data/lib/chef/chef_fs/knife.rb +77 -0
- data/lib/chef/chef_fs/path_utils.rb +64 -0
- data/lib/chef/client.rb +44 -21
- data/lib/chef/config.rb +52 -43
- data/lib/chef/cookbook/synchronizer.rb +6 -8
- data/lib/chef/cookbook/syntax_check.rb +61 -14
- data/lib/chef/cookbook_loader.rb +39 -26
- data/lib/chef/cookbook_uploader.rb +17 -19
- data/lib/chef/cookbook_version.rb +3 -302
- data/lib/chef/daemon.rb +3 -18
- data/lib/chef/data_bag.rb +4 -97
- data/lib/chef/data_bag_item.rb +2 -65
- data/lib/chef/digester.rb +73 -0
- data/lib/chef/dsl.rb +6 -0
- data/lib/chef/dsl/data_query.rb +66 -0
- data/lib/chef/dsl/include_attribute.rb +60 -0
- data/lib/chef/dsl/include_recipe.rb +42 -0
- data/lib/chef/dsl/platform_introspection.rb +213 -0
- data/lib/chef/dsl/recipe.rb +84 -0
- data/lib/chef/dsl/registry_helper.rb +59 -0
- data/lib/chef/encrypted_data_bag_item.rb +74 -19
- data/lib/chef/environment.rb +9 -180
- data/lib/chef/exceptions.rb +87 -14
- data/lib/chef/formatters/base.rb +4 -1
- data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +0 -4
- data/lib/chef/json_compat.rb +1 -97
- data/lib/chef/knife.rb +90 -41
- data/lib/chef/knife/bootstrap/archlinux-gems.erb +2 -2
- data/lib/chef/knife/bootstrap/centos5-gems.erb +2 -2
- data/lib/chef/knife/bootstrap/chef-full.erb +3 -3
- data/lib/chef/knife/bootstrap/fedora13-gems.erb +2 -2
- data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +2 -2
- data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +2 -2
- data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +2 -2
- data/lib/chef/knife/configure.rb +1 -2
- data/lib/chef/knife/cookbook_metadata.rb +1 -0
- data/lib/chef/knife/cookbook_test.rb +3 -2
- data/lib/chef/knife/cookbook_upload.rb +12 -7
- data/lib/chef/knife/core/bootstrap_context.rb +1 -1
- data/lib/chef/knife/core/generic_presenter.rb +26 -13
- data/lib/chef/knife/core/node_editor.rb +36 -16
- data/lib/chef/knife/core/node_presenter.rb +1 -1
- data/lib/chef/knife/core/text_formatter.rb +23 -37
- data/lib/chef/knife/core/ui.rb +15 -9
- data/lib/chef/knife/delete.rb +39 -0
- data/lib/chef/knife/diff.rb +46 -0
- data/lib/chef/knife/download.rb +50 -0
- data/lib/chef/knife/environment_show.rb +7 -0
- data/lib/chef/knife/exec.rb +5 -5
- data/lib/chef/knife/help_topics.rb +1 -1
- data/lib/chef/knife/index_rebuild.rb +91 -7
- data/lib/chef/knife/list.rb +109 -0
- data/lib/chef/knife/raw.rb +108 -0
- data/lib/chef/knife/search.rb +40 -22
- data/lib/chef/knife/show.rb +32 -0
- data/lib/chef/knife/ssh.rb +6 -2
- data/lib/chef/knife/upload.rb +50 -0
- data/lib/chef/mixin/checksum.rb +3 -3
- data/lib/chef/mixin/deep_merge.rb +55 -197
- data/lib/chef/mixin/language.rb +9 -222
- data/lib/chef/mixin/language_include_attribute.rb +6 -38
- data/lib/chef/mixin/language_include_recipe.rb +3 -35
- data/lib/chef/mixin/params_validate.rb +6 -19
- data/lib/chef/mixin/recipe_definition_dsl_core.rb +8 -61
- data/lib/chef/mixin/securable.rb +32 -7
- data/lib/chef/mixin/template.rb +40 -0
- data/lib/chef/mixins.rb +0 -4
- data/lib/chef/monkey_patches/net_http.rb +0 -34
- data/lib/chef/node.rb +133 -309
- data/lib/chef/node/attribute.rb +333 -473
- data/lib/chef/node/attribute_collections.rb +199 -0
- data/lib/chef/node/immutable_collections.rb +186 -0
- data/lib/chef/platform.rb +7 -22
- data/lib/chef/provider.rb +2 -49
- data/lib/chef/provider/breakpoint.rb +6 -6
- data/lib/chef/provider/cookbook_file.rb +5 -33
- data/lib/chef/provider/deploy.rb +2 -1
- data/lib/chef/provider/directory.rb +14 -17
- data/lib/chef/provider/file.rb +19 -52
- data/lib/chef/provider/group.rb +31 -51
- data/lib/chef/provider/group/dscl.rb +13 -53
- data/lib/chef/provider/group/gpasswd.rb +19 -14
- data/lib/chef/provider/group/groupadd.rb +1 -41
- data/lib/chef/provider/group/groupmod.rb +36 -46
- data/lib/chef/provider/group/pw.rb +16 -59
- data/lib/chef/provider/group/suse.rb +13 -16
- data/lib/chef/provider/group/usermod.rb +18 -40
- data/lib/chef/provider/group/windows.rb +6 -13
- data/lib/chef/provider/http_request.rb +25 -42
- data/lib/chef/provider/link.rb +2 -0
- data/lib/chef/provider/lwrp_base.rb +150 -0
- data/lib/chef/provider/package/portage.rb +4 -9
- data/lib/chef/provider/package/rpm.rb +2 -2
- data/lib/chef/provider/package/rubygems.rb +9 -41
- data/lib/chef/provider/package/yum.rb +12 -19
- data/lib/chef/provider/registry_key.rb +156 -0
- data/lib/chef/provider/remote_directory.rb +2 -0
- data/lib/chef/provider/remote_file.rb +21 -12
- data/lib/chef/provider/ruby_block.rb +5 -2
- data/lib/chef/provider/service.rb +15 -0
- data/lib/chef/provider/service/init.rb +9 -7
- data/lib/chef/provider/service/macosx.rb +15 -73
- data/lib/chef/provider/service/simple.rb +1 -1
- data/lib/chef/provider/service/solaris.rb +3 -3
- data/lib/chef/provider/template.rb +22 -25
- data/lib/chef/provider/template_finder.rb +61 -0
- data/lib/chef/provider/user.rb +0 -1
- data/lib/chef/provider/user/dscl.rb +175 -568
- data/lib/chef/provider/user/useradd.rb +30 -47
- data/lib/chef/providers.rb +3 -2
- data/lib/chef/recipe.rb +14 -8
- data/lib/chef/resource.rb +13 -154
- data/lib/chef/resource/group.rb +1 -11
- data/lib/chef/resource/http_request.rb +2 -1
- data/lib/chef/resource/lwrp_base.rb +127 -0
- data/lib/chef/resource/mount.rb +10 -11
- data/lib/chef/resource/registry_key.rb +86 -0
- data/lib/chef/resource/remote_directory.rb +6 -5
- data/lib/chef/resource/remote_file.rb +22 -31
- data/lib/chef/resource/ruby_block.rb +2 -2
- data/lib/chef/resource/service.rb +14 -0
- data/lib/chef/resource/user.rb +0 -18
- data/lib/chef/resource_collection.rb +25 -21
- data/lib/chef/resources.rb +2 -1
- data/lib/chef/rest.rb +50 -131
- data/lib/chef/rest/auth_credentials.rb +4 -20
- data/lib/chef/rest/rest_request.rb +2 -7
- data/lib/chef/role.rb +1 -97
- data/lib/chef/run_context.rb +108 -130
- data/lib/chef/run_context/cookbook_compiler.rb +280 -0
- data/lib/chef/run_list.rb +0 -2
- data/lib/chef/run_list/run_list_expansion.rb +0 -15
- data/lib/chef/run_lock.rb +90 -0
- data/lib/chef/runner.rb +28 -5
- data/lib/chef/sandbox.rb +15 -148
- data/lib/chef/scan_access_control.rb +2 -4
- data/lib/chef/shef/ext.rb +3 -575
- data/lib/chef/{shef.rb → shell.rb} +35 -40
- data/lib/chef/shell/ext.rb +593 -0
- data/lib/chef/{shef → shell}/model_wrapper.rb +3 -3
- data/lib/chef/{shef/shef_rest.rb → shell/shell_rest.rb} +4 -4
- data/lib/chef/{shef/shef_session.rb → shell/shell_session.rb} +17 -15
- data/lib/chef/shell_out.rb +7 -0
- data/lib/chef/util/windows/net_group.rb +1 -5
- data/lib/chef/version.rb +3 -3
- data/lib/chef/win32/api/process.rb +0 -1
- data/lib/chef/win32/handle.rb +1 -8
- data/lib/chef/win32/registry.rb +371 -0
- data/spec/data/big_json.json +1 -2
- data/spec/data/big_json_plus_one.json +1 -2
- data/spec/data/cookbooks/openldap/attributes/default.rb +10 -9
- data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
- data/spec/data/lwrp/providers/inline_compiler.rb +26 -0
- data/spec/data/nodes/default.rb +3 -3
- data/spec/data/nodes/test.example.com.rb +3 -3
- data/spec/data/nodes/test.rb +3 -3
- data/spec/data/partial_one.erb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +4 -0
- data/spec/data/run_context/cookbooks/circular-dep1/definitions/circular_dep1_res.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep1/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep1/metadata.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep1/providers/provider.rb +1 -0
- data/spec/data/{knife-home/.chef/plugins/knife/example_home_subcommand.rb → run_context/cookbooks/circular-dep1/recipes/default.rb} +0 -0
- data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/circular-dep2/definitions/circular_dep2_res.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep2/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep2/metadata.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep2/providers/provider.rb +1 -0
- data/spec/data/{lwrp_const_scoping/resources/conflict.rb → run_context/cookbooks/circular-dep2/recipes/default.rb} +0 -0
- data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +3 -0
- data/spec/data/run_context/cookbooks/dependency1/definitions/dependency1_res.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency1/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency1/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency1/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/dependency2/definitions/dependency2_res.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency2/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency2/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency2/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +3 -0
- data/spec/data/run_context/cookbooks/no-default-attr/definitions/no_default-attr_res.rb +1 -0
- data/spec/data/run_context/cookbooks/no-default-attr/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/no-default-attr/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/definitions/test_with-circular-deps_res.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/metadata.rb +2 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/test-with-deps/definitions/test_with-deps_res.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/libraries/lib.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/metadata.rb +3 -0
- data/spec/data/run_context/cookbooks/test-with-deps/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/test-with-deps/recipes/server.rb +0 -0
- data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/test/attributes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -1
- data/spec/data/run_context/cookbooks/test/definitions/test_res.rb +1 -0
- data/spec/data/run_context/cookbooks/test/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/test/resources/resource.rb +1 -0
- data/spec/data/shef-config.rb +7 -0
- data/spec/functional/dsl/registry_helper_spec.rb +63 -0
- data/spec/functional/knife/cookbook_delete_spec.rb +1 -1
- data/spec/functional/knife/exec_spec.rb +2 -2
- data/spec/functional/knife/ssh_spec.rb +5 -1
- data/spec/functional/resource/cookbook_file_spec.rb +7 -19
- data/spec/functional/resource/directory_spec.rb +4 -0
- data/spec/functional/resource/file_spec.rb +56 -22
- data/spec/functional/resource/link_spec.rb +2 -0
- data/spec/functional/resource/registry_spec.rb +576 -0
- data/spec/functional/resource/remote_directory_spec.rb +142 -36
- data/spec/functional/resource/remote_file_spec.rb +18 -0
- data/spec/functional/resource/template_spec.rb +23 -2
- data/spec/functional/run_lock_spec.rb +106 -0
- data/spec/functional/shell_spec.rb +100 -0
- data/spec/functional/win32/registry_helper_spec.rb +632 -0
- data/spec/spec_helper.rb +5 -29
- data/spec/stress/win32/security_spec.rb +1 -1
- data/spec/support/chef_helpers.rb +0 -2
- data/spec/support/platform_helpers.rb +8 -15
- data/spec/support/shared/functional/directory_resource.rb +84 -22
- data/spec/support/shared/functional/file_resource.rb +169 -71
- data/spec/support/shared/functional/securable_resource.rb +143 -119
- data/spec/support/shared/functional/securable_resource_with_reporting.rb +375 -0
- data/spec/support/shared/unit/file_system_support.rb +110 -0
- data/spec/support/shared/unit/platform_introspector.rb +162 -0
- data/spec/unit/api_client/registration_spec.rb +175 -0
- data/spec/unit/api_client_spec.rb +78 -156
- data/spec/unit/application/apply.rb +84 -0
- data/spec/unit/application/client_spec.rb +1 -37
- data/spec/unit/application/knife_spec.rb +5 -0
- data/spec/unit/application_spec.rb +57 -2
- data/spec/unit/checksum/storage/filesystem_spec.rb +1 -1
- data/spec/unit/chef_fs/diff_spec.rb +328 -0
- data/spec/unit/chef_fs/file_pattern_spec.rb +526 -0
- data/spec/unit/chef_fs/file_system/chef_server_root_dir_spec.rb +237 -0
- data/spec/unit/chef_fs/file_system/cookbooks_dir_spec.rb +568 -0
- data/spec/unit/chef_fs/file_system/data_bags_dir_spec.rb +220 -0
- data/spec/unit/chef_fs/file_system_spec.rb +136 -0
- data/spec/unit/client_spec.rb +124 -33
- data/spec/unit/config_spec.rb +46 -13
- data/spec/unit/cookbook/synchronizer_spec.rb +1 -49
- data/spec/unit/cookbook/syntax_check_spec.rb +48 -109
- data/spec/unit/cookbook_loader_spec.rb +153 -91
- data/spec/unit/cookbook_manifest_spec.rb +81 -81
- data/spec/unit/cookbook_spec.rb +3 -20
- data/spec/unit/cookbook_version_spec.rb +23 -122
- data/spec/unit/daemon_spec.rb +3 -24
- data/spec/unit/data_bag_spec.rb +6 -4
- data/spec/unit/digester_spec.rb +50 -0
- data/spec/unit/dsl/data_query_spec.rb +66 -0
- data/spec/unit/dsl/platform_introspection_spec.rb +130 -0
- data/spec/unit/dsl/regsitry_helper_spec.rb +55 -0
- data/spec/unit/encrypted_data_bag_item_spec.rb +50 -105
- data/spec/unit/environment_spec.rb +0 -130
- data/spec/unit/exceptions_spec.rb +2 -3
- data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +3 -3
- data/spec/unit/json_compat_spec.rb +15 -7
- data/spec/unit/knife/bootstrap_spec.rb +2 -0
- data/spec/unit/knife/configure_spec.rb +20 -14
- data/spec/unit/knife/cookbook_metadata_spec.rb +11 -4
- data/spec/unit/knife/cookbook_test_spec.rb +1 -0
- data/spec/unit/knife/cookbook_upload_spec.rb +43 -8
- data/spec/unit/knife/core/bootstrap_context_spec.rb +1 -1
- data/spec/unit/knife/core/ui_spec.rb +156 -125
- data/spec/unit/knife/data_bag_create_spec.rb +9 -0
- data/spec/unit/knife/data_bag_edit_spec.rb +1 -4
- data/spec/unit/knife/data_bag_from_file_spec.rb +4 -6
- data/spec/unit/knife/data_bag_show_spec.rb +11 -4
- data/spec/unit/knife/index_rebuild_spec.rb +96 -33
- data/spec/unit/knife/knife_help.rb +7 -7
- data/spec/unit/knife/node_edit_spec.rb +6 -33
- data/spec/unit/knife/node_run_list_remove_spec.rb +2 -1
- data/spec/unit/knife/ssh_spec.rb +12 -15
- data/spec/unit/knife/status_spec.rb +2 -2
- data/spec/unit/knife_spec.rb +53 -0
- data/spec/unit/lwrp_spec.rb +59 -42
- data/spec/unit/mixin/checksum_spec.rb +2 -2
- data/spec/unit/mixin/deep_merge_spec.rb +101 -799
- data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +6 -1
- data/spec/unit/mixin/params_validate_spec.rb +4 -37
- data/spec/unit/mixin/securable_spec.rb +5 -3
- data/spec/unit/mixin/template_spec.rb +119 -0
- data/spec/unit/node/attribute_spec.rb +195 -173
- data/spec/unit/node/immutable_collections_spec.rb +139 -0
- data/spec/unit/node_spec.rb +366 -370
- data/spec/unit/platform_spec.rb +9 -10
- data/spec/unit/provider/breakpoint_spec.rb +8 -8
- data/spec/unit/provider/cookbook_file_spec.rb +4 -8
- data/spec/unit/provider/directory_spec.rb +96 -64
- data/spec/unit/provider/env_spec.rb +2 -2
- data/spec/unit/provider/file_spec.rb +48 -39
- data/spec/unit/provider/group/dscl_spec.rb +0 -36
- data/spec/unit/provider/group/gpasswd_spec.rb +9 -16
- data/spec/unit/provider/group/groupadd_spec.rb +4 -3
- data/spec/unit/provider/group/groupmod_spec.rb +1 -0
- data/spec/unit/provider/group/pw_spec.rb +15 -12
- data/spec/unit/provider/group/usermod_spec.rb +6 -21
- data/spec/unit/provider/group/windows_spec.rb +8 -0
- data/spec/unit/provider/group_spec.rb +6 -28
- data/spec/unit/provider/http_request_spec.rb +28 -69
- data/spec/unit/provider/ifconfig_spec.rb +2 -2
- data/spec/unit/provider/ohai_spec.rb +4 -4
- data/spec/unit/provider/package/apt_spec.rb +0 -1
- data/spec/unit/provider/package/ips_spec.rb +0 -1
- data/spec/unit/provider/package/portage_spec.rb +0 -44
- data/spec/unit/provider/package/rpm_spec.rb +0 -12
- data/spec/unit/provider/package/rubygems_spec.rb +1 -44
- data/spec/unit/provider/package/yum_spec.rb +39 -36
- data/spec/unit/provider/package_spec.rb +7 -5
- data/spec/unit/provider/registry_key_spec.rb +269 -0
- data/spec/unit/provider/remote_directory_spec.rb +7 -3
- data/spec/unit/provider/remote_file_spec.rb +36 -0
- data/spec/unit/provider/route_spec.rb +4 -3
- data/spec/unit/provider/ruby_block_spec.rb +8 -0
- data/spec/unit/provider/service/arch_service_spec.rb +5 -5
- data/spec/unit/provider/service/debian_service_spec.rb +1 -1
- data/spec/unit/provider/service/freebsd_service_spec.rb +5 -5
- data/spec/unit/provider/service/init_service_spec.rb +27 -4
- data/spec/unit/provider/service/insserv_service_spec.rb +1 -1
- data/spec/unit/provider/service/invokercd_service_spec.rb +4 -4
- data/spec/unit/provider/service/macosx_spec.rb +11 -66
- data/spec/unit/provider/service/redhat_spec.rb +1 -1
- data/spec/unit/provider/service/simple_service_spec.rb +3 -3
- data/spec/unit/provider/service/upstart_service_spec.rb +9 -9
- data/spec/unit/provider/subversion_spec.rb +1 -1
- data/spec/unit/provider/template_spec.rb +35 -11
- data/spec/unit/provider/user/dscl_spec.rb +285 -681
- data/spec/unit/provider/user/useradd_spec.rb +1 -22
- data/spec/unit/provider/user_spec.rb +1 -1
- data/spec/unit/recipe_spec.rb +10 -8
- data/spec/unit/registry_helper_spec.rb +374 -0
- data/spec/unit/resource/mount_spec.rb +0 -11
- data/spec/unit/resource/registry_key_spec.rb +171 -0
- data/spec/unit/resource/remote_file_spec.rb +21 -23
- data/spec/unit/resource/ruby_block_spec.rb +7 -3
- data/spec/unit/resource/service_spec.rb +11 -0
- data/spec/unit/resource_spec.rb +4 -19
- data/spec/unit/rest/auth_credentials_spec.rb +2 -19
- data/spec/unit/rest_spec.rb +130 -284
- data/spec/unit/run_context/cookbook_compiler_spec.rb +181 -0
- data/spec/unit/run_context_spec.rb +18 -4
- data/spec/unit/run_list_spec.rb +0 -209
- data/spec/unit/run_lock_spec.rb +37 -0
- data/spec/unit/runner_spec.rb +101 -2
- data/spec/unit/scan_access_control_spec.rb +4 -4
- data/spec/unit/{shef → shell}/model_wrapper_spec.rb +5 -5
- data/spec/unit/{shef/shef_ext_spec.rb → shell/shell_ext_spec.rb} +21 -21
- data/spec/unit/{shef/shef_session_spec.rb → shell/shell_session_spec.rb} +14 -69
- data/spec/unit/shell_out_spec.rb +18 -0
- data/spec/unit/{shef_spec.rb → shell_spec.rb} +20 -20
- metadata +275 -234
- checksums.yaml +0 -15
- data/README.rdoc +0 -177
- data/distro/common/html/knife-recipe.1.html +0 -92
- data/lib/chef/certificate.rb +0 -161
- data/lib/chef/checksum.rb +0 -167
- data/lib/chef/checksum_cache.rb +0 -190
- data/lib/chef/cookbook_version_selector.rb +0 -168
- data/lib/chef/couchdb.rb +0 -246
- data/lib/chef/index_queue/amqp_client.rb +0 -116
- data/lib/chef/index_queue/consumer.rb +0 -76
- data/lib/chef/index_queue/indexable.rb +0 -109
- data/lib/chef/knife/bootstrap/ubuntu12.10-gems.erb +0 -60
- data/lib/chef/monkey_patches/moneta.rb +0 -50
- data/lib/chef/monkey_patches/uri.rb +0 -70
- data/lib/chef/openid_registration.rb +0 -187
- data/lib/chef/provider/user/solaris.rb +0 -90
- data/lib/chef/solr_query.rb +0 -187
- data/lib/chef/solr_query/lucene.treetop +0 -150
- data/lib/chef/solr_query/lucene_nodes.rb +0 -285
- data/lib/chef/solr_query/query_transform.rb +0 -65
- data/lib/chef/solr_query/solr_http_request.rb +0 -132
- data/lib/chef/webui_user.rb +0 -231
- data/spec/data/cookbooks/openldap/files/default/.dotfile +0 -1
- data/spec/data/cookbooks/openldap/files/default/.ssh/id_rsa +0 -1
- data/spec/data/cookbooks/openldap/files/default/remotedir/.a_dotdir/.a_dotfile_in_a_dotdir +0 -1
- data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/.a_dotfile +0 -1
- data/spec/data/mac_users/10.7-8.plist.xml +0 -559
- data/spec/data/mac_users/10.7-8.shadow.xml +0 -11
- data/spec/data/mac_users/10.7.plist.xml +0 -559
- data/spec/data/mac_users/10.7.shadow.xml +0 -11
- data/spec/data/mac_users/10.8.plist.xml +0 -559
- data/spec/data/mac_users/10.8.shadow.xml +0 -21
- data/spec/data/mac_users/10.9.plist.xml +0 -560
- data/spec/data/mac_users/10.9.shadow.xml +0 -21
- data/spec/functional/resource/base.rb +0 -40
- data/spec/functional/resource/group_spec.rb +0 -343
- data/spec/functional/resource/user/dscl_spec.rb +0 -199
- data/spec/unit/certificate_spec.rb +0 -76
- data/spec/unit/checksum_cache_spec.rb +0 -209
- data/spec/unit/checksum_spec.rb +0 -94
- data/spec/unit/couchdb_spec.rb +0 -274
- data/spec/unit/index_queue_spec.rb +0 -391
- data/spec/unit/mixin/language_spec.rb +0 -305
- data/spec/unit/openid_registration_spec.rb +0 -153
- data/spec/unit/provider/user/solaris_spec.rb +0 -414
- data/spec/unit/provider/whyrun_safe_ruby_block_spec.rb +0 -47
- data/spec/unit/solr_query/query_transform_spec.rb +0 -454
- data/spec/unit/solr_query/solr_http_request_spec.rb +0 -244
- data/spec/unit/solr_query_spec.rb +0 -203
- data/spec/unit/webui_user_spec.rb +0 -238
|
@@ -9,13 +9,15 @@ __knife__ __exec__ _(options)_
|
|
|
9
9
|
Provide a snippet of code to evaluate on the command line
|
|
10
10
|
|
|
11
11
|
## DESCRIPTION
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
|
|
13
|
+
`knife exec` runs arbitrary ruby scripts in a context similar to that
|
|
14
|
+
of the chef-shell(1) DSL. See the chef-shell documentation for a
|
|
15
|
+
description of the commands available.
|
|
15
16
|
|
|
16
17
|
## EXAMPLES
|
|
18
|
+
|
|
17
19
|
* Make an API call against an arbitrary endpoint:
|
|
18
|
-
knife exec -E 'api.get("nodes/fluke.localdomain/cookbooks")'
|
|
20
|
+
knife exec -E 'api.get("nodes/fluke.localdomain/cookbooks")'
|
|
19
21
|
=> list of cookbooks for the node _fluke.localdomain_
|
|
20
22
|
* Remove the role _obsolete_ from all nodes:
|
|
21
23
|
knife exec -E 'nodes.transform(:all){|n| n.run\_list.delete("role[obsolete]")}'
|
|
@@ -23,15 +25,18 @@ commands available.
|
|
|
23
25
|
knife exec -E 'nodes.find(:roles => "webserver") {|n| n.expand!; n[:recipes]}'
|
|
24
26
|
|
|
25
27
|
## SEE ALSO
|
|
26
|
-
|
|
28
|
+
|
|
29
|
+
__chef-shell(1)__
|
|
27
30
|
|
|
28
31
|
## AUTHOR
|
|
32
|
+
|
|
29
33
|
Chef was written by Adam Jacob <adam@opscode.com> with many contributions from the community.
|
|
30
34
|
|
|
31
35
|
## DOCUMENTATION
|
|
36
|
+
|
|
32
37
|
This manual page was written by Joshua Timberman <joshua@opscode.com>.
|
|
33
38
|
Permission is granted to copy, distribute and / or modify this document under the terms of the Apache 2.0 License.
|
|
34
39
|
|
|
35
40
|
## CHEF
|
|
36
|
-
Knife is distributed with Chef. <http://wiki.opscode.com/display/chef/Home>
|
|
37
41
|
|
|
42
|
+
Knife is distributed with Chef. <http://wiki.opscode.com/display/chef/Home>
|
|
@@ -98,14 +98,9 @@ If the config file exists, knife uses these settings for __GENERAL OPTIONS__ def
|
|
|
98
98
|
* `chef_server_url`:
|
|
99
99
|
URL of the Chef server. Corresponds to the `-s` or `--server-url`
|
|
100
100
|
option. This is requested from the user when running this sub-command.
|
|
101
|
-
* `
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
File, LMC, Memcache, Memory, MongoDB, Redis, Rufus, S3, SDBM, Tyrant,
|
|
105
|
-
Xattr, YAML.
|
|
106
|
-
* `cache_options`:
|
|
107
|
-
Specifies various options to use for caching. These options are
|
|
108
|
-
dependent on the `cache_type`.
|
|
101
|
+
* `syntax_check_cache_path`:
|
|
102
|
+
Specifies the path to a directory where knife caches information
|
|
103
|
+
about files that it has syntax checked.
|
|
109
104
|
* `validation_client_name`:
|
|
110
105
|
Specifies the name of the client used to validate new clients.
|
|
111
106
|
* `validation_key`:
|
|
@@ -183,7 +178,7 @@ recommended though, and git fits with a lot of the workflow paradigms.
|
|
|
183
178
|
data editing entirely.
|
|
184
179
|
|
|
185
180
|
## SEE ALSO
|
|
186
|
-
__chef-client(8)__ __chef-server(8)__
|
|
181
|
+
__chef-client(8)__ __chef-server(8)__ __chef-shell(1)__
|
|
187
182
|
|
|
188
183
|
__knife-bootstrap(1)__ __knife-client(1)__ __knife-configure(1)__
|
|
189
184
|
__knife-cookbook-site(1)__ __knife-cookbook(1)__ __knife-data-bag(1)__
|
|
@@ -41,7 +41,7 @@ running_pid() {
|
|
|
41
41
|
name=$2
|
|
42
42
|
[ -z "$pid" ] && return 1
|
|
43
43
|
[ ! -d /proc/$pid ] && return 1
|
|
44
|
-
cmd=`
|
|
44
|
+
cmd=`awk '/Name:/ {print $2}' /proc/$pid/status`
|
|
45
45
|
[ "$cmd" != "$name" ] && return 1
|
|
46
46
|
return 0
|
|
47
47
|
}
|
|
@@ -49,7 +49,7 @@ running_pid() {
|
|
|
49
49
|
running() {
|
|
50
50
|
[ ! -f "$PIDFILE" ] && return 1
|
|
51
51
|
pid=`cat $PIDFILE`
|
|
52
|
-
running_pid $pid $
|
|
52
|
+
running_pid $pid $NAME || return 1
|
|
53
53
|
return 0
|
|
54
54
|
}
|
|
55
55
|
|
data/lib/chef.rb
CHANGED
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
7
|
# you may not use this file except in compliance with the License.
|
|
8
8
|
# You may obtain a copy of the License at
|
|
9
|
-
#
|
|
9
|
+
#
|
|
10
10
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
-
#
|
|
11
|
+
#
|
|
12
12
|
# Unless required by applicable law or agreed to in writing, software
|
|
13
13
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
14
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
@@ -27,8 +27,6 @@ require 'chef/resources'
|
|
|
27
27
|
require 'chef/shell_out'
|
|
28
28
|
|
|
29
29
|
require 'chef/daemon'
|
|
30
|
-
require 'chef/webui_user'
|
|
31
|
-
require 'chef/openid_registration'
|
|
32
30
|
|
|
33
31
|
require 'chef/run_status'
|
|
34
32
|
require 'chef/handler'
|
|
@@ -39,4 +37,3 @@ require 'chef/monkey_patches/dir'
|
|
|
39
37
|
require 'chef/monkey_patches/string'
|
|
40
38
|
require 'chef/monkey_patches/numeric'
|
|
41
39
|
require 'chef/monkey_patches/object'
|
|
42
|
-
require 'chef/monkey_patches/uri'
|
data/lib/chef/api_client.rb
CHANGED
|
@@ -20,9 +20,6 @@
|
|
|
20
20
|
require 'chef/config'
|
|
21
21
|
require 'chef/mixin/params_validate'
|
|
22
22
|
require 'chef/mixin/from_file'
|
|
23
|
-
require 'chef/couchdb'
|
|
24
|
-
require 'chef/certificate'
|
|
25
|
-
require 'chef/index_queue'
|
|
26
23
|
require 'chef/mash'
|
|
27
24
|
require 'chef/json_compat'
|
|
28
25
|
require 'chef/search/query'
|
|
@@ -32,51 +29,13 @@ class Chef
|
|
|
32
29
|
|
|
33
30
|
include Chef::Mixin::FromFile
|
|
34
31
|
include Chef::Mixin::ParamsValidate
|
|
35
|
-
include Chef::IndexQueue::Indexable
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
DESIGN_DOCUMENT = {
|
|
39
|
-
"version" => 1,
|
|
40
|
-
"language" => "javascript",
|
|
41
|
-
"views" => {
|
|
42
|
-
"all" => {
|
|
43
|
-
"map" => <<-EOJS
|
|
44
|
-
function(doc) {
|
|
45
|
-
if (doc.chef_type == "client") {
|
|
46
|
-
emit(doc.name, doc);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
EOJS
|
|
50
|
-
},
|
|
51
|
-
"all_id" => {
|
|
52
|
-
"map" => <<-EOJS
|
|
53
|
-
function(doc) {
|
|
54
|
-
if (doc.chef_type == "client") {
|
|
55
|
-
emit(doc.name, doc.name);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
EOJS
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
INDEX_OBJECT_TYPE = 'client'.freeze
|
|
64
|
-
|
|
65
|
-
def self.index_object_type
|
|
66
|
-
INDEX_OBJECT_TYPE
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
attr_accessor :couchdb_rev, :couchdb_id, :couchdb
|
|
70
32
|
|
|
71
33
|
# Create a new Chef::ApiClient object.
|
|
72
|
-
def initialize
|
|
34
|
+
def initialize
|
|
73
35
|
@name = ''
|
|
74
36
|
@public_key = nil
|
|
75
37
|
@private_key = nil
|
|
76
|
-
@couchdb_rev = nil
|
|
77
|
-
@couchdb_id = nil
|
|
78
38
|
@admin = false
|
|
79
|
-
@couchdb = (couchdb || Chef::CouchDB.new)
|
|
80
39
|
end
|
|
81
40
|
|
|
82
41
|
# Gets or sets the client name.
|
|
@@ -127,19 +86,8 @@ class Chef
|
|
|
127
86
|
)
|
|
128
87
|
end
|
|
129
88
|
|
|
130
|
-
#
|
|
131
|
-
#
|
|
132
|
-
#
|
|
133
|
-
# @return [True]
|
|
134
|
-
def create_keys
|
|
135
|
-
results = Chef::Certificate.gen_keypair(self.name)
|
|
136
|
-
self.public_key(results[0].to_s)
|
|
137
|
-
self.private_key(results[1].to_s)
|
|
138
|
-
true
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
# The hash representation of the object. Includes the name and public_key,
|
|
142
|
-
# but never the private key.
|
|
89
|
+
# The hash representation of the object. Includes the name and public_key.
|
|
90
|
+
# Private key is included if available.
|
|
143
91
|
#
|
|
144
92
|
# @return [Hash]
|
|
145
93
|
def to_hash
|
|
@@ -150,7 +98,7 @@ class Chef
|
|
|
150
98
|
'json_class' => self.class.name,
|
|
151
99
|
"chef_type" => "client"
|
|
152
100
|
}
|
|
153
|
-
result["
|
|
101
|
+
result["private_key"] = @private_key if @private_key
|
|
154
102
|
result
|
|
155
103
|
end
|
|
156
104
|
|
|
@@ -164,21 +112,14 @@ class Chef
|
|
|
164
112
|
def self.json_create(o)
|
|
165
113
|
client = Chef::ApiClient.new
|
|
166
114
|
client.name(o["name"] || o["clientname"])
|
|
167
|
-
client.private_key(o["private_key"]) if o
|
|
115
|
+
client.private_key(o["private_key"]) if o.key?("private_key")
|
|
168
116
|
client.public_key(o["public_key"])
|
|
169
117
|
client.admin(o["admin"])
|
|
170
|
-
client.couchdb_rev = o["_rev"]
|
|
171
|
-
client.couchdb_id = o["_id"]
|
|
172
|
-
client.index_id = client.couchdb_id
|
|
173
118
|
client
|
|
174
119
|
end
|
|
175
120
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
def self.cdb_list(inflate=false, couchdb=nil)
|
|
179
|
-
rs = (couchdb || Chef::CouchDB.new).list("clients", inflate)
|
|
180
|
-
lookup = (inflate ? "value" : "key")
|
|
181
|
-
rs["rows"].collect { |r| r[lookup] }
|
|
121
|
+
def self.http_api
|
|
122
|
+
Chef::REST.new(Chef::Config[:chef_server_url])
|
|
182
123
|
end
|
|
183
124
|
|
|
184
125
|
def self.reregister(name)
|
|
@@ -195,21 +136,13 @@ class Chef
|
|
|
195
136
|
end
|
|
196
137
|
response
|
|
197
138
|
else
|
|
198
|
-
|
|
139
|
+
http_api.get("clients")
|
|
199
140
|
end
|
|
200
141
|
end
|
|
201
142
|
|
|
202
|
-
# Load a client by name from CouchDB
|
|
203
|
-
#
|
|
204
|
-
# @params [String] The name of the client to load
|
|
205
|
-
# @return [Chef::ApiClient] The resulting Chef::ApiClient object
|
|
206
|
-
def self.cdb_load(name, couchdb=nil)
|
|
207
|
-
(couchdb || Chef::CouchDB.new).load("client", name)
|
|
208
|
-
end
|
|
209
|
-
|
|
210
143
|
# Load a client by name via the API
|
|
211
144
|
def self.load(name)
|
|
212
|
-
response =
|
|
145
|
+
response = http_api.get("clients/#{name}")
|
|
213
146
|
if response.kind_of?(Chef::ApiClient)
|
|
214
147
|
response
|
|
215
148
|
else
|
|
@@ -219,69 +152,27 @@ class Chef
|
|
|
219
152
|
end
|
|
220
153
|
end
|
|
221
154
|
|
|
222
|
-
# Remove this client from the CouchDB
|
|
223
|
-
#
|
|
224
|
-
# @params [String] The name of the client to delete
|
|
225
|
-
# @return [Chef::ApiClient] The last version of the object
|
|
226
|
-
def cdb_destroy
|
|
227
|
-
@couchdb.delete("client", @name, @couchdb_rev)
|
|
228
|
-
end
|
|
229
|
-
|
|
230
155
|
# Remove this client via the REST API
|
|
231
156
|
def destroy
|
|
232
|
-
|
|
233
|
-
end
|
|
234
|
-
|
|
235
|
-
# Save this client to the CouchDB
|
|
236
|
-
def cdb_save
|
|
237
|
-
@couchdb_rev = @couchdb.store("client", @name, self)["rev"]
|
|
157
|
+
http_api.delete("clients/#{@name}")
|
|
238
158
|
end
|
|
239
159
|
|
|
240
160
|
# Save this client via the REST API, returns a hash including the private key
|
|
241
|
-
def save
|
|
242
|
-
# Implement CHEF-4373 with minimal churn to existing code:
|
|
243
|
-
return register_with_self_generated_key if new_key && validation && Chef::Config.local_key_generation
|
|
244
|
-
|
|
245
|
-
if validation
|
|
246
|
-
r = Chef::REST.new(Chef::Config[:chef_server_url], Chef::Config[:validation_client_name], Chef::Config[:validation_key])
|
|
247
|
-
else
|
|
248
|
-
r = Chef::REST.new(Chef::Config[:chef_server_url])
|
|
249
|
-
end
|
|
250
|
-
# First, try and create a new registration
|
|
161
|
+
def save
|
|
251
162
|
begin
|
|
252
|
-
|
|
163
|
+
http_api.put("clients/#{name}", { :name => self.name, :admin => self.admin})
|
|
253
164
|
rescue Net::HTTPServerException => e
|
|
254
165
|
# If that fails, go ahead and try and update it
|
|
255
|
-
if e.response.code == "
|
|
256
|
-
|
|
166
|
+
if e.response.code == "404"
|
|
167
|
+
http_api.post("clients", {:name => self.name, :admin => self.admin })
|
|
257
168
|
else
|
|
258
169
|
raise e
|
|
259
170
|
end
|
|
260
171
|
end
|
|
261
172
|
end
|
|
262
173
|
|
|
263
|
-
def register_with_self_generated_key
|
|
264
|
-
r = Chef::REST.new(Chef::Config[:chef_server_url], Chef::Config[:validation_client_name], Chef::Config[:validation_key])
|
|
265
|
-
pkey = OpenSSL::PKey::RSA.generate(2048)
|
|
266
|
-
client_data = {:name => name, :admin => false , :public_key => pkey.public_key.to_pem}
|
|
267
|
-
# First, try and create a new registration
|
|
268
|
-
r = begin
|
|
269
|
-
r.post_rest("clients", client_data)
|
|
270
|
-
rescue Net::HTTPServerException => e
|
|
271
|
-
# If that fails, go ahead and try and update it
|
|
272
|
-
if e.response.code == "409"
|
|
273
|
-
r.put_rest("clients/#{name}", client_data)
|
|
274
|
-
else
|
|
275
|
-
raise e
|
|
276
|
-
end
|
|
277
|
-
end
|
|
278
|
-
private_key(pkey.to_pem)
|
|
279
|
-
self
|
|
280
|
-
end
|
|
281
|
-
|
|
282
174
|
def reregister
|
|
283
|
-
|
|
284
|
-
reregistered_self = r.put_rest("clients/#{name}", { :name => name, :admin => admin, :private_key => true })
|
|
175
|
+
reregistered_self = http_api.put("clients/#{name}", { :name => name, :admin => admin, :private_key => true })
|
|
285
176
|
if reregistered_self.respond_to?(:[])
|
|
286
177
|
private_key(reregistered_self["private_key"])
|
|
287
178
|
else
|
|
@@ -292,12 +183,7 @@ class Chef
|
|
|
292
183
|
|
|
293
184
|
# Create the client via the REST API
|
|
294
185
|
def create
|
|
295
|
-
|
|
296
|
-
end
|
|
297
|
-
|
|
298
|
-
# Set up our CouchDB design document
|
|
299
|
-
def self.create_design_document(couchdb=nil)
|
|
300
|
-
(couchdb ||= Chef::CouchDB.new).create_design_document("clients", DESIGN_DOCUMENT)
|
|
186
|
+
http_api.post("clients", self)
|
|
301
187
|
end
|
|
302
188
|
|
|
303
189
|
# As a string
|
|
@@ -310,6 +196,10 @@ class Chef
|
|
|
310
196
|
"public_key:'#{public_key}' private_key:'#{private_key}'"
|
|
311
197
|
end
|
|
312
198
|
|
|
199
|
+
def http_api
|
|
200
|
+
@http_api ||= Chef::REST.new(Chef::Config[:chef_server_url])
|
|
201
|
+
end
|
|
202
|
+
|
|
313
203
|
end
|
|
314
204
|
end
|
|
315
205
|
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Daniel DeLeo (<dan@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2012 Opscode, Inc.
|
|
4
|
+
# License:: Apache License, Version 2.0
|
|
5
|
+
#
|
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
# you may not use this file except in compliance with the License.
|
|
8
|
+
# You may obtain a copy of the License at
|
|
9
|
+
#
|
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
#
|
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
# See the License for the specific language governing permissions and
|
|
16
|
+
# limitations under the License.
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
require 'chef/config'
|
|
20
|
+
require 'chef/rest'
|
|
21
|
+
require 'chef/exceptions'
|
|
22
|
+
|
|
23
|
+
class Chef
|
|
24
|
+
class ApiClient
|
|
25
|
+
|
|
26
|
+
# ==Chef::ApiClient::Registration
|
|
27
|
+
# Manages the process of creating or updating a Chef::ApiClient on the
|
|
28
|
+
# server and writing the resulting private key to disk. Registration uses
|
|
29
|
+
# the validator credentials for its API calls. This allows it to bootstrap
|
|
30
|
+
# a new client/node identity by borrowing the validator client identity
|
|
31
|
+
# when creating a new client.
|
|
32
|
+
class Registration
|
|
33
|
+
attr_reader :private_key
|
|
34
|
+
attr_reader :destination
|
|
35
|
+
attr_reader :name
|
|
36
|
+
|
|
37
|
+
def initialize(name, destination)
|
|
38
|
+
@name = name
|
|
39
|
+
@destination = destination
|
|
40
|
+
@private_key = nil
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Runs the client registration process, including creating the client on
|
|
44
|
+
# the chef-server and writing its private key to disk.
|
|
45
|
+
#--
|
|
46
|
+
# If client creation fails with a 5xx, it is retried up to 5 times. These
|
|
47
|
+
# retries are on top of the retries with randomized exponential backoff
|
|
48
|
+
# built in to Chef::REST. The retries here are a workaround for failures
|
|
49
|
+
# caused by resource contention in Hosted Chef when creating a very large
|
|
50
|
+
# number of clients simultaneously, (e.g., spinning up 100s of ec2 nodes
|
|
51
|
+
# at once). Future improvements to the affected component should make
|
|
52
|
+
# these retries unnecessary.
|
|
53
|
+
def run
|
|
54
|
+
assert_destination_writable!
|
|
55
|
+
retries = Config[:client_registration_retries] || 5
|
|
56
|
+
begin
|
|
57
|
+
create_or_update
|
|
58
|
+
rescue Net::HTTPFatalError => e
|
|
59
|
+
# HTTPFatalError implies 5xx.
|
|
60
|
+
raise if retries <= 0
|
|
61
|
+
retries -= 1
|
|
62
|
+
Chef::Log.warn("Failed to register new client, #{retries} tries remaining")
|
|
63
|
+
Chef::Log.warn("Response: HTTP #{e.response.code} - #{e}")
|
|
64
|
+
retry
|
|
65
|
+
end
|
|
66
|
+
write_key
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def assert_destination_writable!
|
|
70
|
+
if (File.exists?(destination) && !File.writable?(destination)) or !File.writable?(File.dirname(destination))
|
|
71
|
+
raise Chef::Exceptions::CannotWritePrivateKey, "I cannot write your private key to #{destination} - check permissions?"
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def write_key
|
|
76
|
+
::File.open(destination, file_flags, 0600) do |f|
|
|
77
|
+
f.print(private_key)
|
|
78
|
+
end
|
|
79
|
+
rescue IOError => e
|
|
80
|
+
raise Chef::Exceptions::CannotWritePrivateKey, "Error writing private key to #{destination}: #{e}"
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def create_or_update
|
|
84
|
+
create
|
|
85
|
+
rescue Net::HTTPServerException => e
|
|
86
|
+
# If create fails because the client exists, attempt to update. This
|
|
87
|
+
# requires admin privileges.
|
|
88
|
+
raise unless e.response.code == "409"
|
|
89
|
+
update
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def create
|
|
93
|
+
response = http_api.post("clients", :name => name, :admin => false)
|
|
94
|
+
@private_key = response["private_key"]
|
|
95
|
+
response
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def update
|
|
99
|
+
response = http_api.put("clients/#{name}", :name => name,
|
|
100
|
+
:admin => false,
|
|
101
|
+
:private_key => true)
|
|
102
|
+
if response.respond_to?(:private_key) # Chef 11
|
|
103
|
+
@private_key = response.private_key
|
|
104
|
+
else # Chef 10
|
|
105
|
+
@private_key = response["private_key"]
|
|
106
|
+
end
|
|
107
|
+
response
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def http_api
|
|
111
|
+
@http_api_as_validator ||= Chef::REST.new(Chef::Config[:chef_server_url],
|
|
112
|
+
Chef::Config[:validation_client_name],
|
|
113
|
+
Chef::Config[:validation_key])
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def file_flags
|
|
117
|
+
base_flags = File::CREAT|File::TRUNC|File::RDWR
|
|
118
|
+
# Windows doesn't have symlinks, so it doesn't have NOFOLLOW
|
|
119
|
+
base_flags |= File::NOFOLLOW if defined?(File::NOFOLLOW)
|
|
120
|
+
base_flags
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
|