chef 10.34.6-x86-mingw32 → 11.6.2-x86-mingw32

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 (777) hide show
  1. checksums.yaml +5 -13
  2. data/CONTRIBUTING.md +155 -0
  3. data/README.md +89 -0
  4. data/Rakefile +18 -1
  5. data/bin/chef-apply +25 -0
  6. data/bin/chef-service-manager +37 -0
  7. data/bin/chef-shell +34 -0
  8. data/bin/shef +6 -5
  9. data/distro/common/html/chef-client.8.html +4 -4
  10. data/distro/common/html/chef-expander.8.html +4 -4
  11. data/distro/common/html/chef-expanderctl.8.html +4 -4
  12. data/distro/common/html/chef-server-webui.8.html +4 -4
  13. data/distro/common/html/chef-server.8.html +4 -4
  14. data/distro/common/html/{shef.1.html → chef-shell.1.html} +49 -46
  15. data/distro/common/html/chef-solo.8.html +4 -4
  16. data/distro/common/html/chef-solr.8.html +5 -5
  17. data/distro/common/html/knife-bootstrap.1.html +4 -4
  18. data/distro/common/html/knife-client.1.html +4 -4
  19. data/distro/common/html/knife-configure.1.html +4 -4
  20. data/distro/common/html/knife-cookbook-site.1.html +4 -4
  21. data/distro/common/html/knife-cookbook.1.html +4 -4
  22. data/distro/common/html/knife-data-bag.1.html +4 -4
  23. data/distro/common/html/knife-environment.1.html +4 -4
  24. data/distro/common/html/knife-exec.1.html +9 -9
  25. data/distro/common/html/knife-index.1.html +4 -4
  26. data/distro/common/html/knife-node.1.html +4 -4
  27. data/distro/common/html/knife-role.1.html +4 -4
  28. data/distro/common/html/knife-search.1.html +4 -4
  29. data/distro/common/html/knife-ssh.1.html +4 -4
  30. data/distro/common/html/knife-status.1.html +4 -4
  31. data/distro/common/html/knife-tag.1.html +4 -4
  32. data/distro/common/html/knife.1.html +8 -13
  33. data/distro/common/man/man1/{shef.1 → chef-shell.1} +21 -57
  34. data/distro/common/man/man1/knife-bootstrap.1 +1 -1
  35. data/distro/common/man/man1/knife-client.1 +0 -99
  36. data/distro/common/man/man1/knife-configure.1 +1 -1
  37. data/distro/common/man/man1/knife-cookbook-site.1 +1 -1
  38. data/distro/common/man/man1/knife-cookbook.1 +1 -1
  39. data/distro/common/man/man1/knife-data-bag.1 +1 -1
  40. data/distro/common/man/man1/knife-environment.1 +0 -168
  41. data/distro/common/man/man1/knife-exec.1 +4 -7
  42. data/distro/common/man/man1/knife-index.1 +1 -1
  43. data/distro/common/man/man1/knife-node.1 +1 -1
  44. data/distro/common/man/man1/knife-role.1 +1 -1
  45. data/distro/common/man/man1/knife-search.1 +1 -1
  46. data/distro/common/man/man1/knife-ssh.1 +1 -1
  47. data/distro/common/man/man1/knife-status.1 +1 -1
  48. data/distro/common/man/man1/knife-tag.1 +1 -1
  49. data/distro/common/man/man1/knife.1 +3 -6
  50. data/distro/common/man/man8/chef-client.8 +1 -1
  51. data/distro/common/man/man8/chef-expander.8 +1 -1
  52. data/distro/common/man/man8/chef-expanderctl.8 +1 -1
  53. data/distro/common/man/man8/chef-server-webui.8 +1 -1
  54. data/distro/common/man/man8/chef-server.8 +1 -1
  55. data/distro/common/man/man8/chef-solo.8 +1 -1
  56. data/distro/common/man/man8/chef-solr.8 +1 -1
  57. data/distro/common/markdown/man1/{shef.mkd → chef-shell.mkd} +49 -43
  58. data/distro/common/markdown/man1/knife-exec.mkd +11 -6
  59. data/distro/common/markdown/man1/knife.mkd +4 -9
  60. data/distro/debian/etc/default/chef-client +0 -1
  61. data/distro/debian/etc/init.d/chef-client +6 -4
  62. data/distro/windows/service_manager.rb +2 -146
  63. data/lib/chef.rb +3 -6
  64. data/lib/chef/api_client.rb +20 -130
  65. data/lib/chef/api_client/registration.rb +126 -0
  66. data/lib/chef/application.rb +68 -18
  67. data/lib/chef/application/apply.rb +162 -0
  68. data/lib/chef/application/client.rb +37 -22
  69. data/lib/chef/application/knife.rb +2 -4
  70. data/lib/chef/application/solo.rb +27 -13
  71. data/lib/chef/application/windows_service.rb +114 -54
  72. data/lib/chef/application/windows_service_manager.rb +179 -0
  73. data/lib/chef/applications.rb +1 -0
  74. data/lib/chef/chef_fs.rb +9 -0
  75. data/lib/chef/chef_fs/chef_fs_data_store.rb +371 -0
  76. data/lib/chef/chef_fs/command_line.rb +284 -0
  77. data/lib/chef/chef_fs/config.rb +205 -0
  78. data/lib/chef/chef_fs/data_handler/acl_data_handler.rb +26 -0
  79. data/lib/chef/chef_fs/data_handler/client_data_handler.rb +38 -0
  80. data/lib/chef/chef_fs/data_handler/container_data_handler.rb +29 -0
  81. data/lib/chef/chef_fs/data_handler/cookbook_data_handler.rb +38 -0
  82. data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +56 -0
  83. data/lib/chef/chef_fs/data_handler/data_handler_base.rb +128 -0
  84. data/lib/chef/chef_fs/data_handler/environment_data_handler.rb +40 -0
  85. data/lib/chef/chef_fs/data_handler/group_data_handler.rb +51 -0
  86. data/lib/chef/chef_fs/data_handler/node_data_handler.rb +36 -0
  87. data/lib/chef/chef_fs/data_handler/role_data_handler.rb +40 -0
  88. data/lib/chef/chef_fs/data_handler/user_data_handler.rb +27 -0
  89. data/lib/chef/chef_fs/file_pattern.rb +312 -0
  90. data/lib/chef/chef_fs/file_system.rb +426 -0
  91. data/lib/chef/chef_fs/file_system/acl_dir.rb +64 -0
  92. data/lib/chef/chef_fs/file_system/acl_entry.rb +58 -0
  93. data/lib/chef/chef_fs/file_system/acls_dir.rb +68 -0
  94. data/lib/chef/chef_fs/file_system/already_exists_error.rb +31 -0
  95. data/lib/chef/chef_fs/file_system/base_fs_dir.rb +47 -0
  96. data/lib/chef/chef_fs/file_system/base_fs_object.rb +180 -0
  97. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_dir.rb +85 -0
  98. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_entry.rb +71 -0
  99. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbooks_dir.rb +55 -0
  100. data/lib/chef/chef_fs/file_system/chef_repository_file_system_data_bags_dir.rb +36 -0
  101. data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +60 -0
  102. data/lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb +121 -0
  103. data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +110 -0
  104. data/lib/chef/chef_fs/file_system/cookbook_dir.rb +223 -0
  105. data/lib/chef/chef_fs/file_system/cookbook_file.rb +85 -0
  106. data/lib/chef/chef_fs/file_system/cookbook_frozen_error.rb +31 -0
  107. data/lib/chef/chef_fs/file_system/cookbook_subdir.rb +54 -0
  108. data/lib/chef/chef_fs/file_system/cookbooks_acl_dir.rb +41 -0
  109. data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +149 -0
  110. data/lib/chef/chef_fs/file_system/data_bag_dir.rb +69 -0
  111. data/lib/chef/chef_fs/file_system/data_bags_dir.rb +72 -0
  112. data/lib/chef/chef_fs/file_system/default_environment_cannot_be_modified_error.rb +36 -0
  113. data/lib/chef/chef_fs/file_system/environments_dir.rb +60 -0
  114. data/lib/chef/chef_fs/file_system/file_system_entry.rb +90 -0
  115. data/lib/chef/chef_fs/file_system/file_system_error.rb +33 -0
  116. data/lib/chef/chef_fs/file_system/file_system_root_dir.rb +31 -0
  117. data/lib/chef/chef_fs/file_system/memory_dir.rb +52 -0
  118. data/lib/chef/chef_fs/file_system/memory_file.rb +17 -0
  119. data/lib/chef/chef_fs/file_system/memory_root.rb +21 -0
  120. data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +48 -0
  121. data/lib/chef/chef_fs/file_system/must_delete_recursively_error.rb +31 -0
  122. data/lib/chef/chef_fs/file_system/nodes_dir.rb +55 -0
  123. data/lib/chef/chef_fs/file_system/nonexistent_fs_object.rb +36 -0
  124. data/lib/chef/chef_fs/file_system/not_found_error.rb +31 -0
  125. data/lib/chef/chef_fs/file_system/operation_failed_error.rb +34 -0
  126. data/lib/chef/chef_fs/file_system/operation_not_allowed_error.rb +48 -0
  127. data/lib/chef/chef_fs/file_system/rest_list_dir.rb +113 -0
  128. data/lib/chef/chef_fs/file_system/rest_list_entry.rb +177 -0
  129. data/lib/chef/chef_fs/knife.rb +116 -0
  130. data/lib/chef/chef_fs/parallelizer.rb +129 -0
  131. data/lib/chef/chef_fs/path_utils.rb +90 -0
  132. data/lib/chef/chef_fs/raw_request.rb +79 -0
  133. data/lib/chef/client.rb +111 -34
  134. data/lib/chef/config.rb +111 -102
  135. data/lib/chef/cookbook/chefignore.rb +2 -1
  136. data/lib/chef/cookbook/metadata.rb +0 -2
  137. data/lib/chef/cookbook/syntax_check.rb +76 -14
  138. data/lib/chef/cookbook_loader.rb +39 -26
  139. data/lib/chef/cookbook_uploader.rb +16 -9
  140. data/lib/chef/cookbook_version.rb +2 -410
  141. data/lib/chef/daemon.rb +24 -19
  142. data/lib/chef/data_bag.rb +20 -104
  143. data/lib/chef/data_bag_item.rb +2 -65
  144. data/lib/chef/deprecation/mixin/template.rb +49 -0
  145. data/lib/chef/deprecation/provider/cookbook_file.rb +55 -0
  146. data/lib/chef/deprecation/provider/file.rb +197 -0
  147. data/lib/chef/deprecation/provider/remote_file.rb +86 -0
  148. data/lib/chef/deprecation/provider/template.rb +63 -0
  149. data/lib/chef/deprecation/warnings.rb +38 -0
  150. data/lib/chef/digester.rb +73 -0
  151. data/lib/chef/dsl.rb +6 -0
  152. data/lib/chef/dsl/data_query.rb +71 -0
  153. data/lib/chef/dsl/include_attribute.rb +63 -0
  154. data/lib/chef/dsl/include_recipe.rb +45 -0
  155. data/lib/chef/dsl/platform_introspection.rb +218 -0
  156. data/lib/chef/dsl/recipe.rb +87 -0
  157. data/lib/chef/dsl/registry_helper.rb +59 -0
  158. data/lib/chef/encrypted_data_bag_item.rb +171 -24
  159. data/lib/chef/environment.rb +39 -179
  160. data/lib/chef/event_dispatch/base.rb +3 -0
  161. data/lib/chef/exceptions.rb +107 -8
  162. data/lib/chef/file_access_control/unix.rb +64 -7
  163. data/lib/chef/file_access_control/windows.rb +22 -11
  164. data/lib/chef/file_content_management/content_base.rb +56 -0
  165. data/lib/chef/file_content_management/deploy.rb +38 -0
  166. data/lib/chef/file_content_management/deploy/cp.rb +48 -0
  167. data/lib/chef/file_content_management/deploy/mv_unix.rb +77 -0
  168. data/lib/chef/file_content_management/deploy/mv_windows.rb +95 -0
  169. data/lib/chef/file_content_management/tempfile.rb +61 -0
  170. data/lib/chef/formatters/base.rb +4 -1
  171. data/lib/chef/formatters/doc.rb +1 -1
  172. data/lib/chef/formatters/error_descriptor.rb +5 -4
  173. data/lib/chef/formatters/error_inspectors/cookbook_resolve_error_inspector.rb +23 -3
  174. data/lib/chef/formatters/error_inspectors/resource_failure_inspector.rb +8 -0
  175. data/lib/chef/json_compat.rb +15 -14
  176. data/lib/chef/knife.rb +99 -41
  177. data/lib/chef/knife/bootstrap.rb +46 -2
  178. data/lib/chef/knife/bootstrap/archlinux-gems.erb +1 -1
  179. data/lib/chef/knife/bootstrap/centos5-gems.erb +1 -1
  180. data/lib/chef/knife/bootstrap/chef-full.erb +1 -1
  181. data/lib/chef/knife/bootstrap/fedora13-gems.erb +1 -1
  182. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +1 -1
  183. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +1 -1
  184. data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +1 -1
  185. data/lib/chef/knife/client_show.rb +2 -5
  186. data/lib/chef/knife/configure.rb +19 -17
  187. data/lib/chef/knife/cookbook_create.rb +6 -5
  188. data/lib/chef/knife/cookbook_download.rb +13 -5
  189. data/lib/chef/knife/cookbook_metadata.rb +1 -0
  190. data/lib/chef/knife/cookbook_site_share.rb +1 -0
  191. data/lib/chef/knife/cookbook_test.rb +4 -2
  192. data/lib/chef/knife/cookbook_upload.rb +4 -4
  193. data/lib/chef/knife/core/bootstrap_context.rb +11 -5
  194. data/lib/chef/knife/core/generic_presenter.rb +42 -13
  195. data/lib/chef/knife/core/node_editor.rb +36 -16
  196. data/lib/chef/knife/core/node_presenter.rb +1 -1
  197. data/lib/chef/knife/core/subcommand_loader.rb +43 -12
  198. data/lib/chef/knife/core/text_formatter.rb +23 -37
  199. data/lib/chef/knife/core/ui.rb +34 -13
  200. data/lib/chef/knife/delete.rb +106 -0
  201. data/lib/chef/knife/deps.rb +139 -0
  202. data/lib/chef/knife/diff.rb +63 -0
  203. data/lib/chef/knife/download.rb +63 -0
  204. data/lib/chef/knife/edit.rb +76 -0
  205. data/lib/chef/knife/environment_show.rb +2 -0
  206. data/lib/chef/knife/exec.rb +5 -5
  207. data/lib/chef/knife/help_topics.rb +1 -1
  208. data/lib/chef/knife/index_rebuild.rb +91 -7
  209. data/lib/chef/knife/list.rb +153 -0
  210. data/lib/chef/knife/node_run_list_set.rb +66 -0
  211. data/lib/chef/knife/node_show.rb +1 -7
  212. data/lib/chef/knife/raw.rb +64 -0
  213. data/lib/chef/knife/role_show.rb +2 -4
  214. data/lib/chef/knife/search.rb +45 -28
  215. data/lib/chef/knife/show.rb +55 -0
  216. data/lib/chef/knife/ssh.rb +14 -2
  217. data/lib/chef/knife/upload.rb +69 -0
  218. data/lib/chef/knife/user_create.rb +93 -0
  219. data/lib/chef/knife/user_delete.rb +46 -0
  220. data/lib/chef/knife/user_edit.rb +53 -0
  221. data/lib/chef/{provider/whyrun_safe_ruby_block.rb → knife/user_list.rb} +21 -9
  222. data/lib/chef/knife/user_reregister.rb +59 -0
  223. data/lib/chef/knife/user_show.rb +49 -0
  224. data/lib/chef/knife/xargs.rb +265 -0
  225. data/lib/chef/log.rb +2 -2
  226. data/lib/chef/mixin/checksum.rb +3 -3
  227. data/lib/chef/mixin/deep_merge.rb +78 -194
  228. data/lib/chef/mixin/deprecation.rb +35 -0
  229. data/lib/chef/mixin/file_class.rb +0 -9
  230. data/lib/chef/mixin/language.rb +22 -223
  231. data/lib/chef/mixin/language_include_attribute.rb +10 -36
  232. data/lib/chef/mixin/language_include_recipe.rb +7 -33
  233. data/lib/chef/mixin/params_validate.rb +0 -3
  234. data/lib/chef/mixin/recipe_definition_dsl_core.rb +10 -61
  235. data/lib/chef/mixin/securable.rb +32 -7
  236. data/lib/chef/mixin/template.rb +156 -26
  237. data/lib/chef/mixin/windows_architecture_helper.rb +91 -0
  238. data/lib/chef/mixins.rb +1 -5
  239. data/{spec/unit/monkey_patches/uri_spec.rb → lib/chef/monkey_patches/file.rb} +6 -14
  240. data/lib/chef/monkey_patches/net-ssh-multi.rb +140 -0
  241. data/lib/chef/monkey_patches/net_http.rb +0 -34
  242. data/lib/chef/monkey_patches/securerandom.rb +44 -0
  243. data/lib/chef/monologger.rb +93 -0
  244. data/lib/chef/node.rb +139 -308
  245. data/lib/chef/node/attribute.rb +367 -473
  246. data/lib/chef/node/attribute_collections.rb +206 -0
  247. data/lib/chef/node/immutable_collections.rb +186 -0
  248. data/lib/chef/platform.rb +4 -496
  249. data/lib/chef/platform/provider_mapping.rb +529 -0
  250. data/lib/chef/{mixin/check_helper.rb → platform/query_helpers.rb} +20 -9
  251. data/lib/chef/provider.rb +14 -58
  252. data/lib/chef/provider/batch.rb +35 -0
  253. data/lib/chef/provider/breakpoint.rb +6 -6
  254. data/lib/chef/provider/cookbook_file.rb +11 -80
  255. data/lib/chef/provider/cookbook_file/content.rb +49 -0
  256. data/lib/chef/provider/deploy.rb +26 -21
  257. data/lib/chef/provider/deploy/revision.rb +27 -0
  258. data/lib/chef/provider/directory.rb +12 -18
  259. data/lib/chef/provider/execute.rb +22 -5
  260. data/lib/chef/provider/file.rb +297 -248
  261. data/lib/chef/provider/file/content.rb +39 -0
  262. data/lib/chef/provider/git.rb +76 -43
  263. data/lib/chef/provider/group.rb +31 -51
  264. data/lib/chef/provider/group/dscl.rb +13 -53
  265. data/lib/chef/provider/group/gpasswd.rb +19 -14
  266. data/lib/chef/provider/group/groupadd.rb +1 -41
  267. data/lib/chef/provider/group/groupmod.rb +36 -46
  268. data/lib/chef/provider/group/pw.rb +16 -59
  269. data/lib/chef/provider/group/suse.rb +13 -16
  270. data/lib/chef/provider/group/usermod.rb +18 -40
  271. data/lib/chef/provider/group/windows.rb +6 -13
  272. data/lib/chef/provider/http_request.rb +25 -42
  273. data/lib/chef/provider/ifconfig.rb +25 -35
  274. data/lib/chef/provider/ifconfig/debian.rb +71 -0
  275. data/lib/chef/provider/ifconfig/redhat.rb +47 -0
  276. data/lib/chef/provider/link.rb +12 -3
  277. data/lib/chef/provider/lwrp_base.rb +150 -0
  278. data/lib/chef/provider/mount.rb +1 -1
  279. data/lib/chef/provider/mount/mount.rb +8 -3
  280. data/lib/chef/provider/mount/windows.rb +4 -1
  281. data/lib/chef/provider/package/rpm.rb +2 -2
  282. data/lib/chef/provider/package/rubygems.rb +4 -1
  283. data/lib/chef/provider/package/smartos.rb +47 -36
  284. data/lib/chef/provider/package/zypper.rb +45 -55
  285. data/lib/chef/provider/powershell_script.rb +77 -0
  286. data/lib/chef/provider/registry_key.rb +156 -0
  287. data/lib/chef/provider/remote_directory.rb +6 -5
  288. data/lib/chef/provider/remote_file.rb +13 -100
  289. data/lib/chef/provider/remote_file/cache_control_data.rb +165 -0
  290. data/lib/chef/provider/remote_file/content.rb +75 -0
  291. data/lib/chef/provider/remote_file/fetcher.rb +43 -0
  292. data/lib/chef/provider/remote_file/ftp.rb +183 -0
  293. data/lib/chef/provider/remote_file/http.rb +124 -0
  294. data/lib/chef/provider/remote_file/local_file.rb +47 -0
  295. data/lib/chef/provider/route.rb +6 -2
  296. data/lib/chef/provider/ruby_block.rb +5 -2
  297. data/lib/chef/provider/script.rb +14 -2
  298. data/lib/chef/provider/service.rb +15 -0
  299. data/lib/chef/provider/service/init.rb +9 -7
  300. data/lib/chef/provider/service/macosx.rb +29 -81
  301. data/lib/chef/provider/service/simple.rb +1 -1
  302. data/lib/chef/provider/service/solaris.rb +6 -5
  303. data/lib/chef/provider/template.rb +16 -81
  304. data/lib/chef/provider/template/content.rb +61 -0
  305. data/lib/chef/provider/template_finder.rb +61 -0
  306. data/lib/chef/provider/user.rb +0 -1
  307. data/lib/chef/provider/user/dscl.rb +175 -568
  308. data/lib/chef/provider/user/useradd.rb +50 -54
  309. data/lib/chef/provider/windows_script.rb +73 -0
  310. data/lib/chef/providers.rb +18 -1
  311. data/lib/chef/recipe.rb +14 -8
  312. data/lib/chef/resource.rb +52 -146
  313. data/lib/chef/resource/{whyrun_safe_ruby_block.rb → batch.rb} +10 -10
  314. data/lib/chef/resource/conditional.rb +4 -0
  315. data/lib/chef/resource/conditional_action_not_nothing.rb +48 -0
  316. data/lib/chef/resource/file.rb +31 -3
  317. data/lib/chef/resource/group.rb +1 -11
  318. data/lib/chef/resource/http_request.rb +2 -1
  319. data/lib/chef/resource/link.rb +17 -0
  320. data/lib/chef/resource/lwrp_base.rb +132 -0
  321. data/lib/chef/resource/mount.rb +39 -13
  322. data/lib/chef/resource/powershell_script.rb +31 -0
  323. data/lib/chef/resource/registry_key.rb +86 -0
  324. data/lib/chef/resource/remote_directory.rb +6 -5
  325. data/lib/chef/resource/remote_file.rb +62 -25
  326. data/lib/chef/resource/route.rb +1 -1
  327. data/lib/chef/resource/ruby_block.rb +2 -2
  328. data/lib/chef/resource/service.rb +14 -0
  329. data/lib/chef/resource/template.rb +145 -0
  330. data/lib/chef/resource/user.rb +0 -18
  331. data/lib/chef/resource/windows_script.rb +62 -0
  332. data/lib/chef/resource_collection.rb +69 -31
  333. data/lib/chef/resource_reporter.rb +81 -52
  334. data/lib/chef/resources.rb +4 -1
  335. data/lib/chef/rest.rb +55 -127
  336. data/lib/chef/rest/auth_credentials.rb +4 -20
  337. data/lib/chef/rest/rest_request.rb +7 -8
  338. data/lib/chef/role.rb +1 -97
  339. data/lib/chef/run_context.rb +108 -130
  340. data/lib/chef/run_context/cookbook_compiler.rb +280 -0
  341. data/lib/chef/run_list.rb +0 -2
  342. data/lib/chef/run_list/run_list_expansion.rb +1 -16
  343. data/lib/chef/run_lock.rb +96 -0
  344. data/lib/chef/runner.rb +28 -6
  345. data/lib/chef/sandbox.rb +15 -148
  346. data/lib/chef/scan_access_control.rb +8 -5
  347. data/lib/chef/search/query.rb +2 -2
  348. data/lib/chef/shef/ext.rb +3 -575
  349. data/lib/chef/{shef.rb → shell.rb} +35 -40
  350. data/lib/chef/shell/ext.rb +593 -0
  351. data/lib/chef/{shef → shell}/model_wrapper.rb +3 -3
  352. data/lib/chef/{shef/shef_rest.rb → shell/shell_rest.rb} +4 -4
  353. data/lib/chef/{shef/shef_session.rb → shell/shell_session.rb} +15 -13
  354. data/lib/chef/shell_out.rb +7 -0
  355. data/lib/chef/user.rb +182 -0
  356. data/lib/chef/util/backup.rb +84 -0
  357. data/lib/chef/util/diff.rb +145 -0
  358. data/lib/chef/util/file_edit.rb +1 -1
  359. data/lib/chef/util/selinux.rb +100 -0
  360. data/lib/chef/util/windows/net_group.rb +1 -5
  361. data/lib/chef/util/windows/net_user.rb +14 -1
  362. data/lib/chef/util/windows/volume.rb +2 -2
  363. data/lib/chef/version.rb +1 -1
  364. data/lib/chef/version/platform.rb +42 -0
  365. data/lib/chef/version_class.rb +1 -1
  366. data/lib/chef/version_constraint.rb +6 -5
  367. data/lib/chef/{index_queue.rb → version_constraint/platform.rb} +11 -14
  368. data/lib/chef/win32/api/file.rb +8 -2
  369. data/lib/chef/win32/api/security.rb +45 -1
  370. data/lib/chef/win32/registry.rb +382 -0
  371. data/lib/chef/win32/security.rb +19 -0
  372. data/lib/chef/win32/version.rb +25 -8
  373. data/spec/data/apt/chef-integration-test-1.0/debian/changelog +5 -0
  374. data/spec/data/apt/chef-integration-test-1.0/debian/compat +1 -0
  375. data/spec/data/apt/chef-integration-test-1.0/debian/control +13 -0
  376. data/spec/data/apt/chef-integration-test-1.0/debian/copyright +34 -0
  377. data/spec/data/apt/chef-integration-test-1.0/debian/files +1 -0
  378. data/spec/data/apt/chef-integration-test-1.0/debian/rules +13 -0
  379. data/spec/data/apt/chef-integration-test-1.0/debian/source/format +1 -0
  380. data/spec/data/apt/chef-integration-test-1.1/debian/changelog +11 -0
  381. data/spec/data/apt/chef-integration-test-1.1/debian/compat +1 -0
  382. data/spec/data/apt/chef-integration-test-1.1/debian/control +13 -0
  383. data/spec/data/apt/chef-integration-test-1.1/debian/copyright +34 -0
  384. data/spec/data/apt/chef-integration-test-1.1/debian/files +1 -0
  385. data/spec/data/apt/chef-integration-test-1.1/debian/rules +13 -0
  386. data/spec/data/apt/chef-integration-test-1.1/debian/source/format +1 -0
  387. data/spec/data/apt/chef-integration-test_1.0-1_amd64.changes +22 -0
  388. data/spec/data/apt/chef-integration-test_1.0-1_amd64.deb +0 -0
  389. data/spec/data/apt/chef-integration-test_1.0.orig.tar.gz +0 -0
  390. data/spec/data/apt/chef-integration-test_1.1-1_amd64.changes +22 -0
  391. data/spec/data/apt/chef-integration-test_1.1-1_amd64.deb +0 -0
  392. data/spec/data/apt/chef-integration-test_1.1.orig.tar.gz +0 -0
  393. data/spec/data/apt/var/www/apt/conf/distributions +7 -0
  394. data/spec/data/apt/var/www/apt/conf/incoming +4 -0
  395. data/spec/data/apt/var/www/apt/conf/pulls +3 -0
  396. data/spec/data/apt/var/www/apt/db/checksums.db +0 -0
  397. data/spec/data/apt/var/www/apt/db/contents.cache.db +0 -0
  398. data/spec/data/apt/var/www/apt/db/packages.db +0 -0
  399. data/spec/data/apt/var/www/apt/db/references.db +0 -0
  400. data/spec/data/apt/var/www/apt/db/release.caches.db +0 -0
  401. data/spec/data/apt/var/www/apt/db/version +4 -0
  402. data/spec/data/apt/var/www/apt/dists/sid/Release +19 -0
  403. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages +16 -0
  404. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages.gz +0 -0
  405. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Release +5 -0
  406. data/spec/data/apt/var/www/apt/dists/sid/main/binary-i386/Packages +0 -0
  407. data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.0-1_amd64.deb +0 -0
  408. data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.1-1_amd64.deb +0 -0
  409. data/spec/data/bootstrap/encrypted_data_bag_secret +1 -0
  410. data/spec/data/bootstrap/secret.erb +9 -0
  411. data/spec/data/cookbooks/ignorken/recipes/default.rb +1 -0
  412. data/spec/data/cookbooks/ignorken/recipes/ignoreme.rb +2 -0
  413. data/spec/data/cookbooks/openldap/attributes/default.rb +10 -9
  414. data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
  415. data/spec/data/cookbooks/openldap/templates/default/all_windows_line_endings.erb +4 -0
  416. data/spec/data/cookbooks/openldap/templates/default/helper_test.erb +1 -0
  417. data/spec/data/cookbooks/openldap/templates/default/helpers_via_partial_test.erb +1 -0
  418. data/spec/data/cookbooks/openldap/templates/default/no_windows_line_endings.erb +4 -0
  419. data/spec/data/cookbooks/openldap/templates/default/some_windows_line_endings.erb +4 -0
  420. data/spec/data/cookbooks/preseed/files/default/preseed-file.seed +1 -0
  421. data/spec/data/cookbooks/preseed/templates/default/preseed-template.seed +1 -0
  422. data/spec/data/file-providers-method-snapshot-chef-11-4.json +127 -0
  423. data/spec/data/git_bundles/example-repo.gitbundle +0 -0
  424. data/spec/data/knife_subcommand/test_yourself.rb +8 -0
  425. data/spec/data/lwrp/providers/inline_compiler.rb +26 -0
  426. data/spec/data/nodes/default.rb +3 -3
  427. data/spec/data/nodes/test.example.com.rb +3 -3
  428. data/spec/data/nodes/test.rb +3 -3
  429. data/spec/data/null_config.rb +1 -0
  430. data/spec/data/partial_one.erb +1 -0
  431. data/spec/data/remote_file/nyan_cat.png.gz +0 -0
  432. data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +4 -0
  433. data/spec/data/run_context/cookbooks/circular-dep1/definitions/circular_dep1_res.rb +1 -0
  434. data/spec/data/run_context/cookbooks/circular-dep1/libraries/lib.rb +2 -0
  435. data/spec/data/run_context/cookbooks/circular-dep1/metadata.rb +2 -0
  436. data/spec/data/run_context/cookbooks/circular-dep1/providers/provider.rb +1 -0
  437. data/spec/data/run_context/cookbooks/circular-dep1/recipes/default.rb +0 -0
  438. data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +1 -0
  439. data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +3 -0
  440. data/spec/data/run_context/cookbooks/circular-dep2/definitions/circular_dep2_res.rb +1 -0
  441. data/spec/data/run_context/cookbooks/circular-dep2/libraries/lib.rb +2 -0
  442. data/spec/data/run_context/cookbooks/circular-dep2/metadata.rb +2 -0
  443. data/spec/data/run_context/cookbooks/circular-dep2/providers/provider.rb +1 -0
  444. data/spec/data/run_context/cookbooks/circular-dep2/recipes/default.rb +0 -0
  445. data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +1 -0
  446. data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -0
  447. data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -0
  448. data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +3 -0
  449. data/spec/data/run_context/cookbooks/dependency1/definitions/dependency1_res.rb +1 -0
  450. data/spec/data/run_context/cookbooks/dependency1/libraries/lib.rb +2 -0
  451. data/spec/data/run_context/cookbooks/dependency1/providers/provider.rb +1 -0
  452. data/spec/data/run_context/cookbooks/dependency1/recipes/default.rb +0 -0
  453. data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +1 -0
  454. data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +3 -0
  455. data/spec/data/run_context/cookbooks/dependency2/definitions/dependency2_res.rb +1 -0
  456. data/spec/data/run_context/cookbooks/dependency2/libraries/lib.rb +2 -0
  457. data/spec/data/run_context/cookbooks/dependency2/providers/provider.rb +1 -0
  458. data/spec/data/run_context/cookbooks/dependency2/recipes/default.rb +0 -0
  459. data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +1 -0
  460. data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +3 -0
  461. data/spec/data/run_context/cookbooks/no-default-attr/definitions/no_default-attr_res.rb +1 -0
  462. data/spec/data/run_context/cookbooks/no-default-attr/providers/provider.rb +1 -0
  463. data/spec/data/run_context/cookbooks/no-default-attr/recipes/default.rb +0 -0
  464. data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +1 -0
  465. data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +3 -0
  466. data/spec/data/run_context/cookbooks/test-with-circular-deps/definitions/test_with-circular-deps_res.rb +1 -0
  467. data/spec/data/run_context/cookbooks/test-with-circular-deps/libraries/lib.rb +2 -0
  468. data/spec/data/run_context/cookbooks/test-with-circular-deps/metadata.rb +2 -0
  469. data/spec/data/run_context/cookbooks/test-with-circular-deps/providers/provider.rb +1 -0
  470. data/spec/data/run_context/cookbooks/test-with-circular-deps/recipes/default.rb +0 -0
  471. data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +1 -0
  472. data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +3 -0
  473. data/spec/data/run_context/cookbooks/test-with-deps/definitions/test_with-deps_res.rb +1 -0
  474. data/spec/data/run_context/cookbooks/test-with-deps/libraries/lib.rb +1 -0
  475. data/spec/data/run_context/cookbooks/test-with-deps/metadata.rb +3 -0
  476. data/spec/data/run_context/cookbooks/test-with-deps/providers/provider.rb +1 -0
  477. data/spec/data/run_context/cookbooks/test-with-deps/recipes/default.rb +0 -0
  478. data/spec/data/run_context/cookbooks/test-with-deps/recipes/server.rb +0 -0
  479. data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +1 -0
  480. data/spec/data/run_context/cookbooks/test/attributes/default.rb +0 -0
  481. data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -1
  482. data/spec/data/run_context/cookbooks/test/definitions/test_res.rb +1 -0
  483. data/spec/data/run_context/cookbooks/test/providers/provider.rb +1 -0
  484. data/spec/data/run_context/cookbooks/test/resources/resource.rb +1 -0
  485. data/spec/data/shef-config.rb +10 -0
  486. data/spec/functional/dsl/registry_helper_spec.rb +63 -0
  487. data/spec/functional/file_content_management/deploy_strategies_spec.rb +238 -0
  488. data/spec/functional/knife/cookbook_delete_spec.rb +1 -1
  489. data/spec/functional/knife/exec_spec.rb +3 -3
  490. data/spec/functional/knife/smoke_test.rb +34 -0
  491. data/spec/functional/knife/ssh_spec.rb +5 -1
  492. data/spec/functional/provider/remote_file/cache_control_data_spec.rb +101 -0
  493. data/spec/functional/resource/batch_spec.rb +64 -0
  494. data/spec/functional/resource/cookbook_file_spec.rb +15 -9
  495. data/spec/functional/resource/deploy_revision_spec.rb +180 -0
  496. data/spec/functional/resource/directory_spec.rb +5 -1
  497. data/spec/functional/resource/file_spec.rb +71 -21
  498. data/spec/functional/resource/git_spec.rb +259 -0
  499. data/spec/functional/resource/link_spec.rb +424 -388
  500. data/spec/functional/resource/package_spec.rb +297 -0
  501. data/spec/functional/resource/powershell_spec.rb +188 -0
  502. data/spec/functional/resource/registry_spec.rb +576 -0
  503. data/spec/functional/resource/remote_directory_spec.rb +143 -37
  504. data/spec/functional/resource/remote_file_spec.rb +99 -13
  505. data/spec/functional/resource/template_spec.rb +180 -3
  506. data/spec/functional/resource/user_spec.rb +547 -0
  507. data/spec/functional/run_lock_spec.rb +243 -0
  508. data/spec/functional/shell_spec.rb +102 -0
  509. data/spec/functional/win32/registry_helper_spec.rb +632 -0
  510. data/spec/functional/win32/security_spec.rb +37 -0
  511. data/spec/functional/win32/service_manager_spec.rb +269 -0
  512. data/spec/functional/win32/versions_spec.rb +78 -0
  513. data/spec/integration/knife/chef_repo_path_spec.rb +805 -0
  514. data/spec/integration/knife/chef_repository_file_system_spec.rb +276 -0
  515. data/spec/integration/knife/chefignore_spec.rb +271 -0
  516. data/spec/integration/knife/delete_spec.rb +944 -0
  517. data/spec/integration/knife/deps_spec.rb +648 -0
  518. data/spec/integration/knife/diff_spec.rb +536 -0
  519. data/spec/integration/knife/download_spec.rb +962 -0
  520. data/spec/integration/knife/list_spec.rb +633 -0
  521. data/spec/integration/knife/raw_spec.rb +166 -0
  522. data/spec/integration/knife/redirection_spec.rb +57 -0
  523. data/spec/integration/knife/show_spec.rb +158 -0
  524. data/spec/integration/knife/upload_spec.rb +1060 -0
  525. data/spec/integration/solo/solo_spec.rb +41 -0
  526. data/spec/spec_helper.rb +49 -13
  527. data/spec/stress/win32/security_spec.rb +1 -1
  528. data/spec/support/chef_helpers.rb +33 -3
  529. data/spec/support/lib/chef/resource/cat.rb +3 -5
  530. data/spec/support/lib/chef/resource/one_two_three_four.rb +8 -10
  531. data/spec/support/lib/chef/resource/zen_master.rb +8 -10
  532. data/spec/support/platform_helpers.rb +46 -13
  533. data/spec/support/platforms/win32/spec_service.rb +59 -0
  534. data/spec/support/shared/functional/diff_disabled.rb +10 -0
  535. data/spec/support/shared/functional/directory_resource.rb +129 -38
  536. data/spec/support/shared/functional/file_resource.rb +837 -71
  537. data/spec/support/shared/functional/securable_resource.rb +189 -58
  538. data/spec/support/shared/functional/securable_resource_with_reporting.rb +385 -0
  539. data/spec/support/shared/integration/integration_helper.rb +166 -0
  540. data/spec/support/shared/integration/knife_support.rb +171 -0
  541. data/spec/support/shared/unit/execute_resource.rb +125 -0
  542. data/spec/support/shared/unit/file_system_support.rb +70 -0
  543. data/spec/support/shared/unit/platform_introspector.rb +162 -0
  544. data/spec/support/shared/unit/provider/file.rb +609 -0
  545. data/spec/support/shared/unit/provider/useradd_based_user_provider.rb +407 -0
  546. data/spec/support/shared/unit/script_resource.rb +52 -0
  547. data/spec/support/shared/unit/windows_script_resource.rb +48 -0
  548. data/spec/tiny_server.rb +13 -11
  549. data/spec/unit/api_client/registration_spec.rb +172 -0
  550. data/spec/unit/api_client_spec.rb +78 -156
  551. data/spec/unit/application/apply.rb +84 -0
  552. data/spec/unit/application/client_spec.rb +16 -14
  553. data/spec/unit/application/knife_spec.rb +17 -0
  554. data/spec/unit/application/solo_spec.rb +1 -1
  555. data/spec/unit/application_spec.rb +113 -3
  556. data/spec/unit/checksum/storage/filesystem_spec.rb +1 -1
  557. data/spec/unit/chef_fs/diff_spec.rb +328 -0
  558. data/spec/unit/chef_fs/file_pattern_spec.rb +526 -0
  559. data/spec/unit/chef_fs/file_system_spec.rb +135 -0
  560. data/spec/unit/client_spec.rb +195 -23
  561. data/spec/unit/config_spec.rb +102 -51
  562. data/spec/unit/cookbook/syntax_check_spec.rb +75 -111
  563. data/spec/unit/cookbook_loader_spec.rb +154 -91
  564. data/spec/unit/cookbook_manifest_spec.rb +81 -81
  565. data/spec/unit/cookbook_spec.rb +3 -20
  566. data/spec/unit/cookbook_version_spec.rb +23 -122
  567. data/spec/unit/daemon_spec.rb +24 -19
  568. data/spec/unit/data_bag_spec.rb +13 -4
  569. data/spec/unit/deprecation_spec.rb +86 -0
  570. data/spec/unit/digester_spec.rb +50 -0
  571. data/spec/unit/dsl/data_query_spec.rb +66 -0
  572. data/spec/unit/dsl/platform_introspection_spec.rb +130 -0
  573. data/spec/unit/dsl/regsitry_helper_spec.rb +55 -0
  574. data/spec/unit/encrypted_data_bag_item_spec.rb +197 -157
  575. data/spec/unit/environment_spec.rb +94 -126
  576. data/spec/unit/exceptions_spec.rb +8 -4
  577. data/spec/unit/file_access_control_spec.rb +21 -1
  578. data/spec/unit/file_content_management/deploy/cp_spec.rb +46 -0
  579. data/spec/unit/file_content_management/deploy/mv_unix_spec.rb +103 -0
  580. data/spec/unit/file_content_management/deploy/mv_windows_spec.rb +179 -0
  581. data/spec/unit/formatters/error_inspectors/cookbook_resolve_error_inspector_spec.rb +38 -2
  582. data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +6 -5
  583. data/spec/unit/json_compat_spec.rb +8 -0
  584. data/spec/unit/knife/bootstrap_spec.rb +130 -29
  585. data/spec/unit/knife/configure_spec.rb +64 -45
  586. data/spec/unit/knife/cookbook_download_spec.rb +24 -3
  587. data/spec/unit/knife/cookbook_metadata_spec.rb +11 -4
  588. data/spec/unit/knife/cookbook_test_spec.rb +1 -0
  589. data/spec/unit/knife/cookbook_upload_spec.rb +39 -0
  590. data/spec/unit/knife/core/bootstrap_context_spec.rb +79 -62
  591. data/spec/unit/knife/core/subcommand_loader_spec.rb +20 -0
  592. data/spec/unit/knife/core/ui_spec.rb +196 -124
  593. data/spec/unit/knife/data_bag_create_spec.rb +9 -0
  594. data/spec/unit/knife/data_bag_edit_spec.rb +1 -4
  595. data/spec/unit/knife/data_bag_from_file_spec.rb +4 -6
  596. data/spec/unit/knife/data_bag_show_spec.rb +11 -4
  597. data/spec/unit/knife/index_rebuild_spec.rb +96 -33
  598. data/spec/unit/knife/knife_help.rb +7 -7
  599. data/spec/unit/knife/node_edit_spec.rb +6 -33
  600. data/spec/unit/knife/node_run_list_remove_spec.rb +2 -1
  601. data/spec/unit/knife/node_run_list_set_spec.rb +140 -0
  602. data/spec/unit/knife/ssh_spec.rb +12 -15
  603. data/spec/unit/knife/status_spec.rb +2 -2
  604. data/spec/unit/knife/user_create_spec.rb +86 -0
  605. data/spec/unit/knife/user_delete_spec.rb +39 -0
  606. data/spec/unit/knife/user_edit_spec.rb +42 -0
  607. data/spec/unit/knife/user_list_spec.rb +32 -0
  608. data/spec/unit/knife/user_reregister_spec.rb +53 -0
  609. data/spec/unit/knife/user_show_spec.rb +41 -0
  610. data/spec/unit/knife_spec.rb +74 -0
  611. data/spec/unit/lwrp_spec.rb +102 -60
  612. data/spec/unit/mixin/checksum_spec.rb +2 -2
  613. data/spec/unit/mixin/deep_merge_spec.rb +130 -791
  614. data/spec/unit/mixin/deprecation_spec.rb +23 -0
  615. data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +7 -1
  616. data/spec/unit/mixin/params_validate_spec.rb +4 -2
  617. data/spec/unit/mixin/securable_spec.rb +5 -3
  618. data/spec/unit/mixin/template_spec.rb +145 -14
  619. data/spec/unit/mixin/windows_architecture_helper_spec.rb +83 -0
  620. data/spec/unit/node/attribute_spec.rb +273 -173
  621. data/spec/unit/node/immutable_collections_spec.rb +139 -0
  622. data/spec/unit/node_spec.rb +418 -370
  623. data/spec/unit/platform_spec.rb +21 -8
  624. data/spec/unit/provider/breakpoint_spec.rb +8 -8
  625. data/spec/unit/provider/cookbook_file/content_spec.rb +40 -0
  626. data/spec/unit/provider/cookbook_file_spec.rb +26 -187
  627. data/spec/unit/provider/cron/solaris_spec.rb +1 -1
  628. data/spec/unit/provider/deploy/revision_spec.rb +19 -11
  629. data/spec/unit/provider/deploy_spec.rb +2 -2
  630. data/spec/unit/provider/directory_spec.rb +99 -67
  631. data/spec/unit/provider/env_spec.rb +2 -2
  632. data/spec/unit/provider/execute_spec.rb +27 -1
  633. data/spec/unit/provider/file/content_spec.rb +101 -0
  634. data/spec/unit/provider/file_spec.rb +25 -475
  635. data/spec/unit/provider/git_spec.rb +224 -28
  636. data/spec/unit/provider/group/dscl_spec.rb +0 -36
  637. data/spec/unit/provider/group/gpasswd_spec.rb +9 -16
  638. data/spec/unit/provider/group/groupadd_spec.rb +4 -3
  639. data/spec/unit/provider/group/groupmod_spec.rb +1 -0
  640. data/spec/unit/provider/group/pw_spec.rb +15 -12
  641. data/spec/unit/provider/group/usermod_spec.rb +9 -22
  642. data/spec/unit/provider/group/windows_spec.rb +8 -0
  643. data/spec/unit/provider/group_spec.rb +6 -28
  644. data/spec/unit/provider/http_request_spec.rb +28 -69
  645. data/spec/unit/provider/ifconfig/debian_spec.rb +89 -0
  646. data/spec/unit/provider/ifconfig/redhat_spec.rb +71 -0
  647. data/spec/unit/provider/ifconfig_spec.rb +0 -33
  648. data/spec/unit/provider/mount/mount_spec.rb +33 -2
  649. data/spec/unit/provider/mount/windows_spec.rb +4 -1
  650. data/spec/unit/provider/mount_spec.rb +16 -6
  651. data/spec/unit/provider/ohai_spec.rb +4 -4
  652. data/spec/unit/provider/package/apt_spec.rb +0 -1
  653. data/spec/unit/provider/package/ips_spec.rb +0 -1
  654. data/spec/unit/provider/package/rpm_spec.rb +0 -12
  655. data/spec/unit/provider/package/rubygems_spec.rb +1 -1
  656. data/spec/unit/provider/package/smartos_spec.rb +3 -2
  657. data/spec/unit/provider/package/zypper_spec.rb +84 -22
  658. data/spec/unit/provider/package_spec.rb +7 -9
  659. data/spec/unit/provider/powershell_spec.rb +38 -0
  660. data/spec/unit/provider/registry_key_spec.rb +269 -0
  661. data/spec/unit/provider/remote_directory_spec.rb +7 -7
  662. data/spec/unit/provider/remote_file/cache_control_data_spec.rb +211 -0
  663. data/spec/unit/provider/remote_file/content_spec.rb +230 -0
  664. data/spec/unit/provider/remote_file/fetcher_spec.rb +75 -0
  665. data/spec/unit/provider/remote_file/ftp_spec.rb +224 -0
  666. data/spec/unit/provider/remote_file/http_spec.rb +319 -0
  667. data/spec/unit/provider/remote_file/local_file_spec.rb +60 -0
  668. data/spec/unit/provider/remote_file_spec.rb +33 -259
  669. data/spec/unit/provider/route_spec.rb +29 -12
  670. data/spec/unit/provider/ruby_block_spec.rb +8 -0
  671. data/spec/unit/provider/service/arch_service_spec.rb +5 -5
  672. data/spec/unit/provider/service/debian_service_spec.rb +1 -1
  673. data/spec/unit/provider/service/freebsd_service_spec.rb +5 -5
  674. data/spec/unit/provider/service/init_service_spec.rb +27 -4
  675. data/spec/unit/provider/service/insserv_service_spec.rb +1 -1
  676. data/spec/unit/provider/service/invokercd_service_spec.rb +4 -4
  677. data/spec/unit/provider/service/macosx_spec.rb +176 -207
  678. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  679. data/spec/unit/provider/service/simple_service_spec.rb +3 -3
  680. data/spec/unit/provider/service/solaris_smf_service_spec.rb +21 -18
  681. data/spec/unit/provider/service/systemd_service_spec.rb +2 -2
  682. data/spec/unit/provider/service/upstart_service_spec.rb +11 -11
  683. data/spec/unit/provider/service_spec.rb +3 -3
  684. data/spec/unit/provider/subversion_spec.rb +1 -1
  685. data/spec/unit/provider/template/content_spec.rb +78 -0
  686. data/spec/unit/provider/template_spec.rb +52 -160
  687. data/spec/unit/provider/user/dscl_spec.rb +285 -681
  688. data/spec/unit/provider/user/solaris_spec.rb +39 -373
  689. data/spec/unit/provider/user/useradd_spec.rb +12 -379
  690. data/spec/unit/provider/user_spec.rb +1 -1
  691. data/spec/unit/recipe_spec.rb +10 -8
  692. data/spec/unit/registry_helper_spec.rb +376 -0
  693. data/spec/unit/resource/batch_spec.rb +48 -0
  694. data/spec/unit/resource/conditional_action_not_nothing_spec.rb +45 -0
  695. data/spec/unit/resource/execute_spec.rb +3 -101
  696. data/spec/unit/resource/file_spec.rb +0 -5
  697. data/spec/unit/resource/group_spec.rb +9 -0
  698. data/spec/unit/resource/ifconfig_spec.rb +60 -1
  699. data/spec/unit/resource/link_spec.rb +1 -0
  700. data/spec/unit/resource/mount_spec.rb +37 -11
  701. data/spec/unit/resource/powershell_spec.rb +48 -0
  702. data/spec/unit/resource/registry_key_spec.rb +171 -0
  703. data/spec/unit/resource/remote_file_spec.rb +63 -25
  704. data/spec/unit/resource/route_spec.rb +1 -1
  705. data/spec/unit/resource/ruby_block_spec.rb +7 -3
  706. data/spec/unit/resource/script_spec.rb +13 -36
  707. data/spec/unit/resource/service_spec.rb +11 -0
  708. data/spec/unit/resource/template_spec.rb +111 -8
  709. data/spec/unit/resource/user_spec.rb +7 -0
  710. data/spec/unit/resource_collection_spec.rb +61 -32
  711. data/spec/unit/resource_reporter_spec.rb +115 -102
  712. data/spec/unit/resource_spec.rb +197 -5
  713. data/spec/unit/rest/auth_credentials_spec.rb +4 -21
  714. data/spec/unit/rest_spec.rb +134 -284
  715. data/spec/unit/run_context/cookbook_compiler_spec.rb +190 -0
  716. data/spec/unit/run_context_spec.rb +18 -4
  717. data/spec/unit/run_list_spec.rb +0 -209
  718. data/spec/unit/run_lock_spec.rb +37 -0
  719. data/spec/unit/runner_spec.rb +102 -3
  720. data/spec/unit/scan_access_control_spec.rb +8 -6
  721. data/spec/unit/{shef → shell}/model_wrapper_spec.rb +5 -5
  722. data/spec/unit/{shef/shef_ext_spec.rb → shell/shell_ext_spec.rb} +21 -21
  723. data/spec/unit/{shef/shef_session_spec.rb → shell/shell_session_spec.rb} +16 -58
  724. data/spec/unit/shell_out_spec.rb +18 -0
  725. data/spec/unit/{shef_spec.rb → shell_spec.rb} +20 -20
  726. data/spec/unit/user_spec.rb +255 -0
  727. data/spec/unit/util/backup_spec.rb +149 -0
  728. data/spec/unit/util/diff_spec.rb +596 -0
  729. data/spec/unit/util/selinux_spec.rb +172 -0
  730. data/spec/unit/version/platform_spec.rb +61 -0
  731. data/spec/unit/version_constraint/platform_spec.rb +46 -0
  732. data/spec/unit/version_constraint_spec.rb +5 -0
  733. metadata +493 -264
  734. data/README.rdoc +0 -177
  735. data/distro/common/html/knife-recipe.1.html +0 -92
  736. data/lib/chef/certificate.rb +0 -161
  737. data/lib/chef/checksum.rb +0 -167
  738. data/lib/chef/checksum_cache.rb +0 -190
  739. data/lib/chef/cookbook_version_selector.rb +0 -168
  740. data/lib/chef/couchdb.rb +0 -246
  741. data/lib/chef/index_queue/amqp_client.rb +0 -116
  742. data/lib/chef/index_queue/consumer.rb +0 -76
  743. data/lib/chef/index_queue/indexable.rb +0 -109
  744. data/lib/chef/knife/bootstrap/ubuntu12.10-gems.erb +0 -60
  745. data/lib/chef/monkey_patches/dir.rb +0 -36
  746. data/lib/chef/monkey_patches/moneta.rb +0 -50
  747. data/lib/chef/monkey_patches/uri.rb +0 -70
  748. data/lib/chef/openid_registration.rb +0 -187
  749. data/lib/chef/solr_query.rb +0 -187
  750. data/lib/chef/solr_query/lucene.treetop +0 -150
  751. data/lib/chef/solr_query/lucene_nodes.rb +0 -285
  752. data/lib/chef/solr_query/query_transform.rb +0 -65
  753. data/lib/chef/solr_query/solr_http_request.rb +0 -132
  754. data/lib/chef/webui_user.rb +0 -231
  755. data/spec/data/mac_users/10.7-8.plist.xml +0 -559
  756. data/spec/data/mac_users/10.7-8.shadow.xml +0 -11
  757. data/spec/data/mac_users/10.7.plist.xml +0 -559
  758. data/spec/data/mac_users/10.7.shadow.xml +0 -11
  759. data/spec/data/mac_users/10.8.plist.xml +0 -559
  760. data/spec/data/mac_users/10.8.shadow.xml +0 -21
  761. data/spec/data/mac_users/10.9.plist.xml +0 -560
  762. data/spec/data/mac_users/10.9.shadow.xml +0 -21
  763. data/spec/functional/resource/base.rb +0 -40
  764. data/spec/functional/resource/group_spec.rb +0 -343
  765. data/spec/functional/resource/user/dscl_spec.rb +0 -199
  766. data/spec/unit/certificate_spec.rb +0 -76
  767. data/spec/unit/checksum_cache_spec.rb +0 -209
  768. data/spec/unit/checksum_spec.rb +0 -94
  769. data/spec/unit/couchdb_spec.rb +0 -274
  770. data/spec/unit/index_queue_spec.rb +0 -391
  771. data/spec/unit/mixin/language_spec.rb +0 -305
  772. data/spec/unit/openid_registration_spec.rb +0 -153
  773. data/spec/unit/provider/whyrun_safe_ruby_block_spec.rb +0 -47
  774. data/spec/unit/solr_query/query_transform_spec.rb +0 -454
  775. data/spec/unit/solr_query/solr_http_request_spec.rb +0 -244
  776. data/spec/unit/solr_query_spec.rb +0 -203
  777. data/spec/unit/webui_user_spec.rb +0 -238
