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
@@ -155,8 +155,6 @@ class Chef
155
155
  RunListExpansionFromDisk.new(environment, @run_list_items)
156
156
  when 'server'
157
157
  RunListExpansionFromAPI.new(environment, @run_list_items, opts[:rest])
158
- when 'couchdb'
159
- RunListExpansionFromCouchDB.new(environment, @run_list_items, opts[:couchdb])
160
158
  end
161
159
  end
162
160
 
@@ -21,7 +21,6 @@ require 'chef/mash'
21
21
  require 'chef/mixin/deep_merge'
22
22
 
23
23
  require 'chef/role'
24
- require 'chef/couchdb'
25
24
  require 'chef/rest'
26
25
 
27
26
  class Chef
@@ -188,19 +187,5 @@ class Chef
188
187
  end
189
188
  end
190
189
 
191
- # Expand a run list from couchdb. Used in chef-server-api
192
- class RunListExpansionFromCouchDB < RunListExpansion
193
-
194
- def couchdb
195
- source
196
- end
197
-
198
- def fetch_role(name, included_by)
199
- Chef::Role.cdb_load(name, couchdb)
200
- rescue Chef::Exceptions::CouchDBNotFound
201
- role_not_found(name, included_by)
202
- end
203
-
204
- end
205
190
  end
206
191
  end
@@ -0,0 +1,90 @@
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
+ require 'chef/mixin/create_path'
19
+
20
+ class Chef
21
+
22
+ # == Chef::RunLock
23
+ # Provides an interface for acquiring and releasing a system-wide exclusive
24
+ # lock.
25
+ #
26
+ # Used by Chef::Client to ensure only one instance of chef-client (or solo)
27
+ # is modifying the system at a time.
28
+ class RunLock
29
+ include Chef::Mixin::CreatePath
30
+
31
+ attr_reader :runlock
32
+ attr_reader :runlock_file
33
+
34
+ # Create a new instance of RunLock
35
+ # === Arguments
36
+ # * config::: This will generally be the `Chef::Config`, but any Hash-like
37
+ # object with Symbol keys will work. See 'Parameters' section.
38
+ # === Parameters/Config
39
+ # * :lockfile::: if set, this will be used as the full path to the lockfile.
40
+ # * :file_cache_path::: if `:lockfile` is not set, the lock file will be
41
+ # named "chef-client-running.pid" and be placed in the directory given by
42
+ # `:file_cache_path`
43
+ def initialize(config)
44
+ @runlock_file = config[:lockfile] || "#{config[:file_cache_path]}/chef-client-running.pid"
45
+ @runlock = nil
46
+ end
47
+
48
+ # Acquire the system-wide lock. Will block indefinitely if another process
49
+ # already has the lock.
50
+ #
51
+ # Each call to acquire should have a corresponding call to #release.
52
+ #
53
+ # The implementation is based on File#flock (see also: flock(2)).
54
+ def acquire
55
+ # ensure the runlock_file path exists
56
+ create_path(File.dirname(runlock_file))
57
+ @runlock = File.open(runlock_file,'w+')
58
+ unless runlock.flock(File::LOCK_EX|File::LOCK_NB)
59
+ # Another chef client running...
60
+ runpid = runlock.read.strip.chomp
61
+ Chef::Log.info("Chef client #{runpid} is running, will wait for it to finish and then run.")
62
+ runlock.flock(File::LOCK_EX)
63
+ end
64
+ # We grabbed the run lock. Save the pid.
65
+ runlock.truncate(0)
66
+ runlock.rewind # truncate doesn't reset position to 0.
67
+ runlock.write(Process.pid.to_s)
68
+ end
69
+
70
+ # Release the system-wide lock.
71
+ def release
72
+ if runlock
73
+ runlock.flock(File::LOCK_UN)
74
+ runlock.close
75
+ # Don't unlink the pid file, if another chef-client was waiting, it
76
+ # won't be recreated. Better to leave a "dead" pid file than not have
77
+ # it available if you need to break the lock.
78
+ reset
79
+ end
80
+ end
81
+
82
+ private
83
+
84
+ def reset
85
+ @runlock = nil
86
+ end
87
+
88
+ end
89
+ end
90
+
@@ -18,6 +18,7 @@
18
18
  # limitations under the License.
