chef 16.3.45-universal-mingw32 → 16.5.77-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 (424) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/Rakefile +2 -2
  4. data/bin/knife +1 -1
  5. data/chef-universal-mingw32.gemspec +0 -1
  6. data/chef.gemspec +2 -1
  7. data/distro/templates/powershell/chef/chef.psm1.erb +18 -18
  8. data/ext/win32-eventlog/Rakefile +2 -2
  9. data/ext/win32-eventlog/chef-log.man.erb +4 -4
  10. data/lib/chef/action_collection.rb +4 -0
  11. data/lib/chef/api_client/registration.rb +2 -2
  12. data/lib/chef/application.rb +20 -18
  13. data/lib/chef/application/apply.rb +17 -12
  14. data/lib/chef/application/base.rb +26 -23
  15. data/lib/chef/application/client.rb +10 -4
  16. data/lib/chef/application/exit_code.rb +13 -4
  17. data/lib/chef/application/knife.rb +22 -11
  18. data/lib/chef/application/solo.rb +2 -1
  19. data/lib/chef/application/windows_service.rb +39 -39
  20. data/lib/chef/application/windows_service_manager.rb +6 -6
  21. data/lib/chef/chef_class.rb +0 -1
  22. data/lib/chef/chef_fs/chef_fs_data_store.rb +55 -55
  23. data/lib/chef/chef_fs/file_system/chef_server/acl_entry.rb +10 -10
  24. data/lib/chef/chef_fs/file_system/chef_server/organization_invites_entry.rb +8 -8
  25. data/lib/chef/chef_fs/file_system/chef_server/organization_members_entry.rb +8 -8
  26. data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_dir.rb +2 -2
  27. data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_entry.rb +2 -2
  28. data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_root_dir.rb +18 -18
  29. data/lib/chef/chef_fs/file_system/repository/directory.rb +1 -1
  30. data/lib/chef/chef_fs/file_system/repository/file_system_entry.rb +1 -1
  31. data/lib/chef/chef_fs/knife.rb +2 -2
  32. data/lib/chef/chef_fs/parallelizer.rb +0 -1
  33. data/lib/chef/client.rb +21 -22
  34. data/lib/chef/cookbook/cookbook_version_loader.rb +1 -1
  35. data/lib/chef/cookbook/gem_installer.rb +1 -1
  36. data/lib/chef/cookbook/synchronizer.rb +2 -2
  37. data/lib/chef/cookbook_site_streaming_uploader.rb +13 -11
  38. data/lib/chef/cookbook_uploader.rb +1 -1
  39. data/lib/chef/data_collector.rb +6 -5
  40. data/lib/chef/data_collector/config_validation.rb +22 -13
  41. data/lib/chef/data_collector/run_end_message.rb +13 -3
  42. data/lib/chef/data_collector/run_start_message.rb +1 -1
  43. data/lib/chef/deprecated.rb +1 -1
  44. data/lib/chef/deprecation/warnings.rb +2 -2
  45. data/lib/chef/digester.rb +2 -2
  46. data/lib/chef/dsl/chef_vault.rb +1 -1
  47. data/lib/chef/dsl/data_query.rb +2 -2
  48. data/lib/chef/dsl/platform_introspection.rb +9 -9
  49. data/lib/chef/encrypted_data_bag_item.rb +3 -4
  50. data/lib/chef/encrypted_data_bag_item/decryptor.rb +3 -3
  51. data/lib/chef/encrypted_data_bag_item/encryptor.rb +3 -3
  52. data/lib/chef/environment.rb +4 -4
  53. data/lib/chef/event_loggers/windows_eventlog.rb +2 -2
  54. data/lib/chef/exceptions.rb +5 -5
  55. data/lib/chef/file_access_control/windows.rb +5 -1
  56. data/lib/chef/file_content_management/tempfile.rb +10 -10
  57. data/lib/chef/formatters/doc.rb +7 -6
  58. data/lib/chef/formatters/error_inspectors/api_error_formatting.rb +6 -5
  59. data/lib/chef/formatters/error_inspectors/node_load_error_inspector.rb +3 -3
  60. data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +9 -9
  61. data/lib/chef/formatters/error_inspectors/resource_failure_inspector.rb +2 -2
  62. data/lib/chef/formatters/error_inspectors/run_list_expansion_error_inspector.rb +3 -3
  63. data/lib/chef/formatters/indentable_output_stream.rb +2 -2
  64. data/lib/chef/formatters/minimal.rb +5 -4
  65. data/lib/chef/http.rb +6 -3
  66. data/lib/chef/http/auth_credentials.rb +5 -1
  67. data/lib/chef/http/authenticator.rb +1 -1
  68. data/lib/chef/http/basic_client.rb +4 -2
  69. data/lib/chef/http/decompressor.rb +1 -1
  70. data/lib/chef/http/http_request.rb +7 -5
  71. data/lib/chef/http/socketless_chef_zero_client.rb +5 -2
  72. data/lib/chef/http/ssl_policies.rb +1 -1
  73. data/lib/chef/json_compat.rb +2 -2
  74. data/lib/chef/knife.rb +4 -4
  75. data/lib/chef/knife/bootstrap.rb +18 -16
  76. data/lib/chef/knife/bootstrap/chef_vault_handler.rb +1 -1
  77. data/lib/chef/knife/bootstrap/templates/chef-full.erb +3 -3
  78. data/lib/chef/knife/bootstrap/templates/windows-chef-client-msi.erb +7 -7
  79. data/lib/chef/knife/client_create.rb +3 -3
  80. data/lib/chef/knife/config_get.rb +8 -97
  81. data/lib/chef/knife/config_get_profile.rb +9 -9
  82. data/lib/chef/knife/config_list.rb +139 -0
  83. data/lib/chef/knife/config_list_profiles.rb +8 -98
  84. data/lib/chef/knife/config_show.rb +127 -0
  85. data/lib/chef/knife/config_use.rb +61 -0
  86. data/lib/chef/knife/config_use_profile.rb +9 -24
  87. data/lib/chef/knife/configure.rb +4 -2
  88. data/lib/chef/knife/cookbook_download.rb +1 -1
  89. data/lib/chef/knife/cookbook_metadata.rb +1 -1
  90. data/lib/chef/knife/cookbook_upload.rb +23 -23
  91. data/lib/chef/knife/core/bootstrap_context.rb +2 -2
  92. data/lib/chef/knife/core/generic_presenter.rb +1 -1
  93. data/lib/chef/knife/core/hashed_command_loader.rb +2 -2
  94. data/lib/chef/knife/core/object_loader.rb +1 -1
  95. data/lib/chef/knife/core/ui.rb +1 -1
  96. data/lib/chef/knife/core/windows_bootstrap_context.rb +42 -34
  97. data/lib/chef/knife/delete.rb +15 -15
  98. data/lib/chef/knife/exec.rb +4 -4
  99. data/lib/chef/knife/node_policy_set.rb +2 -2
  100. data/lib/chef/knife/node_run_list_add.rb +1 -1
  101. data/lib/chef/knife/node_run_list_remove.rb +1 -1
  102. data/lib/chef/knife/node_run_list_set.rb +1 -1
  103. data/lib/chef/knife/node_show.rb +2 -2
  104. data/lib/chef/knife/role_env_run_list_add.rb +1 -1
  105. data/lib/chef/knife/role_env_run_list_set.rb +1 -1
  106. data/lib/chef/knife/role_run_list_add.rb +1 -1
  107. data/lib/chef/knife/role_run_list_set.rb +1 -1
  108. data/lib/chef/knife/search.rb +0 -1
  109. data/lib/chef/knife/serve.rb +3 -3
  110. data/lib/chef/knife/ssh.rb +24 -9
  111. data/lib/chef/knife/ssl_check.rb +3 -3
  112. data/lib/chef/knife/status.rb +2 -2
  113. data/lib/chef/knife/tag_create.rb +1 -1
  114. data/lib/chef/knife/tag_delete.rb +1 -1
  115. data/lib/chef/knife/user_create.rb +2 -2
  116. data/lib/chef/knife/xargs.rb +19 -19
  117. data/lib/chef/knife/yaml_convert.rb +1 -1
  118. data/lib/chef/local_mode.rb +2 -2
  119. data/lib/chef/log/syslog.rb +2 -2
  120. data/lib/chef/log/winevt.rb +2 -2
  121. data/lib/chef/mixin/checksum.rb +0 -1
  122. data/lib/chef/mixin/deep_merge.rb +35 -18
  123. data/lib/chef/mixin/openssl_helper.rb +4 -5
  124. data/lib/chef/mixin/shell_out.rb +1 -1
  125. data/lib/chef/mixin/template.rb +3 -3
  126. data/lib/chef/mixin/uris.rb +4 -2
  127. data/lib/chef/mixin/versioned_api.rb +1 -2
  128. data/lib/chef/mixin/which.rb +1 -1
  129. data/lib/chef/monkey_patches/net_http.rb +4 -4
  130. data/lib/chef/monkey_patches/webrick-utils.rb +10 -10
  131. data/lib/chef/node/attribute.rb +2 -4
  132. data/lib/chef/node_map.rb +4 -4
  133. data/lib/chef/platform/service_helpers.rb +1 -1
  134. data/lib/chef/policy_builder/dynamic.rb +2 -0
  135. data/lib/chef/policy_builder/policyfile.rb +2 -2
  136. data/lib/chef/property.rb +1 -1
  137. data/lib/chef/provider.rb +1 -5
  138. data/lib/chef/provider/cron/unix.rb +0 -2
  139. data/lib/chef/provider/file.rb +2 -2
  140. data/lib/chef/provider/git.rb +5 -5
  141. data/lib/chef/provider/group.rb +0 -2
  142. data/lib/chef/provider/group/suse.rb +5 -5
  143. data/lib/chef/provider/ifconfig.rb +1 -4
  144. data/lib/chef/provider/launchd.rb +2 -2
  145. data/lib/chef/provider/link.rb +0 -9
  146. data/lib/chef/provider/mount.rb +0 -2
  147. data/lib/chef/provider/mount/linux.rb +63 -0
  148. data/lib/chef/provider/package.rb +0 -2
  149. data/lib/chef/provider/package/dpkg.rb +3 -12
  150. data/lib/chef/provider/package/homebrew.rb +1 -1
  151. data/lib/chef/provider/package/rubygems.rb +22 -19
  152. data/lib/chef/provider/package/snap.rb +1 -2
  153. data/lib/chef/provider/package/windows.rb +2 -2
  154. data/lib/chef/provider/package/windows/registry_uninstall_entry.rb +12 -10
  155. data/lib/chef/provider/package/zypper.rb +1 -1
  156. data/lib/chef/provider/powershell_script.rb +21 -5
  157. data/lib/chef/provider/remote_file/content.rb +3 -0
  158. data/lib/chef/provider/remote_file/ftp.rb +6 -4
  159. data/lib/chef/provider/remote_file/sftp.rb +6 -4
  160. data/lib/chef/provider/route.rb +2 -6
  161. data/lib/chef/provider/service/arch.rb +1 -1
  162. data/lib/chef/provider/service/debian.rb +1 -1
  163. data/lib/chef/provider/service/gentoo.rb +2 -2
  164. data/lib/chef/provider/service/macosx.rb +4 -4
  165. data/lib/chef/provider/service/openbsd.rb +1 -4
  166. data/lib/chef/provider/service/redhat.rb +3 -3
  167. data/lib/chef/provider/service/upstart.rb +1 -1
  168. data/lib/chef/provider/service/windows.rb +10 -10
  169. data/lib/chef/provider/systemd_unit.rb +0 -2
  170. data/lib/chef/provider/template/content.rb +1 -0
  171. data/lib/chef/provider/template_finder.rb +2 -10
  172. data/lib/chef/provider/user/dscl.rb +7 -7
  173. data/lib/chef/provider/user/mac.rb +12 -12
  174. data/lib/chef/provider/windows_task.rb +1 -5
  175. data/lib/chef/provider/zypper_repository.rb +2 -3
  176. data/lib/chef/provider_resolver.rb +1 -1
  177. data/lib/chef/providers.rb +1 -1
  178. data/lib/chef/recipe.rb +2 -2
  179. data/lib/chef/resource.rb +8 -12
  180. data/lib/chef/resource/apt_repository.rb +5 -12
  181. data/lib/chef/resource/bff_package.rb +22 -0
  182. data/lib/chef/resource/breakpoint.rb +57 -2
  183. data/lib/chef/resource/build_essential.rb +1 -1
  184. data/lib/chef/resource/cab_package.rb +29 -0
  185. data/lib/chef/resource/chef_client_cron.rb +32 -25
  186. data/lib/chef/resource/chef_client_launchd.rb +194 -0
  187. data/lib/chef/resource/chef_client_scheduled_task.rb +21 -18
  188. data/lib/chef/resource/chef_client_systemd_timer.rb +26 -19
  189. data/lib/chef/resource/chef_client_trusted_certificate.rb +101 -0
  190. data/lib/chef/resource/chef_gem.rb +10 -10
  191. data/lib/chef/resource/chef_handler.rb +149 -4
  192. data/lib/chef/resource/chef_sleep.rb +2 -2
  193. data/lib/chef/resource/chef_vault_secret.rb +14 -14
  194. data/lib/chef/resource/cookbook_file.rb +2 -2
  195. data/lib/chef/resource/cron/_cron_shared.rb +1 -0
  196. data/lib/chef/resource/cron/cron_d.rb +0 -1
  197. data/lib/chef/resource/dnf_package.rb +2 -2
  198. data/lib/chef/resource/dsc_resource.rb +0 -1
  199. data/lib/chef/resource/dsc_script.rb +2 -2
  200. data/lib/chef/resource/execute.rb +8 -9
  201. data/lib/chef/resource/file.rb +4 -4
  202. data/lib/chef/resource/gem_package.rb +5 -5
  203. data/lib/chef/resource/homebrew_package.rb +3 -3
  204. data/lib/chef/resource/homebrew_update.rb +7 -7
  205. data/lib/chef/resource/hostname.rb +2 -2
  206. data/lib/chef/resource/launchd.rb +2 -1
  207. data/lib/chef/resource/locale.rb +2 -2
  208. data/lib/chef/resource/macos_userdefaults.rb +3 -3
  209. data/lib/chef/resource/notify_group.rb +0 -1
  210. data/lib/chef/resource/ohai.rb +46 -3
  211. data/lib/chef/resource/ohai_hint.rb +33 -0
  212. data/lib/chef/resource/openssl_dhparam.rb +29 -5
  213. data/lib/chef/resource/openssl_ec_private_key.rb +8 -3
  214. data/lib/chef/resource/openssl_ec_public_key.rb +4 -2
  215. data/lib/chef/resource/openssl_rsa_private_key.rb +8 -3
  216. data/lib/chef/resource/openssl_rsa_public_key.rb +2 -0
  217. data/lib/chef/resource/openssl_x509_certificate.rb +38 -35
  218. data/lib/chef/resource/openssl_x509_crl.rb +21 -10
  219. data/lib/chef/resource/openssl_x509_request.rb +37 -36
  220. data/lib/chef/resource/osx_profile.rb +292 -6
  221. data/lib/chef/resource/plist.rb +1 -1
  222. data/lib/chef/resource/powershell_package_source.rb +6 -6
  223. data/lib/chef/resource/powershell_script.rb +24 -30
  224. data/lib/chef/resource/reboot.rb +2 -2
  225. data/lib/chef/resource/remote_file.rb +3 -3
  226. data/lib/chef/resource/rhsm_register.rb +22 -10
  227. data/lib/chef/resource/ruby_block.rb +2 -2
  228. data/lib/chef/resource/scm/subversion.rb +2 -2
  229. data/lib/chef/resource/service.rb +3 -3
  230. data/lib/chef/resource/ssh_known_hosts_entry.rb +2 -2
  231. data/lib/chef/resource/sudo.rb +1 -1
  232. data/lib/chef/resource/support/cron.d.erb +1 -1
  233. data/lib/chef/resource/support/cron_access.erb +1 -1
  234. data/lib/chef/resource/support/sudoer.erb +1 -1
  235. data/lib/chef/resource/support/ulimit.erb +1 -1
  236. data/lib/chef/resource/sysctl.rb +6 -10
  237. data/lib/chef/resource/systemd_unit.rb +2 -2
  238. data/lib/chef/resource/template.rb +2 -2
  239. data/lib/chef/resource/timezone.rb +112 -73
  240. data/lib/chef/resource/windows_ad_join.rb +12 -3
  241. data/lib/chef/resource/windows_audit_policy.rb +3 -0
  242. data/lib/chef/resource/windows_auto_run.rb +2 -0
  243. data/lib/chef/resource/windows_certificate.rb +8 -4
  244. data/lib/chef/resource/windows_dfs_folder.rb +2 -0
  245. data/lib/chef/resource/windows_dfs_namespace.rb +2 -0
  246. data/lib/chef/resource/windows_dfs_server.rb +2 -0
  247. data/lib/chef/resource/windows_dns_record.rb +10 -7
  248. data/lib/chef/resource/windows_dns_zone.rb +12 -7
  249. data/lib/chef/resource/windows_feature.rb +2 -0
  250. data/lib/chef/resource/windows_feature_dism.rb +10 -0
  251. data/lib/chef/resource/windows_feature_powershell.rb +14 -2
  252. data/lib/chef/resource/windows_firewall_profile.rb +24 -20
  253. data/lib/chef/resource/windows_firewall_rule.rb +5 -3
  254. data/lib/chef/resource/windows_font.rb +3 -1
  255. data/lib/chef/resource/windows_package.rb +28 -5
  256. data/lib/chef/resource/windows_pagefile.rb +4 -0
  257. data/lib/chef/resource/windows_printer.rb +22 -21
  258. data/lib/chef/resource/windows_printer_port.rb +20 -17
  259. data/lib/chef/resource/windows_security_policy.rb +2 -0
  260. data/lib/chef/resource/windows_share.rb +5 -3
  261. data/lib/chef/resource/windows_shortcut.rb +2 -0
  262. data/lib/chef/resource/windows_uac.rb +2 -0
  263. data/lib/chef/resource/windows_user_privilege.rb +54 -53
  264. data/lib/chef/resource/windows_workgroup.rb +5 -6
  265. data/lib/chef/resource/yum_package.rb +2 -2
  266. data/lib/chef/resource_collection/stepable_iterator.rb +1 -2
  267. data/lib/chef/resource_reporter.rb +0 -2
  268. data/lib/chef/resources.rb +3 -1
  269. data/lib/chef/role.rb +2 -2
  270. data/lib/chef/run_context.rb +2 -2
  271. data/lib/chef/run_context/cookbook_compiler.rb +21 -21
  272. data/lib/chef/run_lock.rb +2 -2
  273. data/lib/chef/run_status.rb +2 -6
  274. data/lib/chef/search/query.rb +6 -5
  275. data/lib/chef/shell.rb +32 -27
  276. data/lib/chef/shell/ext.rb +11 -11
  277. data/lib/chef/shell/shell_session.rb +2 -2
  278. data/lib/chef/train_transport.rb +5 -104
  279. data/lib/chef/util/backup.rb +2 -2
  280. data/lib/chef/util/diff.rb +14 -14
  281. data/lib/chef/util/powershell/cmdlet.rb +4 -2
  282. data/lib/chef/util/powershell/ps_credential.rb +18 -14
  283. data/lib/chef/util/threaded_job_queue.rb +0 -2
  284. data/lib/chef/version.rb +1 -1
  285. data/lib/chef/win32/crypto.rb +1 -1
  286. data/lib/chef/win32/file.rb +3 -3
  287. data/lib/chef/win32/file/version_info.rb +5 -5
  288. data/lib/chef/win32/registry.rb +1 -2
  289. data/lib/chef/win32/unicode.rb +1 -1
  290. data/spec/data/shef-config.rb +1 -1
  291. data/spec/data/ssl/chef-rspec.cert +15 -15
  292. data/spec/functional/event_loggers/windows_eventlog_spec.rb +6 -5
  293. data/spec/functional/resource/aix_service_spec.rb +2 -2
  294. data/spec/functional/resource/aixinit_service_spec.rb +8 -8
  295. data/spec/functional/resource/bff_spec.rb +2 -2
  296. data/spec/functional/resource/cookbook_file_spec.rb +1 -1
  297. data/spec/functional/resource/dsc_resource_spec.rb +1 -1
  298. data/spec/functional/resource/dsc_script_spec.rb +0 -1
  299. data/spec/functional/resource/group_spec.rb +6 -6
  300. data/spec/functional/resource/insserv_spec.rb +5 -5
  301. data/spec/functional/resource/link_spec.rb +20 -20
  302. data/spec/functional/resource/powershell_script_spec.rb +4 -4
  303. data/spec/functional/resource/rpm_spec.rb +2 -2
  304. data/spec/functional/resource/user/dscl_spec.rb +1 -1
  305. data/spec/functional/resource/user/mac_user_spec.rb +1 -1
  306. data/spec/functional/resource/windows_certificate_spec.rb +3 -3
  307. data/spec/functional/resource/windows_font_spec.rb +49 -0
  308. data/spec/functional/resource/windows_security_policy_spec.rb +0 -3
  309. data/spec/functional/resource/windows_task_spec.rb +13 -13
  310. data/spec/functional/run_lock_spec.rb +24 -24
  311. data/spec/functional/version_spec.rb +3 -3
  312. data/spec/functional/win32/registry_spec.rb +8 -8
  313. data/spec/functional/win32/service_manager_spec.rb +1 -1
  314. data/spec/integration/client/client_spec.rb +4 -4
  315. data/spec/integration/client/exit_code_spec.rb +3 -2
  316. data/spec/integration/client/ipv6_spec.rb +1 -1
  317. data/spec/integration/knife/common_options_spec.rb +12 -12
  318. data/spec/integration/knife/config_list_spec.rb +220 -0
  319. data/spec/integration/knife/config_show_spec.rb +192 -0
  320. data/spec/integration/knife/config_use_spec.rb +198 -0
  321. data/spec/integration/knife/cookbook_api_ipv6_spec.rb +1 -1
  322. data/spec/integration/knife/diff_spec.rb +3 -1
  323. data/spec/integration/knife/download_spec.rb +3 -1
  324. data/spec/integration/knife/serve_spec.rb +5 -5
  325. data/spec/integration/knife/upload_spec.rb +3 -1
  326. data/spec/integration/ohai/ohai_spec.rb +61 -0
  327. data/spec/integration/recipes/lwrp_inline_resources_spec.rb +1 -1
  328. data/spec/integration/recipes/remote_directory.rb +1 -1
  329. data/spec/integration/solo/solo_spec.rb +5 -5
  330. data/spec/spec_helper.rb +12 -11
  331. data/spec/stress/win32/file_spec.rb +1 -1
  332. data/spec/support/chef_helpers.rb +2 -2
  333. data/spec/support/matchers/leak.rb +2 -2
  334. data/spec/support/platform_helpers.rb +17 -35
  335. data/spec/support/platforms/win32/spec_service.rb +1 -1
  336. data/spec/support/shared/functional/directory_resource.rb +1 -1
  337. data/spec/support/shared/functional/execute_resource.rb +1 -1
  338. data/spec/support/shared/functional/file_resource.rb +20 -20
  339. data/spec/support/shared/functional/securable_resource.rb +108 -27
  340. data/spec/support/shared/functional/win32_service.rb +2 -2
  341. data/spec/support/shared/functional/windows_script.rb +3 -3
  342. data/spec/support/shared/integration/integration_helper.rb +22 -52
  343. data/spec/support/shared/unit/application_dot_d.rb +5 -3
  344. data/spec/support/shared/unit/script_resource.rb +6 -20
  345. data/spec/support/shared/unit/windows_script_resource.rb +15 -28
  346. data/spec/tiny_server.rb +0 -1
  347. data/spec/unit/application/client_spec.rb +2 -2
  348. data/spec/unit/application/exit_code_spec.rb +10 -0
  349. data/spec/unit/application_spec.rb +4 -6
  350. data/spec/unit/chef_fs/config_spec.rb +1 -1
  351. data/spec/unit/chef_fs/data_handler/data_bag_item_data_handler.rb +1 -1
  352. data/spec/unit/chef_fs/parallelizer_spec.rb +5 -1
  353. data/spec/unit/chef_fs/path_util_spec.rb +1 -1
  354. data/spec/unit/cookbook/synchronizer_spec.rb +2 -2
  355. data/spec/unit/cookbook_spec.rb +2 -2
  356. data/spec/unit/data_collector/config_validation_spec.rb +208 -0
  357. data/spec/unit/data_collector_spec.rb +28 -117
  358. data/spec/unit/dsl/declare_resource_spec.rb +1 -1
  359. data/spec/unit/environment_spec.rb +7 -7
  360. data/spec/unit/file_access_control_spec.rb +1 -1
  361. data/spec/unit/knife/bootstrap_spec.rb +20 -20
  362. data/spec/unit/knife/cookbook_download_spec.rb +4 -4
  363. data/spec/unit/knife/cookbook_metadata_from_file_spec.rb +1 -1
  364. data/spec/unit/knife/core/hashed_command_loader_spec.rb +3 -3
  365. data/spec/unit/knife/core/ui_spec.rb +1 -0
  366. data/spec/unit/knife/core/windows_bootstrap_context_spec.rb +21 -12
  367. data/spec/unit/knife/ssh_spec.rb +2 -2
  368. data/spec/unit/knife/supermarket_share_spec.rb +1 -1
  369. data/spec/unit/lwrp_spec.rb +3 -3
  370. data/spec/unit/mixin/deep_merge_spec.rb +15 -0
  371. data/spec/unit/mixin/openssl_helper_spec.rb +1 -1
  372. data/spec/unit/mixin/powershell_exec_spec.rb +1 -1
  373. data/spec/unit/mixin/securable_spec.rb +2 -2
  374. data/spec/unit/mixin/template_spec.rb +30 -30
  375. data/spec/unit/mixin/windows_architecture_helper_spec.rb +4 -4
  376. data/spec/unit/node/immutable_collections_spec.rb +8 -4
  377. data/spec/unit/node_spec.rb +5 -5
  378. data/spec/unit/provider/mount/linux_spec.rb +97 -0
  379. data/spec/unit/provider/package/chocolatey_spec.rb +1 -1
  380. data/spec/unit/provider/package/powershell_spec.rb +1 -1
  381. data/spec/unit/provider/package/rubygems_spec.rb +4 -1
  382. data/spec/unit/provider/powershell_script_spec.rb +11 -4
  383. data/spec/unit/provider/remote_directory_spec.rb +9 -9
  384. data/spec/unit/provider/route_spec.rb +0 -2
  385. data/spec/unit/provider/service/arch_service_spec.rb +3 -2
  386. data/spec/unit/provider/service/debian_service_spec.rb +1 -1
  387. data/spec/unit/provider/service/gentoo_service_spec.rb +7 -7
  388. data/spec/unit/provider/service/macosx_spec.rb +3 -3
  389. data/spec/unit/provider/service/redhat_spec.rb +2 -2
  390. data/spec/unit/provider/service/upstart_service_spec.rb +3 -3
  391. data/spec/unit/provider_resolver_spec.rb +6 -6
  392. data/spec/unit/recipe_spec.rb +1 -1
  393. data/spec/unit/resource/batch_spec.rb +6 -6
  394. data/spec/unit/resource/chef_client_cron_spec.rb +35 -14
  395. data/spec/unit/resource/chef_client_launchd_spec.rb +127 -0
  396. data/spec/unit/resource/chef_client_systemd_timer_spec.rb +36 -1
  397. data/spec/unit/resource/chef_client_trusted_certificate_spec.rb +54 -0
  398. data/spec/unit/resource/execute_spec.rb +113 -118
  399. data/spec/unit/resource/launchd_spec.rb +8 -0
  400. data/spec/unit/resource/osx_profile_spec.rb +299 -0
  401. data/spec/unit/resource/powershell_script_spec.rb +11 -29
  402. data/spec/unit/resource/rhsm_register_spec.rb +56 -18
  403. data/spec/unit/resource/script_spec.rb +6 -1
  404. data/spec/unit/resource/timezone_spec.rb +63 -0
  405. data/spec/unit/resource/windows_feature_powershell_spec.rb +30 -4
  406. data/spec/unit/resource/windows_uac_spec.rb +1 -1
  407. data/spec/unit/resource/windows_user_privilege_spec.rb +55 -0
  408. data/spec/unit/role_spec.rb +11 -11
  409. data/spec/unit/run_lock_spec.rb +5 -1
  410. data/spec/unit/runner_spec.rb +1 -2
  411. data/spec/unit/shell/shell_ext_spec.rb +46 -3
  412. data/spec/unit/shell/shell_session_spec.rb +35 -64
  413. data/spec/unit/shell_spec.rb +16 -19
  414. data/spec/unit/train_transport_spec.rb +14 -13
  415. data/spec/unit/util/selinux_spec.rb +2 -0
  416. data/tasks/rspec.rb +1 -3
  417. metadata +42 -33
  418. data/lib/chef/dist.rb +0 -68
  419. data/lib/chef/provider/osx_profile.rb +0 -255
  420. data/spec/integration/knife/config_get_profile_spec.rb +0 -113
  421. data/spec/integration/knife/config_get_spec.rb +0 -191
  422. data/spec/integration/knife/config_list_profiles_spec.rb +0 -218
  423. data/spec/integration/knife/config_use_profile_spec.rb +0 -154
  424. data/spec/unit/provider/osx_profile_spec.rb +0 -255
