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.
Files changed (506) hide show
  1. data/CONTRIBUTING.md +155 -0
  2. data/README.md +89 -0
  3. data/Rakefile +4 -12
  4. data/bin/chef-apply +25 -0
  5. data/bin/chef-shell +34 -0
  6. data/bin/shef +6 -5
  7. data/distro/common/html/chef-client.8.html +4 -4
  8. data/distro/common/html/chef-expander.8.html +4 -4
  9. data/distro/common/html/chef-expanderctl.8.html +4 -4
  10. data/distro/common/html/chef-server-webui.8.html +4 -4
  11. data/distro/common/html/chef-server.8.html +4 -4
  12. data/distro/common/html/{shef.1.html → chef-shell.1.html} +49 -46
  13. data/distro/common/html/chef-solo.8.html +18 -12
  14. data/distro/common/html/chef-solr.8.html +4 -4
  15. data/distro/common/html/knife-bootstrap.1.html +4 -4
  16. data/distro/common/html/knife-client.1.html +4 -4
  17. data/distro/common/html/knife-configure.1.html +4 -4
  18. data/distro/common/html/knife-cookbook-site.1.html +4 -4
  19. data/distro/common/html/knife-cookbook.1.html +10 -7
  20. data/distro/common/html/knife-data-bag.1.html +10 -7
  21. data/distro/common/html/knife-environment.1.html +8 -6
  22. data/distro/common/html/knife-exec.1.html +9 -9
  23. data/distro/common/html/knife-index.1.html +4 -4
  24. data/distro/common/html/knife-node.1.html +4 -4
  25. data/distro/common/html/knife-role.1.html +4 -4
  26. data/distro/common/html/knife-search.1.html +4 -4
  27. data/distro/common/html/knife-ssh.1.html +4 -4
  28. data/distro/common/html/knife-status.1.html +4 -4
  29. data/distro/common/html/knife-tag.1.html +4 -4
  30. data/distro/common/html/knife.1.html +8 -13
  31. data/distro/common/man/man1/{shef.1 → chef-shell.1} +21 -57
  32. data/distro/common/man/man1/knife-bootstrap.1 +1 -1
  33. data/distro/common/man/man1/knife-client.1 +1 -1
  34. data/distro/common/man/man1/knife-configure.1 +1 -1
  35. data/distro/common/man/man1/knife-cookbook-site.1 +1 -1
  36. data/distro/common/man/man1/knife-cookbook.1 +15 -2
  37. data/distro/common/man/man1/knife-data-bag.1 +15 -2
  38. data/distro/common/man/man1/knife-environment.1 +12 -2
  39. data/distro/common/man/man1/knife-exec.1 +4 -7
  40. data/distro/common/man/man1/knife-index.1 +1 -1
  41. data/distro/common/man/man1/knife-node.1 +1 -1
  42. data/distro/common/man/man1/knife-role.1 +1 -1
  43. data/distro/common/man/man1/knife-search.1 +1 -1
  44. data/distro/common/man/man1/knife-ssh.1 +1 -1
  45. data/distro/common/man/man1/knife-status.1 +1 -1
  46. data/distro/common/man/man1/knife-tag.1 +1 -1
  47. data/distro/common/man/man1/knife.1 +3 -6
  48. data/distro/common/man/man8/chef-client.8 +1 -1
  49. data/distro/common/man/man8/chef-expander.8 +1 -1
  50. data/distro/common/man/man8/chef-expanderctl.8 +1 -1
  51. data/distro/common/man/man8/chef-server-webui.8 +1 -1
  52. data/distro/common/man/man8/chef-server.8 +1 -1
  53. data/distro/common/man/man8/chef-solo.8 +36 -4
  54. data/distro/common/man/man8/chef-solr.8 +1 -1
  55. data/distro/common/markdown/man1/{shef.mkd → chef-shell.mkd} +49 -43
  56. data/distro/common/markdown/man1/knife-exec.mkd +11 -6
  57. data/distro/common/markdown/man1/knife.mkd +4 -9
  58. data/distro/debian/etc/default/chef-client +0 -1
  59. data/distro/debian/etc/init.d/chef-client +2 -2
  60. data/lib/chef.rb +2 -5
  61. data/lib/chef/api_client.rb +20 -130
  62. data/lib/chef/api_client/registration.rb +126 -0
  63. data/lib/chef/application.rb +71 -14
  64. data/lib/chef/application/apply.rb +160 -0
  65. data/lib/chef/application/client.rb +25 -18
  66. data/lib/chef/application/knife.rb +0 -2
  67. data/lib/chef/application/solo.rb +23 -8
  68. data/lib/chef/application/windows_service.rb +5 -2
  69. data/lib/chef/applications.rb +1 -0
  70. data/lib/chef/chef_fs.rb +11 -0
  71. data/lib/chef/chef_fs/command_line.rb +232 -0
  72. data/lib/chef/chef_fs/file_pattern.rb +312 -0
  73. data/lib/chef/chef_fs/file_system.rb +358 -0
  74. data/lib/chef/chef_fs/file_system/base_fs_dir.rb +47 -0
  75. data/lib/chef/chef_fs/file_system/base_fs_object.rb +121 -0
  76. data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +109 -0
  77. data/{spec/unit/monkey_patches/uri_spec.rb → lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb} +12 -15
  78. data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +84 -0
  79. data/lib/chef/chef_fs/file_system/cookbook_dir.rb +188 -0
  80. data/lib/chef/chef_fs/file_system/cookbook_file.rb +78 -0
  81. data/lib/chef/chef_fs/file_system/cookbook_subdir.rb +54 -0
  82. data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +68 -0
  83. data/lib/chef/chef_fs/file_system/data_bag_dir.rb +78 -0
  84. data/lib/chef/chef_fs/file_system/data_bag_item.rb +59 -0
  85. data/lib/chef/chef_fs/file_system/data_bags_dir.rb +66 -0
  86. data/lib/chef/chef_fs/file_system/file_system_entry.rb +90 -0
  87. data/lib/chef/{index_queue.rb → chef_fs/file_system/file_system_error.rb} +14 -12
  88. data/lib/chef/{resource/whyrun_safe_ruby_block.rb → chef_fs/file_system/file_system_root_dir.rb} +10 -10
  89. data/lib/chef/chef_fs/file_system/must_delete_recursively_error.rb +31 -0
  90. data/lib/chef/chef_fs/file_system/nodes_dir.rb +47 -0
  91. data/lib/chef/{provider/whyrun_safe_ruby_block.rb → chef_fs/file_system/nonexistent_fs_object.rb} +19 -9
  92. data/lib/chef/chef_fs/file_system/not_found_error.rb +31 -0
  93. data/lib/chef/chef_fs/file_system/rest_list_dir.rb +84 -0
  94. data/lib/chef/chef_fs/file_system/rest_list_entry.rb +123 -0
  95. data/lib/chef/chef_fs/knife.rb +77 -0
  96. data/lib/chef/chef_fs/path_utils.rb +64 -0
  97. data/lib/chef/client.rb +44 -21
  98. data/lib/chef/config.rb +52 -43
  99. data/lib/chef/cookbook/synchronizer.rb +6 -8
  100. data/lib/chef/cookbook/syntax_check.rb +61 -14
  101. data/lib/chef/cookbook_loader.rb +39 -26
  102. data/lib/chef/cookbook_uploader.rb +17 -19
  103. data/lib/chef/cookbook_version.rb +3 -302
  104. data/lib/chef/daemon.rb +3 -18
  105. data/lib/chef/data_bag.rb +4 -97
  106. data/lib/chef/data_bag_item.rb +2 -65
  107. data/lib/chef/digester.rb +73 -0
  108. data/lib/chef/dsl.rb +6 -0
  109. data/lib/chef/dsl/data_query.rb +66 -0
  110. data/lib/chef/dsl/include_attribute.rb +60 -0
  111. data/lib/chef/dsl/include_recipe.rb +42 -0
  112. data/lib/chef/dsl/platform_introspection.rb +213 -0
  113. data/lib/chef/dsl/recipe.rb +84 -0
  114. data/lib/chef/dsl/registry_helper.rb +59 -0
  115. data/lib/chef/encrypted_data_bag_item.rb +74 -19
  116. data/lib/chef/environment.rb +9 -180
  117. data/lib/chef/exceptions.rb +87 -14
  118. data/lib/chef/formatters/base.rb +4 -1
  119. data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +0 -4
  120. data/lib/chef/json_compat.rb +1 -97
  121. data/lib/chef/knife.rb +90 -41
  122. data/lib/chef/knife/bootstrap/archlinux-gems.erb +2 -2
  123. data/lib/chef/knife/bootstrap/centos5-gems.erb +2 -2
  124. data/lib/chef/knife/bootstrap/chef-full.erb +3 -3
  125. data/lib/chef/knife/bootstrap/fedora13-gems.erb +2 -2
  126. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +2 -2
  127. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +2 -2
  128. data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +2 -2
  129. data/lib/chef/knife/configure.rb +1 -2
  130. data/lib/chef/knife/cookbook_metadata.rb +1 -0
  131. data/lib/chef/knife/cookbook_test.rb +3 -2
  132. data/lib/chef/knife/cookbook_upload.rb +12 -7
  133. data/lib/chef/knife/core/bootstrap_context.rb +1 -1
  134. data/lib/chef/knife/core/generic_presenter.rb +26 -13
  135. data/lib/chef/knife/core/node_editor.rb +36 -16
  136. data/lib/chef/knife/core/node_presenter.rb +1 -1
  137. data/lib/chef/knife/core/text_formatter.rb +23 -37
  138. data/lib/chef/knife/core/ui.rb +15 -9
  139. data/lib/chef/knife/delete.rb +39 -0
  140. data/lib/chef/knife/diff.rb +46 -0
  141. data/lib/chef/knife/download.rb +50 -0
  142. data/lib/chef/knife/environment_show.rb +7 -0
  143. data/lib/chef/knife/exec.rb +5 -5
  144. data/lib/chef/knife/help_topics.rb +1 -1
  145. data/lib/chef/knife/index_rebuild.rb +91 -7
  146. data/lib/chef/knife/list.rb +109 -0
  147. data/lib/chef/knife/raw.rb +108 -0
  148. data/lib/chef/knife/search.rb +40 -22
  149. data/lib/chef/knife/show.rb +32 -0
  150. data/lib/chef/knife/ssh.rb +6 -2
  151. data/lib/chef/knife/upload.rb +50 -0
  152. data/lib/chef/mixin/checksum.rb +3 -3
  153. data/lib/chef/mixin/deep_merge.rb +55 -197
  154. data/lib/chef/mixin/language.rb +9 -222
  155. data/lib/chef/mixin/language_include_attribute.rb +6 -38
  156. data/lib/chef/mixin/language_include_recipe.rb +3 -35
  157. data/lib/chef/mixin/params_validate.rb +6 -19
  158. data/lib/chef/mixin/recipe_definition_dsl_core.rb +8 -61
  159. data/lib/chef/mixin/securable.rb +32 -7
  160. data/lib/chef/mixin/template.rb +40 -0
  161. data/lib/chef/mixins.rb +0 -4
  162. data/lib/chef/monkey_patches/net_http.rb +0 -34
  163. data/lib/chef/node.rb +133 -309
  164. data/lib/chef/node/attribute.rb +333 -473
  165. data/lib/chef/node/attribute_collections.rb +199 -0
  166. data/lib/chef/node/immutable_collections.rb +186 -0
  167. data/lib/chef/platform.rb +7 -22
  168. data/lib/chef/provider.rb +2 -49
  169. data/lib/chef/provider/breakpoint.rb +6 -6
  170. data/lib/chef/provider/cookbook_file.rb +5 -33
  171. data/lib/chef/provider/deploy.rb +2 -1
  172. data/lib/chef/provider/directory.rb +14 -17
  173. data/lib/chef/provider/file.rb +19 -52
  174. data/lib/chef/provider/group.rb +31 -51
  175. data/lib/chef/provider/group/dscl.rb +13 -53
  176. data/lib/chef/provider/group/gpasswd.rb +19 -14
  177. data/lib/chef/provider/group/groupadd.rb +1 -41
  178. data/lib/chef/provider/group/groupmod.rb +36 -46
  179. data/lib/chef/provider/group/pw.rb +16 -59
  180. data/lib/chef/provider/group/suse.rb +13 -16
  181. data/lib/chef/provider/group/usermod.rb +18 -40
  182. data/lib/chef/provider/group/windows.rb +6 -13
  183. data/lib/chef/provider/http_request.rb +25 -42
  184. data/lib/chef/provider/link.rb +2 -0
  185. data/lib/chef/provider/lwrp_base.rb +150 -0
  186. data/lib/chef/provider/package/portage.rb +4 -9
  187. data/lib/chef/provider/package/rpm.rb +2 -2
  188. data/lib/chef/provider/package/rubygems.rb +9 -41
  189. data/lib/chef/provider/package/yum.rb +12 -19
  190. data/lib/chef/provider/registry_key.rb +156 -0
  191. data/lib/chef/provider/remote_directory.rb +2 -0
  192. data/lib/chef/provider/remote_file.rb +21 -12
  193. data/lib/chef/provider/ruby_block.rb +5 -2
  194. data/lib/chef/provider/service.rb +15 -0
  195. data/lib/chef/provider/service/init.rb +9 -7
  196. data/lib/chef/provider/service/macosx.rb +15 -73
  197. data/lib/chef/provider/service/simple.rb +1 -1
  198. data/lib/chef/provider/service/solaris.rb +3 -3
  199. data/lib/chef/provider/template.rb +22 -25
  200. data/lib/chef/provider/template_finder.rb +61 -0
  201. data/lib/chef/provider/user.rb +0 -1
  202. data/lib/chef/provider/user/dscl.rb +175 -568
  203. data/lib/chef/provider/user/useradd.rb +30 -47
  204. data/lib/chef/providers.rb +3 -2
  205. data/lib/chef/recipe.rb +14 -8
  206. data/lib/chef/resource.rb +13 -154
  207. data/lib/chef/resource/group.rb +1 -11
  208. data/lib/chef/resource/http_request.rb +2 -1
  209. data/lib/chef/resource/lwrp_base.rb +127 -0
  210. data/lib/chef/resource/mount.rb +10 -11
  211. data/lib/chef/resource/registry_key.rb +86 -0
  212. data/lib/chef/resource/remote_directory.rb +6 -5
  213. data/lib/chef/resource/remote_file.rb +22 -31
  214. data/lib/chef/resource/ruby_block.rb +2 -2
  215. data/lib/chef/resource/service.rb +14 -0
  216. data/lib/chef/resource/user.rb +0 -18
  217. data/lib/chef/resource_collection.rb +25 -21
  218. data/lib/chef/resources.rb +2 -1
  219. data/lib/chef/rest.rb +50 -131
  220. data/lib/chef/rest/auth_credentials.rb +4 -20
  221. data/lib/chef/rest/rest_request.rb +2 -7
  222. data/lib/chef/role.rb +1 -97
  223. data/lib/chef/run_context.rb +108 -130
  224. data/lib/chef/run_context/cookbook_compiler.rb +280 -0
  225. data/lib/chef/run_list.rb +0 -2
  226. data/lib/chef/run_list/run_list_expansion.rb +0 -15
  227. data/lib/chef/run_lock.rb +90 -0
  228. data/lib/chef/runner.rb +28 -5
  229. data/lib/chef/sandbox.rb +15 -148
  230. data/lib/chef/scan_access_control.rb +2 -4
  231. data/lib/chef/shef/ext.rb +3 -575
  232. data/lib/chef/{shef.rb → shell.rb} +35 -40
  233. data/lib/chef/shell/ext.rb +593 -0
  234. data/lib/chef/{shef → shell}/model_wrapper.rb +3 -3
  235. data/lib/chef/{shef/shef_rest.rb → shell/shell_rest.rb} +4 -4
  236. data/lib/chef/{shef/shef_session.rb → shell/shell_session.rb} +17 -15
  237. data/lib/chef/shell_out.rb +7 -0
  238. data/lib/chef/util/windows/net_group.rb +1 -5
  239. data/lib/chef/version.rb +3 -3
  240. data/lib/chef/win32/api/process.rb +0 -1
  241. data/lib/chef/win32/handle.rb +1 -8
  242. data/lib/chef/win32/registry.rb +371 -0
  243. data/spec/data/big_json.json +1 -2
  244. data/spec/data/big_json_plus_one.json +1 -2
  245. data/spec/data/cookbooks/openldap/attributes/default.rb +10 -9
  246. data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
  247. data/spec/data/lwrp/providers/inline_compiler.rb +26 -0
  248. data/spec/data/nodes/default.rb +3 -3
  249. data/spec/data/nodes/test.example.com.rb +3 -3
  250. data/spec/data/nodes/test.rb +3 -3
  251. data/spec/data/partial_one.erb +1 -0
  252. data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +4 -0
  253. data/spec/data/run_context/cookbooks/circular-dep1/definitions/circular_dep1_res.rb +1 -0
  254. data/spec/data/run_context/cookbooks/circular-dep1/libraries/lib.rb +2 -0
  255. data/spec/data/run_context/cookbooks/circular-dep1/metadata.rb +2 -0
  256. data/spec/data/run_context/cookbooks/circular-dep1/providers/provider.rb +1 -0
  257. data/spec/data/{knife-home/.chef/plugins/knife/example_home_subcommand.rb → run_context/cookbooks/circular-dep1/recipes/default.rb} +0 -0
  258. data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +1 -0
  259. data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +3 -0
  260. data/spec/data/run_context/cookbooks/circular-dep2/definitions/circular_dep2_res.rb +1 -0
  261. data/spec/data/run_context/cookbooks/circular-dep2/libraries/lib.rb +2 -0
  262. data/spec/data/run_context/cookbooks/circular-dep2/metadata.rb +2 -0
  263. data/spec/data/run_context/cookbooks/circular-dep2/providers/provider.rb +1 -0
  264. data/spec/data/{lwrp_const_scoping/resources/conflict.rb → run_context/cookbooks/circular-dep2/recipes/default.rb} +0 -0
  265. data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +1 -0
  266. data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -0
  267. data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -0
  268. data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +3 -0
  269. data/spec/data/run_context/cookbooks/dependency1/definitions/dependency1_res.rb +1 -0
  270. data/spec/data/run_context/cookbooks/dependency1/libraries/lib.rb +2 -0
  271. data/spec/data/run_context/cookbooks/dependency1/providers/provider.rb +1 -0
  272. data/spec/data/run_context/cookbooks/dependency1/recipes/default.rb +0 -0
  273. data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +1 -0
  274. data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +3 -0
  275. data/spec/data/run_context/cookbooks/dependency2/definitions/dependency2_res.rb +1 -0
  276. data/spec/data/run_context/cookbooks/dependency2/libraries/lib.rb +2 -0
  277. data/spec/data/run_context/cookbooks/dependency2/providers/provider.rb +1 -0
  278. data/spec/data/run_context/cookbooks/dependency2/recipes/default.rb +0 -0
  279. data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +1 -0
  280. data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +3 -0
  281. data/spec/data/run_context/cookbooks/no-default-attr/definitions/no_default-attr_res.rb +1 -0
  282. data/spec/data/run_context/cookbooks/no-default-attr/providers/provider.rb +1 -0
  283. data/spec/data/run_context/cookbooks/no-default-attr/recipes/default.rb +0 -0
  284. data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +1 -0
  285. data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +3 -0
  286. data/spec/data/run_context/cookbooks/test-with-circular-deps/definitions/test_with-circular-deps_res.rb +1 -0
  287. data/spec/data/run_context/cookbooks/test-with-circular-deps/libraries/lib.rb +2 -0
  288. data/spec/data/run_context/cookbooks/test-with-circular-deps/metadata.rb +2 -0
  289. data/spec/data/run_context/cookbooks/test-with-circular-deps/providers/provider.rb +1 -0
  290. data/spec/data/run_context/cookbooks/test-with-circular-deps/recipes/default.rb +0 -0
  291. data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +1 -0
  292. data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +3 -0
  293. data/spec/data/run_context/cookbooks/test-with-deps/definitions/test_with-deps_res.rb +1 -0
  294. data/spec/data/run_context/cookbooks/test-with-deps/libraries/lib.rb +1 -0
  295. data/spec/data/run_context/cookbooks/test-with-deps/metadata.rb +3 -0
  296. data/spec/data/run_context/cookbooks/test-with-deps/providers/provider.rb +1 -0
  297. data/spec/data/run_context/cookbooks/test-with-deps/recipes/default.rb +0 -0
  298. data/spec/data/run_context/cookbooks/test-with-deps/recipes/server.rb +0 -0
  299. data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +1 -0
  300. data/spec/data/run_context/cookbooks/test/attributes/default.rb +0 -0
  301. data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -1
  302. data/spec/data/run_context/cookbooks/test/definitions/test_res.rb +1 -0
  303. data/spec/data/run_context/cookbooks/test/providers/provider.rb +1 -0
  304. data/spec/data/run_context/cookbooks/test/resources/resource.rb +1 -0
  305. data/spec/data/shef-config.rb +7 -0
  306. data/spec/functional/dsl/registry_helper_spec.rb +63 -0
  307. data/spec/functional/knife/cookbook_delete_spec.rb +1 -1
  308. data/spec/functional/knife/exec_spec.rb +2 -2
  309. data/spec/functional/knife/ssh_spec.rb +5 -1
  310. data/spec/functional/resource/cookbook_file_spec.rb +7 -19
  311. data/spec/functional/resource/directory_spec.rb +4 -0
  312. data/spec/functional/resource/file_spec.rb +56 -22
  313. data/spec/functional/resource/link_spec.rb +2 -0
  314. data/spec/functional/resource/registry_spec.rb +576 -0
  315. data/spec/functional/resource/remote_directory_spec.rb +142 -36
  316. data/spec/functional/resource/remote_file_spec.rb +18 -0
  317. data/spec/functional/resource/template_spec.rb +23 -2
  318. data/spec/functional/run_lock_spec.rb +106 -0
  319. data/spec/functional/shell_spec.rb +100 -0
  320. data/spec/functional/win32/registry_helper_spec.rb +632 -0
  321. data/spec/spec_helper.rb +5 -29
  322. data/spec/stress/win32/security_spec.rb +1 -1
  323. data/spec/support/chef_helpers.rb +0 -2
  324. data/spec/support/platform_helpers.rb +8 -15
  325. data/spec/support/shared/functional/directory_resource.rb +84 -22
  326. data/spec/support/shared/functional/file_resource.rb +169 -71
  327. data/spec/support/shared/functional/securable_resource.rb +143 -119
  328. data/spec/support/shared/functional/securable_resource_with_reporting.rb +375 -0
  329. data/spec/support/shared/unit/file_system_support.rb +110 -0
  330. data/spec/support/shared/unit/platform_introspector.rb +162 -0
  331. data/spec/unit/api_client/registration_spec.rb +175 -0
  332. data/spec/unit/api_client_spec.rb +78 -156
  333. data/spec/unit/application/apply.rb +84 -0
  334. data/spec/unit/application/client_spec.rb +1 -37
  335. data/spec/unit/application/knife_spec.rb +5 -0
  336. data/spec/unit/application_spec.rb +57 -2
  337. data/spec/unit/checksum/storage/filesystem_spec.rb +1 -1
  338. data/spec/unit/chef_fs/diff_spec.rb +328 -0
  339. data/spec/unit/chef_fs/file_pattern_spec.rb +526 -0
  340. data/spec/unit/chef_fs/file_system/chef_server_root_dir_spec.rb +237 -0
  341. data/spec/unit/chef_fs/file_system/cookbooks_dir_spec.rb +568 -0
  342. data/spec/unit/chef_fs/file_system/data_bags_dir_spec.rb +220 -0
  343. data/spec/unit/chef_fs/file_system_spec.rb +136 -0
  344. data/spec/unit/client_spec.rb +124 -33
  345. data/spec/unit/config_spec.rb +46 -13
  346. data/spec/unit/cookbook/synchronizer_spec.rb +1 -49
  347. data/spec/unit/cookbook/syntax_check_spec.rb +48 -109
  348. data/spec/unit/cookbook_loader_spec.rb +153 -91
  349. data/spec/unit/cookbook_manifest_spec.rb +81 -81
  350. data/spec/unit/cookbook_spec.rb +3 -20
  351. data/spec/unit/cookbook_version_spec.rb +23 -122
  352. data/spec/unit/daemon_spec.rb +3 -24
  353. data/spec/unit/data_bag_spec.rb +6 -4
  354. data/spec/unit/digester_spec.rb +50 -0
  355. data/spec/unit/dsl/data_query_spec.rb +66 -0
  356. data/spec/unit/dsl/platform_introspection_spec.rb +130 -0
  357. data/spec/unit/dsl/regsitry_helper_spec.rb +55 -0
  358. data/spec/unit/encrypted_data_bag_item_spec.rb +50 -105
  359. data/spec/unit/environment_spec.rb +0 -130
  360. data/spec/unit/exceptions_spec.rb +2 -3
  361. data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +3 -3
  362. data/spec/unit/json_compat_spec.rb +15 -7
  363. data/spec/unit/knife/bootstrap_spec.rb +2 -0
  364. data/spec/unit/knife/configure_spec.rb +20 -14
  365. data/spec/unit/knife/cookbook_metadata_spec.rb +11 -4
  366. data/spec/unit/knife/cookbook_test_spec.rb +1 -0
  367. data/spec/unit/knife/cookbook_upload_spec.rb +43 -8
  368. data/spec/unit/knife/core/bootstrap_context_spec.rb +1 -1
  369. data/spec/unit/knife/core/ui_spec.rb +156 -125
  370. data/spec/unit/knife/data_bag_create_spec.rb +9 -0
  371. data/spec/unit/knife/data_bag_edit_spec.rb +1 -4
  372. data/spec/unit/knife/data_bag_from_file_spec.rb +4 -6
  373. data/spec/unit/knife/data_bag_show_spec.rb +11 -4
  374. data/spec/unit/knife/index_rebuild_spec.rb +96 -33
  375. data/spec/unit/knife/knife_help.rb +7 -7
  376. data/spec/unit/knife/node_edit_spec.rb +6 -33
  377. data/spec/unit/knife/node_run_list_remove_spec.rb +2 -1
  378. data/spec/unit/knife/ssh_spec.rb +12 -15
  379. data/spec/unit/knife/status_spec.rb +2 -2
  380. data/spec/unit/knife_spec.rb +53 -0
  381. data/spec/unit/lwrp_spec.rb +59 -42
  382. data/spec/unit/mixin/checksum_spec.rb +2 -2
  383. data/spec/unit/mixin/deep_merge_spec.rb +101 -799
  384. data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +6 -1
  385. data/spec/unit/mixin/params_validate_spec.rb +4 -37
  386. data/spec/unit/mixin/securable_spec.rb +5 -3
  387. data/spec/unit/mixin/template_spec.rb +119 -0
  388. data/spec/unit/node/attribute_spec.rb +195 -173
  389. data/spec/unit/node/immutable_collections_spec.rb +139 -0
  390. data/spec/unit/node_spec.rb +366 -370
  391. data/spec/unit/platform_spec.rb +9 -10
  392. data/spec/unit/provider/breakpoint_spec.rb +8 -8
  393. data/spec/unit/provider/cookbook_file_spec.rb +4 -8
  394. data/spec/unit/provider/directory_spec.rb +96 -64
  395. data/spec/unit/provider/env_spec.rb +2 -2
  396. data/spec/unit/provider/file_spec.rb +48 -39
  397. data/spec/unit/provider/group/dscl_spec.rb +0 -36
  398. data/spec/unit/provider/group/gpasswd_spec.rb +9 -16
  399. data/spec/unit/provider/group/groupadd_spec.rb +4 -3
  400. data/spec/unit/provider/group/groupmod_spec.rb +1 -0
  401. data/spec/unit/provider/group/pw_spec.rb +15 -12
  402. data/spec/unit/provider/group/usermod_spec.rb +6 -21
  403. data/spec/unit/provider/group/windows_spec.rb +8 -0
  404. data/spec/unit/provider/group_spec.rb +6 -28
  405. data/spec/unit/provider/http_request_spec.rb +28 -69
  406. data/spec/unit/provider/ifconfig_spec.rb +2 -2
  407. data/spec/unit/provider/ohai_spec.rb +4 -4
  408. data/spec/unit/provider/package/apt_spec.rb +0 -1
  409. data/spec/unit/provider/package/ips_spec.rb +0 -1
  410. data/spec/unit/provider/package/portage_spec.rb +0 -44
  411. data/spec/unit/provider/package/rpm_spec.rb +0 -12
  412. data/spec/unit/provider/package/rubygems_spec.rb +1 -44
  413. data/spec/unit/provider/package/yum_spec.rb +39 -36
  414. data/spec/unit/provider/package_spec.rb +7 -5
  415. data/spec/unit/provider/registry_key_spec.rb +269 -0
  416. data/spec/unit/provider/remote_directory_spec.rb +7 -3
  417. data/spec/unit/provider/remote_file_spec.rb +36 -0
  418. data/spec/unit/provider/route_spec.rb +4 -3
  419. data/spec/unit/provider/ruby_block_spec.rb +8 -0
  420. data/spec/unit/provider/service/arch_service_spec.rb +5 -5
  421. data/spec/unit/provider/service/debian_service_spec.rb +1 -1
  422. data/spec/unit/provider/service/freebsd_service_spec.rb +5 -5
  423. data/spec/unit/provider/service/init_service_spec.rb +27 -4
  424. data/spec/unit/provider/service/insserv_service_spec.rb +1 -1
  425. data/spec/unit/provider/service/invokercd_service_spec.rb +4 -4
  426. data/spec/unit/provider/service/macosx_spec.rb +11 -66
  427. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  428. data/spec/unit/provider/service/simple_service_spec.rb +3 -3
  429. data/spec/unit/provider/service/upstart_service_spec.rb +9 -9
  430. data/spec/unit/provider/subversion_spec.rb +1 -1
  431. data/spec/unit/provider/template_spec.rb +35 -11
  432. data/spec/unit/provider/user/dscl_spec.rb +285 -681
  433. data/spec/unit/provider/user/useradd_spec.rb +1 -22
  434. data/spec/unit/provider/user_spec.rb +1 -1
  435. data/spec/unit/recipe_spec.rb +10 -8
  436. data/spec/unit/registry_helper_spec.rb +374 -0
  437. data/spec/unit/resource/mount_spec.rb +0 -11
  438. data/spec/unit/resource/registry_key_spec.rb +171 -0
  439. data/spec/unit/resource/remote_file_spec.rb +21 -23
  440. data/spec/unit/resource/ruby_block_spec.rb +7 -3
  441. data/spec/unit/resource/service_spec.rb +11 -0
  442. data/spec/unit/resource_spec.rb +4 -19
  443. data/spec/unit/rest/auth_credentials_spec.rb +2 -19
  444. data/spec/unit/rest_spec.rb +130 -284
  445. data/spec/unit/run_context/cookbook_compiler_spec.rb +181 -0
  446. data/spec/unit/run_context_spec.rb +18 -4
  447. data/spec/unit/run_list_spec.rb +0 -209
  448. data/spec/unit/run_lock_spec.rb +37 -0
  449. data/spec/unit/runner_spec.rb +101 -2
  450. data/spec/unit/scan_access_control_spec.rb +4 -4
  451. data/spec/unit/{shef → shell}/model_wrapper_spec.rb +5 -5
  452. data/spec/unit/{shef/shef_ext_spec.rb → shell/shell_ext_spec.rb} +21 -21
  453. data/spec/unit/{shef/shef_session_spec.rb → shell/shell_session_spec.rb} +14 -69
  454. data/spec/unit/shell_out_spec.rb +18 -0
  455. data/spec/unit/{shef_spec.rb → shell_spec.rb} +20 -20
  456. metadata +275 -234
  457. checksums.yaml +0 -15
  458. data/README.rdoc +0 -177
  459. data/distro/common/html/knife-recipe.1.html +0 -92
  460. data/lib/chef/certificate.rb +0 -161
  461. data/lib/chef/checksum.rb +0 -167
  462. data/lib/chef/checksum_cache.rb +0 -190
  463. data/lib/chef/cookbook_version_selector.rb +0 -168
  464. data/lib/chef/couchdb.rb +0 -246
  465. data/lib/chef/index_queue/amqp_client.rb +0 -116
  466. data/lib/chef/index_queue/consumer.rb +0 -76
  467. data/lib/chef/index_queue/indexable.rb +0 -109
  468. data/lib/chef/knife/bootstrap/ubuntu12.10-gems.erb +0 -60
  469. data/lib/chef/monkey_patches/moneta.rb +0 -50
  470. data/lib/chef/monkey_patches/uri.rb +0 -70
  471. data/lib/chef/openid_registration.rb +0 -187
  472. data/lib/chef/provider/user/solaris.rb +0 -90
  473. data/lib/chef/solr_query.rb +0 -187
  474. data/lib/chef/solr_query/lucene.treetop +0 -150
  475. data/lib/chef/solr_query/lucene_nodes.rb +0 -285
  476. data/lib/chef/solr_query/query_transform.rb +0 -65
  477. data/lib/chef/solr_query/solr_http_request.rb +0 -132
  478. data/lib/chef/webui_user.rb +0 -231
  479. data/spec/data/cookbooks/openldap/files/default/.dotfile +0 -1
  480. data/spec/data/cookbooks/openldap/files/default/.ssh/id_rsa +0 -1
  481. data/spec/data/cookbooks/openldap/files/default/remotedir/.a_dotdir/.a_dotfile_in_a_dotdir +0 -1
  482. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/.a_dotfile +0 -1
  483. data/spec/data/mac_users/10.7-8.plist.xml +0 -559
  484. data/spec/data/mac_users/10.7-8.shadow.xml +0 -11
  485. data/spec/data/mac_users/10.7.plist.xml +0 -559
  486. data/spec/data/mac_users/10.7.shadow.xml +0 -11
  487. data/spec/data/mac_users/10.8.plist.xml +0 -559
  488. data/spec/data/mac_users/10.8.shadow.xml +0 -21
  489. data/spec/data/mac_users/10.9.plist.xml +0 -560
  490. data/spec/data/mac_users/10.9.shadow.xml +0 -21
  491. data/spec/functional/resource/base.rb +0 -40
  492. data/spec/functional/resource/group_spec.rb +0 -343
  493. data/spec/functional/resource/user/dscl_spec.rb +0 -199
  494. data/spec/unit/certificate_spec.rb +0 -76
  495. data/spec/unit/checksum_cache_spec.rb +0 -209
  496. data/spec/unit/checksum_spec.rb +0 -94
  497. data/spec/unit/couchdb_spec.rb +0 -274
  498. data/spec/unit/index_queue_spec.rb +0 -391
  499. data/spec/unit/mixin/language_spec.rb +0 -305
  500. data/spec/unit/openid_registration_spec.rb +0 -153
  501. data/spec/unit/provider/user/solaris_spec.rb +0 -414
  502. data/spec/unit/provider/whyrun_safe_ruby_block_spec.rb +0 -47
  503. data/spec/unit/solr_query/query_transform_spec.rb +0 -454
  504. data/spec/unit/solr_query/solr_http_request_spec.rb +0 -244
  505. data/spec/unit/solr_query_spec.rb +0 -203
  506. 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