19
19
  #
20
20
 
21
+ require 'chef/exceptions'
21
22
  require 'chef/mixin/params_validate'
22
23
  require 'chef/node'
23
24
  require 'chef/resource_collection'
@@ -81,15 +82,37 @@ class Chef
81
82
  Array(resource.action).each {|action| run_action(resource, action)}
82
83
  end
83
84
 
84
- # Run all our :delayed actions
85
+ rescue Exception => e
86
+ Chef::Log.info "Running queued delayed notifications before re-raising exception"
87
+ run_delayed_notifications(e)
88
+ else
89
+ run_delayed_notifications(nil)
90
+ true
91
+ end
92
+
93
+ private
94
+
95
+ # Run all our :delayed actions
96
+ def run_delayed_notifications(error=nil)
97
+ collected_failures = Exceptions::MultipleFailures.new
98
+ collected_failures.client_run_failure(error) unless error.nil?
85
99
  delayed_actions.each do |notification|
86
- Chef::Log.info( "#{notification.notifying_resource} sending #{notification.action}"\
87
- " action to #{notification.resource} (delayed)")
88
- # Struct of resource/action to call
89
- run_action(notification.resource, notification.action, :delayed)
100
+ result = run_delayed_notification(notification)
101
+ if result.kind_of?(Exception)
102
+ collected_failures.notification_failure(result)
103
+ end
90
104
  end
105
+ collected_failures.raise!
106
+ end
91
107
 
108
+ def run_delayed_notification(notification)
109
+ Chef::Log.info( "#{notification.notifying_resource} sending #{notification.action}"\
110
+ " action to #{notification.resource} (delayed)")
111
+ # Struct of resource/action to call
112
+ run_action(notification.resource, notification.action, :delayed)
92
113
  true
114
+ rescue Exception => e
115
+ e
93
116
  end
94
117
  end
95
118
  end
@@ -1,153 +1,20 @@
1
- #
2
- # Author:: Tim Hinderliter (<tim@opscode.com>)
3
- # Copyright:: Copyright (c) 2010 Opscode, Inc.
4
- # License:: Apache License, Version 2.0
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
-
18
- require 'chef/log'
19
- require 'uuidtools'
20
-
21
1
  class Chef
22
2
  class Sandbox
23
- attr_accessor :is_completed, :create_time
24
- alias_method :is_completed?, :is_completed
25
- attr_reader :guid
26
-
27
- alias :name :guid
28
-
29
- attr_accessor :couchdb, :couchdb_id, :couchdb_rev
30
-
31
- # list of checksum ids
32
- attr_accessor :checksums
33
-
34
- DESIGN_DOCUMENT = {
35
- "version" => 1,
36
- "language" => "javascript",
37
- "views" => {
38
- "all" => {
39
- "map" => <<-EOJS
40
- function(doc) {
41
- if (doc.chef_type == "sandbox") {
42
- emit(doc.guid, doc);
43
- }
44
- }
45
- EOJS
46
- },
47
- "all_id" => {
48
- "map" => <<-EOJS
49
- function(doc) {
50
- if (doc.chef_type == "sandbox") {
51
- emit(doc.guid, doc.guid);
52
- }
53
- }
54
- EOJS
55
- },
56
- "all_incomplete" => {
57
- "map" => <<-EOJS
58
- function(doc) {
59
- if (doc.chef_type == "sandbox" && !doc.is_completed) {
60
- emit(doc.guid, doc.guid);
61
- }
62
- }
63
- EOJS
64
- },
65
- "all_completed" => {
66
- "map" => <<-EOJS
67
- function(doc) {
68
- if (doc.chef_type == "sandbox" && doc.is_completed) {
69
- emit(doc.guid, doc.guid);
70
- }
71
- }
72
- EOJS
73
- },
74
- }
75
- }
76
-
77
- # Creates a new Chef::Sandbox object.
3
+ # I DO NOTHING!!
4
+
5
+ # So, the reason we have a completely empty class here is so that
6
+ # Chef 11 clients do not choke when interacting with Chef 10
7
+ # servers. The original Chef::Sandbox class (that actually did
8
+ # things) has been removed since its functionality is no longer
9
+ # needed for Chef 11. However, since we still use the JSON gem
10
+ # and make use of its "auto-inflation" of classes (driven by the
11
+ # contents of the 'json_class' key in all of our JSON), any
12
+ # sandbox responses from a Chef 10 server to a Chef 11 client
13
+ # would cause knife to crash. The JSON gem would attempt to
14
+ # auto-inflate based on a "json_class": "Chef::Sandbox" hash
15
+ # entry, but would not be able to find a Chef::Sandbox class!
78
16
  #