@@ -19,6 +19,29 @@
19
19
  require 'spec_helper'
20
20
  require 'chef/mixin/deprecation'
21
21
 
22
+ describe Chef::Mixin do
23
+ describe "deprecating constants (Class/Module)" do
24
+ before do
25
+ Chef::Mixin.deprecate_constant(:DeprecatedClass, Chef::Node, "This is a test deprecation")
26
+ @log_io = StringIO.new
27
+ Chef::Log.init(@log_io)
28
+ end
29
+
30
+ it "has a list of deprecated constants" do
31
+ Chef::Mixin.deprecated_constants.should have_key(:DeprecatedClass)
32
+ end
33
+
34
+ it "returns the replacement when accessing the deprecated constant" do
35
+ Chef::Mixin::DeprecatedClass.should == Chef::Node
36
+ end
37
+
38
+ it "warns when accessing the deprecated constant" do
39
+ Chef::Mixin::DeprecatedClass
40
+ @log_io.string.should include("This is a test deprecation")
41
+ end
42
+ end
43
+ end
44
+
22
45
  describe Chef::Mixin::Deprecation::DeprecatedInstanceVariable do
23
46
  before do
24
47
  Chef::Log.logger = Logger.new(StringIO.new)
@@ -27,13 +27,18 @@ describe Chef::Mixin::EnforceOwnershipAndPermissions do
27
27
  @node.name "make_believe"
