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
@@ -0,0 +1,32 @@
1
+ require 'chef/chef_fs/knife'
2
+ require 'chef/chef_fs/file_system'
3
+
4
+ class Chef
5
+ class Knife
6
+ class Show < Chef::ChefFS::Knife
7
+ banner "knife show [PATTERN1 ... PATTERNn]"
8
+
9
+ common_options
10
+
11
+ def run
12
+ # Get the matches (recursively)
13
+ pattern_args.each do |pattern|
14
+ Chef::ChefFS::FileSystem.list(chef_fs, pattern) do |result|
15
+ if result.dir?
16
+ STDERR.puts "#{result.path_for_printing}: is a directory" if pattern.exact_path
17
+ else
18
+ begin
19
+ value = result.read
20
+ puts "#{result.path_for_printing}:"
21
+ output(format_for_display(value))
22
+ rescue Chef::ChefFS::FileSystem::NotFoundError
23
+ STDERR.puts "#{result.path_for_printing}: No such file or directory"
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+
@@ -146,9 +146,9 @@ class Chef
146
146
  if !config[:override_attribute] && item[:cloud] and item[:cloud][:public_hostname]
147
147
  i = item[:cloud][:public_hostname]
148
148
  elsif config[:override_attribute]
149
- i = format_for_display(item)[config[:override_attribute]]
149
+ i = extract_nested_value(item, config[:override_attribute])
150
150
  else
151
- i = format_for_display(item)[config[:attribute]]
151
+ i = extract_nested_value(item, config[:attribute])
152
152
  end
153
153
  # next if we couldn't find the specified attribute in the returned node object
154
154
  next if i.nil?
@@ -415,6 +415,10 @@ class Chef
415
415
  Chef::Config[:knife][:ssh_identity_file])
416
416
  end
417
417
 
418
+ def extract_nested_value(data_structure, path_spec)
419
+ ui.presenter.extract_nested_value(data_structure, path_spec)
420
+ end
421
+
418
422
  def run
419
423
  extend Chef::Mixin::Command
420
424
 
@@ -0,0 +1,50 @@
1
+ require 'chef/chef_fs/knife'
2
+ require 'chef/chef_fs/command_line'
3
+
4
+ class Chef
5
+ class Knife
6
+ class Upload < Chef::ChefFS::Knife
7
+ banner "knife upload PATTERNS"
8
+
9
+ common_options
10
+
11
+ option :recurse,
12
+ :long => '--[no-]recurse',
13
+ :boolean => true,
14
+ :default => true,
15
+ :description => "List directories recursively."
16
+
17
+ option :purge,
18
+ :long => '--[no-]purge',
19
+ :boolean => true,
20
+ :default => false,
21
+ :description => "Delete matching local files and directories that do not exist remotely."
22
+
23
+ option :force,
24
+ :long => '--[no-]force',
25
+ :boolean => true,
26
+ :default => false,
27
+ :description => "Force upload of files even if they match (quicker and harmless, but doesn't print out what it changed)"
28
+
29
+ option :dry_run,
30
+ :long => '--dry-run',
31
+ :short => '-n',
32
+ :boolean => true,
33
+ :default => false,
34
+ :description => "Don't take action, only print what would happen"
35
+
36
+ def run
37
+ if name_args.length == 0
38
+ show_usage
39
+ ui.fatal("Must specify at least one argument. If you want to upload everything in this directory, type \"knife upload .\"")
40
+ exit 1
41
+ end
42
+
43
+ pattern_args.each do |pattern|
44
+ Chef::ChefFS::FileSystem.copy_to(pattern, local_fs, chef_fs, config[:recurse] ? nil : 1, config)
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+
@@ -17,16 +17,16 @@
17
17
  #
18
18
 
19
19
  require 'digest/sha2'
20
- require 'chef/checksum_cache'
20
+ require 'chef/digester'
21
21
 
22
22
  class Chef
23
23
  module Mixin
24
24
  module Checksum
25
25
 
26
26
  def checksum(file)
