chef 12.21.31-universal-mingw32 → 12.22.1-universal-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 (2065) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +151 -151
  3. data/Gemfile +95 -95
  4. data/LICENSE +201 -201
  5. data/README.md +309 -309
  6. data/Rakefile +104 -104
  7. data/VERSION +1 -1
  8. data/acceptance/.gitignore +3 -3
  9. data/acceptance/.shared/kitchen_acceptance/.kitchen.digitalocean.yml +33 -33
  10. data/acceptance/.shared/kitchen_acceptance/.kitchen.ec2.yml +283 -283
  11. data/acceptance/.shared/kitchen_acceptance/.kitchen.vagrant.yml +59 -59
  12. data/acceptance/.shared/kitchen_acceptance/libraries/kitchen.rb +68 -68
  13. data/acceptance/.shared/kitchen_acceptance/metadata.rb +1 -1
  14. data/acceptance/Gemfile +16 -16
  15. data/acceptance/Gemfile.lock +258 -258
  16. data/acceptance/README.md +137 -137
  17. data/acceptance/basics/.acceptance/acceptance-cookbook/.gitignore +2 -2
  18. data/acceptance/basics/.acceptance/acceptance-cookbook/metadata.rb +3 -3
  19. data/acceptance/basics/.acceptance/acceptance-cookbook/recipes/destroy.rb +1 -1
  20. data/acceptance/basics/.acceptance/acceptance-cookbook/recipes/provision.rb +1 -1
  21. data/acceptance/basics/.acceptance/acceptance-cookbook/recipes/verify.rb +1 -1
  22. data/acceptance/basics/.kitchen.yml +4 -4
  23. data/acceptance/basics/test/integration/chef-current-install/serverspec/chef_client_spec.rb +19 -19
  24. data/acceptance/basics/test/integration/chef-current-install/serverspec/spec_helper.rb +6 -6
  25. data/acceptance/basics/test/integration/helpers/serverspec/Gemfile +8 -8
  26. data/acceptance/data-collector/.acceptance/acceptance-cookbook/.gitignore +2 -2
  27. data/acceptance/data-collector/.acceptance/acceptance-cookbook/metadata.rb +3 -3
  28. data/acceptance/data-collector/.acceptance/acceptance-cookbook/recipes/destroy.rb +2 -2
  29. data/acceptance/data-collector/.acceptance/acceptance-cookbook/recipes/provision.rb +2 -2
  30. data/acceptance/data-collector/.acceptance/acceptance-cookbook/recipes/verify.rb +2 -2
  31. data/acceptance/data-collector/.acceptance/data-collector-test/.gitignore +16 -16
  32. data/acceptance/data-collector/.acceptance/data-collector-test/Berksfile +3 -3
  33. data/acceptance/data-collector/.acceptance/data-collector-test/files/default/api.rb +85 -85
  34. data/acceptance/data-collector/.acceptance/data-collector-test/files/default/apigemfile +3 -3
  35. data/acceptance/data-collector/.acceptance/data-collector-test/files/default/client-rb-both-mode.rb +4 -4
  36. data/acceptance/data-collector/.acceptance/data-collector-test/files/default/client-rb-client-mode.rb +4 -4
  37. data/acceptance/data-collector/.acceptance/data-collector-test/files/default/client-rb-no-endpoint.rb +2 -2
  38. data/acceptance/data-collector/.acceptance/data-collector-test/files/default/client-rb-solo-mode.rb +4 -4
  39. data/acceptance/data-collector/.acceptance/data-collector-test/files/default/config.ru +2 -2
  40. data/acceptance/data-collector/.acceptance/data-collector-test/metadata.rb +7 -7
  41. data/acceptance/data-collector/.acceptance/data-collector-test/recipes/default.rb +38 -38
  42. data/acceptance/data-collector/.kitchen.yml +9 -9
  43. data/acceptance/data-collector/Berksfile +3 -3
  44. data/acceptance/data-collector/test/integration/default/serverspec/default_spec.rb +204 -204
  45. data/acceptance/data-collector/test/integration/helpers/serverspec/Gemfile +8 -8
  46. data/acceptance/fips/.acceptance/acceptance-cookbook/.gitignore +2 -2
  47. data/acceptance/fips/.acceptance/acceptance-cookbook/metadata.rb +2 -2
  48. data/acceptance/fips/.acceptance/acceptance-cookbook/recipes/destroy.rb +1 -1
  49. data/acceptance/fips/.acceptance/acceptance-cookbook/recipes/provision.rb +1 -1
  50. data/acceptance/fips/.acceptance/acceptance-cookbook/recipes/verify.rb +1 -1
  51. data/acceptance/fips/.kitchen.yml +8 -8
  52. data/acceptance/fips/test/integration/fips-integration/serverspec/Gemfile +9 -9
  53. data/acceptance/fips/test/integration/fips-integration/serverspec/fips-integration_spec.rb +52 -52
  54. data/acceptance/fips/test/integration/fips-unit-functional/serverspec/Gemfile +7 -7
  55. data/acceptance/fips/test/integration/fips-unit-functional/serverspec/fips-unit-functional_spec.rb +56 -56
  56. data/acceptance/omnitruck/.acceptance/acceptance-cookbook/.gitignore +2 -2
  57. data/acceptance/omnitruck/.acceptance/acceptance-cookbook/metadata.rb +1 -1
  58. data/acceptance/omnitruck/.acceptance/acceptance-cookbook/recipes/destroy.rb +1 -1
  59. data/acceptance/omnitruck/.acceptance/acceptance-cookbook/recipes/provision.rb +1 -1
  60. data/acceptance/omnitruck/.acceptance/acceptance-cookbook/recipes/verify.rb +61 -61
  61. data/acceptance/top-cookbooks/.acceptance/acceptance-cookbook/.gitignore +2 -2
  62. data/acceptance/top-cookbooks/.acceptance/acceptance-cookbook/libraries/cookbook_kitchen.rb +43 -43
  63. data/acceptance/top-cookbooks/.acceptance/acceptance-cookbook/libraries/top_cookbooks.rb +39 -39
  64. data/acceptance/top-cookbooks/.acceptance/acceptance-cookbook/metadata.rb +3 -3
  65. data/acceptance/top-cookbooks/.acceptance/acceptance-cookbook/recipes/destroy.rb +1 -1
  66. data/acceptance/top-cookbooks/.acceptance/acceptance-cookbook/recipes/provision.rb +1 -1
  67. data/acceptance/top-cookbooks/.acceptance/acceptance-cookbook/recipes/verify.rb +1 -1
  68. data/acceptance/top-cookbooks/.gitignore +1 -1
  69. data/acceptance/top-cookbooks/.kitchen.chocolatey.yml +6 -6
  70. data/acceptance/top-cookbooks/.kitchen.iis.yml +4 -4
  71. data/acceptance/top-cookbooks/.kitchen.learn-the-basics-rhel.yml +7 -7
  72. data/acceptance/top-cookbooks/.kitchen.learn-the-basics-ubuntu.yml +7 -7
  73. data/acceptance/top-cookbooks/.kitchen.learn-the-basics-windows.yml +7 -7
  74. data/acceptance/top-cookbooks/.kitchen.powershell.yml +4 -4
  75. data/acceptance/top-cookbooks/.kitchen.sql_server.yml +5 -5
  76. data/acceptance/top-cookbooks/.kitchen.winbox.yml +8 -8
  77. data/acceptance/top-cookbooks/.kitchen.windows.yml +38 -38
  78. data/acceptance/trivial/.acceptance/acceptance-cookbook/.gitignore +2 -2
  79. data/acceptance/trivial/.acceptance/acceptance-cookbook/metadata.rb +2 -2
  80. data/acceptance/trivial/.acceptance/acceptance-cookbook/recipes/destroy.rb +1 -1
  81. data/acceptance/trivial/.acceptance/acceptance-cookbook/recipes/provision.rb +1 -1
  82. data/acceptance/trivial/.acceptance/acceptance-cookbook/recipes/verify.rb +1 -1
  83. data/acceptance/trivial/.kitchen.yml +7 -7
  84. data/acceptance/trivial/test/integration/chef-current-install/inspec/chef_client_spec.rb +5 -5
  85. data/acceptance/windows-service/.acceptance/acceptance-cookbook/.gitignore +2 -2
  86. data/acceptance/windows-service/.acceptance/acceptance-cookbook/metadata.rb +2 -2
  87. data/acceptance/windows-service/.acceptance/acceptance-cookbook/recipes/destroy.rb +1 -1
  88. data/acceptance/windows-service/.acceptance/acceptance-cookbook/recipes/provision.rb +1 -1
  89. data/acceptance/windows-service/.acceptance/acceptance-cookbook/recipes/verify.rb +1 -1
  90. data/acceptance/windows-service/.kitchen.yml +7 -7
  91. data/acceptance/windows-service/test/integration/chef-windows-service/inspec/chef_windows_service_spec.rb +58 -58
  92. data/bin/chef-apply +25 -25
  93. data/bin/chef-client +26 -26
  94. data/bin/chef-service-manager +38 -38
  95. data/bin/chef-shell +34 -34
  96. data/bin/chef-solo +25 -25
  97. data/bin/chef-windows-service +35 -35
  98. data/bin/knife +25 -25
  99. data/chef-universal-mingw32.gemspec +23 -23
  100. data/chef.gemspec +61 -61
  101. data/distro/common/html/_sources/ctl_chef_client.txt +35 -35
  102. data/distro/common/html/_sources/ctl_chef_server.txt +341 -341
  103. data/distro/common/html/_sources/ctl_chef_shell.txt +15 -15
  104. data/distro/common/html/_sources/ctl_chef_solo.txt +25 -25
  105. data/distro/common/html/_sources/index.txt +135 -135
  106. data/distro/common/html/_sources/knife.txt +74 -74
  107. data/distro/common/html/_sources/knife_bootstrap.txt +56 -56
  108. data/distro/common/html/_sources/knife_client.txt +150 -150
  109. data/distro/common/html/_sources/knife_common_options.txt +6 -6
  110. data/distro/common/html/_sources/knife_configure.txt +29 -29
  111. data/distro/common/html/_sources/knife_cookbook.txt +236 -236
  112. data/distro/common/html/_sources/knife_cookbook_site.txt +157 -157
  113. data/distro/common/html/_sources/knife_data_bag.txt +159 -159
  114. data/distro/common/html/_sources/knife_delete.txt +26 -26
  115. data/distro/common/html/_sources/knife_deps.txt +61 -61
  116. data/distro/common/html/_sources/knife_diff.txt +34 -34
  117. data/distro/common/html/_sources/knife_download.txt +44 -44
  118. data/distro/common/html/_sources/knife_edit.txt +26 -26
  119. data/distro/common/html/_sources/knife_environment.txt +158 -158
  120. data/distro/common/html/_sources/knife_exec.txt +47 -47
  121. data/distro/common/html/_sources/knife_index_rebuild.txt +20 -20
  122. data/distro/common/html/_sources/knife_list.txt +33 -33
  123. data/distro/common/html/_sources/knife_node.txt +250 -250
  124. data/distro/common/html/_sources/knife_raw.txt +35 -35
  125. data/distro/common/html/_sources/knife_recipe_list.txt +23 -23
  126. data/distro/common/html/_sources/knife_role.txt +157 -157
  127. data/distro/common/html/_sources/knife_search.txt +53 -53
  128. data/distro/common/html/_sources/knife_serve.txt +18 -18
  129. data/distro/common/html/_sources/knife_show.txt +26 -26
  130. data/distro/common/html/_sources/knife_ssh.txt +43 -43
  131. data/distro/common/html/_sources/knife_ssl_check.txt +41 -41
  132. data/distro/common/html/_sources/knife_ssl_fetch.txt +41 -41
  133. data/distro/common/html/_sources/knife_status.txt +37 -37
  134. data/distro/common/html/_sources/knife_tag.txt +69 -69
  135. data/distro/common/html/_sources/knife_upload.txt +49 -49
  136. data/distro/common/html/_sources/knife_user.txt +127 -127
  137. data/distro/common/html/_sources/knife_using.txt +43 -43
  138. data/distro/common/html/_sources/knife_xargs.txt +30 -30
  139. data/distro/common/html/_static/basic.css +536 -536
  140. data/distro/common/html/_static/doctools.js +238 -238
  141. data/distro/common/html/_static/guide.css +504 -504
  142. data/distro/common/html/_static/pygments.css +61 -61
  143. data/distro/common/html/_static/searchtools.js +621 -621
  144. data/distro/common/html/_static/underscore.js +31 -31
  145. data/distro/common/html/_static/websupport.js +808 -808
  146. data/distro/common/html/ctl_chef_client.html +269 -269
  147. data/distro/common/html/ctl_chef_server.html +727 -727
  148. data/distro/common/html/ctl_chef_shell.html +162 -162
  149. data/distro/common/html/ctl_chef_solo.html +193 -193
  150. data/distro/common/html/index.html +201 -201
  151. data/distro/common/html/knife.html +169 -169
  152. data/distro/common/html/knife_bootstrap.html +284 -284
  153. data/distro/common/html/knife_client.html +284 -284
  154. data/distro/common/html/knife_common_options.html +95 -95
  155. data/distro/common/html/knife_configure.html +104 -104
  156. data/distro/common/html/knife_cookbook.html +486 -486
  157. data/distro/common/html/knife_cookbook_site.html +375 -375
  158. data/distro/common/html/knife_data_bag.html +373 -373
  159. data/distro/common/html/knife_delete.html +92 -92
  160. data/distro/common/html/knife_deps.html +142 -142
  161. data/distro/common/html/knife_diff.html +122 -122
  162. data/distro/common/html/knife_download.html +144 -144
  163. data/distro/common/html/knife_edit.html +88 -88
  164. data/distro/common/html/knife_environment.html +322 -322
  165. data/distro/common/html/knife_exec.html +219 -219
  166. data/distro/common/html/knife_index_rebuild.html +82 -82
  167. data/distro/common/html/knife_list.html +113 -113
  168. data/distro/common/html/knife_node.html +457 -457
  169. data/distro/common/html/knife_raw.html +109 -109
  170. data/distro/common/html/knife_recipe_list.html +90 -90
  171. data/distro/common/html/knife_role.html +294 -294
  172. data/distro/common/html/knife_search.html +202 -202
  173. data/distro/common/html/knife_serve.html +78 -78
  174. data/distro/common/html/knife_show.html +103 -103
  175. data/distro/common/html/knife_ssh.html +176 -176
  176. data/distro/common/html/knife_ssl_check.html +150 -150
  177. data/distro/common/html/knife_ssl_fetch.html +150 -150
  178. data/distro/common/html/knife_status.html +143 -143
  179. data/distro/common/html/knife_tag.html +137 -137
  180. data/distro/common/html/knife_upload.html +152 -152
  181. data/distro/common/html/knife_user.html +241 -241
  182. data/distro/common/html/knife_using.html +209 -209
  183. data/distro/common/html/knife_xargs.html +121 -121
  184. data/distro/common/html/search.html +81 -81
  185. data/distro/common/man/man1/README.md +58 -58
  186. data/distro/common/man/man1/chef-shell.1 +194 -194
  187. data/distro/common/man/man1/knife-bootstrap.1 +215 -215
  188. data/distro/common/man/man1/knife-client.1 +443 -443
  189. data/distro/common/man/man1/knife-configure.1 +161 -161
  190. data/distro/common/man/man1/knife-cookbook-site.1 +552 -552
  191. data/distro/common/man/man1/knife-cookbook.1 +770 -770
  192. data/distro/common/man/man1/knife-data-bag.1 +617 -617
  193. data/distro/common/man/man1/knife-delete.1 +127 -127
  194. data/distro/common/man/man1/knife-deps.1 +246 -246
  195. data/distro/common/man/man1/knife-diff.1 +226 -226
  196. data/distro/common/man/man1/knife-download.1 +258 -258
  197. data/distro/common/man/man1/knife-edit.1 +121 -121
  198. data/distro/common/man/man1/knife-environment.1 +496 -496
  199. data/distro/common/man/man1/knife-exec.1 +362 -362
  200. data/distro/common/man/man1/knife-index-rebuild.1 +63 -63
  201. data/distro/common/man/man1/knife-list.1 +174 -174
  202. data/distro/common/man/man1/knife-node.1 +716 -716
  203. data/distro/common/man/man1/knife-raw.1 +172 -172
  204. data/distro/common/man/man1/knife-recipe-list.1 +85 -85
  205. data/distro/common/man/man1/knife-role.1 +426 -426
  206. data/distro/common/man/man1/knife-search.1 +359 -359
  207. data/distro/common/man/man1/knife-serve.1 +109 -109
  208. data/distro/common/man/man1/knife-show.1 +160 -160
  209. data/distro/common/man/man1/knife-ssh.1 +284 -284
  210. data/distro/common/man/man1/knife-ssl-check.1 +207 -207
  211. data/distro/common/man/man1/knife-ssl-fetch.1 +207 -207
  212. data/distro/common/man/man1/knife-status.1 +234 -234
  213. data/distro/common/man/man1/knife-tag.1 +189 -189
  214. data/distro/common/man/man1/knife-upload.1 +280 -280
  215. data/distro/common/man/man1/knife-user.1 +356 -356
  216. data/distro/common/man/man1/knife-xargs.1 +189 -189
  217. data/distro/common/man/man1/knife.1 +332 -332
  218. data/distro/common/man/man8/chef-apply.8 +86 -86
  219. data/distro/common/man/man8/chef-client.8 +398 -398
  220. data/distro/common/man/man8/chef-solo.8 +260 -260
  221. data/distro/common/markdown/README +3 -3
  222. data/distro/common/markdown/man1/chef-shell.mkd +195 -195
  223. data/distro/common/markdown/man1/knife-bootstrap.mkd +141 -141
  224. data/distro/common/markdown/man1/knife-client.mkd +103 -103
  225. data/distro/common/markdown/man1/knife-configure.mkd +71 -71
  226. data/distro/common/markdown/man1/knife-cookbook-site.mkd +123 -123
  227. data/distro/common/markdown/man1/knife-cookbook.mkd +263 -263
  228. data/distro/common/markdown/man1/knife-data-bag.mkd +121 -121
  229. data/distro/common/markdown/man1/knife-environment.mkd +151 -151
  230. data/distro/common/markdown/man1/knife-exec.mkd +42 -42
  231. data/distro/common/markdown/man1/knife-index.mkd +30 -30
  232. data/distro/common/markdown/man1/knife-node.mkd +130 -130
  233. data/distro/common/markdown/man1/knife-role.mkd +85 -85
  234. data/distro/common/markdown/man1/knife-search.mkd +180 -180
  235. data/distro/common/markdown/man1/knife-ssh.mkd +69 -69
  236. data/distro/common/markdown/man1/knife-status.mkd +36 -36
  237. data/distro/common/markdown/man1/knife-tag.mkd +39 -39
  238. data/distro/common/markdown/man1/knife.mkd +213 -213
  239. data/distro/common/markdown/man8/chef-client.mkd +75 -75
  240. data/distro/common/markdown/man8/chef-expander.mkd +81 -81
  241. data/distro/common/markdown/man8/chef-expanderctl.mkd +57 -57
  242. data/distro/common/markdown/man8/chef-server-webui.mkd +121 -121
  243. data/distro/common/markdown/man8/chef-server.mkd +120 -120
  244. data/distro/common/markdown/man8/chef-solo.mkd +107 -107
  245. data/distro/common/markdown/man8/chef-solr.mkd +89 -89
  246. data/distro/powershell/chef/chef.psm1 +442 -442
  247. data/ext/win32-eventlog/Rakefile +53 -53
  248. data/ext/win32-eventlog/chef-log.man +56 -56
  249. data/lib-backcompat/chef/chef_fs/file_system/acl_entry.rb +5 -5
  250. data/lib-backcompat/chef/chef_fs/file_system/already_exists_error.rb +20 -20
  251. data/lib-backcompat/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb +5 -5
  252. data/lib-backcompat/chef/chef_fs/file_system/chef_server_root_dir.rb +5 -5
  253. data/lib-backcompat/chef/chef_fs/file_system/cookbook_frozen_error.rb +20 -20
  254. data/lib-backcompat/chef/chef_fs/file_system/default_environment_cannot_be_modified_error.rb +20 -20
  255. data/lib-backcompat/chef/chef_fs/file_system/file_system_error.rb +20 -20
  256. data/lib-backcompat/chef/chef_fs/file_system/must_delete_recursively_error.rb +20 -20
  257. data/lib-backcompat/chef/chef_fs/file_system/not_found_error.rb +20 -20
  258. data/lib-backcompat/chef/chef_fs/file_system/operation_failed_error.rb +20 -20
  259. data/lib-backcompat/chef/chef_fs/file_system/operation_not_allowed_error.rb +20 -20
  260. data/lib-backcompat/chef/chef_fs/file_system/repository/chef_repository_file_system_acls_dir.rb +5 -5
  261. data/lib-backcompat/chef/chef_fs/file_system/repository/chef_repository_file_system_client_keys_dir.rb +5 -5
  262. data/lib-backcompat/chef/chef_fs/file_system/repository/chef_repository_file_system_entry.rb +6 -6
  263. data/lib-backcompat/chef/chef_fs/file_system/repository/chef_repository_file_system_policies_dir.rb +5 -5
  264. data/lib-backcompat/chef/chef_fs/file_system/repository/file_system_root_dir.rb +34 -34
  265. data/lib/chef.rb +35 -35
  266. data/lib/chef/api_client.rb +231 -231
  267. data/lib/chef/api_client/registration.rb +192 -192
  268. data/lib/chef/api_client_v1.rb +323 -323
  269. data/lib/chef/application.rb +378 -378
  270. data/lib/chef/application/apply.rb +219 -219
  271. data/lib/chef/application/client.rb +528 -528
  272. data/lib/chef/application/exit_code.rb +233 -233
  273. data/lib/chef/application/knife.rb +216 -216
  274. data/lib/chef/application/solo.rb +379 -379
  275. data/lib/chef/application/windows_service.rb +337 -337
  276. data/lib/chef/application/windows_service_manager.rb +204 -204
  277. data/lib/chef/applications.rb +4 -4
  278. data/lib/chef/audit/audit_event_proxy.rb +93 -93
  279. data/lib/chef/audit/audit_reporter.rb +176 -176
  280. data/lib/chef/audit/control_group_data.rb +139 -139
  281. data/lib/chef/audit/logger.rb +36 -36
  282. data/lib/chef/audit/rspec_formatter.rb +37 -37
  283. data/lib/chef/audit/runner.rb +196 -196
  284. data/lib/chef/chef_class.rb +240 -240
  285. data/lib/chef/chef_fs.rb +59 -59
  286. data/lib/chef/chef_fs/chef_fs_data_store.rb +870 -870
  287. data/lib/chef/chef_fs/command_line.rb +292 -292
  288. data/lib/chef/chef_fs/config.rb +284 -284
  289. data/lib/chef/chef_fs/data_handler/acl_data_handler.rb +26 -26
  290. data/lib/chef/chef_fs/data_handler/client_data_handler.rb +39 -39
  291. data/lib/chef/chef_fs/data_handler/client_key_data_handler.rb +11 -11
  292. data/lib/chef/chef_fs/data_handler/container_data_handler.rb +35 -35
  293. data/lib/chef/chef_fs/data_handler/cookbook_data_handler.rb +38 -38
  294. data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +62 -62
  295. data/lib/chef/chef_fs/data_handler/data_handler_base.rb +205 -205
  296. data/lib/chef/chef_fs/data_handler/environment_data_handler.rb +40 -40
  297. data/lib/chef/chef_fs/data_handler/group_data_handler.rb +55 -55
  298. data/lib/chef/chef_fs/data_handler/node_data_handler.rb +36 -36
  299. data/lib/chef/chef_fs/data_handler/organization_data_handler.rb +36 -36
  300. data/lib/chef/chef_fs/data_handler/organization_invites_data_handler.rb +17 -17
  301. data/lib/chef/chef_fs/data_handler/organization_members_data_handler.rb +17 -17
  302. data/lib/chef/chef_fs/data_handler/policy_data_handler.rb +48 -48
  303. data/lib/chef/chef_fs/data_handler/policy_group_data_handler.rb +33 -33
  304. data/lib/chef/chef_fs/data_handler/role_data_handler.rb +40 -40
  305. data/lib/chef/chef_fs/data_handler/user_data_handler.rb +29 -29
  306. data/lib/chef/chef_fs/file_pattern.rb +301 -301
  307. data/lib/chef/chef_fs/file_system.rb +431 -431
  308. data/lib/chef/chef_fs/file_system/base_fs_dir.rb +47 -47
  309. data/lib/chef/chef_fs/file_system/base_fs_object.rb +187 -187
  310. data/lib/chef/chef_fs/file_system/chef_server/acl_dir.rb +65 -65
  311. data/lib/chef/chef_fs/file_system/chef_server/acl_entry.rb +67 -67
  312. data/lib/chef/chef_fs/file_system/chef_server/acls_dir.rb +75 -75
  313. data/lib/chef/chef_fs/file_system/chef_server/chef_server_root_dir.rb +196 -196
  314. data/lib/chef/chef_fs/file_system/chef_server/cookbook_artifact_dir.rb +38 -38
  315. data/lib/chef/chef_fs/file_system/chef_server/cookbook_artifacts_dir.rb +102 -102
  316. data/lib/chef/chef_fs/file_system/chef_server/cookbook_dir.rb +221 -221
  317. data/lib/chef/chef_fs/file_system/chef_server/cookbook_file.rb +78 -78
  318. data/lib/chef/chef_fs/file_system/chef_server/cookbook_subdir.rb +61 -61
  319. data/lib/chef/chef_fs/file_system/chef_server/cookbooks_acl_dir.rb +42 -42
  320. data/lib/chef/chef_fs/file_system/chef_server/cookbooks_dir.rb +101 -101
  321. data/lib/chef/chef_fs/file_system/chef_server/data_bag_dir.rb +76 -76
  322. data/lib/chef/chef_fs/file_system/chef_server/data_bag_entry.rb +19 -19
  323. data/lib/chef/chef_fs/file_system/chef_server/data_bags_dir.rb +67 -67
  324. data/lib/chef/chef_fs/file_system/chef_server/environments_dir.rb +56 -56
  325. data/lib/chef/chef_fs/file_system/chef_server/nodes_dir.rb +51 -51
  326. data/lib/chef/chef_fs/file_system/chef_server/org_entry.rb +35 -35
  327. data/lib/chef/chef_fs/file_system/chef_server/organization_invites_entry.rb +65 -65
  328. data/lib/chef/chef_fs/file_system/chef_server/organization_members_entry.rb +64 -64
  329. data/lib/chef/chef_fs/file_system/chef_server/policies_acl_dir.rb +41 -41
  330. data/lib/chef/chef_fs/file_system/chef_server/policies_dir.rb +158 -158
  331. data/lib/chef/chef_fs/file_system/chef_server/policy_group_entry.rb +135 -135
  332. data/lib/chef/chef_fs/file_system/chef_server/policy_groups_dir.rb +43 -43
  333. data/lib/chef/chef_fs/file_system/chef_server/policy_revision_entry.rb +38 -38
  334. data/lib/chef/chef_fs/file_system/chef_server/rest_list_dir.rb +176 -176
  335. data/lib/chef/chef_fs/file_system/chef_server/rest_list_entry.rb +198 -198
  336. data/lib/chef/chef_fs/file_system/chef_server/versioned_cookbook_dir.rb +45 -45
  337. data/lib/chef/chef_fs/file_system/chef_server/versioned_cookbooks_dir.rb +107 -107
  338. data/lib/chef/chef_fs/file_system/exceptions.rb +105 -105
  339. data/lib/chef/chef_fs/file_system/memory/memory_dir.rb +53 -53
  340. data/lib/chef/chef_fs/file_system/memory/memory_file.rb +20 -20
  341. data/lib/chef/chef_fs/file_system/memory/memory_root.rb +23 -23
  342. data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +62 -62
  343. data/lib/chef/chef_fs/file_system/nonexistent_fs_object.rb +32 -32
  344. data/lib/chef/chef_fs/file_system/repository/acl.rb +45 -45
  345. data/lib/chef/chef_fs/file_system/repository/acls_dir.rb +50 -50
  346. data/lib/chef/chef_fs/file_system/repository/acls_sub_dir.rb +38 -38
  347. data/lib/chef/chef_fs/file_system/repository/base_file.rb +155 -155
  348. data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_artifact_dir.rb +41 -41
  349. data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_dir.rb +144 -144
  350. data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_entry.rb +177 -177
  351. data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_root_dir.rb +231 -231
  352. data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_versioned_cookbook_dir.rb +42 -42
  353. data/lib/chef/chef_fs/file_system/repository/client.rb +38 -38
  354. data/lib/chef/chef_fs/file_system/repository/client_key.rb +38 -38
  355. data/lib/chef/chef_fs/file_system/repository/client_keys_dir.rb +42 -42
  356. data/lib/chef/chef_fs/file_system/repository/client_keys_sub_dir.rb +38 -38
  357. data/lib/chef/chef_fs/file_system/repository/clients_dir.rb +37 -37
  358. data/lib/chef/chef_fs/file_system/repository/container.rb +38 -38
  359. data/lib/chef/chef_fs/file_system/repository/containers_dir.rb +37 -37
  360. data/lib/chef/chef_fs/file_system/repository/cookbook_artifacts_dir.rb +36 -36
  361. data/lib/chef/chef_fs/file_system/repository/cookbooks_dir.rb +51 -51
  362. data/lib/chef/chef_fs/file_system/repository/data_bag.rb +39 -39
  363. data/lib/chef/chef_fs/file_system/repository/data_bag_item.rb +38 -38
  364. data/lib/chef/chef_fs/file_system/repository/data_bags_dir.rb +39 -39
  365. data/lib/chef/chef_fs/file_system/repository/directory.rb +167 -167
  366. data/lib/chef/chef_fs/file_system/repository/environment.rb +38 -38
  367. data/lib/chef/chef_fs/file_system/repository/environments_dir.rb +37 -37
  368. data/lib/chef/chef_fs/file_system/repository/file_system_entry.rb +151 -151
  369. data/lib/chef/chef_fs/file_system/repository/group.rb +38 -38
  370. data/lib/chef/chef_fs/file_system/repository/groups_dir.rb +37 -37
  371. data/lib/chef/chef_fs/file_system/repository/node.rb +38 -38
  372. data/lib/chef/chef_fs/file_system/repository/nodes_dir.rb +59 -59
  373. data/lib/chef/chef_fs/file_system/repository/policies_dir.rb +42 -42
  374. data/lib/chef/chef_fs/file_system/repository/policy.rb +38 -38
  375. data/lib/chef/chef_fs/file_system/repository/policy_group.rb +38 -38
  376. data/lib/chef/chef_fs/file_system/repository/policy_groups_dir.rb +37 -37
  377. data/lib/chef/chef_fs/file_system/repository/role.rb +38 -38
  378. data/lib/chef/chef_fs/file_system/repository/roles_dir.rb +37 -37
  379. data/lib/chef/chef_fs/file_system/repository/user.rb +38 -38
  380. data/lib/chef/chef_fs/file_system/repository/users_dir.rb +37 -37
  381. data/lib/chef/chef_fs/file_system/repository/versioned_cookbooks_dir.rb +34 -34
  382. data/lib/chef/chef_fs/file_system_cache.rb +80 -80
  383. data/lib/chef/chef_fs/knife.rb +161 -161
  384. data/lib/chef/chef_fs/parallelizer.rb +103 -103
  385. data/lib/chef/chef_fs/parallelizer/flatten_enumerable.rb +35 -35
  386. data/lib/chef/chef_fs/parallelizer/parallel_enumerable.rb +277 -277
  387. data/lib/chef/chef_fs/path_utils.rb +127 -127
  388. data/lib/chef/client.rb +1023 -1023
  389. data/lib/chef/config.rb +85 -85
  390. data/lib/chef/config_fetcher.rb +72 -72
  391. data/lib/chef/constants.rb +28 -28
  392. data/lib/chef/cookbook/chefignore.rb +74 -74
  393. data/lib/chef/cookbook/cookbook_collection.rb +63 -63
  394. data/lib/chef/cookbook/cookbook_version_loader.rb +351 -351
  395. data/lib/chef/cookbook/file_system_file_vendor.rb +58 -58
  396. data/lib/chef/cookbook/file_vendor.rb +71 -71
  397. data/lib/chef/cookbook/gem_installer.rb +84 -84
  398. data/lib/chef/cookbook/metadata.rb +912 -912
  399. data/lib/chef/cookbook/remote_file_vendor.rb +87 -87
  400. data/lib/chef/cookbook/synchronizer.rb +298 -298
  401. data/lib/chef/cookbook/syntax_check.rb +260 -260
  402. data/lib/chef/cookbook_loader.rb +200 -200
  403. data/lib/chef/cookbook_manifest.rb +290 -290
  404. data/lib/chef/cookbook_site_streaming_uploader.rb +243 -243
  405. data/lib/chef/cookbook_uploader.rb +157 -157
  406. data/lib/chef/cookbook_version.rb +637 -637
  407. data/lib/chef/daemon.rb +131 -131
  408. data/lib/chef/data_bag.rb +176 -176
  409. data/lib/chef/data_bag_item.rb +218 -218
  410. data/lib/chef/data_collector.rb +489 -489
  411. data/lib/chef/data_collector/messages.rb +98 -98
  412. data/lib/chef/data_collector/messages/helpers.rb +161 -161
  413. data/lib/chef/data_collector/resource_report.rb +123 -123
  414. data/lib/chef/decorator.rb +81 -81
  415. data/lib/chef/decorator/lazy.rb +60 -60
  416. data/lib/chef/decorator/lazy_array.rb +59 -59
  417. data/lib/chef/decorator/unchain.rb +59 -59
  418. data/lib/chef/delayed_evaluator.rb +21 -21
  419. data/lib/chef/deprecated.rb +250 -250
  420. data/lib/chef/deprecation/mixin/template.rb +48 -48
  421. data/lib/chef/deprecation/provider/cookbook_file.rb +54 -54
  422. data/lib/chef/deprecation/provider/file.rb +198 -198
  423. data/lib/chef/deprecation/provider/remote_directory.rb +52 -52
  424. data/lib/chef/deprecation/provider/remote_file.rb +85 -85
  425. data/lib/chef/deprecation/provider/template.rb +63 -63
  426. data/lib/chef/deprecation/warnings.rb +36 -36
  427. data/lib/chef/digester.rb +74 -74
  428. data/lib/chef/dsl.rb +6 -6
  429. data/lib/chef/dsl/audit.rb +51 -51
  430. data/lib/chef/dsl/chef_provisioning.rb +57 -57
  431. data/lib/chef/dsl/cheffish.rb +65 -65
  432. data/lib/chef/dsl/core.rb +52 -52
  433. data/lib/chef/dsl/data_query.rb +89 -89
  434. data/lib/chef/dsl/declare_resource.rb +295 -295
  435. data/lib/chef/dsl/definitions.rb +43 -43
  436. data/lib/chef/dsl/include_attribute.rb +61 -61
  437. data/lib/chef/dsl/include_recipe.rb +44 -44
  438. data/lib/chef/dsl/method_missing.rb +75 -75
  439. data/lib/chef/dsl/platform_introspection.rb +268 -268
  440. data/lib/chef/dsl/powershell.rb +29 -29
  441. data/lib/chef/dsl/reboot_pending.rb +64 -64
  442. data/lib/chef/dsl/recipe.rb +95 -95
  443. data/lib/chef/dsl/registry_helper.rb +63 -63
  444. data/lib/chef/dsl/resources.rb +56 -56
  445. data/lib/chef/dsl/universal.rb +50 -50
  446. data/lib/chef/encrypted_data_bag_item.rb +155 -155
  447. data/lib/chef/encrypted_data_bag_item/assertions.rb +54 -54
  448. data/lib/chef/encrypted_data_bag_item/check_encrypted.rb +56 -56
  449. data/lib/chef/encrypted_data_bag_item/decryption_failure.rb +22 -22
  450. data/lib/chef/encrypted_data_bag_item/decryptor.rb +227 -227
  451. data/lib/chef/encrypted_data_bag_item/encrypted_data_bag_item_assertions.rb +37 -37
  452. data/lib/chef/encrypted_data_bag_item/encryption_failure.rb +22 -22
  453. data/lib/chef/encrypted_data_bag_item/encryptor.rb +225 -225
  454. data/lib/chef/encrypted_data_bag_item/unacceptable_encrypted_data_bag_item_format.rb +22 -22
  455. data/lib/chef/encrypted_data_bag_item/unsupported_cipher.rb +22 -22
  456. data/lib/chef/encrypted_data_bag_item/unsupported_encrypted_data_bag_item_format.rb +22 -22
  457. data/lib/chef/environment.rb +324 -324
  458. data/lib/chef/event_dispatch/base.rb +429 -429
  459. data/lib/chef/event_dispatch/dispatcher.rb +62 -62
  460. data/lib/chef/event_dispatch/dsl.rb +65 -65
  461. data/lib/chef/event_dispatch/events_output_stream.rb +37 -37
  462. data/lib/chef/event_loggers/base.rb +62 -62
  463. data/lib/chef/event_loggers/windows_eventlog.rb +101 -101
  464. data/lib/chef/exceptions.rb +532 -532
  465. data/lib/chef/file_access_control.rb +75 -75
  466. data/lib/chef/file_access_control/unix.rb +290 -290
  467. data/lib/chef/file_access_control/windows.rb +335 -335
  468. data/lib/chef/file_cache.rb +221 -221
  469. data/lib/chef/file_content_management/content_base.rb +56 -56
  470. data/lib/chef/file_content_management/deploy.rb +37 -37
  471. data/lib/chef/file_content_management/deploy/cp.rb +48 -48
  472. data/lib/chef/file_content_management/deploy/mv_unix.rb +76 -76
  473. data/lib/chef/file_content_management/deploy/mv_windows.rb +103 -103
  474. data/lib/chef/file_content_management/tempfile.rb +107 -107
  475. data/lib/chef/formatters/base.rb +247 -247
  476. data/lib/chef/formatters/doc.rb +447 -447
  477. data/lib/chef/formatters/error_description.rb +86 -86
  478. data/lib/chef/formatters/error_inspectors.rb +19 -19
  479. data/lib/chef/formatters/error_inspectors/api_error_formatting.rb +183 -183
  480. data/lib/chef/formatters/error_inspectors/compile_error_inspector.rb +154 -154
  481. data/lib/chef/formatters/error_inspectors/cookbook_resolve_error_inspector.rb +168 -168
  482. data/lib/chef/formatters/error_inspectors/cookbook_sync_error_inspector.rb +82 -82
  483. data/lib/chef/formatters/error_inspectors/node_load_error_inspector.rb +128 -128
  484. data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +147 -147
  485. data/lib/chef/formatters/error_inspectors/resource_failure_inspector.rb +124 -124
  486. data/lib/chef/formatters/error_inspectors/run_list_expansion_error_inspector.rb +121 -121
  487. data/lib/chef/formatters/error_mapper.rb +85 -85
  488. data/lib/chef/formatters/indentable_output_stream.rb +170 -170
  489. data/lib/chef/formatters/minimal.rb +233 -233
  490. data/lib/chef/guard_interpreter.rb +32 -32
  491. data/lib/chef/guard_interpreter/default_guard_interpreter.rb +43 -43
  492. data/lib/chef/guard_interpreter/resource_guard_interpreter.rb +138 -138
  493. data/lib/chef/handler.rb +268 -268
  494. data/lib/chef/handler/error_report.rb +33 -33
  495. data/lib/chef/handler/json_file.rb +63 -63
  496. data/lib/chef/http.rb +489 -489
  497. data/lib/chef/http/api_versions.rb +50 -50
  498. data/lib/chef/http/auth_credentials.rb +57 -57
  499. data/lib/chef/http/authenticator.rb +106 -106
  500. data/lib/chef/http/basic_client.rb +158 -158
  501. data/lib/chef/http/cookie_jar.rb +31 -31
  502. data/lib/chef/http/cookie_manager.rb +59 -59
  503. data/lib/chef/http/decompressor.rb +142 -142
  504. data/lib/chef/http/http_request.rb +186 -186
  505. data/lib/chef/http/json_input.rb +73 -73
  506. data/lib/chef/http/json_output.rb +78 -78
  507. data/lib/chef/http/json_to_model_output.rb +34 -34
  508. data/lib/chef/http/remote_request_id.rb +46 -46
  509. data/lib/chef/http/simple.rb +40 -40
  510. data/lib/chef/http/simple_json.rb +43 -43
  511. data/lib/chef/http/socketless_chef_zero_client.rb +208 -208
  512. data/lib/chef/http/ssl_policies.rb +130 -130
  513. data/lib/chef/http/validate_content_length.rb +114 -114
  514. data/lib/chef/json_compat.rb +160 -160
  515. data/lib/chef/key.rb +272 -272
  516. data/lib/chef/knife.rb +613 -613
  517. data/lib/chef/knife/bootstrap.rb +489 -489
  518. data/lib/chef/knife/bootstrap/chef_vault_handler.rb +159 -159
  519. data/lib/chef/knife/bootstrap/client_builder.rb +208 -208
  520. data/lib/chef/knife/bootstrap/templates/README.md +11 -11
  521. data/lib/chef/knife/bootstrap/templates/chef-full.erb +236 -236
  522. data/lib/chef/knife/client_bulk_delete.rb +104 -104
  523. data/lib/chef/knife/client_create.rb +111 -111
  524. data/lib/chef/knife/client_delete.rb +63 -63
  525. data/lib/chef/knife/client_edit.rb +53 -53
  526. data/lib/chef/knife/client_key_create.rb +67 -67
  527. data/lib/chef/knife/client_key_delete.rb +76 -76
  528. data/lib/chef/knife/client_key_edit.rb +79 -79
  529. data/lib/chef/knife/client_key_list.rb +69 -69
  530. data/lib/chef/knife/client_key_show.rb +76 -76
  531. data/lib/chef/knife/client_list.rb +42 -42
  532. data/lib/chef/knife/client_reregister.rb +59 -59
  533. data/lib/chef/knife/client_show.rb +49 -49
  534. data/lib/chef/knife/configure.rb +171 -171
  535. data/lib/chef/knife/configure_client.rb +50 -50
  536. data/lib/chef/knife/cookbook_bulk_delete.rb +71 -71
  537. data/lib/chef/knife/cookbook_create.rb +462 -462
  538. data/lib/chef/knife/cookbook_delete.rb +151 -151
  539. data/lib/chef/knife/cookbook_download.rb +143 -143
  540. data/lib/chef/knife/cookbook_list.rb +47 -47
  541. data/lib/chef/knife/cookbook_metadata.rb +107 -107
  542. data/lib/chef/knife/cookbook_metadata_from_file.rb +44 -44
  543. data/lib/chef/knife/cookbook_show.rb +94 -94
  544. data/lib/chef/knife/cookbook_site_download.rb +116 -116
  545. data/lib/chef/knife/cookbook_site_install.rb +196 -196
  546. data/lib/chef/knife/cookbook_site_list.rb +65 -65
  547. data/lib/chef/knife/cookbook_site_search.rb +53 -53
  548. data/lib/chef/knife/cookbook_site_share.rb +170 -170
  549. data/lib/chef/knife/cookbook_site_show.rb +66 -66
  550. data/lib/chef/knife/cookbook_site_unshare.rb +63 -63
  551. data/lib/chef/knife/cookbook_site_vendor.rb +46 -46
  552. data/lib/chef/knife/cookbook_test.rb +95 -95
  553. data/lib/chef/knife/cookbook_upload.rb +308 -308
  554. data/lib/chef/knife/core/bootstrap_context.rb +267 -267
  555. data/lib/chef/knife/core/cookbook_scm_repo.rb +159 -159
  556. data/lib/chef/knife/core/custom_manifest_loader.rb +69 -69
  557. data/lib/chef/knife/core/gem_glob_loader.rb +138 -138
  558. data/lib/chef/knife/core/generic_presenter.rb +232 -232
  559. data/lib/chef/knife/core/hashed_command_loader.rb +99 -99
  560. data/lib/chef/knife/core/node_editor.rb +130 -130
  561. data/lib/chef/knife/core/node_presenter.rb +159 -159
  562. data/lib/chef/knife/core/object_loader.rb +115 -115
  563. data/lib/chef/knife/core/status_presenter.rb +157 -157
  564. data/lib/chef/knife/core/subcommand_loader.rb +212 -212
  565. data/lib/chef/knife/core/text_formatter.rb +85 -85
  566. data/lib/chef/knife/core/ui.rb +278 -278
  567. data/lib/chef/knife/data_bag_create.rb +80 -80
  568. data/lib/chef/knife/data_bag_delete.rb +49 -49
  569. data/lib/chef/knife/data_bag_edit.rb +74 -74
  570. data/lib/chef/knife/data_bag_from_file.rb +114 -114
  571. data/lib/chef/knife/data_bag_list.rb +42 -42
  572. data/lib/chef/knife/data_bag_secret_options.rb +142 -142
  573. data/lib/chef/knife/data_bag_show.rb +69 -69
  574. data/lib/chef/knife/delete.rb +107 -107
  575. data/lib/chef/knife/deps.rb +138 -138
  576. data/lib/chef/knife/diff.rb +68 -68
  577. data/lib/chef/knife/download.rb +68 -68
  578. data/lib/chef/knife/edit.rb +72 -72
  579. data/lib/chef/knife/environment_compare.rb +127 -127
  580. data/lib/chef/knife/environment_create.rb +53 -53
  581. data/lib/chef/knife/environment_delete.rb +45 -45
  582. data/lib/chef/knife/environment_edit.rb +45 -45
  583. data/lib/chef/knife/environment_from_file.rb +82 -82
  584. data/lib/chef/knife/environment_list.rb +42 -42
  585. data/lib/chef/knife/environment_show.rb +48 -48
  586. data/lib/chef/knife/exec.rb +87 -87
  587. data/lib/chef/knife/help.rb +101 -101
  588. data/lib/chef/knife/help_topics.rb +4 -4
  589. data/lib/chef/knife/index_rebuild.rb +133 -133
  590. data/lib/chef/knife/key_create.rb +112 -112
  591. data/lib/chef/knife/key_create_base.rb +50 -50
  592. data/lib/chef/knife/key_delete.rb +55 -55
  593. data/lib/chef/knife/key_edit.rb +118 -118
  594. data/lib/chef/knife/key_edit_base.rb +55 -55
  595. data/lib/chef/knife/key_list.rb +88 -88
  596. data/lib/chef/knife/key_list_base.rb +45 -45
  597. data/lib/chef/knife/key_show.rb +53 -53
  598. data/lib/chef/knife/list.rb +156 -156
  599. data/lib/chef/knife/node_bulk_delete.rb +74 -74
  600. data/lib/chef/knife/node_create.rb +47 -47
  601. data/lib/chef/knife/node_delete.rb +46 -46
  602. data/lib/chef/knife/node_edit.rb +70 -70
  603. data/lib/chef/knife/node_environment_set.rb +54 -54
  604. data/lib/chef/knife/node_from_file.rb +51 -51
  605. data/lib/chef/knife/node_list.rb +44 -44
  606. data/lib/chef/knife/node_run_list_add.rb +104 -104
  607. data/lib/chef/knife/node_run_list_remove.rb +67 -67
  608. data/lib/chef/knife/node_run_list_set.rb +66 -66
  609. data/lib/chef/knife/node_show.rb +61 -61
  610. data/lib/chef/knife/null.rb +10 -10
  611. data/lib/chef/knife/osc_user_create.rb +97 -97
  612. data/lib/chef/knife/osc_user_delete.rb +51 -51
  613. data/lib/chef/knife/osc_user_edit.rb +58 -58
  614. data/lib/chef/knife/osc_user_list.rb +47 -47
  615. data/lib/chef/knife/osc_user_reregister.rb +64 -64
  616. data/lib/chef/knife/osc_user_show.rb +53 -53
  617. data/lib/chef/knife/raw.rb +103 -103
  618. data/lib/chef/knife/recipe_list.rb +32 -32
  619. data/lib/chef/knife/rehash.rb +65 -65
  620. data/lib/chef/knife/role_bulk_delete.rb +65 -65
  621. data/lib/chef/knife/role_create.rb +53 -53
  622. data/lib/chef/knife/role_delete.rb +46 -46
  623. data/lib/chef/knife/role_edit.rb +45 -45
  624. data/lib/chef/knife/role_env_run_list_add.rb +86 -86
  625. data/lib/chef/knife/role_env_run_list_clear.rb +55 -55
  626. data/lib/chef/knife/role_env_run_list_remove.rb +57 -57
  627. data/lib/chef/knife/role_env_run_list_replace.rb +59 -59
  628. data/lib/chef/knife/role_env_run_list_set.rb +70 -70
  629. data/lib/chef/knife/role_from_file.rb +51 -51
  630. data/lib/chef/knife/role_list.rb +42 -42
  631. data/lib/chef/knife/role_run_list_add.rb +86 -86
  632. data/lib/chef/knife/role_run_list_clear.rb +55 -55
  633. data/lib/chef/knife/role_run_list_remove.rb +57 -57
  634. data/lib/chef/knife/role_run_list_replace.rb +59 -59
  635. data/lib/chef/knife/role_run_list_set.rb +70 -70
  636. data/lib/chef/knife/role_show.rb +49 -49
  637. data/lib/chef/knife/search.rb +201 -201
  638. data/lib/chef/knife/serve.rb +48 -48
  639. data/lib/chef/knife/show.rb +56 -56
  640. data/lib/chef/knife/ssh.rb +591 -591
  641. data/lib/chef/knife/ssl_check.rb +283 -283
  642. data/lib/chef/knife/ssl_fetch.rb +161 -161
  643. data/lib/chef/knife/status.rb +110 -110
  644. data/lib/chef/knife/supermarket_download.rb +33 -33
  645. data/lib/chef/knife/supermarket_install.rb +33 -33
  646. data/lib/chef/knife/supermarket_list.rb +33 -33
  647. data/lib/chef/knife/supermarket_search.rb +33 -33
  648. data/lib/chef/knife/supermarket_share.rb +33 -33
  649. data/lib/chef/knife/supermarket_show.rb +33 -33
  650. data/lib/chef/knife/supermarket_unshare.rb +33 -33
  651. data/lib/chef/knife/tag_create.rb +52 -52
  652. data/lib/chef/knife/tag_delete.rb +60 -60
  653. data/lib/chef/knife/tag_list.rb +47 -47
  654. data/lib/chef/knife/upload.rb +70 -70
  655. data/lib/chef/knife/user_create.rb +150 -150
  656. data/lib/chef/knife/user_delete.rb +95 -95
  657. data/lib/chef/knife/user_edit.rb +81 -81
  658. data/lib/chef/knife/user_key_create.rb +69 -69
  659. data/lib/chef/knife/user_key_delete.rb +76 -76
  660. data/lib/chef/knife/user_key_edit.rb +79 -79
  661. data/lib/chef/knife/user_key_list.rb +69 -69
  662. data/lib/chef/knife/user_key_show.rb +76 -76
  663. data/lib/chef/knife/user_list.rb +45 -45
  664. data/lib/chef/knife/user_reregister.rb +89 -89
  665. data/lib/chef/knife/user_show.rb +78 -78
  666. data/lib/chef/knife/xargs.rb +266 -266
  667. data/lib/chef/local_mode.rb +128 -128
  668. data/lib/chef/log.rb +68 -68
  669. data/lib/chef/log/syslog.rb +45 -45
  670. data/lib/chef/log/winevt.rb +99 -99
  671. data/lib/chef/mash.rb +232 -232
  672. data/lib/chef/mixin/api_version_request_handling.rb +66 -66
  673. data/lib/chef/mixin/checksum.rb +37 -37
  674. data/lib/chef/mixin/command.rb +194 -194
  675. data/lib/chef/mixin/command/unix.rb +220 -220
  676. data/lib/chef/mixin/command/windows.rb +71 -71
  677. data/lib/chef/mixin/convert_to_class_name.rb +126 -126
  678. data/lib/chef/mixin/create_path.rb +71 -71
  679. data/lib/chef/mixin/deep_merge.rb +140 -140
  680. data/lib/chef/mixin/deprecation.rb +117 -117
  681. data/lib/chef/mixin/descendants_tracker.rb +81 -81
  682. data/lib/chef/mixin/enforce_ownership_and_permissions.rb +39 -39
  683. data/lib/chef/mixin/file_class.rb +35 -35
  684. data/lib/chef/mixin/from_file.rb +50 -50
  685. data/lib/chef/mixin/get_source_from_package.rb +47 -47
  686. data/lib/chef/mixin/homebrew_user.rb +68 -68
  687. data/lib/chef/mixin/language.rb +48 -48
  688. data/lib/chef/mixin/language_include_attribute.rb +34 -34
  689. data/lib/chef/mixin/language_include_recipe.rb +31 -31
  690. data/lib/chef/mixin/lazy_module_include.rb +77 -77
  691. data/lib/chef/mixin/notifying_block.rb +51 -51
  692. data/lib/chef/mixin/params_validate.rb +489 -489
  693. data/lib/chef/mixin/path_sanity.rb +68 -68
  694. data/lib/chef/mixin/powershell_out.rb +98 -98
  695. data/lib/chef/mixin/powershell_type_coercions.rb +84 -84
  696. data/lib/chef/mixin/properties.rb +306 -306
  697. data/lib/chef/mixin/provides.rb +28 -28
  698. data/lib/chef/mixin/proxified_socket.rb +42 -42
  699. data/lib/chef/mixin/recipe_definition_dsl_core.rb +35 -35
  700. data/lib/chef/mixin/securable.rb +196 -196
  701. data/lib/chef/mixin/shell_out.rb +211 -211
  702. data/lib/chef/mixin/subclass_directive.rb +37 -37
  703. data/lib/chef/mixin/template.rb +262 -262
  704. data/lib/chef/mixin/unformatter.rb +32 -32
  705. data/lib/chef/mixin/uris.rb +42 -42
  706. data/lib/chef/mixin/versioned_api.rb +69 -69
  707. data/lib/chef/mixin/which.rb +50 -50
  708. data/lib/chef/mixin/why_run.rb +331 -331
  709. data/lib/chef/mixin/wide_string.rb +72 -72
  710. data/lib/chef/mixin/windows_architecture_helper.rb +113 -113
  711. data/lib/chef/mixin/windows_env_helper.rb +67 -67
  712. data/lib/chef/mixin/xml_escape.rb +138 -138
  713. data/lib/chef/mixins.rb +13 -13
  714. data/lib/chef/monkey_patches/net_http.rb +60 -60
  715. data/lib/chef/monkey_patches/webrick-utils.rb +51 -51
  716. data/lib/chef/monkey_patches/win32/registry.rb +86 -86
  717. data/lib/chef/monologger.rb +88 -88
  718. data/lib/chef/nil_argument.rb +3 -3
  719. data/lib/chef/node.rb +677 -677
  720. data/lib/chef/node/attribute.rb +673 -673
  721. data/lib/chef/node/attribute_collections.rb +231 -231
  722. data/lib/chef/node/common_api.rb +121 -121
  723. data/lib/chef/node/immutable_collections.rb +180 -180
  724. data/lib/chef/node/mixin/deep_merge_cache.rb +61 -61
  725. data/lib/chef/node/mixin/immutablize_array.rb +67 -67
  726. data/lib/chef/node/mixin/immutablize_hash.rb +54 -54
  727. data/lib/chef/node/mixin/state_tracking.rb +96 -96
  728. data/lib/chef/node_map.rb +238 -238
  729. data/lib/chef/null_logger.rb +72 -72
  730. data/lib/chef/org.rb +147 -147
  731. data/lib/chef/platform.rb +30 -30
  732. data/lib/chef/platform/priority_map.rb +41 -41
  733. data/lib/chef/platform/provider_handler_map.rb +29 -29
  734. data/lib/chef/platform/provider_mapping.rb +222 -222
  735. data/lib/chef/platform/provider_priority_map.rb +11 -11
  736. data/lib/chef/platform/query_helpers.rb +112 -112
  737. data/lib/chef/platform/rebooter.rb +67 -67
  738. data/lib/chef/platform/resource_handler_map.rb +29 -29
  739. data/lib/chef/platform/resource_priority_map.rb +11 -11
  740. data/lib/chef/platform/service_helpers.rb +122 -122
  741. data/lib/chef/policy_builder.rb +42 -42
  742. data/lib/chef/policy_builder/dynamic.rb +185 -185
  743. data/lib/chef/policy_builder/expand_node_object.rb +278 -278
  744. data/lib/chef/policy_builder/policyfile.rb +550 -550
  745. data/lib/chef/property.rb +731 -731
  746. data/lib/chef/provider.rb +458 -458
  747. data/lib/chef/provider/apt_repository.rb +258 -258
  748. data/lib/chef/provider/apt_update.rb +87 -87
  749. data/lib/chef/provider/batch.rb +45 -45
  750. data/lib/chef/provider/breakpoint.rb +38 -38
  751. data/lib/chef/provider/cookbook_file.rb +53 -53
  752. data/lib/chef/provider/cookbook_file/content.rb +49 -49
  753. data/lib/chef/provider/cron.rb +262 -262
  754. data/lib/chef/provider/cron/aix.rb +50 -50
  755. data/lib/chef/provider/cron/solaris.rb +22 -22
  756. data/lib/chef/provider/cron/unix.rb +83 -83
  757. data/lib/chef/provider/deploy.rb +476 -476
  758. data/lib/chef/provider/deploy/revision.rb +107 -107
  759. data/lib/chef/provider/deploy/timestamped.rb +34 -34
  760. data/lib/chef/provider/directory.rb +168 -168
  761. data/lib/chef/provider/dsc_resource.rb +213 -213
  762. data/lib/chef/provider/dsc_script.rb +189 -189
  763. data/lib/chef/provider/env.rb +169 -169
  764. data/lib/chef/provider/env/windows.rb +72 -72
  765. data/lib/chef/provider/erl_call.rb +108 -108
  766. data/lib/chef/provider/execute.rb +128 -128
  767. data/lib/chef/provider/file.rb +488 -488
  768. data/lib/chef/provider/file/content.rb +39 -39
  769. data/lib/chef/provider/git.rb +334 -334
  770. data/lib/chef/provider/group.rb +185 -185
  771. data/lib/chef/provider/group/aix.rb +79 -79
  772. data/lib/chef/provider/group/dscl.rb +173 -173
  773. data/lib/chef/provider/group/gpasswd.rb +58 -58
  774. data/lib/chef/provider/group/groupadd.rb +133 -133
  775. data/lib/chef/provider/group/groupmod.rb +123 -123
  776. data/lib/chef/provider/group/pw.rb +137 -137
  777. data/lib/chef/provider/group/suse.rb +83 -83
  778. data/lib/chef/provider/group/usermod.rb +90 -90
  779. data/lib/chef/provider/group/windows.rb +109 -109
  780. data/lib/chef/provider/http_request.rb +122 -122
  781. data/lib/chef/provider/ifconfig.rb +283 -283
  782. data/lib/chef/provider/ifconfig/aix.rb +94 -94
  783. data/lib/chef/provider/ifconfig/debian.rb +85 -85
  784. data/lib/chef/provider/ifconfig/redhat.rb +48 -48
  785. data/lib/chef/provider/launchd.rb +208 -208
  786. data/lib/chef/provider/link.rb +172 -172
  787. data/lib/chef/provider/log.rb +57 -57
  788. data/lib/chef/provider/lwrp_base.rb +98 -98
  789. data/lib/chef/provider/mdadm.rb +93 -93
  790. data/lib/chef/provider/mount.rb +171 -171
  791. data/lib/chef/provider/mount/aix.rb +180 -180
  792. data/lib/chef/provider/mount/mount.rb +270 -270
  793. data/lib/chef/provider/mount/solaris.rb +271 -271
  794. data/lib/chef/provider/mount/windows.rb +92 -92
  795. data/lib/chef/provider/noop.rb +37 -37
  796. data/lib/chef/provider/ohai.rb +51 -51
  797. data/lib/chef/provider/osx_profile.rb +257 -257
  798. data/lib/chef/provider/package.rb +656 -656
  799. data/lib/chef/provider/package/aix.rb +143 -143
  800. data/lib/chef/provider/package/apt.rb +201 -201
  801. data/lib/chef/provider/package/cab.rb +179 -179
  802. data/lib/chef/provider/package/chocolatey.rb +275 -275
  803. data/lib/chef/provider/package/dnf.rb +192 -192
  804. data/lib/chef/provider/package/dnf/dnf_helper.py +91 -91
  805. data/lib/chef/provider/package/dnf/python_helper.rb +157 -157
  806. data/lib/chef/provider/package/dnf/version.rb +56 -56
  807. data/lib/chef/provider/package/dpkg.rb +225 -225
  808. data/lib/chef/provider/package/easy_install.rb +135 -135
  809. data/lib/chef/provider/package/freebsd/base.rb +89 -89
  810. data/lib/chef/provider/package/freebsd/pkg.rb +114 -114
  811. data/lib/chef/provider/package/freebsd/pkgng.rb +76 -76
  812. data/lib/chef/provider/package/freebsd/port.rb +60 -60
  813. data/lib/chef/provider/package/homebrew.rb +138 -138
  814. data/lib/chef/provider/package/ips.rb +86 -86
  815. data/lib/chef/provider/package/macports.rb +101 -101
  816. data/lib/chef/provider/package/msu.rb +162 -162
  817. data/lib/chef/provider/package/openbsd.rb +139 -139
  818. data/lib/chef/provider/package/pacman.rb +104 -104
  819. data/lib/chef/provider/package/paludis.rb +85 -85
  820. data/lib/chef/provider/package/portage.rb +140 -140
  821. data/lib/chef/provider/package/powershell.rb +114 -114
  822. data/lib/chef/provider/package/rpm.rb +123 -123
  823. data/lib/chef/provider/package/rubygems.rb +591 -591
  824. data/lib/chef/provider/package/smartos.rb +92 -92
  825. data/lib/chef/provider/package/solaris.rb +138 -138
  826. data/lib/chef/provider/package/windows.rb +271 -271
  827. data/lib/chef/provider/package/windows/exe.rb +115 -115
  828. data/lib/chef/provider/package/windows/msi.rb +94 -94
  829. data/lib/chef/provider/package/windows/registry_uninstall_entry.rb +87 -87
  830. data/lib/chef/provider/package/yum.rb +536 -536
  831. data/lib/chef/provider/package/yum/rpm_utils.rb +642 -642
  832. data/lib/chef/provider/package/yum/yum-dump.py +307 -307
  833. data/lib/chef/provider/package/yum/yum_cache.rb +376 -376
  834. data/lib/chef/provider/package/zypper.rb +163 -163
  835. data/lib/chef/provider/powershell_script.rb +223 -223
  836. data/lib/chef/provider/reboot.rb +70 -70
  837. data/lib/chef/provider/registry_key.rb +182 -182
  838. data/lib/chef/provider/remote_directory.rb +283 -283
  839. data/lib/chef/provider/remote_file.rb +53 -53
  840. data/lib/chef/provider/remote_file/cache_control_data.rb +195 -195
  841. data/lib/chef/provider/remote_file/content.rb +81 -81
  842. data/lib/chef/provider/remote_file/fetcher.rb +57 -57
  843. data/lib/chef/provider/remote_file/ftp.rb +172 -172
  844. data/lib/chef/provider/remote_file/http.rb +135 -135
  845. data/lib/chef/provider/remote_file/local_file.rb +60 -60
  846. data/lib/chef/provider/remote_file/network_file.rb +48 -48
  847. data/lib/chef/provider/remote_file/sftp.rb +105 -105
  848. data/lib/chef/provider/resource_update.rb +52 -52
  849. data/lib/chef/provider/route.rb +231 -231
  850. data/lib/chef/provider/ruby_block.rb +44 -44
  851. data/lib/chef/provider/script.rb +121 -121
  852. data/lib/chef/provider/service.rb +259 -259
  853. data/lib/chef/provider/service/aix.rb +129 -129
  854. data/lib/chef/provider/service/aixinit.rb +117 -117
  855. data/lib/chef/provider/service/arch.rb +118 -118
  856. data/lib/chef/provider/service/debian.rb +182 -182
  857. data/lib/chef/provider/service/freebsd.rb +195 -195
  858. data/lib/chef/provider/service/gentoo.rb +71 -71
  859. data/lib/chef/provider/service/init.rb +94 -94
  860. data/lib/chef/provider/service/insserv.rb +59 -59
  861. data/lib/chef/provider/service/invokercd.rb +41 -41
  862. data/lib/chef/provider/service/macosx.rb +250 -250
  863. data/lib/chef/provider/service/openbsd.rb +217 -217
  864. data/lib/chef/provider/service/redhat.rb +126 -126
  865. data/lib/chef/provider/service/simple.rb +176 -176
  866. data/lib/chef/provider/service/solaris.rb +122 -122
  867. data/lib/chef/provider/service/systemd.rb +188 -188
  868. data/lib/chef/provider/service/upstart.rb +261 -261
  869. data/lib/chef/provider/service/windows.rb +313 -313
  870. data/lib/chef/provider/subversion.rb +233 -233
  871. data/lib/chef/provider/support/yum_repo.erb +132 -132
  872. data/lib/chef/provider/systemd_unit.rb +240 -240
  873. data/lib/chef/provider/template.rb +65 -65
  874. data/lib/chef/provider/template/content.rb +70 -70
  875. data/lib/chef/provider/template_finder.rb +62 -62
  876. data/lib/chef/provider/user.rb +220 -220
  877. data/lib/chef/provider/user/aix.rb +99 -99
  878. data/lib/chef/provider/user/dscl.rb +719 -719
  879. data/lib/chef/provider/user/linux.rb +125 -125
  880. data/lib/chef/provider/user/pw.rb +111 -111
  881. data/lib/chef/provider/user/solaris.rb +129 -129
  882. data/lib/chef/provider/user/useradd.rb +158 -158
  883. data/lib/chef/provider/user/windows.rb +125 -125
  884. data/lib/chef/provider/whyrun_safe_ruby_block.rb +32 -32
  885. data/lib/chef/provider/windows_script.rb +75 -75
  886. data/lib/chef/provider/yum_repository.rb +120 -120
  887. data/lib/chef/provider_resolver.rb +172 -172
  888. data/lib/chef/providers.rb +152 -152
  889. data/lib/chef/recipe.rb +108 -108
  890. data/lib/chef/request_id.rb +37 -37
  891. data/lib/chef/reserved_names.rb +9 -9
  892. data/lib/chef/resource.rb +1626 -1626
  893. data/lib/chef/resource/action_class.rb +94 -94
  894. data/lib/chef/resource/apt_package.rb +32 -32
  895. data/lib/chef/resource/apt_repository.rb +46 -46
  896. data/lib/chef/resource/apt_update.rb +33 -33
  897. data/lib/chef/resource/bash.rb +33 -33
  898. data/lib/chef/resource/batch.rb +33 -33
  899. data/lib/chef/resource/bff_package.rb +27 -27
  900. data/lib/chef/resource/breakpoint.rb +32 -32
  901. data/lib/chef/resource/cab_package.rb +44 -44
  902. data/lib/chef/resource/chef_gem.rb +50 -50
  903. data/lib/chef/resource/chocolatey_package.rb +40 -40
  904. data/lib/chef/resource/conditional.rb +135 -135
  905. data/lib/chef/resource/conditional_action_not_nothing.rb +48 -48
  906. data/lib/chef/resource/cookbook_file.rb +49 -49
  907. data/lib/chef/resource/cron.rb +216 -216
  908. data/lib/chef/resource/csh.rb +33 -33
  909. data/lib/chef/resource/deploy.rb +443 -443
  910. data/lib/chef/resource/deploy_revision.rb +31 -31
  911. data/lib/chef/resource/directory.rb +62 -62
  912. data/lib/chef/resource/dnf_package.rb +74 -74
  913. data/lib/chef/resource/dpkg_package.rb +30 -30
  914. data/lib/chef/resource/dsc_resource.rb +129 -129
  915. data/lib/chef/resource/dsc_script.rb +140 -140
  916. data/lib/chef/resource/easy_install_package.rb +32 -32
  917. data/lib/chef/resource/env.rb +65 -65
  918. data/lib/chef/resource/erl_call.rb +85 -85
  919. data/lib/chef/resource/execute.rb +236 -236
  920. data/lib/chef/resource/file.rb +88 -88
  921. data/lib/chef/resource/file/verification.rb +130 -130
  922. data/lib/chef/resource/file/verification/systemd_unit.rb +67 -67
  923. data/lib/chef/resource/freebsd_package.rb +62 -62
  924. data/lib/chef/resource/gem_package.rb +41 -41
  925. data/lib/chef/resource/git.rb +44 -44
  926. data/lib/chef/resource/group.rb +102 -102
  927. data/lib/chef/resource/homebrew_package.rb +34 -34
  928. data/lib/chef/resource/http_request.rb +66 -66
  929. data/lib/chef/resource/ifconfig.rb +147 -147
  930. data/lib/chef/resource/ips_package.rb +34 -34
  931. data/lib/chef/resource/ksh.rb +32 -32
  932. data/lib/chef/resource/launchd.rb +156 -156
  933. data/lib/chef/resource/link.rb +107 -107
  934. data/lib/chef/resource/log.rb +76 -76
  935. data/lib/chef/resource/lwrp_base.rb +124 -124
  936. data/lib/chef/resource/macosx_service.rb +58 -58
  937. data/lib/chef/resource/macports_package.rb +27 -27
  938. data/lib/chef/resource/mdadm.rb +112 -112
  939. data/lib/chef/resource/mount.rb +187 -187
  940. data/lib/chef/resource/msu_package.rb +47 -47
  941. data/lib/chef/resource/ohai.rb +33 -33
  942. data/lib/chef/resource/openbsd_package.rb +35 -35
  943. data/lib/chef/resource/osx_profile.rb +74 -74
  944. data/lib/chef/resource/package.rb +47 -47
  945. data/lib/chef/resource/pacman_package.rb +28 -28
  946. data/lib/chef/resource/paludis_package.rb +33 -33
  947. data/lib/chef/resource/perl.rb +32 -32
  948. data/lib/chef/resource/portage_package.rb +32 -32
  949. data/lib/chef/resource/powershell_package.rb +41 -41
  950. data/lib/chef/resource/powershell_script.rb +50 -50
  951. data/lib/chef/resource/python.rb +31 -31
  952. data/lib/chef/resource/reboot.rb +48 -48
  953. data/lib/chef/resource/registry_key.rb +144 -144
  954. data/lib/chef/resource/remote_directory.rb +122 -122
  955. data/lib/chef/resource/remote_file.rb +158 -158
  956. data/lib/chef/resource/resource_notification.rb +122 -122
  957. data/lib/chef/resource/route.rb +137 -137
  958. data/lib/chef/resource/rpm_package.rb +32 -32
  959. data/lib/chef/resource/ruby.rb +31 -31
  960. data/lib/chef/resource/ruby_block.rb +53 -53
  961. data/lib/chef/resource/scm.rb +179 -179
  962. data/lib/chef/resource/script.rb +74 -74
  963. data/lib/chef/resource/service.rb +217 -217
  964. data/lib/chef/resource/smartos_package.rb +29 -29
  965. data/lib/chef/resource/solaris_package.rb +31 -31
  966. data/lib/chef/resource/subversion.rb +44 -44
  967. data/lib/chef/resource/systemd_unit.rb +63 -63
  968. data/lib/chef/resource/template.rb +215 -215
  969. data/lib/chef/resource/timestamped_deploy.rb +26 -26
  970. data/lib/chef/resource/user.rb +174 -174
  971. data/lib/chef/resource/user/aix_user.rb +31 -31
  972. data/lib/chef/resource/user/dscl_user.rb +31 -31
  973. data/lib/chef/resource/user/linux_user.rb +41 -41
  974. data/lib/chef/resource/user/pw_user.rb +31 -31
  975. data/lib/chef/resource/user/solaris_user.rb +31 -31
  976. data/lib/chef/resource/user/windows_user.rb +31 -31
  977. data/lib/chef/resource/whyrun_safe_ruby_block.rb +24 -24
  978. data/lib/chef/resource/windows_package.rb +55 -55
  979. data/lib/chef/resource/windows_script.rb +65 -65
  980. data/lib/chef/resource/windows_service.rb +71 -71
  981. data/lib/chef/resource/yum_package.rb +61 -61
  982. data/lib/chef/resource/yum_repository.rb +78 -78
  983. data/lib/chef/resource/zypper_package.rb +28 -28
  984. data/lib/chef/resource_builder.rb +156 -156
  985. data/lib/chef/resource_collection.rb +136 -136
  986. data/lib/chef/resource_collection/resource_collection_serialization.rb +59 -59
  987. data/lib/chef/resource_collection/resource_list.rb +100 -100
  988. data/lib/chef/resource_collection/resource_set.rb +173 -173
  989. data/lib/chef/resource_collection/stepable_iterator.rb +122 -122
  990. data/lib/chef/resource_definition.rb +68 -68
  991. data/lib/chef/resource_definition_list.rb +38 -38
  992. data/lib/chef/resource_reporter.rb +338 -338
  993. data/lib/chef/resource_resolver.rb +184 -184
  994. data/lib/chef/resources.rb +101 -101
  995. data/lib/chef/rest.rb +210 -210
  996. data/lib/chef/role.rb +280 -280
  997. data/lib/chef/run_context.rb +681 -681
  998. data/lib/chef/run_context/cookbook_compiler.rb +291 -291
  999. data/lib/chef/run_list.rb +168 -168
  1000. data/lib/chef/run_list/run_list_expansion.rb +234 -234
  1001. data/lib/chef/run_list/run_list_item.rb +98 -98
  1002. data/lib/chef/run_list/versioned_recipe_list.rb +102 -102
  1003. data/lib/chef/run_lock.rb +197 -197
  1004. data/lib/chef/run_status.rb +125 -125
  1005. data/lib/chef/runner.rb +143 -143
  1006. data/lib/chef/sandbox.rb +20 -20
  1007. data/lib/chef/scan_access_control.rb +138 -138
  1008. data/lib/chef/search/query.rb +183 -183
  1009. data/lib/chef/server_api.rb +80 -80
  1010. data/lib/chef/server_api_versions.rb +40 -40
  1011. data/lib/chef/shell.rb +327 -327
  1012. data/lib/chef/shell/ext.rb +593 -593
  1013. data/lib/chef/shell/model_wrapper.rb +120 -120
  1014. data/lib/chef/shell/shell_session.rb +299 -299
  1015. data/lib/chef/shell_out.rb +13 -13
  1016. data/lib/chef/tasks/chef_repo.rake +200 -200
  1017. data/lib/chef/user.rb +197 -197
  1018. data/lib/chef/user_v1.rb +328 -328
  1019. data/lib/chef/util/backup.rb +94 -94
  1020. data/lib/chef/util/diff.rb +184 -184
  1021. data/lib/chef/util/dsc/configuration_generator.rb +139 -139
  1022. data/lib/chef/util/dsc/lcm_output_parser.rb +192 -192
  1023. data/lib/chef/util/dsc/local_configuration_manager.rb +151 -151
  1024. data/lib/chef/util/dsc/resource_info.rb +26 -26
  1025. data/lib/chef/util/dsc/resource_store.rb +109 -109
  1026. data/lib/chef/util/editor.rb +91 -91
  1027. data/lib/chef/util/file_edit.rb +100 -100
  1028. data/lib/chef/util/path_helper.rb +25 -25
  1029. data/lib/chef/util/powershell/cmdlet.rb +173 -173
  1030. data/lib/chef/util/powershell/cmdlet_result.rb +61 -61
  1031. data/lib/chef/util/powershell/ps_credential.rb +41 -41
  1032. data/lib/chef/util/selinux.rb +92 -92
  1033. data/lib/chef/util/threaded_job_queue.rb +61 -61
  1034. data/lib/chef/util/windows.rb +24 -24
  1035. data/lib/chef/util/windows/net_group.rb +72 -72
  1036. data/lib/chef/util/windows/net_use.rb +81 -81
  1037. data/lib/chef/util/windows/net_user.rb +164 -164
  1038. data/lib/chef/util/windows/volume.rb +53 -53
  1039. data/lib/chef/version.rb +34 -34
  1040. data/lib/chef/version/platform.rb +44 -44
  1041. data/lib/chef/version_class.rb +75 -75
  1042. data/lib/chef/version_constraint.rb +118 -118
  1043. data/lib/chef/version_constraint/platform.rb +26 -26
  1044. data/lib/chef/whitelist.rb +86 -86
  1045. data/lib/chef/win32/api.rb +372 -372
  1046. data/lib/chef/win32/api/crypto.rb +63 -63
  1047. data/lib/chef/win32/api/error.rb +953 -953
  1048. data/lib/chef/win32/api/file.rb +619 -619
  1049. data/lib/chef/win32/api/installer.rb +165 -165
  1050. data/lib/chef/win32/api/memory.rb +105 -105
  1051. data/lib/chef/win32/api/net.rb +312 -312
  1052. data/lib/chef/win32/api/process.rb +42 -42
  1053. data/lib/chef/win32/api/psapi.rb +51 -51
  1054. data/lib/chef/win32/api/registry.rb +51 -51
  1055. data/lib/chef/win32/api/security.rb +460 -460
  1056. data/lib/chef/win32/api/synchronization.rb +89 -89
  1057. data/lib/chef/win32/api/system.rb +238 -238
  1058. data/lib/chef/win32/api/unicode.rb +135 -135
  1059. data/lib/chef/win32/crypto.rb +50 -50
  1060. data/lib/chef/win32/error.rb +86 -86
  1061. data/lib/chef/win32/eventlog.rb +31 -31
  1062. data/lib/chef/win32/file.rb +216 -216
  1063. data/lib/chef/win32/file/info.rb +99 -99
  1064. data/lib/chef/win32/file/version_info.rb +93 -93
  1065. data/lib/chef/win32/handle.rb +55 -55
  1066. data/lib/chef/win32/memory.rb +101 -101
  1067. data/lib/chef/win32/mutex.rb +116 -116
  1068. data/lib/chef/win32/net.rb +311 -311
  1069. data/lib/chef/win32/process.rb +97 -97
  1070. data/lib/chef/win32/registry.rb +374 -374
  1071. data/lib/chef/win32/security.rb +665 -665
  1072. data/lib/chef/win32/security/ace.rb +123 -123
  1073. data/lib/chef/win32/security/acl.rb +103 -103
  1074. data/lib/chef/win32/security/securable_object.rb +109 -109
  1075. data/lib/chef/win32/security/security_descriptor.rb +93 -93
  1076. data/lib/chef/win32/security/sid.rb +304 -304
  1077. data/lib/chef/win32/security/token.rb +72 -72
  1078. data/lib/chef/win32/system.rb +62 -62
  1079. data/lib/chef/win32/unicode.rb +60 -60
  1080. data/lib/chef/win32/version.rb +158 -158
  1081. data/lib/chef/workstation_config_loader.rb +23 -23
  1082. data/spec/data/apt/chef-integration-test-1.0/debian/changelog +5 -5
  1083. data/spec/data/apt/chef-integration-test-1.0/debian/compat +1 -1
  1084. data/spec/data/apt/chef-integration-test-1.0/debian/control +13 -13
  1085. data/spec/data/apt/chef-integration-test-1.0/debian/copyright +34 -34
  1086. data/spec/data/apt/chef-integration-test-1.0/debian/files +1 -1
  1087. data/spec/data/apt/chef-integration-test-1.0/debian/rules +13 -13
  1088. data/spec/data/apt/chef-integration-test-1.0/debian/source/format +1 -1
  1089. data/spec/data/apt/chef-integration-test-1.1/debian/changelog +11 -11
  1090. data/spec/data/apt/chef-integration-test-1.1/debian/compat +1 -1
  1091. data/spec/data/apt/chef-integration-test-1.1/debian/control +13 -13
  1092. data/spec/data/apt/chef-integration-test-1.1/debian/copyright +34 -34
  1093. data/spec/data/apt/chef-integration-test-1.1/debian/files +1 -1
  1094. data/spec/data/apt/chef-integration-test-1.1/debian/rules +13 -13
  1095. data/spec/data/apt/chef-integration-test-1.1/debian/source/format +1 -1
  1096. data/spec/data/apt/chef-integration-test2-1.0/debian/changelog +5 -5
  1097. data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2.debhelper.log +45 -45
  1098. data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2.substvars +1 -1
  1099. data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2/DEBIAN/conffiles +1 -1
  1100. data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2/DEBIAN/control +10 -10
  1101. data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2/DEBIAN/md5sums +1 -1
  1102. data/spec/data/apt/chef-integration-test2-1.0/debian/compat +1 -1
  1103. data/spec/data/apt/chef-integration-test2-1.0/debian/conffiles +1 -1
  1104. data/spec/data/apt/chef-integration-test2-1.0/debian/control +13 -13
  1105. data/spec/data/apt/chef-integration-test2-1.0/debian/copyright +34 -34
  1106. data/spec/data/apt/chef-integration-test2-1.0/debian/files +1 -1
  1107. data/spec/data/apt/chef-integration-test2-1.0/debian/rules +13 -13
  1108. data/spec/data/apt/chef-integration-test2-1.0/debian/source/format +1 -1
  1109. data/spec/data/apt/chef-integration-test2_1.0-1.dsc +18 -18
  1110. data/spec/data/apt/chef-integration-test2_1.0-1_amd64.build +91 -91
  1111. data/spec/data/apt/chef-integration-test2_1.0-1_amd64.changes +31 -31
  1112. data/spec/data/apt/chef-integration-test_1.0-1_amd64.changes +22 -22
  1113. data/spec/data/apt/chef-integration-test_1.1-1_amd64.changes +22 -22
  1114. data/spec/data/apt/var/www/apt/conf/distributions +7 -7
  1115. data/spec/data/apt/var/www/apt/conf/incoming +4 -4
  1116. data/spec/data/apt/var/www/apt/conf/pulls +3 -3
  1117. data/spec/data/apt/var/www/apt/db/version +4 -4
  1118. data/spec/data/apt/var/www/apt/dists/sid/Release +19 -19
  1119. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages +16 -16
  1120. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Release +5 -5
  1121. data/spec/data/bootstrap/encrypted_data_bag_secret +1 -1
  1122. data/spec/data/bootstrap/no_proxy.erb +2 -2
  1123. data/spec/data/bootstrap/secret.erb +9 -9
  1124. data/spec/data/bootstrap/test-hints.erb +12 -12
  1125. data/spec/data/bootstrap/test.erb +1 -1
  1126. data/spec/data/cb_version_cookbooks/tatft/README.rdoc +2 -2
  1127. data/spec/data/cb_version_cookbooks/tatft/attributes/default.rb +1 -1
  1128. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-600hhz-0 +1 -1
  1129. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ahd2gq-0 +1 -1
  1130. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-api8ux-0 +1 -1
  1131. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-b0r1m1-0 +1 -1
  1132. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-bfygsi-0 +1 -1
  1133. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-el14l6-0 +1 -1
  1134. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ivrl3y-0 +1 -1
  1135. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-kkbs85-0 +1 -1
  1136. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ory1ux-0 +1 -1
  1137. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-pgsq76-0 +1 -1
  1138. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ra8uim-0 +1 -1
  1139. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-t7k1g-0 +1 -1
  1140. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-t8g0sv-0 +1 -1
  1141. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ufy6g3-0 +1 -1
  1142. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-x2d6j9-0 +1 -1
  1143. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-xi0l6h-0 +1 -1
  1144. data/spec/data/client.d_00/00-foo.rb +2 -2
  1145. data/spec/data/client.d_00/01-bar.rb +1 -1
  1146. data/spec/data/client.d_00/bar +1 -1
  1147. data/spec/data/client.d_01/foo/bar.rb +1 -1
  1148. data/spec/data/client.d_02/foo.rb/foo.txt +1 -1
  1149. data/spec/data/config.rb +6 -6
  1150. data/spec/data/cookbooks/angrybash/metadata.rb +2 -2
  1151. data/spec/data/cookbooks/angrybash/recipes/default.rb +8 -8
  1152. data/spec/data/cookbooks/apache2/files/default/apache2_module_conf_generate.pl +2 -2
  1153. data/spec/data/cookbooks/apache2/metadata.rb +2 -2
  1154. data/spec/data/cookbooks/apache2/recipes/default.rb +2 -2
  1155. data/spec/data/cookbooks/borken/metadata.rb +2 -2
  1156. data/spec/data/cookbooks/borken/recipes/default.rb +1 -1
  1157. data/spec/data/cookbooks/borken/templates/default/borken.erb +1 -1
  1158. data/spec/data/cookbooks/chefignore +8 -8
  1159. data/spec/data/cookbooks/ignorken/files/default/not_me.rb +2 -2
  1160. data/spec/data/cookbooks/ignorken/metadata.rb +2 -2
  1161. data/spec/data/cookbooks/ignorken/recipes/ignoreme.rb +1 -1
  1162. data/spec/data/cookbooks/ignorken/templates/ubuntu-12.10/not_me.rb +2 -2
  1163. data/spec/data/cookbooks/java/files/default/java.response +1 -1
  1164. data/spec/data/cookbooks/java/metadata.rb +2 -2
  1165. data/spec/data/cookbooks/name-mismatch-versionnumber/README.md +4 -4
  1166. data/spec/data/cookbooks/name-mismatch-versionnumber/metadata.rb +8 -8
  1167. data/spec/data/cookbooks/name-mismatch-versionnumber/recipes/default.rb +8 -8
  1168. data/spec/data/cookbooks/openldap/attributes/default.rb +16 -16
  1169. data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
  1170. data/spec/data/cookbooks/openldap/definitions/client.rb +5 -5
  1171. data/spec/data/cookbooks/openldap/definitions/server.rb +5 -5
  1172. data/spec/data/cookbooks/openldap/files/default/.dotfile +1 -1
  1173. data/spec/data/cookbooks/openldap/files/default/remotedir/.a_dotdir/.a_dotfile_in_a_dotdir +1 -1
  1174. data/spec/data/cookbooks/openldap/files/default/remotedir/not_a_template.erb +2 -2
  1175. data/spec/data/cookbooks/openldap/files/default/remotedir/remote_dir_file1.txt +2 -2
  1176. data/spec/data/cookbooks/openldap/files/default/remotedir/remote_dir_file2.txt +2 -2
  1177. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/.a_dotfile +1 -1
  1178. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/remote_subdir_file1.txt +2 -2
  1179. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/remote_subdir_file2.txt +2 -2
  1180. data/spec/data/cookbooks/openldap/files/default/remotedir/subdir_with_no_file_just_a_subsubdir/the_subsubdir/some_file.txt +3 -3
  1181. data/spec/data/cookbooks/openldap/libraries/openldap.rb +4 -4
  1182. data/spec/data/cookbooks/openldap/libraries/openldap/version.rb +3 -3
  1183. data/spec/data/cookbooks/openldap/metadata.rb +8 -8
  1184. data/spec/data/cookbooks/openldap/recipes/default.rb +4 -4
  1185. data/spec/data/cookbooks/openldap/recipes/gigantor.rb +3 -3
  1186. data/spec/data/cookbooks/openldap/recipes/one.rb +15 -15
  1187. data/spec/data/cookbooks/openldap/recipes/return.rb +2 -2
  1188. data/spec/data/cookbooks/openldap/templates/default/helper_test.erb +1 -1
  1189. data/spec/data/cookbooks/openldap/templates/default/helpers.erb +14 -14
  1190. data/spec/data/cookbooks/openldap/templates/default/helpers_via_partial_test.erb +1 -1
  1191. data/spec/data/cookbooks/openldap/templates/default/nested_openldap_partials.erb +1 -1
  1192. data/spec/data/cookbooks/openldap/templates/default/nested_partial.erb +1 -1
  1193. data/spec/data/cookbooks/openldap/templates/default/no_windows_line_endings.erb +4 -4
  1194. data/spec/data/cookbooks/openldap/templates/default/openldap_variable_stuff.conf.erb +1 -1
  1195. data/spec/data/cookbooks/openldap/templates/default/test.erb +1 -1
  1196. data/spec/data/cookbooks/preseed/files/default/preseed-file.seed +1 -1
  1197. data/spec/data/cookbooks/preseed/files/default/preseed-template.seed +4 -4
  1198. data/spec/data/cookbooks/preseed/metadata.rb +2 -2
  1199. data/spec/data/cookbooks/preseed/templates/default/preseed-template-variables.seed +1 -1
  1200. data/spec/data/cookbooks/preseed/templates/default/preseed-template.seed +1 -1
  1201. data/spec/data/cookbooks/supports-platform-constraints/metadata.rb +5 -5
  1202. data/spec/data/definitions/test.rb +4 -4
  1203. data/spec/data/environment-config.rb +4 -4
  1204. data/spec/data/file-providers-method-snapshot-chef-11-4.json +127 -127
  1205. data/spec/data/fileedit/hosts +4 -4
  1206. data/spec/data/incomplete-metadata-chef-repo/incomplete-metadata/README.md +4 -4
  1207. data/spec/data/incomplete-metadata-chef-repo/incomplete-metadata/metadata.rb +13 -13
  1208. data/spec/data/incomplete-metadata-chef-repo/incomplete-metadata/recipes/default.rb +8 -8
  1209. data/spec/data/invalid-metadata-chef-repo/invalid-metadata/README.md +4 -4
  1210. data/spec/data/invalid-metadata-chef-repo/invalid-metadata/metadata.rb +9 -9
  1211. data/spec/data/invalid-metadata-chef-repo/invalid-metadata/recipes/default.rb +8 -8
  1212. data/spec/data/kitchen/chefignore +6 -6
  1213. data/spec/data/kitchen/openldap/attributes/default.rb +3 -3
  1214. data/spec/data/kitchen/openldap/attributes/robinson.rb +2 -2
  1215. data/spec/data/kitchen/openldap/definitions/client.rb +3 -3
  1216. data/spec/data/kitchen/openldap/definitions/drewbarrymore.rb +2 -2
  1217. data/spec/data/kitchen/openldap/recipes/gigantor.rb +2 -2
  1218. data/spec/data/kitchen/openldap/recipes/ignoreme.rb +2 -2
  1219. data/spec/data/kitchen/openldap/recipes/woot.rb +3 -3
  1220. data/spec/data/knife_subcommand/test_explicit_category.rb +6 -6
  1221. data/spec/data/knife_subcommand/test_name_mapping.rb +4 -4
  1222. data/spec/data/knife_subcommand/test_yourself.rb +21 -21
  1223. data/spec/data/lwrp/providers/buck_passer.rb +28 -28
  1224. data/spec/data/lwrp/providers/buck_passer_2.rb +26 -26
  1225. data/spec/data/lwrp/providers/embedded_resource_accesses_providers_scope.rb +28 -28
  1226. data/spec/data/lwrp/providers/inline_compiler.rb +26 -26
  1227. data/spec/data/lwrp/providers/monkey_name_printer.rb +5 -5
  1228. data/spec/data/lwrp/providers/paint_drying_watcher.rb +7 -7
  1229. data/spec/data/lwrp/providers/thumb_twiddler.rb +7 -7
  1230. data/spec/data/lwrp/resources/bar.rb +2 -2
  1231. data/spec/data/lwrp/resources/foo.rb +4 -4
  1232. data/spec/data/lwrp/resources_with_default_attributes/nodeattr.rb +1 -1
  1233. data/spec/data/lwrp_override/providers/buck_passer.rb +5 -5
  1234. data/spec/data/lwrp_override/resources/foo.rb +10 -10
  1235. data/spec/data/mac_users/10.7-8.plist.xml +559 -559
  1236. data/spec/data/mac_users/10.7-8.shadow.xml +11 -11
  1237. data/spec/data/mac_users/10.7.plist.xml +559 -559
  1238. data/spec/data/mac_users/10.7.shadow.xml +11 -11
  1239. data/spec/data/mac_users/10.8.plist.xml +559 -559
  1240. data/spec/data/mac_users/10.8.shadow.xml +21 -21
  1241. data/spec/data/mac_users/10.9.plist.xml +560 -560
  1242. data/spec/data/mac_users/10.9.shadow.xml +21 -21
  1243. data/spec/data/metadata/quick_start/metadata.rb +19 -19
  1244. data/spec/data/nested.json +2 -2
  1245. data/spec/data/nodes/default.rb +15 -15
  1246. data/spec/data/nodes/test.example.com.rb +17 -17
  1247. data/spec/data/nodes/test.rb +15 -15
  1248. data/spec/data/null_config.rb +1 -1
  1249. data/spec/data/object_loader/environments/test.json +7 -7
  1250. data/spec/data/object_loader/environments/test.rb +2 -2
  1251. data/spec/data/object_loader/environments/test_json_class.json +8 -8
  1252. data/spec/data/object_loader/nodes/test.json +7 -7
  1253. data/spec/data/object_loader/nodes/test.rb +2 -2
  1254. data/spec/data/object_loader/nodes/test_json_class.json +8 -8
  1255. data/spec/data/object_loader/roles/test.json +7 -7
  1256. data/spec/data/object_loader/roles/test.rb +2 -2
  1257. data/spec/data/object_loader/roles/test_json_class.json +8 -8
  1258. data/spec/data/partial_one.erb +1 -1
  1259. data/spec/data/prefer_metadata_json/metadata.json +51 -51
  1260. data/spec/data/prefer_metadata_json/metadata.rb +6 -6
  1261. data/spec/data/recipes/test.rb +7 -7
  1262. data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +2 -2
  1263. data/spec/data/run_context/cookbooks/circular-dep1/definitions/circular_dep1_res.rb +1 -1
  1264. data/spec/data/run_context/cookbooks/circular-dep1/libraries/lib.rb +2 -2
  1265. data/spec/data/run_context/cookbooks/circular-dep1/metadata.rb +2 -2
  1266. data/spec/data/run_context/cookbooks/circular-dep1/providers/provider.rb +1 -1
  1267. data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +1 -1
  1268. data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +2 -2
  1269. data/spec/data/run_context/cookbooks/circular-dep2/definitions/circular_dep2_res.rb +1 -1
  1270. data/spec/data/run_context/cookbooks/circular-dep2/libraries/lib.rb +2 -2
  1271. data/spec/data/run_context/cookbooks/circular-dep2/metadata.rb +2 -2
  1272. data/spec/data/run_context/cookbooks/circular-dep2/providers/provider.rb +1 -1
  1273. data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +1 -1
  1274. data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -2
  1275. data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -2
  1276. data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +2 -2
  1277. data/spec/data/run_context/cookbooks/dependency1/definitions/dependency1_res.rb +1 -1
  1278. data/spec/data/run_context/cookbooks/dependency1/libraries/lib.rb +2 -2
  1279. data/spec/data/run_context/cookbooks/dependency1/providers/provider.rb +1 -1
  1280. data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +1 -1
  1281. data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +2 -2
  1282. data/spec/data/run_context/cookbooks/dependency2/definitions/dependency2_res.rb +1 -1
  1283. data/spec/data/run_context/cookbooks/dependency2/libraries/lib.rb +2 -2
  1284. data/spec/data/run_context/cookbooks/dependency2/providers/provider.rb +1 -1
  1285. data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +1 -1
  1286. data/spec/data/run_context/cookbooks/include/recipes/default.rb +24 -24
  1287. data/spec/data/run_context/cookbooks/include/recipes/includee.rb +3 -3
  1288. data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +2 -2
  1289. data/spec/data/run_context/cookbooks/no-default-attr/definitions/no_default-attr_res.rb +1 -1
  1290. data/spec/data/run_context/cookbooks/no-default-attr/providers/provider.rb +1 -1
  1291. data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +1 -1
  1292. data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +2 -2
  1293. data/spec/data/run_context/cookbooks/test-with-circular-deps/definitions/test_with-circular-deps_res.rb +1 -1
  1294. data/spec/data/run_context/cookbooks/test-with-circular-deps/libraries/lib.rb +2 -2
  1295. data/spec/data/run_context/cookbooks/test-with-circular-deps/metadata.rb +2 -2
  1296. data/spec/data/run_context/cookbooks/test-with-circular-deps/providers/provider.rb +1 -1
  1297. data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +1 -1
  1298. data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +2 -2
  1299. data/spec/data/run_context/cookbooks/test-with-deps/definitions/test_with-deps_res.rb +1 -1
  1300. data/spec/data/run_context/cookbooks/test-with-deps/libraries/lib.rb +1 -1
  1301. data/spec/data/run_context/cookbooks/test-with-deps/metadata.rb +3 -3
  1302. data/spec/data/run_context/cookbooks/test-with-deps/providers/provider.rb +1 -1
  1303. data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +1 -1
  1304. data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -1
  1305. data/spec/data/run_context/cookbooks/test/definitions/new_animals.rb +9 -9
  1306. data/spec/data/run_context/cookbooks/test/definitions/new_cat.rb +5 -5
  1307. data/spec/data/run_context/cookbooks/test/definitions/test_res.rb +1 -1
  1308. data/spec/data/run_context/cookbooks/test/providers/provider.rb +1 -1
  1309. data/spec/data/run_context/cookbooks/test/recipes/default.rb +5 -5
  1310. data/spec/data/run_context/cookbooks/test/recipes/one.rb +7 -7
  1311. data/spec/data/run_context/cookbooks/test/recipes/two.rb +7 -7
  1312. data/spec/data/run_context/cookbooks/test/resources/resource.rb +1 -1
  1313. data/spec/data/run_context/nodes/run_context.rb +5 -5
  1314. data/spec/data/sample_msu1.xml +10 -10
  1315. data/spec/data/sample_msu2.xml +14 -14
  1316. data/spec/data/sample_msu3.xml +16 -16
  1317. data/spec/data/search_queries_to_transform.txt +98 -98
  1318. data/spec/data/shef-config.rb +10 -10
  1319. data/spec/data/ssl/5e707473.0 +18 -18
  1320. data/spec/data/ssl/chef-rspec.cert +27 -27
  1321. data/spec/data/ssl/chef-rspec.key +27 -27
  1322. data/spec/data/ssl/key.pem +15 -15
  1323. data/spec/data/ssl/private_key.pem +27 -27
  1324. data/spec/data/ssl/private_key_with_whitespace.pem +32 -32
  1325. data/spec/data/standalone_cookbook/chefignore +9 -9
  1326. data/spec/data/standalone_cookbook/recipes/default.rb +2 -2
  1327. data/spec/data/trusted_certs/example.crt +22 -22
  1328. data/spec/data/trusted_certs/example_no_cn.crt +36 -36
  1329. data/spec/data/trusted_certs/intermediate.pem +27 -27
  1330. data/spec/data/trusted_certs/opscode.pem +57 -57
  1331. data/spec/data/trusted_certs/root.pem +22 -22
  1332. data/spec/functional/application_spec.rb +58 -58
  1333. data/spec/functional/assets/chefinittest +36 -34
  1334. data/spec/functional/assets/testchefsubsys +10 -10
  1335. data/spec/functional/assets/yumrepo/repodata/repomd.xml +55 -55
  1336. data/spec/functional/audit/rspec_formatter_spec.rb +54 -54
  1337. data/spec/functional/audit/runner_spec.rb +121 -121
  1338. data/spec/functional/dsl/reboot_pending_spec.rb +106 -106
  1339. data/spec/functional/dsl/registry_helper_spec.rb +61 -61
  1340. data/spec/functional/event_loggers/windows_eventlog_spec.rb +104 -104
  1341. data/spec/functional/file_content_management/deploy_strategies_spec.rb +229 -229
  1342. data/spec/functional/http/simple_spec.rb +140 -140
  1343. data/spec/functional/knife/configure_spec.rb +33 -33
  1344. data/spec/functional/knife/cookbook_delete_spec.rb +156 -156
  1345. data/spec/functional/knife/exec_spec.rb +55 -55
  1346. data/spec/functional/knife/rehash_spec.rb +39 -39
  1347. data/spec/functional/knife/smoke_test.rb +42 -42
  1348. data/spec/functional/knife/ssh_spec.rb +284 -284
  1349. data/spec/functional/mixin/powershell_out_spec.rb +43 -59
  1350. data/spec/functional/mixin/shell_out_spec.rb +48 -48
  1351. data/spec/functional/notifications_spec.rb +238 -238
  1352. data/spec/functional/provider/remote_file/cache_control_data_spec.rb +100 -100
  1353. data/spec/functional/provider/whyrun_safe_ruby_block_spec.rb +51 -51
  1354. data/spec/functional/rebooter_spec.rb +105 -105
  1355. data/spec/functional/resource/aix_service_spec.rb +138 -138
  1356. data/spec/functional/resource/aixinit_service_spec.rb +211 -211
  1357. data/spec/functional/resource/base.rb +28 -28
  1358. data/spec/functional/resource/bash_spec.rb +88 -88
  1359. data/spec/functional/resource/batch_spec.rb +34 -34
  1360. data/spec/functional/resource/bff_spec.rb +120 -120
  1361. data/spec/functional/resource/chocolatey_package_spec.rb +125 -125
  1362. data/spec/functional/resource/cookbook_file_spec.rb +81 -81
  1363. data/spec/functional/resource/cron_spec.rb +179 -179
  1364. data/spec/functional/resource/deploy_revision_spec.rb +881 -881
  1365. data/spec/functional/resource/directory_spec.rb +43 -43
  1366. data/spec/functional/resource/dnf_package_spec.rb +686 -686
  1367. data/spec/functional/resource/dpkg_package_spec.rb +339 -339
  1368. data/spec/functional/resource/dsc_resource_spec.rb +90 -90
  1369. data/spec/functional/resource/dsc_script_spec.rb +484 -484
  1370. data/spec/functional/resource/env_spec.rb +192 -192
  1371. data/spec/functional/resource/execute_spec.rb +171 -171
  1372. data/spec/functional/resource/file_spec.rb +167 -167
  1373. data/spec/functional/resource/git_spec.rb +257 -257
  1374. data/spec/functional/resource/group_spec.rb +488 -488
  1375. data/spec/functional/resource/ifconfig_spec.rb +171 -171
  1376. data/spec/functional/resource/link_spec.rb +703 -703
  1377. data/spec/functional/resource/mount_spec.rb +207 -207
  1378. data/spec/functional/resource/msu_package_spec.rb +84 -84
  1379. data/spec/functional/resource/ohai_spec.rb +62 -62
  1380. data/spec/functional/resource/package_spec.rb +386 -386
  1381. data/spec/functional/resource/powershell_script_spec.rb +601 -601
  1382. data/spec/functional/resource/reboot_spec.rb +103 -103
  1383. data/spec/functional/resource/registry_spec.rb +676 -676
  1384. data/spec/functional/resource/remote_directory_spec.rb +220 -220
  1385. data/spec/functional/resource/remote_file_spec.rb +249 -249
  1386. data/spec/functional/resource/rpm_spec.rb +120 -120
  1387. data/spec/functional/resource/template_spec.rb +212 -212
  1388. data/spec/functional/resource/user/dscl_spec.rb +196 -196
  1389. data/spec/functional/resource/user/useradd_spec.rb +709 -709
  1390. data/spec/functional/resource/user/windows_spec.rb +133 -133
  1391. data/spec/functional/resource/windows_package_spec.rb +168 -168
  1392. data/spec/functional/resource/windows_service_spec.rb +102 -102
  1393. data/spec/functional/rest_spec.rb +95 -95
  1394. data/spec/functional/run_lock_spec.rb +473 -473
  1395. data/spec/functional/shell_spec.rb +148 -148
  1396. data/spec/functional/tiny_server_spec.rb +79 -79
  1397. data/spec/functional/util/path_helper_spec.rb +37 -37
  1398. data/spec/functional/util/powershell/cmdlet_spec.rb +111 -111
  1399. data/spec/functional/version_spec.rb +35 -35
  1400. data/spec/functional/win32/crypto_spec.rb +54 -54
  1401. data/spec/functional/win32/registry_spec.rb +624 -624
  1402. data/spec/functional/win32/security_spec.rb +100 -100
  1403. data/spec/functional/win32/service_manager_spec.rb +220 -220
  1404. data/spec/functional/win32/sid_spec.rb +55 -55
  1405. data/spec/functional/win32/version_info_spec.rb +50 -50
  1406. data/spec/functional/win32/versions_spec.rb +117 -117
  1407. data/spec/integration/client/client_spec.rb +535 -535
  1408. data/spec/integration/client/exit_code_spec.rb +245 -245
  1409. data/spec/integration/client/ipv6_spec.rb +134 -134
  1410. data/spec/integration/knife/chef_fs_data_store_spec.rb +556 -556
  1411. data/spec/integration/knife/chef_repo_path_spec.rb +959 -959
  1412. data/spec/integration/knife/chef_repository_file_system_spec.rb +296 -296
  1413. data/spec/integration/knife/chefignore_spec.rb +300 -300
  1414. data/spec/integration/knife/client_bulk_delete_spec.rb +130 -130
  1415. data/spec/integration/knife/client_create_spec.rb +69 -69
  1416. data/spec/integration/knife/client_delete_spec.rb +63 -63
  1417. data/spec/integration/knife/client_key_create_spec.rb +65 -65
  1418. data/spec/integration/knife/client_key_delete_spec.rb +42 -42
  1419. data/spec/integration/knife/client_key_list_spec.rb +60 -60
  1420. data/spec/integration/knife/client_key_show_spec.rb +44 -44
  1421. data/spec/integration/knife/client_list_spec.rb +48 -48
  1422. data/spec/integration/knife/client_show_spec.rb +36 -36
  1423. data/spec/integration/knife/common_options_spec.rb +155 -155
  1424. data/spec/integration/knife/cookbook_api_ipv6_spec.rb +112 -112
  1425. data/spec/integration/knife/cookbook_bulk_delete_spec.rb +64 -64
  1426. data/spec/integration/knife/cookbook_download_spec.rb +95 -95
  1427. data/spec/integration/knife/cookbook_list_spec.rb +54 -54
  1428. data/spec/integration/knife/cookbook_show_spec.rb +159 -159
  1429. data/spec/integration/knife/cookbook_upload_spec.rb +90 -90
  1430. data/spec/integration/knife/data_bag_create_spec.rb +55 -55
  1431. data/spec/integration/knife/data_bag_delete_spec.rb +58 -58
  1432. data/spec/integration/knife/data_bag_from_file_spec.rb +115 -115
  1433. data/spec/integration/knife/data_bag_list_spec.rb +43 -43
  1434. data/spec/integration/knife/data_bag_show_spec.rb +53 -53
  1435. data/spec/integration/knife/delete_spec.rb +1017 -1017
  1436. data/spec/integration/knife/deps_spec.rb +706 -706
  1437. data/spec/integration/knife/diff_spec.rb +602 -602
  1438. data/spec/integration/knife/download_spec.rb +1333 -1333
  1439. data/spec/integration/knife/environment_compare_spec.rb +74 -74
  1440. data/spec/integration/knife/environment_create_spec.rb +40 -40
  1441. data/spec/integration/knife/environment_delete_spec.rb +36 -36
  1442. data/spec/integration/knife/environment_from_file_spec.rb +115 -115
  1443. data/spec/integration/knife/environment_list_spec.rb +41 -41
  1444. data/spec/integration/knife/environment_show_spec.rb +76 -76
  1445. data/spec/integration/knife/list_spec.rb +1059 -1059
  1446. data/spec/integration/knife/node_bulk_delete_spec.rb +51 -51
  1447. data/spec/integration/knife/node_create_spec.rb +46 -46
  1448. data/spec/integration/knife/node_delete_spec.rb +47 -47
  1449. data/spec/integration/knife/node_environment_set_spec.rb +45 -45
  1450. data/spec/integration/knife/node_from_file_spec.rb +58 -58
  1451. data/spec/integration/knife/node_list_spec.rb +44 -44
  1452. data/spec/integration/knife/node_run_list_add_spec.rb +53 -53
  1453. data/spec/integration/knife/node_run_list_remove_spec.rb +35 -35
  1454. data/spec/integration/knife/node_run_list_set_spec.rb +40 -40
  1455. data/spec/integration/knife/node_show_spec.rb +35 -35
  1456. data/spec/integration/knife/raw_spec.rb +244 -244
  1457. data/spec/integration/knife/redirection_spec.rb +52 -52
  1458. data/spec/integration/knife/role_bulk_delete_spec.rb +51 -51
  1459. data/spec/integration/knife/role_create_spec.rb +40 -40
  1460. data/spec/integration/knife/role_delete_spec.rb +47 -47
  1461. data/spec/integration/knife/role_from_file_spec.rb +95 -95
  1462. data/spec/integration/knife/role_list_spec.rb +44 -44
  1463. data/spec/integration/knife/role_show_spec.rb +50 -50
  1464. data/spec/integration/knife/serve_spec.rb +57 -57
  1465. data/spec/integration/knife/show_spec.rb +167 -167
  1466. data/spec/integration/knife/upload_spec.rb +1548 -1548
  1467. data/spec/integration/recipes/accumulator_spec.rb +232 -232
  1468. data/spec/integration/recipes/lwrp_inline_resources_spec.rb +175 -175
  1469. data/spec/integration/recipes/lwrp_spec.rb +53 -53
  1470. data/spec/integration/recipes/noop_resource_spec.rb +24 -24
  1471. data/spec/integration/recipes/notifies_spec.rb +334 -334
  1472. data/spec/integration/recipes/notifying_block_spec.rb +111 -111
  1473. data/spec/integration/recipes/provider_choice.rb +37 -37
  1474. data/spec/integration/recipes/recipe_dsl_spec.rb +1523 -1523
  1475. data/spec/integration/recipes/remote_directory.rb +74 -74
  1476. data/spec/integration/recipes/resource_action_spec.rb +581 -581
  1477. data/spec/integration/recipes/resource_converge_if_changed_spec.rb +496 -496
  1478. data/spec/integration/recipes/resource_load_spec.rb +208 -208
  1479. data/spec/integration/solo/solo_spec.rb +217 -217
  1480. data/spec/rcov.opts +2 -2
  1481. data/spec/scripts/ssl-serve.rb +47 -47
  1482. data/spec/spec_helper.rb +288 -270
  1483. data/spec/stress/win32/file_spec.rb +37 -37
  1484. data/spec/stress/win32/memory_spec.rb +22 -22
  1485. data/spec/stress/win32/security_spec.rb +69 -69
  1486. data/spec/support/chef_helpers.rb +115 -115
  1487. data/spec/support/key_helpers.rb +104 -104
  1488. data/spec/support/lib/chef/provider/easy.rb +35 -35
  1489. data/spec/support/lib/chef/provider/openldap_includer.rb +29 -29
  1490. data/spec/support/lib/chef/provider/snakeoil.rb +42 -42
  1491. data/spec/support/lib/chef/resource/cat.rb +39 -39
  1492. data/spec/support/lib/chef/resource/one_two_three_four.rb +38 -38
  1493. data/spec/support/lib/chef/resource/openldap_includer.rb +28 -28
  1494. data/spec/support/lib/chef/resource/with_state.rb +30 -30
  1495. data/spec/support/lib/chef/resource/zen_follower.rb +35 -35
  1496. data/spec/support/lib/chef/resource/zen_master.rb +42 -42
  1497. data/spec/support/lib/library_load_order.rb +20 -20
  1498. data/spec/support/matchers/leak.rb +98 -98
  1499. data/spec/support/mock/constant.rb +52 -52
  1500. data/spec/support/mock/platform.rb +25 -25
  1501. data/spec/support/platform_helpers.rb +237 -237
  1502. data/spec/support/platforms/prof/gc.rb +51 -51
  1503. data/spec/support/platforms/prof/win32.rb +45 -45
  1504. data/spec/support/platforms/win32/spec_service.rb +59 -59
  1505. data/spec/support/shared/context/client.rb +302 -302
  1506. data/spec/support/shared/context/config.rb +21 -21
  1507. data/spec/support/shared/context/win32.rb +34 -34
  1508. data/spec/support/shared/examples/client.rb +53 -53
  1509. data/spec/support/shared/functional/diff_disabled.rb +10 -10
  1510. data/spec/support/shared/functional/directory_resource.rb +176 -176
  1511. data/spec/support/shared/functional/execute_resource.rb +150 -150
  1512. data/spec/support/shared/functional/file_resource.rb +1050 -1050
  1513. data/spec/support/shared/functional/http.rb +248 -248
  1514. data/spec/support/shared/functional/knife.rb +37 -37
  1515. data/spec/support/shared/functional/securable_resource.rb +547 -547
  1516. data/spec/support/shared/functional/securable_resource_with_reporting.rb +394 -394
  1517. data/spec/support/shared/functional/win32_service.rb +57 -57
  1518. data/spec/support/shared/functional/windows_script.rb +272 -272
  1519. data/spec/support/shared/integration/app_server_support.rb +40 -40
  1520. data/spec/support/shared/integration/integration_helper.rb +154 -154
  1521. data/spec/support/shared/integration/knife_support.rb +185 -185
  1522. data/spec/support/shared/matchers/exit_with_code.rb +32 -32
  1523. data/spec/support/shared/matchers/match_environment_variable.rb +17 -17
  1524. data/spec/support/shared/shared_examples.rb +14 -14
  1525. data/spec/support/shared/unit/api_error_inspector.rb +190 -190
  1526. data/spec/support/shared/unit/api_versioning.rb +77 -77
  1527. data/spec/support/shared/unit/application_dot_d.rb +73 -73
  1528. data/spec/support/shared/unit/execute_resource.rb +170 -170
  1529. data/spec/support/shared/unit/file_system_support.rb +69 -69
  1530. data/spec/support/shared/unit/knife_shared.rb +39 -39
  1531. data/spec/support/shared/unit/mock_shellout.rb +49 -49
  1532. data/spec/support/shared/unit/platform_introspector.rb +189 -189
  1533. data/spec/support/shared/unit/provider/file.rb +845 -845
  1534. data/spec/support/shared/unit/provider/useradd_based_user_provider.rb +402 -402
  1535. data/spec/support/shared/unit/resource/static_provider_resolution.rb +63 -63
  1536. data/spec/support/shared/unit/script_resource.rb +98 -98
  1537. data/spec/support/shared/unit/user_and_client_shared.rb +114 -114
  1538. data/spec/support/shared/unit/windows_script_resource.rb +80 -80
  1539. data/spec/tiny_server.rb +192 -192
  1540. data/spec/unit/api_client/registration_spec.rb +278 -278
  1541. data/spec/unit/api_client_spec.rb +341 -341
  1542. data/spec/unit/api_client_v1_spec.rb +455 -455
  1543. data/spec/unit/application/apply_spec.rb +113 -113
  1544. data/spec/unit/application/client_spec.rb +530 -530
  1545. data/spec/unit/application/exit_code_spec.rb +229 -229
  1546. data/spec/unit/application/knife_spec.rb +229 -229
  1547. data/spec/unit/application/solo_spec.rb +232 -232
  1548. data/spec/unit/application_spec.rb +411 -411
  1549. data/spec/unit/audit/audit_event_proxy_spec.rb +318 -318
  1550. data/spec/unit/audit/audit_reporter_spec.rb +439 -439
  1551. data/spec/unit/audit/control_group_data_spec.rb +482 -482
  1552. data/spec/unit/audit/logger_spec.rb +42 -42
  1553. data/spec/unit/audit/rspec_formatter_spec.rb +29 -29
  1554. data/spec/unit/audit/runner_spec.rb +144 -144
  1555. data/spec/unit/chef_class_spec.rb +110 -110
  1556. data/spec/unit/chef_fs/config_spec.rb +235 -235
  1557. data/spec/unit/chef_fs/data_handler/group_handler_spec.rb +63 -63
  1558. data/spec/unit/chef_fs/diff_spec.rb +328 -328
  1559. data/spec/unit/chef_fs/file_pattern_spec.rb +512 -512
  1560. data/spec/unit/chef_fs/file_system/cookbook_subdir_spec.rb +34 -34
  1561. data/spec/unit/chef_fs/file_system/operation_failed_error_spec.rb +47 -47
  1562. data/spec/unit/chef_fs/file_system/repository/base_file_spec.rb +126 -126
  1563. data/spec/unit/chef_fs/file_system/repository/directory_spec.rb +175 -175
  1564. data/spec/unit/chef_fs/file_system_spec.rb +148 -148
  1565. data/spec/unit/chef_fs/parallelizer.rb +477 -477
  1566. data/spec/unit/chef_fs/path_util_spec.rb +108 -108
  1567. data/spec/unit/chef_spec.rb +25 -25
  1568. data/spec/unit/client_spec.rb +604 -604
  1569. data/spec/unit/config_fetcher_spec.rb +125 -125
  1570. data/spec/unit/config_spec.rb +31 -31
  1571. data/spec/unit/cookbook/chefignore_spec.rb +49 -49
  1572. data/spec/unit/cookbook/cookbook_version_loader_spec.rb +207 -207
  1573. data/spec/unit/cookbook/file_vendor_spec.rb +112 -112
  1574. data/spec/unit/cookbook/metadata_spec.rb +971 -971
  1575. data/spec/unit/cookbook/synchronizer_spec.rb +539 -539
  1576. data/spec/unit/cookbook/syntax_check_spec.rb +225 -225
  1577. data/spec/unit/cookbook_loader_spec.rb +299 -299
  1578. data/spec/unit/cookbook_manifest_spec.rb +243 -243
  1579. data/spec/unit/cookbook_site_streaming_uploader_spec.rb +203 -203
  1580. data/spec/unit/cookbook_spec.rb +66 -66
  1581. data/spec/unit/cookbook_uploader_spec.rb +199 -199
  1582. data/spec/unit/cookbook_version_file_specificity_spec.rb +576 -576
  1583. data/spec/unit/cookbook_version_spec.rb +359 -359
  1584. data/spec/unit/daemon_spec.rb +183 -174
  1585. data/spec/unit/data_bag_item_spec.rb +388 -388
  1586. data/spec/unit/data_bag_spec.rb +260 -260
  1587. data/spec/unit/data_collector/messages/helpers_spec.rb +193 -193
  1588. data/spec/unit/data_collector/messages_spec.rb +192 -192
  1589. data/spec/unit/data_collector/resource_report_spec.rb +145 -145
  1590. data/spec/unit/data_collector_spec.rb +741 -741
  1591. data/spec/unit/decorator/lazy_array_spec.rb +58 -58
  1592. data/spec/unit/decorator/lazy_spec.rb +39 -39
  1593. data/spec/unit/decorator_spec.rb +142 -142
  1594. data/spec/unit/deprecated_spec.rb +59 -59
  1595. data/spec/unit/deprecation_spec.rb +143 -143
  1596. data/spec/unit/digester_spec.rb +49 -49
  1597. data/spec/unit/dsl/audit_spec.rb +43 -43
  1598. data/spec/unit/dsl/data_query_spec.rb +107 -107
  1599. data/spec/unit/dsl/declare_resource_spec.rb +365 -365
  1600. data/spec/unit/dsl/platform_introspection_spec.rb +129 -129
  1601. data/spec/unit/dsl/reboot_pending_spec.rb +100 -100
  1602. data/spec/unit/dsl/recipe_spec.rb +93 -93
  1603. data/spec/unit/dsl/registry_helper_spec.rb +52 -52
  1604. data/spec/unit/dsl/resources_spec.rb +85 -85
  1605. data/spec/unit/encrypted_data_bag_item/check_encrypted_spec.rb +96 -96
  1606. data/spec/unit/encrypted_data_bag_item_spec.rb +438 -438
  1607. data/spec/unit/environment_spec.rb +470 -470
  1608. data/spec/unit/event_dispatch/dispatcher_spec.rb +122 -122
  1609. data/spec/unit/event_dispatch/dsl_spec.rb +83 -83
  1610. data/spec/unit/exceptions_spec.rb +132 -132
  1611. data/spec/unit/file_access_control_spec.rb +308 -308
  1612. data/spec/unit/file_cache_spec.rb +114 -114
  1613. data/spec/unit/file_content_management/deploy/cp_spec.rb +44 -44
  1614. data/spec/unit/file_content_management/deploy/mv_unix_spec.rb +101 -101
  1615. data/spec/unit/file_content_management/deploy/mv_windows_spec.rb +232 -232
  1616. data/spec/unit/file_content_management/tempfile_spec.rb +115 -115
  1617. data/spec/unit/formatters/base_spec.rb +71 -71
  1618. data/spec/unit/formatters/doc_spec.rb +92 -92
  1619. data/spec/unit/formatters/error_description_spec.rb +141 -141
  1620. data/spec/unit/formatters/error_inspectors/api_error_formatting_spec.rb +76 -76
  1621. data/spec/unit/formatters/error_inspectors/compile_error_inspector_spec.rb +265 -265
  1622. data/spec/unit/formatters/error_inspectors/cookbook_resolve_error_inspector_spec.rb +126 -126
  1623. data/spec/unit/formatters/error_inspectors/cookbook_sync_error_inspector_spec.rb +43 -43
  1624. data/spec/unit/formatters/error_inspectors/node_load_error_inspector_spec.rb +26 -26
  1625. data/spec/unit/formatters/error_inspectors/registration_error_inspector_spec.rb +26 -26
  1626. data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +191 -191
  1627. data/spec/unit/formatters/error_inspectors/run_list_expansion_error_inspector_spec.rb +91 -91
  1628. data/spec/unit/guard_interpreter/resource_guard_interpreter_spec.rb +155 -155
  1629. data/spec/unit/guard_interpreter_spec.rb +41 -41
  1630. data/spec/unit/handler/json_file_spec.rb +63 -63
  1631. data/spec/unit/handler_spec.rb +302 -302
  1632. data/spec/unit/http/api_versions_spec.rb +69 -69
  1633. data/spec/unit/http/authenticator_spec.rb +80 -80
  1634. data/spec/unit/http/basic_client_spec.rb +72 -72
  1635. data/spec/unit/http/http_request_spec.rb +91 -91
  1636. data/spec/unit/http/json_input_spec.rb +128 -128
  1637. data/spec/unit/http/simple_spec.rb +32 -32
  1638. data/spec/unit/http/socketless_chef_zero_client_spec.rb +173 -173
  1639. data/spec/unit/http/ssl_policies_spec.rb +169 -169
  1640. data/spec/unit/http/validate_content_length_spec.rb +207 -207
  1641. data/spec/unit/http_spec.rb +220 -220
  1642. data/spec/unit/json_compat_spec.rb +105 -105
  1643. data/spec/unit/key_spec.rb +631 -631
  1644. data/spec/unit/knife/bootstrap/chef_vault_handler_spec.rb +152 -152
  1645. data/spec/unit/knife/bootstrap/client_builder_spec.rb +207 -207
  1646. data/spec/unit/knife/bootstrap_spec.rb +824 -824
  1647. data/spec/unit/knife/client_bulk_delete_spec.rb +166 -166
  1648. data/spec/unit/knife/client_create_spec.rb +186 -186
  1649. data/spec/unit/knife/client_delete_spec.rb +99 -99
  1650. data/spec/unit/knife/client_edit_spec.rb +53 -53
  1651. data/spec/unit/knife/client_list_spec.rb +34 -34
  1652. data/spec/unit/knife/client_reregister_spec.rb +62 -62
  1653. data/spec/unit/knife/client_show_spec.rb +52 -52
  1654. data/spec/unit/knife/configure_client_spec.rb +83 -83
  1655. data/spec/unit/knife/configure_spec.rb +241 -241
  1656. data/spec/unit/knife/cookbook_bulk_delete_spec.rb +87 -87
  1657. data/spec/unit/knife/cookbook_create_spec.rb +261 -261
  1658. data/spec/unit/knife/cookbook_delete_spec.rb +239 -239
  1659. data/spec/unit/knife/cookbook_download_spec.rb +237 -237
  1660. data/spec/unit/knife/cookbook_list_spec.rb +88 -88
  1661. data/spec/unit/knife/cookbook_metadata_from_file_spec.rb +65 -65
  1662. data/spec/unit/knife/cookbook_metadata_spec.rb +182 -182
  1663. data/spec/unit/knife/cookbook_show_spec.rb +221 -221
  1664. data/spec/unit/knife/cookbook_site_download_spec.rb +150 -150
  1665. data/spec/unit/knife/cookbook_site_install_spec.rb +200 -200
  1666. data/spec/unit/knife/cookbook_site_share_spec.rb +209 -209
  1667. data/spec/unit/knife/cookbook_site_unshare_spec.rb +77 -77
  1668. data/spec/unit/knife/cookbook_test_spec.rb +84 -84
  1669. data/spec/unit/knife/cookbook_upload_spec.rb +331 -331
  1670. data/spec/unit/knife/core/bootstrap_context_spec.rb +307 -307
  1671. data/spec/unit/knife/core/cookbook_scm_repo_spec.rb +187 -187
  1672. data/spec/unit/knife/core/custom_manifest_loader_spec.rb +41 -41
  1673. data/spec/unit/knife/core/gem_glob_loader_spec.rb +209 -209
  1674. data/spec/unit/knife/core/hashed_command_loader_spec.rb +110 -110
  1675. data/spec/unit/knife/core/node_editor_spec.rb +211 -211
  1676. data/spec/unit/knife/core/object_loader_spec.rb +81 -81
  1677. data/spec/unit/knife/core/subcommand_loader_spec.rb +70 -70
  1678. data/spec/unit/knife/core/ui_spec.rb +629 -629
  1679. data/spec/unit/knife/data_bag_create_spec.rb +129 -129
  1680. data/spec/unit/knife/data_bag_edit_spec.rb +127 -127
  1681. data/spec/unit/knife/data_bag_from_file_spec.rb +173 -173
  1682. data/spec/unit/knife/data_bag_secret_options_spec.rb +165 -165
  1683. data/spec/unit/knife/data_bag_show_spec.rb +124 -124
  1684. data/spec/unit/knife/environment_compare_spec.rb +112 -112
  1685. data/spec/unit/knife/environment_create_spec.rb +91 -91
  1686. data/spec/unit/knife/environment_delete_spec.rb +71 -71
  1687. data/spec/unit/knife/environment_edit_spec.rb +79 -79
  1688. data/spec/unit/knife/environment_from_file_spec.rb +90 -90
  1689. data/spec/unit/knife/environment_list_spec.rb +54 -54
  1690. data/spec/unit/knife/environment_show_spec.rb +52 -52
  1691. data/spec/unit/knife/index_rebuild_spec.rb +125 -125
  1692. data/spec/unit/knife/key_create_spec.rb +223 -223
  1693. data/spec/unit/knife/key_delete_spec.rb +133 -133
  1694. data/spec/unit/knife/key_edit_spec.rb +264 -264
  1695. data/spec/unit/knife/key_helper.rb +74 -74
  1696. data/spec/unit/knife/key_list_spec.rb +216 -216
  1697. data/spec/unit/knife/key_show_spec.rb +126 -126
  1698. data/spec/unit/knife/knife_help.rb +92 -92
  1699. data/spec/unit/knife/node_bulk_delete_spec.rb +94 -94
  1700. data/spec/unit/knife/node_delete_spec.rb +77 -77
  1701. data/spec/unit/knife/node_edit_spec.rb +114 -114
  1702. data/spec/unit/knife/node_environment_set_spec.rb +56 -56
  1703. data/spec/unit/knife/node_from_file_spec.rb +59 -59
  1704. data/spec/unit/knife/node_list_spec.rb +62 -62
  1705. data/spec/unit/knife/node_run_list_add_spec.rb +145 -145
  1706. data/spec/unit/knife/node_run_list_remove_spec.rb +106 -106
  1707. data/spec/unit/knife/node_run_list_set_spec.rb +115 -115
  1708. data/spec/unit/knife/node_show_spec.rb +65 -65
  1709. data/spec/unit/knife/osc_user_create_spec.rb +93 -93
  1710. data/spec/unit/knife/osc_user_delete_spec.rb +44 -44
  1711. data/spec/unit/knife/osc_user_edit_spec.rb +52 -52
  1712. data/spec/unit/knife/osc_user_list_spec.rb +37 -37
  1713. data/spec/unit/knife/osc_user_reregister_spec.rb +58 -58
  1714. data/spec/unit/knife/osc_user_show_spec.rb +46 -46
  1715. data/spec/unit/knife/raw_spec.rb +43 -43
  1716. data/spec/unit/knife/role_bulk_delete_spec.rb +80 -80
  1717. data/spec/unit/knife/role_create_spec.rb +80 -80
  1718. data/spec/unit/knife/role_delete_spec.rb +67 -67
  1719. data/spec/unit/knife/role_edit_spec.rb +77 -77
  1720. data/spec/unit/knife/role_env_run_list_add_spec.rb +217 -217
  1721. data/spec/unit/knife/role_env_run_list_clear_spec.rb +94 -94
  1722. data/spec/unit/knife/role_env_run_list_remove_spec.rb +102 -102
  1723. data/spec/unit/knife/role_env_run_list_replace_spec.rb +105 -105
  1724. data/spec/unit/knife/role_env_run_list_set_spec.rb +99 -99
  1725. data/spec/unit/knife/role_from_file_spec.rb +69 -69
  1726. data/spec/unit/knife/role_list_spec.rb +54 -54
  1727. data/spec/unit/knife/role_run_list_add_spec.rb +179 -179
  1728. data/spec/unit/knife/role_run_list_clear_spec.rb +84 -84
  1729. data/spec/unit/knife/role_run_list_remove_spec.rb +92 -92
  1730. data/spec/unit/knife/role_run_list_replace_spec.rb +98 -98
  1731. data/spec/unit/knife/role_run_list_set_spec.rb +89 -89
  1732. data/spec/unit/knife/role_show_spec.rb +59 -59
  1733. data/spec/unit/knife/ssh_spec.rb +426 -426
  1734. data/spec/unit/knife/ssl_check_spec.rb +256 -256
  1735. data/spec/unit/knife/ssl_fetch_spec.rb +222 -222
  1736. data/spec/unit/knife/status_spec.rb +109 -109
  1737. data/spec/unit/knife/tag_create_spec.rb +23 -23
  1738. data/spec/unit/knife/tag_delete_spec.rb +25 -25
  1739. data/spec/unit/knife/tag_list_spec.rb +23 -23
  1740. data/spec/unit/knife/user_create_spec.rb +214 -214
  1741. data/spec/unit/knife/user_delete_spec.rb +65 -65
  1742. data/spec/unit/knife/user_edit_spec.rb +66 -66
  1743. data/spec/unit/knife/user_list_spec.rb +36 -36
  1744. data/spec/unit/knife/user_reregister_spec.rb +74 -74
  1745. data/spec/unit/knife/user_show_spec.rb +65 -65
  1746. data/spec/unit/knife_spec.rb +561 -561
  1747. data/spec/unit/lib_backcompat_spec.rb +34 -34
  1748. data/spec/unit/log/syslog_spec.rb +53 -53
  1749. data/spec/unit/log/winevt_spec.rb +55 -55
  1750. data/spec/unit/log_spec.rb +24 -24
  1751. data/spec/unit/lwrp_spec.rb +777 -777
  1752. data/spec/unit/mash_spec.rb +51 -51
  1753. data/spec/unit/mixin/api_version_request_handling_spec.rb +126 -126
  1754. data/spec/unit/mixin/checksum_spec.rb +54 -54
  1755. data/spec/unit/mixin/command_spec.rb +107 -107
  1756. data/spec/unit/mixin/convert_to_class_name_spec.rb +54 -54
  1757. data/spec/unit/mixin/deep_merge_spec.rb +342 -342
  1758. data/spec/unit/mixin/deprecation_spec.rb +57 -57
  1759. data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +96 -96
  1760. data/spec/unit/mixin/homebrew_user_spec.rb +100 -100
  1761. data/spec/unit/mixin/lazy_module_include.rb +71 -71
  1762. data/spec/unit/mixin/params_validate_spec.rb +410 -410
  1763. data/spec/unit/mixin/path_sanity_spec.rb +92 -92
  1764. data/spec/unit/mixin/powershell_out_spec.rb +94 -94
  1765. data/spec/unit/mixin/powershell_type_coercions_spec.rb +83 -83
  1766. data/spec/unit/mixin/properties_spec.rb +97 -97
  1767. data/spec/unit/mixin/proxified_socket_spec.rb +97 -97
  1768. data/spec/unit/mixin/securable_spec.rb +314 -314
  1769. data/spec/unit/mixin/shell_out_spec.rb +302 -302
  1770. data/spec/unit/mixin/subclass_directive_spec.rb +45 -45
  1771. data/spec/unit/mixin/template_spec.rb +276 -276
  1772. data/spec/unit/mixin/unformatter_spec.rb +61 -61
  1773. data/spec/unit/mixin/uris_spec.rb +57 -57
  1774. data/spec/unit/mixin/versioned_api_spec.rb +107 -107
  1775. data/spec/unit/mixin/which.rb +160 -160
  1776. data/spec/unit/mixin/windows_architecture_helper_spec.rb +85 -85
  1777. data/spec/unit/mixin/xml_escape_spec.rb +54 -54
  1778. data/spec/unit/monkey_patches/uri_spec.rb +34 -34
  1779. data/spec/unit/monologger_spec.rb +45 -45
  1780. data/spec/unit/node/attribute_spec.rb +1244 -1244
  1781. data/spec/unit/node/immutable_collections_spec.rb +214 -214
  1782. data/spec/unit/node/vivid_mash_spec.rb +353 -353
  1783. data/spec/unit/node_map_spec.rb +170 -170
  1784. data/spec/unit/node_spec.rb +1836 -1836
  1785. data/spec/unit/org_spec.rb +196 -196
  1786. data/spec/unit/platform/query_helpers_spec.rb +220 -220
  1787. data/spec/unit/platform_spec.rb +269 -269
  1788. data/spec/unit/policy_builder/dynamic_spec.rb +273 -273
  1789. data/spec/unit/policy_builder/expand_node_object_spec.rb +336 -336
  1790. data/spec/unit/policy_builder/policyfile_spec.rb +795 -795
  1791. data/spec/unit/policy_builder_spec.rb +26 -26
  1792. data/spec/unit/property/state_spec.rb +508 -508
  1793. data/spec/unit/property/validation_spec.rb +720 -720
  1794. data/spec/unit/property_spec.rb +1227 -1227
  1795. data/spec/unit/provider/apt_repository_spec.rb +189 -189
  1796. data/spec/unit/provider/apt_update_spec.rb +114 -114
  1797. data/spec/unit/provider/breakpoint_spec.rb +53 -53
  1798. data/spec/unit/provider/cookbook_file/content_spec.rb +39 -39
  1799. data/spec/unit/provider/cookbook_file_spec.rb +58 -58
  1800. data/spec/unit/provider/cron/unix_spec.rb +139 -139
  1801. data/spec/unit/provider/cron_spec.rb +1010 -1010
  1802. data/spec/unit/provider/deploy/revision_spec.rb +110 -110
  1803. data/spec/unit/provider/deploy/timestamped_spec.rb +40 -40
  1804. data/spec/unit/provider/deploy_spec.rb +641 -641
  1805. data/spec/unit/provider/directory_spec.rb +300 -300
  1806. data/spec/unit/provider/dsc_resource_spec.rb +343 -343
  1807. data/spec/unit/provider/dsc_script_spec.rb +173 -173
  1808. data/spec/unit/provider/env/windows_spec.rb +103 -103
  1809. data/spec/unit/provider/env_spec.rb +310 -310
  1810. data/spec/unit/provider/erl_call_spec.rb +85 -85
  1811. data/spec/unit/provider/execute_spec.rb +242 -242
  1812. data/spec/unit/provider/file/content_spec.rb +114 -114
  1813. data/spec/unit/provider/file_spec.rb +56 -56
  1814. data/spec/unit/provider/git_spec.rb +727 -727
  1815. data/spec/unit/provider/group/dscl_spec.rb +331 -331
  1816. data/spec/unit/provider/group/gpasswd_spec.rb +116 -116
  1817. data/spec/unit/provider/group/groupadd_spec.rb +194 -194
  1818. data/spec/unit/provider/group/groupmod_spec.rb +133 -133
  1819. data/spec/unit/provider/group/pw_spec.rb +138 -138
  1820. data/spec/unit/provider/group/suse_spec.rb +90 -90
  1821. data/spec/unit/provider/group/usermod_spec.rb +115 -115
  1822. data/spec/unit/provider/group/windows_spec.rb +109 -109
  1823. data/spec/unit/provider/group_spec.rb +286 -286
  1824. data/spec/unit/provider/http_request_spec.rb +159 -159
  1825. data/spec/unit/provider/ifconfig/aix_spec.rb +180 -180
  1826. data/spec/unit/provider/ifconfig/debian_spec.rb +332 -332
  1827. data/spec/unit/provider/ifconfig/redhat_spec.rb +73 -73
  1828. data/spec/unit/provider/ifconfig_spec.rb +194 -194
  1829. data/spec/unit/provider/launchd_spec.rb +268 -268
  1830. data/spec/unit/provider/link_spec.rb +407 -407
  1831. data/spec/unit/provider/log_spec.rb +89 -89
  1832. data/spec/unit/provider/mdadm_spec.rb +140 -140
  1833. data/spec/unit/provider/mount/aix_spec.rb +237 -237
  1834. data/spec/unit/provider/mount/mount_spec.rb +474 -474
  1835. data/spec/unit/provider/mount/solaris_spec.rb +822 -822
  1836. data/spec/unit/provider/mount/windows_spec.rb +149 -149
  1837. data/spec/unit/provider/mount_spec.rb +191 -191
  1838. data/spec/unit/provider/ohai_spec.rb +84 -84
  1839. data/spec/unit/provider/osx_profile_spec.rb +255 -255
  1840. data/spec/unit/provider/package/aix_spec.rb +185 -185
  1841. data/spec/unit/provider/package/apt_spec.rb +481 -481
  1842. data/spec/unit/provider/package/cab_spec.rb +272 -272
  1843. data/spec/unit/provider/package/chocolatey_spec.rb +489 -489
  1844. data/spec/unit/provider/package/dnf/python_helper_spec.rb +29 -29
  1845. data/spec/unit/provider/package/dpkg_spec.rb +287 -287
  1846. data/spec/unit/provider/package/easy_install_spec.rb +114 -114
  1847. data/spec/unit/provider/package/freebsd/pkg_spec.rb +274 -274
  1848. data/spec/unit/provider/package/freebsd/pkgng_spec.rb +148 -148
  1849. data/spec/unit/provider/package/freebsd/port_spec.rb +163 -163
  1850. data/spec/unit/provider/package/homebrew_spec.rb +292 -292
  1851. data/spec/unit/provider/package/ips_spec.rb +233 -233
  1852. data/spec/unit/provider/package/macports_spec.rb +203 -203
  1853. data/spec/unit/provider/package/msu_spec.rb +283 -283
  1854. data/spec/unit/provider/package/openbsd_spec.rb +132 -132
  1855. data/spec/unit/provider/package/pacman_spec.rb +194 -194
  1856. data/spec/unit/provider/package/paludis_spec.rb +134 -134
  1857. data/spec/unit/provider/package/portage_spec.rb +315 -315
  1858. data/spec/unit/provider/package/powershell_spec.rb +337 -337
  1859. data/spec/unit/provider/package/rpm_spec.rb +429 -429
  1860. data/spec/unit/provider/package/rubygems_spec.rb +824 -824
  1861. data/spec/unit/provider/package/smartos_spec.rb +110 -110
  1862. data/spec/unit/provider/package/solaris_spec.rb +167 -167
  1863. data/spec/unit/provider/package/windows/exe_spec.rb +201 -201
  1864. data/spec/unit/provider/package/windows/msi_spec.rb +168 -168
  1865. data/spec/unit/provider/package/windows_spec.rb +443 -443
  1866. data/spec/unit/provider/package/yum/yum_cache_spec.rb +27 -27
  1867. data/spec/unit/provider/package/yum_spec.rb +2294 -2294
  1868. data/spec/unit/provider/package/zypper_spec.rb +348 -348
  1869. data/spec/unit/provider/package_spec.rb +949 -949
  1870. data/spec/unit/provider/powershell_script_spec.rb +106 -106
  1871. data/spec/unit/provider/registry_key_spec.rb +407 -407
  1872. data/spec/unit/provider/remote_directory_spec.rb +236 -236
  1873. data/spec/unit/provider/remote_file/cache_control_data_spec.rb +245 -245
  1874. data/spec/unit/provider/remote_file/content_spec.rb +253 -253
  1875. data/spec/unit/provider/remote_file/fetcher_spec.rb +94 -94
  1876. data/spec/unit/provider/remote_file/ftp_spec.rb +217 -217
  1877. data/spec/unit/provider/remote_file/http_spec.rb +322 -322
  1878. data/spec/unit/provider/remote_file/local_file_spec.rb +105 -105
  1879. data/spec/unit/provider/remote_file/network_file_spec.rb +45 -45
  1880. data/spec/unit/provider/remote_file/sftp_spec.rb +150 -150
  1881. data/spec/unit/provider/remote_file_spec.rb +61 -61
  1882. data/spec/unit/provider/route_spec.rb +248 -248
  1883. data/spec/unit/provider/ruby_block_spec.rb +45 -45
  1884. data/spec/unit/provider/script_spec.rb +157 -157
  1885. data/spec/unit/provider/service/aix_service_spec.rb +195 -195
  1886. data/spec/unit/provider/service/aixinit_service_spec.rb +272 -272
  1887. data/spec/unit/provider/service/arch_service_spec.rb +324 -324
  1888. data/spec/unit/provider/service/debian_service_spec.rb +375 -375
  1889. data/spec/unit/provider/service/freebsd_service_spec.rb +617 -617
  1890. data/spec/unit/provider/service/gentoo_service_spec.rb +144 -144
  1891. data/spec/unit/provider/service/init_service_spec.rb +235 -235
  1892. data/spec/unit/provider/service/insserv_service_spec.rb +75 -75
  1893. data/spec/unit/provider/service/invokercd_service_spec.rb +211 -211
  1894. data/spec/unit/provider/service/macosx_spec.rb +335 -335
  1895. data/spec/unit/provider/service/openbsd_service_spec.rb +549 -549
  1896. data/spec/unit/provider/service/redhat_spec.rb +250 -250
  1897. data/spec/unit/provider/service/simple_service_spec.rb +169 -169
  1898. data/spec/unit/provider/service/solaris_smf_service_spec.rb +255 -255
  1899. data/spec/unit/provider/service/systemd_service_spec.rb +370 -370
  1900. data/spec/unit/provider/service/upstart_service_spec.rb +364 -364
  1901. data/spec/unit/provider/service/windows_spec.rb +463 -463
  1902. data/spec/unit/provider/service_spec.rb +168 -168
  1903. data/spec/unit/provider/subversion_spec.rb +361 -361
  1904. data/spec/unit/provider/systemd_unit_spec.rb +885 -885
  1905. data/spec/unit/provider/template/content_spec.rb +169 -169
  1906. data/spec/unit/provider/template_spec.rb +89 -89
  1907. data/spec/unit/provider/user/dscl_spec.rb +902 -902
  1908. data/spec/unit/provider/user/linux_spec.rb +112 -112
  1909. data/spec/unit/provider/user/pw_spec.rb +255 -255
  1910. data/spec/unit/provider/user/solaris_spec.rb +178 -178
  1911. data/spec/unit/provider/user/windows_spec.rb +185 -185
  1912. data/spec/unit/provider/user_spec.rb +478 -478
  1913. data/spec/unit/provider/whyrun_safe_ruby_block_spec.rb +46 -46
  1914. data/spec/unit/provider/yum_repository_spec.rb +35 -35
  1915. data/spec/unit/provider_resolver_spec.rb +939 -939
  1916. data/spec/unit/provider_spec.rb +198 -198
  1917. data/spec/unit/pure_application_spec.rb +32 -32
  1918. data/spec/unit/recipe_spec.rb +758 -758
  1919. data/spec/unit/resource/apt_package_spec.rb +38 -38
  1920. data/spec/unit/resource/apt_repository_spec.rb +50 -50
  1921. data/spec/unit/resource/apt_update_spec.rb +50 -50
  1922. data/spec/unit/resource/bash_spec.rb +40 -40
  1923. data/spec/unit/resource/batch_spec.rb +49 -49
  1924. data/spec/unit/resource/breakpoint_spec.rb +47 -47
  1925. data/spec/unit/resource/cab_package_spec.rb +38 -38
  1926. data/spec/unit/resource/chef_gem_spec.rb +157 -157
  1927. data/spec/unit/resource/chocolatey_package_spec.rb +79 -79
  1928. data/spec/unit/resource/conditional_action_not_nothing_spec.rb +45 -45
  1929. data/spec/unit/resource/conditional_spec.rb +254 -254
  1930. data/spec/unit/resource/cookbook_file_spec.rb +88 -88
  1931. data/spec/unit/resource/cron_spec.rb +186 -186
  1932. data/spec/unit/resource/csh_spec.rb +40 -40
  1933. data/spec/unit/resource/deploy_revision_spec.rb +42 -42
  1934. data/spec/unit/resource/deploy_spec.rb +283 -283
  1935. data/spec/unit/resource/directory_spec.rb +82 -82
  1936. data/spec/unit/resource/dnf_package_spec.rb +99 -99
  1937. data/spec/unit/resource/dpkg_package_spec.rb +32 -32
  1938. data/spec/unit/resource/dsc_resource_spec.rb +102 -102
  1939. data/spec/unit/resource/dsc_script_spec.rb +134 -134
  1940. data/spec/unit/resource/easy_install_package_spec.rb +39 -39
  1941. data/spec/unit/resource/env_spec.rb +85 -85
  1942. data/spec/unit/resource/erl_call_spec.rb +81 -81
  1943. data/spec/unit/resource/execute_spec.rb +249 -249
  1944. data/spec/unit/resource/file/verification/systemd_unit_spec.rb +103 -103
  1945. data/spec/unit/resource/file/verification_spec.rb +139 -139
  1946. data/spec/unit/resource/file_spec.rb +130 -130
  1947. data/spec/unit/resource/freebsd_package_spec.rb +87 -87
  1948. data/spec/unit/resource/gem_package_spec.rb +42 -42
  1949. data/spec/unit/resource/git_spec.rb +50 -50
  1950. data/spec/unit/resource/group_spec.rb +162 -162
  1951. data/spec/unit/resource/homebrew_package_spec.rb +50 -50
  1952. data/spec/unit/resource/http_request_spec.rb +59 -59
  1953. data/spec/unit/resource/ifconfig_spec.rb +109 -109
  1954. data/spec/unit/resource/ips_package_spec.rb +40 -40
  1955. data/spec/unit/resource/ksh_spec.rb +40 -40
  1956. data/spec/unit/resource/launchd_spec.rb +32 -32
  1957. data/spec/unit/resource/link_spec.rb +134 -134
  1958. data/spec/unit/resource/log_spec.rb +73 -73
  1959. data/spec/unit/resource/macports_package_spec.rb +32 -32
  1960. data/spec/unit/resource/mdadm_spec.rb +107 -107
  1961. data/spec/unit/resource/mount_spec.rb +215 -215
  1962. data/spec/unit/resource/msu_package_spec.rb +49 -49
  1963. data/spec/unit/resource/ohai_spec.rb +61 -61
  1964. data/spec/unit/resource/openbsd_package_spec.rb +48 -48
  1965. data/spec/unit/resource/osx_profile_spec.rb +62 -62
  1966. data/spec/unit/resource/package_spec.rb +98 -98
  1967. data/spec/unit/resource/pacman_package_spec.rb +32 -32
  1968. data/spec/unit/resource/perl_spec.rb +40 -40
  1969. data/spec/unit/resource/portage_package_spec.rb +38 -38
  1970. data/spec/unit/resource/powershell_package_spec.rb +68 -68
  1971. data/spec/unit/resource/powershell_script_spec.rb +136 -136
  1972. data/spec/unit/resource/python_spec.rb +40 -40
  1973. data/spec/unit/resource/registry_key_spec.rb +215 -215
  1974. data/spec/unit/resource/remote_directory_spec.rb +97 -97
  1975. data/spec/unit/resource/remote_file_spec.rb +207 -207
  1976. data/spec/unit/resource/resource_notification_spec.rb +169 -169
  1977. data/spec/unit/resource/route_spec.rb +107 -107
  1978. data/spec/unit/resource/rpm_package_spec.rb +46 -46
  1979. data/spec/unit/resource/ruby_block_spec.rb +61 -61
  1980. data/spec/unit/resource/ruby_spec.rb +40 -40
  1981. data/spec/unit/resource/scm_spec.rb +193 -193
  1982. data/spec/unit/resource/script_spec.rb +44 -44
  1983. data/spec/unit/resource/service_spec.rb +179 -179
  1984. data/spec/unit/resource/smartos_package_spec.rb +33 -33
  1985. data/spec/unit/resource/solaris_package_spec.rb +42 -42
  1986. data/spec/unit/resource/subversion_spec.rb +71 -71
  1987. data/spec/unit/resource/systemd_unit_spec.rb +133 -133
  1988. data/spec/unit/resource/template_spec.rb +210 -210
  1989. data/spec/unit/resource/timestamped_deploy_spec.rb +32 -32
  1990. data/spec/unit/resource/user_spec.rb +133 -133
  1991. data/spec/unit/resource/windows_package_spec.rb +95 -95
  1992. data/spec/unit/resource/windows_service_spec.rb +49 -49
  1993. data/spec/unit/resource/yum_package_spec.rb +150 -150
  1994. data/spec/unit/resource/yum_repository_spec.rb +49 -49
  1995. data/spec/unit/resource_builder_spec.rb +1 -1
  1996. data/spec/unit/resource_collection/resource_list_spec.rb +137 -137
  1997. data/spec/unit/resource_collection/resource_set_spec.rb +199 -199
  1998. data/spec/unit/resource_collection/stepable_iterator_spec.rb +144 -144
  1999. data/spec/unit/resource_collection_spec.rb +399 -399
  2000. data/spec/unit/resource_definition_spec.rb +117 -117
  2001. data/spec/unit/resource_reporter_spec.rb +782 -782
  2002. data/spec/unit/resource_resolver_spec.rb +52 -52
  2003. data/spec/unit/resource_spec.rb +1141 -1141
  2004. data/spec/unit/rest/auth_credentials_spec.rb +292 -292
  2005. data/spec/unit/rest_spec.rb +753 -753
  2006. data/spec/unit/role_spec.rb +358 -358
  2007. data/spec/unit/run_context/child_run_context_spec.rb +133 -133
  2008. data/spec/unit/run_context/cookbook_compiler_spec.rb +226 -226
  2009. data/spec/unit/run_context_spec.rb +241 -241
  2010. data/spec/unit/run_list/run_list_expansion_spec.rb +144 -144
  2011. data/spec/unit/run_list/run_list_item_spec.rb +117 -117
  2012. data/spec/unit/run_list/versioned_recipe_list_spec.rb +194 -194
  2013. data/spec/unit/run_list_spec.rb +312 -312
  2014. data/spec/unit/run_lock_spec.rb +140 -140
  2015. data/spec/unit/run_status_spec.rb +144 -144
  2016. data/spec/unit/runner_spec.rb +412 -412
  2017. data/spec/unit/scan_access_control_spec.rb +183 -183
  2018. data/spec/unit/search/query_spec.rb +290 -290
  2019. data/spec/unit/server_api_spec.rb +50 -50
  2020. data/spec/unit/server_api_versions_spec.rb +44 -44
  2021. data/spec/unit/shell/model_wrapper_spec.rb +96 -96
  2022. data/spec/unit/shell/shell_ext_spec.rb +153 -153
  2023. data/spec/unit/shell/shell_session_spec.rb +195 -195
  2024. data/spec/unit/shell_out_spec.rb +18 -18
  2025. data/spec/unit/shell_spec.rb +162 -162
  2026. data/spec/unit/user_spec.rb +275 -275
  2027. data/spec/unit/user_v1_spec.rb +583 -583
  2028. data/spec/unit/util/backup_spec.rb +141 -141
  2029. data/spec/unit/util/diff_spec.rb +576 -576
  2030. data/spec/unit/util/dsc/configuration_generator_spec.rb +193 -193
  2031. data/spec/unit/util/dsc/lcm_output_parser_spec.rb +248 -248
  2032. data/spec/unit/util/dsc/local_configuration_manager_spec.rb +200 -200
  2033. data/spec/unit/util/dsc/resource_store.rb +78 -78
  2034. data/spec/unit/util/editor_spec.rb +152 -152
  2035. data/spec/unit/util/file_edit_spec.rb +224 -224
  2036. data/spec/unit/util/powershell/cmdlet_spec.rb +106 -106
  2037. data/spec/unit/util/powershell/ps_credential_spec.rb +44 -44
  2038. data/spec/unit/util/selinux_spec.rb +160 -160
  2039. data/spec/unit/util/threaded_job_queue_spec.rb +51 -51
  2040. data/spec/unit/version/platform_spec.rb +60 -60
  2041. data/spec/unit/version_class_spec.rb +171 -171
  2042. data/spec/unit/version_constraint/platform_spec.rb +45 -45
  2043. data/spec/unit/version_constraint_spec.rb +179 -179
  2044. data/spec/unit/win32/error_spec.rb +67 -67
  2045. data/spec/unit/win32/registry_spec.rb +394 -394
  2046. data/spec/unit/win32/security_spec.rb +66 -66
  2047. data/spec/unit/windows_service_spec.rb +116 -116
  2048. data/tasks/announce.rb +58 -58
  2049. data/tasks/bin/bundle-platform +20 -20
  2050. data/tasks/bin/bundle-platform.bat +2 -2
  2051. data/tasks/bin/bundler_patch.rb +27 -27
  2052. data/tasks/bin/create-override-gemfile +110 -110
  2053. data/tasks/bin/gem-version-diff +37 -37
  2054. data/tasks/bin/run_external_test +47 -47
  2055. data/tasks/bundle.rb +97 -97
  2056. data/tasks/bundle_util.rb +110 -110
  2057. data/tasks/cbgb.rb +84 -84
  2058. data/tasks/changelog.rb +31 -31
  2059. data/tasks/dependencies.rb +151 -151
  2060. data/tasks/gemfile_util.rb +390 -390
  2061. data/tasks/maintainers.rb +211 -211
  2062. data/tasks/rspec.rb +90 -90
  2063. data/tasks/templates/prerelease.md.erb +26 -26
  2064. data/tasks/templates/release.md.erb +26 -26
  2065. metadata +4 -4
@@ -1,170 +1,170 @@
1
- #
2
- # Author:: Lamont Granquist (<lamont@chef.io>)
3
- # Copyright:: Copyright 2014-2016, Chef Software, Inc.
4
- # License:: Apache License, Version 2.0
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
- #
18
-
19
- require "spec_helper"
20
- require "chef/node_map"
21
-
22
- describe Chef::NodeMap do
23
-
24
- let(:node_map) { Chef::NodeMap.new }
25
-
26
- let(:node) { Chef::Node.new }
27
-
28
- describe "with a bad filter name" do
29
- it "should raise an error" do
30
- expect { node_map.set(node, :thing, on_platform_family: "rhel") }.to raise_error(ArgumentError)
31
- end
32
- end
33
-
34
- describe "when no matchers are set at all" do
35
- before do
36
- node_map.set(:thing, :foo)
37
- end
38
-
39
- it "returns the value" do
40
- expect(node_map.get(node, :thing)).to eql(:foo)
41
- end
42
-
43
- it "returns nil for keys that do not exist" do
44
- expect(node_map.get(node, :other_thing)).to eql(nil)
45
- end
46
- end
47
-
48
- describe "filtering by os" do
49
- before do
50
- node_map.set(:thing, :foo, os: ["windows"])
51
- node_map.set(:thing, :bar, os: "linux")
52
- end
53
- it "returns the correct value for windows" do
54
- allow(node).to receive(:[]).with(:os).and_return("windows")
55
- expect(node_map.get(node, :thing)).to eql(:foo)
56
- end
57
- it "returns the correct value for linux" do
58
- allow(node).to receive(:[]).with(:os).and_return("linux")
59
- expect(node_map.get(node, :thing)).to eql(:bar)
60
- end
61
- it "returns nil for a non-matching os" do
62
- allow(node).to receive(:[]).with(:os).and_return("freebsd")
63
- expect(node_map.get(node, :thing)).to eql(nil)
64
- end
65
- end
66
-
67
- describe "rejecting an os" do
68
- before do
69
- node_map.set(:thing, :foo, os: "!windows")
70
- end
71
- it "returns nil for windows" do
72
- allow(node).to receive(:[]).with(:os).and_return("windows")
73
- expect(node_map.get(node, :thing)).to eql(nil)
74
- end
75
- it "returns the correct value for linux" do
76
- allow(node).to receive(:[]).with(:os).and_return("linux")
77
- expect(node_map.get(node, :thing)).to eql(:foo)
78
- end
79
- end
80
-
81
- describe "filtering by os and platform_family" do
82
- before do
83
- node_map.set(:thing, :bar, os: "linux", platform_family: "rhel")
84
- end
85
-
86
- it "returns the correct value when both match" do
87
- allow(node).to receive(:[]).with(:os).and_return("linux")
88
- allow(node).to receive(:[]).with(:platform_family).and_return("rhel")
89
- expect(node_map.get(node, :thing)).to eql(:bar)
90
- end
91
-
92
- it "returns nil for a non-matching os" do
93
- allow(node).to receive(:[]).with(:os).and_return("freebsd")
94
- expect(node_map.get(node, :thing)).to eql(nil)
95
- end
96
-
97
- it "returns nil when the platform_family does not match" do
98
- allow(node).to receive(:[]).with(:os).and_return("linux")
99
- allow(node).to receive(:[]).with(:platform_family).and_return("debian")
100
- expect(node_map.get(node, :thing)).to eql(nil)
101
- end
102
- end
103
-
104
- describe "with a block doing platform_version checks" do
105
- before do
106
- node_map.set(:thing, :foo, platform_family: "rhel") do |node|
107
- node[:platform_version].to_i >= 7
108
- end
109
- end
110
-
111
- it "returns the value when the node matches" do
112
- allow(node).to receive(:[]).with(:platform_family).and_return("rhel")
113
- allow(node).to receive(:[]).with(:platform_version).and_return("7.0")
114
- expect(node_map.get(node, :thing)).to eql(:foo)
115
- end
116
-
117
- it "returns nil when the block does not match" do
118
- allow(node).to receive(:[]).with(:platform_family).and_return("rhel")
119
- allow(node).to receive(:[]).with(:platform_version).and_return("6.4")
120
- expect(node_map.get(node, :thing)).to eql(nil)
121
- end
122
-
123
- it "returns nil when the platform_family filter does not match" do
124
- allow(node).to receive(:[]).with(:platform_family).and_return("debian")
125
- allow(node).to receive(:[]).with(:platform_version).and_return("7.0")
126
- expect(node_map.get(node, :thing)).to eql(nil)
127
- end
128
-
129
- it "returns nil when both do not match" do
130
- allow(node).to receive(:[]).with(:platform_family).and_return("debian")
131
- allow(node).to receive(:[]).with(:platform_version).and_return("6.0")
132
- expect(node_map.get(node, :thing)).to eql(nil)
133
- end
134
-
135
- context "when there is a less specific definition" do
136
- before do
137
- node_map.set(:thing, :bar, platform_family: "rhel")
138
- end
139
-
140
- it "returns the value when the node matches" do
141
- allow(node).to receive(:[]).with(:platform_family).and_return("rhel")
142
- allow(node).to receive(:[]).with(:platform_version).and_return("7.0")
143
- expect(node_map.get(node, :thing)).to eql(:foo)
144
- end
145
- end
146
- end
147
-
148
- describe "resource back-compat testing" do
149
- before :each do
150
- Chef::Config[:treat_deprecation_warnings_as_errors] = false
151
- end
152
-
153
- it "should handle :on_platforms => :all" do
154
- node_map.set(:chef_gem, :foo, :on_platforms => :all)
155
- allow(node).to receive(:[]).with(:platform).and_return("windows")
156
- expect(node_map.get(node, :chef_gem)).to eql(:foo)
157
- end
158
- it "should handle :on_platforms => [ 'windows' ]" do
159
- node_map.set(:dsc_script, :foo, :on_platforms => [ "windows" ])
160
- allow(node).to receive(:[]).with(:platform).and_return("windows")
161
- expect(node_map.get(node, :dsc_script)).to eql(:foo)
162
- end
163
- it "should handle :on_platform => :all" do
164
- node_map.set(:link, :foo, :on_platform => :all)
165
- allow(node).to receive(:[]).with(:platform).and_return("windows")
166
- expect(node_map.get(node, :link)).to eql(:foo)
167
- end
168
- end
169
-
170
- end
1
+ #
2
+ # Author:: Lamont Granquist (<lamont@chef.io>)
3
+ # Copyright:: Copyright 2014-2016, Chef Software, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require "spec_helper"
20
+ require "chef/node_map"
21
+
22
+ describe Chef::NodeMap do
23
+
24
+ let(:node_map) { Chef::NodeMap.new }
25
+
26
+ let(:node) { Chef::Node.new }
27
+
28
+ describe "with a bad filter name" do
29
+ it "should raise an error" do
30
+ expect { node_map.set(node, :thing, on_platform_family: "rhel") }.to raise_error(ArgumentError)
31
+ end
32
+ end
33
+
34
+ describe "when no matchers are set at all" do
35
+ before do
36
+ node_map.set(:thing, :foo)
37
+ end
38
+
39
+ it "returns the value" do
40
+ expect(node_map.get(node, :thing)).to eql(:foo)
41
+ end
42
+
43
+ it "returns nil for keys that do not exist" do
44
+ expect(node_map.get(node, :other_thing)).to eql(nil)
45
+ end
46
+ end
47
+
48
+ describe "filtering by os" do
49
+ before do
50
+ node_map.set(:thing, :foo, os: ["windows"])
51
+ node_map.set(:thing, :bar, os: "linux")
52
+ end
53
+ it "returns the correct value for windows" do
54
+ allow(node).to receive(:[]).with(:os).and_return("windows")
55
+ expect(node_map.get(node, :thing)).to eql(:foo)
56
+ end
57
+ it "returns the correct value for linux" do
58
+ allow(node).to receive(:[]).with(:os).and_return("linux")
59
+ expect(node_map.get(node, :thing)).to eql(:bar)
60
+ end
61
+ it "returns nil for a non-matching os" do
62
+ allow(node).to receive(:[]).with(:os).and_return("freebsd")
63
+ expect(node_map.get(node, :thing)).to eql(nil)
64
+ end
65
+ end
66
+
67
+ describe "rejecting an os" do
68
+ before do
69
+ node_map.set(:thing, :foo, os: "!windows")
70
+ end
71
+ it "returns nil for windows" do
72
+ allow(node).to receive(:[]).with(:os).and_return("windows")
73
+ expect(node_map.get(node, :thing)).to eql(nil)
74
+ end
75
+ it "returns the correct value for linux" do
76
+ allow(node).to receive(:[]).with(:os).and_return("linux")
77
+ expect(node_map.get(node, :thing)).to eql(:foo)
78
+ end
79
+ end
80
+
81
+ describe "filtering by os and platform_family" do
82
+ before do
83
+ node_map.set(:thing, :bar, os: "linux", platform_family: "rhel")
84
+ end
85
+
86
+ it "returns the correct value when both match" do
87
+ allow(node).to receive(:[]).with(:os).and_return("linux")
88
+ allow(node).to receive(:[]).with(:platform_family).and_return("rhel")
89
+ expect(node_map.get(node, :thing)).to eql(:bar)
90
+ end
91
+
92
+ it "returns nil for a non-matching os" do
93
+ allow(node).to receive(:[]).with(:os).and_return("freebsd")
94
+ expect(node_map.get(node, :thing)).to eql(nil)
95
+ end
96
+
97
+ it "returns nil when the platform_family does not match" do
98
+ allow(node).to receive(:[]).with(:os).and_return("linux")
99
+ allow(node).to receive(:[]).with(:platform_family).and_return("debian")
100
+ expect(node_map.get(node, :thing)).to eql(nil)
101
+ end
102
+ end
103
+
104
+ describe "with a block doing platform_version checks" do
105
+ before do
106
+ node_map.set(:thing, :foo, platform_family: "rhel") do |node|
107
+ node[:platform_version].to_i >= 7
108
+ end
109
+ end
110
+
111
+ it "returns the value when the node matches" do
112
+ allow(node).to receive(:[]).with(:platform_family).and_return("rhel")
113
+ allow(node).to receive(:[]).with(:platform_version).and_return("7.0")
114
+ expect(node_map.get(node, :thing)).to eql(:foo)
115
+ end
116
+
117
+ it "returns nil when the block does not match" do
118
+ allow(node).to receive(:[]).with(:platform_family).and_return("rhel")
119
+ allow(node).to receive(:[]).with(:platform_version).and_return("6.4")
120
+ expect(node_map.get(node, :thing)).to eql(nil)
121
+ end
122
+
123
+ it "returns nil when the platform_family filter does not match" do
124
+ allow(node).to receive(:[]).with(:platform_family).and_return("debian")
125
+ allow(node).to receive(:[]).with(:platform_version).and_return("7.0")
126
+ expect(node_map.get(node, :thing)).to eql(nil)
127
+ end
128
+
129
+ it "returns nil when both do not match" do
130
+ allow(node).to receive(:[]).with(:platform_family).and_return("debian")
131
+ allow(node).to receive(:[]).with(:platform_version).and_return("6.0")
132
+ expect(node_map.get(node, :thing)).to eql(nil)
133
+ end
134
+
135
+ context "when there is a less specific definition" do
136
+ before do
137
+ node_map.set(:thing, :bar, platform_family: "rhel")
138
+ end
139
+
140
+ it "returns the value when the node matches" do
141
+ allow(node).to receive(:[]).with(:platform_family).and_return("rhel")
142
+ allow(node).to receive(:[]).with(:platform_version).and_return("7.0")
143
+ expect(node_map.get(node, :thing)).to eql(:foo)
144
+ end
145
+ end
146
+ end
147
+
148
+ describe "resource back-compat testing" do
149
+ before :each do
150
+ Chef::Config[:treat_deprecation_warnings_as_errors] = false
151
+ end
152
+
153
+ it "should handle :on_platforms => :all" do
154
+ node_map.set(:chef_gem, :foo, :on_platforms => :all)
155
+ allow(node).to receive(:[]).with(:platform).and_return("windows")
156
+ expect(node_map.get(node, :chef_gem)).to eql(:foo)
157
+ end
158
+ it "should handle :on_platforms => [ 'windows' ]" do
159
+ node_map.set(:dsc_script, :foo, :on_platforms => [ "windows" ])
160
+ allow(node).to receive(:[]).with(:platform).and_return("windows")
161
+ expect(node_map.get(node, :dsc_script)).to eql(:foo)
162
+ end
163
+ it "should handle :on_platform => :all" do
164
+ node_map.set(:link, :foo, :on_platform => :all)
165
+ allow(node).to receive(:[]).with(:platform).and_return("windows")
166
+ expect(node_map.get(node, :link)).to eql(:foo)
167
+ end
168
+ end
169
+
170
+ end
@@ -1,1836 +1,1836 @@
1
- #
2
- # Author:: Adam Jacob (<adam@chef.io>)
3
- # Copyright:: Copyright 2008-2016, Chef Software, Inc.
4
- # License:: Apache License, Version 2.0
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
- #
18
-
19
- require "spec_helper"
20
- require "ostruct"
21
-
22
- describe Chef::Node do
23
-
24
- let(:node) { Chef::Node.new() }
25
- let(:platform_introspector) { node }
26
-
27
- it_behaves_like "a platform introspector"
28
-
29
- it "creates a node and assigns it a name" do
30
- node = Chef::Node.build("solo-node")
31
- expect(node.name).to eq("solo-node")
32
- end
33
-
34
- it "should validate the name of the node" do
35
- expect { Chef::Node.build("solo node") }.to raise_error(Chef::Exceptions::ValidationFailed)
36
- end
37
-
38
- it "should be sortable" do
39
- n1 = Chef::Node.build("alpha")
40
- n2 = Chef::Node.build("beta")
41
- n3 = Chef::Node.build("omega")
42
- expect([n3, n1, n2].sort).to eq([n1, n2, n3])
43
- end
44
-
45
- it "should share identity only with others of the same name" do
46
- n1 = Chef::Node.build("foo")
47
- n2 = Chef::Node.build("foo")
48
- n3 = Chef::Node.build("bar")
49
- expect(n1).to eq(n2)
50
- expect(n1).not_to eq(n3)
51
- end
52
-
53
- describe "when the node does not exist on the server" do
54
- before do
55
- response = OpenStruct.new(:code => "404")
56
- exception = Net::HTTPServerException.new("404 not found", response)
57
- allow(Chef::Node).to receive(:load).and_raise(exception)
58
- node.name("created-node")
59
- end
60
-
61
- it "creates a new node for find_or_create" do
62
- allow(Chef::Node).to receive(:new).and_return(node)
63
- expect(node).to receive(:create).and_return(node)
64
- node = Chef::Node.find_or_create("created-node")
65
- expect(node.name).to eq("created-node")
66
- expect(node).to equal(node)
67
- end
68
- end
69
-
70
- describe "when the node exists on the server" do
71
- before do
72
- node.name("existing-node")
73
- allow(Chef::Node).to receive(:load).and_return(node)
74
- end
75
-
76
- it "loads the node via the REST API for find_or_create" do
77
- expect(Chef::Node.find_or_create("existing-node")).to equal(node)
78
- end
79
- end
80
-
81
- describe "run_state" do
82
- it "is an empty hash" do
83
- expect(node.run_state).to respond_to(:keys)
84
- expect(node.run_state).to be_empty
85
- end
86
- end
87
-
88
- describe "initialize" do
89
- it "should default to the '_default' chef_environment" do
90
- n = Chef::Node.new
91
- expect(n.chef_environment).to eq("_default")
92
- end
93
- end
94
-
95
- describe "name" do
96
- it "should allow you to set a name with name(something)" do
97
- expect { node.name("latte") }.not_to raise_error
98
- end
99
-
100
- it "should return the name with name()" do
101
- node.name("latte")
102
- expect(node.name).to eql("latte")
103
- end
104
-
105
- it "should always have a string for name" do
106
- expect { node.name(Hash.new) }.to raise_error(ArgumentError)
107
- end
108
-
109
- it "cannot be blank" do
110
- expect { node.name("") }.to raise_error(Chef::Exceptions::ValidationFailed)
111
- end
112
-
113
- it "should not accept name doesn't match /^[\-[:alnum:]_:.]+$/" do
114
- expect { node.name("space in it") }.to raise_error(Chef::Exceptions::ValidationFailed)
115
- end
116
- end
117
-
118
- describe "chef_environment" do
119
- it "should set an environment with chef_environment(something)" do
120
- expect { node.chef_environment("latte") }.not_to raise_error
121
- end
122
-
123
- it "should return the chef_environment with chef_environment()" do
124
- node.chef_environment("latte")
125
- expect(node.chef_environment).to eq("latte")
126
- end
127
-
128
- it "should disallow non-strings" do
129
- expect { node.chef_environment(Hash.new) }.to raise_error(ArgumentError)
130
- expect { node.chef_environment(42) }.to raise_error(ArgumentError)
131
- end
132
-
133
- it "cannot be blank" do
134
- expect { node.chef_environment("") }.to raise_error(Chef::Exceptions::ValidationFailed)
135
- end
136
- end
137
-
138
- describe "policy_name" do
139
-
140
- it "defaults to nil" do
141
- expect(node.policy_name).to be_nil
142
- end
143
-
144
- it "sets policy_name with a regular setter" do
145
- node.policy_name = "example-policy"
146
- expect(node.policy_name).to eq("example-policy")
147
- end
148
-
149
- it "allows policy_name with every valid character" do
150
- expect { node.policy_name = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqurstuvwxyz0123456789-_:." }.to_not raise_error
151
- end
152
-
153
- it "sets policy_name when given an argument" do
154
- node.policy_name("example-policy")
155
- expect(node.policy_name).to eq("example-policy")
156
- end
157
-
158
- it "sets policy_name to nil when given nil" do
159
- node.policy_name = "example-policy"
160
- node.policy_name = nil
161
- expect(node.policy_name).to be_nil
162
- end
163
-
164
- it "disallows non-strings" do
165
- expect { node.policy_name(Hash.new) }.to raise_error(Chef::Exceptions::ValidationFailed)
166
- expect { node.policy_name(42) }.to raise_error(Chef::Exceptions::ValidationFailed)
167
- end
168
-
169
- it "cannot be blank" do
170
- expect { node.policy_name("") }.to raise_error(Chef::Exceptions::ValidationFailed)
171
- end
172
- end
173
-
174
- describe "policy_group" do
175
-
176
- it "defaults to nil" do
177
- expect(node.policy_group).to be_nil
178
- end
179
-
180
- it "sets policy_group with a regular setter" do
181
- node.policy_group = "staging"
182
- expect(node.policy_group).to eq("staging")
183
- end
184
-
185
- it "allows policy_group with every valid character" do
186
- expect { node.policy_group = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqurstuvwxyz0123456789-_:." }.to_not raise_error
187
- end
188
-
189
- it "sets an environment with chef_environment(something)" do
190
- node.policy_group("staging")
191
- expect(node.policy_group).to eq("staging")
192
- end
193
-
194
- it "sets policy_group to nil when given nil" do
195
- node.policy_group = "staging"
196
- node.policy_group = nil
197
- expect(node.policy_group).to be_nil
198
- end
199
-
200
- it "disallows non-strings" do
201
- expect { node.policy_group(Hash.new) }.to raise_error(Chef::Exceptions::ValidationFailed)
202
- expect { node.policy_group(42) }.to raise_error(Chef::Exceptions::ValidationFailed)
203
- end
204
-
205
- it "cannot be blank" do
206
- expect { node.policy_group("") }.to raise_error(Chef::Exceptions::ValidationFailed)
207
- end
208
- end
209
-
210
- describe "attributes" do
211
- it "should have attributes" do
212
- expect(node.attribute).to be_a_kind_of(Hash)
213
- end
214
-
215
- it "should allow attributes to be accessed by name or symbol directly on node[]" do
216
- node.default["locust"] = "something"
217
- expect(node[:locust]).to eql("something")
218
- expect(node["locust"]).to eql("something")
219
- end
220
-
221
- it "should return nil if it cannot find an attribute with node[]" do
222
- expect(node["secret"]).to eql(nil)
223
- end
224
-
225
- it "does not allow you to set an attribute via node[]=" do
226
- expect { node["secret"] = "shush" }.to raise_error(Chef::Exceptions::ImmutableAttributeModification)
227
- end
228
-
229
- it "should allow you to query whether an attribute exists with attribute?" do
230
- node.default["locust"] = "something"
231
- expect(node.attribute?("locust")).to eql(true)
232
- expect(node.attribute?("no dice")).to eql(false)
233
- end
234
-
235
- it "should let you go deep with attribute?" do
236
- node.normal["battles"]["people"]["wonkey"] = true
237
- expect(node["battles"]["people"].attribute?("wonkey")).to eq(true)
238
- expect(node["battles"]["people"].attribute?("snozzberry")).to eq(false)
239
- end
240
-
241
- it "does not allow you to set an attribute via method_missing" do
242
- Chef::Config[:treat_deprecation_warnings_as_errors] = false
243
- expect { node.sunshine = "is bright" }.to raise_error(Chef::Exceptions::ImmutableAttributeModification)
244
- end
245
-
246
- it "does not allow modification of node attributes via hash methods" do
247
- Chef::Config[:treat_deprecation_warnings_as_errors] = false
248
- node.default["h4sh"] = { foo: "bar" }
249
- expect { node["h4sh"].delete("foo") }.to raise_error(Chef::Exceptions::ImmutableAttributeModification)
250
- expect { node.h4sh.delete("foo") }.to raise_error(Chef::Exceptions::ImmutableAttributeModification)
251
- end
252
-
253
- it "does not allow modification of node attributes via array methods" do
254
- Chef::Config[:treat_deprecation_warnings_as_errors] = false
255
- node.default["array"] = []
256
- expect { node["array"] << "boom" }.to raise_error(Chef::Exceptions::ImmutableAttributeModification)
257
- expect { node.array << "boom" }.to raise_error(Chef::Exceptions::ImmutableAttributeModification)
258
- end
259
-
260
- it "returns merged immutable attributes for arrays" do
261
- Chef::Config[:treat_deprecation_warnings_as_errors] = false
262
- node.default["array"] = []
263
- expect( node["array"].class ).to eql(Chef::Node::ImmutableArray)
264
- expect( node.array.class ).to eql(Chef::Node::ImmutableArray)
265
- end
266
-
267
- it "returns merged immutable attributes for hashes" do
268
- Chef::Config[:treat_deprecation_warnings_as_errors] = false
269
- node.default["h4sh"] = {}
270
- expect( node["h4sh"].class ).to eql(Chef::Node::ImmutableMash)
271
- expect( node.h4sh.class ).to eql(Chef::Node::ImmutableMash)
272
- end
273
-
274
- it "should allow you get get an attribute via method_missing" do
275
- Chef::Config[:treat_deprecation_warnings_as_errors] = false
276
- node.default.sunshine = "is bright"
277
- expect(node.sunshine).to eql("is bright")
278
- end
279
-
280
- describe "normal attributes" do
281
- it "should allow you to set an attribute with set, without pre-declaring a hash" do
282
- node.normal[:snoopy][:is_a_puppy] = true
283
- expect(node[:snoopy][:is_a_puppy]).to eq(true)
284
- end
285
-
286
- it "should allow you to set an attribute with set_unless with method_missing but emit a deprecation warning" do
287
- Chef::Config[:treat_deprecation_warnings_as_errors] = false
288
- node.normal_unless.snoopy.is_a_puppy = false
289
- expect(node[:snoopy][:is_a_puppy]).to eq(false)
290
- end
291
-
292
- it "should allow you to set an attribute with set_unless" do
293
- node.normal_unless[:snoopy][:is_a_puppy] = false
294
- expect(node[:snoopy][:is_a_puppy]).to eq(false)
295
- end
296
-
297
- it "should not allow you to set an attribute with set_unless if it already exists" do
298
- node.normal[:snoopy][:is_a_puppy] = true
299
- node.normal_unless[:snoopy][:is_a_puppy] = false
300
- expect(node[:snoopy][:is_a_puppy]).to eq(true)
301
- end
302
-
303
- it "should allow you to set an attribute with set_unless if is a nil value" do
304
- node.attributes.normal = { snoopy: { is_a_puppy: nil } }
305
- node.normal_unless[:snoopy][:is_a_puppy] = false
306
- expect(node[:snoopy][:is_a_puppy]).to eq(false)
307
- end
308
-
309
- it "should allow you to set a value after a set_unless" do
310
- # this tests for set_unless_present state bleeding between statements CHEF-3806
311
- node.normal_unless[:snoopy][:is_a_puppy] = false
312
- node.normal[:snoopy][:is_a_puppy] = true
313
- expect(node[:snoopy][:is_a_puppy]).to eq(true)
314
- end
315
-
316
- it "should let you set a value after a 'dangling' set_unless" do
317
- # this tests for set_unless_present state bleeding between statements CHEF-3806
318
- node.normal[:snoopy][:is_a_puppy] = "what"
319
- node.normal_unless[:snoopy][:is_a_puppy]
320
- node.normal[:snoopy][:is_a_puppy] = true
321
- expect(node[:snoopy][:is_a_puppy]).to eq(true)
322
- end
323
-
324
- it "auto-vivifies attributes created via method syntax" do
325
- Chef::Config[:treat_deprecation_warnings_as_errors] = false
326
- node.normal.fuu.bahrr.baz = "qux"
327
- expect(node.fuu.bahrr.baz).to eq("qux")
328
- end
329
-
330
- it "should let you use tag as a convience method for the tags attribute" do
331
- node.normal["tags"] = %w{one two}
332
- node.tag("three", "four")
333
- expect(node["tags"]).to eq(%w{one two three four})
334
- end
335
-
336
- it "set is a deprecated alias for normal" do
337
- Chef::Config[:treat_deprecation_warnings_as_errors] = false
338
- expect(Chef).to receive(:deprecated).with(:attributes, /set is deprecated/)
339
- node.set[:snoopy][:is_a_puppy] = true
340
- expect(node.normal[:snoopy][:is_a_puppy]).to eq(true)
341
- end
342
-
343
- it "set_unless is a deprecated alias for normal_unless" do
344
- Chef::Config[:treat_deprecation_warnings_as_errors] = false
345
- expect(Chef).to receive(:deprecated).with(:attributes, /set_unless is deprecated/)
346
- node.set_unless[:snoopy][:is_a_puppy] = false
347
- expect(node.normal[:snoopy][:is_a_puppy]).to eq(false)
348
- end
349
-
350
- it "normal_unless sets a value even if default or override attrs are set" do
351
- node.default[:decontamination] = true
352
- node.override[:decontamination] = false
353
- node.normal_unless[:decontamination] = "foo"
354
- expect(node.normal[:decontamination]).to eql("foo")
355
- end
356
-
357
- it "default_unless sets a value even if normal or override attrs are set" do
358
- node.normal[:decontamination] = true
359
- node.override[:decontamination] = false
360
- node.default_unless[:decontamination] = "foo"
361
- expect(node.default[:decontamination]).to eql("foo")
362
- end
363
-
364
- it "override_unless sets a value even if default or normal attrs are set" do
365
- node.default[:decontamination] = true
366
- node.normal[:decontamination] = false
367
- node.override_unless[:decontamination] = "foo"
368
- expect(node.override[:decontamination]).to eql("foo")
369
- end
370
- end
371
-
372
- describe "default attributes" do
373
- it "should be set with default, without pre-declaring a hash" do
374
- node.default[:snoopy][:is_a_puppy] = true
375
- expect(node[:snoopy][:is_a_puppy]).to eq(true)
376
- end
377
-
378
- it "should allow you to set with default_unless without pre-declaring a hash" do
379
- node.default_unless[:snoopy][:is_a_puppy] = false
380
- expect(node[:snoopy][:is_a_puppy]).to eq(false)
381
- end
382
-
383
- it "should not allow you to set an attribute with default_unless if it already exists" do
384
- node.default[:snoopy][:is_a_puppy] = true
385
- node.default_unless[:snoopy][:is_a_puppy] = false
386
- expect(node[:snoopy][:is_a_puppy]).to eq(true)
387
- end
388
-
389
- it "should allow you to set a value after a default_unless" do
390
- # this tests for set_unless_present state bleeding between statements CHEF-3806
391
- node.default_unless[:snoopy][:is_a_puppy] = false
392
- node.default[:snoopy][:is_a_puppy] = true
393
- expect(node[:snoopy][:is_a_puppy]).to eq(true)
394
- end
395
-
396
- it "should allow you to set a value after a 'dangling' default_unless" do
397
- # this tests for set_unless_present state bleeding between statements CHEF-3806
398
- node.default[:snoopy][:is_a_puppy] = "what"
399
- node.default_unless[:snoopy][:is_a_puppy]
400
- node.default[:snoopy][:is_a_puppy] = true
401
- expect(node[:snoopy][:is_a_puppy]).to eq(true)
402
- end
403
-
404
- it "does not exhibit chef/chef/issues/5005 bug" do
405
- node.env_default["a"]["r1"]["g"]["u"] = "u1"
406
- node.default_unless["a"]["r1"]["g"]["r"] = "r"
407
- expect(node["a"]["r1"]["g"]["u"]).to eql("u1")
408
- end
409
-
410
- it "auto-vivifies attributes created via method syntax" do
411
- Chef::Config[:treat_deprecation_warnings_as_errors] = false
412
- node.default.fuu.bahrr.baz = "qux"
413
- expect(node.fuu.bahrr.baz).to eq("qux")
414
- end
415
-
416
- it "default_unless correctly resets the deep merge cache" do
417
- node.normal["tags"] = [] # this sets our top-level breadcrumb
418
- node.default_unless["foo"]["bar"] = "NK-19V"
419
- expect(node["foo"]["bar"]).to eql("NK-19V")
420
- node.default_unless["foo"]["baz"] = "NK-33"
421
- expect(node["foo"]["baz"]).to eql("NK-33")
422
- end
423
-
424
- it "normal_unless correctly resets the deep merge cache" do
425
- node.normal["tags"] = [] # this sets our top-level breadcrumb
426
- node.normal_unless["foo"]["bar"] = "NK-19V"
427
- expect(node["foo"]["bar"]).to eql("NK-19V")
428
- node.normal_unless["foo"]["baz"] = "NK-33"
429
- expect(node["foo"]["baz"]).to eql("NK-33")
430
- end
431
-
432
- it "override_unless correctly resets the deep merge cache" do
433
- node.normal["tags"] = [] # this sets our top-level breadcrumb
434
- node.override_unless["foo"]["bar"] = "NK-19V"
435
- expect(node["foo"]["bar"]).to eql("NK-19V")
436
- node.override_unless["foo"]["baz"] = "NK-33"
437
- expect(node["foo"]["baz"]).to eql("NK-33")
438
- end
439
- end
440
-
441
- describe "override attributes" do
442
- it "should be set with override, without pre-declaring a hash" do
443
- node.override[:snoopy][:is_a_puppy] = true
444
- expect(node[:snoopy][:is_a_puppy]).to eq(true)
445
- end
446
-
447
- it "should allow you to set with override_unless without pre-declaring a hash" do
448
- node.override_unless[:snoopy][:is_a_puppy] = false
449
- expect(node[:snoopy][:is_a_puppy]).to eq(false)
450
- end
451
-
452
- it "should not allow you to set an attribute with override_unless if it already exists" do
453
- node.override[:snoopy][:is_a_puppy] = true
454
- node.override_unless[:snoopy][:is_a_puppy] = false
455
- expect(node[:snoopy][:is_a_puppy]).to eq(true)
456
- end
457
-
458
- it "should allow you to set a value after an override_unless" do
459
- # this tests for set_unless_present state bleeding between statements CHEF-3806
460
- node.override_unless[:snoopy][:is_a_puppy] = false
461
- node.override[:snoopy][:is_a_puppy] = true
462
- expect(node[:snoopy][:is_a_puppy]).to eq(true)
463
- end
464
-
465
- it "should allow you to set a value after a 'dangling' override_unless" do
466
- # this tests for set_unless_present state bleeding between statements CHEF-3806
467
- node.override_unless[:snoopy][:is_a_puppy] = "what"
468
- node.override_unless[:snoopy][:is_a_puppy]
469
- node.override[:snoopy][:is_a_puppy] = true
470
- expect(node[:snoopy][:is_a_puppy]).to eq(true)
471
- end
472
-
473
- it "auto-vivifies attributes created via method syntax" do
474
- Chef::Config[:treat_deprecation_warnings_as_errors] = false
475
- node.override.fuu.bahrr.baz = "qux"
476
- expect(node.fuu.bahrr.baz).to eq("qux")
477
- end
478
- end
479
-
480
- describe "globally deleting attributes" do
481
- context "with hash values" do
482
- before do
483
- node.role_default["mysql"]["server"]["port"] = 1234
484
- node.normal["mysql"]["server"]["port"] = 2345
485
- node.override["mysql"]["server"]["port"] = 3456
486
- end
487
-
488
- it "deletes all the values and returns the value with the highest precidence" do
489
- expect( node.rm("mysql", "server", "port") ).to eql(3456)
490
- expect( node["mysql"]["server"]["port"] ).to be_nil
491
- expect( node["mysql"]["server"] ).to eql({})
492
- end
493
-
494
- it "deletes nested things correctly" do
495
- node.default["mysql"]["client"]["client_setting"] = "foo"
496
- expect( node.rm("mysql", "server") ).to eql( { "port" => 3456 } )
497
- expect( node["mysql"] ).to eql( { "client" => { "client_setting" => "foo" } } )
498
- end
499
-
500
- it "returns nil if the node attribute does not exist" do
501
- expect( node.rm("no", "such", "thing") ).to be_nil
502
- end
503
-
504
- it "can delete the entire tree" do
505
- expect( node.rm("mysql") ).to eql({ "server" => { "port" => 3456 } })
506
- end
507
- end
508
-
509
- context "when trying to delete through a thing that isn't an array-like or hash-like object" do
510
- before do
511
- node.default["mysql"] = true
512
- end
513
-
514
- it "returns nil when you're two levels deeper" do
515
- expect( node.rm("mysql", "server", "port") ).to eql(nil)
516
- end
517
-
518
- it "returns nil when you're one level deeper" do
519
- expect( node.rm("mysql", "server") ).to eql(nil)
520
- end
521
-
522
- it "correctly deletes at the top level" do
523
- expect( node.rm("mysql") ).to eql(true)
524
- end
525
- end
526
-
527
- context "with array indexes" do
528
- before do
529
- node.role_default["mysql"]["server"][0]["port"] = 1234
530
- node.normal["mysql"]["server"][0]["port"] = 2345
531
- node.override["mysql"]["server"][0]["port"] = 3456
532
- node.override["mysql"]["server"][1]["port"] = 3456
533
- end
534
-
535
- it "deletes the array element" do
536
- expect( node.rm("mysql", "server", 0, "port") ).to eql(3456)
537
- expect( node["mysql"]["server"][0]["port"] ).to be_nil
538
- expect( node["mysql"]["server"][1]["port"] ).to eql(3456)
539
- end
540
- end
541
-
542
- context "with real arrays" do
543
- before do
544
- node.role_default["mysql"]["server"] = [ {
545
- "port" => 1234,
546
- } ]
547
- node.normal["mysql"]["server"] = [ {
548
- "port" => 2345,
549
- } ]
550
- node.override["mysql"]["server"] = [ {
551
- "port" => 3456,
552
- } ]
553
- end
554
-
555
- it "deletes the array element" do
556
- expect( node.rm("mysql", "server", 0, "port") ).to eql(3456)
557
- expect( node["mysql"]["server"][0]["port"] ).to be_nil
558
- end
559
-
560
- it "when mistaking arrays for hashes, it considers the value removed and does nothing" do
561
- node.rm("mysql", "server", "port")
562
- expect(node["mysql"]["server"][0]["port"]).to eql(3456)
563
- end
564
- end
565
- end
566
-
567
- describe "granular deleting attributes" do
568
- context "when only defaults exist" do
569
- before do
570
- node.role_default["mysql"]["server"]["port"] = 1234
571
- node.default["mysql"]["server"]["port"] = 2345
572
- node.force_default["mysql"]["server"]["port"] = 3456
573
- end
574
-
575
- it "returns the deleted values" do
576
- expect( node.rm_default("mysql", "server", "port") ).to eql(3456)
577
- end
578
-
579
- it "returns nil for the combined attribues" do
580
- expect( node.rm_default("mysql", "server", "port") ).to eql(3456)
581
- expect( node["mysql"]["server"]["port"] ).to eql(nil)
582
- end
583
-
584
- it "returns an empty hash for the default attrs" do
585
- expect( node.rm_default("mysql", "server", "port") ).to eql(3456)
586
- # this auto-vivifies, should it?
587
- expect( node.default_attrs["mysql"]["server"]["port"] ).to eql({})
588
- end
589
-
590
- it "returns an empty hash after the last key is deleted" do
591
- expect( node.rm_default("mysql", "server", "port") ).to eql(3456)
592
- expect( node["mysql"]["server"] ).to eql({})
593
- end
594
- end
595
-
596
- context "when trying to delete through a thing that isn't an array-like or hash-like object" do
597
- before do
598
- node.default["mysql"] = true
599
- end
600
-
601
- it "returns nil when you're two levels deeper" do
602
- expect( node.rm_default("mysql", "server", "port") ).to eql(nil)
603
- end
604
-
605
- it "returns nil when you're one level deeper" do
606
- expect( node.rm_default("mysql", "server") ).to eql(nil)
607
- end
608
-
609
- it "correctly deletes at the top level" do
610
- expect( node.rm_default("mysql") ).to eql(true)
611
- end
612
- end
613
-
614
- context "when a higher precedence exists" do
615
- before do
616
- node.role_default["mysql"]["server"]["port"] = 1234
617
- node.default["mysql"]["server"]["port"] = 2345
618
- node.force_default["mysql"]["server"]["port"] = 3456
619
-
620
- node.override["mysql"]["server"]["port"] = 9999
621
- end
622
-
623
- it "returns the deleted values" do
624
- expect( node.rm_default("mysql", "server", "port") ).to eql(3456)
625
- end
626
-
627
- it "returns the higher precedence values after the delete" do
628
- expect( node.rm_default("mysql", "server", "port") ).to eql(3456)
629
- expect( node["mysql"]["server"]["port"] ).to eql(9999)
630
- end
631
-
632
- it "returns an empty has for the default attrs" do
633
- expect( node.rm_default("mysql", "server", "port") ).to eql(3456)
634
- # this auto-vivifies, should it?
635
- expect( node.default_attrs["mysql"]["server"]["port"] ).to eql({})
636
- end
637
- end
638
-
639
- context "when a lower precedence exists" do
640
- before do
641
- node.default["mysql"]["server"]["port"] = 2345
642
- node.override["mysql"]["server"]["port"] = 9999
643
- node.role_override["mysql"]["server"]["port"] = 9876
644
- node.force_override["mysql"]["server"]["port"] = 6669
645
- end
646
-
647
- it "returns the deleted values" do
648
- expect( node.rm_override("mysql", "server", "port") ).to eql(6669)
649
- end
650
-
651
- it "returns the lower precedence levels after the delete" do
652
- expect( node.rm_override("mysql", "server", "port") ).to eql(6669)
653
- expect( node["mysql"]["server"]["port"] ).to eql(2345)
654
- end
655
-
656
- it "returns an empty has for the override attrs" do
657
- expect( node.rm_override("mysql", "server", "port") ).to eql(6669)
658
- # this auto-vivifies, should it?
659
- expect( node.override_attrs["mysql"]["server"]["port"] ).to eql({})
660
- end
661
- end
662
-
663
- it "rm_default returns nil on deleting non-existent values" do
664
- expect( node.rm_default("no", "such", "thing") ).to be_nil
665
- end
666
-
667
- it "rm_normal returns nil on deleting non-existent values" do
668
- expect( node.rm_normal("no", "such", "thing") ).to be_nil
669
- end
670
-
671
- it "rm_override returns nil on deleting non-existent values" do
672
- expect( node.rm_override("no", "such", "thing") ).to be_nil
673
- end
674
- end
675
-
676
- describe "granular replacing attributes" do
677
- it "removes everything at the level of the last key" do
678
- node.default["mysql"]["server"]["port"] = 2345
679
-
680
- node.default!["mysql"]["server"] = { "data_dir" => "/my_raid_volume/lib/mysql" }
681
-
682
- expect( node["mysql"]["server"] ).to eql({ "data_dir" => "/my_raid_volume/lib/mysql" })
683
- end
684
-
685
- it "replaces a value at the cookbook sub-level of the atributes only" do
686
- node.default["mysql"]["server"]["port"] = 2345
687
- node.default["mysql"]["server"]["service_name"] = "fancypants-sql"
688
- node.role_default["mysql"]["server"]["port"] = 1234
689
- node.force_default["mysql"]["server"]["port"] = 3456
690
-
691
- node.default!["mysql"]["server"] = { "data_dir" => "/my_raid_volume/lib/mysql" }
692
-
693
- expect( node["mysql"]["server"]["port"] ).to eql(3456)
694
- expect( node["mysql"]["server"]["service_name"] ).to be_nil
695
- expect( node["mysql"]["server"]["data_dir"] ).to eql("/my_raid_volume/lib/mysql")
696
- expect( node["mysql"]["server"] ).to eql({ "port" => 3456, "data_dir" => "/my_raid_volume/lib/mysql" })
697
- end
698
-
699
- it "higher precedence values aren't removed" do
700
- node.role_default["mysql"]["server"]["port"] = 1234
701
- node.default["mysql"]["server"]["port"] = 2345
702
- node.force_default["mysql"]["server"]["port"] = 3456
703
- node.override["mysql"]["server"]["service_name"] = "fancypants-sql"
704
-
705
- node.default!["mysql"]["server"] = { "data_dir" => "/my_raid_volume/lib/mysql" }
706
-
707
- expect( node["mysql"]["server"]["port"] ).to eql(3456)
708
- expect( node["mysql"]["server"]["data_dir"] ).to eql("/my_raid_volume/lib/mysql")
709
- expect( node["mysql"]["server"] ).to eql({ "service_name" => "fancypants-sql", "port" => 3456, "data_dir" => "/my_raid_volume/lib/mysql" })
710
- end
711
- end
712
-
713
- describe "granular force replacing attributes" do
714
- it "removes everything at the level of the last key" do
715
- node.force_default["mysql"]["server"]["port"] = 2345
716
-
717
- node.force_default!["mysql"]["server"] = {
718
- "data_dir" => "/my_raid_volume/lib/mysql",
719
- }
720
-
721
- expect( node["mysql"]["server"] ).to eql({
722
- "data_dir" => "/my_raid_volume/lib/mysql",
723
- })
724
- end
725
-
726
- it "removes all values from the precedence level when setting" do
727
- node.role_default["mysql"]["server"]["port"] = 1234
728
- node.default["mysql"]["server"]["port"] = 2345
729
- node.force_default["mysql"]["server"]["port"] = 3456
730
-
731
- node.force_default!["mysql"]["server"] = {
732
- "data_dir" => "/my_raid_volume/lib/mysql",
733
- }
734
-
735
- expect( node["mysql"]["server"]["port"] ).to be_nil
736
- expect( node["mysql"]["server"]["data_dir"] ).to eql("/my_raid_volume/lib/mysql")
737
- expect( node["mysql"]["server"] ).to eql({
738
- "data_dir" => "/my_raid_volume/lib/mysql",
739
- })
740
- end
741
-
742
- it "higher precedence levels are not removed" do
743
- node.role_default["mysql"]["server"]["port"] = 1234
744
- node.default["mysql"]["server"]["port"] = 2345
745
- node.force_default["mysql"]["server"]["port"] = 3456
746
- node.override["mysql"]["server"]["service_name"] = "fancypants-sql"
747
-
748
- node.force_default!["mysql"]["server"] = {
749
- "data_dir" => "/my_raid_volume/lib/mysql",
750
- }
751
-
752
- expect( node["mysql"]["server"]["port"] ).to be_nil
753
- expect( node["mysql"]["server"]["data_dir"] ).to eql("/my_raid_volume/lib/mysql")
754
- expect( node["mysql"]["server"] ).to eql({
755
- "service_name" => "fancypants-sql",
756
- "data_dir" => "/my_raid_volume/lib/mysql",
757
- })
758
- end
759
-
760
- it "will autovivify" do
761
- node.force_default!["mysql"]["server"] = {
762
- "data_dir" => "/my_raid_volume/lib/mysql",
763
- }
764
- expect( node["mysql"]["server"]["data_dir"] ).to eql("/my_raid_volume/lib/mysql")
765
- end
766
-
767
- it "lower precedence levels aren't removed" do
768
- node.role_override["mysql"]["server"]["port"] = 1234
769
- node.override["mysql"]["server"]["port"] = 2345
770
- node.force_override["mysql"]["server"]["port"] = 3456
771
- node.default["mysql"]["server"]["service_name"] = "fancypants-sql"
772
-
773
- node.force_override!["mysql"]["server"] = {
774
- "data_dir" => "/my_raid_volume/lib/mysql",
775
- }
776
-
777
- expect( node["mysql"]["server"]["port"] ).to be_nil
778
- expect( node["mysql"]["server"]["data_dir"] ).to eql("/my_raid_volume/lib/mysql")
779
- expect( node["mysql"]["server"] ).to eql({
780
- "service_name" => "fancypants-sql",
781
- "data_dir" => "/my_raid_volume/lib/mysql",
782
- })
783
- end
784
-
785
- it "when overwriting a non-hash/array" do
786
- node.override["mysql"] = false
787
- node.force_override["mysql"] = true
788
- node.force_override!["mysql"]["server"] = {
789
- "data_dir" => "/my_raid_volume/lib/mysql",
790
- }
791
- expect( node["mysql"]["server"]["data_dir"] ).to eql("/my_raid_volume/lib/mysql")
792
- end
793
-
794
- it "when overwriting an array with a hash" do
795
- node.force_override["mysql"][0] = true
796
- node.force_override!["mysql"]["server"] = {
797
- "data_dir" => "/my_raid_volume/lib/mysql",
798
- }
799
- expect( node["mysql"]["server"] ).to eql({
800
- "data_dir" => "/my_raid_volume/lib/mysql",
801
- })
802
- end
803
- end
804
-
805
- # In Chef-12.0 there is a deep_merge cache on the top level attribute which had a bug
806
- # where it cached node[:foo] separate from node['foo']. These tests exercise those edge conditions.
807
- #
808
- # https://github.com/chef/chef/issues/2700
809
- # https://github.com/chef/chef/issues/2712
810
- # https://github.com/chef/chef/issues/2745
811
- #
812
- describe "deep merge attribute cache edge conditions" do
813
- it "does not error with complicated attribute substitution" do
814
- Chef::Config[:treat_deprecation_warnings_as_errors] = false
815
- node.default["chef_attribute_hell"]["attr1"] = "attribute1"
816
- node.default["chef_attribute_hell"]["attr2"] = "#{node.chef_attribute_hell.attr1}/attr2"
817
- expect { node.default["chef_attribute_hell"]["attr3"] = "#{node.chef_attribute_hell.attr2}/attr3" }.not_to raise_error
818
- end
819
-
820
- it "caches both strings and symbols correctly" do
821
- node.force_default[:solr][:version] = "4.10.2"
822
- node.force_default[:solr][:data_dir] = "/opt/solr-#{node['solr'][:version]}/example/solr"
823
- node.force_default[:solr][:xms] = "512M"
824
- expect(node[:solr][:xms]).to eql("512M")
825
- expect(node["solr"][:xms]).to eql("512M")
826
- end
827
-
828
- it "method interpolation syntax also works" do
829
- Chef::Config[:treat_deprecation_warnings_as_errors] = false
830
- node.default["passenger"]["version"] = "4.0.57"
831
- node.default["passenger"]["root_path"] = "passenger-#{node['passenger']['version']}"
832
- node.default["passenger"]["root_path_2"] = "passenger-#{node.passenger['version']}"
833
- expect(node["passenger"]["root_path_2"]).to eql("passenger-4.0.57")
834
- expect(node[:passenger]["root_path_2"]).to eql("passenger-4.0.57")
835
- end
836
- end
837
-
838
- it "should raise an ArgumentError if you ask for an attribute that doesn't exist via method_missing" do
839
- Chef::Config[:treat_deprecation_warnings_as_errors] = false
840
- expect { node.sunshine }.to raise_error(NoMethodError)
841
- end
842
-
843
- it "should allow you to iterate over attributes with each_attribute" do
844
- node.default.sunshine = "is bright"
845
- node.default.canada = "is a nice place"
846
- seen_attributes = Hash.new
847
- node.each_attribute do |a, v|
848
- seen_attributes[a] = v
849
- end
850
- expect(seen_attributes).to have_key("sunshine")
851
- expect(seen_attributes).to have_key("canada")
852
- expect(seen_attributes["sunshine"]).to eq("is bright")
853
- expect(seen_attributes["canada"]).to eq("is a nice place")
854
- end
855
-
856
- describe "functional attribute API" do
857
- # deeper functional testing of this API is in the VividMash spec tests
858
- it "should have an exist? function" do
859
- node.default["foo"]["bar"] = "baz"
860
- expect(node.exist?("foo", "bar")).to be true
861
- expect(node.exist?("bar", "foo")).to be false
862
- end
863
-
864
- it "should have a read function" do
865
- node.override["foo"]["bar"] = "baz"
866
- expect(node.read("foo", "bar")).to eql("baz")
867
- expect(node.read("bar", "foo")).to eql(nil)
868
- end
869
-
870
- it "should have a read! function" do
871
- node.override["foo"]["bar"] = "baz"
872
- expect(node.read!("foo", "bar")).to eql("baz")
873
- expect { node.read!("bar", "foo") }.to raise_error(Chef::Exceptions::NoSuchAttribute)
874
- end
875
-
876
- it "delegates write(:level) to node.level.write()" do
877
- node.write(:default, "foo", "bar", "baz")
878
- expect(node.default["foo"]["bar"]).to eql("baz")
879
- end
880
-
881
- it "delegates write!(:level) to node.level.write!()" do
882
- node.write!(:default, "foo", "bar", "baz")
883
- expect(node.default["foo"]["bar"]).to eql("baz")
884
- node.default["bar"] = true
885
- expect { node.write!(:default, "bar", "foo", "baz") }.to raise_error(Chef::Exceptions::AttributeTypeMismatch)
886
- end
887
-
888
- it "delegates unlink(:level) to node.level.unlink()" do
889
- node.default["foo"]["bar"] = "baz"
890
- expect(node.unlink(:default, "foo", "bar")).to eql("baz")
891
- expect(node.unlink(:default, "bar", "foo")).to eql(nil)
892
- end
893
-
894
- it "delegates unlink!(:level) to node.level.unlink!()" do
895
- node.default["foo"]["bar"] = "baz"
896
- expect(node.unlink!(:default, "foo", "bar")).to eql("baz")
897
- expect { node.unlink!(:default, "bar", "foo") }.to raise_error(Chef::Exceptions::NoSuchAttribute)
898
- end
899
- end
900
- end
901
-
902
- describe "consuming json" do
903
-
904
- before do
905
- @ohai_data = { :platform => "foo", :platform_version => "bar" }
906
- end
907
-
908
- it "consumes the run list portion of a collection of attributes and returns the remainder" do
909
- attrs = { "run_list" => [ "role[base]", "recipe[chef::server]" ], "foo" => "bar" }
910
- expect(node.consume_run_list(attrs)).to eq({ "foo" => "bar" })
911
- expect(node.run_list).to eq([ "role[base]", "recipe[chef::server]" ])
912
- end
913
-
914
- it "sets the node chef_environment" do
915
- attrs = { "chef_environment" => "foo_environment", "bar" => "baz" }
916
- expect(node.consume_chef_environment(attrs)).to eq({ "bar" => "baz" })
917
- expect(node.chef_environment).to eq("foo_environment")
918
- expect(node["chef_environment"]).to be nil
919
- end
920
-
921
- it "should overwrites the run list with the run list it consumes" do
922
- node.consume_run_list "recipes" => %w{one two}
923
- node.consume_run_list "recipes" => [ "three" ]
924
- expect(node.run_list).to eq([ "three" ])
925
- end
926
-
927
- it "should not add duplicate recipes from the json attributes" do
928
- node.run_list << "one"
929
- node.consume_run_list "recipes" => %w{one two three}
930
- expect(node.run_list).to eq(%w{one two three})
931
- end
932
-
933
- it "doesn't change the run list if no run_list is specified in the json" do
934
- node.run_list << "role[database]"
935
- node.consume_run_list "foo" => "bar"
936
- expect(node.run_list).to eq(["role[database]"])
937
- end
938
-
939
- it "raises an exception if you provide both recipe and run_list attributes, since this is ambiguous" do
940
- expect { node.consume_run_list "recipes" => "stuff", "run_list" => "other_stuff" }.to raise_error(Chef::Exceptions::AmbiguousRunlistSpecification)
941
- end
942
-
943
- it "should add json attributes to the node" do
944
- node.consume_external_attrs(@ohai_data, { "one" => "two", "three" => "four" })
945
- expect(node["one"]).to eql("two")
946
- expect(node["three"]).to eql("four")
947
- end
948
-
949
- it "should set the tags attribute to an empty array if it is not already defined" do
950
- node.consume_external_attrs(@ohai_data, {})
951
- expect(node.tags).to eql([])
952
- end
953
-
954
- it "should not set the tags attribute to an empty array if it is already defined" do
955
- node.tag("radiohead")
956
- node.consume_external_attrs(@ohai_data, {})
957
- expect(node.tags).to eql([ "radiohead" ])
958
- end
959
-
960
- it "should set the tags attribute to an empty array if it is nil" do
961
- node.attributes.normal = { "tags" => nil }
962
- node.consume_external_attrs(@ohai_data, {})
963
- expect(node.tags).to eql([])
964
- end
965
-
966
- it "should return an array if it is fed a string" do
967
- node.normal[:tags] = "string"
968
- node.consume_external_attrs(@ohai_data, {})
969
- expect(node.tags).to eql(["string"])
970
- end
971
-
972
- it "should return an array if it is fed a hash" do
973
- node.normal[:tags] = {}
974
- node.consume_external_attrs(@ohai_data, {})
975
- expect(node.tags).to eql([])
976
- end
977
-
978
- it "deep merges attributes instead of overwriting them" do
979
- node.consume_external_attrs(@ohai_data, "one" => { "two" => { "three" => "four" } })
980
- expect(node["one"].to_hash).to eq({ "two" => { "three" => "four" } })
981
- node.consume_external_attrs(@ohai_data, "one" => { "abc" => "123" })
982
- node.consume_external_attrs(@ohai_data, "one" => { "two" => { "foo" => "bar" } })
983
- expect(node["one"].to_hash).to eq({ "two" => { "three" => "four", "foo" => "bar" }, "abc" => "123" })
984
- end
985
-
986
- it "gives attributes from JSON priority when deep merging" do
987
- node.consume_external_attrs(@ohai_data, "one" => { "two" => { "three" => "four" } })
988
- expect(node["one"].to_hash).to eq({ "two" => { "three" => "four" } })
989
- node.consume_external_attrs(@ohai_data, "one" => { "two" => { "three" => "forty-two" } })
990
- expect(node["one"].to_hash).to eq({ "two" => { "three" => "forty-two" } })
991
- end
992
-
993
- end
994
-
995
- describe "preparing for a chef client run" do
996
- before do
997
- @ohai_data = { :platform => "foobuntu", :platform_version => "23.42" }
998
- end
999
-
1000
- it "sets its platform according to platform detection" do
1001
- node.consume_external_attrs(@ohai_data, {})
1002
- expect(node.automatic_attrs[:platform]).to eq("foobuntu")
1003
- expect(node.automatic_attrs[:platform_version]).to eq("23.42")
1004
- end
1005
-
1006
- it "consumes the run list from provided json attributes" do
1007
- node.consume_external_attrs(@ohai_data, { "run_list" => ["recipe[unicorn]"] })
1008
- expect(node.run_list).to eq(["recipe[unicorn]"])
1009
- end
1010
-
1011
- it "saves non-runlist json attrs for later" do
1012
- expansion = Chef::RunList::RunListExpansion.new("_default", [])
1013
- allow(node.run_list).to receive(:expand).and_return(expansion)
1014
- node.consume_external_attrs(@ohai_data, { "foo" => "bar" })
1015
- node.expand!
1016
- expect(node.normal_attrs).to eq({ "foo" => "bar", "tags" => [] })
1017
- end
1018
-
1019
- end
1020
-
1021
- describe "when expanding its run list and merging attributes" do
1022
- before do
1023
- @environment = Chef::Environment.new.tap do |e|
1024
- e.name("rspec_env")
1025
- e.default_attributes("env default key" => "env default value")
1026
- e.override_attributes("env override key" => "env override value")
1027
- end
1028
- expect(Chef::Environment).to receive(:load).with("rspec_env").and_return(@environment)
1029
- @expansion = Chef::RunList::RunListExpansion.new("rspec_env", [])
1030
- node.chef_environment("rspec_env")
1031
- allow(node.run_list).to receive(:expand).and_return(@expansion)
1032
- end
1033
-
1034
- it "sets the 'recipes' automatic attribute to the recipes in the expanded run_list" do
1035
- @expansion.recipes << "recipe[chef::client]" << "recipe[nginx::default]"
1036
- node.expand!
1037
- expect(node.automatic_attrs[:recipes]).to eq(["recipe[chef::client]", "recipe[nginx::default]"])
1038
- end
1039
-
1040
- it "sets the 'roles' automatic attribute to the expanded role list" do
1041
- @expansion.instance_variable_set(:@applied_roles, { "arf" => nil, "countersnark" => nil })
1042
- node.expand!
1043
- expect(node.automatic_attrs[:roles].sort).to eq(%w{arf countersnark})
1044
- end
1045
-
1046
- it "applies default attributes from the environment as environment defaults" do
1047
- node.expand!
1048
- expect(node.attributes.env_default["env default key"]).to eq("env default value")
1049
- end
1050
-
1051
- it "applies override attributes from the environment as env overrides" do
1052
- node.expand!
1053
- expect(node.attributes.env_override["env override key"]).to eq("env override value")
1054
- end
1055
-
1056
- it "applies default attributes from roles as role defaults" do
1057
- @expansion.default_attrs["role default key"] = "role default value"
1058
- node.expand!
1059
- expect(node.attributes.role_default["role default key"]).to eq("role default value")
1060
- end
1061
-
1062
- it "applies override attributes from roles as role overrides" do
1063
- @expansion.override_attrs["role override key"] = "role override value"
1064
- node.expand!
1065
- expect(node.attributes.role_override["role override key"]).to eq("role override value")
1066
- end
1067
- end
1068
-
1069
- describe "loaded_recipe" do
1070
- it "should not add a recipe that is already in the recipes list" do
1071
- node.automatic_attrs[:recipes] = [ "nginx::module" ]
1072
- node.loaded_recipe(:nginx, "module")
1073
- expect(node.automatic_attrs[:recipes].length).to eq(1)
1074
- end
1075
-
1076
- it "should add a recipe that is not already in the recipes list" do
1077
- node.automatic_attrs[:recipes] = [ "nginx::other_module" ]
1078
- node.loaded_recipe(:nginx, "module")
1079
- expect(node.automatic_attrs[:recipes].length).to eq(2)
1080
- expect(node.recipe?("nginx::module")).to be true
1081
- expect(node.recipe?("nginx::other_module")).to be true
1082
- end
1083
- end
1084
-
1085
- describe "when querying for recipes in the run list" do
1086
- context "when a recipe is in the top level run list" do
1087
- before do
1088
- node.run_list << "recipe[nginx::module]"
1089
- end
1090
-
1091
- it "finds the recipe" do
1092
- expect(node.recipe?("nginx::module")).to be true
1093
- end
1094
-
1095
- it "does not find a recipe not in the run list" do
1096
- expect(node.recipe?("nginx::other_module")).to be false
1097
- end
1098
- end
1099
- context "when a recipe is in the expanded run list only" do
1100
- before do
1101
- node.run_list << "role[base]"
1102
- node.automatic_attrs[:recipes] = [ "nginx::module" ]
1103
- end
1104
-
1105
- it "finds a recipe in the expanded run list" do
1106
- expect(node.recipe?("nginx::module")).to be true
1107
- end
1108
-
1109
- it "does not find a recipe that's not in the run list" do
1110
- expect(node.recipe?("nginx::other_module")).to be false
1111
- end
1112
- end
1113
- end
1114
-
1115
- describe "when clearing computed state at the beginning of a run" do
1116
- before do
1117
- node.default[:foo] = "default"
1118
- node.normal[:foo] = "normal"
1119
- node.override[:foo] = "override"
1120
- node.reset_defaults_and_overrides
1121
- end
1122
-
1123
- it "removes default attributes" do
1124
- expect(node.default).to be_empty
1125
- end
1126
-
1127
- it "removes override attributes" do
1128
- expect(node.override).to be_empty
1129
- end
1130
-
1131
- it "leaves normal level attributes untouched" do
1132
- expect(node[:foo]).to eq("normal")
1133
- end
1134
-
1135
- end
1136
-
1137
- describe "when merging environment attributes" do
1138
- before do
1139
- node.chef_environment = "rspec"
1140
- @expansion = Chef::RunList::RunListExpansion.new("rspec", [])
1141
- @expansion.default_attrs.replace({ :default => "from role", :d_role => "role only" })
1142
- @expansion.override_attrs.replace({ :override => "from role", :o_role => "role only" })
1143
-
1144
- @environment = Chef::Environment.new
1145
- @environment.default_attributes = { :default => "from env", :d_env => "env only" }
1146
- @environment.override_attributes = { :override => "from env", :o_env => "env only" }
1147
- allow(Chef::Environment).to receive(:load).and_return(@environment)
1148
- node.apply_expansion_attributes(@expansion)
1149
- end
1150
-
1151
- it "does not nuke role-only default attrs" do
1152
- expect(node[:d_role]).to eq("role only")
1153
- end
1154
-
1155
- it "does not nuke role-only override attrs" do
1156
- expect(node[:o_role]).to eq("role only")
1157
- end
1158
-
1159
- it "does not nuke env-only default attrs" do
1160
- expect(node[:o_env]).to eq("env only")
1161
- end
1162
-
1163
- it "does not nuke role-only override attrs" do
1164
- expect(node[:o_env]).to eq("env only")
1165
- end
1166
-
1167
- it "gives role defaults precedence over env defaults" do
1168
- expect(node[:default]).to eq("from role")
1169
- end
1170
-
1171
- it "gives env overrides precedence over role overrides" do
1172
- expect(node[:override]).to eq("from env")
1173
- end
1174
- end
1175
-
1176
- describe "when evaluating attributes files" do
1177
- before do
1178
- @cookbook_repo = File.expand_path(File.join(CHEF_SPEC_DATA, "cookbooks"))
1179
- @cookbook_loader = Chef::CookbookLoader.new(@cookbook_repo)
1180
- @cookbook_loader.load_cookbooks
1181
-
1182
- @cookbook_collection = Chef::CookbookCollection.new(@cookbook_loader.cookbooks_by_name)
1183
-
1184
- @events = Chef::EventDispatch::Dispatcher.new
1185
- @run_context = Chef::RunContext.new(node, @cookbook_collection, @events)
1186
-
1187
- node.include_attribute("openldap::default")
1188
- node.include_attribute("openldap::smokey")
1189
- end
1190
-
1191
- it "sets attributes from the files" do
1192
- expect(node["ldap_server"]).to eql("ops1prod")
1193
- expect(node["ldap_basedn"]).to eql("dc=hjksolutions,dc=com")
1194
- expect(node["ldap_replication_password"]).to eql("forsure")
1195
- expect(node["smokey"]).to eql("robinson")
1196
- end
1197
-
1198
- it "gives a sensible error when attempting to load a missing attributes file" do
1199
- expect { node.include_attribute("nope-this::doesnt-exist") }.to raise_error(Chef::Exceptions::CookbookNotFound)
1200
- end
1201
- end
1202
-
1203
- describe "roles" do
1204
- it "should allow you to query whether or not it has a recipe applied with role?" do
1205
- node.run_list << "role[sunrise]"
1206
- expect(node.role?("sunrise")).to eql(true)
1207
- expect(node.role?("not at home")).to eql(false)
1208
- end
1209
-
1210
- it "should allow you to set roles with arguments" do
1211
- node.run_list << "role[one]"
1212
- node.run_list << "role[two]"
1213
- expect(node.role?("one")).to eql(true)
1214
- expect(node.role?("two")).to eql(true)
1215
- end
1216
- end
1217
-
1218
- describe "run_list" do
1219
- it "should have a Chef::RunList of recipes and roles that should be applied" do
1220
- expect(node.run_list).to be_a_kind_of(Chef::RunList)
1221
- end
1222
-
1223
- it "should allow you to query the run list with arguments" do
1224
- node.run_list "recipe[baz]"
1225
- expect(node.run_list?("recipe[baz]")).to eql(true)
1226
- end
1227
-
1228
- it "should allow you to set the run list with arguments" do
1229
- node.run_list "recipe[baz]", "role[foo]"
1230
- expect(node.run_list?("recipe[baz]")).to eql(true)
1231
- expect(node.run_list?("role[foo]")).to eql(true)
1232
- end
1233
- end
1234
-
1235
- describe "from file" do
1236
- it "should load a node from a ruby file" do
1237
- node.from_file(File.expand_path(File.join(CHEF_SPEC_DATA, "nodes", "test.rb")))
1238
- expect(node.name).to eql("test.example.com-short")
1239
- expect(node["sunshine"]).to eql("in")
1240
- expect(node["something"]).to eql("else")
1241
- expect(node.run_list).to eq(["operations-master", "operations-monitoring"])
1242
- end
1243
-
1244
- it "should raise an exception if the file cannot be found or read" do
1245
- expect { node.from_file("/tmp/monkeydiving") }.to raise_error(IOError)
1246
- end
1247
- end
1248
-
1249
- describe "update_from!" do
1250
- before(:each) do
1251
- node.name("orig")
1252
- node.chef_environment("dev")
1253
- node.default_attrs = { "one" => { "two" => "three", "four" => "five", "eight" => "nine" } }
1254
- node.override_attrs = { "one" => { "two" => "three", "four" => "six" } }
1255
- node.normal_attrs = { "one" => { "two" => "seven" } }
1256
- node.run_list << "role[marxist]"
1257
- node.run_list << "role[leninist]"
1258
- node.run_list << "recipe[stalinist]"
1259
-
1260
- @example = Chef::Node.new()
1261
- @example.name("newname")
1262
- @example.chef_environment("prod")
1263
- @example.default_attrs = { "alpha" => { "bravo" => "charlie", "delta" => "echo" } }
1264
- @example.override_attrs = { "alpha" => { "bravo" => "foxtrot", "delta" => "golf" } }
1265
- @example.normal_attrs = { "alpha" => { "bravo" => "hotel" } }
1266
- @example.run_list << "role[comedy]"
1267
- @example.run_list << "role[drama]"
1268
- @example.run_list << "recipe[mystery]"
1269
- end
1270
-
1271
- it "allows update of everything except name" do
1272
- node.update_from!(@example)
1273
- expect(node.name).to eq("orig")
1274
- expect(node.chef_environment).to eq(@example.chef_environment)
1275
- expect(node.default_attrs).to eq(@example.default_attrs)
1276
- expect(node.override_attrs).to eq(@example.override_attrs)
1277
- expect(node.normal_attrs).to eq(@example.normal_attrs)
1278
- expect(node.run_list).to eq(@example.run_list)
1279
- end
1280
-
1281
- it "should not update the name of the node" do
1282
- expect(node).not_to receive(:name).with(@example.name)
1283
- node.update_from!(@example)
1284
- end
1285
- end
1286
-
1287
- describe "to_hash" do
1288
- it "should serialize itself as a hash" do
1289
- node.chef_environment("dev")
1290
- node.default_attrs = { "one" => { "two" => "three", "four" => "five", "eight" => "nine" } }
1291
- node.override_attrs = { "one" => { "two" => "three", "four" => "six" } }
1292
- node.normal_attrs = { "one" => { "two" => "seven" } }
1293
- node.run_list << "role[marxist]"
1294
- node.run_list << "role[leninist]"
1295
- node.run_list << "recipe[stalinist]"
1296
- h = node.to_hash
1297
- expect(h["one"]["two"]).to eq("three")
1298
- expect(h["one"]["four"]).to eq("six")
1299
- expect(h["one"]["eight"]).to eq("nine")
1300
- expect(h["role"]).to be_include("marxist")
1301
- expect(h["role"]).to be_include("leninist")
1302
- expect(h["run_list"]).to be_include("role[marxist]")
1303
- expect(h["run_list"]).to be_include("role[leninist]")
1304
- expect(h["run_list"]).to be_include("recipe[stalinist]")
1305
- expect(h["chef_environment"]).to eq("dev")
1306
- end
1307
-
1308
- it "should return an empty array for empty run_list" do
1309
- expect(node.to_hash["run_list"]).to eq([])
1310
- end
1311
- end
1312
-
1313
- describe "converting to or from json" do
1314
- it "should serialize itself as json", :json => true do
1315
- node.from_file(File.expand_path("nodes/test.example.com.rb", CHEF_SPEC_DATA))
1316
- json = Chef::JSONCompat.to_json(node)
1317
- expect(json).to match(/json_class/)
1318
- expect(json).to match(/name/)
1319
- expect(json).to match(/chef_environment/)
1320
- expect(json).to match(/normal/)
1321
- expect(json).to match(/default/)
1322
- expect(json).to match(/override/)
1323
- expect(json).to match(/run_list/)
1324
- end
1325
-
1326
- it "should serialize valid json with a run list", :json => true do
1327
- #This test came about because activesupport mucks with Chef json serialization
1328
- #Test should pass with and without Activesupport
1329
- node.run_list << { "type" => "role", "name" => "Cthulu" }
1330
- node.run_list << { "type" => "role", "name" => "Hastur" }
1331
- json = Chef::JSONCompat.to_json(node)
1332
- expect(json).to match(/\"run_list\":\[\"role\[Cthulu\]\",\"role\[Hastur\]\"\]/)
1333
- end
1334
-
1335
- it "should serialize the correct run list", :json => true do
1336
- node.run_list << "role[marxist]"
1337
- node.run_list << "role[leninist]"
1338
- node.override_runlist << "role[stalinist]"
1339
- expect(node.run_list).to be_include("role[stalinist]")
1340
- json = Chef::JSONCompat.to_json(node)
1341
- expect(json).to match(/\"run_list\":\[\"role\[marxist\]\",\"role\[leninist\]\"\]/)
1342
- end
1343
-
1344
- it "merges the override components into a combined override object" do
1345
- node.attributes.role_override["role override"] = "role override"
1346
- node.attributes.env_override["env override"] = "env override"
1347
- node_for_json = node.for_json
1348
- expect(node_for_json["override"]["role override"]).to eq("role override")
1349
- expect(node_for_json["override"]["env override"]).to eq("env override")
1350
- end
1351
-
1352
- it "merges the default components into a combined default object" do
1353
- node.attributes.role_default["role default"] = "role default"
1354
- node.attributes.env_default["env default"] = "env default"
1355
- node_for_json = node.for_json
1356
- expect(node_for_json["default"]["role default"]).to eq("role default")
1357
- expect(node_for_json["default"]["env default"]).to eq("env default")
1358
- end
1359
-
1360
- it "should deserialize itself from json", :json => true do
1361
- node.from_file(File.expand_path("nodes/test.example.com.rb", CHEF_SPEC_DATA))
1362
- json = Chef::JSONCompat.to_json(node)
1363
- serialized_node = Chef::Node.from_hash(Chef::JSONCompat.parse(json))
1364
- expect(serialized_node).to be_a_kind_of(Chef::Node)
1365
- expect(serialized_node.name).to eql(node.name)
1366
- expect(serialized_node.chef_environment).to eql(node.chef_environment)
1367
- node.each_attribute do |k, v|
1368
- expect(serialized_node[k]).to eql(v)
1369
- end
1370
- expect(serialized_node.run_list).to eq(node.run_list)
1371
- end
1372
-
1373
- context "when policyfile attributes are not present" do
1374
-
1375
- it "does not have a policy_name key in the json" do
1376
- expect(node.for_json.keys).to_not include("policy_name")
1377
- end
1378
-
1379
- it "does not have a policy_group key in the json" do
1380
- expect(node.for_json.keys).to_not include("policy_name")
1381
- end
1382
- end
1383
-
1384
- context "when policyfile attributes are present" do
1385
-
1386
- before do
1387
- node.policy_name = "my-application"
1388
- node.policy_group = "staging"
1389
- end
1390
-
1391
- it "includes policy_name key in the json" do
1392
- expect(node.for_json).to have_key("policy_name")
1393
- expect(node.for_json["policy_name"]).to eq("my-application")
1394
- end
1395
-
1396
- it "includes a policy_group key in the json" do
1397
- expect(node.for_json).to have_key("policy_group")
1398
- expect(node.for_json["policy_group"]).to eq("staging")
1399
- end
1400
-
1401
- it "parses policyfile attributes from JSON" do
1402
- round_tripped_node = Chef::Node.from_hash(node.for_json)
1403
-
1404
- expect(round_tripped_node.policy_name).to eq("my-application")
1405
- expect(round_tripped_node.policy_group).to eq("staging")
1406
- end
1407
-
1408
- end
1409
-
1410
- include_examples "to_json equivalent to Chef::JSONCompat.to_json" do
1411
- let(:jsonable) do
1412
- node.from_file(File.expand_path("nodes/test.example.com.rb", CHEF_SPEC_DATA))
1413
- node
1414
- end
1415
- end
1416
- end
1417
-
1418
- describe "to_s" do
1419
- it "should turn into a string like node[name]" do
1420
- node.name("airplane")
1421
- expect(node.to_s).to eql("node[airplane]")
1422
- end
1423
- end
1424
-
1425
- describe "api model" do
1426
- before(:each) do
1427
- @rest = double("Chef::ServerAPI")
1428
- allow(Chef::ServerAPI).to receive(:new).and_return(@rest)
1429
- @query = double("Chef::Search::Query")
1430
- allow(Chef::Search::Query).to receive(:new).and_return(@query)
1431
- end
1432
-
1433
- describe "list" do
1434
- describe "inflated" do
1435
- it "should return a hash of node names and objects" do
1436
- n1 = double("Chef::Node", :name => "one")
1437
- allow(n1).to receive(:kind_of?).with(Chef::Node) { true }
1438
- expect(@query).to receive(:search).with(:node).and_yield(n1)
1439
- r = Chef::Node.list(true)
1440
- expect(r["one"]).to eq(n1)
1441
- end
1442
- end
1443
-
1444
- it "should return a hash of node names and urls" do
1445
- expect(@rest).to receive(:get).and_return({ "one" => "http://foo" })
1446
- r = Chef::Node.list
1447
- expect(r["one"]).to eq("http://foo")
1448
- end
1449
- end
1450
-
1451
- describe "load" do
1452
- it "should load a node by name" do
1453
- node.from_file(File.expand_path("nodes/test.example.com.rb", CHEF_SPEC_DATA))
1454
- json = Chef::JSONCompat.to_json(node)
1455
- parsed = Chef::JSONCompat.parse(json)
1456
- expect(@rest).to receive(:get).with("nodes/test.example.com").and_return(parsed)
1457
- serialized_node = Chef::Node.load("test.example.com")
1458
- expect(serialized_node).to be_a_kind_of(Chef::Node)
1459
- expect(serialized_node.name).to eql(node.name)
1460
- end
1461
- end
1462
-
1463
- describe "destroy" do
1464
- it "should destroy a node" do
1465
- expect(@rest).to receive(:delete).with("nodes/monkey").and_return("foo")
1466
- node.name("monkey")
1467
- node.destroy
1468
- end
1469
- end
1470
-
1471
- describe "save" do
1472
- it "should update a node if it already exists" do
1473
- node.name("monkey")
1474
- allow(node).to receive(:data_for_save).and_return({})
1475
- expect(@rest).to receive(:put).with("nodes/monkey", {}).and_return("foo")
1476
- node.save
1477
- end
1478
-
1479
- it "should not try and create if it can update" do
1480
- node.name("monkey")
1481
- allow(node).to receive(:data_for_save).and_return({})
1482
- expect(@rest).to receive(:put).with("nodes/monkey", {}).and_return("foo")
1483
- expect(@rest).not_to receive(:post)
1484
- node.save
1485
- end
1486
-
1487
- it "should create if it cannot update" do
1488
- node.name("monkey")
1489
- allow(node).to receive(:data_for_save).and_return({})
1490
- exception = double("404 error", :code => "404")
1491
- expect(@rest).to receive(:put).and_raise(Net::HTTPServerException.new("foo", exception))
1492
- expect(@rest).to receive(:post).with("nodes", {})
1493
- node.save
1494
- end
1495
-
1496
- describe "when whyrun mode is enabled" do
1497
- before do
1498
- Chef::Config[:why_run] = true
1499
- end
1500
- after do
1501
- Chef::Config[:why_run] = false
1502
- end
1503
- it "should not save" do
1504
- node.name("monkey")
1505
- expect(@rest).not_to receive(:put)
1506
- expect(@rest).not_to receive(:post)
1507
- node.save
1508
- end
1509
- end
1510
-
1511
- context "with whitelisted attributes configured" do
1512
- it "should only save whitelisted attributes (and subattributes)" do
1513
- Chef::Config[:automatic_attribute_whitelist] = [
1514
- ["filesystem", "/dev/disk0s2"],
1515
- "network/interfaces/eth0",
1516
- ]
1517
-
1518
- data = {
1519
- "automatic" => {
1520
- "filesystem" => {
1521
- "/dev/disk0s2" => { "size" => "10mb" },
1522
- "map - autohome" => { "size" => "10mb" },
1523
- },
1524
- "network" => {
1525
- "interfaces" => {
1526
- "eth0" => {},
1527
- "eth1" => {},
1528
- },
1529
- },
1530
- },
1531
- "default" => {}, "normal" => {}, "override" => {}
1532
- }
1533
-
1534
- selected_data = {
1535
- "automatic" => {
1536
- "filesystem" => {
1537
- "/dev/disk0s2" => { "size" => "10mb" },
1538
- },
1539
- "network" => {
1540
- "interfaces" => {
1541
- "eth0" => {},
1542
- },
1543
- },
1544
- },
1545
- "default" => {}, "normal" => {}, "override" => {}
1546
- }
1547
-
1548
- node.name("picky-monkey")
1549
- allow(node).to receive(:for_json).and_return(data)
1550
- expect(@rest).to receive(:put).with("nodes/picky-monkey", selected_data).and_return("foo")
1551
- node.save
1552
- end
1553
-
1554
- it "should save false-y whitelisted attributes" do
1555
- Chef::Config[:default_attribute_whitelist] = [
1556
- "foo/bar/baz",
1557
- ]
1558
-
1559
- data = {
1560
- "default" => {
1561
- "foo" => {
1562
- "bar" => {
1563
- "baz" => false,
1564
- },
1565
- "other" => {
1566
- "stuff" => true,
1567
- },
1568
- },
1569
- },
1570
- }
1571
-
1572
- selected_data = {
1573
- "default" => {
1574
- "foo" => {
1575
- "bar" => {
1576
- "baz" => false,
1577
- },
1578
- },
1579
- },
1580
- }
1581
-
1582
- node.name("falsey-monkey")
1583
- allow(node).to receive(:for_json).and_return(data)
1584
- expect(@rest).to receive(:put).with("nodes/falsey-monkey", selected_data).and_return("foo")
1585
- node.save
1586
- end
1587
-
1588
- it "should not save any attributes if the whitelist is empty" do
1589
- Chef::Config[:automatic_attribute_whitelist] = []
1590
-
1591
- data = {
1592
- "automatic" => {
1593
- "filesystem" => {
1594
- "/dev/disk0s2" => { "size" => "10mb" },
1595
- "map - autohome" => { "size" => "10mb" },
1596
- },
1597
- },
1598
- "default" => {}, "normal" => {}, "override" => {}
1599
- }
1600
-
1601
- selected_data = {
1602
- "automatic" => {}, "default" => {}, "normal" => {}, "override" => {}
1603
- }
1604
-
1605
- node.name("picky-monkey")
1606
- allow(node).to receive(:for_json).and_return(data)
1607
- expect(@rest).to receive(:put).with("nodes/picky-monkey", selected_data).and_return("foo")
1608
- node.save
1609
- end
1610
- end
1611
-
1612
- context "when policyfile attributes are present" do
1613
-
1614
- before do
1615
- node.name("example-node")
1616
- node.policy_name = "my-application"
1617
- node.policy_group = "staging"
1618
- end
1619
-
1620
- context "and the server supports policyfile attributes in node JSON" do
1621
-
1622
- it "creates the object normally" do
1623
- expect(@rest).to receive(:post).with("nodes", node.for_json)
1624
- node.create
1625
- end
1626
-
1627
- it "saves the node object normally" do
1628
- expect(@rest).to receive(:put).with("nodes/example-node", node.for_json)
1629
- node.save
1630
- end
1631
- end
1632
-
1633
- # Chef Server before 12.3
1634
- context "and the Chef Server does not support policyfile attributes in node JSON" do
1635
-
1636
- let(:response_body) { %q[{"error":["Invalid key policy_name in request body"]}] }
1637
-
1638
- let(:response) do
1639
- Net::HTTPResponse.send(:response_class, "400").new("1.0", "400", "Bad Request").tap do |r|
1640
- allow(r).to receive(:body).and_return(response_body)
1641
- end
1642
- end
1643
-
1644
- let(:http_exception) do
1645
- begin
1646
- response.error!
1647
- rescue => e
1648
- e
1649
- end
1650
- end
1651
-
1652
- let(:trimmed_node) do
1653
- node.for_json.tap do |j|
1654
- j.delete("policy_name")
1655
- j.delete("policy_group")
1656
- end
1657
-
1658
- end
1659
-
1660
- context "on Chef Client 13 and later" do
1661
-
1662
- # Though we normally attempt to provide compatibility with chef
1663
- # server one major version back, policyfiles were beta when we
1664
- # added the policyfile attributes to the node JSON, therefore
1665
- # policyfile users need to be on 12.3 minimum when upgrading Chef
1666
- # Client to 13+
1667
- it "lets the 400 pass through", chef: ">= 13" do
1668
- expect { node.save }.to raise_error(http_exception)
1669
- end
1670
-
1671
- end
1672
-
1673
- context "when the node exists" do
1674
-
1675
- it "falls back to saving without policyfile attributes" do
1676
- expect(@rest).to receive(:put).with("nodes/example-node", node.for_json).and_raise(http_exception)
1677
- expect(@rest).to receive(:put).with("nodes/example-node", trimmed_node).and_return(@node)
1678
- expect { node.save }.to_not raise_error
1679
- end
1680
-
1681
- end
1682
-
1683
- context "when the node doesn't exist" do
1684
-
1685
- let(:response_404) do
1686
- Net::HTTPResponse.send(:response_class, "404").new("1.0", "404", "Not Found")
1687
- end
1688
-
1689
- let(:http_exception_404) do
1690
- begin
1691
- response_404.error!
1692
- rescue => e
1693
- e
1694
- end
1695
- end
1696
-
1697
- it "falls back to saving without policyfile attributes" do
1698
- expect(@rest).to receive(:put).with("nodes/example-node", node.for_json).and_raise(http_exception)
1699
- expect(@rest).to receive(:put).with("nodes/example-node", trimmed_node).and_raise(http_exception_404)
1700
- expect(@rest).to receive(:post).with("nodes", trimmed_node).and_return(@node)
1701
- node.save
1702
- end
1703
-
1704
- it "creates the node without policyfile attributes" do
1705
- expect(@rest).to receive(:post).with("nodes", node.for_json).and_raise(http_exception)
1706
- expect(@rest).to receive(:post).with("nodes", trimmed_node).and_return(@node)
1707
- node.create
1708
- end
1709
- end
1710
-
1711
- end
1712
-
1713
- end
1714
-
1715
- end
1716
- end
1717
-
1718
- describe "method_missing handling" do
1719
- it "should have an #empty? method via Chef::Node::Attribute" do
1720
- node.default["foo"] = "bar"
1721
- expect(node.empty?).to be false
1722
- end
1723
-
1724
- it "it should correctly implement #respond_to?" do
1725
- expect(node.respond_to?(:empty?)).to be true
1726
- end
1727
-
1728
- it "it should correctly retrieve the method with #method" do
1729
- expect(node.method(:empty?)).to be_kind_of(Method)
1730
- end
1731
- end
1732
-
1733
- describe "path tracking via __path__" do
1734
- it "works through hash keys" do
1735
- node.default["foo"] = { "bar" => { "baz" => "qux" } }
1736
- expect(node["foo"]["bar"].__path__).to eql(%w{foo bar})
1737
- end
1738
-
1739
- it "works through the default level" do
1740
- node.default["foo"] = { "bar" => { "baz" => "qux" } }
1741
- expect(node.default["foo"]["bar"].__path__).to eql(%w{foo bar})
1742
- end
1743
-
1744
- it "works through arrays" do
1745
- node.default["foo"] = [ { "bar" => { "baz" => "qux" } } ]
1746
- expect(node["foo"][0].__path__).to eql(["foo", 0])
1747
- expect(node["foo"][0]["bar"].__path__).to eql(["foo", 0, "bar"])
1748
- end
1749
-
1750
- it "works through arrays at the default level" do
1751
- node.default["foo"] = [ { "bar" => { "baz" => "qux" } } ]
1752
- expect(node.default["foo"][0].__path__).to eql(["foo", 0])
1753
- expect(node.default["foo"][0]["bar"].__path__).to eql(["foo", 0, "bar"])
1754
- end
1755
-
1756
- # if we set __path__ in the initializer we'd get this wrong, this is why we
1757
- # update the path on every #[] or #[]= operator
1758
- it "works on access when the node has been rearranged" do
1759
- node.default["foo"] = { "bar" => { "baz" => "qux" } }
1760
- a = node.default["foo"]
1761
- node.default["fizz"] = a
1762
- expect(node["fizz"]["bar"].__path__).to eql(%w{fizz bar})
1763
- expect(node["foo"]["bar"].__path__).to eql(%w{foo bar})
1764
- end
1765
-
1766
- # We have a problem because the __path__ is stored on in each node, but the
1767
- # node can be wired up at multiple locations in the tree via pointers. One
1768
- # solution would be to deep-dup the value in `#[]=(key, value)` and fix the
1769
- # __path__ on all the dup'd nodes. The problem is that this would create an
1770
- # unusual situation where after assignment, you couldn't mutate the thing you
1771
- # hand a handle on. I'm not entirely positive this behavior is the correct
1772
- # thing to support, but it is more hash-like (although if we start with a hash
1773
- # then convert_value does its thing and we *do* get dup'd on assignment). This
1774
- # behavior likely makes any implementation of a deep merge cache built over the
1775
- # top of __path__ tracking have edge conditions where it will fail.
1776
- #
1777
- # Removing this support would be a breaking change. The test is included here
1778
- # because it seems most likely that someone would break this behavior while trying
1779
- # to fix __path__ behavior.
1780
- it "does not dup in the background when a node is assigned" do
1781
- # get a handle on a vividmash (can't be a hash or else we convert_value it)
1782
- node.default["foo"] = { "bar" => { "baz" => "qux" } }
1783
- a = node.default["foo"]
1784
- # assign that somewhere else in the tree
1785
- node.default["fizz"] = a
1786
- # now upate the source
1787
- a["duptest"] = true
1788
- # the tree should have been updated
1789
- expect(node.default["fizz"]["duptest"]).to be true
1790
- expect(node["fizz"]["duptest"]).to be true
1791
- end
1792
- end
1793
-
1794
- describe "root tracking via __root__" do
1795
- it "works through hash keys" do
1796
- node.default["foo"] = { "bar" => { "baz" => "qux" } }
1797
- expect(node["foo"]["bar"].__root__).to eql(node.attributes)
1798
- end
1799
-
1800
- it "works through the default level" do
1801
- node.default["foo"] = { "bar" => { "baz" => "qux" } }
1802
- expect(node.default["foo"]["bar"].__root__).to eql(node.attributes)
1803
- end
1804
-
1805
- it "works through arrays" do
1806
- node.default["foo"] = [ { "bar" => { "baz" => "qux" } } ]
1807
- expect(node["foo"][0].__root__).to eql(node.attributes)
1808
- expect(node["foo"][0]["bar"].__root__).to eql(node.attributes)
1809
- end
1810
-
1811
- it "works through arrays at the default level" do
1812
- node.default["foo"] = [ { "bar" => { "baz" => "qux" } } ]
1813
- expect(node.default["foo"][0].__root__).to eql(node.attributes)
1814
- expect(node.default["foo"][0]["bar"].__root__).to eql(node.attributes)
1815
- end
1816
- end
1817
-
1818
- describe "ways of abusing Chef 12 node state" do
1819
- # these tests abuse the top_level_breadcrumb state in Chef 12
1820
- it "derived attributes work correctly" do
1821
- node.default["v1"] = 1
1822
- expect(node["a"]).to eql(nil)
1823
- node.default["a"] = node["v1"]
1824
- expect(node["a"]).to eql(1)
1825
- end
1826
-
1827
- it "works when saving nodes to variables" do
1828
- a = node.default["a"]
1829
- expect(node["a"]).to eql({})
1830
- node.default["b"] = 0
1831
- a["key"] = 1
1832
-
1833
- expect(node["a"]["key"]).to eql(1)
1834
- end
1835
- end
1836
- end
1
+ #
2
+ # Author:: Adam Jacob (<adam@chef.io>)
3
+ # Copyright:: Copyright 2008-2016, Chef Software, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require "spec_helper"
20
+ require "ostruct"
21
+
22
+ describe Chef::Node do
23
+
24
+ let(:node) { Chef::Node.new() }
25
+ let(:platform_introspector) { node }
26
+
27
+ it_behaves_like "a platform introspector"
28
+
29
+ it "creates a node and assigns it a name" do
30
+ node = Chef::Node.build("solo-node")
31
+ expect(node.name).to eq("solo-node")
32
+ end
33
+
34
+ it "should validate the name of the node" do
35
+ expect { Chef::Node.build("solo node") }.to raise_error(Chef::Exceptions::ValidationFailed)
36
+ end
37
+
38
+ it "should be sortable" do
39
+ n1 = Chef::Node.build("alpha")
40
+ n2 = Chef::Node.build("beta")
41
+ n3 = Chef::Node.build("omega")
42
+ expect([n3, n1, n2].sort).to eq([n1, n2, n3])
43
+ end
44
+
45
+ it "should share identity only with others of the same name" do
46
+ n1 = Chef::Node.build("foo")
47
+ n2 = Chef::Node.build("foo")
48
+ n3 = Chef::Node.build("bar")
49
+ expect(n1).to eq(n2)
50
+ expect(n1).not_to eq(n3)
51
+ end
52
+
53
+ describe "when the node does not exist on the server" do
54
+ before do
55
+ response = OpenStruct.new(:code => "404")
56
+ exception = Net::HTTPServerException.new("404 not found", response)
57
+ allow(Chef::Node).to receive(:load).and_raise(exception)
58
+ node.name("created-node")
59
+ end
60
+
61
+ it "creates a new node for find_or_create" do
62
+ allow(Chef::Node).to receive(:new).and_return(node)
63
+ expect(node).to receive(:create).and_return(node)
64
+ node = Chef::Node.find_or_create("created-node")
65
+ expect(node.name).to eq("created-node")
66
+ expect(node).to equal(node)
67
+ end
68
+ end
69
+
70
+ describe "when the node exists on the server" do
71
+ before do
72
+ node.name("existing-node")
73
+ allow(Chef::Node).to receive(:load).and_return(node)
74
+ end
75
+
76
+ it "loads the node via the REST API for find_or_create" do
77
+ expect(Chef::Node.find_or_create("existing-node")).to equal(node)
78
+ end
79
+ end
80
+
81
+ describe "run_state" do
82
+ it "is an empty hash" do
83
+ expect(node.run_state).to respond_to(:keys)
84
+ expect(node.run_state).to be_empty
85
+ end
86
+ end
87
+
88
+ describe "initialize" do
89
+ it "should default to the '_default' chef_environment" do
90
+ n = Chef::Node.new
91
+ expect(n.chef_environment).to eq("_default")
92
+ end
93
+ end
94
+
95
+ describe "name" do
96
+ it "should allow you to set a name with name(something)" do
97
+ expect { node.name("latte") }.not_to raise_error
98
+ end
99
+
100
+ it "should return the name with name()" do
101
+ node.name("latte")
102
+ expect(node.name).to eql("latte")
103
+ end
104
+
105
+ it "should always have a string for name" do
106
+ expect { node.name(Hash.new) }.to raise_error(ArgumentError)
107
+ end
108
+
109
+ it "cannot be blank" do
110
+ expect { node.name("") }.to raise_error(Chef::Exceptions::ValidationFailed)
111
+ end
112
+
113
+ it "should not accept name doesn't match /^[\-[:alnum:]_:.]+$/" do
114
+ expect { node.name("space in it") }.to raise_error(Chef::Exceptions::ValidationFailed)
115
+ end
116
+ end
117
+
118
+ describe "chef_environment" do
119
+ it "should set an environment with chef_environment(something)" do
120
+ expect { node.chef_environment("latte") }.not_to raise_error
121
+ end
122
+
123
+ it "should return the chef_environment with chef_environment()" do
124
+ node.chef_environment("latte")
125
+ expect(node.chef_environment).to eq("latte")
126
+ end
127
+
128
+ it "should disallow non-strings" do
129
+ expect { node.chef_environment(Hash.new) }.to raise_error(ArgumentError)
130
+ expect { node.chef_environment(42) }.to raise_error(ArgumentError)
131
+ end
132
+
133
+ it "cannot be blank" do
134
+ expect { node.chef_environment("") }.to raise_error(Chef::Exceptions::ValidationFailed)
135
+ end
136
+ end
137
+
138
+ describe "policy_name" do
139
+
140
+ it "defaults to nil" do
141
+ expect(node.policy_name).to be_nil
142
+ end
143
+
144
+ it "sets policy_name with a regular setter" do
145
+ node.policy_name = "example-policy"
146
+ expect(node.policy_name).to eq("example-policy")
147
+ end
148
+
149
+ it "allows policy_name with every valid character" do
150
+ expect { node.policy_name = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqurstuvwxyz0123456789-_:." }.to_not raise_error
151
+ end
152
+
153
+ it "sets policy_name when given an argument" do
154
+ node.policy_name("example-policy")
155
+ expect(node.policy_name).to eq("example-policy")
156
+ end
157
+
158
+ it "sets policy_name to nil when given nil" do
159
+ node.policy_name = "example-policy"
160
+ node.policy_name = nil
161
+ expect(node.policy_name).to be_nil
162
+ end
163
+
164
+ it "disallows non-strings" do
165
+ expect { node.policy_name(Hash.new) }.to raise_error(Chef::Exceptions::ValidationFailed)
166
+ expect { node.policy_name(42) }.to raise_error(Chef::Exceptions::ValidationFailed)
167
+ end
168
+
169
+ it "cannot be blank" do
170
+ expect { node.policy_name("") }.to raise_error(Chef::Exceptions::ValidationFailed)
171
+ end
172
+ end
173
+
174
+ describe "policy_group" do
175
+
176
+ it "defaults to nil" do
177
+ expect(node.policy_group).to be_nil
178
+ end
179
+
180
+ it "sets policy_group with a regular setter" do
181
+ node.policy_group = "staging"
182
+ expect(node.policy_group).to eq("staging")
183
+ end
184
+
185
+ it "allows policy_group with every valid character" do
186
+ expect { node.policy_group = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqurstuvwxyz0123456789-_:." }.to_not raise_error
187
+ end
188
+
189
+ it "sets an environment with chef_environment(something)" do
190
+ node.policy_group("staging")
191
+ expect(node.policy_group).to eq("staging")
192
+ end
193
+
194
+ it "sets policy_group to nil when given nil" do
195
+ node.policy_group = "staging"
196
+ node.policy_group = nil
197
+ expect(node.policy_group).to be_nil
198
+ end
199
+
200
+ it "disallows non-strings" do
201
+ expect { node.policy_group(Hash.new) }.to raise_error(Chef::Exceptions::ValidationFailed)
202
+ expect { node.policy_group(42) }.to raise_error(Chef::Exceptions::ValidationFailed)
203
+ end
204
+
205
+ it "cannot be blank" do
206
+ expect { node.policy_group("") }.to raise_error(Chef::Exceptions::ValidationFailed)
207
+ end
208
+ end
209
+
210
+ describe "attributes" do
211
+ it "should have attributes" do
212
+ expect(node.attribute).to be_a_kind_of(Hash)
213
+ end
214
+
215
+ it "should allow attributes to be accessed by name or symbol directly on node[]" do
216
+ node.default["locust"] = "something"
217
+ expect(node[:locust]).to eql("something")
218
+ expect(node["locust"]).to eql("something")
219
+ end
220
+
221
+ it "should return nil if it cannot find an attribute with node[]" do
222
+ expect(node["secret"]).to eql(nil)
223
+ end
224
+
225
+ it "does not allow you to set an attribute via node[]=" do
226
+ expect { node["secret"] = "shush" }.to raise_error(Chef::Exceptions::ImmutableAttributeModification)
227
+ end
228
+
229
+ it "should allow you to query whether an attribute exists with attribute?" do
230
+ node.default["locust"] = "something"
231
+ expect(node.attribute?("locust")).to eql(true)
232
+ expect(node.attribute?("no dice")).to eql(false)
233
+ end
234
+
235
+ it "should let you go deep with attribute?" do
236
+ node.normal["battles"]["people"]["wonkey"] = true
237
+ expect(node["battles"]["people"].attribute?("wonkey")).to eq(true)
238
+ expect(node["battles"]["people"].attribute?("snozzberry")).to eq(false)
239
+ end
240
+
241
+ it "does not allow you to set an attribute via method_missing" do
242
+ Chef::Config[:treat_deprecation_warnings_as_errors] = false
243
+ expect { node.sunshine = "is bright" }.to raise_error(Chef::Exceptions::ImmutableAttributeModification)
244
+ end
245
+
246
+ it "does not allow modification of node attributes via hash methods" do
247
+ Chef::Config[:treat_deprecation_warnings_as_errors] = false
248
+ node.default["h4sh"] = { foo: "bar" }
249
+ expect { node["h4sh"].delete("foo") }.to raise_error(Chef::Exceptions::ImmutableAttributeModification)
250
+ expect { node.h4sh.delete("foo") }.to raise_error(Chef::Exceptions::ImmutableAttributeModification)
251
+ end
252
+
253
+ it "does not allow modification of node attributes via array methods" do
254
+ Chef::Config[:treat_deprecation_warnings_as_errors] = false
255
+ node.default["array"] = []
256
+ expect { node["array"] << "boom" }.to raise_error(Chef::Exceptions::ImmutableAttributeModification)
257
+ expect { node.array << "boom" }.to raise_error(Chef::Exceptions::ImmutableAttributeModification)
258
+ end
259
+
260
+ it "returns merged immutable attributes for arrays" do
261
+ Chef::Config[:treat_deprecation_warnings_as_errors] = false
262
+ node.default["array"] = []
263
+ expect( node["array"].class ).to eql(Chef::Node::ImmutableArray)
264
+ expect( node.array.class ).to eql(Chef::Node::ImmutableArray)
265
+ end
266
+
267
+ it "returns merged immutable attributes for hashes" do
268
+ Chef::Config[:treat_deprecation_warnings_as_errors] = false
269
+ node.default["h4sh"] = {}
270
+ expect( node["h4sh"].class ).to eql(Chef::Node::ImmutableMash)
271
+ expect( node.h4sh.class ).to eql(Chef::Node::ImmutableMash)
272
+ end
273
+
274
+ it "should allow you get get an attribute via method_missing" do
275
+ Chef::Config[:treat_deprecation_warnings_as_errors] = false
276
+ node.default.sunshine = "is bright"
277
+ expect(node.sunshine).to eql("is bright")
278
+ end
279
+
280
+ describe "normal attributes" do
281
+ it "should allow you to set an attribute with set, without pre-declaring a hash" do
282
+ node.normal[:snoopy][:is_a_puppy] = true
283
+ expect(node[:snoopy][:is_a_puppy]).to eq(true)
284
+ end
285
+
286
+ it "should allow you to set an attribute with set_unless with method_missing but emit a deprecation warning" do
287
+ Chef::Config[:treat_deprecation_warnings_as_errors] = false
288
+ node.normal_unless.snoopy.is_a_puppy = false
289
+ expect(node[:snoopy][:is_a_puppy]).to eq(false)
290
+ end
291
+
292
+ it "should allow you to set an attribute with set_unless" do
293
+ node.normal_unless[:snoopy][:is_a_puppy] = false
294
+ expect(node[:snoopy][:is_a_puppy]).to eq(false)
295
+ end
296
+
297
+ it "should not allow you to set an attribute with set_unless if it already exists" do
298
+ node.normal[:snoopy][:is_a_puppy] = true
299
+ node.normal_unless[:snoopy][:is_a_puppy] = false
300
+ expect(node[:snoopy][:is_a_puppy]).to eq(true)
301
+ end
302
+
303
+ it "should allow you to set an attribute with set_unless if is a nil value" do
304
+ node.attributes.normal = { snoopy: { is_a_puppy: nil } }
305
+ node.normal_unless[:snoopy][:is_a_puppy] = false
306
+ expect(node[:snoopy][:is_a_puppy]).to eq(false)
307
+ end
308
+
309
+ it "should allow you to set a value after a set_unless" do
310
+ # this tests for set_unless_present state bleeding between statements CHEF-3806
311
+ node.normal_unless[:snoopy][:is_a_puppy] = false
312
+ node.normal[:snoopy][:is_a_puppy] = true
313
+ expect(node[:snoopy][:is_a_puppy]).to eq(true)
314
+ end
315
+
316
+ it "should let you set a value after a 'dangling' set_unless" do
317
+ # this tests for set_unless_present state bleeding between statements CHEF-3806
318
+ node.normal[:snoopy][:is_a_puppy] = "what"
319
+ node.normal_unless[:snoopy][:is_a_puppy]
320
+ node.normal[:snoopy][:is_a_puppy] = true
321
+ expect(node[:snoopy][:is_a_puppy]).to eq(true)
322
+ end
323
+
324
+ it "auto-vivifies attributes created via method syntax" do
325
+ Chef::Config[:treat_deprecation_warnings_as_errors] = false
326
+ node.normal.fuu.bahrr.baz = "qux"
327
+ expect(node.fuu.bahrr.baz).to eq("qux")
328
+ end
329
+
330
+ it "should let you use tag as a convience method for the tags attribute" do
331
+ node.normal["tags"] = %w{one two}
332
+ node.tag("three", "four")
333
+ expect(node["tags"]).to eq(%w{one two three four})
334
+ end
335
+
336
+ it "set is a deprecated alias for normal" do
337
+ Chef::Config[:treat_deprecation_warnings_as_errors] = false
338
+ expect(Chef).to receive(:deprecated).with(:attributes, /set is deprecated/)
339
+ node.set[:snoopy][:is_a_puppy] = true
340
+ expect(node.normal[:snoopy][:is_a_puppy]).to eq(true)
341
+ end
342
+
343
+ it "set_unless is a deprecated alias for normal_unless" do
344
+ Chef::Config[:treat_deprecation_warnings_as_errors] = false
345
+ expect(Chef).to receive(:deprecated).with(:attributes, /set_unless is deprecated/)
346
+ node.set_unless[:snoopy][:is_a_puppy] = false
347
+ expect(node.normal[:snoopy][:is_a_puppy]).to eq(false)
348
+ end
349
+
350
+ it "normal_unless sets a value even if default or override attrs are set" do
351
+ node.default[:decontamination] = true
352
+ node.override[:decontamination] = false
353
+ node.normal_unless[:decontamination] = "foo"
354
+ expect(node.normal[:decontamination]).to eql("foo")
355
+ end
356
+
357
+ it "default_unless sets a value even if normal or override attrs are set" do
358
+ node.normal[:decontamination] = true
359
+ node.override[:decontamination] = false
360
+ node.default_unless[:decontamination] = "foo"
361
+ expect(node.default[:decontamination]).to eql("foo")
362
+ end
363
+
364
+ it "override_unless sets a value even if default or normal attrs are set" do
365
+ node.default[:decontamination] = true
366
+ node.normal[:decontamination] = false
367
+ node.override_unless[:decontamination] = "foo"
368
+ expect(node.override[:decontamination]).to eql("foo")
369
+ end
370
+ end
371
+
372
+ describe "default attributes" do
373
+ it "should be set with default, without pre-declaring a hash" do
374
+ node.default[:snoopy][:is_a_puppy] = true
375
+ expect(node[:snoopy][:is_a_puppy]).to eq(true)
376
+ end
377
+
378
+ it "should allow you to set with default_unless without pre-declaring a hash" do
379
+ node.default_unless[:snoopy][:is_a_puppy] = false
380
+ expect(node[:snoopy][:is_a_puppy]).to eq(false)
381
+ end
382
+
383
+ it "should not allow you to set an attribute with default_unless if it already exists" do
384
+ node.default[:snoopy][:is_a_puppy] = true
385
+ node.default_unless[:snoopy][:is_a_puppy] = false
386
+ expect(node[:snoopy][:is_a_puppy]).to eq(true)
387
+ end
388
+
389
+ it "should allow you to set a value after a default_unless" do
390
+ # this tests for set_unless_present state bleeding between statements CHEF-3806
391
+ node.default_unless[:snoopy][:is_a_puppy] = false
392
+ node.default[:snoopy][:is_a_puppy] = true
393
+ expect(node[:snoopy][:is_a_puppy]).to eq(true)
394
+ end
395
+
396
+ it "should allow you to set a value after a 'dangling' default_unless" do
397
+ # this tests for set_unless_present state bleeding between statements CHEF-3806
398
+ node.default[:snoopy][:is_a_puppy] = "what"
399
+ node.default_unless[:snoopy][:is_a_puppy]
400
+ node.default[:snoopy][:is_a_puppy] = true
401
+ expect(node[:snoopy][:is_a_puppy]).to eq(true)
402
+ end
403
+
404
+ it "does not exhibit chef/chef/issues/5005 bug" do
405
+ node.env_default["a"]["r1"]["g"]["u"] = "u1"
406
+ node.default_unless["a"]["r1"]["g"]["r"] = "r"
407
+ expect(node["a"]["r1"]["g"]["u"]).to eql("u1")
408
+ end
409
+
410
+ it "auto-vivifies attributes created via method syntax" do
411
+ Chef::Config[:treat_deprecation_warnings_as_errors] = false
412
+ node.default.fuu.bahrr.baz = "qux"
413
+ expect(node.fuu.bahrr.baz).to eq("qux")
414
+ end
415
+
416
+ it "default_unless correctly resets the deep merge cache" do
417
+ node.normal["tags"] = [] # this sets our top-level breadcrumb
418
+ node.default_unless["foo"]["bar"] = "NK-19V"
419
+ expect(node["foo"]["bar"]).to eql("NK-19V")
420
+ node.default_unless["foo"]["baz"] = "NK-33"
421
+ expect(node["foo"]["baz"]).to eql("NK-33")
422
+ end
423
+
424
+ it "normal_unless correctly resets the deep merge cache" do
425
+ node.normal["tags"] = [] # this sets our top-level breadcrumb
426
+ node.normal_unless["foo"]["bar"] = "NK-19V"
427
+ expect(node["foo"]["bar"]).to eql("NK-19V")
428
+ node.normal_unless["foo"]["baz"] = "NK-33"
429
+ expect(node["foo"]["baz"]).to eql("NK-33")
430
+ end
431
+
432
+ it "override_unless correctly resets the deep merge cache" do
433
+ node.normal["tags"] = [] # this sets our top-level breadcrumb
434
+ node.override_unless["foo"]["bar"] = "NK-19V"
435
+ expect(node["foo"]["bar"]).to eql("NK-19V")
436
+ node.override_unless["foo"]["baz"] = "NK-33"
437
+ expect(node["foo"]["baz"]).to eql("NK-33")
438
+ end
439
+ end
440
+
441
+ describe "override attributes" do
442
+ it "should be set with override, without pre-declaring a hash" do
443
+ node.override[:snoopy][:is_a_puppy] = true
444
+ expect(node[:snoopy][:is_a_puppy]).to eq(true)
445
+ end
446
+
447
+ it "should allow you to set with override_unless without pre-declaring a hash" do
448
+ node.override_unless[:snoopy][:is_a_puppy] = false
449
+ expect(node[:snoopy][:is_a_puppy]).to eq(false)
450
+ end
451
+
452
+ it "should not allow you to set an attribute with override_unless if it already exists" do
453
+ node.override[:snoopy][:is_a_puppy] = true
454
+ node.override_unless[:snoopy][:is_a_puppy] = false
455
+ expect(node[:snoopy][:is_a_puppy]).to eq(true)
456
+ end
457
+
458
+ it "should allow you to set a value after an override_unless" do
459
+ # this tests for set_unless_present state bleeding between statements CHEF-3806
460
+ node.override_unless[:snoopy][:is_a_puppy] = false
461
+ node.override[:snoopy][:is_a_puppy] = true
462
+ expect(node[:snoopy][:is_a_puppy]).to eq(true)
463
+ end
464
+
465
+ it "should allow you to set a value after a 'dangling' override_unless" do
466
+ # this tests for set_unless_present state bleeding between statements CHEF-3806
467
+ node.override_unless[:snoopy][:is_a_puppy] = "what"
468
+ node.override_unless[:snoopy][:is_a_puppy]
469
+ node.override[:snoopy][:is_a_puppy] = true
470
+ expect(node[:snoopy][:is_a_puppy]).to eq(true)
471
+ end
472
+
473
+ it "auto-vivifies attributes created via method syntax" do
474
+ Chef::Config[:treat_deprecation_warnings_as_errors] = false
475
+ node.override.fuu.bahrr.baz = "qux"
476
+ expect(node.fuu.bahrr.baz).to eq("qux")
477
+ end
478
+ end
479
+
480
+ describe "globally deleting attributes" do
481
+ context "with hash values" do
482
+ before do
483
+ node.role_default["mysql"]["server"]["port"] = 1234
484
+ node.normal["mysql"]["server"]["port"] = 2345
485
+ node.override["mysql"]["server"]["port"] = 3456
486
+ end
487
+
488
+ it "deletes all the values and returns the value with the highest precidence" do
489
+ expect( node.rm("mysql", "server", "port") ).to eql(3456)
490
+ expect( node["mysql"]["server"]["port"] ).to be_nil
491
+ expect( node["mysql"]["server"] ).to eql({})
492
+ end
493
+
494
+ it "deletes nested things correctly" do
495
+ node.default["mysql"]["client"]["client_setting"] = "foo"
496
+ expect( node.rm("mysql", "server") ).to eql( { "port" => 3456 } )
497
+ expect( node["mysql"] ).to eql( { "client" => { "client_setting" => "foo" } } )
498
+ end
499
+
500
+ it "returns nil if the node attribute does not exist" do
501
+ expect( node.rm("no", "such", "thing") ).to be_nil
502
+ end
503
+
504
+ it "can delete the entire tree" do
505
+ expect( node.rm("mysql") ).to eql({ "server" => { "port" => 3456 } })
506
+ end
507
+ end
508
+
509
+ context "when trying to delete through a thing that isn't an array-like or hash-like object" do
510
+ before do
511
+ node.default["mysql"] = true
512
+ end
513
+
514
+ it "returns nil when you're two levels deeper" do
515
+ expect( node.rm("mysql", "server", "port") ).to eql(nil)
516
+ end
517
+
518
+ it "returns nil when you're one level deeper" do
519
+ expect( node.rm("mysql", "server") ).to eql(nil)
520
+ end
521
+
522
+ it "correctly deletes at the top level" do
523
+ expect( node.rm("mysql") ).to eql(true)
524
+ end
525
+ end
526
+
527
+ context "with array indexes" do
528
+ before do
529
+ node.role_default["mysql"]["server"][0]["port"] = 1234
530
+ node.normal["mysql"]["server"][0]["port"] = 2345
531
+ node.override["mysql"]["server"][0]["port"] = 3456
532
+ node.override["mysql"]["server"][1]["port"] = 3456
533
+ end
534
+
535
+ it "deletes the array element" do
536
+ expect( node.rm("mysql", "server", 0, "port") ).to eql(3456)
537
+ expect( node["mysql"]["server"][0]["port"] ).to be_nil
538
+ expect( node["mysql"]["server"][1]["port"] ).to eql(3456)
539
+ end
540
+ end
541
+
542
+ context "with real arrays" do
543
+ before do
544
+ node.role_default["mysql"]["server"] = [ {
545
+ "port" => 1234,
546
+ } ]
547
+ node.normal["mysql"]["server"] = [ {
548
+ "port" => 2345,
549
+ } ]
550
+ node.override["mysql"]["server"] = [ {
551
+ "port" => 3456,
552
+ } ]
553
+ end
554
+
555
+ it "deletes the array element" do
556
+ expect( node.rm("mysql", "server", 0, "port") ).to eql(3456)
557
+ expect( node["mysql"]["server"][0]["port"] ).to be_nil
558
+ end
559
+
560
+ it "when mistaking arrays for hashes, it considers the value removed and does nothing" do
561
+ node.rm("mysql", "server", "port")
562
+ expect(node["mysql"]["server"][0]["port"]).to eql(3456)
563
+ end
564
+ end
565
+ end
566
+
567
+ describe "granular deleting attributes" do
568
+ context "when only defaults exist" do
569
+ before do
570
+ node.role_default["mysql"]["server"]["port"] = 1234
571
+ node.default["mysql"]["server"]["port"] = 2345
572
+ node.force_default["mysql"]["server"]["port"] = 3456
573
+ end
574
+
575
+ it "returns the deleted values" do
576
+ expect( node.rm_default("mysql", "server", "port") ).to eql(3456)
577
+ end
578
+
579
+ it "returns nil for the combined attribues" do
580
+ expect( node.rm_default("mysql", "server", "port") ).to eql(3456)
581
+ expect( node["mysql"]["server"]["port"] ).to eql(nil)
582
+ end
583
+
584
+ it "returns an empty hash for the default attrs" do
585
+ expect( node.rm_default("mysql", "server", "port") ).to eql(3456)
586
+ # this auto-vivifies, should it?
587
+ expect( node.default_attrs["mysql"]["server"]["port"] ).to eql({})
588
+ end
589
+
590
+ it "returns an empty hash after the last key is deleted" do
591
+ expect( node.rm_default("mysql", "server", "port") ).to eql(3456)
592
+ expect( node["mysql"]["server"] ).to eql({})
593
+ end
594
+ end
595
+
596
+ context "when trying to delete through a thing that isn't an array-like or hash-like object" do
597
+ before do
598
+ node.default["mysql"] = true
599
+ end
600
+
601
+ it "returns nil when you're two levels deeper" do
602
+ expect( node.rm_default("mysql", "server", "port") ).to eql(nil)
603
+ end
604
+
605
+ it "returns nil when you're one level deeper" do
606
+ expect( node.rm_default("mysql", "server") ).to eql(nil)
607
+ end
608
+
609
+ it "correctly deletes at the top level" do
610
+ expect( node.rm_default("mysql") ).to eql(true)
611
+ end
612
+ end
613
+
614
+ context "when a higher precedence exists" do
615
+ before do
616
+ node.role_default["mysql"]["server"]["port"] = 1234
617
+ node.default["mysql"]["server"]["port"] = 2345
618
+ node.force_default["mysql"]["server"]["port"] = 3456
619
+
620
+ node.override["mysql"]["server"]["port"] = 9999
621
+ end
622
+
623
+ it "returns the deleted values" do
624
+ expect( node.rm_default("mysql", "server", "port") ).to eql(3456)
625
+ end
626
+
627
+ it "returns the higher precedence values after the delete" do
628
+ expect( node.rm_default("mysql", "server", "port") ).to eql(3456)
629
+ expect( node["mysql"]["server"]["port"] ).to eql(9999)
630
+ end
631
+
632
+ it "returns an empty has for the default attrs" do
633
+ expect( node.rm_default("mysql", "server", "port") ).to eql(3456)
634
+ # this auto-vivifies, should it?
635
+ expect( node.default_attrs["mysql"]["server"]["port"] ).to eql({})
636
+ end
637
+ end
638
+
639
+ context "when a lower precedence exists" do
640
+ before do
641
+ node.default["mysql"]["server"]["port"] = 2345
642
+ node.override["mysql"]["server"]["port"] = 9999
643
+ node.role_override["mysql"]["server"]["port"] = 9876
644
+ node.force_override["mysql"]["server"]["port"] = 6669
645
+ end
646
+
647
+ it "returns the deleted values" do
648
+ expect( node.rm_override("mysql", "server", "port") ).to eql(6669)
649
+ end
650
+
651
+ it "returns the lower precedence levels after the delete" do
652
+ expect( node.rm_override("mysql", "server", "port") ).to eql(6669)
653
+ expect( node["mysql"]["server"]["port"] ).to eql(2345)
654
+ end
655
+
656
+ it "returns an empty has for the override attrs" do
657
+ expect( node.rm_override("mysql", "server", "port") ).to eql(6669)
658
+ # this auto-vivifies, should it?
659
+ expect( node.override_attrs["mysql"]["server"]["port"] ).to eql({})
660
+ end
661
+ end
662
+
663
+ it "rm_default returns nil on deleting non-existent values" do
664
+ expect( node.rm_default("no", "such", "thing") ).to be_nil
665
+ end
666
+
667
+ it "rm_normal returns nil on deleting non-existent values" do
668
+ expect( node.rm_normal("no", "such", "thing") ).to be_nil
669
+ end
670
+
671
+ it "rm_override returns nil on deleting non-existent values" do
672
+ expect( node.rm_override("no", "such", "thing") ).to be_nil
673
+ end
674
+ end
675
+
676
+ describe "granular replacing attributes" do
677
+ it "removes everything at the level of the last key" do
678
+ node.default["mysql"]["server"]["port"] = 2345
679
+
680
+ node.default!["mysql"]["server"] = { "data_dir" => "/my_raid_volume/lib/mysql" }
681
+
682
+ expect( node["mysql"]["server"] ).to eql({ "data_dir" => "/my_raid_volume/lib/mysql" })
683
+ end
684
+
685
+ it "replaces a value at the cookbook sub-level of the atributes only" do
686
+ node.default["mysql"]["server"]["port"] = 2345
687
+ node.default["mysql"]["server"]["service_name"] = "fancypants-sql"
688
+ node.role_default["mysql"]["server"]["port"] = 1234
689
+ node.force_default["mysql"]["server"]["port"] = 3456
690
+
691
+ node.default!["mysql"]["server"] = { "data_dir" => "/my_raid_volume/lib/mysql" }
692
+
693
+ expect( node["mysql"]["server"]["port"] ).to eql(3456)
694
+ expect( node["mysql"]["server"]["service_name"] ).to be_nil
695
+ expect( node["mysql"]["server"]["data_dir"] ).to eql("/my_raid_volume/lib/mysql")
696
+ expect( node["mysql"]["server"] ).to eql({ "port" => 3456, "data_dir" => "/my_raid_volume/lib/mysql" })
697
+ end
698
+
699
+ it "higher precedence values aren't removed" do
700
+ node.role_default["mysql"]["server"]["port"] = 1234
701
+ node.default["mysql"]["server"]["port"] = 2345
702
+ node.force_default["mysql"]["server"]["port"] = 3456
703
+ node.override["mysql"]["server"]["service_name"] = "fancypants-sql"
704
+
705
+ node.default!["mysql"]["server"] = { "data_dir" => "/my_raid_volume/lib/mysql" }
706
+
707
+ expect( node["mysql"]["server"]["port"] ).to eql(3456)
708
+ expect( node["mysql"]["server"]["data_dir"] ).to eql("/my_raid_volume/lib/mysql")
709
+ expect( node["mysql"]["server"] ).to eql({ "service_name" => "fancypants-sql", "port" => 3456, "data_dir" => "/my_raid_volume/lib/mysql" })
710
+ end
711
+ end
712
+
713
+ describe "granular force replacing attributes" do
714
+ it "removes everything at the level of the last key" do
715
+ node.force_default["mysql"]["server"]["port"] = 2345
716
+
717
+ node.force_default!["mysql"]["server"] = {
718
+ "data_dir" => "/my_raid_volume/lib/mysql",
719
+ }
720
+
721
+ expect( node["mysql"]["server"] ).to eql({
722
+ "data_dir" => "/my_raid_volume/lib/mysql",
723
+ })
724
+ end
725
+
726
+ it "removes all values from the precedence level when setting" do
727
+ node.role_default["mysql"]["server"]["port"] = 1234
728
+ node.default["mysql"]["server"]["port"] = 2345
729
+ node.force_default["mysql"]["server"]["port"] = 3456
730
+
731
+ node.force_default!["mysql"]["server"] = {
732
+ "data_dir" => "/my_raid_volume/lib/mysql",
733
+ }
734
+
735
+ expect( node["mysql"]["server"]["port"] ).to be_nil
736
+ expect( node["mysql"]["server"]["data_dir"] ).to eql("/my_raid_volume/lib/mysql")
737
+ expect( node["mysql"]["server"] ).to eql({
738
+ "data_dir" => "/my_raid_volume/lib/mysql",
739
+ })
740
+ end
741
+
742
+ it "higher precedence levels are not removed" do
743
+ node.role_default["mysql"]["server"]["port"] = 1234
744
+ node.default["mysql"]["server"]["port"] = 2345
745
+ node.force_default["mysql"]["server"]["port"] = 3456
746
+ node.override["mysql"]["server"]["service_name"] = "fancypants-sql"
747
+
748
+ node.force_default!["mysql"]["server"] = {
749
+ "data_dir" => "/my_raid_volume/lib/mysql",
750
+ }
751
+
752
+ expect( node["mysql"]["server"]["port"] ).to be_nil
753
+ expect( node["mysql"]["server"]["data_dir"] ).to eql("/my_raid_volume/lib/mysql")
754
+ expect( node["mysql"]["server"] ).to eql({
755
+ "service_name" => "fancypants-sql",
756
+ "data_dir" => "/my_raid_volume/lib/mysql",
757
+ })
758
+ end
759
+
760
+ it "will autovivify" do
761
+ node.force_default!["mysql"]["server"] = {
762
+ "data_dir" => "/my_raid_volume/lib/mysql",
763
+ }
764
+ expect( node["mysql"]["server"]["data_dir"] ).to eql("/my_raid_volume/lib/mysql")
765
+ end
766
+
767
+ it "lower precedence levels aren't removed" do
768
+ node.role_override["mysql"]["server"]["port"] = 1234
769
+ node.override["mysql"]["server"]["port"] = 2345
770
+ node.force_override["mysql"]["server"]["port"] = 3456
771
+ node.default["mysql"]["server"]["service_name"] = "fancypants-sql"
772
+
773
+ node.force_override!["mysql"]["server"] = {
774
+ "data_dir" => "/my_raid_volume/lib/mysql",
775
+ }
776
+
777
+ expect( node["mysql"]["server"]["port"] ).to be_nil
778
+ expect( node["mysql"]["server"]["data_dir"] ).to eql("/my_raid_volume/lib/mysql")
779
+ expect( node["mysql"]["server"] ).to eql({
780
+ "service_name" => "fancypants-sql",
781
+ "data_dir" => "/my_raid_volume/lib/mysql",
782
+ })
783
+ end
784
+
785
+ it "when overwriting a non-hash/array" do
786
+ node.override["mysql"] = false
787
+ node.force_override["mysql"] = true
788
+ node.force_override!["mysql"]["server"] = {
789
+ "data_dir" => "/my_raid_volume/lib/mysql",
790
+ }
791
+ expect( node["mysql"]["server"]["data_dir"] ).to eql("/my_raid_volume/lib/mysql")
792
+ end
793
+
794
+ it "when overwriting an array with a hash" do
795
+ node.force_override["mysql"][0] = true
796
+ node.force_override!["mysql"]["server"] = {
797
+ "data_dir" => "/my_raid_volume/lib/mysql",
798
+ }
799
+ expect( node["mysql"]["server"] ).to eql({
800
+ "data_dir" => "/my_raid_volume/lib/mysql",
801
+ })
802
+ end
803
+ end
804
+
805
+ # In Chef-12.0 there is a deep_merge cache on the top level attribute which had a bug
806
+ # where it cached node[:foo] separate from node['foo']. These tests exercise those edge conditions.
807
+ #
808
+ # https://github.com/chef/chef/issues/2700
809
+ # https://github.com/chef/chef/issues/2712
810
+ # https://github.com/chef/chef/issues/2745
811
+ #
812
+ describe "deep merge attribute cache edge conditions" do
813
+ it "does not error with complicated attribute substitution" do
814
+ Chef::Config[:treat_deprecation_warnings_as_errors] = false
815
+ node.default["chef_attribute_hell"]["attr1"] = "attribute1"
816
+ node.default["chef_attribute_hell"]["attr2"] = "#{node.chef_attribute_hell.attr1}/attr2"
817
+ expect { node.default["chef_attribute_hell"]["attr3"] = "#{node.chef_attribute_hell.attr2}/attr3" }.not_to raise_error
818
+ end
819
+
820
+ it "caches both strings and symbols correctly" do
821
+ node.force_default[:solr][:version] = "4.10.2"
822
+ node.force_default[:solr][:data_dir] = "/opt/solr-#{node['solr'][:version]}/example/solr"
823
+ node.force_default[:solr][:xms] = "512M"
824
+ expect(node[:solr][:xms]).to eql("512M")
825
+ expect(node["solr"][:xms]).to eql("512M")
826
+ end
827
+
828
+ it "method interpolation syntax also works" do
829
+ Chef::Config[:treat_deprecation_warnings_as_errors] = false
830
+ node.default["passenger"]["version"] = "4.0.57"
831
+ node.default["passenger"]["root_path"] = "passenger-#{node['passenger']['version']}"
832
+ node.default["passenger"]["root_path_2"] = "passenger-#{node.passenger['version']}"
833
+ expect(node["passenger"]["root_path_2"]).to eql("passenger-4.0.57")
834
+ expect(node[:passenger]["root_path_2"]).to eql("passenger-4.0.57")
835
+ end
836
+ end
837
+
838
+ it "should raise an ArgumentError if you ask for an attribute that doesn't exist via method_missing" do
839
+ Chef::Config[:treat_deprecation_warnings_as_errors] = false
840
+ expect { node.sunshine }.to raise_error(NoMethodError)
841
+ end
842
+
843
+ it "should allow you to iterate over attributes with each_attribute" do
844
+ node.default.sunshine = "is bright"
845
+ node.default.canada = "is a nice place"
846
+ seen_attributes = Hash.new
847
+ node.each_attribute do |a, v|
848
+ seen_attributes[a] = v
849
+ end
850
+ expect(seen_attributes).to have_key("sunshine")
851
+ expect(seen_attributes).to have_key("canada")
852
+ expect(seen_attributes["sunshine"]).to eq("is bright")
853
+ expect(seen_attributes["canada"]).to eq("is a nice place")
854
+ end
855
+
856
+ describe "functional attribute API" do
857
+ # deeper functional testing of this API is in the VividMash spec tests
858
+ it "should have an exist? function" do
859
+ node.default["foo"]["bar"] = "baz"
860
+ expect(node.exist?("foo", "bar")).to be true
861
+ expect(node.exist?("bar", "foo")).to be false
862
+ end
863
+
864
+ it "should have a read function" do
865
+ node.override["foo"]["bar"] = "baz"
866
+ expect(node.read("foo", "bar")).to eql("baz")
867
+ expect(node.read("bar", "foo")).to eql(nil)
868
+ end
869
+
870
+ it "should have a read! function" do
871
+ node.override["foo"]["bar"] = "baz"
872
+ expect(node.read!("foo", "bar")).to eql("baz")
873
+ expect { node.read!("bar", "foo") }.to raise_error(Chef::Exceptions::NoSuchAttribute)
874
+ end
875
+
876
+ it "delegates write(:level) to node.level.write()" do
877
+ node.write(:default, "foo", "bar", "baz")
878
+ expect(node.default["foo"]["bar"]).to eql("baz")
879
+ end
880
+
881
+ it "delegates write!(:level) to node.level.write!()" do
882
+ node.write!(:default, "foo", "bar", "baz")
883
+ expect(node.default["foo"]["bar"]).to eql("baz")
884
+ node.default["bar"] = true
885
+ expect { node.write!(:default, "bar", "foo", "baz") }.to raise_error(Chef::Exceptions::AttributeTypeMismatch)
886
+ end
887
+
888
+ it "delegates unlink(:level) to node.level.unlink()" do
889
+ node.default["foo"]["bar"] = "baz"
890
+ expect(node.unlink(:default, "foo", "bar")).to eql("baz")
891
+ expect(node.unlink(:default, "bar", "foo")).to eql(nil)
892
+ end
893
+
894
+ it "delegates unlink!(:level) to node.level.unlink!()" do
895
+ node.default["foo"]["bar"] = "baz"
896
+ expect(node.unlink!(:default, "foo", "bar")).to eql("baz")
897
+ expect { node.unlink!(:default, "bar", "foo") }.to raise_error(Chef::Exceptions::NoSuchAttribute)
898
+ end
899
+ end
900
+ end
901
+
902
+ describe "consuming json" do
903
+
904
+ before do
905
+ @ohai_data = { :platform => "foo", :platform_version => "bar" }
906
+ end
907
+
908
+ it "consumes the run list portion of a collection of attributes and returns the remainder" do
909
+ attrs = { "run_list" => [ "role[base]", "recipe[chef::server]" ], "foo" => "bar" }
910
+ expect(node.consume_run_list(attrs)).to eq({ "foo" => "bar" })
911
+ expect(node.run_list).to eq([ "role[base]", "recipe[chef::server]" ])
912
+ end
913
+
914
+ it "sets the node chef_environment" do
915
+ attrs = { "chef_environment" => "foo_environment", "bar" => "baz" }
916
+ expect(node.consume_chef_environment(attrs)).to eq({ "bar" => "baz" })
917
+ expect(node.chef_environment).to eq("foo_environment")
918
+ expect(node["chef_environment"]).to be nil
919
+ end
920
+
921
+ it "should overwrites the run list with the run list it consumes" do
922
+ node.consume_run_list "recipes" => %w{one two}
923
+ node.consume_run_list "recipes" => [ "three" ]
924
+ expect(node.run_list).to eq([ "three" ])
925
+ end
926
+
927
+ it "should not add duplicate recipes from the json attributes" do
928
+ node.run_list << "one"
929
+ node.consume_run_list "recipes" => %w{one two three}
930
+ expect(node.run_list).to eq(%w{one two three})
931
+ end
932
+
933
+ it "doesn't change the run list if no run_list is specified in the json" do
934
+ node.run_list << "role[database]"
935
+ node.consume_run_list "foo" => "bar"
936
+ expect(node.run_list).to eq(["role[database]"])
937
+ end
938
+
939
+ it "raises an exception if you provide both recipe and run_list attributes, since this is ambiguous" do
940
+ expect { node.consume_run_list "recipes" => "stuff", "run_list" => "other_stuff" }.to raise_error(Chef::Exceptions::AmbiguousRunlistSpecification)
941
+ end
942
+
943
+ it "should add json attributes to the node" do
944
+ node.consume_external_attrs(@ohai_data, { "one" => "two", "three" => "four" })
945
+ expect(node["one"]).to eql("two")
946
+ expect(node["three"]).to eql("four")
947
+ end
948
+
949
+ it "should set the tags attribute to an empty array if it is not already defined" do
950
+ node.consume_external_attrs(@ohai_data, {})
951
+ expect(node.tags).to eql([])
952
+ end
953
+
954
+ it "should not set the tags attribute to an empty array if it is already defined" do
955
+ node.tag("radiohead")
956
+ node.consume_external_attrs(@ohai_data, {})
957
+ expect(node.tags).to eql([ "radiohead" ])
958
+ end
959
+
960
+ it "should set the tags attribute to an empty array if it is nil" do
961
+ node.attributes.normal = { "tags" => nil }
962
+ node.consume_external_attrs(@ohai_data, {})
963
+ expect(node.tags).to eql([])
964
+ end
965
+
966
+ it "should return an array if it is fed a string" do
967
+ node.normal[:tags] = "string"
968
+ node.consume_external_attrs(@ohai_data, {})
969
+ expect(node.tags).to eql(["string"])
970
+ end
971
+
972
+ it "should return an array if it is fed a hash" do
973
+ node.normal[:tags] = {}
974
+ node.consume_external_attrs(@ohai_data, {})
975
+ expect(node.tags).to eql([])
976
+ end
977
+
978
+ it "deep merges attributes instead of overwriting them" do
979
+ node.consume_external_attrs(@ohai_data, "one" => { "two" => { "three" => "four" } })
980
+ expect(node["one"].to_hash).to eq({ "two" => { "three" => "four" } })
981
+ node.consume_external_attrs(@ohai_data, "one" => { "abc" => "123" })
982
+ node.consume_external_attrs(@ohai_data, "one" => { "two" => { "foo" => "bar" } })
983
+ expect(node["one"].to_hash).to eq({ "two" => { "three" => "four", "foo" => "bar" }, "abc" => "123" })
984
+ end
985
+
986
+ it "gives attributes from JSON priority when deep merging" do
987
+ node.consume_external_attrs(@ohai_data, "one" => { "two" => { "three" => "four" } })
988
+ expect(node["one"].to_hash).to eq({ "two" => { "three" => "four" } })
989
+ node.consume_external_attrs(@ohai_data, "one" => { "two" => { "three" => "forty-two" } })
990
+ expect(node["one"].to_hash).to eq({ "two" => { "three" => "forty-two" } })
991
+ end
992
+
993
+ end
994
+
995
+ describe "preparing for a chef client run" do
996
+ before do
997
+ @ohai_data = { :platform => "foobuntu", :platform_version => "23.42" }
998
+ end
999
+
1000
+ it "sets its platform according to platform detection" do
1001
+ node.consume_external_attrs(@ohai_data, {})
1002
+ expect(node.automatic_attrs[:platform]).to eq("foobuntu")
1003
+ expect(node.automatic_attrs[:platform_version]).to eq("23.42")
1004
+ end
1005
+
1006
+ it "consumes the run list from provided json attributes" do
1007
+ node.consume_external_attrs(@ohai_data, { "run_list" => ["recipe[unicorn]"] })
1008
+ expect(node.run_list).to eq(["recipe[unicorn]"])
1009
+ end
1010
+
1011
+ it "saves non-runlist json attrs for later" do
1012
+ expansion = Chef::RunList::RunListExpansion.new("_default", [])
1013
+ allow(node.run_list).to receive(:expand).and_return(expansion)
1014
+ node.consume_external_attrs(@ohai_data, { "foo" => "bar" })
1015
+ node.expand!
1016
+ expect(node.normal_attrs).to eq({ "foo" => "bar", "tags" => [] })
1017
+ end
1018
+
1019
+ end
1020
+
1021
+ describe "when expanding its run list and merging attributes" do
1022
+ before do
1023
+ @environment = Chef::Environment.new.tap do |e|
1024
+ e.name("rspec_env")
1025
+ e.default_attributes("env default key" => "env default value")
1026
+ e.override_attributes("env override key" => "env override value")
1027
+ end
1028
+ expect(Chef::Environment).to receive(:load).with("rspec_env").and_return(@environment)
1029
+ @expansion = Chef::RunList::RunListExpansion.new("rspec_env", [])
1030
+ node.chef_environment("rspec_env")
1031
+ allow(node.run_list).to receive(:expand).and_return(@expansion)
1032
+ end
1033
+
1034
+ it "sets the 'recipes' automatic attribute to the recipes in the expanded run_list" do
1035
+ @expansion.recipes << "recipe[chef::client]" << "recipe[nginx::default]"
1036
+ node.expand!
1037
+ expect(node.automatic_attrs[:recipes]).to eq(["recipe[chef::client]", "recipe[nginx::default]"])
1038
+ end
1039
+
1040
+ it "sets the 'roles' automatic attribute to the expanded role list" do
1041
+ @expansion.instance_variable_set(:@applied_roles, { "arf" => nil, "countersnark" => nil })
1042
+ node.expand!
1043
+ expect(node.automatic_attrs[:roles].sort).to eq(%w{arf countersnark})
1044
+ end
1045
+
1046
+ it "applies default attributes from the environment as environment defaults" do
1047
+ node.expand!
1048
+ expect(node.attributes.env_default["env default key"]).to eq("env default value")
1049
+ end
1050
+
1051
+ it "applies override attributes from the environment as env overrides" do
1052
+ node.expand!
1053
+ expect(node.attributes.env_override["env override key"]).to eq("env override value")
1054
+ end
1055
+
1056
+ it "applies default attributes from roles as role defaults" do
1057
+ @expansion.default_attrs["role default key"] = "role default value"
1058
+ node.expand!
1059
+ expect(node.attributes.role_default["role default key"]).to eq("role default value")
1060
+ end
1061
+
1062
+ it "applies override attributes from roles as role overrides" do
1063
+ @expansion.override_attrs["role override key"] = "role override value"
1064
+ node.expand!
1065
+ expect(node.attributes.role_override["role override key"]).to eq("role override value")
1066
+ end
1067
+ end
1068
+
1069
+ describe "loaded_recipe" do
1070
+ it "should not add a recipe that is already in the recipes list" do
1071
+ node.automatic_attrs[:recipes] = [ "nginx::module" ]
1072
+ node.loaded_recipe(:nginx, "module")
1073
+ expect(node.automatic_attrs[:recipes].length).to eq(1)
1074
+ end
1075
+
1076
+ it "should add a recipe that is not already in the recipes list" do
1077
+ node.automatic_attrs[:recipes] = [ "nginx::other_module" ]
1078
+ node.loaded_recipe(:nginx, "module")
1079
+ expect(node.automatic_attrs[:recipes].length).to eq(2)
1080
+ expect(node.recipe?("nginx::module")).to be true
1081
+ expect(node.recipe?("nginx::other_module")).to be true
1082
+ end
1083
+ end
1084
+
1085
+ describe "when querying for recipes in the run list" do
1086
+ context "when a recipe is in the top level run list" do
1087
+ before do
1088
+ node.run_list << "recipe[nginx::module]"
1089
+ end
1090
+
1091
+ it "finds the recipe" do
1092
+ expect(node.recipe?("nginx::module")).to be true
1093
+ end
1094
+
1095
+ it "does not find a recipe not in the run list" do
1096
+ expect(node.recipe?("nginx::other_module")).to be false
1097
+ end
1098
+ end
1099
+ context "when a recipe is in the expanded run list only" do
1100
+ before do
1101
+ node.run_list << "role[base]"
1102
+ node.automatic_attrs[:recipes] = [ "nginx::module" ]
1103
+ end
1104
+
1105
+ it "finds a recipe in the expanded run list" do
1106
+ expect(node.recipe?("nginx::module")).to be true
1107
+ end
1108
+
1109
+ it "does not find a recipe that's not in the run list" do
1110
+ expect(node.recipe?("nginx::other_module")).to be false
1111
+ end
1112
+ end
1113
+ end
1114
+
1115
+ describe "when clearing computed state at the beginning of a run" do
1116
+ before do
1117
+ node.default[:foo] = "default"
1118
+ node.normal[:foo] = "normal"
1119
+ node.override[:foo] = "override"
1120
+ node.reset_defaults_and_overrides
1121
+ end
1122
+
1123
+ it "removes default attributes" do
1124
+ expect(node.default).to be_empty
1125
+ end
1126
+
1127
+ it "removes override attributes" do
1128
+ expect(node.override).to be_empty
1129
+ end
1130
+
1131
+ it "leaves normal level attributes untouched" do
1132
+ expect(node[:foo]).to eq("normal")
1133
+ end
1134
+
1135
+ end
1136
+
1137
+ describe "when merging environment attributes" do
1138
+ before do
1139
+ node.chef_environment = "rspec"
1140
+ @expansion = Chef::RunList::RunListExpansion.new("rspec", [])
1141
+ @expansion.default_attrs.replace({ :default => "from role", :d_role => "role only" })
1142
+ @expansion.override_attrs.replace({ :override => "from role", :o_role => "role only" })
1143
+
1144
+ @environment = Chef::Environment.new
1145
+ @environment.default_attributes = { :default => "from env", :d_env => "env only" }
1146
+ @environment.override_attributes = { :override => "from env", :o_env => "env only" }
1147
+ allow(Chef::Environment).to receive(:load).and_return(@environment)
1148
+ node.apply_expansion_attributes(@expansion)
1149
+ end
1150
+
1151
+ it "does not nuke role-only default attrs" do
1152
+ expect(node[:d_role]).to eq("role only")
1153
+ end
1154
+
1155
+ it "does not nuke role-only override attrs" do
1156
+ expect(node[:o_role]).to eq("role only")
1157
+ end
1158
+
1159
+ it "does not nuke env-only default attrs" do
1160
+ expect(node[:o_env]).to eq("env only")
1161
+ end
1162
+
1163
+ it "does not nuke role-only override attrs" do
1164
+ expect(node[:o_env]).to eq("env only")
1165
+ end
1166
+
1167
+ it "gives role defaults precedence over env defaults" do
1168
+ expect(node[:default]).to eq("from role")
1169
+ end
1170
+
1171
+ it "gives env overrides precedence over role overrides" do
1172
+ expect(node[:override]).to eq("from env")
1173
+ end
1174
+ end
1175
+
1176
+ describe "when evaluating attributes files" do
1177
+ before do
1178
+ @cookbook_repo = File.expand_path(File.join(CHEF_SPEC_DATA, "cookbooks"))
1179
+ @cookbook_loader = Chef::CookbookLoader.new(@cookbook_repo)
1180
+ @cookbook_loader.load_cookbooks
1181
+
1182
+ @cookbook_collection = Chef::CookbookCollection.new(@cookbook_loader.cookbooks_by_name)
1183
+
1184
+ @events = Chef::EventDispatch::Dispatcher.new
1185
+ @run_context = Chef::RunContext.new(node, @cookbook_collection, @events)
1186
+
1187
+ node.include_attribute("openldap::default")
1188
+ node.include_attribute("openldap::smokey")
1189
+ end
1190
+
1191
+ it "sets attributes from the files" do
1192
+ expect(node["ldap_server"]).to eql("ops1prod")
1193
+ expect(node["ldap_basedn"]).to eql("dc=hjksolutions,dc=com")
1194
+ expect(node["ldap_replication_password"]).to eql("forsure")
1195
+ expect(node["smokey"]).to eql("robinson")
1196
+ end
1197
+
1198
+ it "gives a sensible error when attempting to load a missing attributes file" do
1199
+ expect { node.include_attribute("nope-this::doesnt-exist") }.to raise_error(Chef::Exceptions::CookbookNotFound)
1200
+ end
1201
+ end
1202
+
1203
+ describe "roles" do
1204
+ it "should allow you to query whether or not it has a recipe applied with role?" do
1205
+ node.run_list << "role[sunrise]"
1206
+ expect(node.role?("sunrise")).to eql(true)
1207
+ expect(node.role?("not at home")).to eql(false)
1208
+ end
1209
+
1210
+ it "should allow you to set roles with arguments" do
1211
+ node.run_list << "role[one]"
1212
+ node.run_list << "role[two]"
1213
+ expect(node.role?("one")).to eql(true)
1214
+ expect(node.role?("two")).to eql(true)
1215
+ end
1216
+ end
1217
+
1218
+ describe "run_list" do
1219
+ it "should have a Chef::RunList of recipes and roles that should be applied" do
1220
+ expect(node.run_list).to be_a_kind_of(Chef::RunList)
1221
+ end
1222
+
1223
+ it "should allow you to query the run list with arguments" do
1224
+ node.run_list "recipe[baz]"
1225
+ expect(node.run_list?("recipe[baz]")).to eql(true)
1226
+ end
1227
+
1228
+ it "should allow you to set the run list with arguments" do
1229
+ node.run_list "recipe[baz]", "role[foo]"
1230
+ expect(node.run_list?("recipe[baz]")).to eql(true)
1231
+ expect(node.run_list?("role[foo]")).to eql(true)
1232
+ end
1233
+ end
1234
+
1235
+ describe "from file" do
1236
+ it "should load a node from a ruby file" do
1237
+ node.from_file(File.expand_path(File.join(CHEF_SPEC_DATA, "nodes", "test.rb")))
1238
+ expect(node.name).to eql("test.example.com-short")
1239
+ expect(node["sunshine"]).to eql("in")
1240
+ expect(node["something"]).to eql("else")
1241
+ expect(node.run_list).to eq(["operations-master", "operations-monitoring"])
1242
+ end
1243
+
1244
+ it "should raise an exception if the file cannot be found or read" do
1245
+ expect { node.from_file("/tmp/monkeydiving") }.to raise_error(IOError)
1246
+ end
1247
+ end
1248
+
1249
+ describe "update_from!" do
1250
+ before(:each) do
1251
+ node.name("orig")
1252
+ node.chef_environment("dev")
1253
+ node.default_attrs = { "one" => { "two" => "three", "four" => "five", "eight" => "nine" } }
1254
+ node.override_attrs = { "one" => { "two" => "three", "four" => "six" } }
1255
+ node.normal_attrs = { "one" => { "two" => "seven" } }
1256
+ node.run_list << "role[marxist]"
1257
+ node.run_list << "role[leninist]"
1258
+ node.run_list << "recipe[stalinist]"
1259
+
1260
+ @example = Chef::Node.new()
1261
+ @example.name("newname")
1262
+ @example.chef_environment("prod")
1263
+ @example.default_attrs = { "alpha" => { "bravo" => "charlie", "delta" => "echo" } }
1264
+ @example.override_attrs = { "alpha" => { "bravo" => "foxtrot", "delta" => "golf" } }
1265
+ @example.normal_attrs = { "alpha" => { "bravo" => "hotel" } }
1266
+ @example.run_list << "role[comedy]"
1267
+ @example.run_list << "role[drama]"
1268
+ @example.run_list << "recipe[mystery]"
1269
+ end
1270
+
1271
+ it "allows update of everything except name" do
1272
+ node.update_from!(@example)
1273
+ expect(node.name).to eq("orig")
1274
+ expect(node.chef_environment).to eq(@example.chef_environment)
1275
+ expect(node.default_attrs).to eq(@example.default_attrs)
1276
+ expect(node.override_attrs).to eq(@example.override_attrs)
1277
+ expect(node.normal_attrs).to eq(@example.normal_attrs)
1278
+ expect(node.run_list).to eq(@example.run_list)
1279
+ end
1280
+
1281
+ it "should not update the name of the node" do
1282
+ expect(node).not_to receive(:name).with(@example.name)
1283
+ node.update_from!(@example)
1284
+ end
1285
+ end
1286
+
1287
+ describe "to_hash" do
1288
+ it "should serialize itself as a hash" do
1289
+ node.chef_environment("dev")
1290
+ node.default_attrs = { "one" => { "two" => "three", "four" => "five", "eight" => "nine" } }
1291
+ node.override_attrs = { "one" => { "two" => "three", "four" => "six" } }
1292
+ node.normal_attrs = { "one" => { "two" => "seven" } }
1293
+ node.run_list << "role[marxist]"
1294
+ node.run_list << "role[leninist]"
1295
+ node.run_list << "recipe[stalinist]"
1296
+ h = node.to_hash
1297
+ expect(h["one"]["two"]).to eq("three")
1298
+ expect(h["one"]["four"]).to eq("six")
1299
+ expect(h["one"]["eight"]).to eq("nine")
1300
+ expect(h["role"]).to be_include("marxist")
1301
+ expect(h["role"]).to be_include("leninist")
1302
+ expect(h["run_list"]).to be_include("role[marxist]")
1303
+ expect(h["run_list"]).to be_include("role[leninist]")
1304
+ expect(h["run_list"]).to be_include("recipe[stalinist]")
1305
+ expect(h["chef_environment"]).to eq("dev")
1306
+ end
1307
+
1308
+ it "should return an empty array for empty run_list" do
1309
+ expect(node.to_hash["run_list"]).to eq([])
1310
+ end
1311
+ end
1312
+
1313
+ describe "converting to or from json" do
1314
+ it "should serialize itself as json", :json => true do
1315
+ node.from_file(File.expand_path("nodes/test.example.com.rb", CHEF_SPEC_DATA))
1316
+ json = Chef::JSONCompat.to_json(node)
1317
+ expect(json).to match(/json_class/)
1318
+ expect(json).to match(/name/)
1319
+ expect(json).to match(/chef_environment/)
1320
+ expect(json).to match(/normal/)
1321
+ expect(json).to match(/default/)
1322
+ expect(json).to match(/override/)
1323
+ expect(json).to match(/run_list/)
1324
+ end
1325
+
1326
+ it "should serialize valid json with a run list", :json => true do
1327
+ #This test came about because activesupport mucks with Chef json serialization
1328
+ #Test should pass with and without Activesupport
1329
+ node.run_list << { "type" => "role", "name" => "Cthulu" }
1330
+ node.run_list << { "type" => "role", "name" => "Hastur" }
1331
+ json = Chef::JSONCompat.to_json(node)
1332
+ expect(json).to match(/\"run_list\":\[\"role\[Cthulu\]\",\"role\[Hastur\]\"\]/)
1333
+ end
1334
+
1335
+ it "should serialize the correct run list", :json => true do
1336
+ node.run_list << "role[marxist]"
1337
+ node.run_list << "role[leninist]"
1338
+ node.override_runlist << "role[stalinist]"
1339
+ expect(node.run_list).to be_include("role[stalinist]")
1340
+ json = Chef::JSONCompat.to_json(node)
1341
+ expect(json).to match(/\"run_list\":\[\"role\[marxist\]\",\"role\[leninist\]\"\]/)
1342
+ end
1343
+
1344
+ it "merges the override components into a combined override object" do
1345
+ node.attributes.role_override["role override"] = "role override"
1346
+ node.attributes.env_override["env override"] = "env override"
1347
+ node_for_json = node.for_json
1348
+ expect(node_for_json["override"]["role override"]).to eq("role override")
1349
+ expect(node_for_json["override"]["env override"]).to eq("env override")
1350
+ end
1351
+
1352
+ it "merges the default components into a combined default object" do
1353
+ node.attributes.role_default["role default"] = "role default"
1354
+ node.attributes.env_default["env default"] = "env default"
1355
+ node_for_json = node.for_json
1356
+ expect(node_for_json["default"]["role default"]).to eq("role default")
1357
+ expect(node_for_json["default"]["env default"]).to eq("env default")
1358
+ end
1359
+
1360
+ it "should deserialize itself from json", :json => true do
1361
+ node.from_file(File.expand_path("nodes/test.example.com.rb", CHEF_SPEC_DATA))
1362
+ json = Chef::JSONCompat.to_json(node)
1363
+ serialized_node = Chef::Node.from_hash(Chef::JSONCompat.parse(json))
1364
+ expect(serialized_node).to be_a_kind_of(Chef::Node)
1365
+ expect(serialized_node.name).to eql(node.name)
1366
+ expect(serialized_node.chef_environment).to eql(node.chef_environment)
1367
+ node.each_attribute do |k, v|
1368
+ expect(serialized_node[k]).to eql(v)
1369
+ end
1370
+ expect(serialized_node.run_list).to eq(node.run_list)
1371
+ end
1372
+
1373
+ context "when policyfile attributes are not present" do
1374
+
1375
+ it "does not have a policy_name key in the json" do
1376
+ expect(node.for_json.keys).to_not include("policy_name")
1377
+ end
1378
+
1379
+ it "does not have a policy_group key in the json" do
1380
+ expect(node.for_json.keys).to_not include("policy_name")
1381
+ end
1382
+ end
1383
+
1384
+ context "when policyfile attributes are present" do
1385
+
1386
+ before do
1387
+ node.policy_name = "my-application"
1388
+ node.policy_group = "staging"
1389
+ end
1390
+
1391
+ it "includes policy_name key in the json" do
1392
+ expect(node.for_json).to have_key("policy_name")
1393
+ expect(node.for_json["policy_name"]).to eq("my-application")
1394
+ end
1395
+
1396
+ it "includes a policy_group key in the json" do
1397
+ expect(node.for_json).to have_key("policy_group")
1398
+ expect(node.for_json["policy_group"]).to eq("staging")
1399
+ end
1400
+
1401
+ it "parses policyfile attributes from JSON" do
1402
+ round_tripped_node = Chef::Node.from_hash(node.for_json)
1403
+
1404
+ expect(round_tripped_node.policy_name).to eq("my-application")
1405
+ expect(round_tripped_node.policy_group).to eq("staging")
1406
+ end
1407
+
1408
+ end
1409
+
1410
+ include_examples "to_json equivalent to Chef::JSONCompat.to_json" do
1411
+ let(:jsonable) do
1412
+ node.from_file(File.expand_path("nodes/test.example.com.rb", CHEF_SPEC_DATA))
1413
+ node
1414
+ end
1415
+ end
1416
+ end
1417
+
1418
+ describe "to_s" do
1419
+ it "should turn into a string like node[name]" do
1420
+ node.name("airplane")
1421
+ expect(node.to_s).to eql("node[airplane]")
1422
+ end
1423
+ end
1424
+
1425
+ describe "api model" do
1426
+ before(:each) do
1427
+ @rest = double("Chef::ServerAPI")
1428
+ allow(Chef::ServerAPI).to receive(:new).and_return(@rest)
1429
+ @query = double("Chef::Search::Query")
1430
+ allow(Chef::Search::Query).to receive(:new).and_return(@query)
1431
+ end
1432
+
1433
+ describe "list" do
1434
+ describe "inflated" do
1435
+ it "should return a hash of node names and objects" do
1436
+ n1 = double("Chef::Node", :name => "one")
1437
+ allow(n1).to receive(:kind_of?).with(Chef::Node) { true }
1438
+ expect(@query).to receive(:search).with(:node).and_yield(n1)
1439
+ r = Chef::Node.list(true)
1440
+ expect(r["one"]).to eq(n1)
1441
+ end
1442
+ end
1443
+
1444
+ it "should return a hash of node names and urls" do
1445
+ expect(@rest).to receive(:get).and_return({ "one" => "http://foo" })
1446
+ r = Chef::Node.list
1447
+ expect(r["one"]).to eq("http://foo")
1448
+ end
1449
+ end
1450
+
1451
+ describe "load" do
1452
+ it "should load a node by name" do
1453
+ node.from_file(File.expand_path("nodes/test.example.com.rb", CHEF_SPEC_DATA))
1454
+ json = Chef::JSONCompat.to_json(node)
1455
+ parsed = Chef::JSONCompat.parse(json)
1456
+ expect(@rest).to receive(:get).with("nodes/test.example.com").and_return(parsed)
1457
+ serialized_node = Chef::Node.load("test.example.com")
1458
+ expect(serialized_node).to be_a_kind_of(Chef::Node)
1459
+ expect(serialized_node.name).to eql(node.name)
1460
+ end
1461
+ end
1462
+
1463
+ describe "destroy" do
1464
+ it "should destroy a node" do
1465
+ expect(@rest).to receive(:delete).with("nodes/monkey").and_return("foo")
1466
+ node.name("monkey")
1467
+ node.destroy
1468
+ end
1469
+ end
1470
+
1471
+ describe "save" do
1472
+ it "should update a node if it already exists" do
1473
+ node.name("monkey")
1474
+ allow(node).to receive(:data_for_save).and_return({})
1475
+ expect(@rest).to receive(:put).with("nodes/monkey", {}).and_return("foo")
1476
+ node.save
1477
+ end
1478
+
1479
+ it "should not try and create if it can update" do
1480
+ node.name("monkey")
1481
+ allow(node).to receive(:data_for_save).and_return({})
1482
+ expect(@rest).to receive(:put).with("nodes/monkey", {}).and_return("foo")
1483
+ expect(@rest).not_to receive(:post)
1484
+ node.save
1485
+ end
1486
+
1487
+ it "should create if it cannot update" do
1488
+ node.name("monkey")
1489
+ allow(node).to receive(:data_for_save).and_return({})
1490
+ exception = double("404 error", :code => "404")
1491
+ expect(@rest).to receive(:put).and_raise(Net::HTTPServerException.new("foo", exception))
1492
+ expect(@rest).to receive(:post).with("nodes", {})
1493
+ node.save
1494
+ end
1495
+
1496
+ describe "when whyrun mode is enabled" do
1497
+ before do
1498
+ Chef::Config[:why_run] = true
1499
+ end
1500
+ after do
1501
+ Chef::Config[:why_run] = false
1502
+ end
1503
+ it "should not save" do
1504
+ node.name("monkey")
1505
+ expect(@rest).not_to receive(:put)
1506
+ expect(@rest).not_to receive(:post)
1507
+ node.save
1508
+ end
1509
+ end
1510
+
1511
+ context "with whitelisted attributes configured" do
1512
+ it "should only save whitelisted attributes (and subattributes)" do
1513
+ Chef::Config[:automatic_attribute_whitelist] = [
1514
+ ["filesystem", "/dev/disk0s2"],
1515
+ "network/interfaces/eth0",
1516
+ ]
1517
+
1518
+ data = {
1519
+ "automatic" => {
1520
+ "filesystem" => {
1521
+ "/dev/disk0s2" => { "size" => "10mb" },
1522
+ "map - autohome" => { "size" => "10mb" },
1523
+ },
1524
+ "network" => {
1525
+ "interfaces" => {
1526
+ "eth0" => {},
1527
+ "eth1" => {},
1528
+ },
1529
+ },
1530
+ },
1531
+ "default" => {}, "normal" => {}, "override" => {}
1532
+ }
1533
+
1534
+ selected_data = {
1535
+ "automatic" => {
1536
+ "filesystem" => {
1537
+ "/dev/disk0s2" => { "size" => "10mb" },
1538
+ },
1539
+ "network" => {
1540
+ "interfaces" => {
1541
+ "eth0" => {},
1542
+ },
1543
+ },
1544
+ },
1545
+ "default" => {}, "normal" => {}, "override" => {}
1546
+ }
1547
+
1548
+ node.name("picky-monkey")
1549
+ allow(node).to receive(:for_json).and_return(data)
1550
+ expect(@rest).to receive(:put).with("nodes/picky-monkey", selected_data).and_return("foo")
1551
+ node.save
1552
+ end
1553
+
1554
+ it "should save false-y whitelisted attributes" do
1555
+ Chef::Config[:default_attribute_whitelist] = [
1556
+ "foo/bar/baz",
1557
+ ]
1558
+
1559
+ data = {
1560
+ "default" => {
1561
+ "foo" => {
1562
+ "bar" => {
1563
+ "baz" => false,
1564
+ },
1565
+ "other" => {
1566
+ "stuff" => true,
1567
+ },
1568
+ },
1569
+ },
1570
+ }
1571
+
1572
+ selected_data = {
1573
+ "default" => {
1574
+ "foo" => {
1575
+ "bar" => {
1576
+ "baz" => false,
1577
+ },
1578
+ },
1579
+ },
1580
+ }
1581
+
1582
+ node.name("falsey-monkey")
1583
+ allow(node).to receive(:for_json).and_return(data)
1584
+ expect(@rest).to receive(:put).with("nodes/falsey-monkey", selected_data).and_return("foo")
1585
+ node.save
1586
+ end
1587
+
1588
+ it "should not save any attributes if the whitelist is empty" do
1589
+ Chef::Config[:automatic_attribute_whitelist] = []
1590
+
1591
+ data = {
1592
+ "automatic" => {
1593
+ "filesystem" => {
1594
+ "/dev/disk0s2" => { "size" => "10mb" },
1595
+ "map - autohome" => { "size" => "10mb" },
1596
+ },
1597
+ },
1598
+ "default" => {}, "normal" => {}, "override" => {}
1599
+ }
1600
+
1601
+ selected_data = {
1602
+ "automatic" => {}, "default" => {}, "normal" => {}, "override" => {}
1603
+ }
1604
+
1605
+ node.name("picky-monkey")
1606
+ allow(node).to receive(:for_json).and_return(data)
1607
+ expect(@rest).to receive(:put).with("nodes/picky-monkey", selected_data).and_return("foo")
1608
+ node.save
1609
+ end
1610
+ end
1611
+
1612
+ context "when policyfile attributes are present" do
1613
+
1614
+ before do
1615
+ node.name("example-node")
1616
+ node.policy_name = "my-application"
1617
+ node.policy_group = "staging"
1618
+ end
1619
+
1620
+ context "and the server supports policyfile attributes in node JSON" do
1621
+
1622
+ it "creates the object normally" do
1623
+ expect(@rest).to receive(:post).with("nodes", node.for_json)
1624
+ node.create
1625
+ end
1626
+
1627
+ it "saves the node object normally" do
1628
+ expect(@rest).to receive(:put).with("nodes/example-node", node.for_json)
1629
+ node.save
1630
+ end
1631
+ end
1632
+
1633
+ # Chef Server before 12.3
1634
+ context "and the Chef Server does not support policyfile attributes in node JSON" do
1635
+
1636
+ let(:response_body) { %q[{"error":["Invalid key policy_name in request body"]}] }
1637
+
1638
+ let(:response) do
1639
+ Net::HTTPResponse.send(:response_class, "400").new("1.0", "400", "Bad Request").tap do |r|
1640
+ allow(r).to receive(:body).and_return(response_body)
1641
+ end
1642
+ end
1643
+
1644
+ let(:http_exception) do
1645
+ begin
1646
+ response.error!
1647
+ rescue => e
1648
+ e
1649
+ end
1650
+ end
1651
+
1652
+ let(:trimmed_node) do
1653
+ node.for_json.tap do |j|
1654
+ j.delete("policy_name")
1655
+ j.delete("policy_group")
1656
+ end
1657
+
1658
+ end
1659
+
1660
+ context "on Chef Client 13 and later" do
1661
+
1662
+ # Though we normally attempt to provide compatibility with chef
1663
+ # server one major version back, policyfiles were beta when we
1664
+ # added the policyfile attributes to the node JSON, therefore
1665
+ # policyfile users need to be on 12.3 minimum when upgrading Chef
1666
+ # Client to 13+
1667
+ it "lets the 400 pass through", chef: ">= 13" do
1668
+ expect { node.save }.to raise_error(http_exception)
1669
+ end
1670
+
1671
+ end
1672
+
1673
+ context "when the node exists" do
1674
+
1675
+ it "falls back to saving without policyfile attributes" do
1676
+ expect(@rest).to receive(:put).with("nodes/example-node", node.for_json).and_raise(http_exception)
1677
+ expect(@rest).to receive(:put).with("nodes/example-node", trimmed_node).and_return(@node)
1678
+ expect { node.save }.to_not raise_error
1679
+ end
1680
+
1681
+ end
1682
+
1683
+ context "when the node doesn't exist" do
1684
+
1685
+ let(:response_404) do
1686
+ Net::HTTPResponse.send(:response_class, "404").new("1.0", "404", "Not Found")
1687
+ end
1688
+
1689
+ let(:http_exception_404) do
1690
+ begin
1691
+ response_404.error!
1692
+ rescue => e
1693
+ e
1694
+ end
1695
+ end
1696
+
1697
+ it "falls back to saving without policyfile attributes" do
1698
+ expect(@rest).to receive(:put).with("nodes/example-node", node.for_json).and_raise(http_exception)
1699
+ expect(@rest).to receive(:put).with("nodes/example-node", trimmed_node).and_raise(http_exception_404)
1700
+ expect(@rest).to receive(:post).with("nodes", trimmed_node).and_return(@node)
1701
+ node.save
1702
+ end
1703
+
1704
+ it "creates the node without policyfile attributes" do
1705
+ expect(@rest).to receive(:post).with("nodes", node.for_json).and_raise(http_exception)
1706
+ expect(@rest).to receive(:post).with("nodes", trimmed_node).and_return(@node)
1707
+ node.create
1708
+ end
1709
+ end
1710
+
1711
+ end
1712
+
1713
+ end
1714
+
1715
+ end
1716
+ end
1717
+
1718
+ describe "method_missing handling" do
1719
+ it "should have an #empty? method via Chef::Node::Attribute" do
1720
+ node.default["foo"] = "bar"
1721
+ expect(node.empty?).to be false
1722
+ end
1723
+
1724
+ it "it should correctly implement #respond_to?" do
1725
+ expect(node.respond_to?(:empty?)).to be true
1726
+ end
1727
+
1728
+ it "it should correctly retrieve the method with #method" do
1729
+ expect(node.method(:empty?)).to be_kind_of(Method)
1730
+ end
1731
+ end
1732
+
1733
+ describe "path tracking via __path__" do
1734
+ it "works through hash keys" do
1735
+ node.default["foo"] = { "bar" => { "baz" => "qux" } }
1736
+ expect(node["foo"]["bar"].__path__).to eql(%w{foo bar})
1737
+ end
1738
+
1739
+ it "works through the default level" do
1740
+ node.default["foo"] = { "bar" => { "baz" => "qux" } }
1741
+ expect(node.default["foo"]["bar"].__path__).to eql(%w{foo bar})
1742
+ end
1743
+
1744
+ it "works through arrays" do
1745
+ node.default["foo"] = [ { "bar" => { "baz" => "qux" } } ]
1746
+ expect(node["foo"][0].__path__).to eql(["foo", 0])
1747
+ expect(node["foo"][0]["bar"].__path__).to eql(["foo", 0, "bar"])
1748
+ end
1749
+
1750
+ it "works through arrays at the default level" do
1751
+ node.default["foo"] = [ { "bar" => { "baz" => "qux" } } ]
1752
+ expect(node.default["foo"][0].__path__).to eql(["foo", 0])
1753
+ expect(node.default["foo"][0]["bar"].__path__).to eql(["foo", 0, "bar"])
1754
+ end
1755
+
1756
+ # if we set __path__ in the initializer we'd get this wrong, this is why we
1757
+ # update the path on every #[] or #[]= operator
1758
+ it "works on access when the node has been rearranged" do
1759
+ node.default["foo"] = { "bar" => { "baz" => "qux" } }
1760
+ a = node.default["foo"]
1761
+ node.default["fizz"] = a
1762
+ expect(node["fizz"]["bar"].__path__).to eql(%w{fizz bar})
1763
+ expect(node["foo"]["bar"].__path__).to eql(%w{foo bar})
1764
+ end
1765
+
1766
+ # We have a problem because the __path__ is stored on in each node, but the
1767
+ # node can be wired up at multiple locations in the tree via pointers. One
1768
+ # solution would be to deep-dup the value in `#[]=(key, value)` and fix the
1769
+ # __path__ on all the dup'd nodes. The problem is that this would create an
1770
+ # unusual situation where after assignment, you couldn't mutate the thing you
1771
+ # hand a handle on. I'm not entirely positive this behavior is the correct
1772
+ # thing to support, but it is more hash-like (although if we start with a hash
1773
+ # then convert_value does its thing and we *do* get dup'd on assignment). This
1774
+ # behavior likely makes any implementation of a deep merge cache built over the
1775
+ # top of __path__ tracking have edge conditions where it will fail.
1776
+ #
1777
+ # Removing this support would be a breaking change. The test is included here
1778
+ # because it seems most likely that someone would break this behavior while trying
1779
+ # to fix __path__ behavior.
1780
+ it "does not dup in the background when a node is assigned" do
1781
+ # get a handle on a vividmash (can't be a hash or else we convert_value it)
1782
+ node.default["foo"] = { "bar" => { "baz" => "qux" } }
1783
+ a = node.default["foo"]
1784
+ # assign that somewhere else in the tree
1785
+ node.default["fizz"] = a
1786
+ # now upate the source
1787
+ a["duptest"] = true
1788
+ # the tree should have been updated
1789
+ expect(node.default["fizz"]["duptest"]).to be true
1790
+ expect(node["fizz"]["duptest"]).to be true
1791
+ end
1792
+ end
1793
+
1794
+ describe "root tracking via __root__" do
1795
+ it "works through hash keys" do
1796
+ node.default["foo"] = { "bar" => { "baz" => "qux" } }
1797
+ expect(node["foo"]["bar"].__root__).to eql(node.attributes)
1798
+ end
1799
+
1800
+ it "works through the default level" do
1801
+ node.default["foo"] = { "bar" => { "baz" => "qux" } }
1802
+ expect(node.default["foo"]["bar"].__root__).to eql(node.attributes)
1803
+ end
1804
+
1805
+ it "works through arrays" do
1806
+ node.default["foo"] = [ { "bar" => { "baz" => "qux" } } ]
1807
+ expect(node["foo"][0].__root__).to eql(node.attributes)
1808
+ expect(node["foo"][0]["bar"].__root__).to eql(node.attributes)
1809
+ end
1810
+
1811
+ it "works through arrays at the default level" do
1812
+ node.default["foo"] = [ { "bar" => { "baz" => "qux" } } ]
1813
+ expect(node.default["foo"][0].__root__).to eql(node.attributes)
1814
+ expect(node.default["foo"][0]["bar"].__root__).to eql(node.attributes)
1815
+ end
1816
+ end
1817
+
1818
+ describe "ways of abusing Chef 12 node state" do
1819
+ # these tests abuse the top_level_breadcrumb state in Chef 12
1820
+ it "derived attributes work correctly" do
1821
+ node.default["v1"] = 1
1822
+ expect(node["a"]).to eql(nil)
1823
+ node.default["a"] = node["v1"]
1824
+ expect(node["a"]).to eql(1)
1825
+ end
1826
+
1827
+ it "works when saving nodes to variables" do
1828
+ a = node.default["a"]
1829
+ expect(node["a"]).to eql({})
1830
+ node.default["b"] = 0
1831
+ a["key"] = 1
1832
+
1833
+ expect(node["a"]["key"]).to eql(1)
1834
+ end
1835
+ end
1836
+ end