knife 18.2.7 → 18.3.0

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 (667) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +26 -26
  3. data/LICENSE +201 -201
  4. data/Rakefile +33 -33
  5. data/bin/knife +24 -24
  6. data/knife.gemspec +62 -62
  7. data/lib/chef/application/knife.rb +234 -234
  8. data/lib/chef/chef_fs/knife.rb +162 -162
  9. data/lib/chef/knife/acl_add.rb +57 -57
  10. data/lib/chef/knife/acl_base.rb +183 -183
  11. data/lib/chef/knife/acl_bulk_add.rb +78 -78
  12. data/lib/chef/knife/acl_bulk_remove.rb +83 -83
  13. data/lib/chef/knife/acl_remove.rb +62 -62
  14. data/lib/chef/knife/acl_show.rb +56 -56
  15. data/lib/chef/knife/bootstrap/chef_vault_handler.rb +160 -160
  16. data/lib/chef/knife/bootstrap/client_builder.rb +212 -212
  17. data/lib/chef/knife/bootstrap/templates/README.md +11 -11
  18. data/lib/chef/knife/bootstrap/templates/chef-full.erb +242 -242
  19. data/lib/chef/knife/bootstrap/templates/windows-chef-client-msi.erb +278 -278
  20. data/lib/chef/knife/bootstrap/train_connector.rb +334 -334
  21. data/lib/chef/knife/bootstrap.rb +1193 -1193
  22. data/lib/chef/knife/client_bulk_delete.rb +104 -104
  23. data/lib/chef/knife/client_create.rb +140 -140
  24. data/lib/chef/knife/client_delete.rb +62 -62
  25. data/lib/chef/knife/client_edit.rb +52 -52
  26. data/lib/chef/knife/client_key_create.rb +73 -73
  27. data/lib/chef/knife/client_key_delete.rb +80 -80
  28. data/lib/chef/knife/client_key_edit.rb +83 -83
  29. data/lib/chef/knife/client_key_list.rb +73 -73
  30. data/lib/chef/knife/client_key_show.rb +80 -80
  31. data/lib/chef/knife/client_list.rb +41 -41
  32. data/lib/chef/knife/client_reregister.rb +58 -58
  33. data/lib/chef/knife/client_show.rb +48 -48
  34. data/lib/chef/knife/config_get.rb +39 -39
  35. data/lib/chef/knife/config_get_profile.rb +37 -37
  36. data/lib/chef/knife/config_list.rb +139 -139
  37. data/lib/chef/knife/config_list_profiles.rb +37 -37
  38. data/lib/chef/knife/config_show.rb +127 -127
  39. data/lib/chef/knife/config_use.rb +61 -61
  40. data/lib/chef/knife/config_use_profile.rb +47 -47
  41. data/lib/chef/knife/configure.rb +150 -150
  42. data/lib/chef/knife/configure_client.rb +48 -48
  43. data/lib/chef/knife/cookbook_bulk_delete.rb +71 -71
  44. data/lib/chef/knife/cookbook_delete.rb +151 -151
  45. data/lib/chef/knife/cookbook_download.rb +142 -142
  46. data/lib/chef/knife/cookbook_list.rb +47 -47
  47. data/lib/chef/knife/cookbook_metadata.rb +106 -106
  48. data/lib/chef/knife/cookbook_metadata_from_file.rb +49 -49
  49. data/lib/chef/knife/cookbook_show.rb +98 -98
  50. data/lib/chef/knife/cookbook_upload.rb +313 -313
  51. data/lib/chef/knife/core/bootstrap_context.rb +264 -264
  52. data/lib/chef/knife/core/cookbook_scm_repo.rb +159 -159
  53. data/lib/chef/knife/core/cookbook_site_streaming_uploader.rb +249 -249
  54. data/lib/chef/knife/core/formatting_options.rb +49 -49
  55. data/lib/chef/knife/core/gem_glob_loader.rb +134 -134
  56. data/lib/chef/knife/core/generic_presenter.rb +238 -232
  57. data/lib/chef/knife/core/hashed_command_loader.rb +100 -100
  58. data/lib/chef/knife/core/node_editor.rb +130 -130
  59. data/lib/chef/knife/core/node_presenter.rb +133 -133
  60. data/lib/chef/knife/core/object_loader.rb +115 -115
  61. data/lib/chef/knife/core/status_presenter.rb +147 -147
  62. data/lib/chef/knife/core/subcommand_loader.rb +208 -208
  63. data/lib/chef/knife/core/text_formatter.rb +85 -85
  64. data/lib/chef/knife/core/ui.rb +338 -338
  65. data/lib/chef/knife/core/windows_bootstrap_context.rb +405 -405
  66. data/lib/chef/knife/data_bag_create.rb +81 -81
  67. data/lib/chef/knife/data_bag_delete.rb +49 -49
  68. data/lib/chef/knife/data_bag_edit.rb +74 -74
  69. data/lib/chef/knife/data_bag_from_file.rb +113 -113
  70. data/lib/chef/knife/data_bag_list.rb +42 -42
  71. data/lib/chef/knife/data_bag_secret_options.rb +122 -122
  72. data/lib/chef/knife/data_bag_show.rb +69 -69
  73. data/lib/chef/knife/delete.rb +125 -125
  74. data/lib/chef/knife/deps.rb +156 -156
  75. data/lib/chef/knife/diff.rb +83 -83
  76. data/lib/chef/knife/download.rb +85 -85
  77. data/lib/chef/knife/edit.rb +88 -88
  78. data/lib/chef/knife/environment_compare.rb +128 -128
  79. data/lib/chef/knife/environment_create.rb +52 -52
  80. data/lib/chef/knife/environment_delete.rb +44 -44
  81. data/lib/chef/knife/environment_edit.rb +44 -44
  82. data/lib/chef/knife/environment_from_file.rb +84 -84
  83. data/lib/chef/knife/environment_list.rb +41 -41
  84. data/lib/chef/knife/environment_show.rb +47 -47
  85. data/lib/chef/knife/exec.rb +99 -99
  86. data/lib/chef/knife/group_add.rb +55 -55
  87. data/lib/chef/knife/group_create.rb +49 -49
  88. data/lib/chef/knife/group_destroy.rb +53 -53
  89. data/lib/chef/knife/group_list.rb +43 -43
  90. data/lib/chef/knife/group_remove.rb +56 -56
  91. data/lib/chef/knife/group_show.rb +49 -49
  92. data/lib/chef/knife/key_create.rb +112 -112
  93. data/lib/chef/knife/key_create_base.rb +50 -50
  94. data/lib/chef/knife/key_delete.rb +55 -55
  95. data/lib/chef/knife/key_edit.rb +118 -118
  96. data/lib/chef/knife/key_edit_base.rb +55 -55
  97. data/lib/chef/knife/key_list.rb +90 -90
  98. data/lib/chef/knife/key_list_base.rb +45 -45
  99. data/lib/chef/knife/key_show.rb +53 -53
  100. data/lib/chef/knife/list.rb +177 -177
  101. data/lib/chef/knife/node_bulk_delete.rb +75 -75
  102. data/lib/chef/knife/node_create.rb +47 -47
  103. data/lib/chef/knife/node_delete.rb +46 -46
  104. data/lib/chef/knife/node_edit.rb +70 -70
  105. data/lib/chef/knife/node_environment_set.rb +53 -53
  106. data/lib/chef/knife/node_from_file.rb +51 -51
  107. data/lib/chef/knife/node_list.rb +44 -44
  108. data/lib/chef/knife/node_policy_set.rb +79 -79
  109. data/lib/chef/knife/node_run_list_add.rb +104 -104
  110. data/lib/chef/knife/node_run_list_remove.rb +67 -67
  111. data/lib/chef/knife/node_run_list_set.rb +66 -66
  112. data/lib/chef/knife/node_show.rb +63 -63
  113. data/lib/chef/knife/null.rb +12 -12
  114. data/lib/chef/knife/org_create.rb +70 -70
  115. data/lib/chef/knife/org_delete.rb +32 -32
  116. data/lib/chef/knife/org_edit.rb +48 -48
  117. data/lib/chef/knife/org_list.rb +44 -44
  118. data/lib/chef/knife/org_show.rb +31 -31
  119. data/lib/chef/knife/org_user_add.rb +62 -62
  120. data/lib/chef/knife/org_user_remove.rb +103 -103
  121. data/lib/chef/knife/raw.rb +123 -123
  122. data/lib/chef/knife/recipe_list.rb +32 -32
  123. data/lib/chef/knife/rehash.rb +50 -50
  124. data/lib/chef/knife/role_bulk_delete.rb +66 -66
  125. data/lib/chef/knife/role_create.rb +53 -53
  126. data/lib/chef/knife/role_delete.rb +46 -46
  127. data/lib/chef/knife/role_edit.rb +45 -45
  128. data/lib/chef/knife/role_env_run_list_add.rb +87 -87
  129. data/lib/chef/knife/role_env_run_list_clear.rb +55 -55
  130. data/lib/chef/knife/role_env_run_list_remove.rb +57 -57
  131. data/lib/chef/knife/role_env_run_list_replace.rb +60 -60
  132. data/lib/chef/knife/role_env_run_list_set.rb +70 -70
  133. data/lib/chef/knife/role_from_file.rb +51 -51
  134. data/lib/chef/knife/role_list.rb +42 -42
  135. data/lib/chef/knife/role_run_list_add.rb +87 -87
  136. data/lib/chef/knife/role_run_list_clear.rb +55 -55
  137. data/lib/chef/knife/role_run_list_remove.rb +56 -56
  138. data/lib/chef/knife/role_run_list_replace.rb +60 -60
  139. data/lib/chef/knife/role_run_list_set.rb +69 -69
  140. data/lib/chef/knife/role_show.rb +48 -48
  141. data/lib/chef/knife/search.rb +194 -194
  142. data/lib/chef/knife/serve.rb +65 -65
  143. data/lib/chef/knife/show.rb +72 -72
  144. data/lib/chef/knife/ssh.rb +657 -657
  145. data/lib/chef/knife/ssl_check.rb +284 -284
  146. data/lib/chef/knife/ssl_fetch.rb +162 -162
  147. data/lib/chef/knife/status.rb +95 -95
  148. data/lib/chef/knife/supermarket_download.rb +119 -119
  149. data/lib/chef/knife/supermarket_install.rb +192 -192
  150. data/lib/chef/knife/supermarket_list.rb +76 -76
  151. data/lib/chef/knife/supermarket_search.rb +53 -53
  152. data/lib/chef/knife/supermarket_share.rb +166 -166
  153. data/lib/chef/knife/supermarket_show.rb +66 -66
  154. data/lib/chef/knife/supermarket_unshare.rb +62 -62
  155. data/lib/chef/knife/tag_create.rb +52 -52
  156. data/lib/chef/knife/tag_delete.rb +60 -60
  157. data/lib/chef/knife/tag_list.rb +47 -47
  158. data/lib/chef/knife/upload.rb +87 -87
  159. data/lib/chef/knife/user_create.rb +180 -180
  160. data/lib/chef/knife/user_delete.rb +151 -151
  161. data/lib/chef/knife/user_dissociate.rb +42 -42
  162. data/lib/chef/knife/user_edit.rb +94 -94
  163. data/lib/chef/knife/user_invite_add.rb +43 -43
  164. data/lib/chef/knife/user_invite_list.rb +34 -34
  165. data/lib/chef/knife/user_invite_rescind.rb +63 -63
  166. data/lib/chef/knife/user_key_create.rb +73 -73
  167. data/lib/chef/knife/user_key_delete.rb +80 -80
  168. data/lib/chef/knife/user_key_edit.rb +83 -83
  169. data/lib/chef/knife/user_key_list.rb +73 -73
  170. data/lib/chef/knife/user_key_show.rb +80 -80
  171. data/lib/chef/knife/user_list.rb +43 -43
  172. data/lib/chef/knife/user_password.rb +70 -70
  173. data/lib/chef/knife/user_reregister.rb +59 -59
  174. data/lib/chef/knife/user_show.rb +52 -52
  175. data/lib/chef/knife/version.rb +24 -24
  176. data/lib/chef/knife/xargs.rb +282 -282
  177. data/lib/chef/knife/yaml_convert.rb +91 -91
  178. data/lib/chef/knife.rb +673 -673
  179. data/spec/data/apt/chef-integration-test-1.0/debian/changelog +5 -5
  180. data/spec/data/apt/chef-integration-test-1.0/debian/compat +1 -1
  181. data/spec/data/apt/chef-integration-test-1.0/debian/control +13 -13
  182. data/spec/data/apt/chef-integration-test-1.0/debian/copyright +34 -34
  183. data/spec/data/apt/chef-integration-test-1.0/debian/files +1 -1
  184. data/spec/data/apt/chef-integration-test-1.0/debian/rules +13 -13
  185. data/spec/data/apt/chef-integration-test-1.0/debian/source/format +1 -1
  186. data/spec/data/apt/chef-integration-test-1.1/debian/changelog +11 -11
  187. data/spec/data/apt/chef-integration-test-1.1/debian/compat +1 -1
  188. data/spec/data/apt/chef-integration-test-1.1/debian/control +13 -13
  189. data/spec/data/apt/chef-integration-test-1.1/debian/copyright +34 -34
  190. data/spec/data/apt/chef-integration-test-1.1/debian/files +1 -1
  191. data/spec/data/apt/chef-integration-test-1.1/debian/rules +13 -13
  192. data/spec/data/apt/chef-integration-test-1.1/debian/source/format +1 -1
  193. data/spec/data/apt/chef-integration-test2-1.0/debian/changelog +5 -5
  194. data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2/DEBIAN/conffiles +1 -1
  195. data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2/DEBIAN/control +10 -10
  196. data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2/DEBIAN/md5sums +1 -1
  197. data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2.debhelper.log +45 -45
  198. data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2.substvars +1 -1
  199. data/spec/data/apt/chef-integration-test2-1.0/debian/compat +1 -1
  200. data/spec/data/apt/chef-integration-test2-1.0/debian/conffiles +1 -1
  201. data/spec/data/apt/chef-integration-test2-1.0/debian/control +13 -13
  202. data/spec/data/apt/chef-integration-test2-1.0/debian/copyright +34 -34
  203. data/spec/data/apt/chef-integration-test2-1.0/debian/files +1 -1
  204. data/spec/data/apt/chef-integration-test2-1.0/debian/rules +13 -13
  205. data/spec/data/apt/chef-integration-test2-1.0/debian/source/format +1 -1
  206. data/spec/data/apt/chef-integration-test2_1.0-1.dsc +18 -18
  207. data/spec/data/apt/chef-integration-test2_1.0-1_amd64.build +91 -91
  208. data/spec/data/apt/chef-integration-test2_1.0-1_amd64.changes +31 -31
  209. data/spec/data/apt/chef-integration-test_1.0-1_amd64.changes +22 -22
  210. data/spec/data/apt/chef-integration-test_1.1-1_amd64.changes +22 -22
  211. data/spec/data/apt/var/www/apt/conf/distributions +7 -7
  212. data/spec/data/apt/var/www/apt/conf/incoming +4 -4
  213. data/spec/data/apt/var/www/apt/conf/pulls +3 -3
  214. data/spec/data/apt/var/www/apt/db/version +4 -4
  215. data/spec/data/apt/var/www/apt/dists/sid/Release +19 -19
  216. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages +16 -16
  217. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Release +5 -5
  218. data/spec/data/bootstrap/encrypted_data_bag_secret +1 -1
  219. data/spec/data/bootstrap/no_proxy.erb +2 -2
  220. data/spec/data/bootstrap/secret.erb +9 -9
  221. data/spec/data/bootstrap/test-hints.erb +12 -12
  222. data/spec/data/bootstrap/test.erb +1 -1
  223. data/spec/data/cb_version_cookbooks/tatft/README.rdoc +2 -2
  224. data/spec/data/cb_version_cookbooks/tatft/attributes/default.rb +1 -1
  225. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-600hhz-0 +1 -1
  226. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ahd2gq-0 +1 -1
  227. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-api8ux-0 +1 -1
  228. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-b0r1m1-0 +1 -1
  229. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-bfygsi-0 +1 -1
  230. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-el14l6-0 +1 -1
  231. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ivrl3y-0 +1 -1
  232. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-kkbs85-0 +1 -1
  233. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ory1ux-0 +1 -1
  234. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-pgsq76-0 +1 -1
  235. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ra8uim-0 +1 -1
  236. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-t7k1g-0 +1 -1
  237. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-t8g0sv-0 +1 -1
  238. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ufy6g3-0 +1 -1
  239. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-x2d6j9-0 +1 -1
  240. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-xi0l6h-0 +1 -1
  241. data/spec/data/client.d_00/00-foo.rb +2 -2
  242. data/spec/data/client.d_00/01-bar.rb +1 -1
  243. data/spec/data/client.d_00/02-strings.rb +2 -2
  244. data/spec/data/client.d_00/bar +1 -1
  245. data/spec/data/client.d_01/foo/bar.rb +1 -1
  246. data/spec/data/client.d_02/foo.rb/foo.txt +1 -1
  247. data/spec/data/config.rb +6 -6
  248. data/spec/data/cookbooks/angrybash/metadata.rb +2 -2
  249. data/spec/data/cookbooks/angrybash/recipes/default.rb +8 -8
  250. data/spec/data/cookbooks/apache2/files/default/apache2_module_conf_generate.pl +2 -2
  251. data/spec/data/cookbooks/apache2/metadata.json +33 -33
  252. data/spec/data/cookbooks/apache2/metadata.rb +2 -2
  253. data/spec/data/cookbooks/apache2/recipes/default.rb +2 -2
  254. data/spec/data/cookbooks/borken/metadata.rb +2 -2
  255. data/spec/data/cookbooks/borken/recipes/default.rb +1 -1
  256. data/spec/data/cookbooks/borken/templates/default/borken.erb +1 -1
  257. data/spec/data/cookbooks/chefignore +8 -8
  258. data/spec/data/cookbooks/ignorken/files/default/not_me.rb +2 -2
  259. data/spec/data/cookbooks/ignorken/metadata.rb +2 -2
  260. data/spec/data/cookbooks/ignorken/recipes/ignoreme.rb +1 -1
  261. data/spec/data/cookbooks/ignorken/templates/ubuntu-12.10/not_me.rb +2 -2
  262. data/spec/data/cookbooks/irssi/files/default/irssi.response +2 -2
  263. data/spec/data/cookbooks/java/files/default/java.response +1 -1
  264. data/spec/data/cookbooks/java/metadata.json +33 -33
  265. data/spec/data/cookbooks/java/metadata.rb +2 -2
  266. data/spec/data/cookbooks/name-mismatch-versionnumber/README.md +4 -4
  267. data/spec/data/cookbooks/name-mismatch-versionnumber/metadata.rb +8 -8
  268. data/spec/data/cookbooks/name-mismatch-versionnumber/recipes/default.rb +8 -8
  269. data/spec/data/cookbooks/openldap/attributes/default.rb +16 -16
  270. data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
  271. data/spec/data/cookbooks/openldap/definitions/client.rb +5 -5
  272. data/spec/data/cookbooks/openldap/definitions/server.rb +5 -5
  273. data/spec/data/cookbooks/openldap/files/default/.dotfile +1 -1
  274. data/spec/data/cookbooks/openldap/files/default/remotedir/.a_dotdir/.a_dotfile_in_a_dotdir +1 -1
  275. data/spec/data/cookbooks/openldap/files/default/remotedir/not_a_template.erb +2 -2
  276. data/spec/data/cookbooks/openldap/files/default/remotedir/remote_dir_file1.txt +2 -2
  277. data/spec/data/cookbooks/openldap/files/default/remotedir/remote_dir_file2.txt +2 -2
  278. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/.a_dotfile +1 -1
  279. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/remote_subdir_file1.txt +2 -2
  280. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/remote_subdir_file2.txt +2 -2
  281. data/spec/data/cookbooks/openldap/files/default/remotedir/subdir_with_no_file_just_a_subsubdir/the_subsubdir/some_file.txt +3 -3
  282. data/spec/data/cookbooks/openldap/libraries/openldap/version.rb +3 -3
  283. data/spec/data/cookbooks/openldap/libraries/openldap.rb +4 -4
  284. data/spec/data/cookbooks/openldap/metadata.rb +8 -8
  285. data/spec/data/cookbooks/openldap/recipes/default.rb +4 -4
  286. data/spec/data/cookbooks/openldap/recipes/gigantor.rb +3 -3
  287. data/spec/data/cookbooks/openldap/recipes/one.rb +15 -15
  288. data/spec/data/cookbooks/openldap/recipes/return.rb +2 -2
  289. data/spec/data/cookbooks/openldap/templates/default/helper_test.erb +1 -1
  290. data/spec/data/cookbooks/openldap/templates/default/helpers.erb +14 -14
  291. data/spec/data/cookbooks/openldap/templates/default/helpers_via_partial_test.erb +1 -1
  292. data/spec/data/cookbooks/openldap/templates/default/nested_openldap_partials.erb +1 -1
  293. data/spec/data/cookbooks/openldap/templates/default/nested_partial.erb +1 -1
  294. data/spec/data/cookbooks/openldap/templates/default/no_windows_line_endings.erb +4 -4
  295. data/spec/data/cookbooks/openldap/templates/default/openldap_nested_variable_stuff.erb +1 -1
  296. data/spec/data/cookbooks/openldap/templates/default/openldap_variable_stuff.conf.erb +1 -1
  297. data/spec/data/cookbooks/openldap/templates/default/test.erb +1 -1
  298. data/spec/data/cookbooks/preseed/files/default/preseed-file.seed +1 -1
  299. data/spec/data/cookbooks/preseed/files/default/preseed-template.seed +4 -4
  300. data/spec/data/cookbooks/preseed/metadata.rb +2 -2
  301. data/spec/data/cookbooks/preseed/templates/default/preseed-template-variables.seed +1 -1
  302. data/spec/data/cookbooks/preseed/templates/default/preseed-template.seed +1 -1
  303. data/spec/data/cookbooks/starter/chefignore +8 -8
  304. data/spec/data/cookbooks/starter/metadata.rb +2 -2
  305. data/spec/data/cookbooks/starter/recipes/default.rb +4 -4
  306. data/spec/data/cookbooks/supports-platform-constraints/metadata.rb +5 -5
  307. data/spec/data/cookbooks/wget/files/default/wget.response +2 -2
  308. data/spec/data/definitions/test.rb +4 -4
  309. data/spec/data/environment-config.rb +4 -4
  310. data/spec/data/file-providers-method-snapshot-chef-11-4.json +127 -127
  311. data/spec/data/fileedit/hosts +4 -4
  312. data/spec/data/incomplete-metadata-chef-repo/incomplete-metadata/README.md +4 -4
  313. data/spec/data/incomplete-metadata-chef-repo/incomplete-metadata/metadata.rb +13 -13
  314. data/spec/data/incomplete-metadata-chef-repo/incomplete-metadata/recipes/default.rb +8 -8
  315. data/spec/data/invalid-metadata-chef-repo/invalid-metadata/README.md +4 -4
  316. data/spec/data/invalid-metadata-chef-repo/invalid-metadata/metadata.rb +9 -9
  317. data/spec/data/invalid-metadata-chef-repo/invalid-metadata/recipes/default.rb +8 -8
  318. data/spec/data/kitchen/chefignore +6 -6
  319. data/spec/data/kitchen/openldap/attributes/default.rb +3 -3
  320. data/spec/data/kitchen/openldap/attributes/robinson.rb +2 -2
  321. data/spec/data/kitchen/openldap/definitions/client.rb +3 -3
  322. data/spec/data/kitchen/openldap/definitions/drewbarrymore.rb +2 -2
  323. data/spec/data/kitchen/openldap/recipes/gigantor.rb +2 -2
  324. data/spec/data/kitchen/openldap/recipes/ignoreme.rb +2 -2
  325. data/spec/data/kitchen/openldap/recipes/woot.rb +3 -3
  326. data/spec/data/knife_subcommand/test_explicit_category.rb +6 -6
  327. data/spec/data/knife_subcommand/test_name_mapping.rb +4 -4
  328. data/spec/data/knife_subcommand/test_yourself.rb +21 -21
  329. data/spec/data/lwrp/providers/buck_passer.rb +28 -28
  330. data/spec/data/lwrp/providers/buck_passer_2.rb +26 -26
  331. data/spec/data/lwrp/providers/embedded_resource_accesses_providers_scope.rb +28 -28
  332. data/spec/data/lwrp/providers/inline_compiler.rb +24 -24
  333. data/spec/data/lwrp/providers/monkey_name_printer.rb +5 -5
  334. data/spec/data/lwrp/providers/paint_drying_watcher.rb +7 -7
  335. data/spec/data/lwrp/providers/thumb_twiddler.rb +7 -7
  336. data/spec/data/lwrp/resources/bar.rb +4 -4
  337. data/spec/data/lwrp/resources/buck_passer.rb +6 -6
  338. data/spec/data/lwrp/resources/buck_passer_2.rb +4 -4
  339. data/spec/data/lwrp/resources/embedded_resource_accesses_providers_scope.rb +4 -4
  340. data/spec/data/lwrp/resources/foo.rb +6 -6
  341. data/spec/data/lwrp/resources/inline_compiler.rb +4 -4
  342. data/spec/data/lwrp/resources/monkey_name_printer.rb +6 -6
  343. data/spec/data/lwrp/resources/paint_drying_watcher.rb +4 -4
  344. data/spec/data/lwrp/resources/thumb_twiddler.rb +4 -4
  345. data/spec/data/lwrp/resources_with_default_attributes/nodeattr.rb +3 -3
  346. data/spec/data/lwrp_const_scoping/resources/conflict.rb +1 -1
  347. data/spec/data/lwrp_override/providers/buck_passer.rb +5 -5
  348. data/spec/data/lwrp_override/resources/foo.rb +11 -11
  349. data/spec/data/mac_users/10.9.plist.xml +560 -560
  350. data/spec/data/mac_users/10.9.shadow.xml +21 -21
  351. data/spec/data/metadata/quick_start/metadata.rb +14 -14
  352. data/spec/data/mixin/invalid_data.rb +3 -3
  353. data/spec/data/mixin/real_data.rb +2 -2
  354. data/spec/data/nested.json +2 -2
  355. data/spec/data/nodes/default.rb +15 -15
  356. data/spec/data/nodes/test.example.com.rb +17 -17
  357. data/spec/data/nodes/test.rb +15 -15
  358. data/spec/data/null_config.rb +1 -1
  359. data/spec/data/object_loader/environments/test.json +7 -7
  360. data/spec/data/object_loader/environments/test.rb +2 -2
  361. data/spec/data/object_loader/environments/test_json_class.json +8 -8
  362. data/spec/data/object_loader/nodes/test.json +7 -7
  363. data/spec/data/object_loader/nodes/test.rb +2 -2
  364. data/spec/data/object_loader/nodes/test_json_class.json +8 -8
  365. data/spec/data/object_loader/roles/test.json +7 -7
  366. data/spec/data/object_loader/roles/test.rb +2 -2
  367. data/spec/data/object_loader/roles/test_json_class.json +8 -8
  368. data/spec/data/partial_one.erb +1 -1
  369. data/spec/data/prefer_metadata_json/metadata.json +51 -51
  370. data/spec/data/prefer_metadata_json/metadata.rb +6 -6
  371. data/spec/data/recipes/test.rb +7 -7
  372. data/spec/data/root_alias_cookbooks/dup_attr/attributes/default.rb +1 -1
  373. data/spec/data/root_alias_cookbooks/dup_attr/attributes.rb +1 -1
  374. data/spec/data/root_alias_cookbooks/dup_attr/metadata.rb +2 -2
  375. data/spec/data/root_alias_cookbooks/dup_attr/recipe.rb +3 -3
  376. data/spec/data/root_alias_cookbooks/dup_recipe/attributes.rb +1 -1
  377. data/spec/data/root_alias_cookbooks/dup_recipe/metadata.rb +2 -2
  378. data/spec/data/root_alias_cookbooks/dup_recipe/recipe.rb +3 -3
  379. data/spec/data/root_alias_cookbooks/dup_recipe/recipes/default.rb +3 -3
  380. data/spec/data/root_alias_cookbooks/simple/attributes.rb +1 -1
  381. data/spec/data/root_alias_cookbooks/simple/metadata.rb +2 -2
  382. data/spec/data/root_alias_cookbooks/simple/recipe.rb +3 -3
  383. data/spec/data/rubygems.org/sexp_processor-info +49 -49
  384. data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +2 -2
  385. data/spec/data/run_context/cookbooks/circular-dep1/definitions/circular_dep1_res.rb +1 -1
  386. data/spec/data/run_context/cookbooks/circular-dep1/libraries/lib.rb +2 -2
  387. data/spec/data/run_context/cookbooks/circular-dep1/metadata.rb +2 -2
  388. data/spec/data/run_context/cookbooks/circular-dep1/providers/provider.rb +1 -1
  389. data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +2 -2
  390. data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +2 -2
  391. data/spec/data/run_context/cookbooks/circular-dep2/definitions/circular_dep2_res.rb +1 -1
  392. data/spec/data/run_context/cookbooks/circular-dep2/libraries/lib.rb +2 -2
  393. data/spec/data/run_context/cookbooks/circular-dep2/metadata.rb +2 -2
  394. data/spec/data/run_context/cookbooks/circular-dep2/providers/provider.rb +1 -1
  395. data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +2 -2
  396. data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -2
  397. data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -2
  398. data/spec/data/run_context/cookbooks/dependency1/attributes/unparsed_file +1 -1
  399. data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +2 -2
  400. data/spec/data/run_context/cookbooks/dependency1/definitions/dependency1_res.rb +1 -1
  401. data/spec/data/run_context/cookbooks/dependency1/definitions/unparsed_file +1 -1
  402. data/spec/data/run_context/cookbooks/dependency1/libraries/lib.rb +2 -2
  403. data/spec/data/run_context/cookbooks/dependency1/libraries/unparsed_file +1 -1
  404. data/spec/data/run_context/cookbooks/dependency1/providers/provider.rb +1 -1
  405. data/spec/data/run_context/cookbooks/dependency1/providers/unparsed_file +1 -1
  406. data/spec/data/run_context/cookbooks/dependency1/recipes/unparsed_file +1 -1
  407. data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +2 -2
  408. data/spec/data/run_context/cookbooks/dependency1/resources/unparsed_file +1 -1
  409. data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +2 -2
  410. data/spec/data/run_context/cookbooks/dependency2/definitions/dependency2_res.rb +1 -1
  411. data/spec/data/run_context/cookbooks/dependency2/libraries/lib.rb +2 -2
  412. data/spec/data/run_context/cookbooks/dependency2/providers/provider.rb +1 -1
  413. data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +2 -2
  414. data/spec/data/run_context/cookbooks/include/recipes/default.rb +24 -24
  415. data/spec/data/run_context/cookbooks/include/recipes/includee.rb +3 -3
  416. data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +2 -2
  417. data/spec/data/run_context/cookbooks/no-default-attr/definitions/no_default-attr_res.rb +1 -1
  418. data/spec/data/run_context/cookbooks/no-default-attr/providers/provider.rb +1 -1
  419. data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +2 -2
  420. data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -1
  421. data/spec/data/run_context/cookbooks/test/definitions/new_animals.rb +9 -9
  422. data/spec/data/run_context/cookbooks/test/definitions/new_cat.rb +5 -5
  423. data/spec/data/run_context/cookbooks/test/definitions/test_res.rb +1 -1
  424. data/spec/data/run_context/cookbooks/test/providers/provider.rb +1 -1
  425. data/spec/data/run_context/cookbooks/test/recipes/default.rb +5 -5
  426. data/spec/data/run_context/cookbooks/test/recipes/one.rb +7 -7
  427. data/spec/data/run_context/cookbooks/test/recipes/two.rb +7 -7
  428. data/spec/data/run_context/cookbooks/test/resources/resource.rb +3 -3
  429. data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +2 -2
  430. data/spec/data/run_context/cookbooks/test-with-circular-deps/definitions/test_with-circular-deps_res.rb +1 -1
  431. data/spec/data/run_context/cookbooks/test-with-circular-deps/libraries/lib.rb +2 -2
  432. data/spec/data/run_context/cookbooks/test-with-circular-deps/metadata.rb +2 -2
  433. data/spec/data/run_context/cookbooks/test-with-circular-deps/providers/provider.rb +1 -1
  434. data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +3 -3
  435. data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +2 -2
  436. data/spec/data/run_context/cookbooks/test-with-deps/definitions/test_with-deps_res.rb +1 -1
  437. data/spec/data/run_context/cookbooks/test-with-deps/libraries/lib.rb +1 -1
  438. data/spec/data/run_context/cookbooks/test-with-deps/metadata.rb +3 -3
  439. data/spec/data/run_context/cookbooks/test-with-deps/providers/provider.rb +1 -1
  440. data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +2 -2
  441. data/spec/data/run_context/nodes/run_context.rb +5 -5
  442. data/spec/data/sample_msu1.xml +10 -10
  443. data/spec/data/sample_msu2.xml +14 -14
  444. data/spec/data/sample_msu3.xml +16 -16
  445. data/spec/data/search_queries_to_transform.txt +98 -98
  446. data/spec/data/shef-config.rb +11 -11
  447. data/spec/data/snap_package/async_result_success.json +6 -6
  448. data/spec/data/snap_package/change_id_result.json +175 -175
  449. data/spec/data/snap_package/find_result_failure.json +10 -10
  450. data/spec/data/snap_package/find_result_success.json +70 -70
  451. data/spec/data/snap_package/get_by_name_result_failure.json +10 -10
  452. data/spec/data/snap_package/get_by_name_result_success.json +38 -38
  453. data/spec/data/snap_package/get_conf_success.json +10 -10
  454. data/spec/data/snap_package/result_failure.json +9 -9
  455. data/spec/data/ssl/5e707473.0 +18 -18
  456. data/spec/data/ssl/chef-rspec.cert +27 -27
  457. data/spec/data/ssl/chef-rspec.key +27 -27
  458. data/spec/data/ssl/key.pem +15 -15
  459. data/spec/data/ssl/private_key.pem +27 -27
  460. data/spec/data/ssl/private_key_with_whitespace.pem +32 -32
  461. data/spec/data/standalone_cookbook/chefignore +9 -9
  462. data/spec/data/standalone_cookbook/recipes/default.rb +2 -2
  463. data/spec/data/templates/failed.erb +5 -5
  464. data/spec/data/trusted_certs/example.crt +22 -22
  465. data/spec/data/trusted_certs/example_no_cn.crt +36 -36
  466. data/spec/data/trusted_certs/intermediate.pem +27 -27
  467. data/spec/data/trusted_certs/opscode.pem +57 -57
  468. data/spec/data/trusted_certs/root.pem +22 -22
  469. data/spec/data/windows_certificates/base64_test.cer +20 -20
  470. data/spec/data/windows_certificates/othertest.cer +20 -20
  471. data/spec/data/windows_certificates/test.cer +20 -20
  472. data/spec/data/windows_certificates/test.pem +20 -20
  473. data/spec/functional/configure_spec.rb +33 -33
  474. data/spec/functional/cookbook_delete_spec.rb +156 -156
  475. data/spec/functional/exec_spec.rb +55 -55
  476. data/spec/functional/rehash_spec.rb +39 -39
  477. data/spec/functional/smoke_test.rb +42 -42
  478. data/spec/functional/ssh_spec.rb +352 -352
  479. data/spec/functional/version_spec.rb +26 -26
  480. data/spec/integration/chef_fs_data_store_spec.rb +557 -557
  481. data/spec/integration/chef_repo_path_spec.rb +962 -962
  482. data/spec/integration/chef_repository_file_system_spec.rb +200 -200
  483. data/spec/integration/chefignore_spec.rb +301 -301
  484. data/spec/integration/client_bulk_delete_spec.rb +131 -131
  485. data/spec/integration/client_create_spec.rb +70 -70
  486. data/spec/integration/client_delete_spec.rb +64 -64
  487. data/spec/integration/client_key_create_spec.rb +66 -66
  488. data/spec/integration/client_key_delete_spec.rb +43 -43
  489. data/spec/integration/client_key_list_spec.rb +61 -61
  490. data/spec/integration/client_key_show_spec.rb +45 -45
  491. data/spec/integration/client_list_spec.rb +49 -49
  492. data/spec/integration/client_show_spec.rb +37 -37
  493. data/spec/integration/commands_spec.rb +55 -55
  494. data/spec/integration/common_options_spec.rb +174 -174
  495. data/spec/integration/config_list_spec.rb +220 -220
  496. data/spec/integration/config_show_spec.rb +192 -192
  497. data/spec/integration/config_use_spec.rb +198 -198
  498. data/spec/integration/cookbook_api_ipv6_spec.rb +113 -113
  499. data/spec/integration/cookbook_bulk_delete_spec.rb +65 -65
  500. data/spec/integration/cookbook_download_spec.rb +72 -72
  501. data/spec/integration/cookbook_list_spec.rb +55 -55
  502. data/spec/integration/cookbook_show_spec.rb +149 -149
  503. data/spec/integration/cookbook_upload_spec.rb +128 -128
  504. data/spec/integration/data_bag_create_spec.rb +125 -125
  505. data/spec/integration/data_bag_delete_spec.rb +59 -59
  506. data/spec/integration/data_bag_edit_spec.rb +105 -105
  507. data/spec/integration/data_bag_from_file_spec.rb +116 -116
  508. data/spec/integration/data_bag_list_spec.rb +44 -44
  509. data/spec/integration/data_bag_show_spec.rb +95 -95
  510. data/spec/integration/delete_spec.rb +1018 -1018
  511. data/spec/integration/deps_spec.rb +703 -703
  512. data/spec/integration/diff_spec.rb +605 -605
  513. data/spec/integration/download_spec.rb +1336 -1336
  514. data/spec/integration/environment_compare_spec.rb +75 -75
  515. data/spec/integration/environment_create_spec.rb +41 -41
  516. data/spec/integration/environment_delete_spec.rb +37 -37
  517. data/spec/integration/environment_from_file_spec.rb +116 -116
  518. data/spec/integration/environment_list_spec.rb +42 -42
  519. data/spec/integration/environment_show_spec.rb +77 -77
  520. data/spec/integration/list_spec.rb +1060 -1060
  521. data/spec/integration/node_bulk_delete_spec.rb +52 -52
  522. data/spec/integration/node_create_spec.rb +47 -47
  523. data/spec/integration/node_delete_spec.rb +48 -48
  524. data/spec/integration/node_environment_set_spec.rb +46 -46
  525. data/spec/integration/node_from_file_spec.rb +59 -59
  526. data/spec/integration/node_list_spec.rb +45 -45
  527. data/spec/integration/node_run_list_add_spec.rb +54 -54
  528. data/spec/integration/node_run_list_remove_spec.rb +36 -36
  529. data/spec/integration/node_run_list_set_spec.rb +41 -41
  530. data/spec/integration/node_show_spec.rb +36 -36
  531. data/spec/integration/raw_spec.rb +297 -297
  532. data/spec/integration/redirection_spec.rb +64 -64
  533. data/spec/integration/role_bulk_delete_spec.rb +52 -52
  534. data/spec/integration/role_create_spec.rb +41 -41
  535. data/spec/integration/role_delete_spec.rb +48 -48
  536. data/spec/integration/role_from_file_spec.rb +96 -96
  537. data/spec/integration/role_list_spec.rb +45 -45
  538. data/spec/integration/role_show_spec.rb +51 -51
  539. data/spec/integration/search_node_spec.rb +40 -40
  540. data/spec/integration/serve_spec.rb +92 -92
  541. data/spec/integration/show_spec.rb +197 -197
  542. data/spec/integration/upload_spec.rb +1616 -1616
  543. data/spec/knife_spec_helper.rb +241 -241
  544. data/spec/support/chef_helpers.rb +79 -79
  545. data/spec/support/key_helpers.rb +102 -102
  546. data/spec/support/platform_helpers.rb +255 -255
  547. data/spec/support/platforms/prof/gc.rb +51 -51
  548. data/spec/support/platforms/prof/win32.rb +45 -45
  549. data/spec/support/platforms/win32/spec_service.rb +57 -57
  550. data/spec/support/recipe_dsl_helper.rb +83 -83
  551. data/spec/support/shared/context/config.rb +18 -18
  552. data/spec/support/shared/functional/knife.rb +37 -37
  553. data/spec/support/shared/integration/integration_helper.rb +122 -122
  554. data/spec/support/shared/integration/knife_support.rb +192 -192
  555. data/spec/support/shared/matchers/exit_with_code.rb +32 -32
  556. data/spec/support/shared/matchers/match_environment_variable.rb +17 -17
  557. data/spec/support/shared/unit/knife_shared.rb +39 -39
  558. data/spec/support/shared/unit/mock_shellout.rb +49 -49
  559. data/spec/tiny_server.rb +190 -190
  560. data/spec/unit/application/knife_spec.rb +241 -241
  561. data/spec/unit/knife/bootstrap/chef_vault_handler_spec.rb +152 -152
  562. data/spec/unit/knife/bootstrap/client_builder_spec.rb +207 -207
  563. data/spec/unit/knife/bootstrap/train_connector_spec.rb +244 -244
  564. data/spec/unit/knife/bootstrap_spec.rb +2288 -2233
  565. data/spec/unit/knife/client_bulk_delete_spec.rb +166 -166
  566. data/spec/unit/knife/client_create_spec.rb +232 -232
  567. data/spec/unit/knife/client_delete_spec.rb +99 -99
  568. data/spec/unit/knife/client_edit_spec.rb +53 -53
  569. data/spec/unit/knife/client_list_spec.rb +34 -34
  570. data/spec/unit/knife/client_reregister_spec.rb +62 -62
  571. data/spec/unit/knife/client_show_spec.rb +52 -52
  572. data/spec/unit/knife/configure_client_spec.rb +81 -81
  573. data/spec/unit/knife/configure_spec.rb +190 -190
  574. data/spec/unit/knife/cookbook_bulk_delete_spec.rb +87 -87
  575. data/spec/unit/knife/cookbook_delete_spec.rb +239 -239
  576. data/spec/unit/knife/cookbook_download_spec.rb +255 -255
  577. data/spec/unit/knife/cookbook_list_spec.rb +88 -88
  578. data/spec/unit/knife/cookbook_metadata_from_file_spec.rb +72 -72
  579. data/spec/unit/knife/cookbook_metadata_spec.rb +182 -182
  580. data/spec/unit/knife/cookbook_show_spec.rb +253 -253
  581. data/spec/unit/knife/cookbook_upload_spec.rb +426 -426
  582. data/spec/unit/knife/core/bootstrap_context_spec.rb +287 -287
  583. data/spec/unit/knife/core/cookbook_scm_repo_spec.rb +187 -187
  584. data/spec/unit/knife/core/cookbook_site_streaming_uploader_spec.rb +198 -198
  585. data/spec/unit/knife/core/gem_glob_loader_spec.rb +242 -242
  586. data/spec/unit/knife/core/hashed_command_loader_spec.rb +112 -112
  587. data/spec/unit/knife/core/node_editor_spec.rb +211 -211
  588. data/spec/unit/knife/core/object_loader_spec.rb +81 -81
  589. data/spec/unit/knife/core/status_presenter_spec.rb +54 -54
  590. data/spec/unit/knife/core/subcommand_loader_spec.rb +64 -64
  591. data/spec/unit/knife/core/ui_spec.rb +656 -656
  592. data/spec/unit/knife/core/windows_bootstrap_context_spec.rb +238 -238
  593. data/spec/unit/knife/data_bag_create_spec.rb +175 -175
  594. data/spec/unit/knife/data_bag_edit_spec.rb +126 -126
  595. data/spec/unit/knife/data_bag_from_file_spec.rb +174 -174
  596. data/spec/unit/knife/data_bag_secret_options_spec.rb +173 -173
  597. data/spec/unit/knife/data_bag_show_spec.rb +139 -139
  598. data/spec/unit/knife/environment_compare_spec.rb +112 -112
  599. data/spec/unit/knife/environment_create_spec.rb +91 -91
  600. data/spec/unit/knife/environment_delete_spec.rb +71 -71
  601. data/spec/unit/knife/environment_edit_spec.rb +79 -79
  602. data/spec/unit/knife/environment_from_file_spec.rb +90 -90
  603. data/spec/unit/knife/environment_list_spec.rb +54 -54
  604. data/spec/unit/knife/environment_show_spec.rb +52 -52
  605. data/spec/unit/knife/key_create_spec.rb +223 -223
  606. data/spec/unit/knife/key_delete_spec.rb +133 -133
  607. data/spec/unit/knife/key_edit_spec.rb +264 -264
  608. data/spec/unit/knife/key_helper.rb +74 -74
  609. data/spec/unit/knife/key_list_spec.rb +216 -216
  610. data/spec/unit/knife/key_show_spec.rb +126 -126
  611. data/spec/unit/knife/node_bulk_delete_spec.rb +94 -94
  612. data/spec/unit/knife/node_delete_spec.rb +77 -77
  613. data/spec/unit/knife/node_edit_spec.rb +116 -116
  614. data/spec/unit/knife/node_environment_set_spec.rb +61 -61
  615. data/spec/unit/knife/node_from_file_spec.rb +59 -59
  616. data/spec/unit/knife/node_list_spec.rb +62 -62
  617. data/spec/unit/knife/node_policy_set_spec.rb +122 -122
  618. data/spec/unit/knife/node_run_list_add_spec.rb +145 -145
  619. data/spec/unit/knife/node_run_list_remove_spec.rb +106 -106
  620. data/spec/unit/knife/node_run_list_set_spec.rb +115 -115
  621. data/spec/unit/knife/node_show_spec.rb +65 -65
  622. data/spec/unit/knife/org_create_spec.rb +76 -76
  623. data/spec/unit/knife/org_delete_spec.rb +41 -41
  624. data/spec/unit/knife/org_edit_spec.rb +49 -49
  625. data/spec/unit/knife/org_list_spec.rb +58 -58
  626. data/spec/unit/knife/org_show_spec.rb +45 -45
  627. data/spec/unit/knife/org_user_add_spec.rb +39 -39
  628. data/spec/unit/knife/raw_spec.rb +43 -43
  629. data/spec/unit/knife/role_bulk_delete_spec.rb +80 -80
  630. data/spec/unit/knife/role_create_spec.rb +80 -80
  631. data/spec/unit/knife/role_delete_spec.rb +67 -67
  632. data/spec/unit/knife/role_edit_spec.rb +77 -77
  633. data/spec/unit/knife/role_env_run_list_add_spec.rb +217 -217
  634. data/spec/unit/knife/role_env_run_list_clear_spec.rb +94 -94
  635. data/spec/unit/knife/role_env_run_list_remove_spec.rb +102 -102
  636. data/spec/unit/knife/role_env_run_list_replace_spec.rb +105 -105
  637. data/spec/unit/knife/role_env_run_list_set_spec.rb +99 -99
  638. data/spec/unit/knife/role_from_file_spec.rb +69 -69
  639. data/spec/unit/knife/role_list_spec.rb +54 -54
  640. data/spec/unit/knife/role_run_list_add_spec.rb +179 -179
  641. data/spec/unit/knife/role_run_list_clear_spec.rb +84 -84
  642. data/spec/unit/knife/role_run_list_remove_spec.rb +92 -92
  643. data/spec/unit/knife/role_run_list_replace_spec.rb +98 -98
  644. data/spec/unit/knife/role_run_list_set_spec.rb +89 -89
  645. data/spec/unit/knife/role_show_spec.rb +59 -59
  646. data/spec/unit/knife/ssh_spec.rb +403 -403
  647. data/spec/unit/knife/ssl_check_spec.rb +256 -256
  648. data/spec/unit/knife/ssl_fetch_spec.rb +222 -222
  649. data/spec/unit/knife/status_spec.rb +112 -112
  650. data/spec/unit/knife/supermarket_download_spec.rb +152 -152
  651. data/spec/unit/knife/supermarket_install_spec.rb +203 -203
  652. data/spec/unit/knife/supermarket_list_spec.rb +70 -70
  653. data/spec/unit/knife/supermarket_search_spec.rb +85 -85
  654. data/spec/unit/knife/supermarket_share_spec.rb +208 -208
  655. data/spec/unit/knife/supermarket_unshare_spec.rb +78 -78
  656. data/spec/unit/knife/tag_create_spec.rb +23 -23
  657. data/spec/unit/knife/tag_delete_spec.rb +25 -25
  658. data/spec/unit/knife/tag_list_spec.rb +23 -23
  659. data/spec/unit/knife/user_create_spec.rb +282 -282
  660. data/spec/unit/knife/user_delete_spec.rb +171 -171
  661. data/spec/unit/knife/user_edit_spec.rb +54 -54
  662. data/spec/unit/knife/user_list_spec.rb +73 -73
  663. data/spec/unit/knife/user_password_spec.rb +64 -64
  664. data/spec/unit/knife/user_reregister_spec.rb +56 -56
  665. data/spec/unit/knife/user_show_spec.rb +91 -91
  666. data/spec/unit/knife_spec.rb +634 -634
  667. metadata +5 -5