27
- Chef::ChecksumCache.checksum_for_file(file)
27
+ Chef::Digester.checksum_for_file(file)
28
28
  end
29
-
29
+
30
30
  end
31
31
  end
32
32
  end
@@ -8,9 +8,9 @@
8
8
  # Licensed under the Apache License, Version 2.0 (the "License");
9
9
  # you may not use this file except in compliance with the License.
10
10
  # You may obtain a copy of the License at
11
- #
11
+ #
12
12
  # http://www.apache.org/licenses/LICENSE-2.0
13
- #
13
+ #
14
14
  # Unless required by applicable law or agreed to in writing, software
15
15
  # distributed under the License is distributed on an "AS IS" BASIS,
16
16
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -26,20 +26,25 @@ class Chef
26
26
  # deep_merge is available under the MIT license from
27
27
  # http://trac.misuse.org/science/wiki/DeepMerge
28
28
  module DeepMerge
29
- extend self
30
29
 
31
- def merge(first, second)
32
- first = Mash.new(first) unless first.kind_of?(Mash)
33
- second = Mash.new(second) unless second.kind_of?(Mash)
30
+ class InvalidSubtractiveMerge < ArgumentError; end
34
31
 
35
- DeepMerge.deep_merge(second, first, {:preserve_unmergeables => false})
36
- end
37
32
 
38
- def horizontal_merge(first, second)
33
+ OLD_KNOCKOUT_PREFIX = "!merge:".freeze
34
+
35
+ # Regex to match the "knockout prefix" that was used to indicate
36
+ # subtractive merging in Chef 10.x and previous. Subtractive merging is
37
+ # removed as of Chef 11, but we detect attempted use of it and raise an
38
+ # error (see: raise_if_knockout_used!)
39
+ OLD_KNOCKOUT_MATCH = %r[!merge].freeze
40
+
41
+ extend self
42
+
43
+ def merge(first, second)
39
44
  first = Mash.new(first) unless first.kind_of?(Mash)
40
45
  second = Mash.new(second) unless second.kind_of?(Mash)
41
46
 
42
- DeepMerge.deep_merge(second, first, {:preserve_unmergeables => false, :horizontal_precedence => true})
47
+ DeepMerge.deep_merge(second, first)
43
48
  end
44
49
 
45
50
  # Inherited roles use the knockout_prefix array subtraction functionality
@@ -48,7 +53,7 @@ class Chef
48
53
  first = Mash.new(first) unless first.kind_of?(Mash)
49
54
  second = Mash.new(second) unless second.kind_of?(Mash)
50
55
 
51
- DeepMerge.deep_merge(second, first, {:preserve_unmergeables => false, :knockout_prefix => "!merge", :horizontal_precedence => true})
56
+ DeepMerge.deep_merge(second, first)
52
57
  end
53
58
 
54
59
  class InvalidParameter < StandardError; end
@@ -67,217 +72,70 @@ class Chef
67
72
  # Results: {:x => [1,2,3,4,5,'6'], :y => 2}
68
73
  # By default, "deep_merge!" will overwrite any unmergeables and merge everything else.
69
74
  # To avoid this, use "deep_merge" (no bang/exclamation mark)
