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