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
@@ -19,13 +19,13 @@ require "spec_helper"
19
19
  require "chef/mixin/shell_out"
20
20
  require "chef/version"
21
21
  require "ohai/version"
22
- require "chef/dist"
22
+ require "chef-utils/dist"
23
23
 
24
24
  describe "Chef Versions", :executables do
25
25
  include Chef::Mixin::ShellOut
26
- let(:chef_dir) { File.join(File.dirname(__FILE__), "..", "..") }
26
+ let(:chef_dir) { File.join(__dir__, "..", "..") }
27
27
 
28
- binaries = [ Chef::Dist::CLIENT, "chef-shell", "chef-apply", "knife", Chef::Dist::SOLOEXEC ]
28
+ binaries = [ ChefUtils::Dist::Infra::CLIENT, "chef-shell", "chef-apply", "knife", ChefUtils::Dist::Solo::EXEC ]
29
29
 
30
30
  binaries.each do |binary|
31
31
  it "#{binary} version should be sane" do
@@ -267,10 +267,10 @@ describe "Chef::Win32::Registry", :windows_only do
267
267
  describe "create_key" do
268
268
  before(:all) do
269
269
  ::Win32::Registry::HKEY_CURRENT_USER.open("Software\\Root") do |reg|
270
- begin
271
- reg.delete_key("Trunk", true)
272
- rescue
273
- end
270
+
271
+ reg.delete_key("Trunk", true)
272
+ rescue
273
+
274
274
  end
275
275
  end
276
276
 
@@ -362,10 +362,10 @@ describe "Chef::Win32::Registry", :windows_only do
362
362
  before(:all) do
363
363
  ::Win32::Registry::HKEY_CURRENT_USER.create "Software\\Root\\Trunk"
364
364
  ::Win32::Registry::HKEY_CURRENT_USER.open("Software\\Root\\Trunk") do |reg|
365
- begin
366
- reg.delete_key("Red", true)
367
- rescue
368
- end
365
+
366
+ reg.delete_key("Red", true)
367
+ rescue
368
+
369
369
  end
370
370
  end
371
371
 
@@ -125,7 +125,7 @@ describe "Chef::Application::WindowsServiceManager", :windows_only, :system_wind
125
125
  it "start should start the service", :volatile do
126
126
  service_manager.run(["-a", "start"])
127
127
  expect(test_service_state).to eq("running")
128
- expect(File.exists?(test_service_file)).to be_truthy
128
+ expect(File.exist?(test_service_file)).to be_truthy
129
129
  end
130
130
 
131
131
  it "stop should not affect the service" do
@@ -3,7 +3,7 @@ require "support/shared/integration/integration_helper"
3
3
  require "chef/mixin/shell_out"
4
4
  require "tiny_server"
5
5
  require "tmpdir"
6
- require "chef/dist"
6
+ require "chef-utils/dist"
7
7
 
8
8
  describe "chef-client" do
9
9
 
@@ -34,7 +34,7 @@ describe "chef-client" do
34
34
  include IntegrationSupport
35
35
  include Chef::Mixin::ShellOut
36
36
 
37
- let(:chef_dir) { File.join(File.dirname(__FILE__), "..", "..", "..", "bin") }
37
+ let(:chef_dir) { File.join(__dir__, "..", "..", "..", "bin") }
38
38
 
39
39
  # Invoke `chef-client` as `ruby PATH/TO/chef-client`. This ensures the
40
40
  # following constraints are satisfied:
@@ -45,8 +45,8 @@ describe "chef-client" do
45
45
  # machine that has omnibus chef installed. In that case we need to ensure
46
46
  # we're running `chef-client` from the source tree and not the external one.
47
47
  # cf. CHEF-4914
48
- let(:chef_client) { "bundle exec #{Chef::Dist::CLIENT} --minimal-ohai" }
49
- let(:chef_solo) { "bundle exec #{Chef::Dist::SOLOEXEC} --legacy-mode --minimal-ohai" }
48
+ let(:chef_client) { "bundle exec #{ChefUtils::Dist::Infra::CLIENT} --minimal-ohai" }
49
+ let(:chef_solo) { "bundle exec #{ChefUtils::Dist::Solo::EXEC} --legacy-mode --minimal-ohai" }
50
50
 
51
51
  when_the_repository "has a cookbook with a no-op recipe" do