28
28
  @events = Chef::EventDispatch::Dispatcher.new
29
29
  @run_context = Chef::RunContext.new(@node, {}, @events)
30
- @resource = Chef::Resource::File.new("#{Dir.mktmpdir}/madeup.txt")
30
+ @tmpdir = Dir.mktmpdir
31
+ @resource = Chef::Resource::File.new("#{@tmpdir}/madeup.txt")
31
32
  FileUtils.touch @resource.path
32
33
  @resource.owner "adam"
33
34
  @provider = Chef::Provider::File.new(@resource, @run_context)
34
35
  @provider.current_resource = @resource
35
36
  end
36
37
 
38
+ after(:each) do
39
+ FileUtils.rm_rf(@tmpdir)
40
+ end
41
+
37
42
  it "should call set_all on the file access control object" do
38
43
  Chef::FileAccessControl.any_instance.should_receive(:set_all)
39
44
  @provider.enforce_ownership_and_permissions
@@ -43,6 +48,7 @@ describe Chef::Mixin::EnforceOwnershipAndPermissions do
43
48
  before do
44
49
  Chef::FileAccessControl.any_instance.stub(:uid_from_resource).and_return(0)
45
50
  Chef::FileAccessControl.any_instance.stub(:requires_changes?).and_return(false)