- `knife exec` runs arbitrary ruby scripts in a context similar to that of
13
- the shef(1) DSL. See the shef documentation for a description of the
14
- commands available.
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
- __shef(1)__
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
- * `cache_type`:
102
- The type of cache to use. Default is BasicFile. This can be any type of
103
- Cache that moneta supports: BasicFile, Berkeley, Couch, DataMapper,
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)__ __shef(1)__
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)__
@@ -2,4 +2,3 @@ LOGFILE=/var/log/chef/client.log
2
2
  CONFIG=/etc/chef/client.rb
3
3
  INTERVAL=1800
4
4
  SPLAY=20
5
- STARTTIME=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=`cat /proc/$pid/cmdline | tr '\000' '\n' | awk 'NR==2'`
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 $DAEMON || return 1
52
+ running_pid $pid $NAME || return 1
53
53
  return 0
54
54
  }
55
55
 
@@ -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'
@@ -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(couchdb=nil)
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
- # Creates a new public/private key pair, and populates the public_key and
131
- # private_key attributes.
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["_rev"] = @couchdb_rev if @couchdb_rev
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["private_key"]
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
- # List all the Chef::ApiClient objects in the CouchDB. If inflate is set
177
- # to true, you will get the full list of all ApiClients, fully inflated.
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
- Chef::REST.new(Chef::Config[:chef_server_url]).get_rest("clients")
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 = Chef::REST.new(Chef::Config[:chef_server_url]).get_rest("clients/#{name}")
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
- Chef::REST.new(Chef::Config[:chef_server_url]).delete_rest("clients/#{@name}")
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(new_key=false, validation=false)
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
- r.post_rest("clients", {:name => self.name, :admin => self.admin })
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 == "409"
256
- r.put_rest("clients/#{name}", { :name => self.name, :admin => self.admin, :private_key => new_key })
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
- r = Chef::REST.new(Chef::Config[:chef_server_url])
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
- Chef::REST.new(Chef::Config[:chef_server_url]).post_rest("clients", self)
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
+