@@ -44,15 +44,30 @@ module IntegrationSupport
44
44
 
45
45
  def when_the_repository(desc, *tags, &block)
46
46
  context("when the chef repo #{desc}", *tags) do
47
- include_context "with a chef repo"
47
+ before :each do
48
+ raise "Can only create one directory per test" if @repository_dir
48
49
 
49
- module_eval(&block)
50
- end
51
- end
50
+ @repository_dir = Dir.mktmpdir("chef_repo")
51
+ Chef::Config.chef_repo_path = @repository_dir
52
+ %w{client cookbook data_bag environment node role user}.each do |object_name|
53
+ Chef::Config.delete("#{object_name}_path".to_sym)
54
+ end
55
+ end
56
+
57
+ after :each do
58
+ if @repository_dir
59
+ begin
60
+ # TODO: "force" actually means "silence all exceptions". this
61
+ # silences a weird permissions error on Windows that we should track
62
+ # down, but for now there's no reason for it to blow up our CI.
63
+ FileUtils.remove_entry_secure(@repository_dir, force = ChefUtils.windows?)
64
+ ensure
65
+ @repository_dir = nil
66
+ end
67
+ end
68
+ Dir.chdir(@old_cwd) if @old_cwd
69
+ end
52
70
 
53
- def with_versioned_cookbooks(&block)
54
- context("with versioned cookbooks") do
55
- include_context "with versioned cookbooks"
56
71
  module_eval(&block)