51
+ Chef::FileAccessControl.any_instance.stub(:define_resource_requirements)
46
52
 
47
53
  passwd_struct = if windows?
48
54
  Struct::Passwd.new("root", "x", 0, 0, "/root", "/bin/bash")
@@ -330,10 +330,12 @@ describe Chef::Mixin::ParamsValidate do
330
330
 
331
331
  it "asserts that a value returns false from a predicate method" do
332
332
  lambda do
333
- @vo.validate({:not_blank => "should pass"}, {:not_blank => {:cannot_be => :blank}})
333
+ @vo.validate({:not_blank => "should pass"},
334
+ {:not_blank => {:cannot_be => :nil, :cannot_be => :empty}})
334
335
  end.should_not raise_error
335
336
  lambda do
336
- @vo.validate({:not_blank => ""}, {:not_blank => {:cannot_be => :blank}})
337
+ @vo.validate({:not_blank => ""},
338
+ {:not_blank => {:cannot_be => :nil, :cannot_be => :empty}})
337
339
  end.should raise_error(Chef::Exceptions::ValidationFailed)
338
340
  end
339
341
 
@@ -112,9 +112,11 @@ describe Chef::Mixin::Securable do
112
112
  @original_config = Chef::Config.hash_dup
113
113
  load File.join(File.dirname(__FILE__), "..", "..", "..", "lib", "chef", "config.rb")