52
52
  before { file "cookbooks/x/recipes/default.rb", "" }
@@ -5,13 +5,14 @@ require "chef/mixin/shell_out"
5
5
  require "tiny_server"
6
6
  require "tmpdir"
7
7
  require "chef/platform"
8
+ require "chef-utils/dist"
8
9
 
9
10
  describe "chef-client" do
10
11
 
11
12
  include IntegrationSupport
12
13
  include Chef::Mixin::ShellOut
13
14
 
14
- let(:chef_dir) { File.join(File.dirname(__FILE__), "..", "..", "..", "bin") }
15
+ let(:chef_dir) { File.join(__dir__, "..", "..", "..", "bin") }
15
16
 
16
17
  # Invoke `chef-client` as `ruby PATH/TO/chef-client`. This ensures the
17
18
  # following constraints are satisfied:
@@ -22,7 +23,7 @@ describe "chef-client" do
22
23
  # machine that has omnibus chef installed. In that case we need to ensure
23
24
  # we're running `chef-client` from the source tree and not the external one.
24
25
  # cf. CHEF-4914
25
- let(:chef_client) { "bundle exec #{Chef::Dist::CLIENT} --no-fork --minimal-ohai" }
26
+ let(:chef_client) { "bundle exec #{ChefUtils::Dist::Infra::CLIENT} --no-fork --minimal-ohai" }
26
27
 
27
28
  let(:critical_env_vars) { %w{PATH RUBYOPT BUNDLE_GEMFILE GEM_PATH}.map { |o| "#{o}=#{ENV[o]}" } .join(" ") }
28
29
 
@@ -74,7 +74,7 @@ describe "chef-client" do
74
74
  basic_config_file
75
75
  end
76
76
 
77
- let(:chef_dir) { File.join(File.dirname(__FILE__), "..", "..", "..", "bin") }
77
+ let(:chef_dir) { File.join(__dir__, "..", "..", "..", "bin") }
78
78
 
79
79
  let(:chef_client_cmd) { %Q{bundle exec chef-client --minimal-ohai -c "#{path_to("config/client.rb")}" -lwarn} }
80
80
 
@@ -125,12 +125,12 @@ describe "knife common options", :workstation do
125
125
 
126
126
  context "when the default port (8889) is already bound" do
127
127
  before :each do
128
- begin
129
- @server = ChefZero::Server.new(host: "localhost", port: 8889)
130
- @server.start_background
131
- rescue Errno::EADDRINUSE
132
- # OK. Don't care who has it in use, as long as *someone* does.
133
- end
128
+
129
+ @server = ChefZero::Server.new(host: "localhost", port: 8889)
130
+ @server.start_background
131
+ rescue Errno::EADDRINUSE
132
+ # OK. Don't care who has it in use, as long as *someone* does.
133
+
134
134
  end
135
135
  after :each do
136
136
  @server.stop if @server
@@ -144,12 +144,12 @@ describe "knife common options", :workstation do
144
144
 
145
145
  context "when port 9999 is already bound" do
146
146
  before :each do
147
- begin
148
- @server = ChefZero::Server.new(host: "localhost", port: 9999)
149
- @server.start_background
150
- rescue Errno::EADDRINUSE
151
- # OK. Don't care who has it in use, as long as *someone* does.
152
- end
147
+
148
+ @server = ChefZero::Server.new(host: "localhost", port: 9999)
149
+ @server.start_background
150
+ rescue Errno::EADDRINUSE
151
+ # OK. Don't care who has it in use, as long as *someone* does.
152
+
153
153
  end
154
154
  after :each do
155
155
  @server.stop if @server