57
72
  end
58
73
  end
@@ -105,49 +120,4 @@ module IntegrationSupport
105
120
  @old_cwd = Dir.pwd
106
121
  Dir.chdir(path_to(relative_path))
107
122
  end
108
-
109
- RSpec.shared_context "with a chef repo" do
110
- before :each do
111
- raise "Can only create one directory per test" if @repository_dir
112
-
113
- @repository_dir = Dir.mktmpdir("chef_repo")
114
- Chef::Config.chef_repo_path = @repository_dir
115
- %w{client cookbook data_bag environment node role user}.each do |object_name|
116
- Chef::Config.delete("#{object_name}_path".to_sym)
117
- end
118
- end
119
-
120
- after :each do
121
- if @repository_dir
122
- begin
123
- %w{client cookbook data_bag environment node role user}.each do |object_name|
124
- Chef::Config.delete("#{object_name}_path".to_sym)
125
- end
126
- Chef::Config.delete(:chef_repo_path)
127
- # TODO: "force" actually means "silence all exceptions". this
128
- # silences a weird permissions error on Windows that we should track
129
- # down, but for now there's no reason for it to blow up our CI.
130
- FileUtils.remove_entry_secure(@repository_dir, force = ChefUtils.windows?)
131
- ensure
132
- @repository_dir = nil
133
- end
134
- end
135
- Dir.chdir(@old_cwd) if @old_cwd
136
- end
137
-
138
- end
139
-
140
- # Versioned cookbooks
141
-
142
- RSpec.shared_context "with versioned cookbooks", versioned_cookbooks: true do
143
- before(:each) { Chef::Config[:versioned_cookbooks] = true }
144
- after(:each) { Chef::Config.delete(:versioned_cookbooks) }
145
- end
146
-
147
- RSpec.shared_context "without versioned cookbooks", versioned_cookbooks: false do
148
- # Just make sure this goes back to default
149
- before(:each) { Chef::Config[:versioned_cookbooks] = false }
150
- after(:each) { Chef::Config.delete(:versioned_cookbooks) }
151
- end
152
-
153
123
  end