79
- # === Returns
80
- # object<Chef::Sandbox>:: Duh. :)
81
- def initialize(guid=nil, couchdb=nil)
82
- @guid = guid || UUIDTools::UUID.random_create.to_s.gsub(/\-/,'').downcase
83
- @is_completed = false
84
- @create_time = Time.now.iso8601
85
- @checksums = Array.new
86
- end
87
-
88
- def include?(checksum)
89
- @checksums.include?(checksum)
90
- end
91
-
92
- alias :member? :include?
93
-
94
- def to_json(*a)
95
- result = {
96
- :guid => guid,
97
- :name => name, # same as guid, used for id_map
98
- :checksums => checksums,
99
- :create_time => create_time,
100
- :is_completed => is_completed,
101
- :json_class => self.class.name,
102
- :chef_type => 'sandbox'
103
- }
104
- result["_rev"] = @couchdb_rev if @couchdb_rev
105
- result.to_json(*a)
106
- end
107
-
108
- def self.json_create(o)
109
- sandbox = new(o['guid'])
110
- sandbox.checksums = o['checksums']
111
- sandbox.create_time = o['create_time']
112
- sandbox.is_completed = o['is_completed']
113
- if o.has_key?('_rev')
114
- sandbox.couchdb_rev = o["_rev"]
115
- o.delete("_rev")
116
- end
117
- if o.has_key?("_id")
118
- sandbox.couchdb_id = o["_id"]
119
- #sandbox.index_id = sandbox.couchdb_id
120
- o.delete("_id")
121
- end
122
- sandbox
123
- end
124
-
125
- ##
126
- # Couchdb
127
- ##
128
-
129
- def self.create_design_document(couchdb=nil)
130
- (couchdb || Chef::CouchDB.new).create_design_document("sandboxes", DESIGN_DOCUMENT)
131
- end
132
-
133
- def self.cdb_list(inflate=false, couchdb=nil)
134
- rs = (couchdb || Chef::CouchDB.new).list("sandboxes", inflate)
135
- lookup = (inflate ? "value" : "key")
136
- rs["rows"].collect { |r| r[lookup] }
137
- end
138
-
139
- def self.cdb_load(guid, couchdb=nil)
140
- # Probably want to look for a view here at some point
141
- (couchdb || Chef::CouchDB.new).load("sandbox", guid)
142
- end
143
-
144
- def cdb_destroy
145
- (couchdb || Chef::CouchDB.new).delete("sandbox", guid, @couchdb_rev)
146
- end
147
-
148
- def cdb_save(couchdb=nil)
149
- @couchdb_rev = (couchdb || Chef::CouchDB.new).store("sandbox", guid, self)["rev"]
150
- end
151
-
17
+ # This is a workaround until such time as we can completely remove
18
+ # the reliance on the "json_class" field.
152
19
  end
153
20
  end
@@ -118,10 +118,8 @@ class Chef
118
118
 
119
119
  def current_mode
120
120
  case new_resource.mode