70
- #
71
- # Options:
72
- # Options are specified in the last parameter passed, which should be in hash format:
73
- # hash.deep_merge!({:x => [1,2]}, {:knockout_prefix => '!merge'})
74
- # :preserve_unmergeables DEFAULT: false
75
- # Set to true to skip any unmergeable elements from source
76
- # :knockout_prefix DEFAULT: nil
77
- # Set to string value to signify prefix which deletes elements from existing element
78
- # A colon is appended when indicating a specific value, eg:
79
- # :knockout_prefix => "dontmerge", is referenced as "dontmerge:foobar" in an array
80
- # :sort_merged_arrays DEFAULT: false
81
- # Set to true to sort all arrays that are merged together
82
- # :unpack_arrays DEFAULT: nil
83
- # Set to string value to run "Array::join" then "String::split" against all arrays
84
- # :merge_debug DEFAULT: false
85
- # Set to true to get console output of merge process for debugging
86
- #
87
- # Selected Options Details:
88
- # :knockout_prefix => The purpose of this is to provide a way to remove elements
89
- # from existing Hash by specifying them in a special way in incoming hash
90
- # source = {:x => ['!merge:1', '2']}
91
- # dest = {:x => ['1', '3']}
92
- # dest.ko_deep_merge!(source)
93
- # Results: {:x => ['2','3']}
94
- # Additionally, if the knockout_prefix is passed alone as a string, it will cause
95
- # the entire element to be removed:
96
- # source = {:x => '!merge'}
97
- # dest = {:x => [1,2,3]}
98
- # dest.ko_deep_merge!(source)
99
- # Results: {:x => ""}
100
- # :unpack_arrays => The purpose of this is to permit compound elements to be passed
101
- # in as strings and to be converted into discrete array elements
102
- # irsource = {:x => ['1,2,3', '4']}
103
- # dest = {:x => ['5','6','7,8']}
104
- # dest.deep_merge!(source, {:unpack_arrays => ','})
105
- # Results: {:x => ['1','2','3','4','5','6','7','8'}
106
- # Why: If receiving data from an HTML form, this makes it easy for a checkbox
107
- # to pass multiple values from within a single HTML element
108
- #
109
- # There are many tests for this library - and you can learn more about the features
110
- # and usages of deep_merge! by just browsing the test examples
111
- def deep_merge!(source, dest, options = {})
112
- # turn on this line for stdout debugging text
113
- merge_debug = options[:merge_debug] || false
114
- overwrite_unmergeable = !options[:preserve_unmergeables]
115
- knockout_prefix = options[:knockout_prefix] || nil
116
- raise InvalidParameter, "knockout_prefix cannot be an empty string in deep_merge!" if knockout_prefix == ""
117
- raise InvalidParameter, "overwrite_unmergeable must be true if knockout_prefix is specified in deep_merge!" if knockout_prefix && !overwrite_unmergeable
118
- # if present: we will split and join arrays on this char before merging
119
- array_split_char = options[:unpack_arrays] || false
120
- # request that we sort together any arrays when they are merged
121
- sort_merged_arrays = options[:sort_merged_arrays] || false
122
- di = options[:debug_indent] || ''
123
- # do nothing if source is nil
124
- return dest if source.nil?
75
+ def deep_merge!(source, dest)
125
76
  # if dest doesn't exist, then simply copy source to it
126
- if dest.nil? && overwrite_unmergeable
77
+ if dest.nil?
127
78
  dest = source; return dest
128
79
  end
129
80
 
130
- puts "#{di}Source class: #{source.class.inspect} :: Dest class: #{dest.class.inspect}" if merge_debug
131
- if source.kind_of?(Hash)
132
- puts "#{di}Hashes: #{source.inspect} :: #{dest.inspect}" if merge_debug
81
+ raise_if_knockout_used!(source)
82
+ raise_if_knockout_used!(dest)
83
+ case source
84
+ when nil
85
+ dest
86
+ when Hash
133
87
  source.each do |src_key, src_value|
134
88
  if dest.kind_of?(Hash)
135
- puts "#{di} looping: #{src_key.inspect} => #{src_value.inspect} :: #{dest.inspect}" if merge_debug
136
89
  if dest[src_key]