@@ -33,14 +33,16 @@ shared_examples_for "an application that loads a dot d" do
33
33
  # make sure that we are correctly globbing.
34
34
  let(:client_d_dir) do
35
35
  Chef::Util::PathHelper.cleanpath(
36
- File.join(File.dirname(__FILE__), "../../../data/client.d_00")
36
+ File.join(__dir__, "../../../data/client.d_00")
37
37
  )
38
38
  end
39
39
 
40
40
  it "loads the configuration in order" do
41
+ etc_chef_client_rb = Chef::Config.platform_specific_path("#{ChefConfig::Config.etc_chef_dir}/client.rb")
41
42
  expect(IO).to receive(:read).with(Pathname.new("#{client_d_dir}/00-foo.rb").cleanpath.to_s).and_return("foo 0")
42
43
  expect(IO).to receive(:read).with(Pathname.new("#{client_d_dir}/01-bar.rb").cleanpath.to_s).and_return("bar 0")
43
44
  expect(IO).to receive(:read).with(Pathname.new("#{client_d_dir}/02-strings.rb").cleanpath.to_s).and_return("strings 0")
45
+ allow(app).to receive(:apply_config).with("", etc_chef_client_rb) # for chef-client managed nodes running this spec
44
46
  expect(app).to receive(:apply_config).with("foo 0", Pathname.new("#{client_d_dir}/00-foo.rb").cleanpath.to_s).and_call_original.ordered
