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