114
114
  load File.join(File.dirname(__FILE__), "..", "..", "..", "lib", "chef", "mixin", "securable.rb")
115
- @securable = Object.new
116
- @securable.send(:extend, Chef::Mixin::Securable)
117
- @securable.send(:extend, Chef::Mixin::ParamsValidate)
115
+ SECURABLE_CLASS = Class.new do
116
+ include Chef::Mixin::Securable
117
+ include Chef::Mixin::ParamsValidate
118
+ end
119
+ @securable = SECURABLE_CLASS.new
118
120
  end
119
121
  end
120
122
 
@@ -18,36 +18,167 @@
18
18
 
19
19
  require 'spec_helper'
20
20
 
21
- class TinyTemplateClass; include Chef::Mixin::Template; end
22
21
  require 'cgi'
23
22
  describe Chef::Mixin::Template, "render_template" do
24
23
 
24
+ let(:sep) { Chef::Platform.windows? ? "\r\n" : "\n" }
25
+
25
26
  before :each do
26
- @template = TinyTemplateClass.new
27
+ @context = Chef::Mixin::Template::TemplateContext.new({})
27
28
  end
28
29
 
29
30
  it "should render the template evaluated in the given context" do
30
- @template.render_template("<%= @foo %>", { :foo => "bar" }) do |tmp|
31
- tmp.open.read.should == "bar"
32
- end
31
+ @context[:foo] = "bar"
32
+ output = @context.render_template_from_string("<%= @foo %>")
33
+ output.should == "bar"
33
34
  end
34
35
 
35
36
  it "should provide a node method to access @node" do
36
- @template.render_template("<%= node %>",{:node => "tehShizzle"}) do |tmp|
37
- tmp.open.read.should == "tehShizzle"
38
- end
37
+ @context[:node] = "tehShizzle"
38
+ output = @context.render_template_from_string("<%= @node %>")
39
+ output.should == "tehShizzle"
39
40
  end
40
41
 