45
47
  expect(app).to receive(:apply_config).with("bar 0", Pathname.new("#{client_d_dir}/01-bar.rb").cleanpath.to_s).and_call_original.ordered
46
48
  expect(app).to receive(:apply_config).with("strings 0", Pathname.new("#{client_d_dir}/02-strings.rb").cleanpath.to_s).and_call_original.ordered
@@ -51,7 +53,7 @@ shared_examples_for "an application that loads a dot d" do
51
53
  context "when client_d_dir is set to a directory without configuration" do
52
54
  let(:client_d_dir) do
53
55
  Chef::Util::PathHelper.cleanpath(
54
- File.join(File.dirname(__FILE__), "../../data/client.d_01")
56
+ File.join(__dir__, "../../data/client.d_01")
55
57
  )
56
58
  end
57
59
 
@@ -69,7 +71,7 @@ shared_examples_for "an application that loads a dot d" do
69
71
  # foo.rb as a directory should be ignored
70
72
  let(:client_d_dir) do
71
73
  Chef::Util::PathHelper.cleanpath(
72
- File.join(File.dirname(__FILE__), "../../data/client.d_02")
74
+ File.join(__dir__, "../../data/client.d_02")
73
75
  )
74
76
  end
75
77
 
@@ -47,21 +47,6 @@ shared_examples_for "a script resource" do
47
47
  end
48
48
 
49
49
  describe "when executing guards" do
50
- let(:resource) do
51
- resource = script_resource
52
- resource.run_context = run_context
53
- resource.code "echo hi"
54
- resource
55
- end
56
- let(:node) do
57
- node = Chef::Node.new
58
- node.automatic[:platform] = "debian"
59
- node.automatic[:platform_version] = "6.0"
60
- node
61
- end
62
- let(:events) { Chef::EventDispatch::Dispatcher.new }
63
- let(:run_context) { Chef::RunContext.new(node, {}, events) }
64
-
65
50
  it "inherits exactly the :cwd, :environment, :group, :path, :user, and :umask attributes from a parent resource class" do
66
51
  inherited_difference = Chef::Resource::Script.guard_inherited_attributes -
67
52
  %i{cwd environment group path user umask}
@@ -73,16 +58,17 @@ shared_examples_for "a script resource" do
73
58
  expect_any_instance_of(Chef::Resource::Conditional).not_to receive(:evaluate_block)
74
59
  expect_any_instance_of(Chef::GuardInterpreter::ResourceGuardInterpreter).not_to receive(:evaluate_action)