121
- when String, nil
122
- (stat.mode & 007777).to_s(8)
123
- when Integer
124
- stat.mode & 007777
121
+ when String, Integer, nil
122
+ "0#{(stat.mode & 07777).to_s(8)}"
125
123
  else
126
124
  Chef::Log.error("The `mode` parameter of the #@new_resource resource is set to an invalid value (#{new_resource.mode.inspect})")
127
125
  raise ArgumentError, "Invalid value #{new_resource.mode.inspect} for `mode` on resource #@new_resource"
@@ -1,6 +1,6 @@
1
1
  #--
2
- # Author:: Daniel DeLeo (<dan@kallistec.com>)
3
- # Copyright:: Copyright (c) 2009 Daniel DeLeo
2
+ # Author:: Joshua Timberman (<joshua@opscode.com>)
3
+ # Copyright:: Copyright (c) 2012 Opscode, Inc.
4
4
  # License:: Apache License, Version 2.0
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,576 +16,4 @@
16
16
  # limitations under the License.
17
17
  #
18
18
 
19
- require 'tempfile'
20
- require 'chef/recipe'
21
- require 'fileutils'
22
- require 'chef/version'
23
- require 'chef/shef/shef_session'
24
- require 'chef/shef/model_wrapper'
25
- require 'chef/shef/shef_rest'
26
- require 'chef/json_compat'
27
-
28
- module Shef
29
- module Extensions
30
-
31
- Help = Struct.new(:cmd, :desc, :explanation)
32
-
33
- # Extensions to be included in every 'main' object in shef. These objects
34
- # are extended with this module.
35
- module ObjectCoreExtensions
36
-
37
- def ensure_session_select_defined
38
- # irb breaks if you prematurely define IRB::JobMangager
39
- # so these methods need to be defined at the latest possible time.
40
- unless jobs.respond_to?(:select_session_by_context)
41
- def jobs.select_session_by_context(&block)
42
- @jobs.select { |job| block.call(job[1].context.main)}
43
- end
44
- end
45
-
46
- unless jobs.respond_to?(:session_select)
47
- def jobs.select_shef_session(target_context)
48
- session = if target_context.kind_of?(Class)
49
- select_session_by_context { |main| main.kind_of?(target_context) }
50
- else
51
- select_session_by_context { |main| main.equal?(target_context) }
52
- end
53
- Array(session.first)[1]
54
- end
55
- end
56
- end
57
-
58
- def find_or_create_session_for(context_obj)
59
- ensure_session_select_defined
60
- if subsession = jobs.select_shef_session(context_obj)
61
- jobs.switch(subsession)
62
- else
63
- irb(context_obj)
64
- end
65
- end
66
-
67
- def help_banner
68
- banner = []
69
- banner << ""
70
- banner << "Shef Help"
71
- banner << "".ljust(80, "=")
72
- banner << "| " + "Command".ljust(25) + "| " + "Description"
73
- banner << "".ljust(80, "=")
74
-
75
- self.all_help_descriptions.each do |help_text|
76
- banner << "| " + help_text.cmd.ljust(25) + "| " + help_text.desc
77
- end
78
- banner << "".ljust(80, "=")
79
- banner << "\n"
80
- banner << "Use help(:command) to get detailed help with individual commands"
81
- banner << "\n"
82
- banner.join("\n")
83
- end
84
-
85
- def explain_command(method_name)
86
- help = self.all_help_descriptions.find { |h| h.cmd.to_s == method_name.to_s }
87
- if help
88
- puts ""
89
- puts "Command: #{method_name}"
90
- puts "".ljust(80, "=")
91
- puts help.explanation || help.desc
92
- puts "".ljust(80, "=")
93
- puts ""
94
- else
95
- puts ""
96
- puts "command #{method_name} not found or no help available"
97
- puts ""
98
- end
99
- end
100
-
101
- # helpfully returns +:on+ so we can have sugary syntax like `tracing on'
102
- def on
103
- :on
104
- end
105
-
106
- # returns +:off+ so you can just do `tracing off'
107
- def off
108
- :off
109
- end
110
-
111
- def help_descriptions
112
- @help_descriptions ||= []
113
- end
114
-
115
- def all_help_descriptions
116
- help_descriptions
117
- end
118
-
119
- def desc(help_text)
120
- @desc = help_text
121
- end
122
-
123
- def explain(explain_text)
124
- @explain = explain_text
125
- end
126
-
127
- def subcommands(subcommand_help={})
128
- @subcommand_help = subcommand_help
129
- end
130
-
131
- def singleton_method_added(mname)
132
- if @desc
133
- help_descriptions << Help.new(mname.to_s, @desc.to_s, @explain)
134
- @desc, @explain = nil, nil
135
- end
136
- if @subcommand_help
137
- @subcommand_help.each do |subcommand, text|
138
- help_descriptions << Help.new("#{mname}.#{subcommand}", text.to_s, nil)
139
- end
140
- end
141
- @subcommand_help = {}
142
- end
143
-
144
- end
145
-
146
- module String
147
- def on_off_to_bool
148
- case self
149
- when "on"
150
- true
151
- when "off"
152
- false
153
- else
154
- self
155
- end
156
- end
157
- end
158
-
159
- module Symbol
160
- def on_off_to_bool
161
- self.to_s.on_off_to_bool
162
- end
163
- end
164
-
165
- module TrueClass
166
- def to_on_off_str
167
- "on"
168
- end
169
-
170
- def on_off_to_bool
171
- self
172
- end
173
- end
174
-
175
- module FalseClass
176
- def to_on_off_str
177
- "off"
178
- end
179
-
180
- def on_off_to_bool
181
- self
182
- end
183
- end
184
-
185
- # Methods that have associated help text need to be dynamically added
186
- # to the main irb objects, so we define them in a proc and later
187
- # instance_eval the proc in the object.
188
- ObjectUIExtensions = Proc.new do
189
- extend Shef::Extensions::ObjectCoreExtensions
190
-
191
- desc "prints this help message"
192
- explain(<<-E)
193
- ## SUMMARY ##
194
- When called with no argument, +help+ prints a table of all shef commands. When
195
- called with an argument COMMAND, +help+ prints a detailed explanation of the
196
- command if available, or the description if no explanation is available.
197
- E
198
- def help(commmand=nil)
199
- if commmand
200
- explain_command(commmand)
201
- else
202
- puts help_banner
203
- end
204
- :ucanhaz_halp
205
- end
206
- alias :halp :help
207
-
208
- desc "prints information about chef"
209
- def version
210
- puts "This is shef, the Chef shell.\n" +
211
- " Chef Version: #{::Chef::VERSION}\n" +
212
- " http://www.opscode.com/chef\n" +
213
- " http://wiki.opscode.com/display/chef/Home"
214
- :ucanhaz_automation
215
- end
216
- alias :shef :version
217
-
218
- desc "switch to recipe mode"
219
- def recipe
220
- find_or_create_session_for Shef.session.recipe
221
- :recipe
222
- end
223
-
224
- desc "switch to attributes mode"
225
- def attributes
226
- find_or_create_session_for Shef.session.node
227
- :attributes
228
- end
229
-
230
- desc "run chef using the current recipe"
231
- def run_chef
232
- Chef::Log.level = :debug
233
- session = Shef.session
234
- runrun = Chef::Runner.new(session.run_context).converge
235
- Chef::Log.level = :info
236
- runrun
237
- end
238
-
239
- desc "returns an object to control a paused chef run"
240
- subcommands :resume => "resume the chef run",
241
- :step => "run only the next resource",
242
- :skip_back => "move back in the run list",
243
- :skip_forward => "move forward in the run list"
244
- def chef_run
245
- Shef.session.resource_collection.iterator
246
- end
247
-
248
- desc "resets the current recipe"
249
- def reset
250
- Shef.session.reset!
251
- end
252
-
253
- desc "assume the identity of another node."
254
- def become_node(node_name)
255
- Shef::DoppelGangerSession.instance.assume_identity(node_name)
256
- :doppelganger
257
- end
258
- alias :doppelganger :become_node
259
-
260
- desc "turns printout of return values on or off"
261
- def echo(on_or_off)
262
- conf.echo = on_or_off.on_off_to_bool
263
- end
264
-
265
- desc "says if echo is on or off"
266
- def echo?
267
- puts "echo is #{conf.echo.to_on_off_str}"
268
- end
269
-
270
- desc "turns on or off tracing of execution. *verbose*"
271
- def tracing(on_or_off)
272
- conf.use_tracer = on_or_off.on_off_to_bool
273
- tracing?
274
- end
275
- alias :trace :tracing
276
-
277
- desc "says if tracing is on or off"
278
- def tracing?
279
- puts "tracing is #{conf.use_tracer.to_on_off_str}"
280
- end
281
- alias :trace? :tracing?
282
-
283
- desc "simple ls style command"
284
- def ls(directory)
285
- Dir.entries(directory)
286
- end
287
- end
288
-
289
- MainContextExtensions = Proc.new do
290
- desc "returns the current node (i.e., this host)"
291
- def node
292
- Shef.session.node
293
- end
294
-
295
- desc "pretty print the node's attributes"
296
- def ohai(key=nil)
297
- pp(key ? node.attribute[key] : node.attribute)
298
- end
299
- end
300
-
301
- RESTApiExtensions = Proc.new do
302
- desc "edit an object in your EDITOR"
303
- explain(<<-E)
304
- ## SUMMARY ##
305
- +edit(object)+ allows you to edit any object that can be converted to JSON.
306
- When finished editing, this method will return the edited object:
307
-
308
- new_node = edit(existing_node)
309
-
310
- ## EDITOR SELECTION ##
311
- Shef looks for an editor using the following logic
312
- 1. Looks for an EDITOR set by Shef.editor = "EDITOR"
313
- 2. Looks for an EDITOR configured in your shef config file
314
- 3. Uses the value of the EDITOR environment variable
315
- E
316
- def edit(object)
317
- unless Shef.editor
318
- puts "Please set your editor with Shef.editor = \"vim|emacs|mate|ed\""
319
- return :failburger
320
- end
321
-
322
- filename = "shef-edit-#{object.class.name}-"
323
- if object.respond_to?(:name)
324
- filename += object.name
325
- elsif object.respond_to?(:id)
326
- filename += object.id
327
- end
328
-
329
- edited_data = Tempfile.open([filename, ".js"]) do |tempfile|
330
- tempfile.sync = true
331
- tempfile.puts Chef::JSONCompat.to_json(object)
332
- system("#{Shef.editor.to_s} #{tempfile.path}")
333
- tempfile.rewind
334
- tempfile.read
335
- end
336
-
337
- Chef::JSONCompat.from_json(edited_data)
338
- end
339
-
340
- desc "Find and edit API clients"
341
- explain(<<-E)
342
- ## SUMMARY ##
343
- +clients+ allows you to query you chef server for information about your api
344
- clients.
345
-
346
- ## LIST ALL CLIENTS ##
347
- To see all clients on the system, use
348
-
349
- clients.all #=> [<Chef::ApiClient...>, ...]
350
-
351
- If the output from all is too verbose, or you're only interested in a specific
352
- value from each of the objects, you can give a code block to +all+:
353
-
354
- clients.all { |client| client.name } #=> [CLIENT1_NAME, CLIENT2_NAME, ...]
355
-
356
- ## SHOW ONE CLIENT ##
357
- To see a specific client, use
358
-
359
- clients.show(CLIENT_NAME)
360
-
361
- ## SEARCH FOR CLIENTS ##
362
- You can also search for clients using +find+ or +search+. You can use the
363
- familiar string search syntax:
364
-
365
- clients.search("KEY:VALUE")
366
-
367
- Just as the +all+ subcommand, the +search+ subcommand can use a code block to
368
- filter or transform the information returned from the search:
369
-
370
- clients.search("KEY:VALUE") { |c| c.name }
371
-
372
- You can also use a Hash based syntax, multiple search conditions will be
373
- joined with AND.
374
-
375
- clients.find :KEY => :VALUE, :KEY2 => :VALUE2, ...
376
-
377
- ## BULK-EDIT CLIENTS ##
378
- **BE CAREFUL, THIS IS DESTRUCTIVE**
379
- You can bulk edit API Clients using the +transform+ subcommand, which requires
380
- a code block. Each client will be saved after the code block is run. If the
381
- code block returns +nil+ or +false+, that client will be skipped:
382
-
383
- clients.transform("*:*") do |client|
384
- if client.name =~ /borat/i
385
- client.admin(false)
386
- true
387
- else
388
- nil
389
- end
390
- end
391
-
392
- This will strip the admin privileges from any client named after borat.
393
- E
394
- subcommands :all => "list all api clients",
395
- :show => "load an api client by name",
396
- :search => "search for API clients",
397
- :transform => "edit all api clients via a code block and save them"
398
- def clients
399
- @clients ||= Shef::ModelWrapper.new(Chef::ApiClient, :client)
400
- end
401
-
402
- desc "Find and edit cookbooks"
403
- subcommands :all => "list all cookbooks",
404
- :show => "load a cookbook by name",
405
- :transform => "edit all cookbooks via a code block and save them"
406
- def cookbooks
407
- @cookbooks ||= Shef::ModelWrapper.new(Chef::CookbookVersion)
408
- end
409
-
410
- desc "Find and edit nodes via the API"
411
- explain(<<-E)
412
- ## SUMMARY ##
413
- +nodes+ Allows you to query your chef server for information about your nodes.
414
-
415
- ## LIST ALL NODES ##
416
- You can list all nodes using +all+ or +list+
417
-
418
- nodes.all #=> [<Chef::Node...>, <Chef::Node...>, ...]
419
-
420
- To limit the information returned for each node, pass a code block to the +all+
421
- subcommand:
422
-
423
- nodes.all { |node| node.name } #=> [NODE1_NAME, NODE2_NAME, ...]
424
-
425
- ## SHOW ONE NODE ##
426
- You can show the data for a single node using the +show+ subcommand:
427
-
428
- nodes.show("NODE_NAME") => <Chef::Node @name="NODE_NAME" ...>
429
-
430
- ## SEARCH FOR NODES ##
431
- You can search for nodes using the +search+ or +find+ subcommands:
432
-
433
- nodes.find(:name => "app*") #=> [<Chef::Node @name="app1.example.com" ...>, ...]
434
-
435
- Similarly to +all+, you can pass a code block to limit or transform the
436
- information returned:
437
-
438
- nodes.find(:name => "app#") { |node| node.ec2 }
439
-
440
- ## BULK EDIT NODES ##
441
- **BE CAREFUL, THIS OPERATION IS DESTRUCTIVE**
442
-
443
- Bulk edit nodes by passing a code block to the +transform+ or +bulk_edit+
444
- subcommand. The block will be applied to each matching node, and then the node
445
- will be saved. If the block returns +nil+ or +false+, that node will be
446
- skipped.
447
-
448
- nodes.transform do |node|
449
- if node.fqdn =~ /.*\\.preprod\\.example\\.com/
450
- node.set[:environment] = "preprod"
451
- end
452
- end
453
-
454
- This will assign the attribute to every node with a FQDN matching the regex.
455
- E
456
- subcommands :all => "list all nodes",
457
- :show => "load a node by name",
458
- :search => "search for nodes",
459
- :transform => "edit all nodes via a code block and save them"
460
- def nodes
461
- @nodes ||= Shef::ModelWrapper.new(Chef::Node)
462
- end
463
-
464
- desc "Find and edit roles via the API"
465
- explain(<<-E)
466
- ## SUMMARY ##
467
- +roles+ allows you to query and edit roles on your Chef server.
468
-
469
- ## SUBCOMMANDS ##
470
- * all (list)
471
- * show (load)
472
- * search (find)
473
- * transform (bulk_edit)
474
-
475
- ## SEE ALSO ##
476
- See the help for +nodes+ for more information about the subcommands.
477
- E
478
- subcommands :all => "list all roles",
479
- :show => "load a role by name",
480
- :search => "search for roles",
481
- :transform => "edit all roles via a code block and save them"
482
- def roles
483
- @roles ||= Shef::ModelWrapper.new(Chef::Role)
484
- end
485
-
486
- desc "Find and edit +databag_name+ via the api"
487
- explain(<<-E)
488
- ## SUMMARY ##
489
- +databags(DATABAG_NAME)+ allows you to query and edit data bag items on your
490
- Chef server. Unlike other commands for working with data on the server,
491
- +databags+ requires the databag name as an argument, for example:
492
- databags(:users).all
493
-
494
- ## SUBCOMMANDS ##
495
- * all (list)
496
- * show (load)
497
- * search (find)
498
- * transform (bulk_edit)
499
-
500
- ## SEE ALSO ##
501
- See the help for +nodes+ for more information about the subcommands.
502
-
503
- E
504
- subcommands :all => "list all items in the data bag",
505
- :show => "load a data bag item by id",
506
- :search => "search for items in the data bag",
507
- :transform => "edit all items via a code block and save them"
508
- def databags(databag_name)
509
- @named_databags_wrappers ||= {}
510
- @named_databags_wrappers[databag_name] ||= Shef::NamedDataBagWrapper.new(databag_name)
511
- end
512
-
513
- desc "Find and edit environments via the API"
514
- explain(<<-E)
515
- ## SUMMARY ##
516
- +environments+ allows you to query and edit environments on your Chef server.
517
-
518
- ## SUBCOMMANDS ##
519
- * all (list)
520
- * show (load)
521
- * search (find)
522
- * transform (bulk_edit)
523
-
524
- ## SEE ALSO ##
525
- See the help for +nodes+ for more information about the subcommands.
526
- E
527
- subcommands :all => "list all environments",
528
- :show => "load an environment by name",
529
- :search => "search for environments",
530
- :transform => "edit all environments via a code block and save them"
531
- def environments
532
- @environments ||= Shef::ModelWrapper.new(Chef::Environment)
533
- end
534
-
535
- desc "A REST Client configured to authenticate with the API"
536
- def api
537
- @rest = Shef::ShefREST.new(Chef::Config[:chef_server_url])
538
- end
539
-
540
- end
541
-
542
- RecipeUIExtensions = Proc.new do
543
- alias :original_resources :resources
544
-
545
- desc "list all the resources on the current recipe"
546
- def resources(*args)
547
- if args.empty?
548
- pp run_context.resource_collection.instance_variable_get(:@resources_by_name).keys
549
- else
550
- pp resources = original_resources(*args)
551
- resources
552
- end
553
- end
554
- end
555
-
556
- def self.extend_context_object(obj)
557
- obj.instance_eval(&ObjectUIExtensions)
558
- obj.instance_eval(&MainContextExtensions)
559
- obj.instance_eval(&RESTApiExtensions)
560
- obj.extend(FileUtils)
561
- obj.extend(Chef::Mixin::Language)
562
- end
563
-
564
- def self.extend_context_node(node_obj)
565
- node_obj.instance_eval(&ObjectUIExtensions)
566
- end
567
-
568
- def self.extend_context_recipe(recipe_obj)
569
- recipe_obj.instance_eval(&ObjectUIExtensions)
570
- recipe_obj.instance_eval(&RecipeUIExtensions)
571
- end
572
-
573
- end
574
- end
575
-
576
- class String
577
- include Shef::Extensions::String
578
- end
579
-
580
- class Symbol
581
- include Shef::Extensions::Symbol
582
- end
583
-
584
- class TrueClass
585
- include Shef::Extensions::TrueClass
586
- end
587
-
588
- class FalseClass
589
- include Shef::Extensions::FalseClass
590
- end
591
-
19
+ require 'chef/shell/ext'