137
- puts "#{di} ==>merging: #{src_key.inspect} => #{src_value.inspect} :: #{dest[src_key].inspect}" if merge_debug
138
- dest[src_key] = deep_merge!(src_value, dest[src_key], options.merge(:debug_indent => di + ' '))
139
- else # dest[src_key] doesn't exist so we want to create and overwrite it (but we do this via deep_merge!)
140
- puts "#{di} ==>merging over: #{src_key.inspect} => #{src_value.inspect}" if merge_debug
141
- # NOTE: We are doing this via deep_merge! because the
142
- # src_value can still contain merge directives such as
143
- # knockout_prefix.
144
- # Historically we have been dup'ing the src_value here
145
- # and merging src_value with src_value.dup. This logic
146
- # is not applicable anymore because it results in
147
- # duplicates when merging two array values with
148
- # :horizontal_precedence = true.
149
- if src_value.nil?
150
- # Nothing to compute with an extra deep_merge!
151
- dest[src_key] = src_value
152
- else
153
- dest[src_key] = deep_merge!(src_value, { }, options.merge(:debug_indent => di + ' '))
154
- end
155
- end
156
- else # dest isn't a hash, so we overwrite it completely (if permitted)
157
- if overwrite_unmergeable
158
- puts "#{di} overwriting dest: #{src_key.inspect} => #{src_value.inspect} -over-> #{dest.inspect}" if merge_debug
159
- dest = overwrite_unmergeables(source, dest, options)
90
+ dest[src_key] = deep_merge!(src_value, dest[src_key])
91
+ else # dest[src_key] doesn't exist so we take whatever source has
92
+ raise_if_knockout_used!(src_value)
93
+ dest[src_key] = src_value
160
94
  end
95
+ else # dest isn't a hash, so we overwrite it completely
96
+ dest = source
161
97
  end
162
98
  end
163
- elsif source.kind_of?(Array)
164
- puts "#{di}Arrays: #{source.inspect} :: #{dest.inspect}" if merge_debug
165
- # if we are instructed, join/split any source arrays before processing
166
- if array_split_char
167
- puts "#{di} split/join on source: #{source.inspect}" if merge_debug
168
- source = source.join(array_split_char).split(array_split_char)
169
- if dest.kind_of?(Array)
170
- dest = dest.join(array_split_char).split(array_split_char)
171
- end
172
- end
173
- # if there's a naked knockout_prefix in source, that means we are to truncate dest
174
- ko_variants = [ knockout_prefix, "#{knockout_prefix}:" ]
175
- ko_variants.each do |ko|
176
- if source.index(ko)
177
- dest = clear_or_nil(dest); source.delete(ko)
178
- end
179
- end
99
+ when Array
180
100
  if dest.kind_of?(Array)