75
60
  expect_any_instance_of(Chef::GuardInterpreter::DefaultGuardInterpreter).to receive(:evaluate).and_return(true)
76
- resource.only_if "echo hi"
77
- expect(resource.should_skip?(:run)).to eq(nil)
61
+ script_resource.only_if "echo hi"
62
+ expect(script_resource.should_skip?(:run)).to eq(nil)
78
63
  end
79
64
 
80
65
  it "when a valid guard_interpreter resource is specified, a block should be used to evaluate the guard" do
66
+ expect_any_instance_of(Chef::Resource::Conditional).not_to receive(:evaluate_block)
81
67
  expect_any_instance_of(Chef::GuardInterpreter::DefaultGuardInterpreter).not_to receive(:evaluate)
82
68
  expect_any_instance_of(Chef::GuardInterpreter::ResourceGuardInterpreter).to receive(:evaluate_action).and_return(true)
83
- resource.guard_interpreter :script
84
- resource.only_if "echo hi"
85
- expect(resource.should_skip?(:run)).to eq(nil)
69
+ script_resource.guard_interpreter :script
70
+ script_resource.only_if "echo hi"
71
+ expect(script_resource.should_skip?(:run)).to eq(nil)
86
72
  end
87
73
  end
88
74
  end
@@ -20,59 +20,46 @@ require "support/shared/unit/execute_resource"
20
20
  require "support/shared/unit/script_resource"
21
21
 
22
22
  shared_examples_for "a Windows script resource" do
23
- before(:each) do
24
- node = Chef::Node.new
25
-
26
- node.default["kernel"] = {}
27
- node.default["kernel"][:machine] = :x86_64.to_s
28
-
29
- run_context = Chef::RunContext.new(node, nil, nil)
30
-
31
- @resource = resource_instance
32
-
33
- end
34
-
35
23
  it "should be a kind of Chef::Resource::WindowsScript" do
36
- expect(@resource).to be_a_kind_of(Chef::Resource)
37
- expect(@resource).to be_a_kind_of(Chef::Resource::WindowsScript)
24
+ expect(windows_script_resource).to be_a_kind_of(Chef::Resource)
25
+ expect(windows_script_resource).to be_a_kind_of(Chef::Resource::WindowsScript)
38
26
  end
39
27
 
40
28
  context "when evaluating guards" do
41
29
  it "should have a default_guard_interpreter attribute that is the same as the resource" do
42
- expect(@resource.default_guard_interpreter).to eq(@resource.resource_name)
30
+ expect(windows_script_resource.default_guard_interpreter).to eq(windows_script_resource.resource_name)
43
31
  end
44
32
 
45
33
  it "should default to using guard_interpreter attribute that is the same as the resource" do
46
- expect(@resource.guard_interpreter).to eq(@resource.resource_name)
34
+ expect(windows_script_resource.guard_interpreter).to eq(windows_script_resource.resource_name)
47
35
  end
48
36
 
49
37
  it "should use a resource to evaluate the guard when guard_interpreter is not specified" do
50
38
  expect_any_instance_of(Chef::GuardInterpreter::ResourceGuardInterpreter).to receive(:evaluate_action).and_return(true)
51
39
  expect_any_instance_of(Chef::GuardInterpreter::DefaultGuardInterpreter).not_to receive(:evaluate)
52
- @resource.only_if "echo hi"
53
- expect(@resource.should_skip?(:run)).to eq(nil)
40
+ windows_script_resource.only_if "echo hi"
41
+ expect(windows_script_resource.should_skip?(:run)).to eq(nil)
54
42
  end
55
43
 
56
44
  describe "when the guard is given a ruby block" do
57
45
  it "should evaluate the guard if the guard_interpreter is set to its default value" do
58
- @resource.only_if { true }
59
- expect(@resource.should_skip?(:run)).to eq(nil)
46
+ windows_script_resource.only_if { true }
47
+ expect(windows_script_resource.should_skip?(:run)).to eq(nil)
60
48
  end
61
49
 
62
50
  it "should raise an exception if the guard_interpreter is overridden from its default value" do
63
- @resource.guard_interpreter :bash
64
- @resource.only_if { true }
65
- expect { @resource.should_skip?(:run) }.to raise_error(ArgumentError)
51
+ windows_script_resource.guard_interpreter :bash
52
+ windows_script_resource.only_if { true }
53
+ expect { windows_script_resource.should_skip?(:run) }.to raise_error(ArgumentError)
66
54
  end
67
55
  end
68
56
  end
69
57
 
70
58
  context "script with a default guard interpreter" do
71
- let(:script_resource) do
72
- resource_instance.guard_interpreter :default
73
- resource_instance
74
- end
59
+ let(:script_resource) { windows_script_resource }
60
+
61
+ before { windows_script_resource.guard_interpreter :default }
62
+
75
63
  it_should_behave_like "a script resource"
76
64
  end
77
-
78
65
  end
@@ -19,7 +19,6 @@
19
19
  require "webrick"
20
20
  require "webrick/https"
21
21
  require "rack"
22
- require "thread"
23
22
  require "singleton"
24
23
  require "open-uri"
25
24
  require "chef/config"
@@ -192,7 +192,7 @@ describe Chef::Application::Client, "reconfigure" do
192
192
 
193
193
  context "with an empty value" do
194
194
  it "should terminate with message" do
195
- expect(Chef::Application).to receive(:fatal!).with('Unparsable config option ""').and_raise("so ded")
195
+ expect(Chef::Application).to receive(:fatal!).with('Unparsable config option ""', ChefConfig::ConfigurationError.new).and_raise("so ded")
196
196
  ARGV.replace(["--config-option", ""])
197
197
  expect { app.reconfigure }.to raise_error "so ded"
198
198
  end
@@ -200,7 +200,7 @@ describe Chef::Application::Client, "reconfigure" do
200
200
 
201
201
  context "with an invalid value" do
202
202
  it "should terminate with message" do
203
- expect(Chef::Application).to receive(:fatal!).with('Unparsable config option "asdf"').and_raise("so ded")
203
+ expect(Chef::Application).to receive(:fatal!).with('Unparsable config option "asdf"', ChefConfig::ConfigurationError.new).and_raise("so ded")
204
204
  ARGV.replace(["--config-option", "asdf"])
205
205
  expect { app.reconfigure }.to raise_error "so ded"
206
206
  end
@@ -61,6 +61,10 @@ describe Chef::Application::ExitCode do
61
61
  expect(valid_rfc_exit_codes.include?(41)).to eq(true)
62
62
  end
63
63
 
64
+ it "validates a CONFIG_FAILURE return code of 43" do
65
+ expect(valid_rfc_exit_codes.include?(43)).to eq(true)
66
+ end
67
+
64
68
  it "validates a CLIENT_UPGRADED return code of 213" do
65
69
  expect(valid_rfc_exit_codes.include?(213)).to eq(true)
66
70
  end
@@ -113,6 +117,12 @@ describe Chef::Application::ExitCode do
113
117
  expect(exit_codes.normalize_exit_code(runtime_error)).to eq(37)
114
118
  end
115
119
 
120
+ it "returns CONFIG_FAILURE when a configuration exception is specified" do
121
+ config_error = Chef::Exceptions::ConfigurationError.new("BOOM")
122
+ runtime_error = Chef::Exceptions::RunFailedWrappingError.new(config_error)
123
+ expect(exit_codes.normalize_exit_code(runtime_error)).to eq(43)
124
+ end
125
+
116
126
  it "returns CLIENT_UPGRADED when the client was upgraded during converge" do