@@ -0,0 +1,220 @@
1
+ #
2
+ # Copyright 2018, Noah Kantrowitz
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ require "spec_helper"
17
+ require "support/shared/integration/integration_helper"
18
+ require "support/shared/context/config"
19
+
20
+ describe "knife config list", :workstation do
21
+ include IntegrationSupport
22
+ include KnifeSupport
23
+
24
+ include_context "default config options"
25
+
26
+ when_the_repository("has a custom env") do
27
+ let(:cmd_args) { [] }
28
+ let(:knife_list) do
29
+ knife("config", "list", *cmd_args, instance_filter: lambda { |instance|
30
+ # Fake the failsafe check because this command doesn't actually process knife.rb.
31
+ $__KNIFE_INTEGRATION_FAILSAFE_CHECK << " ole"
32
+ allow(File).to receive(:file?).and_call_original
33
+ })
34
+ end
35
+ subject { knife_list.stdout }
36
+
37
+ around do |ex|
38
+ # Store and reset the value of some env vars.
39
+ old_home = ENV["HOME"]
40
+ old_wd = Dir.pwd
41
+ # Clear these out because they are cached permanently.
42
+ ChefConfig::PathHelper.class_exec { remove_class_variable(:@@home_dir) }
43
+ Chef::Knife::ConfigList.reset_config_loader!
44
+ begin
45
+ ex.run
46
+ ensure
47
+ ENV["HOME"] = old_home
48
+ Dir.chdir(old_wd)
49
+ ENV[ChefUtils.windows? ? "CD" : "PWD"] = Dir.pwd
50
+ end
51
+ end
52
+
53
+ before do
54
+ # Always run from the temp folder. This can't be in the `around` block above
55
+ # because it has to run after the before set in the "with a chef repo" shared context.
56
+ directory("repo")
57
+ Dir.chdir(path_to("repo"))
58
+ ENV[ChefUtils.windows? ? "CD" : "PWD"] = Dir.pwd
59
+ ENV["HOME"] = path_to(".")
60
+ allow(TTY::Screen).to receive(:width).and_return(200)
61
+ end
62
+
63
+ # NOTE: The funky formatting with # at the end of the line of some of the
64
+ # output examples are because of how the format strings are built, there is
65
+ # substantial trailing whitespace in most cases which many editors "helpfully" remove.
66
+
67
+ context "with no credentials file" do
68
+ subject { knife_list.stderr }
69
+ it { is_expected.to eq "FATAL: No profiles found, #{path_to(".chef/credentials")} does not exist or is empty\n" }
70
+ end
71
+
72
+ context "with an empty credentials file" do
73
+ before { file(".chef/credentials", "") }
74
+ subject { knife_list.stderr }
75
+ it { is_expected.to eq "FATAL: No profiles found, #{path_to(".chef/credentials")} does not exist or is empty\n" }
76
+ end
77
+
78
+ context "with a simple default profile" do
79
+ before { file(".chef/credentials", <<~EOH) }
80
+ [default]
81
+ client_name = "testuser"
82
+ client_key = "testkey.pem"
83
+ chef_server_url = "https://example.com/organizations/testorg"
84
+ EOH
85
+ it { is_expected.to eq <<~EOH.delete("#") }
86
+ Profile Client Key Server #
87
+ --------------------------------------------------------------------------------#
88
+ *default testuser ~/.chef/testkey.pem https://example.com/organizations/testorg #
89
+ EOH
90
+ end
91
+
92
+ context "with multiple profiles" do
93
+ before { file(".chef/credentials", <<~EOH) }
94
+ [default]
95
+ client_name = "testuser"
96
+ client_key = "testkey.pem"
97
+ chef_server_url = "https://example.com/organizations/testorg"
98
+
99
+ [prod]
100
+ client_name = "testuser"
101
+ client_key = "testkey.pem"
102
+ chef_server_url = "https://example.com/organizations/prod"
103
+
104
+ [qa]
105
+ client_name = "qauser"
106
+ client_key = "~/src/qauser.pem"
107
+ chef_server_url = "https://example.com/organizations/testorg"
108
+ EOH
109
+ it { is_expected.to eq <<~EOH.delete("#") }
110
+ Profile Client Key Server #
111
+ --------------------------------------------------------------------------------#
112
+ *default testuser ~/.chef/testkey.pem https://example.com/organizations/testorg #
113
+ prod testuser ~/.chef/testkey.pem https://example.com/organizations/prod #
114
+ qa qauser ~/src/qauser.pem https://example.com/organizations/testorg #
115
+ EOH
116
+ end
117
+
118
+ context "with a non-default active profile" do
119
+ let(:cmd_args) { %w{--profile prod} }
120
+ before { file(".chef/credentials", <<~EOH) }
121
+ [default]
122
+ client_name = "testuser"
123
+ client_key = "testkey.pem"
124
+ chef_server_url = "https://example.com/organizations/testorg"
125
+
126
+ [prod]
127
+ client_name = "testuser"
128
+ client_key = "testkey.pem"
129
+ chef_server_url = "https://example.com/organizations/prod"
130
+
131
+ [qa]
132
+ client_name = "qauser"
133
+ client_key = "~/src/qauser.pem"
134
+ chef_server_url = "https://example.com/organizations/testorg"
135
+ EOH
136
+ it { is_expected.to eq <<~EOH.delete("#") }
137
+ Profile Client Key Server #
138
+ --------------------------------------------------------------------------------#
139
+ default testuser ~/.chef/testkey.pem https://example.com/organizations/testorg #
140
+ *prod testuser ~/.chef/testkey.pem https://example.com/organizations/prod #
141
+ qa qauser ~/src/qauser.pem https://example.com/organizations/testorg #
142
+ EOH
143
+ end
144
+
145
+ context "with a bad profile as an active profile" do
146
+ let(:cmd_args) { %w{--profile production} }
147
+ before { file(".chef/credentials", <<~EOH) }
148
+ [default]
149
+ client_name = "testuser"
150
+ client_key = "testkey.pem"
151
+ chef_server_url = "https://example.com/organizations/testorg"
152
+
153
+ [prod]
154
+ client_name = "testuser"
155
+ client_key = "testkey.pem"
156
+ chef_server_url = "https://example.com/organizations/prod"
157
+
158
+ [qa]
159
+ client_name = "qauser"
160
+ client_key = "~/src/qauser.pem"
161
+ chef_server_url = "https://example.com/organizations/testorg"
162
+ EOH
163
+ it { is_expected.to eq <<~EOH.delete("#") }
164
+ Profile Client Key Server #
165
+ --------------------------------------------------------------------------------#
166
+ default testuser ~/.chef/testkey.pem https://example.com/organizations/testorg #
167
+ prod testuser ~/.chef/testkey.pem https://example.com/organizations/prod #
168
+ qa qauser ~/src/qauser.pem https://example.com/organizations/testorg #
169
+ EOH
170
+ end
171
+
172
+ context "with a minimal profile" do
173
+ before { file(".chef/credentials", <<~EOH) }
174
+ [default]
175
+ chef_server_url = "https://example.com/organizations/testorg"
176
+ EOH
177
+ it { is_expected.to match %r{^*default .*? https://example.com/organizations/testorg} }
178
+ end
179
+
180
+ context "with -i" do
181
+ let(:cmd_args) { %w{-i} }
182
+ before { file(".chef/credentials", <<~EOH) }
183
+ [default]
184
+ chef_server_url = "https://example.com/organizations/testorg"
185
+ EOH
186
+ it { is_expected.to eq <<~EOH.delete("#") }
187
+ Profile Client Key Server #
188
+ --------------------------------------------------------------#
189
+ *default https://example.com/organizations/testorg #
190
+ EOH
191
+ end
192
+
193
+ context "with --format=json" do
194
+ let(:cmd_args) { %w{--format=json node_name} }
195
+ before { file(".chef/credentials", <<~EOH) }
196
+ [default]
197
+ client_name = "testuser"
198
+ client_key = "testkey.pem"
199
+ chef_server_url = "https://example.com/organizations/testorg"
200
+
201
+ [prod]
202
+ client_name = "testuser"
203
+ client_key = "testkey.pem"
204
+ chef_server_url = "https://example.com/organizations/prod"
205
+
206
+ [qa]
207
+ client_name = "qauser"
208
+ client_key = "~/src/qauser.pem"
209
+ chef_server_url = "https://example.com/organizations/testorg"
210
+ EOH
211
+ it {
212
+ expect(JSON.parse(subject)).to eq [
213
+ { "profile" => "default", "active" => true, "client_name" => "testuser", "client_key" => path_to(".chef/testkey.pem"), "server_url" => "https://example.com/organizations/testorg" },
214
+ { "profile" => "prod", "active" => false, "client_name" => "testuser", "client_key" => path_to(".chef/testkey.pem"), "server_url" => "https://example.com/organizations/prod" },
215
+ { "profile" => "qa", "active" => false, "client_name" => "qauser", "client_key" => path_to("src/qauser.pem"), "server_url" => "https://example.com/organizations/testorg" },
216
+ ]
217
+ }
218
+ end
219
+ end
220
+ end
@@ -0,0 +1,192 @@
1
+ #
2
+ # Copyright 2018, Noah Kantrowitz
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ require "spec_helper"
17
+ require "support/shared/integration/integration_helper"
18
+ require "support/shared/context/config"
19
+
20
+ describe "knife config show", :workstation do
21
+ include IntegrationSupport
22
+ include KnifeSupport
23
+
24
+ include_context "default config options"
25
+
26
+ let(:cmd_args) { [] }
27
+
28
+ when_the_repository("has a custom env") do
29
+ subject do
30
+ cmd = knife("config", "show", *cmd_args, instance_filter: lambda { |instance|
31
+ # Clear the stub set up in KnifeSupport.
32
+ allow(File).to receive(:file?).and_call_original
33
+ # Lies, damn lies, and config files. We need to allow normal config loading
34
+ # behavior to be able to test stuff.
35
+ instance.config.delete(:config_file)
36
+ $__KNIFE_INTEGRATION_FAILSAFE_CHECK << " ole"
37
+ })
38
+ cmd.stdout
39
+ end
40
+
41
+ around do |ex|
42
+ # Store and reset the value of some env vars.
43
+ old_chef_home = ENV["CHEF_HOME"]
44
+ old_knife_home = ENV["KNIFE_HOME"]
45
+ old_home = ENV["HOME"]
46
+ old_wd = Dir.pwd
47
+ ChefConfig::PathHelper.per_tool_home_environment = "KNIFE_HOME"
48
+ # Clear these out because they are cached permanently.
49
+ ChefConfig::PathHelper.class_exec { remove_class_variable(:@@home_dir) }
50
+ Chef::Knife::ConfigShow.reset_config_loader!
51
+ begin
52
+ ex.run
53
+ ensure
54
+ ENV["CHEF_HOME"] = old_chef_home
55
+ ENV["KNIFE_HOME"] = old_knife_home
56
+ ENV["HOME"] = old_home
57
+ Dir.chdir(old_wd)
58
+ ENV[ChefUtils.windows? ? "CD" : "PWD"] = Dir.pwd
59
+ ChefConfig::PathHelper.per_tool_home_environment = nil
60
+ end
61
+ end
62
+
63
+ before do
64
+ # Always run from the temp folder. This can't be in the `around` block above
65
+ # because it has to run after the before set in the "with a chef repo" shared context.
66
+ directory("repo")
67
+ Dir.chdir(path_to("repo"))
68
+ ENV[ChefUtils.windows? ? "CD" : "PWD"] = Dir.pwd
69
+ ENV["HOME"] = path_to(".")
70
+ end
71
+
72
+ context "with a global knife.rb" do
73
+ before { file(".chef/knife.rb", "node_name 'one'\n") }
74
+
75
+ it { is_expected.to match(%r{^Loading from configuration file .*/#{File.basename(path_to("."))}/.chef/knife.rb$}) }
76
+ it { is_expected.to match(/^node_name:\s+one$/) }
77
+ end
78
+
79
+ context "with a repo knife.rb" do
80
+ before { file("repo/.chef/knife.rb", "node_name 'two'\n") }
81
+
82
+ it { is_expected.to match(%r{^Loading from configuration file .*/#{File.basename(path_to("."))}/repo/.chef/knife.rb$}) }
83
+ it { is_expected.to match(/^node_name:\s+two$/) }
84
+ end
85
+
86
+ context "with both knife.rb" do
87
+ before do
88
+ file(".chef/knife.rb", "node_name 'one'\n")
89
+ file("repo/.chef/knife.rb", "node_name 'two'\n")
90
+ end
91
+
92
+ it { is_expected.to match(%r{^Loading from configuration file .*/#{File.basename(path_to("."))}/repo/.chef/knife.rb$}) }
93
+ it { is_expected.to match(/^node_name:\s+two$/) }
94
+ end
95
+
96
+ context "with a credentials file" do
97
+ before { file(".chef/credentials", "[default]\nclient_name = \"three\"\n") }
98
+
99
+ it { is_expected.to match(%r{^Loading from credentials file .*/#{File.basename(path_to("."))}/.chef/credentials$}) }
100
+ it { is_expected.to match(/^node_name:\s+three$/) }
101
+ end
102
+
103
+ context "with a credentials file and knife.rb" do
104
+ before do
105
+ file(".chef/knife.rb", "node_name 'one'\n")
106
+ file(".chef/credentials", "[default]\nclient_name = \"three\"\n")
107
+ end
108
+
109
+ it { is_expected.to match(%r{^Loading from configuration file .*/#{File.basename(path_to("."))}/.chef/knife.rb$}) }
110
+ it { is_expected.to match(%r{^Loading from credentials file .*/#{File.basename(path_to("."))}/.chef/credentials$}) }
111
+ it { is_expected.to match(/^node_name:\s+one$/) }
112
+ end
113
+
114
+ context "with a config dot d files" do
115
+ before { file(".chef/config.d/abc.rb", "node_name 'one'\n") }
116
+
117
+ it { is_expected.to match(%r{^Loading from .d/ configuration file .*/#{File.basename(path_to("."))}/.chef/config.d/abc.rb$}) }
118
+ it { is_expected.to match(/^node_name:\s+one$/) }
119
+ end
120
+
121
+ context "with a credentials file and CHEF_HOME" do
122
+ before do
123
+ file(".chef/credentials", "[default]\nclient_name = \"three\"\n")
124
+ file("foo/.chef/credentials", "[default]\nclient_name = \"four\"\n")
125
+ ENV["CHEF_HOME"] = path_to("foo")
126
+ end
127
+
128
+ it { is_expected.to match(%r{^Loading from credentials file .*/#{File.basename(path_to("."))}/foo/.chef/credentials$}) }
129
+ it { is_expected.to match(/^node_name:\s+four$/) }
130
+ end
131
+
132
+ context "with a credentials file and KNIFE_HOME" do
133
+ before do
134
+ file(".chef/credentials", "[default]\nclient_name = \"three\"\n")
135
+ file("bar/.chef/credentials", "[default]\nclient_name = \"four\"\n")
136
+ ENV["KNIFE_HOME"] = path_to("bar")
137
+ end
138
+
139
+ it { is_expected.to match(%r{^Loading from credentials file .*/#{File.basename(path_to("."))}/bar/.chef/credentials$}) }
140
+ it { is_expected.to match(/^node_name:\s+four$/) }
141
+ end
142
+
143
+ context "with single argument" do
144
+ let(:cmd_args) { %w{node_name} }
145
+ before { file(".chef/credentials", "[default]\nclient_name = \"three\"\n") }
146
+
147
+ it { is_expected.to match(/^node_name:\s+three\Z/) }
148
+ end
149
+
150
+ context "with two arguments" do
151
+ let(:cmd_args) { %w{node_name client_key} }
152
+ before { file(".chef/credentials", "[default]\nclient_name = \"three\"\nclient_key = \"three.pem\"") }
153
+
154
+ it { is_expected.to match(%r{^client_key:\s+\S*/.chef/three.pem\nnode_name:\s+three\Z}) }
155
+ end
156
+
157
+ context "with a dotted argument" do
158
+ let(:cmd_args) { %w{knife.ssh_user} }
159
+ before { file(".chef/credentials", "[default]\nclient_name = \"three\"\n[default.knife]\nssh_user = \"foo\"\n") }
160
+
161
+ it { is_expected.to match(/^knife.ssh_user:\s+foo\Z/) }
162
+ end
163
+
164
+ context "with regex argument" do
165
+ let(:cmd_args) { %w{/name/} }
166
+ before { file(".chef/credentials", "[default]\nclient_name = \"three\"\n") }
167
+
168
+ it { is_expected.to match(/^node_name:\s+three\Z/) }
169
+ end
170
+
171
+ context "with --all" do
172
+ let(:cmd_args) { %w{-a /key_contents/} }
173
+ before { file(".chef/credentials", "[default]\nclient_name = \"three\"\n") }
174
+
175
+ it { is_expected.to match(/^client_key_contents:\s+\nvalidation_key_contents:\s+\Z/) }
176
+ end
177
+
178
+ context "with --raw" do
179
+ let(:cmd_args) { %w{-r node_name} }
180
+ before { file(".chef/credentials", "[default]\nclient_name = \"three\"\n") }
181
+
182
+ it { is_expected.to eq("three\n") }
183
+ end
184
+
185
+ context "with --format=json" do
186
+ let(:cmd_args) { %w{--format=json node_name} }
187
+ before { file(".chef/credentials", "[default]\nclient_name = \"three\"\n") }
188
+
189
+ it { expect(JSON.parse(subject)).to eq({ "node_name" => "three" }) }
190
+ end
191
+ end
192
+ end