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,426 +1,426 @@
1
- #
2
- # Author:: Matthew Kent (<mkent@magoazul.com>)
3
- # Author:: Steven Danna (<steve@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
- require "knife_spec_helper"
21
-
22
- require "chef/cookbook_uploader"
23
- require "timeout"
24
-
25
- describe Chef::Knife::CookbookUpload do
26
- let(:cookbook) do
27
- cookbook = Chef::CookbookVersion.new("test_cookbook", "/tmp/blah")
28
- allow(cookbook).to receive(:has_metadata_file?).and_return(true)
29
- allow(cookbook.metadata).to receive(:name).and_return(cookbook.name)
30
- cookbook
31
- end
32
-
33
- let(:cookbooks_by_name) do
34
- { cookbook.name => cookbook }
35
- end
36
-
37
- let(:cookbook_loader) do
38
- cookbook_loader = cookbooks_by_name.dup
39
- allow(cookbook_loader).to receive(:merged_cookbooks).and_return([])
40
- allow(cookbook_loader).to receive(:load_cookbooks).and_return(cookbook_loader)
41
- allow(cookbook_loader).to receive(:compile_metadata).and_return(nil)
42
- allow(cookbook_loader).to receive(:freeze_versions).and_return(nil)
43
- cookbook_loader
44
- end
45
-
46
- let(:cookbook_uploader) { double(upload_cookbooks: nil) }
47
-
48
- let(:output) { StringIO.new }
49
-
50
- let(:name_args) { ["test_cookbook"] }
51
-
52
- let(:knife) do
53
- k = Chef::Knife::CookbookUpload.new
54
- k.name_args = name_args
55
- allow(k.ui).to receive(:stdout).and_return(output)
56
- allow(k.ui).to receive(:stderr).and_return(output)
57
- k
58
- end
59
-
60
- before(:each) do
61
- allow(Chef::CookbookLoader).to receive(:new).and_return(cookbook_loader)
62
- allow(Chef::CookbookLoader).to receive(:copy_to_tmp_dir_from_array).and_yield(cookbook_loader)
63
- allow(Chef::CookbookVersion).to receive(:list).and_return({})
64
- allow(Chef::CookbookVersion).to receive(:list_all_versions).and_return({})
65
- end
66
-
67
- describe "with --concurrency" do
68
- it "should upload cookbooks with predefined concurrency" do
69
- knife.config[:concurrency] = 3
70
- test_cookbook = Chef::CookbookVersion.new("test_cookbook", "/tmp/blah")
71
- allow(cookbook_loader).to receive(:each).and_yield("test_cookbook", test_cookbook)
72
- allow(cookbook_loader).to receive(:cookbook_names).and_return(["test_cookbook"])
73
- expect(Chef::CookbookUploader).to receive(:new)
74
- .with( kind_of(Array), { force: nil, concurrency: 3 })
75
- .and_return(double("Chef::CookbookUploader", upload_cookbooks: true))
76
- knife.run
77
- end
78
- end
79
-
80
- describe "run" do
81
- before(:each) do
82
- allow(Chef::CookbookUploader).to receive_messages(new: cookbook_uploader)
83
- end
84
-
85
- it "should print usage and exit when a cookbook name is not provided" do
86
- knife.name_args = []
87
- expect(knife).to receive(:show_usage)
88
- expect(knife.ui).to receive(:fatal)
89
- expect { knife.run }.to raise_error(SystemExit)
90
- end
91
-
92
- describe "when specifying cookbook without metadata.rb or metadata.json" do
93
- let(:name_args) { ["test_cookbook1"] }
94
- let(:cookbook) do
95
- cookbook = Chef::CookbookVersion.new("test_cookbook1", "/tmp/blah")
96
- allow(cookbook).to receive(:has_metadata_file?).and_return(false)
97
- cookbook
98
- end
99
-
100
- it "should upload the cookbook" do
101
- expect { knife.run }.to raise_error(Chef::Exceptions::MetadataNotFound)
102
- end
103
- end
104
-
105
- describe "when name attribute in metadata not set" do
106
- let(:name_args) { ["test_cookbook1"] }
107
-
108
- let(:cookbook) do
109
- cookbook = Chef::CookbookVersion.new("test_cookbook1", "/tmp/blah")
110
- allow(cookbook).to receive(:has_metadata_file?).and_return(true)
111
- allow(cookbook.metadata).to receive(:name).and_return(nil)
112
- cookbook
113
- end
114
-
115
- it "should upload the cookbook" do
116
- expect { knife.run }.to raise_error(Chef::Exceptions::MetadataNotValid)
117
- end
118
- end
119
-
120
- describe "when specifying a cookbook name" do
121
- it "should upload the cookbook" do
122
- expect(knife).to receive(:upload).once
123
- knife.run
124
- end
125
-
126
- it "should report on success" do
127
- expect(knife).to receive(:upload).once
128
- expect(knife.ui).to receive(:info).with(/Uploaded 1 cookbook/)
129
- knife.run
130
- end
131
- end
132
-
133
- describe "when specifying the same cookbook name twice" do
134
- it "should upload the cookbook only once" do
135
- knife.name_args = %w{test_cookbook test_cookbook}
136
- expect(knife).to receive(:upload).once
137
- knife.run
138
- end
139
- end
140
-
141
- describe "when specifying a cookbook name among many" do
142
- let(:name_args) { ["test_cookbook1"] }
143
-
144
- let(:cookbook) do
145
- cookbook = Chef::CookbookVersion.new("test_cookbook1", "/tmp/blah")
146
- allow(cookbook).to receive(:has_metadata_file?).and_return(true)
147
- allow(cookbook.metadata).to receive(:name).and_return(cookbook.name)
148
- cookbook
149
- end
150
-
151
- let(:cookbooks_by_name) do
152
- { cookbook.name => cookbook }
153
- end
154
-
155
- it "should read only one cookbook" do
156
- expect(cookbook_loader).to receive(:[]).once.with("test_cookbook1").and_call_original
157
- knife.run
158
- end
159
-
160
- it "should not read all cookbooks" do
161
- expect(cookbook_loader).to receive(:load_cookbooks)
162
- knife.run
163
- end
164
-
165
- it "should upload only one cookbook" do
166
- expect(knife).to receive(:upload).exactly(1).times
167
- knife.run
168
- end
169
- end
170
-
171
- # This is testing too much. We should break it up.
172
- describe "when specifying a cookbook name with dependencies" do
173
- let(:name_args) { ["test_cookbook2"] }
174
-
175
- let(:test_cookbook1) do
176
- cookbook = Chef::CookbookVersion.new("test_cookbook1", "/tmp/blah")
177
- allow(cookbook).to receive(:has_metadata_file?).and_return(true)
178
- allow(cookbook.metadata).to receive(:name).and_return(cookbook.name)
179
- cookbook
180
- end
181
-
182
- let(:test_cookbook2) do
183
- c = Chef::CookbookVersion.new("test_cookbook2")
184
- c.metadata.depends("test_cookbook3")
185
- allow(c).to receive(:has_metadata_file?).and_return(true)
186
- allow(c.metadata).to receive(:name).and_return(c.name)
187
- c
188
- end
189
-
190
- let(:test_cookbook3) do
191
- c = Chef::CookbookVersion.new("test_cookbook3")
192
- c.metadata.depends("test_cookbook1")
193
- c.metadata.depends("test_cookbook2")
194
- allow(c).to receive(:has_metadata_file?).and_return(true)
195
- allow(c.metadata).to receive(:name).and_return(c.name)
196
- c
197
- end
198
-
199
- let(:cookbooks_by_name) do
200
- { "test_cookbook1" => test_cookbook1,
201
- "test_cookbook2" => test_cookbook2,
202
- "test_cookbook3" => test_cookbook3 }
203
- end
204
-
205
- it "should upload all dependencies once" do
206
- knife.config[:depends] = true
207
- allow(knife).to receive(:cookbook_names).and_return(%w{test_cookbook1 test_cookbook2 test_cookbook3})
208
- expect(knife).to receive(:upload).exactly(3).times
209
- expect do
210
- Timeout.timeout(5) do
211
- knife.run
212
- end
213
- end.not_to raise_error
214
- end
215
- end
216
-
217
- context "when chef_dependencies config is disabled" do
218
- before do
219
- knife.config[:check_dependencies] = false
220
- end
221
-
222
- describe "when specifying a cookbook name with missing dependencies" do
223
- let(:cookbook_dependency) { Chef::CookbookVersion.new("dependency", "/tmp/blah") }
224
-
225
- before(:each) do
226
- cookbook.metadata.depends("dependency")
227
- allow(cookbook_loader).to receive(:[]) do |ckbk|
228
- { "test_cookbook" => cookbook,
229
- "dependency" => cookbook_dependency }[ckbk]
230
- end
231
- allow(knife).to receive(:cookbook_names).and_return(%w{cookbook_dependency test_cookbook})
232
- @stdout, @stderr, @stdin = StringIO.new, StringIO.new, StringIO.new
233
- knife.ui = Chef::Knife::UI.new(@stdout, @stderr, @stdin, {})
234
- end
235
-
236
- it "should not fetch all cookbooks from Chef Infra Server" do
237
- expect(Chef::CookbookVersion).not_to receive(:list_all_versions)
238
- knife.run
239
- end
240
-
241
- it "should upload the cookbook" do
242
- expect(cookbook_loader).to receive(:[]).once.with("test_cookbook")
243
- expect(cookbook_uploader).to receive(:upload_cookbooks)
244
- knife.run
245
- end
246
-
247
- it "should not output a message for a single missing dependency" do
248
- knife.run
249
- expect(@stderr.string).not_to include("Cookbook test_cookbook depends on cookbooks which are not currently")
250
- expect(@stderr.string).not_to include("being uploaded and cannot be found on the server.")
251
- expect(@stderr.string).not_to include("The missing cookbook(s) are: 'dependency' version '>= 0.0.0'")
252
- end
253
-
254
- it "should not output a message for a multiple missing dependencies which are concatenated" do
255
- cookbook_dependency2 = Chef::CookbookVersion.new("dependency2")
256
- cookbook.metadata.depends("dependency2")
257
- allow(cookbook_loader).to receive(:[]) do |ckbk|
258
- { "test_cookbook" => cookbook,
259
- "dependency" => cookbook_dependency,
260
- "dependency2" => cookbook_dependency2 }[ckbk]
261
- end
262
- allow(knife).to receive(:cookbook_names).and_return(%w{dependency dependency2 test_cookbook})
263
- knife.run
264
- expect(@stderr.string).not_to include("Cookbook test_cookbook depends on cookbooks which are not currently")
265
- expect(@stderr.string).not_to include("being uploaded and cannot be found on the server.")
266
- expect(@stderr.string).not_to include("The missing cookbook(s) are:")
267
- expect(@stderr.string).not_to include("'dependency' version '>= 0.0.0'")
268
- expect(@stderr.string).not_to include("'dependency2' version '>= 0.0.0'")
269
- end
270
- end
271
- end
272
-
273
- context "when chef_dependencies config is enabled" do
274
- before do
275
- knife.config[:check_dependencies] = true
276
- end
277
-
278
- describe "when specifying a cookbook name with missing dependencies" do
279
- let(:cookbook_dependency) { Chef::CookbookVersion.new("dependency", "/tmp/blah") }
280
-
281
- before(:each) do
282
- cookbook.metadata.depends("dependency")
283
- allow(cookbook_loader).to receive(:[]) do |ckbk|
284
- { "test_cookbook" => cookbook,
285
- "dependency" => cookbook_dependency }[ckbk]
286
- end
287
- allow(knife).to receive(:cookbook_names).and_return(%w{cookbook_dependency test_cookbook})
288
- @stdout, @stderr, @stdin = StringIO.new, StringIO.new, StringIO.new
289
- knife.ui = Chef::Knife::UI.new(@stdout, @stderr, @stdin, {})
290
- end
291
-
292
- it "should exit and not upload the cookbook" do
293
- expect(cookbook_loader).to receive(:[]).once.with("test_cookbook")
294
- expect(cookbook_uploader).not_to receive(:upload_cookbooks)
295
- expect { knife.run }.to raise_error(SystemExit)
296
- end
297
-
298
- it "should output a message for a single missing dependency" do
299
- expect { knife.run }.to raise_error(SystemExit)
300
- expect(@stderr.string).to include("Cookbook test_cookbook depends on cookbooks which are not currently")
301
- expect(@stderr.string).to include("being uploaded and cannot be found on the server.")
302
- expect(@stderr.string).to include("The missing cookbook(s) are: 'dependency' version '>= 0.0.0'")
303
- end
304
-
305
- it "should output a message for a multiple missing dependencies which are concatenated" do
306
- cookbook_dependency2 = Chef::CookbookVersion.new("dependency2")
307
- cookbook.metadata.depends("dependency2")
308
- allow(cookbook_loader).to receive(:[]) do |ckbk|
309
- { "test_cookbook" => cookbook,
310
- "dependency" => cookbook_dependency,
311
- "dependency2" => cookbook_dependency2 }[ckbk]
312
- end
313
- allow(knife).to receive(:cookbook_names).and_return(%w{dependency dependency2 test_cookbook})
314
- expect { knife.run }.to raise_error(SystemExit)
315
- expect(@stderr.string).to include("Cookbook test_cookbook depends on cookbooks which are not currently")
316
- expect(@stderr.string).to include("being uploaded and cannot be found on the server.")
317
- expect(@stderr.string).to include("The missing cookbook(s) are:")
318
- expect(@stderr.string).to include("'dependency' version '>= 0.0.0'")
319
- expect(@stderr.string).to include("'dependency2' version '>= 0.0.0'")
320
- end
321
- end
322
- end
323
-
324
- it "should freeze the version of the cookbooks if --freeze is specified" do
325
- knife.config[:freeze] = true
326
- expect(cookbook_loader).to receive(:freeze_versions).once
327
- knife.run
328
- end
329
-
330
- describe "with -a or --all" do
331
- before(:each) do
332
- knife.config[:all] = true
333
- end
334
-
335
- context "when cookbooks exist in the cookbook path" do
336
- let(:test_cookbook1) do
337
- cookbook = Chef::CookbookVersion.new("test_cookbook1", "/tmp/blah")
338
- allow(cookbook).to receive(:has_metadata_file?).and_return(true)
339
- allow(cookbook.metadata).to receive(:name).and_return(cookbook.name)
340
- cookbook
341
- end
342
-
343
- let(:test_cookbook2) do
344
- cookbook = Chef::CookbookVersion.new("test_cookbook2", "/tmp/blah")
345
- allow(cookbook).to receive(:has_metadata_file?).and_return(true)
346
- allow(cookbook.metadata).to receive(:name).and_return(cookbook.name)
347
- cookbook
348
- end
349
-
350
- before(:each) do
351
- allow(cookbook_loader).to receive(:each).and_yield("test_cookbook1", test_cookbook1).and_yield("test_cookbook2", test_cookbook2)
352
- allow(cookbook_loader).to receive(:cookbook_names).and_return(%w{test_cookbook1 test_cookbook2})
353
- end
354
-
355
- it "should upload all cookbooks" do
356
- expect(knife).to receive(:upload).once
357
- knife.run
358
- end
359
-
360
- it "should report on success" do
361
- expect(knife).to receive(:upload).once
362
- expect(knife.ui).to receive(:info).with(/Uploaded all cookbooks/)
363
- knife.run
364
- end
365
-
366
- it "should update the version constraints for an environment" do
367
- allow(knife).to receive(:assert_environment_valid!).and_return(true)
368
- knife.config[:environment] = "production"
369
- expect(knife).to receive(:update_version_constraints).once
370
- knife.run
371
- end
372
- end
373
-
374
- context "when no cookbooks exist in the cookbook path" do
375
- before(:each) do
376
- allow(cookbook_loader).to receive(:each)
377
- end
378
-
379
- it "should not upload any cookbooks" do
380
- expect(knife).to_not receive(:upload)
381
- knife.run
382
- end
383
-
384
- context "when cookbook path is an array" do
385
- it "should warn users that no cookbooks exist" do
386
- cookbook_path = windows? ? "C:/chef-repo/cookbooks" : "/chef-repo/cookbooks"
387
- knife.config[:cookbook_path] = [cookbook_path, "/home/user/cookbooks"]
388
- expect(knife.ui).to receive(:warn).with("Could not find any cookbooks in your cookbook path: '#{knife.config[:cookbook_path].join(", ")}'. Use --cookbook-path to specify the desired path.")
389
- knife.run
390
- end
391
- end
392
-
393
- context "when cookbook path is a string" do
394
- it "should warn users that no cookbooks exist" do
395
- knife.config[:cookbook_path] = windows? ? "C:/chef-repo/cookbooks" : "/chef-repo/cookbooks"
396
- expect(knife.ui).to receive(:warn).with(
397
- "Could not find any cookbooks in your cookbook path: '#{knife.config[:cookbook_path]}'. Use --cookbook-path to specify the desired path."
398
- )
399
- knife.run
400
- end
401
- end
402
- end
403
- end
404
-
405
- describe "when a frozen cookbook exists on the server" do
406
- it "should fail to replace it" do
407
- exception = Chef::Exceptions::CookbookFrozen.new
408
- expect(cookbook_uploader).to receive(:upload_cookbooks)
409
- .and_raise(exception)
410
- allow(knife.ui).to receive(:error)
411
- expect(knife.ui).to receive(:error).with(exception)
412
- expect { knife.run }.to raise_error(SystemExit)
413
- end
414
-
415
- it "should not update the version constraints for an environment" do
416
- allow(knife).to receive(:assert_environment_valid!).and_return(true)
417
- knife.config[:environment] = "production"
418
- allow(knife).to receive(:upload).and_raise(Chef::Exceptions::CookbookFrozen)
419
- expect(knife.ui).to receive(:error).with(/Failed to upload 1 cookbook/)
420
- expect(knife.ui).to receive(:warn).with(/Not updating version constraints/)
421
- expect(knife).not_to receive(:update_version_constraints)
422
- expect { knife.run }.to raise_error(SystemExit)
423
- end
424
- end
425
- end # run
426
- end
1
+ #
2
+ # Author:: Matthew Kent (<mkent@magoazul.com>)
3
+ # Author:: Steven Danna (<steve@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
+ require "knife_spec_helper"
21
+
22
+ require "chef/cookbook_uploader"
23
+ require "timeout"
24
+
25
+ describe Chef::Knife::CookbookUpload do
26
+ let(:cookbook) do
27
+ cookbook = Chef::CookbookVersion.new("test_cookbook", "/tmp/blah")
28
+ allow(cookbook).to receive(:has_metadata_file?).and_return(true)
29
+ allow(cookbook.metadata).to receive(:name).and_return(cookbook.name)
30
+ cookbook
31
+ end
32
+
33
+ let(:cookbooks_by_name) do
34
+ { cookbook.name => cookbook }
35
+ end
36
+
37
+ let(:cookbook_loader) do
38
+ cookbook_loader = cookbooks_by_name.dup
39
+ allow(cookbook_loader).to receive(:merged_cookbooks).and_return([])
40
+ allow(cookbook_loader).to receive(:load_cookbooks).and_return(cookbook_loader)
41
+ allow(cookbook_loader).to receive(:compile_metadata).and_return(nil)
42
+ allow(cookbook_loader).to receive(:freeze_versions).and_return(nil)
43
+ cookbook_loader
44
+ end
45
+
46
+ let(:cookbook_uploader) { double(upload_cookbooks: nil) }
47
+
48
+ let(:output) { StringIO.new }
49
+
50
+ let(:name_args) { ["test_cookbook"] }
51
+
52
+ let(:knife) do
53
+ k = Chef::Knife::CookbookUpload.new
54
+ k.name_args = name_args
55
+ allow(k.ui).to receive(:stdout).and_return(output)
56
+ allow(k.ui).to receive(:stderr).and_return(output)
57
+ k
58
+ end
59
+
60
+ before(:each) do
61
+ allow(Chef::CookbookLoader).to receive(:new).and_return(cookbook_loader)
62
+ allow(Chef::CookbookLoader).to receive(:copy_to_tmp_dir_from_array).and_yield(cookbook_loader)
63
+ allow(Chef::CookbookVersion).to receive(:list).and_return({})
64
+ allow(Chef::CookbookVersion).to receive(:list_all_versions).and_return({})
65
+ end
66
+
67
+ describe "with --concurrency" do
68
+ it "should upload cookbooks with predefined concurrency" do
69
+ knife.config[:concurrency] = 3
70
+ test_cookbook = Chef::CookbookVersion.new("test_cookbook", "/tmp/blah")
71
+ allow(cookbook_loader).to receive(:each).and_yield("test_cookbook", test_cookbook)
72
+ allow(cookbook_loader).to receive(:cookbook_names).and_return(["test_cookbook"])
73
+ expect(Chef::CookbookUploader).to receive(:new)
74
+ .with( kind_of(Array), { force: nil, concurrency: 3 })
75
+ .and_return(double("Chef::CookbookUploader", upload_cookbooks: true))
76
+ knife.run
77
+ end
78
+ end
79
+
80
+ describe "run" do
81
+ before(:each) do
82
+ allow(Chef::CookbookUploader).to receive_messages(new: cookbook_uploader)
83
+ end
84
+
85
+ it "should print usage and exit when a cookbook name is not provided" do
86
+ knife.name_args = []
87
+ expect(knife).to receive(:show_usage)
88
+ expect(knife.ui).to receive(:fatal)
89
+ expect { knife.run }.to raise_error(SystemExit)
90
+ end
91
+
92
+ describe "when specifying cookbook without metadata.rb or metadata.json" do
93
+ let(:name_args) { ["test_cookbook1"] }
94
+ let(:cookbook) do
95
+ cookbook = Chef::CookbookVersion.new("test_cookbook1", "/tmp/blah")
96
+ allow(cookbook).to receive(:has_metadata_file?).and_return(false)
97
+ cookbook
98
+ end
99
+
100
+ it "should upload the cookbook" do
101
+ expect { knife.run }.to raise_error(Chef::Exceptions::MetadataNotFound)
102
+ end
103
+ end
104
+
105
+ describe "when name attribute in metadata not set" do
106
+ let(:name_args) { ["test_cookbook1"] }
107
+
108
+ let(:cookbook) do
109
+ cookbook = Chef::CookbookVersion.new("test_cookbook1", "/tmp/blah")
110
+ allow(cookbook).to receive(:has_metadata_file?).and_return(true)
111
+ allow(cookbook.metadata).to receive(:name).and_return(nil)
112
+ cookbook
113
+ end
114
+
115
+ it "should upload the cookbook" do
116
+ expect { knife.run }.to raise_error(Chef::Exceptions::MetadataNotValid)
117
+ end
118
+ end
119
+
120
+ describe "when specifying a cookbook name" do
121
+ it "should upload the cookbook" do
122
+ expect(knife).to receive(:upload).once
123
+ knife.run
124
+ end
125
+
126
+ it "should report on success" do
127
+ expect(knife).to receive(:upload).once
128
+ expect(knife.ui).to receive(:info).with(/Uploaded 1 cookbook/)
129
+ knife.run
130
+ end
131
+ end
132
+
133
+ describe "when specifying the same cookbook name twice" do
134
+ it "should upload the cookbook only once" do
135
+ knife.name_args = %w{test_cookbook test_cookbook}
136
+ expect(knife).to receive(:upload).once
137
+ knife.run
138
+ end
139
+ end
140
+
141
+ describe "when specifying a cookbook name among many" do
142
+ let(:name_args) { ["test_cookbook1"] }
143
+
144
+ let(:cookbook) do
145
+ cookbook = Chef::CookbookVersion.new("test_cookbook1", "/tmp/blah")
146
+ allow(cookbook).to receive(:has_metadata_file?).and_return(true)
147
+ allow(cookbook.metadata).to receive(:name).and_return(cookbook.name)
148
+ cookbook
149
+ end
150
+
151
+ let(:cookbooks_by_name) do
152
+ { cookbook.name => cookbook }
153
+ end
154
+
155
+ it "should read only one cookbook" do
156
+ expect(cookbook_loader).to receive(:[]).once.with("test_cookbook1").and_call_original
157
+ knife.run
158
+ end
159
+
160
+ it "should not read all cookbooks" do
161
+ expect(cookbook_loader).to receive(:load_cookbooks)
162
+ knife.run
163
+ end
164
+
165
+ it "should upload only one cookbook" do
166
+ expect(knife).to receive(:upload).exactly(1).times
167
+ knife.run
168
+ end
169
+ end
170
+
171
+ # This is testing too much. We should break it up.
172
+ describe "when specifying a cookbook name with dependencies" do
173
+ let(:name_args) { ["test_cookbook2"] }
174
+
175
+ let(:test_cookbook1) do
176
+ cookbook = Chef::CookbookVersion.new("test_cookbook1", "/tmp/blah")
177
+ allow(cookbook).to receive(:has_metadata_file?).and_return(true)
178
+ allow(cookbook.metadata).to receive(:name).and_return(cookbook.name)
179
+ cookbook
180
+ end
181
+
182
+ let(:test_cookbook2) do
183
+ c = Chef::CookbookVersion.new("test_cookbook2")
184
+ c.metadata.depends("test_cookbook3")
185
+ allow(c).to receive(:has_metadata_file?).and_return(true)
186
+ allow(c.metadata).to receive(:name).and_return(c.name)
187
+ c
188
+ end
189
+
190
+ let(:test_cookbook3) do
191
+ c = Chef::CookbookVersion.new("test_cookbook3")
192
+ c.metadata.depends("test_cookbook1")
193
+ c.metadata.depends("test_cookbook2")
194
+ allow(c).to receive(:has_metadata_file?).and_return(true)
195
+ allow(c.metadata).to receive(:name).and_return(c.name)
196
+ c
197
+ end
198
+
199
+ let(:cookbooks_by_name) do
200
+ { "test_cookbook1" => test_cookbook1,
201
+ "test_cookbook2" => test_cookbook2,
202
+ "test_cookbook3" => test_cookbook3 }
203
+ end
204
+
205
+ it "should upload all dependencies once" do
206
+ knife.config[:depends] = true
207
+ allow(knife).to receive(:cookbook_names).and_return(%w{test_cookbook1 test_cookbook2 test_cookbook3})
208
+ expect(knife).to receive(:upload).exactly(3).times
209
+ expect do
210
+ Timeout.timeout(5) do
211
+ knife.run
212
+ end
213
+ end.not_to raise_error
214
+ end
215
+ end
216
+
217
+ context "when chef_dependencies config is disabled" do
218
+ before do
219
+ knife.config[:check_dependencies] = false
220
+ end
221
+
222
+ describe "when specifying a cookbook name with missing dependencies" do
223
+ let(:cookbook_dependency) { Chef::CookbookVersion.new("dependency", "/tmp/blah") }
224
+
225
+ before(:each) do
226
+ cookbook.metadata.depends("dependency")
227
+ allow(cookbook_loader).to receive(:[]) do |ckbk|
228
+ { "test_cookbook" => cookbook,
229
+ "dependency" => cookbook_dependency }[ckbk]
230
+ end
231
+ allow(knife).to receive(:cookbook_names).and_return(%w{cookbook_dependency test_cookbook})
232
+ @stdout, @stderr, @stdin = StringIO.new, StringIO.new, StringIO.new
233
+ knife.ui = Chef::Knife::UI.new(@stdout, @stderr, @stdin, {})
234
+ end
235
+
236
+ it "should not fetch all cookbooks from Chef Infra Server" do
237
+ expect(Chef::CookbookVersion).not_to receive(:list_all_versions)
238
+ knife.run
239
+ end
240
+
241
+ it "should upload the cookbook" do
242
+ expect(cookbook_loader).to receive(:[]).once.with("test_cookbook")
243
+ expect(cookbook_uploader).to receive(:upload_cookbooks)
244
+ knife.run
245
+ end
246
+
247
+ it "should not output a message for a single missing dependency" do
248
+ knife.run
249
+ expect(@stderr.string).not_to include("Cookbook test_cookbook depends on cookbooks which are not currently")
250
+ expect(@stderr.string).not_to include("being uploaded and cannot be found on the server.")
251
+ expect(@stderr.string).not_to include("The missing cookbook(s) are: 'dependency' version '>= 0.0.0'")
252
+ end
253
+
254
+ it "should not output a message for a multiple missing dependencies which are concatenated" do
255
+ cookbook_dependency2 = Chef::CookbookVersion.new("dependency2")
256
+ cookbook.metadata.depends("dependency2")
257
+ allow(cookbook_loader).to receive(:[]) do |ckbk|
258
+ { "test_cookbook" => cookbook,
259
+ "dependency" => cookbook_dependency,
260
+ "dependency2" => cookbook_dependency2 }[ckbk]
261
+ end
262
+ allow(knife).to receive(:cookbook_names).and_return(%w{dependency dependency2 test_cookbook})
263
+ knife.run
264
+ expect(@stderr.string).not_to include("Cookbook test_cookbook depends on cookbooks which are not currently")
265
+ expect(@stderr.string).not_to include("being uploaded and cannot be found on the server.")
266
+ expect(@stderr.string).not_to include("The missing cookbook(s) are:")
267
+ expect(@stderr.string).not_to include("'dependency' version '>= 0.0.0'")
268
+ expect(@stderr.string).not_to include("'dependency2' version '>= 0.0.0'")
269
+ end
270
+ end
271
+ end
272
+
273
+ context "when chef_dependencies config is enabled" do
274
+ before do
275
+ knife.config[:check_dependencies] = true
276
+ end
277
+
278
+ describe "when specifying a cookbook name with missing dependencies" do
279
+ let(:cookbook_dependency) { Chef::CookbookVersion.new("dependency", "/tmp/blah") }
280
+
281
+ before(:each) do
282
+ cookbook.metadata.depends("dependency")
283
+ allow(cookbook_loader).to receive(:[]) do |ckbk|
284
+ { "test_cookbook" => cookbook,
285
+ "dependency" => cookbook_dependency }[ckbk]
286
+ end
287
+ allow(knife).to receive(:cookbook_names).and_return(%w{cookbook_dependency test_cookbook})
288
+ @stdout, @stderr, @stdin = StringIO.new, StringIO.new, StringIO.new
289
+ knife.ui = Chef::Knife::UI.new(@stdout, @stderr, @stdin, {})
290
+ end
291
+
292
+ it "should exit and not upload the cookbook" do
293
+ expect(cookbook_loader).to receive(:[]).once.with("test_cookbook")
294
+ expect(cookbook_uploader).not_to receive(:upload_cookbooks)
295
+ expect { knife.run }.to raise_error(SystemExit)
296
+ end
297
+
298
+ it "should output a message for a single missing dependency" do
299
+ expect { knife.run }.to raise_error(SystemExit)
300
+ expect(@stderr.string).to include("Cookbook test_cookbook depends on cookbooks which are not currently")
301
+ expect(@stderr.string).to include("being uploaded and cannot be found on the server.")
302
+ expect(@stderr.string).to include("The missing cookbook(s) are: 'dependency' version '>= 0.0.0'")
303
+ end
304
+
305
+ it "should output a message for a multiple missing dependencies which are concatenated" do
306
+ cookbook_dependency2 = Chef::CookbookVersion.new("dependency2")
307
+ cookbook.metadata.depends("dependency2")
308
+ allow(cookbook_loader).to receive(:[]) do |ckbk|
309
+ { "test_cookbook" => cookbook,
310
+ "dependency" => cookbook_dependency,
311
+ "dependency2" => cookbook_dependency2 }[ckbk]
312
+ end
313
+ allow(knife).to receive(:cookbook_names).and_return(%w{dependency dependency2 test_cookbook})
314
+ expect { knife.run }.to raise_error(SystemExit)
315
+ expect(@stderr.string).to include("Cookbook test_cookbook depends on cookbooks which are not currently")
316
+ expect(@stderr.string).to include("being uploaded and cannot be found on the server.")
317
+ expect(@stderr.string).to include("The missing cookbook(s) are:")
318
+ expect(@stderr.string).to include("'dependency' version '>= 0.0.0'")
319
+ expect(@stderr.string).to include("'dependency2' version '>= 0.0.0'")
320
+ end
321
+ end
322
+ end
323
+
324
+ it "should freeze the version of the cookbooks if --freeze is specified" do
325
+ knife.config[:freeze] = true
326
+ expect(cookbook_loader).to receive(:freeze_versions).once
327
+ knife.run
328
+ end
329
+
330
+ describe "with -a or --all" do
331
+ before(:each) do
332
+ knife.config[:all] = true
333
+ end
334
+
335
+ context "when cookbooks exist in the cookbook path" do
336
+ let(:test_cookbook1) do
337
+ cookbook = Chef::CookbookVersion.new("test_cookbook1", "/tmp/blah")
338
+ allow(cookbook).to receive(:has_metadata_file?).and_return(true)
339
+ allow(cookbook.metadata).to receive(:name).and_return(cookbook.name)
340
+ cookbook
341
+ end
342
+
343
+ let(:test_cookbook2) do
344
+ cookbook = Chef::CookbookVersion.new("test_cookbook2", "/tmp/blah")
345
+ allow(cookbook).to receive(:has_metadata_file?).and_return(true)
346
+ allow(cookbook.metadata).to receive(:name).and_return(cookbook.name)
347
+ cookbook
348
+ end
349
+
350
+ before(:each) do
351
+ allow(cookbook_loader).to receive(:each).and_yield("test_cookbook1", test_cookbook1).and_yield("test_cookbook2", test_cookbook2)
352
+ allow(cookbook_loader).to receive(:cookbook_names).and_return(%w{test_cookbook1 test_cookbook2})
353
+ end
354
+
355
+ it "should upload all cookbooks" do
356
+ expect(knife).to receive(:upload).once
357
+ knife.run
358
+ end
359
+
360
+ it "should report on success" do
361
+ expect(knife).to receive(:upload).once
362
+ expect(knife.ui).to receive(:info).with(/Uploaded all cookbooks/)
363
+ knife.run
364
+ end
365
+
366
+ it "should update the version constraints for an environment" do
367
+ allow(knife).to receive(:assert_environment_valid!).and_return(true)
368
+ knife.config[:environment] = "production"
369
+ expect(knife).to receive(:update_version_constraints).once
370
+ knife.run
371
+ end
372
+ end
373
+
374
+ context "when no cookbooks exist in the cookbook path" do
375
+ before(:each) do
376
+ allow(cookbook_loader).to receive(:each)
377
+ end
378
+
379
+ it "should not upload any cookbooks" do
380
+ expect(knife).to_not receive(:upload)
381
+ knife.run
382
+ end
383
+
384
+ context "when cookbook path is an array" do
385
+ it "should warn users that no cookbooks exist" do
386
+ cookbook_path = windows? ? "C:/chef-repo/cookbooks" : "/chef-repo/cookbooks"
387
+ knife.config[:cookbook_path] = [cookbook_path, "/home/user/cookbooks"]
388
+ expect(knife.ui).to receive(:warn).with("Could not find any cookbooks in your cookbook path: '#{knife.config[:cookbook_path].join(", ")}'. Use --cookbook-path to specify the desired path.")
389
+ knife.run
390
+ end
391
+ end
392
+
393
+ context "when cookbook path is a string" do
394
+ it "should warn users that no cookbooks exist" do
395
+ knife.config[:cookbook_path] = windows? ? "C:/chef-repo/cookbooks" : "/chef-repo/cookbooks"
396
+ expect(knife.ui).to receive(:warn).with(
397
+ "Could not find any cookbooks in your cookbook path: '#{knife.config[:cookbook_path]}'. Use --cookbook-path to specify the desired path."
398
+ )
399
+ knife.run
400
+ end
401
+ end
402
+ end
403
+ end
404
+
405
+ describe "when a frozen cookbook exists on the server" do
406
+ it "should fail to replace it" do
407
+ exception = Chef::Exceptions::CookbookFrozen.new
408
+ expect(cookbook_uploader).to receive(:upload_cookbooks)
409
+ .and_raise(exception)
410
+ allow(knife.ui).to receive(:error)
411
+ expect(knife.ui).to receive(:error).with(exception)
412
+ expect { knife.run }.to raise_error(SystemExit)
413
+ end
414
+
415
+ it "should not update the version constraints for an environment" do
416
+ allow(knife).to receive(:assert_environment_valid!).and_return(true)
417
+ knife.config[:environment] = "production"
418
+ allow(knife).to receive(:upload).and_raise(Chef::Exceptions::CookbookFrozen)
419
+ expect(knife.ui).to receive(:error).with(/Failed to upload 1 cookbook/)
420
+ expect(knife.ui).to receive(:warn).with(/Not updating version constraints/)
421
+ expect(knife).not_to receive(:update_version_constraints)
422
+ expect { knife.run }.to raise_error(SystemExit)
423
+ end
424
+ end
425
+ end # run
426
+ end