117
127
  client_upgraded_error = Chef::Exceptions::ClientUpgraded.new("BOOM")
118
128
  runtime_error = Chef::Exceptions::RunFailedWrappingError.new(client_upgraded_error)
@@ -491,16 +491,14 @@ describe Chef::Application do
491
491
 
492
492
  describe "configuration errors" do
493
493
  before do
494
- expect(Process).to receive(:exit)
494
+ allow(Process).to receive(:exit).and_return(true)
495
495
  end
496
496
 
497
497
  def raises_informative_fatals_on_configure_chef
498
498
  config_file_regexp = Regexp.new @app.config[:config_file]
499
- expect(Chef::Log).to receive(:fatal)
500
- .with(/Configuration error/)
501
- expect(Chef::Log).to receive(:fatal)
502
- .with(config_file_regexp)
503
- .at_least(1).times
499
+ expect(Chef::Log).to receive(:fatal).with(/Configuration error/)
500
+ expect(Chef::Log).to receive(:fatal).with(config_file_regexp)
501
+ expect(Process).to receive(:exit).with(43).and_return(true)
504
502
  @app.configure_chef
505
503
  end
506
504
 
@@ -18,7 +18,7 @@
18
18
 
19
19
  require "spec_helper"
20
20
  require "chef/exceptions"
21
- require "lib/chef/chef_fs/config.rb"
21
+ require "lib/chef/chef_fs/config"
22
22
 
23
23
  describe Chef::ChefFS::Config do
24
24
  describe "initialize" do
@@ -17,7 +17,7 @@
17
17
  #
18
18
 
19
19
  require "spec_helper"
20
- require "lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb"
20
+ require "lib/chef/chef_fs/data_handler/data_bag_item_data_handler"
21
21
 
22
22
  class TestDataBag < Mash
23
23
  attr_accessor :name
@@ -1,7 +1,11 @@
1
1
  require "spec_helper"
2
2
  require "chef/chef_fs/parallelizer"
3
3
 
4
- describe Chef::ChefFS::Parallelizer do
4
+ # FIXME: these are disabled on MacOS due to timing issues in our anka build cluster
5
+ # these issues should be fixed and the tests should be re-eenabled. If we are getting
6
+ # omnibus test phases on mac tests which are reasonable and not ~3 hours long, then the
7
+ # condition to avoid this testing on macs can be deleted
8
+ describe Chef::ChefFS::Parallelizer, :not_supported_on_macos do
5
9
  before :each do
6
10
  @start_time = Time.now
7
11
  end
@@ -61,7 +61,7 @@ describe Chef::ChefFS::PathUtils do
61
61
  end
62
62
 
63
63
  context "invoking realest_path" do
64
- let(:good_path) { File.dirname(__FILE__) }
64
+ let(:good_path) { __dir__ }
65
65
  let(:parent_path) { File.dirname(good_path) }
66
66
 
67
67
  it "handles paths with no wildcards or globs" do
@@ -1,7 +1,7 @@
1
1
  require "spec_helper"
2
2
  require "chef/cookbook/synchronizer"
3
3
  require "chef/cookbook_version"
4
- require "chef/dist"
4
+ require "chef-utils/dist"
5
5
 
6
6
  describe Chef::CookbookCacheCleaner do
7
7
  describe "when cleaning up unused cookbook components" do
@@ -50,7 +50,7 @@ describe Chef::CookbookCacheCleaner do
50
50
  cleaner.cleanup_file_cache
51
51
  end
52
52
 
53
- it "does not remove anything on #{Chef::Dist::SOLOEXEC}" do
53
+ it "does not remove anything on #{ChefUtils::Dist::Solo::EXEC}" do
54
54
  Chef::Config[:solo_legacy_mode] = true
55
55
  allow(cleaner.cache).to receive(:find).and_return(%w{cookbooks/valid1/recipes/default.rb cookbooks/valid2/recipes/default.rb})
56
56
  expect(cleaner.cache).not_to receive(:delete)
@@ -19,10 +19,10 @@
19
19
  require "spec_helper"
20
20
 
21
21
  describe Chef::CookbookVersion do
22
- COOKBOOK_PATH = File.expand_path(File.join(File.dirname(__FILE__), "..", "data", "cookbooks", "openldap"))
22
+ COOKBOOK_PATH = File.expand_path(File.join(__dir__, "..", "data", "cookbooks", "openldap"))
23
23
 
24
24
  before(:each) do
25
- @cookbook_repo = File.expand_path(File.join(File.dirname(__FILE__), "..", "data", "cookbooks"))
25
+ @cookbook_repo = File.expand_path(File.join(__dir__, "..", "data", "cookbooks"))
26
26
  cl = Chef::CookbookLoader.new(@cookbook_repo)
27
27
  cl.load_cookbooks
28
28
  @cookbook_collection = Chef::CookbookCollection.new(cl)
