chef 16.16.13 → 17.0.242

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 (638) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +9 -13
  3. data/README.md +1 -1
  4. data/Rakefile +2 -2
  5. data/chef-universal-mingw32.gemspec +1 -1
  6. data/chef.gemspec +6 -8
  7. data/lib/chef/application/base.rb +1 -1
  8. data/lib/chef/applications.rb +0 -1
  9. data/lib/chef/chef_fs/command_line.rb +5 -2
  10. data/lib/chef/chef_fs/file_system.rb +9 -10
  11. data/lib/chef/client.rb +2 -2
  12. data/lib/chef/compliance/default_attributes.rb +4 -3
  13. data/lib/chef/compliance/fetcher/automate.rb +0 -7
  14. data/lib/chef/compliance/reporter/automate.rb +17 -7
  15. data/lib/chef/compliance/reporter/chef_server_automate.rb +11 -6
  16. data/lib/chef/compliance/reporter/cli.rb +77 -0
  17. data/lib/chef/compliance/reporter/compliance_enforcer.rb +4 -0
  18. data/lib/chef/compliance/reporter/json_file.rb +8 -1
  19. data/lib/chef/compliance/runner.rb +65 -27
  20. data/lib/chef/cookbook/gem_installer.rb +1 -5
  21. data/lib/chef/cookbook/synchronizer.rb +3 -5
  22. data/lib/chef/cookbook_loader.rb +2 -4
  23. data/lib/chef/cookbook_uploader.rb +0 -1
  24. data/lib/chef/cookbook_version.rb +4 -26
  25. data/lib/chef/data_bag_item.rb +11 -2
  26. data/lib/chef/data_collector/run_end_message.rb +1 -1
  27. data/lib/chef/delayed_evaluator.rb +4 -0
  28. data/lib/chef/deprecated.rb +6 -12
  29. data/lib/chef/dsl/chef_vault.rb +6 -6
  30. data/lib/chef/dsl/reboot_pending.rb +1 -2
  31. data/lib/chef/exceptions.rb +0 -3
  32. data/lib/chef/formatters/error_inspectors/resource_failure_inspector.rb +20 -22
  33. data/lib/chef/formatters/error_mapper.rb +2 -2
  34. data/lib/chef/group.rb +75 -0
  35. data/lib/chef/http.rb +5 -5
  36. data/lib/chef/mixin/get_source_from_package.rb +1 -1
  37. data/lib/chef/node/attribute.rb +6 -4
  38. data/lib/chef/node/immutable_collections.rb +13 -0
  39. data/lib/chef/node/mixin/deep_merge_cache.rb +11 -7
  40. data/lib/chef/node.rb +19 -20
  41. data/lib/chef/org.rb +3 -2
  42. data/lib/chef/policy_builder/policyfile.rb +0 -5
  43. data/lib/chef/property.rb +18 -0
  44. data/lib/chef/provider/cron.rb +1 -1
  45. data/lib/chef/provider/execute.rb +2 -1
  46. data/lib/chef/provider/file.rb +1 -1
  47. data/lib/chef/provider/git.rb +5 -7
  48. data/lib/chef/provider/group/dscl.rb +1 -1
  49. data/lib/chef/provider/group/groupadd.rb +3 -3
  50. data/lib/chef/provider/group/groupmod.rb +3 -3
  51. data/lib/chef/provider/group/pw.rb +3 -3
  52. data/lib/chef/provider/ifconfig.rb +2 -2
  53. data/lib/chef/provider/link.rb +2 -2
  54. data/lib/chef/provider/mount/aix.rb +3 -3
  55. data/lib/chef/provider/mount/mount.rb +5 -5
  56. data/lib/chef/provider/mount/windows.rb +1 -1
  57. data/lib/chef/provider/mount.rb +5 -5
  58. data/lib/chef/provider/package/apt.rb +27 -1
  59. data/lib/chef/provider/package/deb.rb +3 -3
  60. data/lib/chef/provider/package/dnf/dnf_helper.py +1 -1
  61. data/lib/chef/provider/package/portage.rb +2 -2
  62. data/lib/chef/provider/package/powershell.rb +0 -5
  63. data/lib/chef/provider/package/rubygems.rb +9 -15
  64. data/lib/chef/provider/package/windows.rb +2 -4
  65. data/lib/chef/provider/package/yum/yum_helper.py +1 -1
  66. data/lib/chef/provider/package.rb +17 -21
  67. data/lib/chef/provider/route.rb +2 -2
  68. data/lib/chef/provider/service/aixinit.rb +1 -1
  69. data/lib/chef/provider/service/debian.rb +1 -1
  70. data/lib/chef/provider/service/freebsd.rb +15 -21
  71. data/lib/chef/provider/service/macosx.rb +4 -4
  72. data/lib/chef/provider/service/systemd.rb +43 -14
  73. data/lib/chef/provider/service/upstart.rb +2 -13
  74. data/lib/chef/provider/service/windows.rb +12 -12
  75. data/lib/chef/provider/service.rb +6 -6
  76. data/lib/chef/provider/subversion.rb +10 -12
  77. data/lib/chef/provider/systemd_unit.rb +36 -10
  78. data/lib/chef/provider/template/content.rb +3 -7
  79. data/lib/chef/provider/user/dscl.rb +1 -1
  80. data/lib/chef/provider/user/mac.rb +17 -20
  81. data/lib/chef/provider/user/pw.rb +1 -1
  82. data/lib/chef/provider/user/windows.rb +1 -1
  83. data/lib/chef/provider/user.rb +2 -2
  84. data/lib/chef/provider/zypper_repository.rb +2 -2
  85. data/lib/chef/provider.rb +1 -1
  86. data/lib/chef/providers.rb +0 -1
  87. data/lib/chef/resource/alternatives.rb +6 -6
  88. data/lib/chef/resource/apt_package.rb +1 -1
  89. data/lib/chef/resource/apt_preference.rb +2 -2
  90. data/lib/chef/resource/apt_repository.rb +6 -6
  91. data/lib/chef/resource/apt_update.rb +3 -2
  92. data/lib/chef/resource/archive_file.rb +2 -3
  93. data/lib/chef/resource/breakpoint.rb +1 -1
  94. data/lib/chef/resource/build_essential.rb +2 -6
  95. data/lib/chef/resource/chef_client_config.rb +2 -2
  96. data/lib/chef/resource/chef_client_cron.rb +4 -4
  97. data/lib/chef/resource/chef_client_launchd.rb +3 -3
  98. data/lib/chef/resource/chef_client_scheduled_task.rb +1 -1
  99. data/lib/chef/resource/chef_client_systemd_timer.rb +2 -2
  100. data/lib/chef/resource/chef_handler.rb +3 -7
  101. data/lib/chef/resource/chef_sleep.rb +1 -1
  102. data/lib/chef/resource/chef_vault_secret.rb +3 -8
  103. data/lib/chef/resource/chocolatey_config.rb +2 -6
  104. data/lib/chef/resource/chocolatey_feature.rb +2 -6
  105. data/lib/chef/resource/chocolatey_source.rb +4 -10
  106. data/lib/chef/resource/cron/_cron_shared.rb +2 -2
  107. data/lib/chef/resource/cron_access.rb +2 -4
  108. data/lib/chef/resource/dmg_package.rb +6 -10
  109. data/lib/chef/resource/dpkg_package.rb +1 -1
  110. data/lib/chef/resource/execute.rb +6 -1
  111. data/lib/chef/resource/file.rb +1 -1
  112. data/lib/chef/resource/group.rb +2 -2
  113. data/lib/chef/resource/homebrew_cask.rb +5 -15
  114. data/lib/chef/resource/homebrew_tap.rb +2 -6
  115. data/lib/chef/resource/hostname.rb +21 -17
  116. data/lib/chef/resource/http_request.rb +1 -1
  117. data/lib/chef/resource/kernel_module.rb +6 -17
  118. data/lib/chef/resource/locale.rb +2 -3
  119. data/lib/chef/resource/lwrp_base.rb +4 -0
  120. data/lib/chef/resource/macos_userdefaults.rb +10 -14
  121. data/lib/chef/resource/mdadm.rb +53 -7
  122. data/lib/chef/resource/mount.rb +3 -2
  123. data/lib/chef/resource/openssl_ec_private_key.rb +2 -2
  124. data/lib/chef/resource/openssl_rsa_private_key.rb +1 -1
  125. data/lib/chef/resource/openssl_x509_certificate.rb +2 -2
  126. data/lib/chef/resource/plist.rb +7 -7
  127. data/lib/chef/resource/powershell_script.rb +1 -1
  128. data/lib/chef/resource/remote_file.rb +1 -1
  129. data/lib/chef/resource/rhsm_errata.rb +16 -1
  130. data/lib/chef/resource/rhsm_errata_level.rb +10 -1
  131. data/lib/chef/resource/rhsm_register.rb +12 -6
  132. data/lib/chef/resource/rhsm_repo.rb +2 -6
  133. data/lib/chef/resource/rhsm_subscription.rb +7 -11
  134. data/lib/chef/resource/scm/git.rb +1 -1
  135. data/lib/chef/resource/sudo.rb +6 -6
  136. data/lib/chef/resource/support/client.erb +0 -6
  137. data/lib/chef/resource/sysctl.rb +2 -6
  138. data/lib/chef/resource/systemd_unit.rb +3 -3
  139. data/lib/chef/resource/template.rb +1 -1
  140. data/lib/chef/resource/timezone.rb +1 -3
  141. data/lib/chef/resource/user/mac_user.rb +1 -1
  142. data/lib/chef/resource/user_ulimit.rb +2 -3
  143. data/lib/chef/resource/windows_ad_join.rb +2 -6
  144. data/lib/chef/resource/windows_audit_policy.rb +1 -1
  145. data/lib/chef/resource/windows_auto_run.rb +2 -5
  146. data/lib/chef/resource/windows_certificate.rb +207 -73
  147. data/lib/chef/resource/windows_dfs_folder.rb +2 -6
  148. data/lib/chef/resource/windows_dfs_namespace.rb +2 -6
  149. data/lib/chef/resource/windows_dfs_server.rb +1 -3
  150. data/lib/chef/resource/windows_dns_record.rb +2 -6
  151. data/lib/chef/resource/windows_dns_zone.rb +2 -6
  152. data/lib/chef/resource/windows_env.rb +5 -4
  153. data/lib/chef/resource/windows_feature.rb +3 -9
  154. data/lib/chef/resource/windows_feature_dism.rb +2 -6
  155. data/lib/chef/resource/windows_feature_powershell.rb +3 -3
  156. data/lib/chef/resource/windows_firewall_profile.rb +4 -4
  157. data/lib/chef/resource/windows_firewall_rule.rb +2 -5
  158. data/lib/chef/resource/windows_font.rb +2 -4
  159. data/lib/chef/resource/windows_pagefile.rb +2 -6
  160. data/lib/chef/resource/windows_path.rb +2 -2
  161. data/lib/chef/resource/windows_printer.rb +4 -4
  162. data/lib/chef/resource/windows_printer_port.rb +6 -6
  163. data/lib/chef/resource/windows_security_policy.rb +9 -12
  164. data/lib/chef/resource/windows_share.rb +14 -21
  165. data/lib/chef/resource/windows_shortcut.rb +4 -6
  166. data/lib/chef/resource/windows_task.rb +17 -5
  167. data/lib/chef/resource/windows_uac.rb +2 -4
  168. data/lib/chef/resource/windows_user_privilege.rb +5 -5
  169. data/lib/chef/resource/windows_workgroup.rb +1 -2
  170. data/lib/chef/resources.rb +0 -1
  171. data/lib/chef/user.rb +0 -1
  172. data/lib/chef/user_v1.rb +3 -4
  173. data/lib/chef/util/dsc/configuration_generator.rb +1 -0
  174. data/lib/chef/util/dsc/local_configuration_manager.rb +1 -1
  175. data/lib/chef/version.rb +1 -1
  176. data/lib/chef/win32/api.rb +2 -9
  177. data/lib/chef/win32/registry.rb +4 -2
  178. data/lib/chef/win32/version.rb +1 -2
  179. data/spec/data/cookbooks/openldap/libraries/openldap.rb +1 -1
  180. data/spec/data/lwrp/resources/bar.rb +2 -0
  181. data/spec/data/lwrp/resources/buck_passer.rb +1 -0
  182. data/spec/data/lwrp/resources/buck_passer_2.rb +1 -0
  183. data/spec/data/lwrp/resources/embedded_resource_accesses_providers_scope.rb +1 -0
  184. data/spec/data/lwrp/resources/foo.rb +2 -0
  185. data/spec/data/lwrp/resources/inline_compiler.rb +1 -0
  186. data/spec/data/lwrp/resources/monkey_name_printer.rb +1 -0
  187. data/spec/data/lwrp/resources/paint_drying_watcher.rb +1 -0
  188. data/spec/data/lwrp/resources/thumb_twiddler.rb +1 -0
  189. data/spec/data/lwrp/resources_with_default_attributes/nodeattr.rb +2 -0
  190. data/spec/data/lwrp_const_scoping/resources/conflict.rb +1 -0
  191. data/spec/data/lwrp_override/resources/foo.rb +1 -0
  192. data/spec/data/rubygems.org/nonexistent_gem-info +1 -0
  193. data/spec/data/rubygems.org/sexp_processor-info +49 -0
  194. data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +1 -0
  195. data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +1 -0
  196. data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +1 -0
  197. data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +1 -0
  198. data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +1 -0
  199. data/spec/data/run_context/cookbooks/test/resources/resource.rb +2 -0
  200. data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +2 -0
  201. data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +1 -0
  202. data/spec/functional/dsl/registry_helper_spec.rb +1 -1
  203. data/spec/functional/resource/aixinit_service_spec.rb +7 -7
  204. data/spec/functional/resource/apt_package_spec.rb +1 -1
  205. data/spec/functional/resource/chocolatey_package_spec.rb +13 -0
  206. data/spec/functional/resource/dnf_package_spec.rb +4 -1
  207. data/spec/functional/resource/group_spec.rb +1 -5
  208. data/spec/functional/resource/link_spec.rb +0 -8
  209. data/spec/functional/resource/registry_spec.rb +8 -8
  210. data/spec/functional/resource/user/mac_user_spec.rb +2 -2
  211. data/spec/functional/resource/windows_certificate_spec.rb +92 -35
  212. data/spec/functional/version_spec.rb +1 -1
  213. data/spec/functional/win32/registry_spec.rb +1 -1
  214. data/spec/integration/client/client_spec.rb +5 -2
  215. data/spec/integration/client/exit_code_spec.rb +1 -1
  216. data/spec/integration/client/ipv6_spec.rb +1 -1
  217. data/spec/integration/compliance/compliance_spec.rb +1 -1
  218. data/spec/integration/ohai/ohai_spec.rb +7 -6
  219. data/spec/integration/recipes/accumulator_spec.rb +13 -1
  220. data/spec/integration/recipes/lwrp_inline_resources_spec.rb +5 -1
  221. data/spec/integration/recipes/lwrp_spec.rb +3 -1
  222. data/spec/integration/recipes/notifies_spec.rb +15 -1
  223. data/spec/integration/recipes/notifying_block_spec.rb +2 -1
  224. data/spec/integration/recipes/recipe_dsl_spec.rb +9 -9
  225. data/spec/integration/recipes/unified_mode_spec.rb +1 -1
  226. data/spec/integration/recipes/use_partial_spec.rb +4 -1
  227. data/spec/spec_helper.rb +10 -13
  228. data/spec/support/chef_helpers.rb +0 -16
  229. data/spec/support/lib/chef/resource/with_state.rb +0 -1
  230. data/spec/support/lib/chef/resource/zen_follower.rb +0 -1
  231. data/spec/support/lib/chef/resource/zen_master.rb +0 -1
  232. data/spec/support/matchers/leak.rb +7 -9
  233. data/spec/support/platform_helpers.rb +1 -8
  234. data/spec/support/shared/integration/integration_helper.rb +0 -1
  235. data/spec/support/shared/unit/script_resource.rb +2 -2
  236. data/spec/unit/application/solo_spec.rb +2 -2
  237. data/spec/unit/chef_fs/diff_spec.rb +1 -1
  238. data/spec/unit/chef_fs/file_system_spec.rb +1 -1
  239. data/spec/unit/compliance/fetcher/automate_spec.rb +0 -16
  240. data/spec/unit/compliance/reporter/automate_spec.rb +26 -2
  241. data/spec/unit/compliance/reporter/chef_server_automate_spec.rb +20 -0
  242. data/spec/unit/compliance/reporter/compliance_enforcer_spec.rb +1 -0
  243. data/spec/unit/compliance/runner_spec.rb +30 -4
  244. data/spec/unit/cookbook_version_spec.rb +0 -52
  245. data/spec/unit/data_bag_item_spec.rb +1 -6
  246. data/spec/unit/data_collector_spec.rb +1 -47
  247. data/spec/unit/dsl/reboot_pending_spec.rb +2 -2
  248. data/spec/unit/dsl/registry_helper_spec.rb +1 -1
  249. data/spec/unit/lwrp_spec.rb +1 -1
  250. data/spec/unit/mixin/params_validate_spec.rb +4 -3
  251. data/spec/unit/node/attribute_spec.rb +1 -1
  252. data/spec/unit/node_spec.rb +78 -0
  253. data/spec/unit/org_group_spec.rb +45 -0
  254. data/spec/unit/policy_builder/policyfile_spec.rb +1 -11
  255. data/spec/unit/property_spec.rb +23 -22
  256. data/spec/unit/provider/cron_spec.rb +1 -1
  257. data/spec/unit/provider/group/gpasswd_spec.rb +2 -2
  258. data/spec/unit/provider/group/groupmod_spec.rb +2 -2
  259. data/spec/unit/provider/group/pw_spec.rb +2 -2
  260. data/spec/unit/provider/group_spec.rb +1 -1
  261. data/spec/unit/provider/package/apt_spec.rb +84 -18
  262. data/spec/unit/provider/package/deb_spec.rb +3 -3
  263. data/spec/unit/provider/package/powershell_spec.rb +12 -74
  264. data/spec/unit/provider/package/rubygems_spec.rb +18 -30
  265. data/spec/unit/provider/service/arch_service_spec.rb +1 -0
  266. data/spec/unit/provider/service/debian_service_spec.rb +1 -0
  267. data/spec/unit/provider/service/macosx_spec.rb +2 -2
  268. data/spec/unit/provider/service/systemd_service_spec.rb +138 -23
  269. data/spec/unit/provider/service/upstart_service_spec.rb +0 -29
  270. data/spec/unit/provider/service/windows_spec.rb +2 -2
  271. data/spec/unit/provider/subversion_spec.rb +2 -2
  272. data/spec/unit/provider/systemd_unit_spec.rb +79 -60
  273. data/spec/unit/provider/zypper_repository_spec.rb +2 -2
  274. data/spec/unit/provider_spec.rb +0 -8
  275. data/spec/unit/resource/homebrew_cask_spec.rb +11 -29
  276. data/spec/unit/resource/mount_spec.rb +0 -10
  277. data/spec/unit/resource/powershell_script_spec.rb +2 -2
  278. data/spec/unit/resource/rhsm_subscription_spec.rb +3 -50
  279. data/spec/unit/resource/systemd_unit_spec.rb +1 -1
  280. data/spec/unit/resource/user_ulimit_spec.rb +1 -14
  281. data/spec/unit/resource/windows_task_spec.rb +1 -1
  282. data/spec/unit/user_spec.rb +1 -1
  283. data/spec/unit/user_v1_spec.rb +6 -4
  284. data/tasks/rspec.rb +15 -7
  285. metadata +17 -380
  286. data/bin/knife +0 -24
  287. data/lib/chef/application/knife.rb +0 -234
  288. data/lib/chef/application/windows_service.rb +0 -338
  289. data/lib/chef/application/windows_service_manager.rb +0 -205
  290. data/lib/chef/chef_fs/knife.rb +0 -160
  291. data/lib/chef/chef_fs/parallelizer/flatten_enumerable.rb +0 -35
  292. data/lib/chef/chef_fs/parallelizer/parallel_enumerable.rb +0 -278
  293. data/lib/chef/chef_fs/parallelizer.rb +0 -102
  294. data/lib/chef/cookbook_site_streaming_uploader.rb +0 -244
  295. data/lib/chef/knife/acl_add.rb +0 -57
  296. data/lib/chef/knife/acl_base.rb +0 -183
  297. data/lib/chef/knife/acl_bulk_add.rb +0 -78
  298. data/lib/chef/knife/acl_bulk_remove.rb +0 -83
  299. data/lib/chef/knife/acl_remove.rb +0 -62
  300. data/lib/chef/knife/acl_show.rb +0 -56
  301. data/lib/chef/knife/bootstrap/chef_vault_handler.rb +0 -162
  302. data/lib/chef/knife/bootstrap/client_builder.rb +0 -212
  303. data/lib/chef/knife/bootstrap/templates/README.md +0 -11
  304. data/lib/chef/knife/bootstrap/templates/chef-full.erb +0 -242
  305. data/lib/chef/knife/bootstrap/templates/windows-chef-client-msi.erb +0 -278
  306. data/lib/chef/knife/bootstrap/train_connector.rb +0 -336
  307. data/lib/chef/knife/bootstrap.rb +0 -1192
  308. data/lib/chef/knife/client_bulk_delete.rb +0 -104
  309. data/lib/chef/knife/client_create.rb +0 -101
  310. data/lib/chef/knife/client_delete.rb +0 -62
  311. data/lib/chef/knife/client_edit.rb +0 -52
  312. data/lib/chef/knife/client_key_create.rb +0 -73
  313. data/lib/chef/knife/client_key_delete.rb +0 -80
  314. data/lib/chef/knife/client_key_edit.rb +0 -83
  315. data/lib/chef/knife/client_key_list.rb +0 -73
  316. data/lib/chef/knife/client_key_show.rb +0 -80
  317. data/lib/chef/knife/client_list.rb +0 -41
  318. data/lib/chef/knife/client_reregister.rb +0 -58
  319. data/lib/chef/knife/client_show.rb +0 -48
  320. data/lib/chef/knife/config_get.rb +0 -39
  321. data/lib/chef/knife/config_get_profile.rb +0 -37
  322. data/lib/chef/knife/config_list.rb +0 -139
  323. data/lib/chef/knife/config_list_profiles.rb +0 -37
  324. data/lib/chef/knife/config_show.rb +0 -127
  325. data/lib/chef/knife/config_use.rb +0 -61
  326. data/lib/chef/knife/config_use_profile.rb +0 -47
  327. data/lib/chef/knife/configure.rb +0 -150
  328. data/lib/chef/knife/configure_client.rb +0 -48
  329. data/lib/chef/knife/cookbook_bulk_delete.rb +0 -71
  330. data/lib/chef/knife/cookbook_delete.rb +0 -151
  331. data/lib/chef/knife/cookbook_download.rb +0 -142
  332. data/lib/chef/knife/cookbook_list.rb +0 -47
  333. data/lib/chef/knife/cookbook_metadata.rb +0 -106
  334. data/lib/chef/knife/cookbook_metadata_from_file.rb +0 -49
  335. data/lib/chef/knife/cookbook_show.rb +0 -98
  336. data/lib/chef/knife/cookbook_upload.rb +0 -292
  337. data/lib/chef/knife/core/bootstrap_context.rb +0 -264
  338. data/lib/chef/knife/core/cookbook_scm_repo.rb +0 -159
  339. data/lib/chef/knife/core/formatting_options.rb +0 -49
  340. data/lib/chef/knife/core/gem_glob_loader.rb +0 -138
  341. data/lib/chef/knife/core/generic_presenter.rb +0 -232
  342. data/lib/chef/knife/core/hashed_command_loader.rb +0 -100
  343. data/lib/chef/knife/core/node_editor.rb +0 -130
  344. data/lib/chef/knife/core/node_presenter.rb +0 -133
  345. data/lib/chef/knife/core/object_loader.rb +0 -115
  346. data/lib/chef/knife/core/status_presenter.rb +0 -147
  347. data/lib/chef/knife/core/subcommand_loader.rb +0 -203
  348. data/lib/chef/knife/core/text_formatter.rb +0 -85
  349. data/lib/chef/knife/core/ui.rb +0 -338
  350. data/lib/chef/knife/core/windows_bootstrap_context.rb +0 -405
  351. data/lib/chef/knife/data_bag_create.rb +0 -81
  352. data/lib/chef/knife/data_bag_delete.rb +0 -49
  353. data/lib/chef/knife/data_bag_edit.rb +0 -74
  354. data/lib/chef/knife/data_bag_from_file.rb +0 -113
  355. data/lib/chef/knife/data_bag_list.rb +0 -42
  356. data/lib/chef/knife/data_bag_secret_options.rb +0 -122
  357. data/lib/chef/knife/data_bag_show.rb +0 -69
  358. data/lib/chef/knife/delete.rb +0 -125
  359. data/lib/chef/knife/deps.rb +0 -156
  360. data/lib/chef/knife/diff.rb +0 -83
  361. data/lib/chef/knife/download.rb +0 -84
  362. data/lib/chef/knife/edit.rb +0 -88
  363. data/lib/chef/knife/environment_compare.rb +0 -128
  364. data/lib/chef/knife/environment_create.rb +0 -52
  365. data/lib/chef/knife/environment_delete.rb +0 -44
  366. data/lib/chef/knife/environment_edit.rb +0 -44
  367. data/lib/chef/knife/environment_from_file.rb +0 -84
  368. data/lib/chef/knife/environment_list.rb +0 -41
  369. data/lib/chef/knife/environment_show.rb +0 -47
  370. data/lib/chef/knife/exec.rb +0 -99
  371. data/lib/chef/knife/group_add.rb +0 -55
  372. data/lib/chef/knife/group_create.rb +0 -49
  373. data/lib/chef/knife/group_destroy.rb +0 -53
  374. data/lib/chef/knife/group_list.rb +0 -43
  375. data/lib/chef/knife/group_remove.rb +0 -56
  376. data/lib/chef/knife/group_show.rb +0 -49
  377. data/lib/chef/knife/key_create.rb +0 -112
  378. data/lib/chef/knife/key_create_base.rb +0 -50
  379. data/lib/chef/knife/key_delete.rb +0 -55
  380. data/lib/chef/knife/key_edit.rb +0 -118
  381. data/lib/chef/knife/key_edit_base.rb +0 -55
  382. data/lib/chef/knife/key_list.rb +0 -90
  383. data/lib/chef/knife/key_list_base.rb +0 -45
  384. data/lib/chef/knife/key_show.rb +0 -53
  385. data/lib/chef/knife/list.rb +0 -177
  386. data/lib/chef/knife/node_bulk_delete.rb +0 -75
  387. data/lib/chef/knife/node_create.rb +0 -47
  388. data/lib/chef/knife/node_delete.rb +0 -46
  389. data/lib/chef/knife/node_edit.rb +0 -70
  390. data/lib/chef/knife/node_environment_set.rb +0 -53
  391. data/lib/chef/knife/node_from_file.rb +0 -51
  392. data/lib/chef/knife/node_list.rb +0 -44
  393. data/lib/chef/knife/node_policy_set.rb +0 -79
  394. data/lib/chef/knife/node_run_list_add.rb +0 -104
  395. data/lib/chef/knife/node_run_list_remove.rb +0 -67
  396. data/lib/chef/knife/node_run_list_set.rb +0 -66
  397. data/lib/chef/knife/node_show.rb +0 -63
  398. data/lib/chef/knife/null.rb +0 -12
  399. data/lib/chef/knife/raw.rb +0 -123
  400. data/lib/chef/knife/recipe_list.rb +0 -32
  401. data/lib/chef/knife/rehash.rb +0 -50
  402. data/lib/chef/knife/role_bulk_delete.rb +0 -66
  403. data/lib/chef/knife/role_create.rb +0 -53
  404. data/lib/chef/knife/role_delete.rb +0 -46
  405. data/lib/chef/knife/role_edit.rb +0 -45
  406. data/lib/chef/knife/role_env_run_list_add.rb +0 -87
  407. data/lib/chef/knife/role_env_run_list_clear.rb +0 -55
  408. data/lib/chef/knife/role_env_run_list_remove.rb +0 -57
  409. data/lib/chef/knife/role_env_run_list_replace.rb +0 -60
  410. data/lib/chef/knife/role_env_run_list_set.rb +0 -70
  411. data/lib/chef/knife/role_from_file.rb +0 -51
  412. data/lib/chef/knife/role_list.rb +0 -42
  413. data/lib/chef/knife/role_run_list_add.rb +0 -87
  414. data/lib/chef/knife/role_run_list_clear.rb +0 -55
  415. data/lib/chef/knife/role_run_list_remove.rb +0 -56
  416. data/lib/chef/knife/role_run_list_replace.rb +0 -60
  417. data/lib/chef/knife/role_run_list_set.rb +0 -69
  418. data/lib/chef/knife/role_show.rb +0 -48
  419. data/lib/chef/knife/search.rb +0 -194
  420. data/lib/chef/knife/serve.rb +0 -65
  421. data/lib/chef/knife/show.rb +0 -72
  422. data/lib/chef/knife/ssh.rb +0 -645
  423. data/lib/chef/knife/ssl_check.rb +0 -284
  424. data/lib/chef/knife/ssl_fetch.rb +0 -161
  425. data/lib/chef/knife/status.rb +0 -95
  426. data/lib/chef/knife/supermarket_download.rb +0 -121
  427. data/lib/chef/knife/supermarket_install.rb +0 -192
  428. data/lib/chef/knife/supermarket_list.rb +0 -76
  429. data/lib/chef/knife/supermarket_search.rb +0 -53
  430. data/lib/chef/knife/supermarket_share.rb +0 -166
  431. data/lib/chef/knife/supermarket_show.rb +0 -66
  432. data/lib/chef/knife/supermarket_unshare.rb +0 -61
  433. data/lib/chef/knife/tag_create.rb +0 -52
  434. data/lib/chef/knife/tag_delete.rb +0 -60
  435. data/lib/chef/knife/tag_list.rb +0 -47
  436. data/lib/chef/knife/upload.rb +0 -86
  437. data/lib/chef/knife/user_create.rb +0 -107
  438. data/lib/chef/knife/user_delete.rb +0 -44
  439. data/lib/chef/knife/user_dissociate.rb +0 -42
  440. data/lib/chef/knife/user_edit.rb +0 -52
  441. data/lib/chef/knife/user_invite_add.rb +0 -43
  442. data/lib/chef/knife/user_invite_list.rb +0 -34
  443. data/lib/chef/knife/user_invite_rescind.rb +0 -63
  444. data/lib/chef/knife/user_key_create.rb +0 -73
  445. data/lib/chef/knife/user_key_delete.rb +0 -80
  446. data/lib/chef/knife/user_key_edit.rb +0 -83
  447. data/lib/chef/knife/user_key_list.rb +0 -73
  448. data/lib/chef/knife/user_key_show.rb +0 -80
  449. data/lib/chef/knife/user_list.rb +0 -42
  450. data/lib/chef/knife/user_reregister.rb +0 -59
  451. data/lib/chef/knife/user_show.rb +0 -48
  452. data/lib/chef/knife/xargs.rb +0 -282
  453. data/lib/chef/knife/yaml_convert.rb +0 -91
  454. data/lib/chef/knife.rb +0 -665
  455. data/lib/chef/resource/user/dscl_user.rb +0 -35
  456. data/spec/data/knife-home/.chef/plugins/knife/example_home_subcommand.rb +0 -0
  457. data/spec/data/knife-site-subcommands/plugins/knife/example_subcommand.rb +0 -0
  458. data/spec/data/knife_subcommand/test_explicit_category.rb +0 -7
  459. data/spec/data/knife_subcommand/test_name_mapping.rb +0 -4
  460. data/spec/data/knife_subcommand/test_yourself.rb +0 -21
  461. data/spec/functional/knife/configure_spec.rb +0 -33
  462. data/spec/functional/knife/cookbook_delete_spec.rb +0 -156
  463. data/spec/functional/knife/exec_spec.rb +0 -55
  464. data/spec/functional/knife/rehash_spec.rb +0 -39
  465. data/spec/functional/knife/smoke_test.rb +0 -42
  466. data/spec/functional/knife/ssh_spec.rb +0 -352
  467. data/spec/functional/resource/user/dscl_spec.rb +0 -188
  468. data/spec/functional/resource/windows_service_spec.rb +0 -105
  469. data/spec/functional/win32/service_manager_spec.rb +0 -220
  470. data/spec/integration/knife/chef_fs_data_store_spec.rb +0 -557
  471. data/spec/integration/knife/chef_repo_path_spec.rb +0 -962
  472. data/spec/integration/knife/chef_repository_file_system_spec.rb +0 -200
  473. data/spec/integration/knife/chefignore_spec.rb +0 -301
  474. data/spec/integration/knife/client_bulk_delete_spec.rb +0 -131
  475. data/spec/integration/knife/client_create_spec.rb +0 -70
  476. data/spec/integration/knife/client_delete_spec.rb +0 -64
  477. data/spec/integration/knife/client_key_create_spec.rb +0 -66
  478. data/spec/integration/knife/client_key_delete_spec.rb +0 -43
  479. data/spec/integration/knife/client_key_list_spec.rb +0 -61
  480. data/spec/integration/knife/client_key_show_spec.rb +0 -45
  481. data/spec/integration/knife/client_list_spec.rb +0 -49
  482. data/spec/integration/knife/client_show_spec.rb +0 -37
  483. data/spec/integration/knife/common_options_spec.rb +0 -174
  484. data/spec/integration/knife/config_list_spec.rb +0 -220
  485. data/spec/integration/knife/config_show_spec.rb +0 -192
  486. data/spec/integration/knife/config_use_spec.rb +0 -198
  487. data/spec/integration/knife/cookbook_api_ipv6_spec.rb +0 -113
  488. data/spec/integration/knife/cookbook_bulk_delete_spec.rb +0 -65
  489. data/spec/integration/knife/cookbook_download_spec.rb +0 -72
  490. data/spec/integration/knife/cookbook_list_spec.rb +0 -55
  491. data/spec/integration/knife/cookbook_show_spec.rb +0 -149
  492. data/spec/integration/knife/cookbook_upload_spec.rb +0 -128
  493. data/spec/integration/knife/data_bag_create_spec.rb +0 -125
  494. data/spec/integration/knife/data_bag_delete_spec.rb +0 -59
  495. data/spec/integration/knife/data_bag_edit_spec.rb +0 -105
  496. data/spec/integration/knife/data_bag_from_file_spec.rb +0 -116
  497. data/spec/integration/knife/data_bag_list_spec.rb +0 -44
  498. data/spec/integration/knife/data_bag_show_spec.rb +0 -95
  499. data/spec/integration/knife/delete_spec.rb +0 -1018
  500. data/spec/integration/knife/deps_spec.rb +0 -703
  501. data/spec/integration/knife/diff_spec.rb +0 -605
  502. data/spec/integration/knife/download_spec.rb +0 -1336
  503. data/spec/integration/knife/environment_compare_spec.rb +0 -75
  504. data/spec/integration/knife/environment_create_spec.rb +0 -41
  505. data/spec/integration/knife/environment_delete_spec.rb +0 -37
  506. data/spec/integration/knife/environment_from_file_spec.rb +0 -116
  507. data/spec/integration/knife/environment_list_spec.rb +0 -42
  508. data/spec/integration/knife/environment_show_spec.rb +0 -77
  509. data/spec/integration/knife/list_spec.rb +0 -1060
  510. data/spec/integration/knife/node_bulk_delete_spec.rb +0 -52
  511. data/spec/integration/knife/node_create_spec.rb +0 -47
  512. data/spec/integration/knife/node_delete_spec.rb +0 -48
  513. data/spec/integration/knife/node_environment_set_spec.rb +0 -46
  514. data/spec/integration/knife/node_from_file_spec.rb +0 -59
  515. data/spec/integration/knife/node_list_spec.rb +0 -45
  516. data/spec/integration/knife/node_run_list_add_spec.rb +0 -54
  517. data/spec/integration/knife/node_run_list_remove_spec.rb +0 -36
  518. data/spec/integration/knife/node_run_list_set_spec.rb +0 -41
  519. data/spec/integration/knife/node_show_spec.rb +0 -36
  520. data/spec/integration/knife/raw_spec.rb +0 -297
  521. data/spec/integration/knife/redirection_spec.rb +0 -64
  522. data/spec/integration/knife/role_bulk_delete_spec.rb +0 -52
  523. data/spec/integration/knife/role_create_spec.rb +0 -41
  524. data/spec/integration/knife/role_delete_spec.rb +0 -48
  525. data/spec/integration/knife/role_from_file_spec.rb +0 -96
  526. data/spec/integration/knife/role_list_spec.rb +0 -45
  527. data/spec/integration/knife/role_show_spec.rb +0 -51
  528. data/spec/integration/knife/search_node_spec.rb +0 -40
  529. data/spec/integration/knife/serve_spec.rb +0 -92
  530. data/spec/integration/knife/show_spec.rb +0 -197
  531. data/spec/integration/knife/upload_spec.rb +0 -1617
  532. data/spec/support/shared/functional/knife.rb +0 -37
  533. data/spec/support/shared/functional/win32_service.rb +0 -57
  534. data/spec/support/shared/integration/knife_support.rb +0 -192
  535. data/spec/support/shared/unit/knife_shared.rb +0 -39
  536. data/spec/unit/application/knife_spec.rb +0 -241
  537. data/spec/unit/chef_fs/parallelizer_spec.rb +0 -479
  538. data/spec/unit/cookbook_site_streaming_uploader_spec.rb +0 -198
  539. data/spec/unit/knife/bootstrap/chef_vault_handler_spec.rb +0 -152
  540. data/spec/unit/knife/bootstrap/client_builder_spec.rb +0 -207
  541. data/spec/unit/knife/bootstrap/train_connector_spec.rb +0 -244
  542. data/spec/unit/knife/bootstrap_spec.rb +0 -2220
  543. data/spec/unit/knife/client_bulk_delete_spec.rb +0 -166
  544. data/spec/unit/knife/client_create_spec.rb +0 -169
  545. data/spec/unit/knife/client_delete_spec.rb +0 -99
  546. data/spec/unit/knife/client_edit_spec.rb +0 -53
  547. data/spec/unit/knife/client_list_spec.rb +0 -34
  548. data/spec/unit/knife/client_reregister_spec.rb +0 -62
  549. data/spec/unit/knife/client_show_spec.rb +0 -52
  550. data/spec/unit/knife/configure_client_spec.rb +0 -81
  551. data/spec/unit/knife/configure_spec.rb +0 -190
  552. data/spec/unit/knife/cookbook_bulk_delete_spec.rb +0 -87
  553. data/spec/unit/knife/cookbook_delete_spec.rb +0 -239
  554. data/spec/unit/knife/cookbook_download_spec.rb +0 -255
  555. data/spec/unit/knife/cookbook_list_spec.rb +0 -88
  556. data/spec/unit/knife/cookbook_metadata_from_file_spec.rb +0 -72
  557. data/spec/unit/knife/cookbook_metadata_spec.rb +0 -182
  558. data/spec/unit/knife/cookbook_show_spec.rb +0 -253
  559. data/spec/unit/knife/cookbook_upload_spec.rb +0 -364
  560. data/spec/unit/knife/core/bootstrap_context_spec.rb +0 -287
  561. data/spec/unit/knife/core/cookbook_scm_repo_spec.rb +0 -187
  562. data/spec/unit/knife/core/gem_glob_loader_spec.rb +0 -209
  563. data/spec/unit/knife/core/hashed_command_loader_spec.rb +0 -112
  564. data/spec/unit/knife/core/node_editor_spec.rb +0 -211
  565. data/spec/unit/knife/core/object_loader_spec.rb +0 -81
  566. data/spec/unit/knife/core/status_presenter_spec.rb +0 -54
  567. data/spec/unit/knife/core/subcommand_loader_spec.rb +0 -64
  568. data/spec/unit/knife/core/ui_spec.rb +0 -656
  569. data/spec/unit/knife/core/windows_bootstrap_context_spec.rb +0 -238
  570. data/spec/unit/knife/data_bag_create_spec.rb +0 -175
  571. data/spec/unit/knife/data_bag_edit_spec.rb +0 -126
  572. data/spec/unit/knife/data_bag_from_file_spec.rb +0 -174
  573. data/spec/unit/knife/data_bag_secret_options_spec.rb +0 -173
  574. data/spec/unit/knife/data_bag_show_spec.rb +0 -139
  575. data/spec/unit/knife/environment_compare_spec.rb +0 -112
  576. data/spec/unit/knife/environment_create_spec.rb +0 -91
  577. data/spec/unit/knife/environment_delete_spec.rb +0 -71
  578. data/spec/unit/knife/environment_edit_spec.rb +0 -79
  579. data/spec/unit/knife/environment_from_file_spec.rb +0 -90
  580. data/spec/unit/knife/environment_list_spec.rb +0 -54
  581. data/spec/unit/knife/environment_show_spec.rb +0 -52
  582. data/spec/unit/knife/key_create_spec.rb +0 -223
  583. data/spec/unit/knife/key_delete_spec.rb +0 -133
  584. data/spec/unit/knife/key_edit_spec.rb +0 -264
  585. data/spec/unit/knife/key_helper.rb +0 -74
  586. data/spec/unit/knife/key_list_spec.rb +0 -216
  587. data/spec/unit/knife/key_show_spec.rb +0 -126
  588. data/spec/unit/knife/node_bulk_delete_spec.rb +0 -94
  589. data/spec/unit/knife/node_delete_spec.rb +0 -77
  590. data/spec/unit/knife/node_edit_spec.rb +0 -116
  591. data/spec/unit/knife/node_environment_set_spec.rb +0 -61
  592. data/spec/unit/knife/node_from_file_spec.rb +0 -59
  593. data/spec/unit/knife/node_list_spec.rb +0 -62
  594. data/spec/unit/knife/node_policy_set_spec.rb +0 -122
  595. data/spec/unit/knife/node_run_list_add_spec.rb +0 -145
  596. data/spec/unit/knife/node_run_list_remove_spec.rb +0 -106
  597. data/spec/unit/knife/node_run_list_set_spec.rb +0 -115
  598. data/spec/unit/knife/node_show_spec.rb +0 -65
  599. data/spec/unit/knife/raw_spec.rb +0 -43
  600. data/spec/unit/knife/role_bulk_delete_spec.rb +0 -80
  601. data/spec/unit/knife/role_create_spec.rb +0 -80
  602. data/spec/unit/knife/role_delete_spec.rb +0 -67
  603. data/spec/unit/knife/role_edit_spec.rb +0 -77
  604. data/spec/unit/knife/role_env_run_list_add_spec.rb +0 -217
  605. data/spec/unit/knife/role_env_run_list_clear_spec.rb +0 -94
  606. data/spec/unit/knife/role_env_run_list_remove_spec.rb +0 -102
  607. data/spec/unit/knife/role_env_run_list_replace_spec.rb +0 -105
  608. data/spec/unit/knife/role_env_run_list_set_spec.rb +0 -99
  609. data/spec/unit/knife/role_from_file_spec.rb +0 -69
  610. data/spec/unit/knife/role_list_spec.rb +0 -54
  611. data/spec/unit/knife/role_run_list_add_spec.rb +0 -179
  612. data/spec/unit/knife/role_run_list_clear_spec.rb +0 -84
  613. data/spec/unit/knife/role_run_list_remove_spec.rb +0 -92
  614. data/spec/unit/knife/role_run_list_replace_spec.rb +0 -98
  615. data/spec/unit/knife/role_run_list_set_spec.rb +0 -89
  616. data/spec/unit/knife/role_show_spec.rb +0 -59
  617. data/spec/unit/knife/ssh_spec.rb +0 -403
  618. data/spec/unit/knife/ssl_check_spec.rb +0 -256
  619. data/spec/unit/knife/ssl_fetch_spec.rb +0 -222
  620. data/spec/unit/knife/status_spec.rb +0 -112
  621. data/spec/unit/knife/supermarket_download_spec.rb +0 -152
  622. data/spec/unit/knife/supermarket_install_spec.rb +0 -202
  623. data/spec/unit/knife/supermarket_list_spec.rb +0 -70
  624. data/spec/unit/knife/supermarket_search_spec.rb +0 -85
  625. data/spec/unit/knife/supermarket_share_spec.rb +0 -208
  626. data/spec/unit/knife/supermarket_unshare_spec.rb +0 -78
  627. data/spec/unit/knife/tag_create_spec.rb +0 -23
  628. data/spec/unit/knife/tag_delete_spec.rb +0 -25
  629. data/spec/unit/knife/tag_list_spec.rb +0 -23
  630. data/spec/unit/knife/user_create_spec.rb +0 -184
  631. data/spec/unit/knife/user_delete_spec.rb +0 -46
  632. data/spec/unit/knife/user_edit_spec.rb +0 -48
  633. data/spec/unit/knife/user_list_spec.rb +0 -36
  634. data/spec/unit/knife/user_reregister_spec.rb +0 -56
  635. data/spec/unit/knife/user_show_spec.rb +0 -46
  636. data/spec/unit/knife_spec.rb +0 -634
  637. data/spec/unit/provider/user/dscl_spec.rb +0 -699
  638. data/spec/unit/windows_service_spec.rb +0 -118