41
- it "should yield the tempfile it renders the template to" do
42
- @template.render_template("abcdef", {}) do |tempfile|
43
- tempfile.should be_kind_of(Tempfile)
42
+ describe "with a template resource" do
43
+ before :each do
44
+ @cookbook_repo = File.expand_path(File.join(CHEF_SPEC_DATA, "cookbooks"))
45
+ Chef::Cookbook::FileVendor.on_create { |manifest| Chef::Cookbook::FileSystemFileVendor.new(manifest, @cookbook_repo) }
46
+
47
+ @node = Chef::Node.new
48
+ cl = Chef::CookbookLoader.new(@cookbook_repo)
49
+ cl.load_cookbooks
50
+ @cookbook_collection = Chef::CookbookCollection.new(cl)
51
+ @events = Chef::EventDispatch::Dispatcher.new
52
+ @run_context = Chef::RunContext.new(@node, @cookbook_collection, @events)
53
+
54
+ @rendered_file_location = Dir.tmpdir + '/openldap_stuff.conf'
55
+
56
+ @resource = Chef::Resource::Template.new(@rendered_file_location)
57
+ @resource.cookbook_name = 'openldap'
58
+ @current_resource = @resource.dup
59
+
60
+ @content_provider = Chef::Provider::Template::Content.new(@resource, @current_resource, @run_context)
61
+
62
+ @template_context = Chef::Mixin::Template::TemplateContext.new({})
63
+ @template_context[:node] = @node
64
+ @template_context[:template_finder] = Chef::Provider::TemplateFinder.new(@run_context, @resource.cookbook_name, @node)
65
+ end
66
+
67
+ it "should provide a render method" do
68
+ output = @template_context.render_template_from_string("before {<%= render('test.erb').strip -%>} after")
69
+ output.should == "before {We could be diving for pearls!} after"
70
+ end
71
+
72
+ it "should render local files" do
73
+ begin
74
+ tf = Tempfile.new("partial")
75
+ tf.write "test"
76
+ tf.rewind
77
+
78
+ output = @template_context.render_template_from_string("before {<%= render '#{tf.path}', :local => true %>} after")
79
+ output.should == "before {test} after"
80
+ ensure
81
+ tf.close
82
+ end
83
+ end
84
+
85
+ it "should render partials from a different cookbook" do
86
+ @template_context[:template_finder] = Chef::Provider::TemplateFinder.new(@run_context, 'apache2', @node)
87
+
88
+ output = @template_context.render_template_from_string("before {<%= render('test.erb', :cookbook => 'openldap').strip %>} after")
89
+ output.should == "before {We could be diving for pearls!} after"
90
+ end
91
+
92
+ it "should render using the source argument if provided" do
93
+ begin
94
+ tf = Tempfile.new("partial")
95
+ tf.write "test"
96
+ tf.rewind
97
+
98
+ output = @template_context.render_template_from_string("before {<%= render 'something', :local => true, :source => '#{tf.path}' %>} after")
99
+ output.should == "before {test} after"
100
+ ensure
101
+ tf.close
102
+ end
103
+ end
104
+
105
+ it "should pass the node to partials" do
106
+ @node.normal[:slappiness] = "happiness"
107
+
108
+ output = @template_context.render_template_from_string("before {<%= render 'openldap_stuff.conf.erb' %>} after")
109
+ output.should == "before {slappiness is happiness} after"
44
110
  end