181
- if knockout_prefix
182
- print "#{di} knocking out: " if merge_debug
183
- # remove knockout prefix items from both source and dest
184
- source.delete_if do |ko_item|
185
- retval = false
186
- item = ko_item.respond_to?(:gsub) ? ko_item.gsub(%r{^#{knockout_prefix}:}, "") : ko_item
187
- if item != ko_item
188
- print "#{ko_item} - " if merge_debug
189
- dest.delete(item)
190
- dest.delete(ko_item)
191
- retval = true
192
- end
193
- retval
194
- end
195
- puts if merge_debug
196
- end
197
- puts "#{di} merging arrays: #{source.inspect} :: #{dest.inspect}" if merge_debug
198
- # Behavior of merging arrays has changed with CHEF-4631.
199
- # Old behavior was to deduplicate and merge the
200
- # arrays. New behavior is to concatanate the arrays if the
201
- # merge is happening on the same attribute precedence
202
- # level and pick the value from the higher precedence
203
- # level if merge is being done across the precedence
204
- # levels.
205
- # Old behavior can still be used by setting
206
- # :deep_merge_array_concat to false in config.
207
- if Chef::Config[:deep_merge_array_concat]
208
- # If :horizontal_precedence is set, this means we are
209
- # merging two arrays at the same precendence level so
210
- # concatanate them. Otherwise this is a merge across
211
- # precedence levels which means we will pick the one
212
- # from higher precedence level.
213
- if options[:horizontal_precedence]
214
- dest += source
215
- else
216
- dest = source
217
- end
218
- else
219
- # Pre CHEF-4631 behavior for array merging
220
- dest = dest | source
221
- end
222
- dest.sort! if sort_merged_arrays
223
- elsif overwrite_unmergeable
224
- puts "#{di} overwriting dest: #{source.inspect} -over-> #{dest.inspect}" if merge_debug
225
- dest = overwrite_unmergeables(source, dest, options)
101
+ dest = dest | source
102
+ else
103
+ dest = source
226
104
  end
105
+ when String
106
+ dest = source
227
107
  else # src_hash is not an array or hash, so we'll have to overwrite dest
228
- puts "#{di}Others: #{source.inspect} :: #{dest.inspect}" if merge_debug
229
- dest = overwrite_unmergeables(source, dest, options)
108
+ dest = source
230
109
  end
231
- puts "#{di}Returning #{dest.inspect}" if merge_debug
232
110
  dest
233
111
  end # deep_merge!
234
112
 
235
- # allows deep_merge! to uniformly handle overwriting of unmergeable entities
236
- def overwrite_unmergeables(source, dest, options)
237
- merge_debug = options[:merge_debug] || false
238
- overwrite_unmergeable = !options[:preserve_unmergeables]
239
- knockout_prefix = options[:knockout_prefix] || false
240
- di = options[:debug_indent] || ''
241
- if knockout_prefix && overwrite_unmergeable
242
- if source.kind_of?(String) # remove knockout string from source before overwriting dest
243
- if source == knockout_prefix
244
- src_tmp = ""
245
- else
246
- src_tmp = source.gsub(%r{^#{knockout_prefix}:},"")
247
- end
248
- elsif source.kind_of?(Array) # remove all knockout elements before overwriting dest
249
- src_tmp = source.delete_if {|ko_item| ko_item.kind_of?(String) && ko_item.match(%r{^#{knockout_prefix}:}) }
250
- else
251
- src_tmp = source
252
- end
253
- if src_tmp == source # if we didn't find a knockout_prefix then we just overwrite dest
254
- puts "#{di}#{src_tmp.inspect} -over-> #{dest.inspect}" if merge_debug
255
- dest = src_tmp
256
- else # if we do find a knockout_prefix, then we just delete dest
257
- puts "#{di}\"\" -over-> #{dest.inspect}" if merge_debug
258
- dest = ""
259
- end
260
- elsif overwrite_unmergeable
261
- dest = source
113
+ # Checks for attempted use of subtractive merge, which was removed for
114
+ # Chef 11.0. If subtractive merge use is detected, will raise an
115
+ # InvalidSubtractiveMerge exception.
116
+ def raise_if_knockout_used!(obj)
117
+ if uses_knockout?(obj)
118
+ raise InvalidSubtractiveMerge, "subtractive merge with !merge is no longer supported"
262
119
  end
263
- dest
264
- end
265
-
266
- def deep_merge(source, dest, options = {})
267
- deep_merge!(source.dup, dest.dup, options)
268
120
  end
269
121
 
270
- def clear_or_nil(obj)
271
- if obj.respond_to?(:clear)
272
- obj.clear
122
+ # Checks for attempted use of subtractive merge in +obj+.
123
+ def uses_knockout?(obj)
124
+ case obj
125
+ when String
126
+ obj =~ OLD_KNOCKOUT_MATCH
127
+ when Array
128
+ obj.any? {|element| element.respond_to?(:gsub) && element =~ OLD_KNOCKOUT_MATCH }
273
129
  else
274
- obj = nil
130
+ false
275
131
  end
276
- obj
277
132
  end
278
133
 
279
- end
134
+ def deep_merge(source, dest)
135
+ deep_merge!(source.dup, dest.dup)
136
+ end
280
137
 
138
+ end
281
139
  end
282
140
  end
283
141
 
@@ -16,233 +16,20 @@
16
16
  # limitations under the License.
17
17
  #
18
18
 
19
- require 'chef/search/query'
20
- require 'chef/data_bag'
21
- require 'chef/data_bag_item'
22
- require 'chef/encrypted_data_bag_item'
19
+ require 'chef/dsl/platform_introspection'
20
+ require 'chef/dsl/data_query'
23
21
 
24
22
  class Chef
25
23
  module Mixin
26
- module Language
27
-
28
- # Implementation class for determining platform dependent values
29
- class PlatformDependentValue
30
-
31
- # Create a platform dependent value object.
32
- # === Arguments
33
- # platform_hash (Hash) a hash of the same structure as Chef::Platform,
34
- # like this:
35
- # {
36
- # :debian => {:default => 'the value for all debian'}
37
- # [:centos, :redhat, :fedora] => {:default => "value for all EL variants"}
38
- # :ubuntu => { :default => "default for ubuntu", '10.04' => "value for 10.04 only"},
39
- # :default => "the default when nothing else matches"
40
- # }
41
- # * platforms can be specified as Symbols or Strings
42
- # * multiple platforms can be grouped by using an Array as the key
43
- # * values for platforms need to be Hashes of the form:
44
- # {platform_version => value_for_that_version}
45
- # * the exception to the above is the default value, which is given as
46
- # :default => default_value
47
- def initialize(platform_hash)
48
- @values = {}
49
- platform_hash.each { |platforms, value| set(platforms, value)}
50
- end
51
-
52
- def value_for_node(node)
53
- platform, version = node[:platform].to_s, node[:platform_version].to_s
54
- if @values.key?(platform) && @values[platform].key?(version)
55
- @values[platform][version]
56
- elsif @values.key?(platform) && @values[platform].key?("default")
57
- @values[platform]["default"]
58
- elsif @values.key?("default")
59
- @values["default"]
60
- else
61
- nil
62
- end
63
- end
64
-
65
- private
66
-
67
- def set(platforms, value)
68
- if platforms.to_s == 'default'
69
- @values["default"] = value
70
- else
71
- assert_valid_platform_values!(platforms, value)
72
- Array(platforms).each { |platform| @values[platform.to_s] = normalize_keys(value)}
73
- value
74
- end
75
- end
76
-
77
- def normalize_keys(hash)
78
- hash.inject({}) do |h, key_value|
79
- keys, value = *key_value
80
- Array(keys).each do |key|
81
- h[key.to_s] = value
82
- end
83
- h
84
- end
85
- end
86
-
87
- def assert_valid_platform_values!(platforms, value)
88
- unless value.kind_of?(Hash)
89
- msg = "platform dependent values must be specified in the format :platform => {:version => value} "
90
- msg << "you gave a value #{value.inspect} for platform(s) #{platforms}"
91
- raise ArgumentError, msg
92
- end
93
- end
94
- end
95
-
96
-
97
-
98
- # Given a hash similar to the one we use for Platforms, select a value from the hash. Supports
99
- # per platform defaults, along with a single base default. Arrays may be passed as hash keys and
100
- # will be expanded.
101
- #
102
- # === Parameters
103
- # platform_hash:: A platform-style hash.
104
- #
105
- # === Returns
106
- # value:: Whatever the most specific value of the hash is.
107
- def value_for_platform(platform_hash)
108
- PlatformDependentValue.new(platform_hash).value_for_node(node)
109
- end
110
-
111
- # Given a list of platforms, returns true if the current recipe is being run on a node with
112
- # that platform, false otherwise.
113
- #
114
- # === Parameters
115
- # args:: A list of platforms. Each platform can be in string or symbol format.
116
- #
117
- # === Returns
118
- # true:: If the current platform is in the list
119
- # false:: If the current platform is not in the list
120
- def platform?(*args)
121
- has_platform = false
122
24
 
123
- args.flatten.each do |platform|
124
- has_platform = true if platform.to_s == node[:platform]
125
- end
126
-
127
- has_platform
128
- end
129
-
130
-
131
-
132
- # Implementation class for determining platform family dependent values
133
- class PlatformFamilyDependentValue
134
-
135
- # Create a platform family dependent value object.
136
- # === Arguments
137
- # platform_family_hash (Hash) a map of platform families to values.
138
- # like this:
139
- # {
140
- # :rhel => "value for all EL variants"
141
- # :fedora => "value for fedora variants fedora and amazon" ,
142
- # [:fedora, :rhel] => "value for all known redhat variants"
143
- # :debian => "value for debian variants including debian, ubuntu, mint" ,
144
- # :default => "the default when nothing else matches"
145
- # }
146
- # * platform families can be specified as Symbols or Strings
147
- # * multiple platform families can be grouped by using an Array as the key
148
- # * values for platform families can be any object, with no restrictions. Some examples:
149
- # - [:stop, :start]
150
- # - "mysql-devel"
151
- # - { :key => "value" }
152
- def initialize(platform_family_hash)
153
- @values = {}
154
- @values["default"] = nil
155
- platform_family_hash.each { |platform_families, value| set(platform_families, value)}
156
- end
157
-
158
- def value_for_node(node)
159
- if node.key?(:platform_family)
160
- platform_family = node[:platform_family].to_s
161
- if @values.key?(platform_family)
162
- @values[platform_family]
163
- else
164
- @values["default"]
165
- end
166
- else
167
- @values["default"]
168
- end
169
- end
170
-
171
- private
172
-
173
- def set(platform_family, value)
174
- if platform_family.to_s == 'default'
175
- @values["default"] = value
176
- else
177
- Array(platform_family).each { |family| @values[family.to_s] = value }
178
- value
179
- end
180
- end
181
- end
182
-
183
-
184
- # Given a hash mapping platform families to values, select a value from the hash. Supports a single
185
- # base default if platform family is not in the map. Arrays may be passed as hash keys and will be
186
- # expanded.
187
- #
188
- # === Parameters
189
- # platform_family_hash:: A hash in the form { platform_family_name => value }
190
- #
191
- # === Returns
192
- # value:: Whatever the most specific value of the hash is.
193
- def value_for_platform_family(platform_family_hash)
194
- PlatformFamilyDependentValue.new(platform_family_hash).value_for_node(node)
195
- end
196
-
197
- # Given a list of platform families, returns true if the current recipe is being run on a
198
- # node within that platform family, false otherwise.
199
- #
200
- # === Parameters
201
- # args:: A list of platform families. Each platform family can be in string or symbol format.
202
- #
203
- # === Returns
204
- # true:: if the current node platform family is in the list.
205
- # false:: if the current node platform family is not in the list.
206
- def platform_family?(*args)
207
- has_pf = false
208
- args.flatten.each do |platform_family|
209
- has_pf = true if platform_family.to_s == node[:platform_family]
210
- end
211
- has_pf
212
- end
213
-
214
- def search(*args, &block)
215
- # If you pass a block, or have at least the start argument, do raw result parsing
216
- #
217
- # Otherwise, do the iteration for the end user
218
- if Kernel.block_given? || args.length >= 4
219
- Chef::Search::Query.new.search(*args, &block)
220
- else
221
- results = Array.new
222
- Chef::Search::Query.new.search(*args) do |o|
223
- results << o
224
- end
225
- results
226
- end
227
- end
228
-
229
- def data_bag(bag)
230
- DataBag.validate_name!(bag.to_s)
231
- rbag = DataBag.load(bag)
232
- rbag.keys
233
- rescue Exception
234
- Log.error("Failed to list data bag items in data bag: #{bag.inspect}")
235
- raise
236
- end
25
+ # == [DEPRECATED] Chef::Mixin::Language
26
+ # This module is deprecated and remains only for backwards compatibility.
27
+ #
28
+ # See Chef::DSL::PlatformIntrospection and Chef::DSL::DataQuery
29
+ module Language
237
30
 
238
- def data_bag_item(bag, item)
239
- DataBag.validate_name!(bag.to_s)
240
- DataBagItem.validate_id!(item)
241
- DataBagItem.load(bag, item)
242
- rescue Exception
243
- Log.error("Failed to load data bag item: #{bag.inspect} #{item.inspect}")
244
- raise
245
- end
31
+ include Chef::DSL::PlatformIntrospection
32
+ include Chef::DSL::DataQuery
246
33
 
247
34
  end
248
35
  end