@@ -1,634 +0,0 @@
1
- #
2
- # Author:: Adam Jacob (<adam@chef.io>)
3
- # Author:: Tim Hinderliter (<tim@chef.io>)
4
- # Copyright:: Copyright (c) Chef Software Inc.
5
- # License:: Apache License, Version 2.0
6
- #
7
- # Licensed under the Apache License, Version 2.0 (the "License");
8
- # you may not use this file except in compliance with the License.
9
- # You may obtain a copy of the License at
10
- #
11
- # http://www.apache.org/licenses/LICENSE-2.0
12
- #
13
- # Unless required by applicable law or agreed to in writing, software
14
- # distributed under the License is distributed on an "AS IS" BASIS,
15
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
- # See the License for the specific language governing permissions and
17
- # limitations under the License.
18
- #
19
-
20
- # Fixtures for subcommand loading live in this namespace
21
- module KnifeSpecs
22
- end
23
-
24
- require "spec_helper"
25
- require "uri"
26
- require "chef/knife/core/gem_glob_loader"
27
-
28
- describe Chef::Knife do
29
-
30
- let(:stderr) { StringIO.new }
31
-
32
- let(:knife) { Chef::Knife.new }
33
-
34
- let(:config_location) { File.expand_path("~/.chef/config.rb") }
35
-
36
- let(:config_loader) do
37
- instance_double("WorkstationConfigLoader",
38
- load: nil, no_config_found?: false,
39
- config_location: config_location,
40
- chef_config_dir: "/etc/chef")
41
- end
42
-
43
- before(:each) do
44
- Chef::Log.logger = Logger.new(StringIO.new)
45
-
46
- Chef::Config[:node_name] = "webmonkey.example.com"
47
-
48
- allow(Chef::WorkstationConfigLoader).to receive(:new).and_return(config_loader)
49
- allow(config_loader).to receive(:explicit_config_file=)
50
- allow(config_loader).to receive(:profile=)
51
-
52
- # Prevent gratuitous code reloading:
53
- allow(Chef::Knife).to receive(:load_commands)
54
- allow(knife.ui).to receive(:puts)
55
- allow(knife.ui).to receive(:print)
56
- allow(Chef::Log).to receive(:init)
57
- allow(Chef::Log).to receive(:level)
58
- %i{debug info warn error crit}.each do |level_sym|
59
- allow(Chef::Log).to receive(level_sym)
60
- end
61
- allow(Chef::Knife).to receive(:puts)
62
- end
63
-
64
- after(:each) do
65
- Chef::Knife.reset_config_loader!
66
- end
67
-
68
- it "does not reset Chef::Config[:verbosity to nil if config[:verbosity] is nil" do
69
- Chef::Config[:verbosity] = 2
70
- Chef::Knife.new
71
- expect(Chef::Config[:verbosity]).to eq(2)
72
- end
73
-
74
- describe "after loading a subcommand" do
75
- before do
76
- Chef::Knife.reset_subcommands!
77
-
78
- if KnifeSpecs.const_defined?(:TestNameMapping)
79
- KnifeSpecs.send(:remove_const, :TestNameMapping)
80
- end
81
-
82
- if KnifeSpecs.const_defined?(:TestExplicitCategory)
83
- KnifeSpecs.send(:remove_const, :TestExplicitCategory)
84
- end
85
-
86
- Kernel.load(File.join(CHEF_SPEC_DATA, "knife_subcommand", "test_name_mapping.rb"))
87
- Kernel.load(File.join(CHEF_SPEC_DATA, "knife_subcommand", "test_explicit_category.rb"))
88
- end
89
-
90
- it "has a category based on its name" do
91
- expect(KnifeSpecs::TestNameMapping.subcommand_category).to eq("test")
92
- end
93
-
94
- it "has an explicitly defined category if set" do
95
- expect(KnifeSpecs::TestExplicitCategory.subcommand_category).to eq("cookbook site")
96
- end
97
-
98
- it "can reference the subcommand by its snake cased name" do
99
- expect(Chef::Knife.subcommands["test_name_mapping"]).to equal(KnifeSpecs::TestNameMapping)
100
- end
101
-
102
- it "lists subcommands by category" do
103
- expect(Chef::Knife.subcommands_by_category["test"]).to include("test_name_mapping")
104
- end
105
-
106
- it "lists subcommands by category when the subcommands have explicit categories" do
107
- expect(Chef::Knife.subcommands_by_category["cookbook site"]).to include("test_explicit_category")
108
- end
109
-
110
- it "has empty dependency_loader list by default" do
111
- expect(KnifeSpecs::TestNameMapping.dependency_loaders).to be_empty
112
- end
113
- end
114
-
115
- describe "after loading all subcommands" do
116
- before do
117
- Chef::Knife.reset_subcommands!
118
- Chef::Knife.load_commands
119
- end
120
-
121
- it "references a subcommand class by its snake cased name" do
122
- class SuperAwesomeCommand < Chef::Knife
123
- end
124
-
125
- Chef::Knife.load_commands
126
-
127
- expect(Chef::Knife.subcommands).to have_key("super_awesome_command")
128
- expect(Chef::Knife.subcommands["super_awesome_command"]).to eq(SuperAwesomeCommand)
129
- end
130
-
131
- it "records the location of ChefFS-based commands correctly" do
132
- class AwesomeCheffsCommand < Chef::ChefFS::Knife
133
- end
134
-
135
- Chef::Knife.load_commands
136
- expect(Chef::Knife.subcommand_files["awesome_cheffs_command"]).to eq([__FILE__])
137
- end
138
-
139
- it "guesses a category from a given ARGV" do
140
- Chef::Knife.subcommands_by_category["cookbook"] << :cookbook
141
- Chef::Knife.subcommands_by_category["cookbook site"] << :cookbook_site
142
- expect(Chef::Knife.guess_category(%w{cookbook foo bar baz})).to eq("cookbook")
143
- expect(Chef::Knife.guess_category(%w{cookbook site foo bar baz})).to eq("cookbook site")
144
- expect(Chef::Knife.guess_category(%w{cookbook site --help})).to eq("cookbook site")
145
- end
146
-
147
- it "finds a subcommand class based on ARGV" do
148
- Chef::Knife.subcommands["cookbook_site_install"] = :CookbookSiteInstall
149
- Chef::Knife.subcommands["cookbook"] = :Cookbook
150
- expect(Chef::Knife.subcommand_class_from(%w{cookbook site install --help foo bar baz})).to eq(:CookbookSiteInstall)
151
- end
152
-
153
- it "special case sets the subcommand_loader to GemGlobLoader when running rehash" do
154
- Chef::Knife.subcommands["rehash"] = :Rehash
155
- expect(Chef::Knife.subcommand_class_from(%w{rehash })).to eq(:Rehash)
156
- expect(Chef::Knife.subcommand_loader).to be_a(Chef::Knife::SubcommandLoader::GemGlobLoader)
157
- end
158
-
159
- end
160
-
161
- describe "the headers include X-Remote-Request-Id" do
162
-
163
- let(:headers) do
164
- { "Accept" => "application/json",
165
- "Accept-Encoding" => "gzip;q=1.0,deflate;q=0.6,identity;q=0.3",
166
- "X-Chef-Version" => Chef::VERSION,
167
- "Host" => "api.opscode.piab",
168
- "X-REMOTE-REQUEST-ID" => request_id,
169
- }
170
- end
171
-
172
- let(:request_id) { "1234" }
173
-
174
- let(:request_mock) { {} }
175
-
176
- let(:rest) do
177
- allow(Net::HTTP).to receive(:new).and_return(http_client)
178
- allow(Chef::RequestID.instance).to receive(:request_id).and_return(request_id)
179
- allow(Chef::Config).to receive(:chef_server_url).and_return("https://api.opscode.piab")
180
- command = Chef::Knife.run(%w{test yourself})
181
- rest = command.noauth_rest
182
- rest
183
- end
184
-
185
- let!(:http_client) do
186
- http_client = Net::HTTP.new(url.host, url.port)
187
- allow(http_client).to receive(:request).and_yield(http_response).and_return(http_response)
188
- http_client
189
- end
190
-
191
- let(:url) { URI.parse("https://api.opscode.piab") }
192
-
193
- let(:http_response) do
194
- http_response = Net::HTTPSuccess.new("1.1", "200", "successful rest req")
195
- allow(http_response).to receive(:read_body)
196
- allow(http_response).to receive(:body).and_return(body)
197
- http_response["Content-Length"] = body.bytesize.to_s
198
- http_response
199
- end
200
-
201
- let(:body) { "ninja" }
202
-
203
- before(:each) do
204
- Chef::Config[:chef_server_url] = "https://api.opscode.piab"
205
- if KnifeSpecs.const_defined?(:TestYourself)
206
- KnifeSpecs.send :remove_const, :TestYourself
207
- end
208
- Kernel.load(File.join(CHEF_SPEC_DATA, "knife_subcommand", "test_yourself.rb"))
209
- Chef::Knife.subcommands.each { |name, klass| Chef::Knife.subcommands.delete(name) unless klass.is_a?(Class) }
210
- end
211
-
212
- it "confirms that the headers include X-Remote-Request-Id" do
213
- expect(Net::HTTP::Get).to receive(:new).with("/monkey", headers).and_return(request_mock)
214
- rest.get("monkey")
215
- end
216
- end
217
-
218
- describe "when running a command" do
219
- before(:each) do
220
- if KnifeSpecs.const_defined?(:TestYourself)
221
- KnifeSpecs.send :remove_const, :TestYourself
222
- end
223
- Kernel.load(File.join(CHEF_SPEC_DATA, "knife_subcommand", "test_yourself.rb"))
224
- Chef::Knife.subcommands.each { |name, klass| Chef::Knife.subcommands.delete(name) unless klass.is_a?(Class) }
225
- end
226
-
227
- it "merges the global knife CLI options" do
228
- extra_opts = {}
229
- extra_opts[:editor] = { long: "--editor EDITOR",
230
- description: "Set the editor to use for interactive commands",
231
- short: "-e EDITOR",
232
- default: "/usr/bin/vim" }
233
-
234
- # there is special hackery to return the subcommand instance going on here.
235
- command = Chef::Knife.run(%w{test yourself}, extra_opts)
236
- editor_opts = command.options[:editor]
237
- expect(editor_opts[:long]).to eq("--editor EDITOR")
238
- expect(editor_opts[:description]).to eq("Set the editor to use for interactive commands")
239
- expect(editor_opts[:short]).to eq("-e EDITOR")
240
- expect(editor_opts[:default]).to eq("/usr/bin/vim")
241
- end
242
-
243
- it "creates an instance of the subcommand and runs it" do
244
- command = Chef::Knife.run(%w{test yourself})
245
- expect(command).to be_an_instance_of(KnifeSpecs::TestYourself)
246
- expect(command.ran).to be_truthy
247
- end
248
-
249
- it "passes the command specific args to the subcommand" do
250
- command = Chef::Knife.run(%w{test yourself with some args})
251
- expect(command.name_args).to eq(%w{with some args})
252
- end
253
-
254
- it "excludes the command name from the name args when parts are joined with underscores" do
255
- command = Chef::Knife.run(%w{test_yourself with some args})
256
- expect(command.name_args).to eq(%w{with some args})
257
- end
258
-
259
- it "exits if no subcommand matches the CLI args" do
260
- stdout = StringIO.new
261
-
262
- allow(Chef::Knife.ui).to receive(:stderr).and_return(stderr)
263
- allow(Chef::Knife.ui).to receive(:stdout).and_return(stdout)
264
- expect(Chef::Knife.ui).to receive(:fatal)
265
- expect { Chef::Knife.run(%w{fuuu uuuu fuuuu}) }.to raise_error(SystemExit) { |e| expect(e.status).not_to eq(0) }
266
- end
267
-
268
- it "loads lazy dependencies" do
269
- Chef::Knife.run(%w{test yourself})
270
- expect(KnifeSpecs::TestYourself.test_deps_loaded).to be_truthy
271
- end
272
-
273
- it "loads lazy dependencies from multiple deps calls" do
274
- other_deps_loaded = false
275
- KnifeSpecs::TestYourself.class_eval do
276
- deps { other_deps_loaded = true }
277
- end
278
-
279
- Chef::Knife.run(%w{test yourself})
280
- expect(KnifeSpecs::TestYourself.test_deps_loaded).to be_truthy
281
- expect(other_deps_loaded).to be_truthy
282
- end
283
-
284
- describe "working with unmerged configuration in #config_source" do
285
- let(:command) { KnifeSpecs::TestYourself.new([]) }
286
-
287
- before do
288
- KnifeSpecs::TestYourself.option(:opt_with_default,
289
- short: "-D VALUE",
290
- default: "default-value")
291
- end
292
- # This supports a use case used by plugins, where the pattern
293
- # seems to follow:
294
- # cmd = KnifeCommand.new
295
- # cmd.config[:config_key] = value
296
- # cmd.run
297
- #
298
- # This bypasses Knife::run and the `merge_configs` call it
299
- # performs - config_source should break when that happens.
300
- context "when config is fed in directly without a merge" do
301
- it "retains the value but returns nil as a config source" do
302
- command.config[:test1] = "value"
303
- expect(command.config[:test1]).to eq "value"
304
- expect(command.config_source(:test1)).to eq nil
305
- end
306
- end
307
-
308
- end
309
- describe "merging configuration options" do
310
- before do
311
- KnifeSpecs::TestYourself.option(:opt_with_default,
312
- short: "-D VALUE",
313
- default: "default-value")
314
- end
315
-
316
- it "sets the default log_location to STDERR for Chef::Log warnings" do
317
- knife_command = KnifeSpecs::TestYourself.new([])
318
- knife_command.configure_chef
319
- expect(Chef::Config[:log_location]).to eq(STDERR)
320
- end
321
-
322
- it "sets the default log_level to warn so we can issue Chef::Log.warn" do
323
- knife_command = KnifeSpecs::TestYourself.new([])
324
- knife_command.configure_chef
325
- expect(Chef::Config[:log_level]).to eql(:warn)
326
- end
327
-
328
- it "prefers the default value from option definition if no config or command line value is present and reports the source as default" do
329
- knife_command = KnifeSpecs::TestYourself.new([]) # empty argv
330
- knife_command.configure_chef
331
- expect(knife_command.config[:opt_with_default]).to eq("default-value")
332
- expect(knife_command.config_source(:opt_with_default)).to eq(:cli_default)
333
- end
334
-
335
- it "prefers a value in Chef::Config[:knife] to the default and reports the source as config" do
336
- Chef::Config[:knife][:opt_with_default] = "from-knife-config"
337
- knife_command = KnifeSpecs::TestYourself.new([]) # empty argv
338
- knife_command.configure_chef
339
- expect(knife_command.config[:opt_with_default]).to eq("from-knife-config")
340
- expect(knife_command.config_source(:opt_with_default)).to eq(:config)
341
- end
342
-
343
- it "prefers a value from command line over Chef::Config and the default and reports the source as CLI" do
344
- knife_command = KnifeSpecs::TestYourself.new(["-D", "from-cli"])
345
- knife_command.configure_chef
346
- expect(knife_command.config[:opt_with_default]).to eq("from-cli")
347
- expect(knife_command.config_source(:opt_with_default)).to eq(:cli)
348
- end
349
-
350
- it "merges `listen` config to Chef::Config" do
351
- knife_command = Chef::Knife.run(%w{test yourself --no-listen}, Chef::Application::Knife.options)
352
- expect(Chef::Config[:listen]).to be(false)
353
- expect(knife_command.config_source(:listen)).to eq(:cli)
354
- end
355
-
356
- it "merges Chef::Config[:knife] values into the config hash even if they have no cli keys" do
357
- Chef::Config[:knife][:opt_with_no_cli_key] = "from-knife-config"
358
- knife_command = KnifeSpecs::TestYourself.new([]) # empty argv
359
- knife_command.configure_chef
360
- expect(knife_command.config[:opt_with_no_cli_key]).to eq("from-knife-config")
361
- expect(knife_command.config_source(:opt_with_no_cli_key)).to eq(:config)
362
- end
363
-
364
- it "merges Chef::Config[:knife] default values into the config hash even if they have no cli keys" do
365
- Chef::Config.config_context :knife do
366
- default :opt_with_no_cli_key, "from-knife-default"
367
- end
368
- knife_command = KnifeSpecs::TestYourself.new([]) # empty argv
369
- knife_command.configure_chef
370
- expect(knife_command.config[:opt_with_no_cli_key]).to eq("from-knife-default")
371
- expect(knife_command.config_source(:opt_with_no_cli_key)).to eq(:config_default)
372
- end
373
-
374
- context "verbosity is one" do
375
- let(:fake_config) { "/does/not/exist/knife.rb" }
376
-
377
- before do
378
- knife.config[:verbosity] = 1
379
- knife.config[:config_file] = fake_config
380
- config_loader = double("Chef::WorkstationConfigLoader", load: true, no_config_found?: false, chef_config_dir: "/etc/chef", config_location: fake_config)
381
- allow(config_loader).to receive(:explicit_config_file=).with(fake_config).and_return(fake_config)
382
- allow(config_loader).to receive(:profile=)
383
- allow(Chef::WorkstationConfigLoader).to receive(:new).and_return(config_loader)
384
- end
385
-
386
- it "prints the path to the configuration file used" do
387
- stdout, stderr, stdin = StringIO.new, StringIO.new, StringIO.new
388
- knife.ui = Chef::Knife::UI.new(stdout, stderr, stdin, {})
389
- expect(Chef::Log).to receive(:info).with("Using configuration from #{fake_config}")
390
- knife.configure_chef
391
- end
392
- end
393
-
394
- # -VV (2) is debug, -VVV (3) is trace
395
- [ 2, 3 ].each do |verbosity|
396
- it "does not humanize the exception if Chef::Config[:verbosity] is #{verbosity}" do
397
- Chef::Config[:verbosity] = verbosity
398
- allow(knife).to receive(:run).and_raise(Exception)
399
- expect(knife).not_to receive(:humanize_exception)
400
- expect { knife.run_with_pretty_exceptions }.to raise_error(Exception)
401
- end
402
- end
403
- end
404
-
405
- describe "setting arbitrary configuration with --config-option" do
406
-
407
- let(:stdout) { StringIO.new }
408
-
409
- let(:stderr) { StringIO.new }
410
-
411
- let(:stdin) { StringIO.new }
412
-
413
- let(:ui) { Chef::Knife::UI.new(stdout, stderr, stdin, disable_editing: true) }
414
-
415
- let(:subcommand) do
416
- KnifeSpecs::TestYourself.options = Chef::Application::Knife.options.merge(KnifeSpecs::TestYourself.options)
417
- KnifeSpecs::TestYourself.new(%w{--config-option badly_formatted_arg}).tap do |cmd|
418
- cmd.ui = ui
419
- end
420
- end
421
-
422
- it "sets arbitrary configuration via --config-option" do
423
- Chef::Knife.run(%w{test yourself --config-option arbitrary_config_thing=hello}, Chef::Application::Knife.options)
424
- expect(Chef::Config[:arbitrary_config_thing]).to eq("hello")
425
- end
426
-
427
- it "handles errors in arbitrary configuration" do
428
- expect(subcommand).to receive(:exit).with(1)
429
- subcommand.configure_chef
430
- expect(stderr.string).to include("ERROR: Unparsable config option \"badly_formatted_arg\"")
431
- expect(stdout.string).to include(subcommand.opt_parser.to_s)
432
- end
433
- end
434
-
435
- end
436
-
437
- describe "when first created" do
438
-
439
- let(:knife) {
440
- Kernel.load "spec/data/knife_subcommand/test_yourself.rb"
441
- KnifeSpecs::TestYourself.new(%w{with some args -s scrogramming})
442
- }
443
-
444
- it "it parses the options passed to it" do
445
- expect(knife.config[:scro]).to eq("scrogramming")
446
- end
447
-
448
- it "extracts its command specific args from the full arg list" do
449
- expect(knife.name_args).to eq(%w{with some args})
450
- end
451
-
452
- it "does not have lazy dependencies loaded" do
453
- skip "unstable with randomization... prolly needs more isolation"
454
-
455
- expect(knife.class.test_deps_loaded).not_to be_truthy
456
- end
457
- end
458
-
459
- describe "when formatting exceptions" do
460
-
461
- let(:stdout) { StringIO.new }
462
- let(:stderr) { StringIO.new }
463
- let(:stdin) { StringIO.new }
464
-
465
- let(:ui) { Chef::Knife::UI.new(stdout, stderr, stdin, {}) }
466
-
467
- before do
468
- knife.ui = ui
469
- expect(knife).to receive(:exit).with(100)
470
- end
471
-
472
- it "formats 401s nicely" do
473
- response = Net::HTTPUnauthorized.new("1.1", "401", "Unauthorized")
474
- response.instance_variable_set(:@read, true) # I hate you, net/http.
475
- allow(response).to receive(:body).and_return(Chef::JSONCompat.to_json(error: "y u no syncronize your clock?"))
476
- allow(knife).to receive(:run).and_raise(Net::HTTPClientException.new("401 Unauthorized", response))
477
- knife.run_with_pretty_exceptions
478
- expect(stderr.string).to match(/ERROR: Failed to authenticate to/)
479
- expect(stderr.string).to match(/Response: y u no syncronize your clock\?/)
480
- end
481
-
482
- it "formats 403s nicely" do
483
- response = Net::HTTPForbidden.new("1.1", "403", "Forbidden")
484
- response.instance_variable_set(:@read, true) # I hate you, net/http.
485
- allow(response).to receive(:body).and_return(Chef::JSONCompat.to_json(error: "y u no administrator"))
486
- allow(knife).to receive(:run).and_raise(Net::HTTPClientException.new("403 Forbidden", response))
487
- allow(knife).to receive(:username).and_return("sadpanda")
488
- knife.run_with_pretty_exceptions
489
- expect(stderr.string).to match(/ERROR: You authenticated successfully to http.+ as sadpanda but you are not authorized for this action/)
490
- expect(stderr.string).to match(/Response: y u no administrator/)
491
- end
492
-
493
- context "when proxy servers are set" do
494
- before do
495
- ENV["http_proxy"] = "xyz"
496
- end
497
-
498
- after do
499
- ENV.delete("http_proxy")
500
- end
501
-
502
- it "formats proxy errors nicely" do
503
- response = Net::HTTPForbidden.new("1.1", "403", "Forbidden")
504
- response.instance_variable_set(:@read, true)
505
- allow(response).to receive(:body).and_return(Chef::JSONCompat.to_json(error: "y u no administrator"))
506
- allow(knife).to receive(:run).and_raise(Net::HTTPClientException.new("403 Forbidden", response))
507
- allow(knife).to receive(:username).and_return("sadpanda")
508
- knife.run_with_pretty_exceptions
509
- expect(stderr.string).to match(/ERROR: You authenticated successfully to http.+ as sadpanda but you are not authorized for this action/)
510
- expect(stderr.string).to match(/ERROR: There are proxy servers configured, your server url may need to be added to NO_PROXY./)
511
- expect(stderr.string).to match(/Response: y u no administrator/)
512
- end
513
- end
514
-
515
- it "formats 400s nicely" do
516
- response = Net::HTTPBadRequest.new("1.1", "400", "Bad Request")
517
- response.instance_variable_set(:@read, true) # I hate you, net/http.
518
- allow(response).to receive(:body).and_return(Chef::JSONCompat.to_json(error: "y u search wrong"))
519
- allow(knife).to receive(:run).and_raise(Net::HTTPClientException.new("400 Bad Request", response))
520
- knife.run_with_pretty_exceptions
521
- expect(stderr.string).to match(/ERROR: The data in your request was invalid/)
522
- expect(stderr.string).to match(/Response: y u search wrong/)
523
- end
524
-
525
- it "formats 404s nicely" do
526
- response = Net::HTTPNotFound.new("1.1", "404", "Not Found")
527
- response.instance_variable_set(:@read, true) # I hate you, net/http.
528
- allow(response).to receive(:body).and_return(Chef::JSONCompat.to_json(error: "nothing to see here"))
529
- allow(knife).to receive(:run).and_raise(Net::HTTPClientException.new("404 Not Found", response))
530
- knife.run_with_pretty_exceptions
531
- expect(stderr.string).to match(/ERROR: The object you are looking for could not be found/)
532
- expect(stderr.string).to match(/Response: nothing to see here/)
533
- end
534
-
535
- it "formats 406s (non-supported API version error) nicely" do
536
- response = Net::HTTPNotAcceptable.new("1.1", "406", "Not Acceptable")
537
- response.instance_variable_set(:@read, true) # I hate you, net/http.
538
-
539
- # set the header
540
- response["x-ops-server-api-version"] = Chef::JSONCompat.to_json(min_version: "0", max_version: "1", request_version: "10000000")
541
-
542
- allow(response).to receive(:body).and_return(Chef::JSONCompat.to_json(error: "sad trombone"))
543
- allow(knife).to receive(:run).and_raise(Net::HTTPClientException.new("406 Not Acceptable", response))
544
-
545
- knife.run_with_pretty_exceptions
546
- expect(stderr.string).to match(/The request that .* sent was using API version 10000000./)
547
- expect(stderr.string).to match(/The server you sent the request to supports a min API version of 0 and a max API version of 1./)
548
- expect(stderr.string).to match(/Please either update your .* or the server to be a compatible set./)
549
- end
550
-
551
- it "formats 500s nicely" do
552
- response = Net::HTTPInternalServerError.new("1.1", "500", "Internal Server Error")
553
- response.instance_variable_set(:@read, true) # I hate you, net/http.
554
- allow(response).to receive(:body).and_return(Chef::JSONCompat.to_json(error: "sad trombone"))
555
- allow(knife).to receive(:run).and_raise(Net::HTTPFatalError.new("500 Internal Server Error", response))
556
- knife.run_with_pretty_exceptions
557
- expect(stderr.string).to match(/ERROR: internal server error/)
558
- expect(stderr.string).to match(/Response: sad trombone/)
559
- end
560
-
561
- it "formats 502s nicely" do
562
- response = Net::HTTPBadGateway.new("1.1", "502", "Bad Gateway")
563
- response.instance_variable_set(:@read, true) # I hate you, net/http.
564
- allow(response).to receive(:body).and_return(Chef::JSONCompat.to_json(error: "sadder trombone"))
565
- allow(knife).to receive(:run).and_raise(Net::HTTPFatalError.new("502 Bad Gateway", response))
566
- knife.run_with_pretty_exceptions
567
- expect(stderr.string).to match(/ERROR: bad gateway/)
568
- expect(stderr.string).to match(/Response: sadder trombone/)
569
- end
570
-
571
- it "formats 503s nicely" do
572
- response = Net::HTTPServiceUnavailable.new("1.1", "503", "Service Unavailable")
573
- response.instance_variable_set(:@read, true) # I hate you, net/http.
574
- allow(response).to receive(:body).and_return(Chef::JSONCompat.to_json(error: "saddest trombone"))
575
- allow(knife).to receive(:run).and_raise(Net::HTTPFatalError.new("503 Service Unavailable", response))
576
- knife.run_with_pretty_exceptions
577
- expect(stderr.string).to match(/ERROR: Service temporarily unavailable/)
578
- expect(stderr.string).to match(/Response: saddest trombone/)
579
- end
580
-
581
- it "formats other HTTP errors nicely" do
582
- response = Net::HTTPPaymentRequired.new("1.1", "402", "Payment Required")
583
- response.instance_variable_set(:@read, true) # I hate you, net/http.
584
- allow(response).to receive(:body).and_return(Chef::JSONCompat.to_json(error: "nobugfixtillyoubuy"))
585
- allow(knife).to receive(:run).and_raise(Net::HTTPClientException.new("402 Payment Required", response))
586
- knife.run_with_pretty_exceptions
587
- expect(stderr.string).to match(/ERROR: Payment Required/)
588
- expect(stderr.string).to match(/Response: nobugfixtillyoubuy/)
589
- end
590
-
591
- it "formats NameError and NoMethodError nicely" do
592
- allow(knife).to receive(:run).and_raise(NameError.new("Undefined constant FUUU"))
593
- knife.run_with_pretty_exceptions
594
- expect(stderr.string).to match(/ERROR: .* encountered an unexpected error/)
595
- expect(stderr.string).to match(/This may be a bug in the 'knife' .* command or plugin/)
596
- expect(stderr.string).to match(/Exception: NameError: Undefined constant FUUU/)
597
- end
598
-
599
- it "formats missing private key errors nicely" do
600
- allow(knife).to receive(:run).and_raise(Chef::Exceptions::PrivateKeyMissing.new("key not there"))
601
- allow(knife).to receive(:api_key).and_return("/home/root/.chef/no-key-here.pem")
602
- knife.run_with_pretty_exceptions
603
- expect(stderr.string).to match(%r{ERROR: Your private key could not be loaded from /home/root/.chef/no-key-here.pem})
604
- expect(stderr.string).to match(/Check your configuration file and ensure that your private key is readable/)
605
- end
606
-
607
- it "formats connection refused errors nicely" do
608
- allow(knife).to receive(:run).and_raise(Errno::ECONNREFUSED.new("y u no shut up"))
609
- knife.run_with_pretty_exceptions
610
- # Errno::ECONNREFUSED message differs by platform
611
- # *nix = Errno::ECONNREFUSED: Connection refused
612
- # win32: Errno::ECONNREFUSED: No connection could be made because the target machine actively refused it.
613
- expect(stderr.string).to match(/ERROR: Network Error: .* - y u no shut up/)
614
- expect(stderr.string).to match(/Check your .* configuration and network settings/)
615
- end
616
-
617
- it "formats SSL errors nicely and suggests to use `knife ssl check` and `knife ssl fetch`" do
618
- error = OpenSSL::SSL::SSLError.new("SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed")
619
- allow(knife).to receive(:run).and_raise(error)
620
-
621
- knife.run_with_pretty_exceptions
622
-
623
- expected_message = <<~MSG
624
- ERROR: Could not establish a secure connection to the server.
625
- Use `.* ssl check` to troubleshoot your SSL configuration.
626
- If your server uses a self-signed certificate, you can use
627
- `.* ssl fetch` to make .* trust the server's certificates.
628
- MSG
629
- expect(stderr.string).to match(expected_message)
630
- end
631
-
632
- end
633
-
634
- end