@@ -0,0 +1,208 @@
1
+ #
2
+ # Copyright:: Copyright (c) Chef Software Inc.
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ require "spec_helper"
19
+ require "chef/data_collector/config_validation"
20
+
21
+ describe Chef::DataCollector::ConfigValidation do
22
+ describe "#should_be_enabled?" do
23
+ shared_examples_for "a solo-like run" do
24
+ it "is disabled in solo-legacy without a data_collector url and token" do
25
+ expect(Chef::DataCollector::ConfigValidation.should_be_enabled?).to be false
26
+ end
27
+
28
+ it "is disabled in solo-legacy with only a url" do
29
+ Chef::Config[:data_collector][:server_url] = "https://www.esa.local/ariane5"
30
+ expect(Chef::DataCollector::ConfigValidation.should_be_enabled?).to be false
31
+ end
32
+
33
+ it "is disabled in solo-legacy with only a token" do
34
+ Chef::Config[:data_collector][:token] = "admit_one"
35
+ expect(Chef::DataCollector::ConfigValidation.should_be_enabled?).to be false
36
+ end
37
+
38
+ it "is enabled in solo-legacy with both a token and url" do
39
+ Chef::Config[:data_collector][:server_url] = "https://www.esa.local/ariane5"
40
+ Chef::Config[:data_collector][:token] = "no_cash_value"
41
+ expect(Chef::DataCollector::ConfigValidation.should_be_enabled?).to be true
42
+ end
43
+
44
+ it "is enabled in solo-legacy with only an output location to a file" do
45
+ Chef::Config[:data_collector][:output_locations] = { files: [ "/always/be/counting/down" ] }
46
+ expect(Chef::DataCollector::ConfigValidation.should_be_enabled?).to be true
47
+ end
48
+
49
+ it "is disabled in solo-legacy with only an output location to a uri" do
50
+ Chef::Config[:data_collector][:output_locations] = { urls: [ "https://esa.local/ariane5" ] }
51
+ expect(Chef::DataCollector::ConfigValidation.should_be_enabled?).to be false
52
+ end
53
+
54
+ it "is enabled in solo-legacy with only an output location to a uri with a token" do
55
+ Chef::Config[:data_collector][:output_locations] = { urls: [ "https://esa.local/ariane5" ] }
56
+ Chef::Config[:data_collector][:token] = "good_for_one_fare"
57
+ expect(Chef::DataCollector::ConfigValidation.should_be_enabled?).to be true
58
+ end
59
+
60
+ it "is enabled in solo-legacy when the mode is :solo" do
61
+ Chef::Config[:data_collector][:server_url] = "https://www.esa.local/ariane5"
62
+ Chef::Config[:data_collector][:token] = "non_redeemable"
63
+ Chef::Config[:data_collector][:mode] = :solo
64
+ expect(Chef::DataCollector::ConfigValidation.should_be_enabled?).to be true
65
+ end
66
+
67
+ it "is enabled in solo-legacy when the mode is :both" do
68
+ Chef::Config[:data_collector][:server_url] = "https://www.esa.local/ariane5"
69
+ Chef::Config[:data_collector][:token] = "non_negotiable"
70
+ Chef::Config[:data_collector][:mode] = :both
71
+ expect(Chef::DataCollector::ConfigValidation.should_be_enabled?).to be true
72
+ end
73
+
74
+ it "is disabled in solo-legacy when the mode is :client" do
75
+ Chef::Config[:data_collector][:server_url] = "https://www.esa.local/ariane5"
76
+ Chef::Config[:data_collector][:token] = "NYCTA"
77
+ Chef::Config[:data_collector][:mode] = :client
78
+ expect(Chef::DataCollector::ConfigValidation.should_be_enabled?).to be false
79
+ end
80
+
81
+ it "is disabled in solo-legacy mode when the mode is :nonsense" do
82
+ Chef::Config[:data_collector][:server_url] = "https://www.esa.local/ariane5"
83
+ Chef::Config[:data_collector][:token] = "MTA"
84
+ Chef::Config[:data_collector][:mode] = :nonsense
85
+ expect(Chef::DataCollector::ConfigValidation.should_be_enabled?).to be false
86
+ end
87
+ end
88
+
89
+ it "by default it is enabled" do
90
+ expect(Chef::DataCollector::ConfigValidation.should_be_enabled?).to be true
91
+ end
92
+
93
+ it "is disabled in why-run" do
94
+ Chef::Config[:why_run] = true
95
+ expect(Chef::DataCollector::ConfigValidation.should_be_enabled?).to be false
96
+ end
97
+
98
+ describe "a solo legacy run" do
99
+ before(:each) do
100
+ Chef::Config[:solo_legacy_mode] = true
101
+ end
102
+
103
+ it_behaves_like "a solo-like run"
104
+ end
105
+
106
+ describe "a local mode run" do
107
+ before(:each) do
108
+ Chef::Config[:local_mode] = true
109
+ end
110
+
111
+ it_behaves_like "a solo-like run"
112
+ end
113
+
114
+ it "is enabled in client mode when the mode is :both" do
115
+ Chef::Config[:data_collector][:mode] = :both
116
+ expect(Chef::DataCollector::ConfigValidation.should_be_enabled?).to be true
117
+ end
118
+
119
+ it "is disabled in client mode when the mode is :solo" do
120
+ Chef::Config[:data_collector][:mode] = :solo
121
+ expect(Chef::DataCollector::ConfigValidation.should_be_enabled?).to be false
122
+ end
123
+
124
+ it "is disabled in client mode when the mode is :nonsense" do
125
+ Chef::Config[:data_collector][:mode] = :nonsense
126
+ expect(Chef::DataCollector::ConfigValidation.should_be_enabled?).to be false
127
+ end
128
+
129
+ it "is still enabled if you set a token in client mode" do
130
+ Chef::Config[:data_collector][:token] = "good_for_one_ride"
131
+ expect(Chef::DataCollector::ConfigValidation.should_be_enabled?).to be true
132
+ end
133
+ end
134
+
135
+ describe "validate_server_url!" do
136
+ it "with valid server url" do
137
+ Chef::Config[:data_collector][:server_url] = "https://www.esa.local/ariane5"
138
+ expect(Chef::DataCollector::ConfigValidation.validate_server_url!).to be_nil
139
+ end
140
+
141
+ it "with invalid server URL" do
142
+ Chef::Config[:data_collector][:server_url] = "not valid URL"
143
+ expect { Chef::DataCollector::ConfigValidation.validate_server_url! }.to raise_error(Chef::Exceptions::ConfigurationError,
144
+ "Chef::Config[:data_collector][:server_url] (not valid URL) is not a valid URI.")
145
+ end
146
+
147
+ it "with invalid server URL without host" do
148
+ Chef::Config[:data_collector][:server_url] = "no-host"
149
+ expect { Chef::DataCollector::ConfigValidation.validate_server_url! }.to raise_error(Chef::Exceptions::ConfigurationError,
150
+ "Chef::Config[:data_collector][:server_url] (no-host) is a URI with no host. Please supply a valid URL.")
151
+ end
152
+
153
+ it "skip validation if output_locations is set" do
154
+ Chef::Config[:data_collector][:output_locations] = { files: ["https://www.esa.local/ariane5"] }
155
+ expect(Chef::DataCollector::ConfigValidation.validate_server_url!).to be_nil
156
+ end
157
+
158
+ it "skip validation if output_locations & server_url both are set" do
159
+ Chef::Config[:data_collector][:server_url] = "https://www.esa.local/ariane5"
160
+ Chef::Config[:data_collector][:output_locations] = { files: ["https://www.esa.local/ariane5"] }
161
+ expect(Chef::DataCollector::ConfigValidation.validate_server_url!).to be_nil
162
+ end
163
+ end
164
+
165
+ describe "validate_output_locations!" do
166
+ it "with nil or not set skip validation" do
167
+ Chef::Config[:data_collector][:output_locations] = nil
168
+ expect(Chef::DataCollector::ConfigValidation.validate_output_locations!).to be_nil
169
+ end
170
+
171
+ it "with empty value raise validation error" do
172
+ Chef::Config[:data_collector][:output_locations] = {}
173
+ expect { Chef::DataCollector::ConfigValidation.validate_output_locations! }.to raise_error(Chef::Exceptions::ConfigurationError,
174
+ "Chef::Config[:data_collector][:output_locations] is empty. Please supply an hash of valid URLs and / or local file paths.")
175
+ end
176
+
177
+ it "with valid URLs options" do
178
+ Chef::Config[:data_collector][:output_locations] = { urls: ["https://www.esa.local/ariane5/data-collector"] }
179
+ expect { Chef::DataCollector::ConfigValidation.validate_output_locations! }.not_to raise_error
180
+ end
181
+
182
+ context "output_locations contains files" do
183
+ let(:file_path) { "/tmp/client-runs.txt" }
184
+
185
+ before(:each) do
186
+ allow(File).to receive(:exist?).with(file_path).and_return(true)
187
+ allow(File).to receive(:readable?).with(file_path).and_return(true)
188
+ allow(File).to receive(:writable?).with(file_path).and_return(true)
189
+ allow(File).to receive(:expand_path).with(file_path).and_return(file_path)
190
+ end
191
+
192
+ it "with valid files options" do
193
+ Chef::Config[:data_collector][:output_locations] = { files: [file_path] }
194
+ expect { Chef::DataCollector::ConfigValidation.validate_output_locations! }.not_to raise_error
195
+ end
196
+
197
+ it "with valid files & URLs options" do
198
+ Chef::Config[:data_collector][:output_locations] = { urls: ["https://www.esa.local/ariane5/data-collector"], files: [file_path] }
199
+ expect { Chef::DataCollector::ConfigValidation.validate_output_locations! }.not_to raise_error
200
+ end
201
+
202
+ it "with valid files options & String location value" do
203
+ Chef::Config[:data_collector][:output_locations] = { files: file_path }
204
+ expect { Chef::DataCollector::ConfigValidation.validate_output_locations! }.not_to raise_error
205
+ end
206
+ end
207
+ end
208
+ end