111
+
112
+ it "should pass the original variables to partials" do
113
+ @template_context[:secret] = 'candy'
114
+
115
+ output = @template_context.render_template_from_string("before {<%= render 'openldap_variable_stuff.conf.erb' %>} after")
116
+ output == "before {super secret is candy} after"
117
+ end
118
+
119
+ it "should pass variables to partials" do
120
+ output = @template_context.render_template_from_string("before {<%= render 'openldap_variable_stuff.conf.erb', :variables => {:secret => 'whatever' } %>} after")
121
+ output.should == "before {super secret is whatever} after"
122
+ end
123
+
124
+ it "should pass variables to partials even if they are named the same" do
125
+ @template_context[:secret] = 'one'
126
+
127
+ output = @template_context.render_template_from_string("before {<%= render 'openldap_variable_stuff.conf.erb', :variables => {:secret => 'two' } %>} after <%= @secret %>")
128
+ output.should == "before {super secret is two} after one"
129
+ end
130
+
131
+ it "should pass nil for missing variables in partials" do
132
+ output = @template_context.render_template_from_string("before {<%= render 'openldap_variable_stuff.conf.erb', :variables => {} %>} after")
133
+ output.should == "before {super secret is } after"
134
+
135
+ output = @template_context.render_template_from_string("before {<%= render 'openldap_variable_stuff.conf.erb' %>} after")
136
+ output.should == "before {super secret is } after"
137
+ end
138
+
139
+ it "should render nested partials" do
140
+ path = File.expand_path(File.join(CHEF_SPEC_DATA, "partial_one.erb"))
141
+
142
+ output = @template_context.render_template_from_string("before {<%= render('#{path}', :local => true).strip %>} after")
143
+ output.should == "before {partial one We could be diving for pearls! calling home} after"
144
+ end
145
+
146
+ describe "when customizing the template context" do
147
+
148
+ it "extends the context to include modules" do
149
+ mod = Module.new do
150
+ def hello
151
+ "ohai"
152
+ end
153
+ end
154
+ @template_context._extend_modules([mod])
155
+ output = @template_context.render_template_from_string("<%=hello%>")
156
+ output.should == "ohai"
157
+ end
158
+
159
+ it "emits a warning when overriding 'core' methods" do
160
+ mod = Module.new do
161
+ def render
162
+ end
163
+ def node
164
+ end
165
+ def render_template
166
+ end
167
+ def render_template_from_string
168
+ end
169
+ end
170
+ ['node', 'render', 'render_template', 'render_template_from_string'].each do |method_name|
171
+ Chef::Log.should_receive(:warn).with(/^Core template method `#{method_name}' overridden by extension module/)
172
+ end
173
+ @template_context._extend_modules([mod])
174
+ end
175
+ end
176
+
45
177
  end
46
178
 
47
179
  describe "when an exception is raised in the template" do
48
180
  def do_raise
49
- @context = {:chef => "cool"}
50
- @template.render_template("foo\nbar\nbaz\n<%= this_is_not_defined %>\nquin\nqunx\ndunno", @context) {|r| r}
181
+ @context.render_template_from_string("foo\nbar\nbaz\n<%= this_is_not_defined %>\nquin\nqunx\ndunno")
51
182
  end
52
183
 
53
184
  it "should catch and re-raise the exception as a TemplateError" do
@@ -55,7 +186,7 @@ describe Chef::Mixin::Template, "render_template" do
55
186
  end
56
187
 
57
188
  it "should raise an error if an attempt is made to access node but it is nil" do
58
- lambda {@template.render_template("<%= node %>",{}) {|r| r}}.should raise_error(Chef::Mixin::Template::TemplateError)
189
+ lambda {@context.render_template_from_string("<%= node %>") {|r| r}}.should raise_error(Chef::Mixin::Template::TemplateError)
59
190
  end
60
191
 
61
192
  describe "the raised TemplateError" do
@@ -0,0 +1,83 @@
1
+ #
2
+ # Author:: Adam Edwards (<adamed@opscode.com>)
3
+ # Copyright:: Copyright (c) 2013 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+
20
+ require 'spec_helper'
21
+ require 'chef/mixin/windows_architecture_helper'
22
+
23
+
24
+
25
+ describe Chef::Mixin::WindowsArchitectureHelper do
26
+ include Chef::Mixin::WindowsArchitectureHelper
27
+
28
+ before do
29
+ @valid_architectures = [ :i386, :x86_64 ]
30
+ @invalid_architectures = [ "i386", "x86_64", :x64, :x86, :arm ]
31
+
32
+ @node_i386 = Chef::Node.new
33
+ @node_x86_64 = Chef::Node.new
34
+ end
35
+
36
+ it "returns true when valid architectures are passed to valid_windows_architecture?" do
37
+ @valid_architectures.each do | architecture |
38
+ valid_windows_architecture?(architecture).should == true
39
+ end
40
+ end
41
+
42
+ it "returns false when invalid architectures are passed to valid_windows_architecture?" do
43
+ @invalid_architectures.each do | architecture |
44
+ valid_windows_architecture?(architecture).should == false
45
+ end
46
+ end
47
+
48
+ it "does not raise an exception when a valid architecture is passed to assert_valid_windows_architecture!" do
49
+ @valid_architectures.each do | architecture |
50
+ assert_valid_windows_architecture!(architecture)
51
+ end
52
+ end
53
+
54
+ it "raises an error if an invalid architecture is passed to assert_valid_windows_architecture!" do
55
+ @invalid_architectures.each do | architecture |
56
+ begin
57
+ assert_valid_windows_architecture!(architecture).should raise_error Chef::Exceptions::Win32ArchitectureIncorrect
58
+ rescue Chef::Exceptions::Win32ArchitectureIncorrect
59
+ end
60
+ end
61
+ end
62
+
63
+ it "returns true for each supported desired architecture for all nodes with each valid architecture passed to node_supports_windows_architecture" do
64
+ enumerate_architecture_node_combinations(true)
65
+ end
66
+
67
+ it "returns false for each unsupported desired architecture for all nodes with each valid architecture passed to node_supports_windows_architecture?" do
68
+ enumerate_architecture_node_combinations(true)
69
+ end
70
+
71
+ def enumerate_architecture_node_combinations(only_valid_combinations)
72
+ @valid_architectures.each do | node_architecture |
73
+ new_node = Chef::Node.new
74
+ new_node.default["kernel"] = Hash.new
75
+ new_node.default["kernel"][:machine] = node_architecture.to_s
76
+
77
+ @valid_architectures.each do | supported_architecture |
78
+ node_supports_windows_architecture?(new_node, supported_architecture).should == true if only_valid_combinations && (supported_architecture != :x86_64 && node_architecture != :i386 )
79
+ node_supports_windows_architecture?(new_node, supported_architecture).should == false if ! only_valid_combinations && (supported_architecture == :x86_64 && node_architecture == :i386 )
80
+ end
81
+ end
82
+ end
83
+ end
@@ -7,9 +7,9 @@
7
7
  # Licensed under the Apache License, Version 2.0 (the "License");
8
8
  # you may not use this file except in compliance with the License.
9
9
  # You may obtain a copy of the License at
10
- #
10
+ #
11
11
  # http://www.apache.org/licenses/LICENSE-2.0
12
- #
12
+ #
13
13
  # Unless required by applicable law or agreed to in writing, software
14
14
  # distributed under the License is distributed on an "AS IS" BASIS,
15
15
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -20,9 +20,9 @@
20
20
  require 'spec_helper'
21
21
  require 'chef/node/attribute'
22
22
 
23
- describe Chef::Node::Attribute do
23
+ describe Chef::Node::Attribute do
24
24
  before(:each) do
25
- @attribute_hash =
25
+ @attribute_hash =
26
26
  {"dmi"=>{},
27
27
  "command"=>{"ps"=>"ps -ef"},
28
28
  "platform_version"=>"10.5.7",
@@ -193,7 +193,7 @@ describe Chef::Node::Attribute do
193
193
  @default_hash = {
194
194
  "domain" => "opscode.com",
195
195
  "hot" => { "day" => "saturday" },
196
- "music" => {
196
+ "music" => {
197
197
  "jimmy_eat_world" => "is fun!",
198
198
  "mastodon" => "rocks",
199
199
  "mars_volta" => "is loud and nutty",
@@ -225,30 +225,171 @@ describe Chef::Node::Attribute do
225
225
  [ :normal, :default, :override, :automatic ].each do |accessor|
226
226
  it "should set #{accessor}" do
227
227
  na = Chef::Node::Attribute.new({ :normal => true }, { :default => true }, { :override => true }, { :automatic => true })
228
- na.send(accessor).should == { accessor => true }
228
+ na.send(accessor).should == { accessor.to_s => true }
229
229
  end
230
230
  end
231
231
 
232
- it "should allow you to set the initial state" do
233
- attrs = {"first" => {"second" => {"third" => {"jackpot" => "jackpot!"}}}}
234
- na = Chef::Node::Attribute.new(attrs, {}, {}, {}, [ "first", "second", "third" ])
235
- na.should have_key("jackpot")
236
- end
237
-
238
232
  it "should be enumerable" do
239
233
  @attributes.should be_is_a(Enumerable)
240
234
  end
241
235
  end
242
236
 
243
- describe "hash_and_not_cna" do
244
- it "should return false if we pass it a Chef::Node::Attribute" do
245
- @attributes.hash_and_not_cna?(@attributes).should == false
237
+ describe "when printing attribute components" do
238
+
239
+ it "does not cause a type error" do
240
+ # See CHEF-3799; IO#puts implicitly calls #to_ary on its argument. This
241
+ # is expected to raise a NoMethodError or return an Array. `to_ary` is
242
+ # the "strict" conversion method that should only be implemented by
243
+ # things that are truly Array-like, so NoMethodError is the right choice.
244
+ # (cf. there is no Hash#to_ary).
245
+ lambda { @attributes.default.to_ary }.should raise_error(NoMethodError)
246
+ end
247
+
248
+ end
249
+
250
+ describe "when debugging attributes" do
251
+ before do
252
+ @attributes.default[:foo][:bar] = "default"
253
+ @attributes.env_default[:foo][:bar] = "env_default"
254
+ @attributes.role_default[:foo][:bar] = "role_default"
255
+ @attributes.force_default[:foo][:bar] = "force_default"
256
+ @attributes.normal[:foo][:bar] = "normal"
257
+ @attributes.override[:foo][:bar] = "override"
258
+ @attributes.role_override[:foo][:bar] = "role_override"
259
+ @attributes.env_override[:foo][:bar] = "env_override"
260
+ @attributes.force_override[:foo][:bar] = "force_override"
261
+ @attributes.automatic[:foo][:bar] = "automatic"
262
+ end
263
+
264
+ it "gives the value at each level of precedence for a path spec" do
265
+ expected = [["set_unless_enabled?", false],
266
+ ["default", "default"],
267
+ ["env_default", "env_default"],
268
+ ["role_default", "role_default"],
269
+ ["force_default", "force_default"],
270
+ ["normal", "normal"],
271
+ ["override", "override"],
272
+ ["role_override", "role_override"],
273
+ ["env_override", "env_override"],
274
+ ["force_override", "force_override"],
275
+ ["automatic", "automatic"]
276
+ ]
277
+ @attributes.debug_value(:foo, :bar).should == expected
278
+ end
279
+ end
280
+
281
+ describe "when fetching values based on precedence" do
282
+ before do
283
+ @attributes.default["default"] = "cookbook default"
284
+ @attributes.override["override"] = "cookbook override"
285
+ end
286
+
287
+ it "prefers 'forced default' over any other default" do
288
+ @attributes.default!["default"] = "force default"
289
+ @attributes.role_default["default"] = "role default"
290
+ @attributes.env_default["default"] = "environment default"
291
+ @attributes["default"].should == "force default"
292
+ end
293
+
294
+ it "prefers role_default over environment or cookbook default" do
295
+ @attributes.role_default["default"] = "role default"
296
+ @attributes.env_default["default"] = "environment default"
297
+ @attributes["default"].should == "role default"
298
+ end
299
+
300
+ it "prefers environment default over cookbook default" do
301
+ @attributes.env_default["default"] = "environment default"
302
+ @attributes["default"].should == "environment default"
303
+ end
304
+
305
+ it "returns the cookbook default when no other default values are present" do
306
+ @attributes["default"].should == "cookbook default"
307
+ end
308
+
309
+ it "prefers 'forced overrides' over role or cookbook overrides" do
310
+ @attributes.override!["override"] = "force override"
311
+ @attributes.env_override["override"] = "environment override"
312
+ @attributes.role_override["override"] = "role override"
313
+ @attributes["override"].should == "force override"
314
+ end
315
+
316
+ it "prefers environment overrides over role or cookbook overrides" do
317
+ @attributes.env_override["override"] = "environment override"
318
+ @attributes.role_override["override"] = "role override"
319
+ @attributes["override"].should == "environment override"
320
+ end
321
+
322
+ it "prefers role overrides over cookbook overrides" do
323
+ @attributes.role_override["override"] = "role override"
324
+ @attributes["override"].should == "role override"
325
+ end
326
+
327
+ it "returns cookbook overrides when no other overrides are present" do
328
+ @attributes["override"].should == "cookbook override"
329
+ end
330
+
331
+ it "merges arrays within the default precedence" do
332
+ @attributes.role_default["array"] = %w{role}
333
+ @attributes.env_default["array"] = %w{env}
334
+ @attributes["array"].should == %w{env role}
335
+ end
336
+
337
+ it "merges arrays within the override precedence" do
338
+ @attributes.role_override["array"] = %w{role}
339
+ @attributes.env_override["array"] = %w{env}
340
+ @attributes["array"].should == %w{role env}
341
+ end
342
+
343
+ it "does not merge arrays between default and normal" do
344
+ @attributes.role_default["array"] = %w{role}
345
+ @attributes.normal["array"] = %w{normal}
346
+ @attributes["array"].should == %w{normal}
347
+ end
348
+
349
+ it "does not merge arrays between normal and override" do
350
+ @attributes.normal["array"] = %w{normal}
351
+ @attributes.role_override["array"] = %w{role}
352
+ @attributes["array"].should == %w{role}
353
+ end
354
+
355
+ it "merges nested hashes between precedence levels" do
356
+ @attributes = Chef::Node::Attribute.new({}, {}, {}, {})
357
+ @attributes.env_default = {"a" => {"b" => {"default" => "default"}}}
358
+ @attributes.normal = {"a" => {"b" => {"normal" => "normal"}}}
359
+ @attributes.override = {"a" => {"override" => "role"}}
360
+ @attributes.automatic = {"a" => {"automatic" => "auto"}}
361
+ @attributes["a"].should == {"b"=>{"default"=>"default", "normal"=>"normal"},
362
+ "override"=>"role",
363
+ "automatic"=>"auto"}
364
+ end
365
+ end
366
+
367
+ describe "when reading combined default or override values" do
368
+ before do
369
+ @attributes.default["cd"] = "cookbook default"
370
+ @attributes.role_default["rd"] = "role default"
371
+ @attributes.env_default["ed"] = "env default"
372
+ @attributes.default!["fd"] = "force default"
373
+ @attributes.override["co"] = "cookbook override"
374
+ @attributes.role_override["ro"] = "role override"
375
+ @attributes.env_override["eo"] = "env override"
376
+ @attributes.override!["fo"] = "force override"
246
377
  end
247
378
 
248
- it "should return true if we pass it something that responds to has_key?" do
249
- hashy = mock("Hashlike", :has_key? => true)
250
- @attributes.hash_and_not_cna?(hashy).should == true
379
+ it "merges all types of overrides into a combined override" do
380
+ @attributes.combined_override["co"].should == "cookbook override"
381
+ @attributes.combined_override["ro"].should == "role override"
382
+ @attributes.combined_override["eo"].should == "env override"
383
+ @attributes.combined_override["fo"].should == "force override"
251
384
  end
385
+
386
+ it "merges all types of defaults into a combined default" do
387
+ @attributes.combined_default["cd"].should == "cookbook default"
388
+ @attributes.combined_default["rd"].should == "role default"
389
+ @attributes.combined_default["ed"].should == "env default"
390
+ @attributes.combined_default["fd"].should == "force default"
391
+ end
392
+
252
393
  end
253
394
 
254
395
  describe "[]" do
@@ -282,67 +423,31 @@ describe Chef::Node::Attribute do
282
423
 
283
424
  it "should return the merged hash if all three have values" do
284
425
  result = @attributes["music"]
285
- result["mars_volta"] = "cicatriz"
286
- result["jimmy_eat_world"] = "nice"
287
- result["mastodon"] = "rocks"
288
- end
289
- end
290
-
291
- describe "auto_vivifiy" do
292
- it "should set the hash key to a mash if it does not exist" do
293
- @attributes.auto_vivifiy({}, "one")["one"].should be_a_kind_of(Mash)
294
- end
295
-
296
- it "should raise an exception if the key does exist and does not respond to has_key?" do
297
- lambda { @attributes.auto_vivifiy({ "one" => "value" }) }.should raise_error(ArgumentError)
298
- end
299
-
300
- it "should not alter the value if the key exists and responds to has_key?" do
301
- @attributes.auto_vivifiy({ "one" => { "will" => true } }, "one")["one"].should have_key("will")
426
+ result["mars_volta"].should == "cicatriz"
427
+ result["jimmy_eat_world"].should == "nice"
428
+ result["mastodon"].should == "rocks"
302
429
  end
303
430
  end
304
431
 
305
- describe "set_value" do
306
- it "should set the value for a top level key" do
307
- to_check = {}
308
- @attributes.set_value(to_check, "one", "some value")
309
- to_check["one"].should == "some value"
310
- end
311
-
312
- it "should set the value for a second level key" do
313
- to_check = {}
314
- @attributes[ "one" ]
315
- @attributes.set_value(to_check, "two", "some value")
316
- to_check["one"]["two"].should == "some value"
317
- end
318
-
319
- it "should set the value for a very deep key" do
320
- to_check = {}
321
- attributes = Chef::Node::Attribute.new({}, {}, {}, {}, %w{one two three four five})
322
- attributes.set_value(to_check, "six", "some value")
323
- to_check["one"]["two"]["three"]["four"]["five"]["six"].should == "some value"
432
+ describe "[]=" do
433
+ it "should error out when the type of attribute to set has not been specified" do
434
+ @attributes.normal["the_ghost"] = { }
435
+ lambda { @attributes["the_ghost"]["exterminate"] = false }.should raise_error(Chef::Exceptions::ImmutableAttributeModification)
324
436
  end
325
- end
326
437
 
327
- describe "[]=" do
328
438
  it "should let you set an attribute value when another hash has an intermediate value" do
329
439
  @attributes.normal["the_ghost"] = { "exterminate" => "the future" }
330
- @attributes.set_type = :default
331
- @attributes.auto_vivifiy_on_read = true
332
- lambda { @attributes["the_ghost"]["exterminate"]["tomorrow"] = false }.should_not raise_error(NoMethodError)
440
+ lambda { @attributes.normal["the_ghost"]["exterminate"]["tomorrow"] = false }.should_not raise_error(NoMethodError)
333
441
  end
334
442
 
335
443
  it "should set the attribute value" do
336
- @attributes["longboard"] = "surfing"
337
- @attributes["longboard"].should == "surfing"
338
- @attributes.attribute["longboard"].should == "surfing"
444
+ @attributes.normal["longboard"] = "surfing"
445
+ @attributes.normal["longboard"].should == "surfing"
446
+ @attributes.normal["longboard"].should == "surfing"
339
447
  end
340
448
 
341
- it "should set deeply nested attribute value when auto_vivifiy_on_read is true" do
342
- @attributes.set_type = :normal
343
- @attributes.auto_vivifiy_on_read = true
344
- @attributes["deftones"]["hunters"]["nap"] = "surfing"
345
- @attributes.reset
449
+ it "should set deeply nested attribute values when a precedence level is specified" do
450
+ @attributes.normal["deftones"]["hunters"]["nap"] = "surfing"
346
451
  @attributes.normal["deftones"]["hunters"]["nap"].should == "surfing"
347
452
  end
348
453
 
@@ -351,45 +456,23 @@ describe Chef::Node::Attribute do
351
456
  end
352
457
 
353
458
  it "should let you set attributes manually without vivification" do
354
- @attributes["foo"] = Mash.new
355
- @attributes["foo"]["bar"] = :baz
356
- @attributes["foo"]["bar"].should == :baz
459
+ @attributes.normal["foo"] = Mash.new
460
+ @attributes.normal["foo"]["bar"] = :baz
461
+ @attributes.normal["foo"]["bar"].should == :baz
357
462
  end
358
463
 
359
464
  it "should optionally skip setting the value if one already exists" do
360
465
  @attributes.set_unless_value_present = true
361
- @attributes["hostname"] = "bar"
466
+ @attributes.normal["hostname"] = "bar"
362
467
  @attributes["hostname"].should == "latte"
363
468
  end
364
469
 
365
- it "should write to an attribute that has been read before properly" do
366
- @attributes["foo"] = Mash.new
367
- @attributes["foo"]["bar"] ||= "stop the world"
368
- @attributes["foo"]["bar"].should == "stop the world"
369
- end
370
- end
371
-
372
- describe "get_value" do
373
- it "should get a value from a top level key" do
374
- @attributes.get_value(@default_hash, "domain").should == "opscode.com"
375
- end
376
-
377
- it "should return nil for a top level key that does not exist" do
378
- @attributes.get_value(@default_hash, "domainz").should == nil
379
- end
380
-
381
- it "should get a value based on the state of the object" do
382
- @attributes.auto_vivifiy_on_read = true
383
- @attributes.set_type = :normal
384
- @attributes[:foo][:bar][:baz] = "snack"
385
- @attributes.get_value(@attribute_hash, :baz).should == "snack"
386
- end
387
-
388
- it "should return nil based on the state of the object if the key does not exist" do
389
- @attributes.auto_vivifiy_on_read = true
390
- @attributes.set_type = :normal
391
- @attributes[:foo][:bar][:baz] = "snack"
392
- @attributes.get_value(@attribute_hash, :baznatch).should == nil
470
+ it "does not support ||= when setting" do
471
+ # This is a limitation of auto-vivification.
472
+ # Users who need this behavior can use set_unless and friends
473
+ @attributes.normal["foo"] = Mash.new
474
+ @attributes.normal["foo"]["bar"] ||= "stop the world"
475
+ @attributes.normal["foo"]["bar"].should == {}
393
476
  end
394
477
  end
395
478
 
@@ -403,21 +486,6 @@ describe Chef::Node::Attribute do
403
486
  hash.class.should == Hash
404
487
  hash["day"].should == "sunday"
405
488
  end
406
-
407
- # Regression test for CHEF-4631
408
- context "when merging array values" do
409
- before do
410
- @default_attrs = {"foo" => {"bar" => ["default"]}}
411
- @override_attrs = {"foo" => {"bar" => ["override"]}}
412
-
413
- #(normal, default, override, automatic, state=[])
414
- @attributes = Chef::Node::Attribute.new({ }, @default_attrs, @override_attrs, { })
415
- end
416
-
417
- it "should return the override" do
418
- @attributes["foo"].to_hash["bar"].should == [ "override" ]
419
- end
420
- end
421
489
  end
422
490
 
423
491
  describe "has_key?" do
@@ -438,14 +506,8 @@ describe Chef::Node::Attribute do
438
506
  end
439
507
 
440
508
  it "should return true if an attribute exists but is set to false" do
441
- @attributes["music"]
442
- @attributes.has_key?("apophis").should == true
443
- end
444
-
445
- it "should find keys at the current nesting level" do
446
- @attributes["music"]
447
- @attributes.has_key?("mastodon").should == true
448
- @attributes.has_key?("whitesnake").should == false
509
+ @attributes.has_key?("music")
510
+ @attributes["music"].has_key?("apophis").should == true
449
511
  end
450
512
 
451
513
  it "does not find keys above the current nesting level" do
@@ -458,7 +520,7 @@ describe Chef::Node::Attribute do
458
520
 
459
521
  [:include?, :key?, :member?].each do |method|
460
522
  it "should alias the method #{method} to itself" do
461
- @attributes.should respond_to(method)
523
+ @attributes.should respond_to(method)
462
524
  end
463
525
 
464
526
  it "#{method} should behave like has_key?" do
@@ -476,11 +538,6 @@ describe Chef::Node::Attribute do
476
538
  @attributes.attribute?("ninja").should == false
477
539
  end
478
540
 
479
- it "should be looking at the current position of the object" do
480
- @attributes["music"]
481
- @attributes.attribute?("mastodon").should == true
482
- @attributes.attribute?("whitesnake").should == false
483
- end
484
541
  end
485
542
 
486
543
  describe "method_missing" do
@@ -488,16 +545,10 @@ describe Chef::Node::Attribute do
488
545
  @attributes.music.mastodon.should == "rocks"
489
546
  end
490
547
 
491
- it "should behave like a []= lookup if the last method has an argument" do
492
- @attributes.music.mastodon(["dream", "still", "shining"])
493
- @attributes.reset
494
- @attributes.music.mastodon.should == ["dream", "still", "shining"]
495
- end
496
-
497
548
  it "should allow the last method to set a value if it has an = sign on the end" do
498
- @attributes.music.mastodon = [ "dream", "still", "shining" ]
549
+ @attributes.normal.music.mastodon = [ "dream", "still", "shining" ]
499
550
  @attributes.reset
500
- @attributes.music.mastodon.should == [ "dream", "still", "shining" ]
551
+ @attributes.normal.music.mastodon.should == [ "dream", "still", "shining" ]
501
552
  end
502
553
  end
503
554
 
@@ -531,7 +582,7 @@ describe Chef::Node::Attribute do
531
582
  collect.include?("snakes").should == true
532
583
  collect.include?("snack").should == true
533
584
  collect.include?("place").should == true
534
- collect.length.should == 5
585
+ collect.length.should == 5
535
586
  end
536
587
 
537
588
  it "should yield lower if we go deeper" do
@@ -542,7 +593,7 @@ describe Chef::Node::Attribute do
542
593
  collect.include?("two").should == true
543
594
  collect.include?("four").should == true
544
595
  collect.include?("six").should == true
545
- collect.length.should == 3
596
+ collect.length.should == 3
546
597
  end
547
598
 
548
599
  it "should not raise an exception if one of the hashes has a nil value on a deep lookup" do
@@ -616,7 +667,7 @@ describe Chef::Node::Attribute do
616
667
  @attributes.each_key do |k|
617
668
  collect << k
618
669
  end
619
-
670
+
620
671
  collect.should include("one")
621
672
  collect.should include("snack")
622
673
  collect.should include("hut")
@@ -659,7 +710,7 @@ describe Chef::Node::Attribute do
659
710
  collect["snack"].should == "cookies"
660
711
  end
661
712
  end
662
-
713
+
663
714
  describe "each_value" do
664
715
  before do
665
716
  @attributes = Chef::Node::Attribute.new(
@@ -938,8 +989,8 @@ describe Chef::Node::Attribute do
938
989
  end
939
990
  end
940
991
 
941
- it "should return an empty array for a block containing nil" do
942
- @attributes.select { nil }.should == []
992
+ it "should return an empty hash/array (ruby-version-dependent) for a block containing nil" do
993
+ @attributes.select { nil }.should == {}.select { nil }
943
994
  end
944
995
 
945
996
  # sorted for spec clarity
@@ -1013,56 +1064,105 @@ describe Chef::Node::Attribute do
1013
1064
 
1014
1065
  describe "inspect" do
1015
1066
  it "should be readable" do
1016
- @attributes.inspect.should =~ /@automatic=\{\.\.\.\}/
1017
- @attributes.inspect.should =~ /@normal=\{\.\.\.\}/
1067
+ # NOTE: previous implementation hid the values, showing @automatic={...}
1068
+ # That is nice and compact, but hides a lot of info, which seems counter
1069
+ # to the point of calling #inspect...
1070
+ @attributes.inspect.should =~ /@automatic=\{.*\}/
1071
+ @attributes.inspect.should =~ /@normal=\{.*\}/
1018
1072
  end
1019
1073
  end
1020
1074
 
1021
- describe "when a value has been set at all four precedence levels" do
1022
- before do
1023
- @default_attrs = {"foo" => {"bar" => "default_value"}}
1024
- @normal_attrs = {"foo" => {"bar" => "normal_value"}}
1025
- @override_attrs = {"foo" => {"bar" => "override_value"}}
1026
- @automatic_attrs = {"foo" => {"bar" => "automatic_value"}}
1075
+ # For expedience, this test is implementation-heavy.
1076
+ describe "when a component attribute is mutated" do
1077
+ [
1078
+ :clear,
1079
+ :shift
1080
+ ].each do |mutator|
1081
+ it "resets the cache when the mutator #{mutator} is called" do
1082
+ @attributes.should_receive(:reset_cache)
1083
+ @attributes.default.send(mutator)
1084
+ end
1085
+ end
1027
1086
 
1028
- #(normal, default, override, automatic, state=[])
1029
- @attributes = Chef::Node::Attribute.new(@normal_attrs, @default_attrs, @override_attrs, @automatic_attrs)
1087
+ it "resets the cache when the mutator delete is called" do
1088
+ @attributes.should_receive(:reset_cache)
1089
+ @attributes.default.delete(:music)
1030
1090
  end
1031
1091
 
1032
- it "deletes a key from all precedence levels" do
1033
- @attributes["foo"].delete("bar")
1034
- @attributes.reset
1035
- @attributes["foo"].should_not have_key("bar")
1036
- @default_attrs["foo"].should_not have_key("bar")
1037
- @normal_attrs["foo"].should_not have_key("bar")
1038
- @override_attrs["foo"].should_not have_key("bar")
1039
- @automatic_attrs["foo"].should_not have_key("bar")
1092
+ [
1093
+ :merge!,
1094
+ :update,
1095
+ :replace
1096
+ ].each do |mutator|
1097
+ it "resets the cache when the mutator #{mutator} is called" do
1098
+ # Implementation of Mash means that this could get called many times. That's okay.
1099
+ @attributes.should_receive(:reset_cache).at_least(1).times
1100
+ @attributes.default.send(mutator, {:foo => :bar})
1101
+ end
1040
1102
  end
1041
1103
 
1042
- it "returns the automatic (highest precedence) value when deleting a key" do
1043
- @attributes["foo"].delete("bar").should == "automatic_value"
1104
+ [
1105
+ :delete_if,
1106
+ :keep_if,
1107
+ :reject!,
1108
+ :select!,
1109
+ ].each do |mutator|
1110
+ it "resets the cache when the mutator #{mutator} is called" do
1111
+ # Implementation of Mash means that this could get called many times. That's okay.
1112
+ @attributes.should_receive(:reset_cache).at_least(1).times
1113
+ block = lambda {|k,v| true }
1114
+ @attributes.default.send(mutator, &block)
1115
+ end
1044
1116
  end
1045
1117
  end
1046
1118
 
1047
- describe "regression test for CHEF-4631" do
1048
- before(:each) do
1049
- @default_attrs = {"foo" => {"bar" => ["default"]}}
1050
- @override_attrs = {"foo" => {"bar" => ["override"]}}
1119
+ describe "when not mutated" do
1051
1120
 
1052
- #(normal, default, override, automatic, state=[])
1053
- @attributes = Chef::Node::Attribute.new({ }, @default_attrs, @override_attrs, { })
1121
+ it "does not reset the cache when dup'd [CHEF-3680]" do
1122
+ @attributes.default[:foo][:bar] = "set on original"
1123
+ subtree = @attributes[:foo]
1124
+ @attributes.default[:foo].dup[:bar] = "set on dup"
1125
+ subtree[:bar].should == "set on original"
1054
1126
  end
1055
1127
 
1056
- it "array values in the role default attributes should be concatanated to the nodes default attributes" do
1057
- @default_attrs = {"foo" => {"bar" => ["1", "2"]}}
1058
- @attributes = Chef::Node::Attribute.new({ }, @default_attrs, { }, { })
1128
+ end
1059
1129
 
1060
- expansion = mock("Expansion", :default_attrs => { "foo" => {"bar" => ["3", "2"]}}, :override_attributes => { })
1130
+ describe "when setting a component attribute to a new value" do
1131
+ it "converts the input in to a VividMash tree (default)" do
1132
+ @attributes.default = {}
1133
+ @attributes.default.foo = "bar"
1134
+ @attributes.merged_attributes[:foo].should == "bar"
1135
+ end
1061
1136
 
1137
+ it "converts the input in to a VividMash tree (normal)" do
1138
+ @attributes.normal = {}
1139
+ @attributes.normal.foo = "bar"
1140
+ @attributes.merged_attributes[:foo].should == "bar"
1062
1141
  end
1063
1142
 
1064
- it "array values in the role override attributes should override the nodes default attributes" do
1143
+ it "converts the input in to a VividMash tree (override)" do
1144
+ @attributes.override = {}
1145
+ @attributes.override.foo = "bar"
1146
+ @attributes.merged_attributes[:foo].should == "bar"
1147
+ end
1148
+
1149
+ it "converts the input in to a VividMash tree (automatic)" do
1150
+ @attributes.automatic = {}
1151
+ @attributes.automatic.foo = "bar"
1152
+ @attributes.merged_attributes[:foo].should == "bar"
1065
1153
  end
1066
1154
  end
1067
1155
 
1156
+ describe "when attemping to write without specifying precedence" do
1157
+ it "raises an error when using []=" do
1158
+ lambda { @attributes[:new_key] = "new value" }.should raise_error(Chef::Exceptions::ImmutableAttributeModification)
1159
+ end
1160
+
1161
+ it "raises an error when using `attr=value`" do
1162
+ lambda { @attributes.new_key = "new value" }.should raise_error(Chef::Exceptions::ImmutableAttributeModification)
1163
+ end
1164
+
1165
+ end
1166
+
1068
1167
  end
1168
+