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