@@ -1,403 +1,403 @@
1
- #
2
- # Author:: Bryan McLellan <btm@chef.io>
3
- # Copyright:: Copyright (c) Chef Software Inc.
4
- # License:: Apache License, Version 2.0
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
- #
18
-
19
- require "knife_spec_helper"
20
- require "net/ssh"
21
- require "net/ssh/multi"
22
-
23
- describe Chef::Knife::Ssh do
24
- let(:query_result) { double("chef search results") }
25
-
26
- before do
27
- Chef::Config[:client_key] = CHEF_SPEC_DATA + "/ssl/private_key.pem"
28
- @knife = Chef::Knife::Ssh.new
29
- @knife.merge_configs
30
- @node_foo = {}
31
- @node_foo["fqdn"] = "foo.example.org"
32
- @node_foo["ipaddress"] = "10.0.0.1"
33
- @node_foo["cloud"] = {}
34
-
35
- @node_bar = {}
36
- @node_bar["fqdn"] = "bar.example.org"
37
- @node_bar["ipaddress"] = "10.0.0.2"
38
- @node_bar["cloud"] = {}
39
-
40
- end
41
-
42
- describe "#configure_session" do
43
- context "manual is set to false (default)" do
44
- before do
45
- @knife.config[:manual] = false
46
- allow(query_result).to receive(:search).with(any_args).and_yield(@node_foo).and_yield(@node_bar)
47
- allow(Chef::Search::Query).to receive(:new).and_return(query_result)
48
- end
49
-
50
- def self.should_return_specified_attributes
51
- it "returns an array of the attributes specified on the command line OR config file, if only one is set" do
52
- @node_bar["target"] = "10.0.0.2"
53
- @node_foo["target"] = "10.0.0.1"
54
- @node_bar["prefix"] = "bar"
55
- @node_foo["prefix"] = "foo"
56
- @knife.config[:ssh_attribute] = "ipaddress"
57
- @knife.config[:prefix_attribute] = "name"
58
- Chef::Config[:knife][:ssh_attribute] = "ipaddress" # this value will be in the config file
59
- Chef::Config[:knife][:prefix_attribute] = "name" # this value will be in the config file
60
- expect(@knife).to receive(:session_from_list).with([["10.0.0.1", nil, "foo"], ["10.0.0.2", nil, "bar"]])
61
- @knife.configure_session
62
- end
63
-
64
- it "returns an array of the attributes specified on the command line even when a config value is set" do
65
- @node_bar["target"] = "10.0.0.2"
66
- @node_foo["target"] = "10.0.0.1"
67
- @node_bar["prefix"] = "bar"
68
- @node_foo["prefix"] = "foo"
69
- Chef::Config[:knife][:ssh_attribute] = "config_file" # this value will be in the config file
70
- Chef::Config[:knife][:prefix_attribute] = "config_file" # this value will be in the config file
71
- @knife.config[:ssh_attribute] = "ipaddress" # this is the value of the command line via #configure_attribute
72
- @knife.config[:prefix_attribute] = "name" # this is the value of the command line via #configure_attribute
73
- expect(@knife).to receive(:session_from_list).with([["10.0.0.1", nil, "foo"], ["10.0.0.2", nil, "bar"]])
74
- @knife.configure_session
75
- end
76
- end
77
-
78
- it "searches for and returns an array of fqdns" do
79
- expect(@knife).to receive(:session_from_list).with([
80
- ["foo.example.org", nil, nil],
81
- ["bar.example.org", nil, nil],
82
- ])
83
- @knife.configure_session
84
- end
85
-
86
- should_return_specified_attributes
87
-
88
- context "when cloud hostnames are available" do
89
- before do
90
- @node_foo["cloud"]["public_hostname"] = "ec2-10-0-0-1.compute-1.amazonaws.com"
91
- @node_bar["cloud"]["public_hostname"] = "ec2-10-0-0-2.compute-1.amazonaws.com"
92
- end
93
- it "returns an array of cloud public hostnames" do
94
- expect(@knife).to receive(:session_from_list).with([
95
- ["ec2-10-0-0-1.compute-1.amazonaws.com", nil, nil],
96
- ["ec2-10-0-0-2.compute-1.amazonaws.com", nil, nil],
97
- ])
98
- @knife.configure_session
99
- end
100
-
101
- should_return_specified_attributes
102
- end
103
-
104
- context "when cloud hostnames are available but empty" do
105
- before do
106
- @node_foo["cloud"]["public_hostname"] = ""
107
- @node_bar["cloud"]["public_hostname"] = ""
108
- end
109
-
110
- it "returns an array of fqdns" do
111
- expect(@knife).to receive(:session_from_list).with([
112
- ["foo.example.org", nil, nil],
113
- ["bar.example.org", nil, nil],
114
- ])
115
- @knife.configure_session
116
- end
117
-
118
- should_return_specified_attributes
119
- end
120
-
121
- it "should raise an error if no host are found" do
122
- allow(query_result).to receive(:search).with(any_args)
123
- expect(@knife.ui).to receive(:fatal)
124
- expect(@knife).to receive(:exit).with(10)
125
- @knife.configure_session
126
- end
127
-
128
- context "when there are some hosts found but they do not have an attribute to connect with" do
129
- before do
130
- @node_foo["fqdn"] = nil
131
- @node_bar["fqdn"] = nil
132
- end
133
-
134
- it "should raise a specific error (CHEF-3402)" do
135
- expect(@knife.ui).to receive(:fatal).with(/^2 nodes found/)
136
- expect(@knife).to receive(:exit).with(10)
137
- @knife.configure_session
138
- end
139
- end
140
-
141
- context "when there are some hosts found but IPs duplicated if duplicated_fqdns option sets :fatal" do
142
- before do
143
- @knife.config[:duplicated_fqdns] = :fatal
144
- @node_foo["fqdn"] = "foo.example.org"
145
- @node_bar["fqdn"] = "foo.example.org"
146
- end
147
-
148
- it "should raise a specific error" do
149
- expect(@knife.ui).to receive(:fatal).with(/^SSH node is duplicated: foo\.example\.org/)
150
- expect(@knife).to receive(:exit).with(10)
151
- expect(@knife).to receive(:session_from_list).with([
152
- ["foo.example.org", nil, nil],
153
- ["foo.example.org", nil, nil],
154
- ])
155
- @knife.configure_session
156
- end
157
- end
158
- end
159
-
160
- context "manual is set to true" do
161
- before do
162
- @knife.config[:manual] = true
163
- end
164
-
165
- it "returns an array of provided values" do
166
- @knife.instance_variable_set(:@name_args, ["foo.example.org bar.example.org"])
167
- expect(@knife).to receive(:session_from_list).with(["foo.example.org", "bar.example.org"])
168
- @knife.configure_session
169
- end
170
- end
171
- end
172
-
173
- describe "#get_prefix_attribute" do
174
- # Order of precedence for prefix
175
- # 1) config value (cli or knife config)
176
- # 2) nil
177
- before do
178
- Chef::Config[:knife][:prefix_attribute] = nil
179
- @knife.config[:prefix_attribute] = nil
180
- @node_foo["cloud"]["public_hostname"] = "ec2-10-0-0-1.compute-1.amazonaws.com"
181
- @node_bar["cloud"]["public_hostname"] = ""
182
- end
183
-
184
- it "should return nil by default" do
185
- expect(@knife.get_prefix_attribute({})).to eq(nil)
186
- end
187
-
188
- it "should favor config over nil" do
189
- @node_foo["prefix"] = "config"
190
- expect( @knife.get_prefix_attribute(@node_foo)).to eq("config")
191
- end
192
- end
193
-
194
- describe "#get_ssh_attribute" do
195
- # Order of precedence for ssh target
196
- # 1) config value (cli or knife config)
197
- # 2) cloud attribute
198
- # 3) fqdn
199
- before do
200
- Chef::Config[:knife][:ssh_attribute] = nil
201
- @knife.config[:ssh_attribute] = nil
202
- @node_foo["cloud"]["public_hostname"] = "ec2-10-0-0-1.compute-1.amazonaws.com"
203
- @node_bar["cloud"]["public_hostname"] = ""
204
- end
205
-
206
- it "should return fqdn by default" do
207
- expect(@knife.get_ssh_attribute({ "fqdn" => "fqdn" })).to eq("fqdn")
208
- end
209
-
210
- it "should return cloud.public_hostname attribute if available" do
211
- expect(@knife.get_ssh_attribute(@node_foo)).to eq("ec2-10-0-0-1.compute-1.amazonaws.com")
212
- end
213
-
214
- it "should favor config over cloud and default" do
215
- @node_foo["target"] = "config"
216
- expect( @knife.get_ssh_attribute(@node_foo)).to eq("config")
217
- end
218
-
219
- it "should return fqdn if cloud.hostname is empty" do
220
- expect( @knife.get_ssh_attribute(@node_bar)).to eq("bar.example.org")
221
- end
222
- end
223
-
224
- describe "#session_from_list" do
225
- before :each do
226
- @knife.instance_variable_set(:@longest, 0)
227
- ssh_config = { timeout: 50, user: "locutus", port: 23, keepalive: true, keepalive_interval: 60 }
228
- allow(Net::SSH).to receive(:configuration_for).with("the.b.org", true).and_return(ssh_config)
229
- end
230
-
231
- it "uses the port from an ssh config file" do
232
- @knife.session_from_list([["the.b.org", nil, nil]])
233
- expect(@knife.session.servers[0].port).to eq(23)
234
- end
235
-
236
- it "uses the port from a cloud attr" do
237
- @knife.session_from_list([["the.b.org", 123, nil]])
238
- expect(@knife.session.servers[0].port).to eq(123)
239
- end
240
-
241
- it "uses the prefix from list" do
242
- @knife.session_from_list([["the.b.org", nil, "b-team"]])
243
- expect(@knife.session.servers[0][:prefix]).to eq("b-team")
244
- end
245
-
246
- it "defaults to a prefix of host" do
247
- @knife.session_from_list([["the.b.org", nil, nil]])
248
- expect(@knife.session.servers[0][:prefix]).to eq("the.b.org")
249
- end
250
-
251
- it "defaults to a timeout of 120 seconds" do
252
- @knife.session_from_list([["the.b.org", nil, nil]])
253
- expect(@knife.session.servers[0].options[:timeout]).to eq(120)
254
- end
255
-
256
- it "uses the timeout from the CLI" do
257
- @knife.config = {}
258
- Chef::Config[:knife][:ssh_timeout] = nil
259
- @knife.config[:ssh_timeout] = 5
260
- @knife.session_from_list([["the.b.org", nil, nil]])
261
- @knife.merge_configs
262
- expect(@knife.session.servers[0].options[:timeout]).to eq(5)
263
- end
264
-
265
- it "uses the timeout from knife config" do
266
- @knife.config = {}
267
- Chef::Config[:knife][:ssh_timeout] = 6
268
- @knife.merge_configs
269
- @knife.session_from_list([["the.b.org", nil, nil]])
270
- expect(@knife.session.servers[0].options[:timeout]).to eq(6)
271
- end
272
-
273
- it "uses the user from an ssh config file" do
274
- @knife.session_from_list([["the.b.org", 123, nil]])
275
- expect(@knife.session.servers[0].user).to eq("locutus")
276
- end
277
-
278
- it "uses keepalive settings from an ssh config file" do
279
- @knife.session_from_list([["the.b.org", 123, nil]])
280
- expect(@knife.session.servers[0].options[:keepalive]).to be true
281
- expect(@knife.session.servers[0].options[:keepalive_interval]).to eq 60
282
- end
283
- end
284
-
285
- describe "#ssh_command" do
286
- let(:execution_channel) { double(:execution_channel, on_data: nil, on_extended_data: nil) }
287
- let(:session_channel) { double(:session_channel, request_pty: nil) }
288
-
289
- let(:execution_channel2) { double(:execution_channel, on_data: nil, on_extended_data: nil) }
290
- let(:session_channel2) { double(:session_channel, request_pty: nil) }
291
-
292
- let(:session) { double(:session, loop: nil, close: nil) }
293
-
294
- let(:command) { "false" }
295
-
296
- before do
297
- expect(execution_channel)
298
- .to receive(:on_request)
299
- .and_yield(nil, double(:data_stream, read_long: exit_status))
300
-
301
- expect(session_channel)
302
- .to receive(:exec)
303
- .with(command)
304
- .and_yield(execution_channel, true)
305
-
306
- expect(execution_channel2)
307
- .to receive(:on_request)
308
- .and_yield(nil, double(:data_stream, read_long: exit_status2))
309
-
310
- expect(session_channel2)
311
- .to receive(:exec)
312
- .with(command)
313
- .and_yield(execution_channel2, true)
314
-
315
- expect(session)
316
- .to receive(:open_channel)
317
- .and_yield(session_channel)
318
- .and_yield(session_channel2)
319
- end
320
-
321
- context "both connections return 0" do
322
- let(:exit_status) { 0 }
323
- let(:exit_status2) { 0 }
324
-
325
- it "returns a 0 exit code" do
326
- expect(@knife.ssh_command(command, session)).to eq(0)
327
- end
328
- end
329
-
330
- context "the first connection returns 1 and the second returns 0" do
331
- let(:exit_status) { 1 }
332
- let(:exit_status2) { 0 }
333
-
334
- it "returns a non-zero exit code" do
335
- expect(@knife.ssh_command(command, session)).to eq(1)
336
- end
337
- end
338
-
339
- context "the first connection returns 1 and the second returns 2" do
340
- let(:exit_status) { 1 }
341
- let(:exit_status2) { 2 }
342
-
343
- it "returns a non-zero exit code" do
344
- expect(@knife.ssh_command(command, session)).to eq(2)
345
- end
346
- end
347
- end
348
-
349
- describe "#tmux" do
350
- before do
351
- ssh_config = { timeout: 50, user: "locutus", port: 23, keepalive: true, keepalive_interval: 60 }
352
- allow(Net::SSH).to receive(:configuration_for).with("foo.example.org", true).and_return(ssh_config)
353
- @query = Chef::Search::Query.new
354
- expect(@query).to receive(:search).and_yield(@node_foo)
355
- allow(Chef::Search::Query).to receive(:new).and_return(@query)
356
- allow(@knife).to receive(:exec).and_return(0)
357
- end
358
-
359
- it "filters out invalid characters from tmux session name" do
360
- @knife.name_args = ["name:foo.example.org", "tmux"]
361
- expect(@knife).to receive(:shell_out!).with("tmux new-session -d -s 'knife ssh name=foo-example-org' -n 'foo.example.org' 'ssh locutus@foo.example.org' ")
362
- @knife.run
363
- end
364
- end
365
-
366
- describe "#run" do
367
-
368
- it "should print usage and exit when a SEARCH QUERY is not provided" do
369
- @knife.name_args = []
370
- expect(@knife).to receive(:show_usage)
371
- expect(@knife.ui).to receive(:fatal).with(/You must specify the SEARCH QUERY./)
372
- expect { @knife.run }.to raise_error(SystemExit)
373
- end
374
-
375
- context "exit" do
376
- before do
377
- @query = Chef::Search::Query.new
378
- expect(@query).to receive(:search).and_yield(@node_foo)
379
- allow(Chef::Search::Query).to receive(:new).and_return(@query)
380
- allow(@knife).to receive(:ssh_command).and_return(exit_code)
381
- @knife.name_args = ["*:*", "false"]
382
- end
383
-
384
- context "with an error" do
385
- let(:exit_code) { 1 }
386
-
387
- it "should exit with a non-zero exit code" do
388
- expect(@knife).to receive(:exit).with(exit_code)
389
- @knife.run
390
- end
391
- end
392
-
393
- context "with no error" do
394
- let(:exit_code) { 0 }
395
-
396
- it "should not exit" do
397
- expect(@knife).not_to receive(:exit)
398
- @knife.run
399
- end
400
- end
401
- end
402
- end
403
- end
1
+ #
2
+ # Author:: Bryan McLellan <btm@chef.io>
3
+ # Copyright:: Copyright (c) Chef Software Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require "knife_spec_helper"
20
+ require "net/ssh"
21
+ require "net/ssh/multi"
22
+
23
+ describe Chef::Knife::Ssh do
24
+ let(:query_result) { double("chef search results") }
25
+
26
+ before do
27
+ Chef::Config[:client_key] = CHEF_SPEC_DATA + "/ssl/private_key.pem"
28
+ @knife = Chef::Knife::Ssh.new
29
+ @knife.merge_configs
30
+ @node_foo = {}
31
+ @node_foo["fqdn"] = "foo.example.org"
32
+ @node_foo["ipaddress"] = "10.0.0.1"
33
+ @node_foo["cloud"] = {}
34
+
35
+ @node_bar = {}
36
+ @node_bar["fqdn"] = "bar.example.org"
37
+ @node_bar["ipaddress"] = "10.0.0.2"
38
+ @node_bar["cloud"] = {}
39
+
40
+ end
41
+
42
+ describe "#configure_session" do
43
+ context "manual is set to false (default)" do
44
+ before do
45
+ @knife.config[:manual] = false
46
+ allow(query_result).to receive(:search).with(any_args).and_yield(@node_foo).and_yield(@node_bar)
47
+ allow(Chef::Search::Query).to receive(:new).and_return(query_result)
48
+ end
49
+
50
+ def self.should_return_specified_attributes
51
+ it "returns an array of the attributes specified on the command line OR config file, if only one is set" do
52
+ @node_bar["target"] = "10.0.0.2"
53
+ @node_foo["target"] = "10.0.0.1"
54
+ @node_bar["prefix"] = "bar"
55
+ @node_foo["prefix"] = "foo"
56
+ @knife.config[:ssh_attribute] = "ipaddress"
57
+ @knife.config[:prefix_attribute] = "name"
58
+ Chef::Config[:knife][:ssh_attribute] = "ipaddress" # this value will be in the config file
59
+ Chef::Config[:knife][:prefix_attribute] = "name" # this value will be in the config file
60
+ expect(@knife).to receive(:session_from_list).with([["10.0.0.1", nil, "foo"], ["10.0.0.2", nil, "bar"]])
61
+ @knife.configure_session
62
+ end
63
+
64
+ it "returns an array of the attributes specified on the command line even when a config value is set" do
65
+ @node_bar["target"] = "10.0.0.2"
66
+ @node_foo["target"] = "10.0.0.1"
67
+ @node_bar["prefix"] = "bar"
68
+ @node_foo["prefix"] = "foo"
69
+ Chef::Config[:knife][:ssh_attribute] = "config_file" # this value will be in the config file
70
+ Chef::Config[:knife][:prefix_attribute] = "config_file" # this value will be in the config file
71
+ @knife.config[:ssh_attribute] = "ipaddress" # this is the value of the command line via #configure_attribute
72
+ @knife.config[:prefix_attribute] = "name" # this is the value of the command line via #configure_attribute
73
+ expect(@knife).to receive(:session_from_list).with([["10.0.0.1", nil, "foo"], ["10.0.0.2", nil, "bar"]])
74
+ @knife.configure_session
75
+ end
76
+ end
77
+
78
+ it "searches for and returns an array of fqdns" do
79
+ expect(@knife).to receive(:session_from_list).with([
80
+ ["foo.example.org", nil, nil],
81
+ ["bar.example.org", nil, nil],
82
+ ])
83
+ @knife.configure_session
84
+ end
85
+
86
+ should_return_specified_attributes
87
+
88
+ context "when cloud hostnames are available" do
89
+ before do
90
+ @node_foo["cloud"]["public_hostname"] = "ec2-10-0-0-1.compute-1.amazonaws.com"
91
+ @node_bar["cloud"]["public_hostname"] = "ec2-10-0-0-2.compute-1.amazonaws.com"
92
+ end
93
+ it "returns an array of cloud public hostnames" do
94
+ expect(@knife).to receive(:session_from_list).with([
95
+ ["ec2-10-0-0-1.compute-1.amazonaws.com", nil, nil],
96
+ ["ec2-10-0-0-2.compute-1.amazonaws.com", nil, nil],
97
+ ])
98
+ @knife.configure_session
99
+ end
100
+
101
+ should_return_specified_attributes
102
+ end
103
+
104
+ context "when cloud hostnames are available but empty" do
105
+ before do
106
+ @node_foo["cloud"]["public_hostname"] = ""
107
+ @node_bar["cloud"]["public_hostname"] = ""
108
+ end
109
+
110
+ it "returns an array of fqdns" do
111
+ expect(@knife).to receive(:session_from_list).with([
112
+ ["foo.example.org", nil, nil],
113
+ ["bar.example.org", nil, nil],
114
+ ])
115
+ @knife.configure_session
116
+ end
117
+
118
+ should_return_specified_attributes
119
+ end
120
+
121
+ it "should raise an error if no host are found" do
122
+ allow(query_result).to receive(:search).with(any_args)
123
+ expect(@knife.ui).to receive(:fatal)
124
+ expect(@knife).to receive(:exit).with(10)
125
+ @knife.configure_session
126
+ end
127
+
128
+ context "when there are some hosts found but they do not have an attribute to connect with" do
129
+ before do
130
+ @node_foo["fqdn"] = nil
131
+ @node_bar["fqdn"] = nil
132
+ end
133
+
134
+ it "should raise a specific error (CHEF-3402)" do
135
+ expect(@knife.ui).to receive(:fatal).with(/^2 nodes found/)
136
+ expect(@knife).to receive(:exit).with(10)
137
+ @knife.configure_session
138
+ end
139
+ end
140
+
141
+ context "when there are some hosts found but IPs duplicated if duplicated_fqdns option sets :fatal" do
142
+ before do
143
+ @knife.config[:duplicated_fqdns] = :fatal
144
+ @node_foo["fqdn"] = "foo.example.org"
145
+ @node_bar["fqdn"] = "foo.example.org"
146
+ end
147
+
148
+ it "should raise a specific error" do
149
+ expect(@knife.ui).to receive(:fatal).with(/^SSH node is duplicated: foo\.example\.org/)
150
+ expect(@knife).to receive(:exit).with(10)
151
+ expect(@knife).to receive(:session_from_list).with([
152
+ ["foo.example.org", nil, nil],
153
+ ["foo.example.org", nil, nil],
154
+ ])
155
+ @knife.configure_session
156
+ end
157
+ end
158
+ end
159
+
160
+ context "manual is set to true" do
161
+ before do
162
+ @knife.config[:manual] = true
163
+ end
164
+
165
+ it "returns an array of provided values" do
166
+ @knife.instance_variable_set(:@name_args, ["foo.example.org bar.example.org"])
167
+ expect(@knife).to receive(:session_from_list).with(["foo.example.org", "bar.example.org"])
168
+ @knife.configure_session
169
+ end
170
+ end
171
+ end
172
+
173
+ describe "#get_prefix_attribute" do
174
+ # Order of precedence for prefix
175
+ # 1) config value (cli or knife config)
176
+ # 2) nil
177
+ before do
178
+ Chef::Config[:knife][:prefix_attribute] = nil
179
+ @knife.config[:prefix_attribute] = nil
180
+ @node_foo["cloud"]["public_hostname"] = "ec2-10-0-0-1.compute-1.amazonaws.com"
181
+ @node_bar["cloud"]["public_hostname"] = ""
182
+ end
183
+
184
+ it "should return nil by default" do
185
+ expect(@knife.get_prefix_attribute({})).to eq(nil)
186
+ end
187
+
188
+ it "should favor config over nil" do
189
+ @node_foo["prefix"] = "config"
190
+ expect( @knife.get_prefix_attribute(@node_foo)).to eq("config")
191
+ end
192
+ end
193
+
194
+ describe "#get_ssh_attribute" do
195
+ # Order of precedence for ssh target
196
+ # 1) config value (cli or knife config)
197
+ # 2) cloud attribute
198
+ # 3) fqdn
199
+ before do
200
+ Chef::Config[:knife][:ssh_attribute] = nil
201
+ @knife.config[:ssh_attribute] = nil
202
+ @node_foo["cloud"]["public_hostname"] = "ec2-10-0-0-1.compute-1.amazonaws.com"
203
+ @node_bar["cloud"]["public_hostname"] = ""
204
+ end
205
+
206
+ it "should return fqdn by default" do
207
+ expect(@knife.get_ssh_attribute({ "fqdn" => "fqdn" })).to eq("fqdn")
208
+ end
209
+
210
+ it "should return cloud.public_hostname attribute if available" do
211
+ expect(@knife.get_ssh_attribute(@node_foo)).to eq("ec2-10-0-0-1.compute-1.amazonaws.com")
212
+ end
213
+
214
+ it "should favor config over cloud and default" do
215
+ @node_foo["target"] = "config"
216
+ expect( @knife.get_ssh_attribute(@node_foo)).to eq("config")
217
+ end
218
+
219
+ it "should return fqdn if cloud.hostname is empty" do
220
+ expect( @knife.get_ssh_attribute(@node_bar)).to eq("bar.example.org")
221
+ end
222
+ end
223
+
224
+ describe "#session_from_list" do
225
+ before :each do
226
+ @knife.instance_variable_set(:@longest, 0)
227
+ ssh_config = { timeout: 50, user: "locutus", port: 23, keepalive: true, keepalive_interval: 60 }
228
+ allow(Net::SSH).to receive(:configuration_for).with("the.b.org", true).and_return(ssh_config)
229
+ end
230
+
231
+ it "uses the port from an ssh config file" do
232
+ @knife.session_from_list([["the.b.org", nil, nil]])
233
+ expect(@knife.session.servers[0].port).to eq(23)
234
+ end
235
+
236
+ it "uses the port from a cloud attr" do
237
+ @knife.session_from_list([["the.b.org", 123, nil]])
238
+ expect(@knife.session.servers[0].port).to eq(123)
239
+ end
240
+
241
+ it "uses the prefix from list" do
242
+ @knife.session_from_list([["the.b.org", nil, "b-team"]])
243
+ expect(@knife.session.servers[0][:prefix]).to eq("b-team")
244
+ end
245
+
246
+ it "defaults to a prefix of host" do
247
+ @knife.session_from_list([["the.b.org", nil, nil]])
248
+ expect(@knife.session.servers[0][:prefix]).to eq("the.b.org")
249
+ end
250
+
251
+ it "defaults to a timeout of 120 seconds" do
252
+ @knife.session_from_list([["the.b.org", nil, nil]])
253
+ expect(@knife.session.servers[0].options[:timeout]).to eq(120)
254
+ end
255
+
256
+ it "uses the timeout from the CLI" do
257
+ @knife.config = {}
258
+ Chef::Config[:knife][:ssh_timeout] = nil
259
+ @knife.config[:ssh_timeout] = 5
260
+ @knife.session_from_list([["the.b.org", nil, nil]])
261
+ @knife.merge_configs
262
+ expect(@knife.session.servers[0].options[:timeout]).to eq(5)
263
+ end
264
+
265
+ it "uses the timeout from knife config" do
266
+ @knife.config = {}
267
+ Chef::Config[:knife][:ssh_timeout] = 6
268
+ @knife.merge_configs
269
+ @knife.session_from_list([["the.b.org", nil, nil]])
270
+ expect(@knife.session.servers[0].options[:timeout]).to eq(6)
271
+ end
272
+
273
+ it "uses the user from an ssh config file" do
274
+ @knife.session_from_list([["the.b.org", 123, nil]])
275
+ expect(@knife.session.servers[0].user).to eq("locutus")
276
+ end
277
+
278
+ it "uses keepalive settings from an ssh config file" do
279
+ @knife.session_from_list([["the.b.org", 123, nil]])
280
+ expect(@knife.session.servers[0].options[:keepalive]).to be true
281
+ expect(@knife.session.servers[0].options[:keepalive_interval]).to eq 60
282
+ end
283
+ end
284
+
285
+ describe "#ssh_command" do
286
+ let(:execution_channel) { double(:execution_channel, on_data: nil, on_extended_data: nil) }
287
+ let(:session_channel) { double(:session_channel, request_pty: nil) }
288
+
289
+ let(:execution_channel2) { double(:execution_channel, on_data: nil, on_extended_data: nil) }
290
+ let(:session_channel2) { double(:session_channel, request_pty: nil) }
291
+
292
+ let(:session) { double(:session, loop: nil, close: nil) }
293
+
294
+ let(:command) { "false" }
295
+
296
+ before do
297
+ expect(execution_channel)
298
+ .to receive(:on_request)
299
+ .and_yield(nil, double(:data_stream, read_long: exit_status))
300
+
301
+ expect(session_channel)
302
+ .to receive(:exec)
303
+ .with(command)
304
+ .and_yield(execution_channel, true)
305
+
306
+ expect(execution_channel2)
307
+ .to receive(:on_request)
308
+ .and_yield(nil, double(:data_stream, read_long: exit_status2))
309
+
310
+ expect(session_channel2)
311
+ .to receive(:exec)
312
+ .with(command)
313
+ .and_yield(execution_channel2, true)
314
+
315
+ expect(session)
316
+ .to receive(:open_channel)
317
+ .and_yield(session_channel)
318
+ .and_yield(session_channel2)
319
+ end
320
+
321
+ context "both connections return 0" do
322
+ let(:exit_status) { 0 }
323
+ let(:exit_status2) { 0 }
324
+
325
+ it "returns a 0 exit code" do
326
+ expect(@knife.ssh_command(command, session)).to eq(0)
327
+ end
328
+ end
329
+
330
+ context "the first connection returns 1 and the second returns 0" do
331
+ let(:exit_status) { 1 }
332
+ let(:exit_status2) { 0 }
333
+
334
+ it "returns a non-zero exit code" do
335
+ expect(@knife.ssh_command(command, session)).to eq(1)
336
+ end
337
+ end
338
+
339
+ context "the first connection returns 1 and the second returns 2" do
340
+ let(:exit_status) { 1 }
341
+ let(:exit_status2) { 2 }
342
+
343
+ it "returns a non-zero exit code" do
344
+ expect(@knife.ssh_command(command, session)).to eq(2)
345
+ end
346
+ end
347
+ end
348
+
349
+ describe "#tmux" do
350
+ before do
351
+ ssh_config = { timeout: 50, user: "locutus", port: 23, keepalive: true, keepalive_interval: 60 }
352
+ allow(Net::SSH).to receive(:configuration_for).with("foo.example.org", true).and_return(ssh_config)
353
+ @query = Chef::Search::Query.new
354
+ expect(@query).to receive(:search).and_yield(@node_foo)
355
+ allow(Chef::Search::Query).to receive(:new).and_return(@query)
356
+ allow(@knife).to receive(:exec).and_return(0)
357
+ end
358
+
359
+ it "filters out invalid characters from tmux session name" do
360
+ @knife.name_args = ["name:foo.example.org", "tmux"]
361
+ expect(@knife).to receive(:shell_out!).with("tmux new-session -d -s 'knife ssh name=foo-example-org' -n 'foo.example.org' 'ssh locutus@foo.example.org' ")
362
+ @knife.run
363
+ end
364
+ end
365
+
366
+ describe "#run" do
367
+
368
+ it "should print usage and exit when a SEARCH QUERY is not provided" do
369
+ @knife.name_args = []
370
+ expect(@knife).to receive(:show_usage)
371
+ expect(@knife.ui).to receive(:fatal).with(/You must specify the SEARCH QUERY./)
372
+ expect { @knife.run }.to raise_error(SystemExit)
373
+ end
374
+
375
+ context "exit" do
376
+ before do
377
+ @query = Chef::Search::Query.new
378
+ expect(@query).to receive(:search).and_yield(@node_foo)
379
+ allow(Chef::Search::Query).to receive(:new).and_return(@query)
380
+ allow(@knife).to receive(:ssh_command).and_return(exit_code)
381
+ @knife.name_args = ["*:*", "false"]
382
+ end
383
+
384
+ context "with an error" do
385
+ let(:exit_code) { 1 }
386
+
387
+ it "should exit with a non-zero exit code" do
388
+ expect(@knife).to receive(:exit).with(exit_code)
389
+ @knife.run
390
+ end
391
+ end
392
+
393
+ context "with no error" do
394
+ let(:exit_code) { 0 }
395
+
396
+ it "should not exit" do
397
+ expect(@knife).not_to receive(:exit)
398
+ @knife.run
399
+ end
400
+ end
401
+ end
402
+ end
403
+ end