knife 18.6.13 → 18.7.9

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 (673) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +23 -23
  3. data/LICENSE +201 -201
  4. data/Rakefile +33 -33
  5. data/bin/knife +24 -24
  6. data/knife.gemspec +65 -65
  7. data/lib/chef/application/knife.rb +237 -237
  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 +249 -249
  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 +1229 -1224
  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 +274 -274
  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 -238
  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 +339 -339
  65. data/lib/chef/knife/core/windows_bootstrap_context.rb +441 -443
  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/license.rb +52 -52
  101. data/lib/chef/knife/list.rb +177 -177
  102. data/lib/chef/knife/node_bulk_delete.rb +75 -75
  103. data/lib/chef/knife/node_create.rb +47 -47
  104. data/lib/chef/knife/node_delete.rb +46 -46
  105. data/lib/chef/knife/node_edit.rb +70 -70
  106. data/lib/chef/knife/node_environment_set.rb +53 -53
  107. data/lib/chef/knife/node_from_file.rb +51 -51
  108. data/lib/chef/knife/node_list.rb +44 -44
  109. data/lib/chef/knife/node_policy_set.rb +79 -79
  110. data/lib/chef/knife/node_run_list_add.rb +104 -104
  111. data/lib/chef/knife/node_run_list_remove.rb +67 -67
  112. data/lib/chef/knife/node_run_list_set.rb +66 -66
  113. data/lib/chef/knife/node_show.rb +63 -63
  114. data/lib/chef/knife/null.rb +12 -12
  115. data/lib/chef/knife/org_create.rb +70 -70
  116. data/lib/chef/knife/org_delete.rb +32 -32
  117. data/lib/chef/knife/org_edit.rb +48 -48
  118. data/lib/chef/knife/org_list.rb +44 -44
  119. data/lib/chef/knife/org_show.rb +31 -31
  120. data/lib/chef/knife/org_user_add.rb +62 -62
  121. data/lib/chef/knife/org_user_remove.rb +103 -103
  122. data/lib/chef/knife/raw.rb +123 -123
  123. data/lib/chef/knife/recipe_list.rb +32 -32
  124. data/lib/chef/knife/rehash.rb +50 -50
  125. data/lib/chef/knife/role_bulk_delete.rb +66 -66
  126. data/lib/chef/knife/role_create.rb +53 -53
  127. data/lib/chef/knife/role_delete.rb +46 -46
  128. data/lib/chef/knife/role_edit.rb +45 -45
  129. data/lib/chef/knife/role_env_run_list_add.rb +87 -87
  130. data/lib/chef/knife/role_env_run_list_clear.rb +55 -55
  131. data/lib/chef/knife/role_env_run_list_remove.rb +57 -57
  132. data/lib/chef/knife/role_env_run_list_replace.rb +60 -60
  133. data/lib/chef/knife/role_env_run_list_set.rb +70 -70
  134. data/lib/chef/knife/role_from_file.rb +51 -51
  135. data/lib/chef/knife/role_list.rb +42 -42
  136. data/lib/chef/knife/role_run_list_add.rb +87 -87
  137. data/lib/chef/knife/role_run_list_clear.rb +55 -55
  138. data/lib/chef/knife/role_run_list_remove.rb +56 -56
  139. data/lib/chef/knife/role_run_list_replace.rb +60 -60
  140. data/lib/chef/knife/role_run_list_set.rb +69 -69
  141. data/lib/chef/knife/role_show.rb +48 -48
  142. data/lib/chef/knife/search.rb +194 -194
  143. data/lib/chef/knife/serve.rb +65 -65
  144. data/lib/chef/knife/show.rb +72 -72
  145. data/lib/chef/knife/ssh.rb +657 -657
  146. data/lib/chef/knife/ssl_check.rb +284 -284
  147. data/lib/chef/knife/ssl_fetch.rb +162 -162
  148. data/lib/chef/knife/status.rb +95 -95
  149. data/lib/chef/knife/supermarket_download.rb +119 -119
  150. data/lib/chef/knife/supermarket_install.rb +192 -192
  151. data/lib/chef/knife/supermarket_list.rb +76 -76
  152. data/lib/chef/knife/supermarket_search.rb +53 -53
  153. data/lib/chef/knife/supermarket_share.rb +166 -166
  154. data/lib/chef/knife/supermarket_show.rb +66 -66
  155. data/lib/chef/knife/supermarket_unshare.rb +62 -62
  156. data/lib/chef/knife/tag_create.rb +52 -52
  157. data/lib/chef/knife/tag_delete.rb +60 -60
  158. data/lib/chef/knife/tag_list.rb +47 -47
  159. data/lib/chef/knife/upload.rb +87 -87
  160. data/lib/chef/knife/user_create.rb +180 -180
  161. data/lib/chef/knife/user_delete.rb +151 -151
  162. data/lib/chef/knife/user_dissociate.rb +42 -42
  163. data/lib/chef/knife/user_edit.rb +94 -94
  164. data/lib/chef/knife/user_invite_add.rb +43 -43
  165. data/lib/chef/knife/user_invite_list.rb +34 -34
  166. data/lib/chef/knife/user_invite_rescind.rb +63 -63
  167. data/lib/chef/knife/user_key_create.rb +73 -73
  168. data/lib/chef/knife/user_key_delete.rb +80 -80
  169. data/lib/chef/knife/user_key_edit.rb +83 -83
  170. data/lib/chef/knife/user_key_list.rb +73 -73
  171. data/lib/chef/knife/user_key_show.rb +80 -80
  172. data/lib/chef/knife/user_list.rb +43 -43
  173. data/lib/chef/knife/user_password.rb +70 -70
  174. data/lib/chef/knife/user_reregister.rb +59 -59
  175. data/lib/chef/knife/user_show.rb +52 -52
  176. data/lib/chef/knife/version.rb +24 -24
  177. data/lib/chef/knife/xargs.rb +282 -282
  178. data/lib/chef/knife/yaml_convert.rb +91 -91
  179. data/lib/chef/knife.rb +677 -677
  180. data/lib/chef/utils/licensing_config.rb +9 -9
  181. data/lib/chef/utils/licensing_handler.rb +72 -53
  182. data/spec/data/apt/chef-integration-test-1.0/debian/changelog +5 -5
  183. data/spec/data/apt/chef-integration-test-1.0/debian/compat +1 -1
  184. data/spec/data/apt/chef-integration-test-1.0/debian/control +13 -13
  185. data/spec/data/apt/chef-integration-test-1.0/debian/copyright +34 -34
  186. data/spec/data/apt/chef-integration-test-1.0/debian/files +1 -1
  187. data/spec/data/apt/chef-integration-test-1.0/debian/rules +13 -13
  188. data/spec/data/apt/chef-integration-test-1.0/debian/source/format +1 -1
  189. data/spec/data/apt/chef-integration-test-1.1/debian/changelog +11 -11
  190. data/spec/data/apt/chef-integration-test-1.1/debian/compat +1 -1
  191. data/spec/data/apt/chef-integration-test-1.1/debian/control +13 -13
  192. data/spec/data/apt/chef-integration-test-1.1/debian/copyright +34 -34
  193. data/spec/data/apt/chef-integration-test-1.1/debian/files +1 -1
  194. data/spec/data/apt/chef-integration-test-1.1/debian/rules +13 -13
  195. data/spec/data/apt/chef-integration-test-1.1/debian/source/format +1 -1
  196. data/spec/data/apt/chef-integration-test2-1.0/debian/changelog +5 -5
  197. data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2/DEBIAN/conffiles +1 -1
  198. data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2/DEBIAN/control +10 -10
  199. data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2/DEBIAN/md5sums +1 -1
  200. data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2.debhelper.log +45 -45
  201. data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2.substvars +1 -1
  202. data/spec/data/apt/chef-integration-test2-1.0/debian/compat +1 -1
  203. data/spec/data/apt/chef-integration-test2-1.0/debian/conffiles +1 -1
  204. data/spec/data/apt/chef-integration-test2-1.0/debian/control +13 -13
  205. data/spec/data/apt/chef-integration-test2-1.0/debian/copyright +34 -34
  206. data/spec/data/apt/chef-integration-test2-1.0/debian/files +1 -1
  207. data/spec/data/apt/chef-integration-test2-1.0/debian/rules +13 -13
  208. data/spec/data/apt/chef-integration-test2-1.0/debian/source/format +1 -1
  209. data/spec/data/apt/chef-integration-test2_1.0-1.dsc +18 -18
  210. data/spec/data/apt/chef-integration-test2_1.0-1_amd64.build +91 -91
  211. data/spec/data/apt/chef-integration-test2_1.0-1_amd64.changes +31 -31
  212. data/spec/data/apt/chef-integration-test_1.0-1_amd64.changes +22 -22
  213. data/spec/data/apt/chef-integration-test_1.1-1_amd64.changes +22 -22
  214. data/spec/data/apt/var/www/apt/conf/distributions +7 -7
  215. data/spec/data/apt/var/www/apt/conf/incoming +4 -4
  216. data/spec/data/apt/var/www/apt/conf/pulls +3 -3
  217. data/spec/data/apt/var/www/apt/db/version +4 -4
  218. data/spec/data/apt/var/www/apt/dists/sid/Release +19 -19
  219. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages +16 -16
  220. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Release +5 -5
  221. data/spec/data/bootstrap/encrypted_data_bag_secret +1 -1
  222. data/spec/data/bootstrap/no_proxy.erb +2 -2
  223. data/spec/data/bootstrap/secret.erb +9 -9
  224. data/spec/data/bootstrap/test-hints.erb +12 -12
  225. data/spec/data/bootstrap/test.erb +1 -1
  226. data/spec/data/cb_version_cookbooks/tatft/README.rdoc +2 -2
  227. data/spec/data/cb_version_cookbooks/tatft/attributes/default.rb +1 -1
  228. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-600hhz-0 +1 -1
  229. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ahd2gq-0 +1 -1
  230. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-api8ux-0 +1 -1
  231. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-b0r1m1-0 +1 -1
  232. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-bfygsi-0 +1 -1
  233. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-el14l6-0 +1 -1
  234. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ivrl3y-0 +1 -1
  235. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-kkbs85-0 +1 -1
  236. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ory1ux-0 +1 -1
  237. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-pgsq76-0 +1 -1
  238. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ra8uim-0 +1 -1
  239. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-t7k1g-0 +1 -1
  240. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-t8g0sv-0 +1 -1
  241. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ufy6g3-0 +1 -1
  242. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-x2d6j9-0 +1 -1
  243. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-xi0l6h-0 +1 -1
  244. data/spec/data/client.d_00/00-foo.rb +2 -2
  245. data/spec/data/client.d_00/01-bar.rb +1 -1
  246. data/spec/data/client.d_00/02-strings.rb +2 -2
  247. data/spec/data/client.d_00/bar +1 -1
  248. data/spec/data/client.d_01/foo/bar.rb +1 -1
  249. data/spec/data/client.d_02/foo.rb/foo.txt +1 -1
  250. data/spec/data/config.rb +6 -6
  251. data/spec/data/cookbooks/angrybash/metadata.rb +2 -2
  252. data/spec/data/cookbooks/angrybash/recipes/default.rb +8 -8
  253. data/spec/data/cookbooks/apache2/files/default/apache2_module_conf_generate.pl +2 -2
  254. data/spec/data/cookbooks/apache2/metadata.json +33 -33
  255. data/spec/data/cookbooks/apache2/metadata.rb +2 -2
  256. data/spec/data/cookbooks/apache2/recipes/default.rb +2 -2
  257. data/spec/data/cookbooks/borken/metadata.rb +2 -2
  258. data/spec/data/cookbooks/borken/recipes/default.rb +1 -1
  259. data/spec/data/cookbooks/borken/templates/default/borken.erb +1 -1
  260. data/spec/data/cookbooks/chefignore +8 -8
  261. data/spec/data/cookbooks/ignorken/files/default/not_me.rb +2 -2
  262. data/spec/data/cookbooks/ignorken/metadata.rb +2 -2
  263. data/spec/data/cookbooks/ignorken/recipes/ignoreme.rb +1 -1
  264. data/spec/data/cookbooks/ignorken/templates/ubuntu-12.10/not_me.rb +2 -2
  265. data/spec/data/cookbooks/irssi/files/default/irssi.response +2 -2
  266. data/spec/data/cookbooks/java/files/default/java.response +1 -1
  267. data/spec/data/cookbooks/java/metadata.json +33 -33
  268. data/spec/data/cookbooks/java/metadata.rb +2 -2
  269. data/spec/data/cookbooks/name-mismatch-versionnumber/README.md +4 -4
  270. data/spec/data/cookbooks/name-mismatch-versionnumber/metadata.rb +8 -8
  271. data/spec/data/cookbooks/name-mismatch-versionnumber/recipes/default.rb +8 -8
  272. data/spec/data/cookbooks/openldap/attributes/default.rb +16 -16
  273. data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
  274. data/spec/data/cookbooks/openldap/definitions/client.rb +5 -5
  275. data/spec/data/cookbooks/openldap/definitions/server.rb +5 -5
  276. data/spec/data/cookbooks/openldap/files/default/.dotfile +1 -1
  277. data/spec/data/cookbooks/openldap/files/default/remotedir/.a_dotdir/.a_dotfile_in_a_dotdir +1 -1
  278. data/spec/data/cookbooks/openldap/files/default/remotedir/not_a_template.erb +2 -2
  279. data/spec/data/cookbooks/openldap/files/default/remotedir/remote_dir_file1.txt +2 -2
  280. data/spec/data/cookbooks/openldap/files/default/remotedir/remote_dir_file2.txt +2 -2
  281. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/.a_dotfile +1 -1
  282. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/remote_subdir_file1.txt +2 -2
  283. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/remote_subdir_file2.txt +2 -2
  284. data/spec/data/cookbooks/openldap/files/default/remotedir/subdir_with_no_file_just_a_subsubdir/the_subsubdir/some_file.txt +3 -3
  285. data/spec/data/cookbooks/openldap/libraries/openldap/version.rb +3 -3
  286. data/spec/data/cookbooks/openldap/libraries/openldap.rb +4 -4
  287. data/spec/data/cookbooks/openldap/metadata.rb +8 -8
  288. data/spec/data/cookbooks/openldap/recipes/default.rb +4 -4
  289. data/spec/data/cookbooks/openldap/recipes/gigantor.rb +3 -3
  290. data/spec/data/cookbooks/openldap/recipes/one.rb +15 -15
  291. data/spec/data/cookbooks/openldap/recipes/return.rb +2 -2
  292. data/spec/data/cookbooks/openldap/templates/default/helper_test.erb +1 -1
  293. data/spec/data/cookbooks/openldap/templates/default/helpers.erb +14 -14
  294. data/spec/data/cookbooks/openldap/templates/default/helpers_via_partial_test.erb +1 -1
  295. data/spec/data/cookbooks/openldap/templates/default/nested_openldap_partials.erb +1 -1
  296. data/spec/data/cookbooks/openldap/templates/default/nested_partial.erb +1 -1
  297. data/spec/data/cookbooks/openldap/templates/default/no_windows_line_endings.erb +4 -4
  298. data/spec/data/cookbooks/openldap/templates/default/openldap_nested_variable_stuff.erb +1 -1
  299. data/spec/data/cookbooks/openldap/templates/default/openldap_variable_stuff.conf.erb +1 -1
  300. data/spec/data/cookbooks/openldap/templates/default/test.erb +1 -1
  301. data/spec/data/cookbooks/preseed/files/default/preseed-file.seed +1 -1
  302. data/spec/data/cookbooks/preseed/files/default/preseed-template.seed +4 -4
  303. data/spec/data/cookbooks/preseed/metadata.rb +2 -2
  304. data/spec/data/cookbooks/preseed/templates/default/preseed-template-variables.seed +1 -1
  305. data/spec/data/cookbooks/preseed/templates/default/preseed-template.seed +1 -1
  306. data/spec/data/cookbooks/starter/chefignore +8 -8
  307. data/spec/data/cookbooks/starter/metadata.rb +2 -2
  308. data/spec/data/cookbooks/starter/recipes/default.rb +4 -4
  309. data/spec/data/cookbooks/supports-platform-constraints/metadata.rb +5 -5
  310. data/spec/data/cookbooks/wget/files/default/wget.response +2 -2
  311. data/spec/data/definitions/test.rb +4 -4
  312. data/spec/data/environment-config.rb +4 -4
  313. data/spec/data/file-providers-method-snapshot-chef-11-4.json +127 -127
  314. data/spec/data/fileedit/hosts +4 -4
  315. data/spec/data/incomplete-metadata-chef-repo/incomplete-metadata/README.md +4 -4
  316. data/spec/data/incomplete-metadata-chef-repo/incomplete-metadata/metadata.rb +13 -13
  317. data/spec/data/incomplete-metadata-chef-repo/incomplete-metadata/recipes/default.rb +8 -8
  318. data/spec/data/invalid-metadata-chef-repo/invalid-metadata/README.md +4 -4
  319. data/spec/data/invalid-metadata-chef-repo/invalid-metadata/metadata.rb +9 -9
  320. data/spec/data/invalid-metadata-chef-repo/invalid-metadata/recipes/default.rb +8 -8
  321. data/spec/data/kitchen/chefignore +6 -6
  322. data/spec/data/kitchen/openldap/attributes/default.rb +3 -3
  323. data/spec/data/kitchen/openldap/attributes/robinson.rb +2 -2
  324. data/spec/data/kitchen/openldap/definitions/client.rb +3 -3
  325. data/spec/data/kitchen/openldap/definitions/drewbarrymore.rb +2 -2
  326. data/spec/data/kitchen/openldap/recipes/gigantor.rb +2 -2
  327. data/spec/data/kitchen/openldap/recipes/ignoreme.rb +2 -2
  328. data/spec/data/kitchen/openldap/recipes/woot.rb +3 -3
  329. data/spec/data/knife_subcommand/test_explicit_category.rb +6 -6
  330. data/spec/data/knife_subcommand/test_name_mapping.rb +4 -4
  331. data/spec/data/knife_subcommand/test_yourself.rb +21 -21
  332. data/spec/data/lwrp/providers/buck_passer.rb +28 -28
  333. data/spec/data/lwrp/providers/buck_passer_2.rb +26 -26
  334. data/spec/data/lwrp/providers/embedded_resource_accesses_providers_scope.rb +28 -28
  335. data/spec/data/lwrp/providers/inline_compiler.rb +24 -24
  336. data/spec/data/lwrp/providers/monkey_name_printer.rb +5 -5
  337. data/spec/data/lwrp/providers/paint_drying_watcher.rb +7 -7
  338. data/spec/data/lwrp/providers/thumb_twiddler.rb +7 -7
  339. data/spec/data/lwrp/resources/bar.rb +4 -4
  340. data/spec/data/lwrp/resources/buck_passer.rb +6 -6
  341. data/spec/data/lwrp/resources/buck_passer_2.rb +4 -4
  342. data/spec/data/lwrp/resources/embedded_resource_accesses_providers_scope.rb +4 -4
  343. data/spec/data/lwrp/resources/foo.rb +6 -6
  344. data/spec/data/lwrp/resources/inline_compiler.rb +4 -4
  345. data/spec/data/lwrp/resources/monkey_name_printer.rb +6 -6
  346. data/spec/data/lwrp/resources/paint_drying_watcher.rb +4 -4
  347. data/spec/data/lwrp/resources/thumb_twiddler.rb +4 -4
  348. data/spec/data/lwrp/resources_with_default_attributes/nodeattr.rb +3 -3
  349. data/spec/data/lwrp_const_scoping/resources/conflict.rb +1 -1
  350. data/spec/data/lwrp_override/providers/buck_passer.rb +5 -5
  351. data/spec/data/lwrp_override/resources/foo.rb +11 -11
  352. data/spec/data/mac_users/10.9.plist.xml +560 -560
  353. data/spec/data/mac_users/10.9.shadow.xml +21 -21
  354. data/spec/data/metadata/quick_start/metadata.rb +14 -14
  355. data/spec/data/mixin/invalid_data.rb +3 -3
  356. data/spec/data/mixin/real_data.rb +2 -2
  357. data/spec/data/nested.json +2 -2
  358. data/spec/data/nodes/default.rb +15 -15
  359. data/spec/data/nodes/test.example.com.rb +17 -17
  360. data/spec/data/nodes/test.rb +15 -15
  361. data/spec/data/null_config.rb +1 -1
  362. data/spec/data/object_loader/environments/test.json +7 -7
  363. data/spec/data/object_loader/environments/test.rb +2 -2
  364. data/spec/data/object_loader/environments/test_json_class.json +8 -8
  365. data/spec/data/object_loader/nodes/test.json +7 -7
  366. data/spec/data/object_loader/nodes/test.rb +2 -2
  367. data/spec/data/object_loader/nodes/test_json_class.json +8 -8
  368. data/spec/data/object_loader/roles/test.json +7 -7
  369. data/spec/data/object_loader/roles/test.rb +2 -2
  370. data/spec/data/object_loader/roles/test_json_class.json +8 -8
  371. data/spec/data/partial_one.erb +1 -1
  372. data/spec/data/prefer_metadata_json/metadata.json +51 -51
  373. data/spec/data/prefer_metadata_json/metadata.rb +6 -6
  374. data/spec/data/recipes/test.rb +7 -7
  375. data/spec/data/root_alias_cookbooks/dup_attr/attributes/default.rb +1 -1
  376. data/spec/data/root_alias_cookbooks/dup_attr/attributes.rb +1 -1
  377. data/spec/data/root_alias_cookbooks/dup_attr/metadata.rb +2 -2
  378. data/spec/data/root_alias_cookbooks/dup_attr/recipe.rb +3 -3
  379. data/spec/data/root_alias_cookbooks/dup_recipe/attributes.rb +1 -1
  380. data/spec/data/root_alias_cookbooks/dup_recipe/metadata.rb +2 -2
  381. data/spec/data/root_alias_cookbooks/dup_recipe/recipe.rb +3 -3
  382. data/spec/data/root_alias_cookbooks/dup_recipe/recipes/default.rb +3 -3
  383. data/spec/data/root_alias_cookbooks/simple/attributes.rb +1 -1
  384. data/spec/data/root_alias_cookbooks/simple/metadata.rb +2 -2
  385. data/spec/data/root_alias_cookbooks/simple/recipe.rb +3 -3
  386. data/spec/data/rubygems.org/sexp_processor-info +49 -49
  387. data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +2 -2
  388. data/spec/data/run_context/cookbooks/circular-dep1/definitions/circular_dep1_res.rb +1 -1
  389. data/spec/data/run_context/cookbooks/circular-dep1/libraries/lib.rb +2 -2
  390. data/spec/data/run_context/cookbooks/circular-dep1/metadata.rb +2 -2
  391. data/spec/data/run_context/cookbooks/circular-dep1/providers/provider.rb +1 -1
  392. data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +2 -2
  393. data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +2 -2
  394. data/spec/data/run_context/cookbooks/circular-dep2/definitions/circular_dep2_res.rb +1 -1
  395. data/spec/data/run_context/cookbooks/circular-dep2/libraries/lib.rb +2 -2
  396. data/spec/data/run_context/cookbooks/circular-dep2/metadata.rb +2 -2
  397. data/spec/data/run_context/cookbooks/circular-dep2/providers/provider.rb +1 -1
  398. data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +2 -2
  399. data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -2
  400. data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -2
  401. data/spec/data/run_context/cookbooks/dependency1/attributes/unparsed_file +1 -1
  402. data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +2 -2
  403. data/spec/data/run_context/cookbooks/dependency1/definitions/dependency1_res.rb +1 -1
  404. data/spec/data/run_context/cookbooks/dependency1/definitions/unparsed_file +1 -1
  405. data/spec/data/run_context/cookbooks/dependency1/libraries/lib.rb +2 -2
  406. data/spec/data/run_context/cookbooks/dependency1/libraries/unparsed_file +1 -1
  407. data/spec/data/run_context/cookbooks/dependency1/providers/provider.rb +1 -1
  408. data/spec/data/run_context/cookbooks/dependency1/providers/unparsed_file +1 -1
  409. data/spec/data/run_context/cookbooks/dependency1/recipes/unparsed_file +1 -1
  410. data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +2 -2
  411. data/spec/data/run_context/cookbooks/dependency1/resources/unparsed_file +1 -1
  412. data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +2 -2
  413. data/spec/data/run_context/cookbooks/dependency2/definitions/dependency2_res.rb +1 -1
  414. data/spec/data/run_context/cookbooks/dependency2/libraries/lib.rb +2 -2
  415. data/spec/data/run_context/cookbooks/dependency2/providers/provider.rb +1 -1
  416. data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +2 -2
  417. data/spec/data/run_context/cookbooks/include/recipes/default.rb +24 -24
  418. data/spec/data/run_context/cookbooks/include/recipes/includee.rb +3 -3
  419. data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +2 -2
  420. data/spec/data/run_context/cookbooks/no-default-attr/definitions/no_default-attr_res.rb +1 -1
  421. data/spec/data/run_context/cookbooks/no-default-attr/providers/provider.rb +1 -1
  422. data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +2 -2
  423. data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -1
  424. data/spec/data/run_context/cookbooks/test/definitions/new_animals.rb +9 -9
  425. data/spec/data/run_context/cookbooks/test/definitions/new_cat.rb +5 -5
  426. data/spec/data/run_context/cookbooks/test/definitions/test_res.rb +1 -1
  427. data/spec/data/run_context/cookbooks/test/providers/provider.rb +1 -1
  428. data/spec/data/run_context/cookbooks/test/recipes/default.rb +5 -5
  429. data/spec/data/run_context/cookbooks/test/recipes/one.rb +7 -7
  430. data/spec/data/run_context/cookbooks/test/recipes/two.rb +7 -7
  431. data/spec/data/run_context/cookbooks/test/resources/resource.rb +3 -3
  432. data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +2 -2
  433. data/spec/data/run_context/cookbooks/test-with-circular-deps/definitions/test_with-circular-deps_res.rb +1 -1
  434. data/spec/data/run_context/cookbooks/test-with-circular-deps/libraries/lib.rb +2 -2
  435. data/spec/data/run_context/cookbooks/test-with-circular-deps/metadata.rb +2 -2
  436. data/spec/data/run_context/cookbooks/test-with-circular-deps/providers/provider.rb +1 -1
  437. data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +3 -3
  438. data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +2 -2
  439. data/spec/data/run_context/cookbooks/test-with-deps/definitions/test_with-deps_res.rb +1 -1
  440. data/spec/data/run_context/cookbooks/test-with-deps/libraries/lib.rb +1 -1
  441. data/spec/data/run_context/cookbooks/test-with-deps/metadata.rb +3 -3
  442. data/spec/data/run_context/cookbooks/test-with-deps/providers/provider.rb +1 -1
  443. data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +2 -2
  444. data/spec/data/run_context/nodes/run_context.rb +5 -5
  445. data/spec/data/sample_msu1.xml +10 -10
  446. data/spec/data/sample_msu2.xml +14 -14
  447. data/spec/data/sample_msu3.xml +16 -16
  448. data/spec/data/search_queries_to_transform.txt +98 -98
  449. data/spec/data/shef-config.rb +11 -11
  450. data/spec/data/snap_package/async_result_success.json +6 -6
  451. data/spec/data/snap_package/change_id_result.json +175 -175
  452. data/spec/data/snap_package/find_result_failure.json +10 -10
  453. data/spec/data/snap_package/find_result_success.json +70 -70
  454. data/spec/data/snap_package/get_by_name_result_failure.json +10 -10
  455. data/spec/data/snap_package/get_by_name_result_success.json +38 -38
  456. data/spec/data/snap_package/get_conf_success.json +10 -10
  457. data/spec/data/snap_package/result_failure.json +9 -9
  458. data/spec/data/ssl/5e707473.0 +18 -18
  459. data/spec/data/ssl/chef-rspec.cert +27 -27
  460. data/spec/data/ssl/chef-rspec.key +27 -27
  461. data/spec/data/ssl/key.pem +15 -15
  462. data/spec/data/ssl/private_key.pem +27 -27
  463. data/spec/data/ssl/private_key_with_whitespace.pem +32 -32
  464. data/spec/data/standalone_cookbook/chefignore +9 -9
  465. data/spec/data/standalone_cookbook/recipes/default.rb +2 -2
  466. data/spec/data/templates/failed.erb +5 -5
  467. data/spec/data/trusted_certs/example.crt +22 -22
  468. data/spec/data/trusted_certs/example_no_cn.crt +36 -36
  469. data/spec/data/trusted_certs/intermediate.pem +27 -27
  470. data/spec/data/trusted_certs/opscode.pem +57 -57
  471. data/spec/data/trusted_certs/root.pem +22 -22
  472. data/spec/data/windows_certificates/base64_test.cer +20 -20
  473. data/spec/data/windows_certificates/othertest.cer +20 -20
  474. data/spec/data/windows_certificates/test.cer +20 -20
  475. data/spec/data/windows_certificates/test.pem +20 -20
  476. data/spec/functional/configure_spec.rb +33 -33
  477. data/spec/functional/cookbook_delete_spec.rb +157 -156
  478. data/spec/functional/exec_spec.rb +55 -55
  479. data/spec/functional/rehash_spec.rb +39 -39
  480. data/spec/functional/smoke_test.rb +42 -42
  481. data/spec/functional/ssh_spec.rb +352 -352
  482. data/spec/functional/version_spec.rb +26 -26
  483. data/spec/integration/chef_fs_data_store_spec.rb +557 -557
  484. data/spec/integration/chef_repo_path_spec.rb +962 -962
  485. data/spec/integration/chef_repository_file_system_spec.rb +200 -200
  486. data/spec/integration/chefignore_spec.rb +301 -301
  487. data/spec/integration/client_bulk_delete_spec.rb +131 -131
  488. data/spec/integration/client_create_spec.rb +70 -70
  489. data/spec/integration/client_delete_spec.rb +64 -64
  490. data/spec/integration/client_key_create_spec.rb +66 -66
  491. data/spec/integration/client_key_delete_spec.rb +43 -43
  492. data/spec/integration/client_key_list_spec.rb +61 -61
  493. data/spec/integration/client_key_show_spec.rb +45 -45
  494. data/spec/integration/client_list_spec.rb +49 -49
  495. data/spec/integration/client_show_spec.rb +37 -37
  496. data/spec/integration/commands_spec.rb +55 -55
  497. data/spec/integration/common_options_spec.rb +174 -174
  498. data/spec/integration/config_list_spec.rb +220 -220
  499. data/spec/integration/config_show_spec.rb +192 -192
  500. data/spec/integration/config_use_spec.rb +198 -198
  501. data/spec/integration/cookbook_api_ipv6_spec.rb +113 -113
  502. data/spec/integration/cookbook_bulk_delete_spec.rb +65 -65
  503. data/spec/integration/cookbook_download_spec.rb +72 -72
  504. data/spec/integration/cookbook_list_spec.rb +55 -55
  505. data/spec/integration/cookbook_show_spec.rb +149 -149
  506. data/spec/integration/cookbook_upload_spec.rb +128 -128
  507. data/spec/integration/data_bag_create_spec.rb +125 -125
  508. data/spec/integration/data_bag_delete_spec.rb +59 -59
  509. data/spec/integration/data_bag_edit_spec.rb +105 -105
  510. data/spec/integration/data_bag_from_file_spec.rb +116 -116
  511. data/spec/integration/data_bag_list_spec.rb +44 -44
  512. data/spec/integration/data_bag_show_spec.rb +95 -95
  513. data/spec/integration/delete_spec.rb +1018 -1018
  514. data/spec/integration/deps_spec.rb +703 -703
  515. data/spec/integration/diff_spec.rb +605 -605
  516. data/spec/integration/download_spec.rb +1336 -1336
  517. data/spec/integration/environment_compare_spec.rb +75 -75
  518. data/spec/integration/environment_create_spec.rb +41 -41
  519. data/spec/integration/environment_delete_spec.rb +37 -37
  520. data/spec/integration/environment_from_file_spec.rb +116 -116
  521. data/spec/integration/environment_list_spec.rb +42 -42
  522. data/spec/integration/environment_show_spec.rb +77 -77
  523. data/spec/integration/list_spec.rb +1060 -1060
  524. data/spec/integration/node_bulk_delete_spec.rb +52 -52
  525. data/spec/integration/node_create_spec.rb +47 -47
  526. data/spec/integration/node_delete_spec.rb +48 -48
  527. data/spec/integration/node_environment_set_spec.rb +46 -46
  528. data/spec/integration/node_from_file_spec.rb +59 -59
  529. data/spec/integration/node_list_spec.rb +45 -45
  530. data/spec/integration/node_run_list_add_spec.rb +54 -54
  531. data/spec/integration/node_run_list_remove_spec.rb +36 -36
  532. data/spec/integration/node_run_list_set_spec.rb +41 -41
  533. data/spec/integration/node_show_spec.rb +36 -36
  534. data/spec/integration/raw_spec.rb +297 -297
  535. data/spec/integration/redirection_spec.rb +64 -64
  536. data/spec/integration/role_bulk_delete_spec.rb +52 -52
  537. data/spec/integration/role_create_spec.rb +41 -41
  538. data/spec/integration/role_delete_spec.rb +48 -48
  539. data/spec/integration/role_from_file_spec.rb +96 -96
  540. data/spec/integration/role_list_spec.rb +45 -45
  541. data/spec/integration/role_show_spec.rb +51 -51
  542. data/spec/integration/search_node_spec.rb +40 -40
  543. data/spec/integration/serve_spec.rb +92 -92
  544. data/spec/integration/show_spec.rb +197 -197
  545. data/spec/integration/upload_spec.rb +1616 -1616
  546. data/spec/knife_spec_helper.rb +241 -241
  547. data/spec/support/chef_helpers.rb +79 -79
  548. data/spec/support/key_helpers.rb +102 -102
  549. data/spec/support/platform_helpers.rb +255 -255
  550. data/spec/support/platforms/prof/gc.rb +51 -51
  551. data/spec/support/platforms/prof/win32.rb +45 -45
  552. data/spec/support/platforms/win32/spec_service.rb +57 -57
  553. data/spec/support/recipe_dsl_helper.rb +83 -83
  554. data/spec/support/shared/context/config.rb +18 -18
  555. data/spec/support/shared/functional/knife.rb +37 -37
  556. data/spec/support/shared/integration/integration_helper.rb +122 -122
  557. data/spec/support/shared/integration/knife_support.rb +192 -192
  558. data/spec/support/shared/matchers/exit_with_code.rb +32 -32
  559. data/spec/support/shared/matchers/match_environment_variable.rb +17 -17
  560. data/spec/support/shared/unit/knife_shared.rb +39 -39
  561. data/spec/support/shared/unit/mock_shellout.rb +49 -49
  562. data/spec/tiny_server.rb +193 -190
  563. data/spec/unit/application/knife_spec.rb +241 -241
  564. data/spec/unit/knife/bootstrap/chef_vault_handler_spec.rb +152 -152
  565. data/spec/unit/knife/bootstrap/client_builder_spec.rb +207 -207
  566. data/spec/unit/knife/bootstrap/train_connector_spec.rb +244 -244
  567. data/spec/unit/knife/bootstrap_spec.rb +2311 -2288
  568. data/spec/unit/knife/client_bulk_delete_spec.rb +166 -166
  569. data/spec/unit/knife/client_create_spec.rb +232 -232
  570. data/spec/unit/knife/client_delete_spec.rb +99 -99
  571. data/spec/unit/knife/client_edit_spec.rb +53 -53
  572. data/spec/unit/knife/client_list_spec.rb +34 -34
  573. data/spec/unit/knife/client_reregister_spec.rb +62 -62
  574. data/spec/unit/knife/client_show_spec.rb +52 -52
  575. data/spec/unit/knife/configure_client_spec.rb +81 -81
  576. data/spec/unit/knife/configure_spec.rb +190 -190
  577. data/spec/unit/knife/cookbook_bulk_delete_spec.rb +87 -87
  578. data/spec/unit/knife/cookbook_delete_spec.rb +239 -239
  579. data/spec/unit/knife/cookbook_download_spec.rb +255 -255
  580. data/spec/unit/knife/cookbook_list_spec.rb +88 -88
  581. data/spec/unit/knife/cookbook_metadata_from_file_spec.rb +72 -72
  582. data/spec/unit/knife/cookbook_metadata_spec.rb +182 -182
  583. data/spec/unit/knife/cookbook_show_spec.rb +253 -253
  584. data/spec/unit/knife/cookbook_upload_spec.rb +426 -426
  585. data/spec/unit/knife/core/bootstrap_context_spec.rb +287 -287
  586. data/spec/unit/knife/core/cookbook_scm_repo_spec.rb +187 -187
  587. data/spec/unit/knife/core/cookbook_site_streaming_uploader_spec.rb +198 -198
  588. data/spec/unit/knife/core/gem_glob_loader_spec.rb +242 -242
  589. data/spec/unit/knife/core/hashed_command_loader_spec.rb +112 -112
  590. data/spec/unit/knife/core/node_editor_spec.rb +211 -211
  591. data/spec/unit/knife/core/object_loader_spec.rb +81 -81
  592. data/spec/unit/knife/core/status_presenter_spec.rb +54 -54
  593. data/spec/unit/knife/core/subcommand_loader_spec.rb +64 -64
  594. data/spec/unit/knife/core/ui_spec.rb +656 -656
  595. data/spec/unit/knife/core/windows_bootstrap_context_spec.rb +282 -238
  596. data/spec/unit/knife/data_bag_create_spec.rb +175 -175
  597. data/spec/unit/knife/data_bag_edit_spec.rb +126 -126
  598. data/spec/unit/knife/data_bag_from_file_spec.rb +174 -174
  599. data/spec/unit/knife/data_bag_secret_options_spec.rb +173 -173
  600. data/spec/unit/knife/data_bag_show_spec.rb +139 -139
  601. data/spec/unit/knife/environment_compare_spec.rb +112 -112
  602. data/spec/unit/knife/environment_create_spec.rb +91 -91
  603. data/spec/unit/knife/environment_delete_spec.rb +71 -71
  604. data/spec/unit/knife/environment_edit_spec.rb +79 -79
  605. data/spec/unit/knife/environment_from_file_spec.rb +90 -90
  606. data/spec/unit/knife/environment_list_spec.rb +54 -54
  607. data/spec/unit/knife/environment_show_spec.rb +52 -52
  608. data/spec/unit/knife/key_create_spec.rb +223 -223
  609. data/spec/unit/knife/key_delete_spec.rb +133 -133
  610. data/spec/unit/knife/key_edit_spec.rb +264 -264
  611. data/spec/unit/knife/key_helper.rb +74 -74
  612. data/spec/unit/knife/key_list_spec.rb +216 -216
  613. data/spec/unit/knife/key_show_spec.rb +126 -126
  614. data/spec/unit/knife/license_spec.rb +89 -89
  615. data/spec/unit/knife/node_bulk_delete_spec.rb +94 -94
  616. data/spec/unit/knife/node_delete_spec.rb +77 -77
  617. data/spec/unit/knife/node_edit_spec.rb +116 -116
  618. data/spec/unit/knife/node_environment_set_spec.rb +61 -61
  619. data/spec/unit/knife/node_from_file_spec.rb +59 -59
  620. data/spec/unit/knife/node_list_spec.rb +62 -62
  621. data/spec/unit/knife/node_policy_set_spec.rb +122 -122
  622. data/spec/unit/knife/node_run_list_add_spec.rb +145 -145
  623. data/spec/unit/knife/node_run_list_remove_spec.rb +106 -106
  624. data/spec/unit/knife/node_run_list_set_spec.rb +115 -115
  625. data/spec/unit/knife/node_show_spec.rb +65 -65
  626. data/spec/unit/knife/org_create_spec.rb +76 -76
  627. data/spec/unit/knife/org_delete_spec.rb +41 -41
  628. data/spec/unit/knife/org_edit_spec.rb +49 -49
  629. data/spec/unit/knife/org_list_spec.rb +58 -58
  630. data/spec/unit/knife/org_show_spec.rb +45 -45
  631. data/spec/unit/knife/org_user_add_spec.rb +39 -39
  632. data/spec/unit/knife/raw_spec.rb +43 -43
  633. data/spec/unit/knife/role_bulk_delete_spec.rb +80 -80
  634. data/spec/unit/knife/role_create_spec.rb +80 -80
  635. data/spec/unit/knife/role_delete_spec.rb +67 -67
  636. data/spec/unit/knife/role_edit_spec.rb +77 -77
  637. data/spec/unit/knife/role_env_run_list_add_spec.rb +217 -217
  638. data/spec/unit/knife/role_env_run_list_clear_spec.rb +94 -94
  639. data/spec/unit/knife/role_env_run_list_remove_spec.rb +102 -102
  640. data/spec/unit/knife/role_env_run_list_replace_spec.rb +105 -105
  641. data/spec/unit/knife/role_env_run_list_set_spec.rb +99 -99
  642. data/spec/unit/knife/role_from_file_spec.rb +69 -69
  643. data/spec/unit/knife/role_list_spec.rb +54 -54
  644. data/spec/unit/knife/role_run_list_add_spec.rb +179 -179
  645. data/spec/unit/knife/role_run_list_clear_spec.rb +84 -84
  646. data/spec/unit/knife/role_run_list_remove_spec.rb +92 -92
  647. data/spec/unit/knife/role_run_list_replace_spec.rb +98 -98
  648. data/spec/unit/knife/role_run_list_set_spec.rb +89 -89
  649. data/spec/unit/knife/role_show_spec.rb +59 -59
  650. data/spec/unit/knife/search_spec.rb +147 -147
  651. data/spec/unit/knife/ssh_spec.rb +403 -403
  652. data/spec/unit/knife/ssl_check_spec.rb +256 -256
  653. data/spec/unit/knife/ssl_fetch_spec.rb +222 -222
  654. data/spec/unit/knife/status_spec.rb +112 -112
  655. data/spec/unit/knife/supermarket_download_spec.rb +152 -152
  656. data/spec/unit/knife/supermarket_install_spec.rb +203 -203
  657. data/spec/unit/knife/supermarket_list_spec.rb +70 -70
  658. data/spec/unit/knife/supermarket_search_spec.rb +85 -85
  659. data/spec/unit/knife/supermarket_share_spec.rb +208 -208
  660. data/spec/unit/knife/supermarket_unshare_spec.rb +78 -78
  661. data/spec/unit/knife/tag_create_spec.rb +23 -23
  662. data/spec/unit/knife/tag_delete_spec.rb +25 -25
  663. data/spec/unit/knife/tag_list_spec.rb +23 -23
  664. data/spec/unit/knife/user_create_spec.rb +282 -282
  665. data/spec/unit/knife/user_delete_spec.rb +171 -171
  666. data/spec/unit/knife/user_edit_spec.rb +54 -54
  667. data/spec/unit/knife/user_list_spec.rb +73 -73
  668. data/spec/unit/knife/user_password_spec.rb +64 -64
  669. data/spec/unit/knife/user_reregister_spec.rb +56 -56
  670. data/spec/unit/knife/user_show_spec.rb +91 -91
  671. data/spec/unit/knife_spec.rb +637 -637
  672. data/spec/unit/utils/licensing_handler_spec.rb +140 -0
  673. metadata +11 -7
@@ -1,1336 +1,1336 @@
1
- #
2
- # Author:: John Keiser (<jkeiser@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
- require "knife_spec_helper"
19
- require "support/shared/integration/integration_helper"
20
- require "chef/knife/download"
21
- require "chef/knife/diff"
22
-
23
- describe "knife download", :workstation do
24
- include IntegrationSupport
25
- include KnifeSupport
26
-
27
- context "without versioned cookbooks" do
28
- when_the_chef_server "has one of each thing" do
29
-
30
- before do
31
- client "x", {}
32
- cookbook "x", "1.0.0"
33
- data_bag "x", { "y" => {} }
34
- environment "x", {}
35
- node "x", {}
36
- role "x", {}
37
- user "x", {}
38
- end
39
-
40
- when_the_repository "has only top-level directories" do
41
- before do
42
- directory "clients"
43
- directory "cookbooks"
44
- directory "data_bags"
45
- directory "environments"
46
- directory "nodes"
47
- directory "roles"
48
- directory "users"
49
- end
50
-
51
- it "knife download downloads everything" do
52
- knife("download /").should_succeed <<~EOM
53
- Created /clients/chef-validator.json
54
- Created /clients/chef-webui.json
55
- Created /clients/x.json
56
- Created /cookbooks/x
57
- Created /cookbooks/x/metadata.rb
58
- Created /data_bags/x
59
- Created /data_bags/x/y.json
60
- Created /environments/_default.json
61
- Created /environments/x.json
62
- Created /nodes/x.json
63
- Created /roles/x.json
64
- Created /users/admin.json
65
- Created /users/x.json
66
- EOM
67
- knife("diff --name-status /").should_succeed ""
68
- end
69
- end
70
-
71
- when_the_repository "has an identical copy of each thing" do
72
- before do
73
- file "clients/chef-validator.json", { "validator" => true, "public_key" => ChefZero::PUBLIC_KEY }
74
- file "clients/chef-webui.json", { "admin" => true, "public_key" => ChefZero::PUBLIC_KEY }
75
- file "clients/x.json", { "public_key" => ChefZero::PUBLIC_KEY }
76
- file "cookbooks/x/metadata.rb", cb_metadata("x", "1.0.0")
77
- file "data_bags/x/y.json", {}
78
- file "environments/_default.json", { "description" => "The default Chef environment" }
79
- file "environments/x.json", {}
80
- file "nodes/x.json", { "normal" => { "tags" => [] } }
81
- file "roles/x.json", {}
82
- file "users/admin.json", { "admin" => true, "public_key" => ChefZero::PUBLIC_KEY }
83
- file "users/x.json", { "public_key" => ChefZero::PUBLIC_KEY }
84
- end
85
-
86
- it "knife download makes no changes" do
87
- knife("download /").should_succeed ""
88
- knife("diff --name-status /").should_succeed ""
89
- end
90
-
91
- it "knife download --purge makes no changes" do
92
- knife("download --purge /").should_succeed ""
93
- knife("diff --name-status /").should_succeed ""
94
- end
95
-
96
- context "except the role file" do
97
- before do
98
- file "roles/x.json", <<~EOM
99
- {
100
- "chef_type": "role",
101
- "default_attributes": {
102
- },
103
- "description": "blarghle",
104
- "env_run_lists": {
105
- },
106
- "json_class": "Chef::Role",
107
- "name": "x",
108
- "override_attributes": {
109
- },
110
- "run_list": [
111
-
112
- ]
113
- }
114
- EOM
115
- end
116
-
117
- it "knife download changes the role" do
118
- knife("download /").should_succeed "Updated /roles/x.json\n"
119
- knife("diff --name-status /").should_succeed ""
120
- end
121
-
122
- it "knife download --no-diff does not change the role" do
123
- knife("download --no-diff /").should_succeed ""
124
- knife("diff --name-status /").should_succeed "M\t/roles/x.json\n"
125
- end
126
- end
127
-
128
- context "except the role file is textually different, but not ACTUALLY different" do
129
- before do
130
- file "roles/x.json", <<~EOM
131
- {
132
- "chef_type": "role",
133
- "default_attributes": {
134
- },
135
- "env_run_lists": {
136
- },
137
- "json_class": "Chef::Role",
138
- "name": "x",
139
- "description": "",
140
- "override_attributes": {
141
- },
142
- "run_list": [
143
-
144
- ]
145
- }
146
- EOM
147
- end
148
-
149
- it "knife download / does not change anything" do
150
- knife("download /").should_succeed ""
151
- knife("diff --name-status /").should_succeed ""
152
- end
153
- end
154
-
155
- context "as well as one extra copy of each thing" do
156
- before do
157
- file "clients/y.json", { "public_key" => ChefZero::PUBLIC_KEY }
158
- file "cookbooks/x/blah.rb", ""
159
- file "cookbooks/y/metadata.rb", cb_metadata("x", "1.0.0")
160
- file "data_bags/x/z.json", {}
161
- file "data_bags/y/zz.json", {}
162
- file "environments/y.json", {}
163
- file "nodes/y.json", {}
164
- file "roles/y.json", {}
165
- file "users/y.json", { "public_key" => ChefZero::PUBLIC_KEY }
166
- end
167
-
168
- it "knife download does nothing" do
169
- knife("download /").should_succeed ""
170
- knife("diff --name-status /").should_succeed <<~EOM
171
- A\t/clients/y.json
172
- A\t/cookbooks/x/blah.rb
173
- A\t/cookbooks/y
174
- A\t/data_bags/x/z.json
175
- A\t/data_bags/y
176
- A\t/environments/y.json
177
- A\t/nodes/y.json
178
- A\t/roles/y.json
179
- A\t/users/y.json
180
- EOM
181
- end
182
-
183
- it "knife download --purge deletes the extra files" do
184
- knife("download --purge /").should_succeed <<~EOM
185
- Deleted extra entry /clients/y.json (purge is on)
186
- Deleted extra entry /cookbooks/x/blah.rb (purge is on)
187
- Deleted extra entry /cookbooks/y (purge is on)
188
- Deleted extra entry /data_bags/x/z.json (purge is on)
189
- Deleted extra entry /data_bags/y (purge is on)
190
- Deleted extra entry /environments/y.json (purge is on)
191
- Deleted extra entry /nodes/y.json (purge is on)
192
- Deleted extra entry /roles/y.json (purge is on)
193
- Deleted extra entry /users/y.json (purge is on)
194
- EOM
195
- knife("diff --name-status /").should_succeed ""
196
- end
197
- end
198
- end
199
-
200
- when_the_repository "is empty" do
201
- it "knife download creates the extra files" do
202
- knife("download /").should_succeed <<~EOM
203
- Created /clients
204
- Created /clients/chef-validator.json
205
- Created /clients/chef-webui.json
206
- Created /clients/x.json
207
- Created /cookbooks
208
- Created /cookbooks/x
209
- Created /cookbooks/x/metadata.rb
210
- Created /data_bags
211
- Created /data_bags/x
212
- Created /data_bags/x/y.json
213
- Created /environments
214
- Created /environments/_default.json
215
- Created /environments/x.json
216
- Created /nodes
217
- Created /nodes/x.json
218
- Created /roles
219
- Created /roles/x.json
220
- Created /users
221
- Created /users/admin.json
222
- Created /users/x.json
223
- EOM
224
- knife("diff --name-status /").should_succeed ""
225
- end
226
-
227
- it "knife download --no-diff creates the extra files" do
228
- knife("download --no-diff /").should_succeed <<~EOM
229
- Created /clients
230
- Created /clients/chef-validator.json
231
- Created /clients/chef-webui.json
232
- Created /clients/x.json
233
- Created /cookbooks
234
- Created /cookbooks/x
235
- Created /cookbooks/x/metadata.rb
236
- Created /data_bags
237
- Created /data_bags/x
238
- Created /data_bags/x/y.json
239
- Created /environments
240
- Created /environments/_default.json
241
- Created /environments/x.json
242
- Created /nodes
243
- Created /nodes/x.json
244
- Created /roles
245
- Created /roles/x.json
246
- Created /users
247
- Created /users/admin.json
248
- Created /users/x.json
249
- EOM
250
- knife("diff --name-status /").should_succeed ""
251
- end
252
-
253
- context "when current directory is top level" do
254
- before do
255
- cwd "."
256
- end
257
-
258
- it "knife download with no parameters reports an error" do
259
- knife("download").should_fail "FATAL: You must specify at least one argument. If you want to download everything in this directory, run \"knife download .\"\n", stdout: /USAGE/
260
- end
261
- end
262
- end
263
- end
264
-
265
- # Test download of an item when the other end doesn't even have the container
266
- when_the_repository "is empty" do
267
- when_the_chef_server "has two data bag items" do
268
- before do
269
- data_bag "x", { "y" => {}, "z" => {} }
270
- end
271
-
272
- it "knife download of one data bag item itself succeeds" do
273
- knife("download /data_bags/x/y.json").should_succeed <<~EOM
274
- Created /data_bags
275
- Created /data_bags/x
276
- Created /data_bags/x/y.json
277
- EOM
278
- knife("diff --name-status /data_bags").should_succeed <<~EOM
279
- D\t/data_bags/x/z.json
280
- EOM
281
- end
282
-
283
- it "knife download /data_bags/x /data_bags/x/y.json downloads x once" do
284
- knife("download /data_bags/x /data_bags/x/y.json").should_succeed <<~EOM
285
- Created /data_bags
286
- Created /data_bags/x
287
- Created /data_bags/x/y.json
288
- Created /data_bags/x/z.json
289
- EOM
290
- end
291
- end
292
- end
293
-
294
- when_the_repository "has three data bag items" do
295
- before do
296
- file "data_bags/x/deleted.json", <<~EOM
297
- {
298
- "id": "deleted"
299
- }
300
- EOM
301
- file "data_bags/x/modified.json", <<~EOM
302
- {
303
- "id": "modified"
304
- }
305
- EOM
306
- file "data_bags/x/unmodified.json", <<~EOM
307
- {
308
- "id": "unmodified"
309
- }
310
- EOM
311
- end
312
-
313
- when_the_chef_server "has a modified, unmodified, added and deleted data bag item" do
314
- before do
315
- data_bag "x", {
316
- "added" => {},
317
- "modified" => { "foo" => "bar" },
318
- "unmodified" => {},
319
- }
320
- end
321
-
322
- it "knife download of the modified file succeeds" do
323
- knife("download /data_bags/x/modified.json").should_succeed <<~EOM
324
- Updated /data_bags/x/modified.json
325
- EOM
326
- knife("diff --name-status /data_bags").should_succeed <<~EOM
327
- D\t/data_bags/x/added.json
328
- A\t/data_bags/x/deleted.json
329
- EOM
330
- end
331
- it "knife download of the unmodified file does nothing" do
332
- knife("download /data_bags/x/unmodified.json").should_succeed ""
333
- knife("diff --name-status /data_bags").should_succeed <<~EOM
334
- D\t/data_bags/x/added.json
335
- M\t/data_bags/x/modified.json
336
- A\t/data_bags/x/deleted.json
337
- EOM
338
- end
339
- it "knife download of the added file succeeds" do
340
- knife("download /data_bags/x/added.json").should_succeed <<~EOM
341
- Created /data_bags/x/added.json
342
- EOM
343
- knife("diff --name-status /data_bags").should_succeed <<~EOM
344
- M\t/data_bags/x/modified.json
345
- A\t/data_bags/x/deleted.json
346
- EOM
347
- end
348
- it "knife download of the deleted file does nothing" do
349
- knife("download /data_bags/x/deleted.json").should_succeed ""
350
- knife("diff --name-status /data_bags").should_succeed <<~EOM
351
- D\t/data_bags/x/added.json
352
- M\t/data_bags/x/modified.json
353
- A\t/data_bags/x/deleted.json
354
- EOM
355
- end
356
- it "knife download --purge of the deleted file deletes it" do
357
- knife("download --purge /data_bags/x/deleted.json").should_succeed <<~EOM
358
- Deleted extra entry /data_bags/x/deleted.json (purge is on)
359
- EOM
360
- knife("diff --name-status /data_bags").should_succeed <<~EOM
361
- D\t/data_bags/x/added.json
362
- M\t/data_bags/x/modified.json
363
- EOM
364
- end
365
- it "knife download of the entire data bag downloads everything" do
366
- knife("download /data_bags/x").should_succeed <<~EOM
367
- Created /data_bags/x/added.json
368
- Updated /data_bags/x/modified.json
369
- EOM
370
- knife("diff --name-status /data_bags").should_succeed <<~EOM
371
- A\t/data_bags/x/deleted.json
372
- EOM
373
- end
374
- it "knife download --purge of the entire data bag downloads everything" do
375
- knife("download --purge /data_bags/x").should_succeed <<~EOM
376
- Created /data_bags/x/added.json
377
- Updated /data_bags/x/modified.json
378
- Deleted extra entry /data_bags/x/deleted.json (purge is on)
379
- EOM
380
- knife("diff --name-status /data_bags").should_succeed ""
381
- end
382
- context "when cwd is the /data_bags directory" do
383
- before do
384
- cwd "data_bags"
385
- end
386
- it "knife download fails" do
387
- knife("download").should_fail "FATAL: You must specify at least one argument. If you want to download everything in this directory, run \"knife download .\"\n", stdout: /USAGE/
388
- end
389
- it "knife download --purge . downloads everything" do
390
- knife("download --purge .").should_succeed <<~EOM
391
- Created x/added.json
392
- Updated x/modified.json
393
- Deleted extra entry x/deleted.json (purge is on)
394
- EOM
395
- knife("diff --name-status /data_bags").should_succeed ""
396
- end
397
- it "knife download --purge * downloads everything" do
398
- knife("download --purge *").should_succeed <<~EOM
399
- Created x/added.json
400
- Updated x/modified.json
401
- Deleted extra entry x/deleted.json (purge is on)
402
- EOM
403
- knife("diff --name-status /data_bags").should_succeed ""
404
- end
405
- end
406
- end
407
- end
408
-
409
- when_the_repository "has a cookbook" do
410
- before do
411
- file "cookbooks/x/metadata.rb", cb_metadata("x", "1.0.0")
412
- file "cookbooks/x/z.rb", ""
413
- end
414
-
415
- when_the_chef_server "has a modified, added and deleted file for the cookbook" do
416
- before do
417
- cookbook "x", "1.0.0", { "metadata.rb" => cb_metadata("x", "1.0.0", "#extra content"), "y.rb" => "hi" }
418
- end
419
-
420
- it "knife download of a modified file succeeds" do
421
- knife("download /cookbooks/x/metadata.rb").should_succeed "Updated /cookbooks/x/metadata.rb\n"
422
- knife("diff --name-status /cookbooks").should_succeed <<~EOM
423
- D\t/cookbooks/x/y.rb
424
- A\t/cookbooks/x/z.rb
425
- EOM
426
- end
427
- it "knife download of a deleted file does nothing" do
428
- knife("download /cookbooks/x/z.rb").should_succeed ""
429
- knife("diff --name-status /cookbooks").should_succeed <<~EOM
430
- M\t/cookbooks/x/metadata.rb
431
- D\t/cookbooks/x/y.rb
432
- A\t/cookbooks/x/z.rb
433
- EOM
434
- end
435
- it "knife download --purge of a deleted file succeeds" do
436
- knife("download --purge /cookbooks/x/z.rb").should_succeed "Deleted extra entry /cookbooks/x/z.rb (purge is on)\n"
437
- knife("diff --name-status /cookbooks").should_succeed <<~EOM
438
- M\t/cookbooks/x/metadata.rb
439
- D\t/cookbooks/x/y.rb
440
- EOM
441
- end
442
- it "knife download of an added file succeeds" do
443
- knife("download /cookbooks/x/y.rb").should_succeed "Created /cookbooks/x/y.rb\n"
444
- knife("diff --name-status /cookbooks").should_succeed <<~EOM
445
- M\t/cookbooks/x/metadata.rb
446
- A\t/cookbooks/x/z.rb
447
- EOM
448
- end
449
- it "knife download of the cookbook itself succeeds" do
450
- knife("download /cookbooks/x").should_succeed <<~EOM
451
- Updated /cookbooks/x/metadata.rb
452
- Created /cookbooks/x/y.rb
453
- EOM
454
- knife("diff --name-status /cookbooks").should_succeed <<~EOM
455
- A\t/cookbooks/x/z.rb
456
- EOM
457
- end
458
- it "knife download --purge of the cookbook itself succeeds" do
459
- knife("download --purge /cookbooks/x").should_succeed <<~EOM
460
- Updated /cookbooks/x/metadata.rb
461
- Created /cookbooks/x/y.rb
462
- Deleted extra entry /cookbooks/x/z.rb (purge is on)
463
- EOM
464
- knife("diff --name-status /cookbooks").should_succeed ""
465
- end
466
- end
467
- end
468
-
469
- when_the_repository "has a cookbook" do
470
- before do
471
- file "cookbooks/x/metadata.rb", cb_metadata("x", "1.0.0")
472
- file "cookbooks/x/onlyin1.0.0.rb", "old_text"
473
- end
474
-
475
- when_the_chef_server "has a later version for the cookbook" do
476
- before do
477
- cookbook "x", "1.0.0", { "onlyin1.0.0.rb" => "" }
478
- cookbook "x", "1.0.1", { "onlyin1.0.1.rb" => "hi" }
479
- end
480
-
481
- it "knife download /cookbooks/x downloads the latest version" do
482
- knife("download --purge /cookbooks/x").should_succeed <<~EOM
483
- Updated /cookbooks/x/metadata.rb
484
- Created /cookbooks/x/onlyin1.0.1.rb
485
- Deleted extra entry /cookbooks/x/onlyin1.0.0.rb (purge is on)
486
- EOM
487
- knife("diff --name-status /cookbooks").should_succeed ""
488
- end
489
- end
490
-
491
- when_the_chef_server "has an earlier version for the cookbook" do
492
- before do
493
- cookbook "x", "1.0.0", { "onlyin1.0.0.rb" => "" }
494
- cookbook "x", "0.9.9", { "onlyin0.9.9.rb" => "hi" }
495
- end
496
-
497
- it "knife download /cookbooks/x downloads the updated file" do
498
- knife("download --purge /cookbooks/x").should_succeed <<~EOM
499
- Updated /cookbooks/x/onlyin1.0.0.rb
500
- EOM
501
- knife("diff --name-status /cookbooks").should_succeed ""
502
- end
503
- end
504
-
505
- when_the_chef_server "has a later version for the cookbook, and no current version" do
506
- before do
507
- cookbook "x", "1.0.1", { "onlyin1.0.1.rb" => "hi" }
508
- end
509
-
510
- it "knife download /cookbooks/x downloads the latest version" do
511
- knife("download --purge /cookbooks/x").should_succeed <<~EOM
512
- Updated /cookbooks/x/metadata.rb
513
- Created /cookbooks/x/onlyin1.0.1.rb
514
- Deleted extra entry /cookbooks/x/onlyin1.0.0.rb (purge is on)
515
- EOM
516
- knife("diff --name-status /cookbooks").should_succeed ""
517
- end
518
- end
519
-
520
- when_the_chef_server "has an earlier version for the cookbook, and no current version" do
521
- before do
522
- cookbook "x", "0.9.9", { "onlyin0.9.9.rb" => "hi" }
523
- end
524
-
525
- it "knife download /cookbooks/x downloads the old version" do
526
- knife("download --purge /cookbooks/x").should_succeed <<~EOM
527
- Updated /cookbooks/x/metadata.rb
528
- Created /cookbooks/x/onlyin0.9.9.rb
529
- Deleted extra entry /cookbooks/x/onlyin1.0.0.rb (purge is on)
530
- EOM
531
- knife("diff --name-status /cookbooks").should_succeed ""
532
- end
533
- end
534
- end
535
-
536
- when_the_chef_server "has a role" do
537
- before do
538
- role "x", {}
539
- end
540
- when_the_repository "has the role in ruby" do
541
- before do
542
- file "roles/x.rb", <<~EOM
543
- name "x"
544
- description "x"
545
- EOM
546
- end
547
-
548
- it "knife download refuses to change the role" do
549
- knife("download /roles/x.json").should_succeed "", stderr: "WARNING: /roles/x.rb cannot be updated (can't safely update ruby files).\n"
550
- knife("diff --name-status /roles/x.json").should_succeed "M\t/roles/x.rb\n"
551
- end
552
- end
553
- end
554
-
555
- when_the_chef_server "has an environment" do
556
- before do
557
- environment "x", {}
558
- end
559
- when_the_repository "has an environment with bad JSON" do
560
- before do
561
- file "environments/x.json", "{"
562
- end
563
- it "knife download succeeds" do
564
- warning = <<~EOH
565
- WARN: Parse error reading #{path_to("environments/x.json")} as JSON: parse error: premature EOF
566
- {
567
- (right here) ------^
568
-
569
- EOH
570
- knife("download /environments/x.json").should_succeed "Updated /environments/x.json\n", stderr: warning
571
- knife("diff --name-status /environments/x.json").should_succeed ""
572
- end
573
- end
574
-
575
- when_the_repository "has the same environment with the wrong name in the file" do
576
- before do
577
- file "environments/x.json", { "name" => "y" }
578
- end
579
- it "knife download succeeds" do
580
- knife("download /environments/x.json").should_succeed "Updated /environments/x.json\n"
581
- knife("diff --name-status /environments/x.json").should_succeed ""
582
- end
583
- end
584
-
585
- when_the_repository "has the same environment with no name in the file" do
586
- before do
587
- file "environments/x.json", { "description" => "hi" }
588
- end
589
- it "knife download succeeds" do
590
- knife("download /environments/x.json").should_succeed "Updated /environments/x.json\n"
591
- knife("diff --name-status /environments/x.json").should_succeed ""
592
- end
593
- end
594
- end
595
- end # without versioned cookbooks
596
-
597
- context "with versioned cookbooks" do
598
- before { Chef::Config[:versioned_cookbooks] = true }
599
-
600
- when_the_chef_server "has one of each thing" do
601
- before do
602
- client "x", {}
603
- cookbook "x", "1.0.0"
604
- data_bag "x", { "y" => {} }
605
- environment "x", {}
606
- node "x", {}
607
- role "x", {}
608
- user "x", {}
609
- end
610
-
611
- when_the_repository "has only top-level directories" do
612
- before do
613
- directory "clients"
614
- directory "cookbooks"
615
- directory "data_bags"
616
- directory "environments"
617
- directory "nodes"
618
- directory "roles"
619
- directory "users"
620
- end
621
-
622
- it "knife download downloads everything" do
623
- knife("download /").should_succeed <<~EOM
624
- Created /clients/chef-validator.json
625
- Created /clients/chef-webui.json
626
- Created /clients/x.json
627
- Created /cookbooks/x-1.0.0
628
- Created /cookbooks/x-1.0.0/metadata.rb
629
- Created /data_bags/x
630
- Created /data_bags/x/y.json
631
- Created /environments/_default.json
632
- Created /environments/x.json
633
- Created /nodes/x.json
634
- Created /roles/x.json
635
- Created /users/admin.json
636
- Created /users/x.json
637
- EOM
638
- knife("diff --name-status /").should_succeed ""
639
- end
640
- end
641
-
642
- when_the_repository "has an identical copy of each thing" do
643
- before do
644
- file "clients/chef-validator.json", { "validator" => true, "public_key" => ChefZero::PUBLIC_KEY }
645
- file "clients/chef-webui.json", { "admin" => true, "public_key" => ChefZero::PUBLIC_KEY }
646
- file "clients/x.json", { "public_key" => ChefZero::PUBLIC_KEY }
647
- file "cookbooks/x-1.0.0/metadata.rb", cb_metadata("x", "1.0.0")
648
- file "data_bags/x/y.json", {}
649
- file "environments/_default.json", { "description" => "The default Chef environment" }
650
- file "environments/x.json", {}
651
- file "nodes/x.json", { "normal" => { "tags" => [] } }
652
- file "roles/x.json", {}
653
- file "users/admin.json", { "admin" => true, "public_key" => ChefZero::PUBLIC_KEY }
654
- file "users/x.json", { "public_key" => ChefZero::PUBLIC_KEY }
655
- end
656
-
657
- it "knife download makes no changes" do
658
- knife("download /").should_succeed ""
659
- knife("diff --name-status /").should_succeed ""
660
- end
661
-
662
- it "knife download --purge makes no changes" do
663
- knife("download --purge /").should_succeed ""
664
- knife("diff --name-status /").should_succeed ""
665
- end
666
-
667
- context "except the role file" do
668
- before do
669
- file "roles/x.json", { "description" => "blarghle" }
670
- end
671
-
672
- it "knife download changes the role" do
673
- knife("download /").should_succeed "Updated /roles/x.json\n"
674
- knife("diff --name-status /").should_succeed ""
675
- end
676
- end
677
-
678
- context "except the role file is textually different, but not ACTUALLY different" do
679
- before do
680
- file "roles/x.json", <<~EOM
681
- {
682
- "chef_type": "role" ,
683
- "default_attributes": {
684
- },
685
- "env_run_lists": {
686
- },
687
- "json_class": "Chef::Role",
688
- "name": "x",
689
- "description": "",
690
- "override_attributes": {
691
- },
692
- "run_list": [
693
-
694
- ]
695
- }
696
- EOM
697
- end
698
-
699
- it "knife download / does not change anything" do
700
- knife("download /").should_succeed ""
701
- knife("diff --name-status /").should_succeed ""
702
- end
703
- end
704
-
705
- context "as well as one extra copy of each thing" do
706
- before do
707
- file "clients/y.json", { "public_key" => ChefZero::PUBLIC_KEY }
708
- file "cookbooks/x-1.0.0/blah.rb", ""
709
- file "cookbooks/x-2.0.0/metadata.rb", 'version "2.0.0"'
710
- file "cookbooks/y-1.0.0/metadata.rb", 'version "1.0.0"'
711
- file "data_bags/x/z.json", {}
712
- file "data_bags/y/zz.json", {}
713
- file "environments/y.json", {}
714
- file "nodes/y.json", {}
715
- file "roles/y.json", {}
716
- file "users/y.json", { "public_key" => ChefZero::PUBLIC_KEY }
717
- end
718
-
719
- it "knife download does nothing" do
720
- knife("download /").should_succeed ""
721
- knife("diff --name-status /").should_succeed <<~EOM
722
- A\t/clients/y.json
723
- A\t/cookbooks/x-1.0.0/blah.rb
724
- A\t/cookbooks/x-2.0.0
725
- A\t/cookbooks/y-1.0.0
726
- A\t/data_bags/x/z.json
727
- A\t/data_bags/y
728
- A\t/environments/y.json
729
- A\t/nodes/y.json
730
- A\t/roles/y.json
731
- A\t/users/y.json
732
- EOM
733
- end
734
-
735
- it "knife download --purge deletes the extra files" do
736
- knife("download --purge /").should_succeed <<~EOM
737
- Deleted extra entry /clients/y.json (purge is on)
738
- Deleted extra entry /cookbooks/x-1.0.0/blah.rb (purge is on)
739
- Deleted extra entry /cookbooks/x-2.0.0 (purge is on)
740
- Deleted extra entry /cookbooks/y-1.0.0 (purge is on)
741
- Deleted extra entry /data_bags/x/z.json (purge is on)
742
- Deleted extra entry /data_bags/y (purge is on)
743
- Deleted extra entry /environments/y.json (purge is on)
744
- Deleted extra entry /nodes/y.json (purge is on)
745
- Deleted extra entry /roles/y.json (purge is on)
746
- Deleted extra entry /users/y.json (purge is on)
747
- EOM
748
- knife("diff --name-status /").should_succeed ""
749
- end
750
- end
751
- end
752
-
753
- when_the_repository "is empty" do
754
- it "knife download creates the extra files" do
755
- knife("download /").should_succeed <<~EOM
756
- Created /clients
757
- Created /clients/chef-validator.json
758
- Created /clients/chef-webui.json
759
- Created /clients/x.json
760
- Created /cookbooks
761
- Created /cookbooks/x-1.0.0
762
- Created /cookbooks/x-1.0.0/metadata.rb
763
- Created /data_bags
764
- Created /data_bags/x
765
- Created /data_bags/x/y.json
766
- Created /environments
767
- Created /environments/_default.json
768
- Created /environments/x.json
769
- Created /nodes
770
- Created /nodes/x.json
771
- Created /roles
772
- Created /roles/x.json
773
- Created /users
774
- Created /users/admin.json
775
- Created /users/x.json
776
- EOM
777
- knife("diff --name-status /").should_succeed ""
778
- end
779
-
780
- context "when current directory is top level" do
781
- before do
782
- cwd "."
783
- end
784
- it "knife download with no parameters reports an error" do
785
- knife("download").should_fail "FATAL: You must specify at least one argument. If you want to download everything in this directory, run \"knife download .\"\n", stdout: /USAGE/
786
- end
787
- end
788
- end
789
- end
790
-
791
- # Test download of an item when the other end doesn't even have the container
792
- when_the_repository "is empty" do
793
- when_the_chef_server "has two data bag items" do
794
- before do
795
- data_bag "x", { "y" => {}, "z" => {} }
796
- end
797
-
798
- it "knife download of one data bag item itself succeeds" do
799
- knife("download /data_bags/x/y.json").should_succeed <<~EOM
800
- Created /data_bags
801
- Created /data_bags/x
802
- Created /data_bags/x/y.json
803
- EOM
804
- knife("diff --name-status /data_bags").should_succeed <<~EOM
805
- D\t/data_bags/x/z.json
806
- EOM
807
- end
808
- end
809
- end
810
-
811
- when_the_repository "has three data bag items" do
812
- before do
813
- file "data_bags/x/deleted.json", <<~EOM
814
- {
815
- "id": "deleted"
816
- }
817
- EOM
818
- file "data_bags/x/modified.json", <<~EOM
819
- {
820
- "id": "modified"
821
- }
822
- EOM
823
- file "data_bags/x/unmodified.json", <<~EOM
824
- {
825
- "id": "unmodified"
826
- }
827
- EOM
828
- end
829
-
830
- when_the_chef_server "has a modified, unmodified, added and deleted data bag item" do
831
- before do
832
- data_bag "x", {
833
- "added" => {},
834
- "modified" => { "foo" => "bar" },
835
- "unmodified" => {},
836
- }
837
- end
838
-
839
- it "knife download of the modified file succeeds" do
840
- knife("download /data_bags/x/modified.json").should_succeed <<~EOM
841
- Updated /data_bags/x/modified.json
842
- EOM
843
- knife("diff --name-status /data_bags").should_succeed <<~EOM
844
- D\t/data_bags/x/added.json
845
- A\t/data_bags/x/deleted.json
846
- EOM
847
- end
848
- it "knife download of the unmodified file does nothing" do
849
- knife("download /data_bags/x/unmodified.json").should_succeed ""
850
- knife("diff --name-status /data_bags").should_succeed <<~EOM
851
- D\t/data_bags/x/added.json
852
- M\t/data_bags/x/modified.json
853
- A\t/data_bags/x/deleted.json
854
- EOM
855
- end
856
- it "knife download of the added file succeeds" do
857
- knife("download /data_bags/x/added.json").should_succeed <<~EOM
858
- Created /data_bags/x/added.json
859
- EOM
860
- knife("diff --name-status /data_bags").should_succeed <<~EOM
861
- M\t/data_bags/x/modified.json
862
- A\t/data_bags/x/deleted.json
863
- EOM
864
- end
865
- it "knife download of the deleted file does nothing" do
866
- knife("download /data_bags/x/deleted.json").should_succeed ""
867
- knife("diff --name-status /data_bags").should_succeed <<~EOM
868
- D\t/data_bags/x/added.json
869
- M\t/data_bags/x/modified.json
870
- A\t/data_bags/x/deleted.json
871
- EOM
872
- end
873
- it "knife download --purge of the deleted file deletes it" do
874
- knife("download --purge /data_bags/x/deleted.json").should_succeed <<~EOM
875
- Deleted extra entry /data_bags/x/deleted.json (purge is on)
876
- EOM
877
- knife("diff --name-status /data_bags").should_succeed <<~EOM
878
- D\t/data_bags/x/added.json
879
- M\t/data_bags/x/modified.json
880
- EOM
881
- end
882
- it "knife download of the entire data bag downloads everything" do
883
- knife("download /data_bags/x").should_succeed <<~EOM
884
- Created /data_bags/x/added.json
885
- Updated /data_bags/x/modified.json
886
- EOM
887
- knife("diff --name-status /data_bags").should_succeed <<~EOM
888
- A\t/data_bags/x/deleted.json
889
- EOM
890
- end
891
- it "knife download --purge of the entire data bag downloads everything" do
892
- knife("download --purge /data_bags/x").should_succeed <<~EOM
893
- Created /data_bags/x/added.json
894
- Updated /data_bags/x/modified.json
895
- Deleted extra entry /data_bags/x/deleted.json (purge is on)
896
- EOM
897
- knife("diff --name-status /data_bags").should_succeed ""
898
- end
899
- context "when cwd is the /data_bags directory" do
900
- before do
901
- cwd "data_bags"
902
- end
903
- it "knife download fails" do
904
- knife("download").should_fail "FATAL: You must specify at least one argument. If you want to download everything in this directory, run \"knife download .\"\n", stdout: /USAGE/
905
- end
906
- it "knife download --purge . downloads everything" do
907
- knife("download --purge .").should_succeed <<~EOM
908
- Created x/added.json
909
- Updated x/modified.json
910
- Deleted extra entry x/deleted.json (purge is on)
911
- EOM
912
- knife("diff --name-status /data_bags").should_succeed ""
913
- end
914
- it "knife download --purge * downloads everything" do
915
- knife("download --purge *").should_succeed <<~EOM
916
- Created x/added.json
917
- Updated x/modified.json
918
- Deleted extra entry x/deleted.json (purge is on)
919
- EOM
920
- knife("diff --name-status /data_bags").should_succeed ""
921
- end
922
- end
923
- end
924
- end
925
-
926
- when_the_repository "has a cookbook" do
927
- before do
928
- file "cookbooks/x-1.0.0/metadata.rb", 'name "x"; version "1.0.0"#unmodified'
929
- file "cookbooks/x-1.0.0/z.rb", ""
930
- end
931
-
932
- when_the_chef_server "has a modified, added and deleted file for the cookbook" do
933
- before do
934
- cookbook "x", "1.0.0", { "y.rb" => "hi" }
935
- end
936
-
937
- it "knife download of a modified file succeeds" do
938
- knife("download /cookbooks/x-1.0.0/metadata.rb").should_succeed "Updated /cookbooks/x-1.0.0/metadata.rb\n"
939
- knife("diff --name-status /cookbooks").should_succeed <<~EOM
940
- D\t/cookbooks/x-1.0.0/y.rb
941
- A\t/cookbooks/x-1.0.0/z.rb
942
- EOM
943
- end
944
- it "knife download of a deleted file does nothing" do
945
- knife("download /cookbooks/x-1.0.0/z.rb").should_succeed ""
946
- knife("diff --name-status /cookbooks").should_succeed <<~EOM
947
- M\t/cookbooks/x-1.0.0/metadata.rb
948
- D\t/cookbooks/x-1.0.0/y.rb
949
- A\t/cookbooks/x-1.0.0/z.rb
950
- EOM
951
- end
952
- it "knife download --purge of a deleted file succeeds" do
953
- knife("download --purge /cookbooks/x-1.0.0/z.rb").should_succeed "Deleted extra entry /cookbooks/x-1.0.0/z.rb (purge is on)\n"
954
- knife("diff --name-status /cookbooks").should_succeed <<~EOM
955
- M\t/cookbooks/x-1.0.0/metadata.rb
956
- D\t/cookbooks/x-1.0.0/y.rb
957
- EOM
958
- end
959
- it "knife download of an added file succeeds" do
960
- knife("download /cookbooks/x-1.0.0/y.rb").should_succeed "Created /cookbooks/x-1.0.0/y.rb\n"
961
- knife("diff --name-status /cookbooks").should_succeed <<~EOM
962
- M\t/cookbooks/x-1.0.0/metadata.rb
963
- A\t/cookbooks/x-1.0.0/z.rb
964
- EOM
965
- end
966
- it "knife download of the cookbook itself succeeds" do
967
- knife("download /cookbooks/x-1.0.0").should_succeed <<~EOM
968
- Updated /cookbooks/x-1.0.0/metadata.rb
969
- Created /cookbooks/x-1.0.0/y.rb
970
- EOM
971
- knife("diff --name-status /cookbooks").should_succeed <<~EOM
972
- A\t/cookbooks/x-1.0.0/z.rb
973
- EOM
974
- end
975
- it "knife download --purge of the cookbook itself succeeds" do
976
- knife("download --purge /cookbooks/x-1.0.0").should_succeed <<~EOM
977
- Updated /cookbooks/x-1.0.0/metadata.rb
978
- Created /cookbooks/x-1.0.0/y.rb
979
- Deleted extra entry /cookbooks/x-1.0.0/z.rb (purge is on)
980
- EOM
981
- knife("diff --name-status /cookbooks").should_succeed ""
982
- end
983
- end
984
- end
985
-
986
- when_the_repository "has a cookbook" do
987
- before do
988
- file "cookbooks/x-1.0.0/metadata.rb", cb_metadata("x", "1.0.0")
989
- file "cookbooks/x-1.0.0/onlyin1.0.0.rb", "old_text"
990
- end
991
-
992
- when_the_chef_server "has a later version for the cookbook" do
993
- before do
994
- cookbook "x", "1.0.0", { "onlyin1.0.0.rb" => "" }
995
- cookbook "x", "1.0.1", { "onlyin1.0.1.rb" => "hi" }
996
- end
997
-
998
- it "knife download /cookbooks/x downloads the latest version" do
999
- knife("download --purge /cookbooks").should_succeed <<~EOM
1000
- Updated /cookbooks/x-1.0.0/onlyin1.0.0.rb
1001
- Created /cookbooks/x-1.0.1
1002
- Created /cookbooks/x-1.0.1/metadata.rb
1003
- Created /cookbooks/x-1.0.1/onlyin1.0.1.rb
1004
- EOM
1005
- knife("diff --name-status /cookbooks").should_succeed ""
1006
- end
1007
- end
1008
-
1009
- when_the_chef_server "has an earlier version for the cookbook" do
1010
- before do
1011
- cookbook "x", "1.0.0", { "onlyin1.0.0.rb" => "" }
1012
- cookbook "x", "0.9.9", { "onlyin0.9.9.rb" => "hi" }
1013
- end
1014
-
1015
- it "knife download /cookbooks downloads the updated file" do
1016
- knife("download --purge /cookbooks").should_succeed <<~EOM
1017
- Created /cookbooks/x-0.9.9
1018
- Created /cookbooks/x-0.9.9/metadata.rb
1019
- Created /cookbooks/x-0.9.9/onlyin0.9.9.rb
1020
- Updated /cookbooks/x-1.0.0/onlyin1.0.0.rb
1021
- EOM
1022
- knife("diff --name-status /cookbooks").should_succeed ""
1023
- end
1024
- end
1025
-
1026
- when_the_chef_server "has a later version for the cookbook, and no current version" do
1027
- before do
1028
- cookbook "x", "1.0.1", { "onlyin1.0.1.rb" => "hi" }
1029
- end
1030
-
1031
- it "knife download /cookbooks/x downloads the latest version" do
1032
- knife("download --purge /cookbooks").should_succeed <<~EOM
1033
- Created /cookbooks/x-1.0.1
1034
- Created /cookbooks/x-1.0.1/metadata.rb
1035
- Created /cookbooks/x-1.0.1/onlyin1.0.1.rb
1036
- Deleted extra entry /cookbooks/x-1.0.0 (purge is on)
1037
- EOM
1038
- knife("diff --name-status /cookbooks").should_succeed ""
1039
- end
1040
- end
1041
-
1042
- when_the_chef_server "has an earlier version for the cookbook, and no current version" do
1043
- before do
1044
- cookbook "x", "0.9.9", { "onlyin0.9.9.rb" => "hi" }
1045
- end
1046
-
1047
- it "knife download --purge /cookbooks downloads the old version and deletes the new version" do
1048
- knife("download --purge /cookbooks").should_succeed <<~EOM
1049
- Created /cookbooks/x-0.9.9
1050
- Created /cookbooks/x-0.9.9/metadata.rb
1051
- Created /cookbooks/x-0.9.9/onlyin0.9.9.rb
1052
- Deleted extra entry /cookbooks/x-1.0.0 (purge is on)
1053
- EOM
1054
- knife("diff --name-status /cookbooks").should_succeed ""
1055
- end
1056
- end
1057
- end
1058
-
1059
- when_the_chef_server "has an environment" do
1060
- before do
1061
- environment "x", {}
1062
- end
1063
-
1064
- when_the_repository "has the same environment with the wrong name in the file" do
1065
- before do
1066
- file "environments/x.json", { "name" => "y" }
1067
- end
1068
-
1069
- it "knife download succeeds" do
1070
- knife("download /environments/x.json").should_succeed "Updated /environments/x.json\n"
1071
- knife("diff --name-status /environments/x.json").should_succeed ""
1072
- end
1073
- end
1074
-
1075
- when_the_repository "has the same environment with no name in the file" do
1076
- before do
1077
- file "environments/x.json", { "description" => "hi" }
1078
- end
1079
-
1080
- it "knife download succeeds" do
1081
- knife("download /environments/x.json").should_succeed "Updated /environments/x.json\n"
1082
- knife("diff --name-status /environments/x.json").should_succeed ""
1083
- end
1084
- end
1085
- end
1086
- end # with versioned cookbooks
1087
-
1088
- when_the_chef_server "has a cookbook" do
1089
- before do
1090
- cookbook "x", "1.0.0"
1091
- end
1092
-
1093
- when_the_repository "is empty" do
1094
- it "knife download /cookbooks/x signs all requests" do
1095
-
1096
- # Check that BasicClient.request() always gets called with X-OPS-USERID
1097
- original_new = Chef::HTTP::BasicClient.method(:new)
1098
- expect(Chef::HTTP::BasicClient).to receive(:new) { |args|
1099
- new_result = original_new.call(*args)
1100
- original_request = new_result.method(:request)
1101
- expect(new_result).to receive(:request) { |method, url, body, headers, &response_handler|
1102
- expect(headers["X-OPS-USERID"]).not_to be_nil
1103
- original_request.call(method, url, body, headers, &response_handler)
1104
- }.at_least(:once)
1105
- new_result
1106
- }.at_least(:once)
1107
-
1108
- knife("download /cookbooks/x").should_succeed <<~EOM
1109
- Created /cookbooks
1110
- Created /cookbooks/x
1111
- Created /cookbooks/x/metadata.rb
1112
- EOM
1113
- end
1114
- end
1115
- end
1116
-
1117
- when_the_chef_server "is in Enterprise mode", osc_compat: false, single_org: false do
1118
- before do
1119
- user "foo", {}
1120
- user "bar", {}
1121
- user "foobar", {}
1122
- organization "foo", { "full_name" => "Something" }
1123
- end
1124
-
1125
- before :each do
1126
- Chef::Config.chef_server_url = URI.join(Chef::Config.chef_server_url, "/organizations/foo")
1127
- end
1128
-
1129
- when_the_repository "has all the default stuff" do
1130
- before do
1131
- knife("download /").should_succeed <<~EOM
1132
- Created /acls
1133
- Created /acls/clients
1134
- Created /acls/clients/foo-validator.json
1135
- Created /acls/containers
1136
- Created /acls/containers/clients.json
1137
- Created /acls/containers/containers.json
1138
- Created /acls/containers/cookbook_artifacts.json
1139
- Created /acls/containers/cookbooks.json
1140
- Created /acls/containers/data.json
1141
- Created /acls/containers/environments.json
1142
- Created /acls/containers/groups.json
1143
- Created /acls/containers/nodes.json
1144
- Created /acls/containers/policies.json
1145
- Created /acls/containers/policy_groups.json
1146
- Created /acls/containers/roles.json
1147
- Created /acls/containers/sandboxes.json
1148
- Created /acls/cookbook_artifacts
1149
- Created /acls/cookbooks
1150
- Created /acls/data_bags
1151
- Created /acls/environments
1152
- Created /acls/environments/_default.json
1153
- Created /acls/groups
1154
- Created /acls/groups/admins.json
1155
- Created /acls/groups/billing-admins.json
1156
- Created /acls/groups/clients.json
1157
- Created /acls/groups/users.json
1158
- Created /acls/nodes
1159
- Created /acls/policies
1160
- Created /acls/policy_groups
1161
- Created /acls/roles
1162
- Created /acls/organization.json
1163
- Created /clients
1164
- Created /clients/foo-validator.json
1165
- Created /containers
1166
- Created /containers/clients.json
1167
- Created /containers/containers.json
1168
- Created /containers/cookbook_artifacts.json
1169
- Created /containers/cookbooks.json
1170
- Created /containers/data.json
1171
- Created /containers/environments.json
1172
- Created /containers/groups.json
1173
- Created /containers/nodes.json
1174
- Created /containers/policies.json
1175
- Created /containers/policy_groups.json
1176
- Created /containers/roles.json
1177
- Created /containers/sandboxes.json
1178
- Created /cookbook_artifacts
1179
- Created /cookbooks
1180
- Created /data_bags
1181
- Created /environments
1182
- Created /environments/_default.json
1183
- Created /groups
1184
- Created /groups/admins.json
1185
- Created /groups/billing-admins.json
1186
- Created /groups/clients.json
1187
- Created /groups/users.json
1188
- Created /invitations.json
1189
- Created /members.json
1190
- Created /nodes
1191
- Created /org.json
1192
- Created /policies
1193
- Created /policy_groups
1194
- Created /roles
1195
- EOM
1196
- end
1197
-
1198
- context "and the server has one of each thing" do
1199
- before do
1200
- # acl_for %w(organizations foo groups blah)
1201
- client "x", {}
1202
- cookbook "x", "1.0.0"
1203
- cookbook_artifact "x", "1x1", { "metadata.rb" => cb_metadata("x", "1.0.0") }
1204
- container "x", {}
1205
- data_bag "x", { "y" => {} }
1206
- environment "x", {}
1207
- group "x", {}
1208
- org_invite "foo"
1209
- org_member "bar"
1210
- node "x", {}
1211
- policy "x", "1.0.0", {}
1212
- policy "blah", "1.0.0", {}
1213
- policy_group "x", {
1214
- "policies" => {
1215
- "x" => { "revision_id" => "1.0.0" },
1216
- "blah" => { "revision_id" => "1.0.0" },
1217
- },
1218
- }
1219
- role "x", {}
1220
- end
1221
-
1222
- before do
1223
- knife("download /acls /groups/clients.json /groups/users.json").should_succeed <<~EOM
1224
- Created /acls/clients/x.json
1225
- Created /acls/containers/x.json
1226
- Created /acls/cookbook_artifacts/x.json
1227
- Created /acls/cookbooks/x.json
1228
- Created /acls/data_bags/x.json
1229
- Created /acls/environments/x.json
1230
- Created /acls/groups/x.json
1231
- Created /acls/nodes/x.json
1232
- Created /acls/policies/blah.json
1233
- Created /acls/policies/x.json
1234
- Created /acls/policy_groups/x.json
1235
- Created /acls/roles/x.json
1236
- Updated /groups/clients.json
1237
- Updated /groups/users.json
1238
- EOM
1239
- end
1240
-
1241
- it "knife download / downloads everything" do
1242
- knife("download /").should_succeed <<~EOM
1243
- Created /clients/x.json
1244
- Created /containers/x.json
1245
- Created /cookbook_artifacts/x-1x1
1246
- Created /cookbook_artifacts/x-1x1/metadata.rb
1247
- Created /cookbooks/x
1248
- Created /cookbooks/x/metadata.rb
1249
- Created /data_bags/x
1250
- Created /data_bags/x/y.json
1251
- Created /environments/x.json
1252
- Created /groups/x.json
1253
- Updated /invitations.json
1254
- Updated /members.json
1255
- Created /nodes/x.json
1256
- Created /policies/blah-1.0.0.json
1257
- Created /policies/x-1.0.0.json
1258
- Created /policy_groups/x.json
1259
- Created /roles/x.json
1260
- EOM
1261
- knife("diff --name-status /").should_succeed ""
1262
- end
1263
-
1264
- context "and the repository has an identical copy of each thing" do
1265
- before do
1266
- # TODO We have to upload acls for an existing group due to a lack of
1267
- # dependency detection during upload. Fix that!
1268
- file "clients/x.json", { "public_key" => ChefZero::PUBLIC_KEY }
1269
- file "containers/x.json", {}
1270
- file "cookbooks/x/metadata.rb", cb_metadata("x", "1.0.0")
1271
- file "cookbook_artifacts/x-1x1/metadata.rb", cb_metadata("x", "1.0.0")
1272
- file "data_bags/x/y.json", {}
1273
- file "environments/x.json", {}
1274
- file "groups/x.json", {}
1275
- file "invitations.json", [ "foo" ]
1276
- file "members.json", [ "bar" ]
1277
- file "nodes/x.json", { "normal" => { "tags" => [] } }
1278
- file "org.json", { "full_name" => "Something" }
1279
- file "policies/x-1.0.0.json", { "policy_group_list" => [ "x" ] }
1280
- file "policies/blah-1.0.0.json", { "policy_group_list" => [ "x" ] }
1281
- file "policy_groups/x.json", { "policies" => { "x" => { "revision_id" => "1.0.0" }, "blah" => { "revision_id" => "1.0.0" } } }
1282
- file "roles/x.json", {}
1283
- end
1284
-
1285
- it "knife download makes no changes" do
1286
- knife("download /").should_succeed ""
1287
- end
1288
- end
1289
-
1290
- context "and the repository has a slightly different copy of each thing" do
1291
- before do
1292
- # acl_for %w(organizations foo groups blah)
1293
- file "clients/x.json", { "validator" => true }
1294
- file "containers/x.json", {}
1295
- file "cookbooks/x/metadata.rb", cb_metadata("x", "1.0.1")
1296
- file "cookbook_artifacts/x-1x1/metadata.rb", cb_metadata("x", "1.0.1")
1297
- file "data_bags/x/y.json", { "a" => "b" }
1298
- file "environments/x.json", { "description" => "foo" }
1299
- file "groups/x.json", { "description" => "foo" }
1300
- file "groups/x.json", { "groups" => [ "admin" ] }
1301
- file "nodes/x.json", { "normal" => { "tags" => [] }, "run_list" => [ "blah" ] }
1302
- file "org.json", { "full_name" => "Something Else " }
1303
- file "policies/x-1.0.0.json", { "run_list" => [ "blah" ] }
1304
- file "policy_groups/x.json", {
1305
- "policies" => {
1306
- "x" => { "revision_id" => "1.0.1" },
1307
- "y" => { "revision_id" => "1.0.0" },
1308
- },
1309
- }
1310
- file "roles/x.json", { "run_list" => [ "blah" ] }
1311
- end
1312
-
1313
- it "knife download updates everything" do
1314
- knife("download /").should_succeed <<~EOM
1315
- Updated /clients/x.json
1316
- Updated /cookbook_artifacts/x-1x1/metadata.rb
1317
- Updated /cookbooks/x/metadata.rb
1318
- Updated /data_bags/x/y.json
1319
- Updated /environments/x.json
1320
- Updated /groups/x.json
1321
- Updated /invitations.json
1322
- Updated /members.json
1323
- Updated /nodes/x.json
1324
- Updated /org.json
1325
- Created /policies/blah-1.0.0.json
1326
- Updated /policies/x-1.0.0.json
1327
- Updated /policy_groups/x.json
1328
- Updated /roles/x.json
1329
- EOM
1330
- knife("diff --name-status /").should_succeed ""
1331
- end
1332
- end
1333
- end
1334
- end
1335
- end
1336
- end
1
+ #
2
+ # Author:: John Keiser (<jkeiser@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
+ require "knife_spec_helper"
19
+ require "support/shared/integration/integration_helper"
20
+ require "chef/knife/download"
21
+ require "chef/knife/diff"
22
+
23
+ describe "knife download", :workstation do
24
+ include IntegrationSupport
25
+ include KnifeSupport
26
+
27
+ context "without versioned cookbooks" do
28
+ when_the_chef_server "has one of each thing" do
29
+
30
+ before do
31
+ client "x", {}
32
+ cookbook "x", "1.0.0"
33
+ data_bag "x", { "y" => {} }
34
+ environment "x", {}
35
+ node "x", {}
36
+ role "x", {}
37
+ user "x", {}
38
+ end
39
+
40
+ when_the_repository "has only top-level directories" do
41
+ before do
42
+ directory "clients"
43
+ directory "cookbooks"
44
+ directory "data_bags"
45
+ directory "environments"
46
+ directory "nodes"
47
+ directory "roles"
48
+ directory "users"
49
+ end
50
+
51
+ it "knife download downloads everything" do
52
+ knife("download /").should_succeed <<~EOM
53
+ Created /clients/chef-validator.json
54
+ Created /clients/chef-webui.json
55
+ Created /clients/x.json
56
+ Created /cookbooks/x
57
+ Created /cookbooks/x/metadata.rb
58
+ Created /data_bags/x
59
+ Created /data_bags/x/y.json
60
+ Created /environments/_default.json
61
+ Created /environments/x.json
62
+ Created /nodes/x.json
63
+ Created /roles/x.json
64
+ Created /users/admin.json
65
+ Created /users/x.json
66
+ EOM
67
+ knife("diff --name-status /").should_succeed ""
68
+ end
69
+ end
70
+
71
+ when_the_repository "has an identical copy of each thing" do
72
+ before do
73
+ file "clients/chef-validator.json", { "validator" => true, "public_key" => ChefZero::PUBLIC_KEY }
74
+ file "clients/chef-webui.json", { "admin" => true, "public_key" => ChefZero::PUBLIC_KEY }
75
+ file "clients/x.json", { "public_key" => ChefZero::PUBLIC_KEY }
76
+ file "cookbooks/x/metadata.rb", cb_metadata("x", "1.0.0")
77
+ file "data_bags/x/y.json", {}
78
+ file "environments/_default.json", { "description" => "The default Chef environment" }
79
+ file "environments/x.json", {}
80
+ file "nodes/x.json", { "normal" => { "tags" => [] } }
81
+ file "roles/x.json", {}
82
+ file "users/admin.json", { "admin" => true, "public_key" => ChefZero::PUBLIC_KEY }
83
+ file "users/x.json", { "public_key" => ChefZero::PUBLIC_KEY }
84
+ end
85
+
86
+ it "knife download makes no changes" do
87
+ knife("download /").should_succeed ""
88
+ knife("diff --name-status /").should_succeed ""
89
+ end
90
+
91
+ it "knife download --purge makes no changes" do
92
+ knife("download --purge /").should_succeed ""
93
+ knife("diff --name-status /").should_succeed ""
94
+ end
95
+
96
+ context "except the role file" do
97
+ before do
98
+ file "roles/x.json", <<~EOM
99
+ {
100
+ "chef_type": "role",
101
+ "default_attributes": {
102
+ },
103
+ "description": "blarghle",
104
+ "env_run_lists": {
105
+ },
106
+ "json_class": "Chef::Role",
107
+ "name": "x",
108
+ "override_attributes": {
109
+ },
110
+ "run_list": [
111
+
112
+ ]
113
+ }
114
+ EOM
115
+ end
116
+
117
+ it "knife download changes the role" do
118
+ knife("download /").should_succeed "Updated /roles/x.json\n"
119
+ knife("diff --name-status /").should_succeed ""
120
+ end
121
+
122
+ it "knife download --no-diff does not change the role" do
123
+ knife("download --no-diff /").should_succeed ""
124
+ knife("diff --name-status /").should_succeed "M\t/roles/x.json\n"
125
+ end
126
+ end
127
+
128
+ context "except the role file is textually different, but not ACTUALLY different" do
129
+ before do
130
+ file "roles/x.json", <<~EOM
131
+ {
132
+ "chef_type": "role",
133
+ "default_attributes": {
134
+ },
135
+ "env_run_lists": {
136
+ },
137
+ "json_class": "Chef::Role",
138
+ "name": "x",
139
+ "description": "",
140
+ "override_attributes": {
141
+ },
142
+ "run_list": [
143
+
144
+ ]
145
+ }
146
+ EOM
147
+ end
148
+
149
+ it "knife download / does not change anything" do
150
+ knife("download /").should_succeed ""
151
+ knife("diff --name-status /").should_succeed ""
152
+ end
153
+ end
154
+
155
+ context "as well as one extra copy of each thing" do
156
+ before do
157
+ file "clients/y.json", { "public_key" => ChefZero::PUBLIC_KEY }
158
+ file "cookbooks/x/blah.rb", ""
159
+ file "cookbooks/y/metadata.rb", cb_metadata("x", "1.0.0")
160
+ file "data_bags/x/z.json", {}
161
+ file "data_bags/y/zz.json", {}
162
+ file "environments/y.json", {}
163
+ file "nodes/y.json", {}
164
+ file "roles/y.json", {}
165
+ file "users/y.json", { "public_key" => ChefZero::PUBLIC_KEY }
166
+ end
167
+
168
+ it "knife download does nothing" do
169
+ knife("download /").should_succeed ""
170
+ knife("diff --name-status /").should_succeed <<~EOM
171
+ A\t/clients/y.json
172
+ A\t/cookbooks/x/blah.rb
173
+ A\t/cookbooks/y
174
+ A\t/data_bags/x/z.json
175
+ A\t/data_bags/y
176
+ A\t/environments/y.json
177
+ A\t/nodes/y.json
178
+ A\t/roles/y.json
179
+ A\t/users/y.json
180
+ EOM
181
+ end
182
+
183
+ it "knife download --purge deletes the extra files" do
184
+ knife("download --purge /").should_succeed <<~EOM
185
+ Deleted extra entry /clients/y.json (purge is on)
186
+ Deleted extra entry /cookbooks/x/blah.rb (purge is on)
187
+ Deleted extra entry /cookbooks/y (purge is on)
188
+ Deleted extra entry /data_bags/x/z.json (purge is on)
189
+ Deleted extra entry /data_bags/y (purge is on)
190
+ Deleted extra entry /environments/y.json (purge is on)
191
+ Deleted extra entry /nodes/y.json (purge is on)
192
+ Deleted extra entry /roles/y.json (purge is on)
193
+ Deleted extra entry /users/y.json (purge is on)
194
+ EOM
195
+ knife("diff --name-status /").should_succeed ""
196
+ end
197
+ end
198
+ end
199
+
200
+ when_the_repository "is empty" do
201
+ it "knife download creates the extra files" do
202
+ knife("download /").should_succeed <<~EOM
203
+ Created /clients
204
+ Created /clients/chef-validator.json
205
+ Created /clients/chef-webui.json
206
+ Created /clients/x.json
207
+ Created /cookbooks
208
+ Created /cookbooks/x
209
+ Created /cookbooks/x/metadata.rb
210
+ Created /data_bags
211
+ Created /data_bags/x
212
+ Created /data_bags/x/y.json
213
+ Created /environments
214
+ Created /environments/_default.json
215
+ Created /environments/x.json
216
+ Created /nodes
217
+ Created /nodes/x.json
218
+ Created /roles
219
+ Created /roles/x.json
220
+ Created /users
221
+ Created /users/admin.json
222
+ Created /users/x.json
223
+ EOM
224
+ knife("diff --name-status /").should_succeed ""
225
+ end
226
+
227
+ it "knife download --no-diff creates the extra files" do
228
+ knife("download --no-diff /").should_succeed <<~EOM
229
+ Created /clients
230
+ Created /clients/chef-validator.json
231
+ Created /clients/chef-webui.json
232
+ Created /clients/x.json
233
+ Created /cookbooks
234
+ Created /cookbooks/x
235
+ Created /cookbooks/x/metadata.rb
236
+ Created /data_bags
237
+ Created /data_bags/x
238
+ Created /data_bags/x/y.json
239
+ Created /environments
240
+ Created /environments/_default.json
241
+ Created /environments/x.json
242
+ Created /nodes
243
+ Created /nodes/x.json
244
+ Created /roles
245
+ Created /roles/x.json
246
+ Created /users
247
+ Created /users/admin.json
248
+ Created /users/x.json
249
+ EOM
250
+ knife("diff --name-status /").should_succeed ""
251
+ end
252
+
253
+ context "when current directory is top level" do
254
+ before do
255
+ cwd "."
256
+ end
257
+
258
+ it "knife download with no parameters reports an error" do
259
+ knife("download").should_fail "FATAL: You must specify at least one argument. If you want to download everything in this directory, run \"knife download .\"\n", stdout: /USAGE/
260
+ end
261
+ end
262
+ end
263
+ end
264
+
265
+ # Test download of an item when the other end doesn't even have the container
266
+ when_the_repository "is empty" do
267
+ when_the_chef_server "has two data bag items" do
268
+ before do
269
+ data_bag "x", { "y" => {}, "z" => {} }
270
+ end
271
+
272
+ it "knife download of one data bag item itself succeeds" do
273
+ knife("download /data_bags/x/y.json").should_succeed <<~EOM
274
+ Created /data_bags
275
+ Created /data_bags/x
276
+ Created /data_bags/x/y.json
277
+ EOM
278
+ knife("diff --name-status /data_bags").should_succeed <<~EOM
279
+ D\t/data_bags/x/z.json
280
+ EOM
281
+ end
282
+
283
+ it "knife download /data_bags/x /data_bags/x/y.json downloads x once" do
284
+ knife("download /data_bags/x /data_bags/x/y.json").should_succeed <<~EOM
285
+ Created /data_bags
286
+ Created /data_bags/x
287
+ Created /data_bags/x/y.json
288
+ Created /data_bags/x/z.json
289
+ EOM
290
+ end
291
+ end
292
+ end
293
+
294
+ when_the_repository "has three data bag items" do
295
+ before do
296
+ file "data_bags/x/deleted.json", <<~EOM
297
+ {
298
+ "id": "deleted"
299
+ }
300
+ EOM
301
+ file "data_bags/x/modified.json", <<~EOM
302
+ {
303
+ "id": "modified"
304
+ }
305
+ EOM
306
+ file "data_bags/x/unmodified.json", <<~EOM
307
+ {
308
+ "id": "unmodified"
309
+ }
310
+ EOM
311
+ end
312
+
313
+ when_the_chef_server "has a modified, unmodified, added and deleted data bag item" do
314
+ before do
315
+ data_bag "x", {
316
+ "added" => {},
317
+ "modified" => { "foo" => "bar" },
318
+ "unmodified" => {},
319
+ }
320
+ end
321
+
322
+ it "knife download of the modified file succeeds" do
323
+ knife("download /data_bags/x/modified.json").should_succeed <<~EOM
324
+ Updated /data_bags/x/modified.json
325
+ EOM
326
+ knife("diff --name-status /data_bags").should_succeed <<~EOM
327
+ D\t/data_bags/x/added.json
328
+ A\t/data_bags/x/deleted.json
329
+ EOM
330
+ end
331
+ it "knife download of the unmodified file does nothing" do
332
+ knife("download /data_bags/x/unmodified.json").should_succeed ""
333
+ knife("diff --name-status /data_bags").should_succeed <<~EOM
334
+ D\t/data_bags/x/added.json
335
+ M\t/data_bags/x/modified.json
336
+ A\t/data_bags/x/deleted.json
337
+ EOM
338
+ end
339
+ it "knife download of the added file succeeds" do
340
+ knife("download /data_bags/x/added.json").should_succeed <<~EOM
341
+ Created /data_bags/x/added.json
342
+ EOM
343
+ knife("diff --name-status /data_bags").should_succeed <<~EOM
344
+ M\t/data_bags/x/modified.json
345
+ A\t/data_bags/x/deleted.json
346
+ EOM
347
+ end
348
+ it "knife download of the deleted file does nothing" do
349
+ knife("download /data_bags/x/deleted.json").should_succeed ""
350
+ knife("diff --name-status /data_bags").should_succeed <<~EOM
351
+ D\t/data_bags/x/added.json
352
+ M\t/data_bags/x/modified.json
353
+ A\t/data_bags/x/deleted.json
354
+ EOM
355
+ end
356
+ it "knife download --purge of the deleted file deletes it" do
357
+ knife("download --purge /data_bags/x/deleted.json").should_succeed <<~EOM
358
+ Deleted extra entry /data_bags/x/deleted.json (purge is on)
359
+ EOM
360
+ knife("diff --name-status /data_bags").should_succeed <<~EOM
361
+ D\t/data_bags/x/added.json
362
+ M\t/data_bags/x/modified.json
363
+ EOM
364
+ end
365
+ it "knife download of the entire data bag downloads everything" do
366
+ knife("download /data_bags/x").should_succeed <<~EOM
367
+ Created /data_bags/x/added.json
368
+ Updated /data_bags/x/modified.json
369
+ EOM
370
+ knife("diff --name-status /data_bags").should_succeed <<~EOM
371
+ A\t/data_bags/x/deleted.json
372
+ EOM
373
+ end
374
+ it "knife download --purge of the entire data bag downloads everything" do
375
+ knife("download --purge /data_bags/x").should_succeed <<~EOM
376
+ Created /data_bags/x/added.json
377
+ Updated /data_bags/x/modified.json
378
+ Deleted extra entry /data_bags/x/deleted.json (purge is on)
379
+ EOM
380
+ knife("diff --name-status /data_bags").should_succeed ""
381
+ end
382
+ context "when cwd is the /data_bags directory" do
383
+ before do
384
+ cwd "data_bags"
385
+ end
386
+ it "knife download fails" do
387
+ knife("download").should_fail "FATAL: You must specify at least one argument. If you want to download everything in this directory, run \"knife download .\"\n", stdout: /USAGE/
388
+ end
389
+ it "knife download --purge . downloads everything" do
390
+ knife("download --purge .").should_succeed <<~EOM
391
+ Created x/added.json
392
+ Updated x/modified.json
393
+ Deleted extra entry x/deleted.json (purge is on)
394
+ EOM
395
+ knife("diff --name-status /data_bags").should_succeed ""
396
+ end
397
+ it "knife download --purge * downloads everything" do
398
+ knife("download --purge *").should_succeed <<~EOM
399
+ Created x/added.json
400
+ Updated x/modified.json
401
+ Deleted extra entry x/deleted.json (purge is on)
402
+ EOM
403
+ knife("diff --name-status /data_bags").should_succeed ""
404
+ end
405
+ end
406
+ end
407
+ end
408
+
409
+ when_the_repository "has a cookbook" do
410
+ before do
411
+ file "cookbooks/x/metadata.rb", cb_metadata("x", "1.0.0")
412
+ file "cookbooks/x/z.rb", ""
413
+ end
414
+
415
+ when_the_chef_server "has a modified, added and deleted file for the cookbook" do
416
+ before do
417
+ cookbook "x", "1.0.0", { "metadata.rb" => cb_metadata("x", "1.0.0", "#extra content"), "y.rb" => "hi" }
418
+ end
419
+
420
+ it "knife download of a modified file succeeds" do
421
+ knife("download /cookbooks/x/metadata.rb").should_succeed "Updated /cookbooks/x/metadata.rb\n"
422
+ knife("diff --name-status /cookbooks").should_succeed <<~EOM
423
+ D\t/cookbooks/x/y.rb
424
+ A\t/cookbooks/x/z.rb
425
+ EOM
426
+ end
427
+ it "knife download of a deleted file does nothing" do
428
+ knife("download /cookbooks/x/z.rb").should_succeed ""
429
+ knife("diff --name-status /cookbooks").should_succeed <<~EOM
430
+ M\t/cookbooks/x/metadata.rb
431
+ D\t/cookbooks/x/y.rb
432
+ A\t/cookbooks/x/z.rb
433
+ EOM
434
+ end
435
+ it "knife download --purge of a deleted file succeeds" do
436
+ knife("download --purge /cookbooks/x/z.rb").should_succeed "Deleted extra entry /cookbooks/x/z.rb (purge is on)\n"
437
+ knife("diff --name-status /cookbooks").should_succeed <<~EOM
438
+ M\t/cookbooks/x/metadata.rb
439
+ D\t/cookbooks/x/y.rb
440
+ EOM
441
+ end
442
+ it "knife download of an added file succeeds" do
443
+ knife("download /cookbooks/x/y.rb").should_succeed "Created /cookbooks/x/y.rb\n"
444
+ knife("diff --name-status /cookbooks").should_succeed <<~EOM
445
+ M\t/cookbooks/x/metadata.rb
446
+ A\t/cookbooks/x/z.rb
447
+ EOM
448
+ end
449
+ it "knife download of the cookbook itself succeeds" do
450
+ knife("download /cookbooks/x").should_succeed <<~EOM
451
+ Updated /cookbooks/x/metadata.rb
452
+ Created /cookbooks/x/y.rb
453
+ EOM
454
+ knife("diff --name-status /cookbooks").should_succeed <<~EOM
455
+ A\t/cookbooks/x/z.rb
456
+ EOM
457
+ end
458
+ it "knife download --purge of the cookbook itself succeeds" do
459
+ knife("download --purge /cookbooks/x").should_succeed <<~EOM
460
+ Updated /cookbooks/x/metadata.rb
461
+ Created /cookbooks/x/y.rb
462
+ Deleted extra entry /cookbooks/x/z.rb (purge is on)
463
+ EOM
464
+ knife("diff --name-status /cookbooks").should_succeed ""
465
+ end
466
+ end
467
+ end
468
+
469
+ when_the_repository "has a cookbook" do
470
+ before do
471
+ file "cookbooks/x/metadata.rb", cb_metadata("x", "1.0.0")
472
+ file "cookbooks/x/onlyin1.0.0.rb", "old_text"
473
+ end
474
+
475
+ when_the_chef_server "has a later version for the cookbook" do
476
+ before do
477
+ cookbook "x", "1.0.0", { "onlyin1.0.0.rb" => "" }
478
+ cookbook "x", "1.0.1", { "onlyin1.0.1.rb" => "hi" }
479
+ end
480
+
481
+ it "knife download /cookbooks/x downloads the latest version" do
482
+ knife("download --purge /cookbooks/x").should_succeed <<~EOM
483
+ Updated /cookbooks/x/metadata.rb
484
+ Created /cookbooks/x/onlyin1.0.1.rb
485
+ Deleted extra entry /cookbooks/x/onlyin1.0.0.rb (purge is on)
486
+ EOM
487
+ knife("diff --name-status /cookbooks").should_succeed ""
488
+ end
489
+ end
490
+
491
+ when_the_chef_server "has an earlier version for the cookbook" do
492
+ before do
493
+ cookbook "x", "1.0.0", { "onlyin1.0.0.rb" => "" }
494
+ cookbook "x", "0.9.9", { "onlyin0.9.9.rb" => "hi" }
495
+ end
496
+
497
+ it "knife download /cookbooks/x downloads the updated file" do
498
+ knife("download --purge /cookbooks/x").should_succeed <<~EOM
499
+ Updated /cookbooks/x/onlyin1.0.0.rb
500
+ EOM
501
+ knife("diff --name-status /cookbooks").should_succeed ""
502
+ end
503
+ end
504
+
505
+ when_the_chef_server "has a later version for the cookbook, and no current version" do
506
+ before do
507
+ cookbook "x", "1.0.1", { "onlyin1.0.1.rb" => "hi" }
508
+ end
509
+
510
+ it "knife download /cookbooks/x downloads the latest version" do
511
+ knife("download --purge /cookbooks/x").should_succeed <<~EOM
512
+ Updated /cookbooks/x/metadata.rb
513
+ Created /cookbooks/x/onlyin1.0.1.rb
514
+ Deleted extra entry /cookbooks/x/onlyin1.0.0.rb (purge is on)
515
+ EOM
516
+ knife("diff --name-status /cookbooks").should_succeed ""
517
+ end
518
+ end
519
+
520
+ when_the_chef_server "has an earlier version for the cookbook, and no current version" do
521
+ before do
522
+ cookbook "x", "0.9.9", { "onlyin0.9.9.rb" => "hi" }
523
+ end
524
+
525
+ it "knife download /cookbooks/x downloads the old version" do
526
+ knife("download --purge /cookbooks/x").should_succeed <<~EOM
527
+ Updated /cookbooks/x/metadata.rb
528
+ Created /cookbooks/x/onlyin0.9.9.rb
529
+ Deleted extra entry /cookbooks/x/onlyin1.0.0.rb (purge is on)
530
+ EOM
531
+ knife("diff --name-status /cookbooks").should_succeed ""
532
+ end
533
+ end
534
+ end
535
+
536
+ when_the_chef_server "has a role" do
537
+ before do
538
+ role "x", {}
539
+ end
540
+ when_the_repository "has the role in ruby" do
541
+ before do
542
+ file "roles/x.rb", <<~EOM
543
+ name "x"
544
+ description "x"
545
+ EOM
546
+ end
547
+
548
+ it "knife download refuses to change the role" do
549
+ knife("download /roles/x.json").should_succeed "", stderr: "WARNING: /roles/x.rb cannot be updated (can't safely update ruby files).\n"
550
+ knife("diff --name-status /roles/x.json").should_succeed "M\t/roles/x.rb\n"
551
+ end
552
+ end
553
+ end
554
+
555
+ when_the_chef_server "has an environment" do
556
+ before do
557
+ environment "x", {}
558
+ end
559
+ when_the_repository "has an environment with bad JSON" do
560
+ before do
561
+ file "environments/x.json", "{"
562
+ end
563
+ it "knife download succeeds" do
564
+ warning = <<~EOH
565
+ WARN: Parse error reading #{path_to("environments/x.json")} as JSON: parse error: premature EOF
566
+ {
567
+ (right here) ------^
568
+
569
+ EOH
570
+ knife("download /environments/x.json").should_succeed "Updated /environments/x.json\n", stderr: warning
571
+ knife("diff --name-status /environments/x.json").should_succeed ""
572
+ end
573
+ end
574
+
575
+ when_the_repository "has the same environment with the wrong name in the file" do
576
+ before do
577
+ file "environments/x.json", { "name" => "y" }
578
+ end
579
+ it "knife download succeeds" do
580
+ knife("download /environments/x.json").should_succeed "Updated /environments/x.json\n"
581
+ knife("diff --name-status /environments/x.json").should_succeed ""
582
+ end
583
+ end
584
+
585
+ when_the_repository "has the same environment with no name in the file" do
586
+ before do
587
+ file "environments/x.json", { "description" => "hi" }
588
+ end
589
+ it "knife download succeeds" do
590
+ knife("download /environments/x.json").should_succeed "Updated /environments/x.json\n"
591
+ knife("diff --name-status /environments/x.json").should_succeed ""
592
+ end
593
+ end
594
+ end
595
+ end # without versioned cookbooks
596
+
597
+ context "with versioned cookbooks" do
598
+ before { Chef::Config[:versioned_cookbooks] = true }
599
+
600
+ when_the_chef_server "has one of each thing" do
601
+ before do
602
+ client "x", {}
603
+ cookbook "x", "1.0.0"
604
+ data_bag "x", { "y" => {} }
605
+ environment "x", {}
606
+ node "x", {}
607
+ role "x", {}
608
+ user "x", {}
609
+ end
610
+
611
+ when_the_repository "has only top-level directories" do
612
+ before do
613
+ directory "clients"
614
+ directory "cookbooks"
615
+ directory "data_bags"
616
+ directory "environments"
617
+ directory "nodes"
618
+ directory "roles"
619
+ directory "users"
620
+ end
621
+
622
+ it "knife download downloads everything" do
623
+ knife("download /").should_succeed <<~EOM
624
+ Created /clients/chef-validator.json
625
+ Created /clients/chef-webui.json
626
+ Created /clients/x.json
627
+ Created /cookbooks/x-1.0.0
628
+ Created /cookbooks/x-1.0.0/metadata.rb
629
+ Created /data_bags/x
630
+ Created /data_bags/x/y.json
631
+ Created /environments/_default.json
632
+ Created /environments/x.json
633
+ Created /nodes/x.json
634
+ Created /roles/x.json
635
+ Created /users/admin.json
636
+ Created /users/x.json
637
+ EOM
638
+ knife("diff --name-status /").should_succeed ""
639
+ end
640
+ end
641
+
642
+ when_the_repository "has an identical copy of each thing" do
643
+ before do
644
+ file "clients/chef-validator.json", { "validator" => true, "public_key" => ChefZero::PUBLIC_KEY }
645
+ file "clients/chef-webui.json", { "admin" => true, "public_key" => ChefZero::PUBLIC_KEY }
646
+ file "clients/x.json", { "public_key" => ChefZero::PUBLIC_KEY }
647
+ file "cookbooks/x-1.0.0/metadata.rb", cb_metadata("x", "1.0.0")
648
+ file "data_bags/x/y.json", {}
649
+ file "environments/_default.json", { "description" => "The default Chef environment" }
650
+ file "environments/x.json", {}
651
+ file "nodes/x.json", { "normal" => { "tags" => [] } }
652
+ file "roles/x.json", {}
653
+ file "users/admin.json", { "admin" => true, "public_key" => ChefZero::PUBLIC_KEY }
654
+ file "users/x.json", { "public_key" => ChefZero::PUBLIC_KEY }
655
+ end
656
+
657
+ it "knife download makes no changes" do
658
+ knife("download /").should_succeed ""
659
+ knife("diff --name-status /").should_succeed ""
660
+ end
661
+
662
+ it "knife download --purge makes no changes" do
663
+ knife("download --purge /").should_succeed ""
664
+ knife("diff --name-status /").should_succeed ""
665
+ end
666
+
667
+ context "except the role file" do
668
+ before do
669
+ file "roles/x.json", { "description" => "blarghle" }
670
+ end
671
+
672
+ it "knife download changes the role" do
673
+ knife("download /").should_succeed "Updated /roles/x.json\n"
674
+ knife("diff --name-status /").should_succeed ""
675
+ end
676
+ end
677
+
678
+ context "except the role file is textually different, but not ACTUALLY different" do
679
+ before do
680
+ file "roles/x.json", <<~EOM
681
+ {
682
+ "chef_type": "role" ,
683
+ "default_attributes": {
684
+ },
685
+ "env_run_lists": {
686
+ },
687
+ "json_class": "Chef::Role",
688
+ "name": "x",
689
+ "description": "",
690
+ "override_attributes": {
691
+ },
692
+ "run_list": [
693
+
694
+ ]
695
+ }
696
+ EOM
697
+ end
698
+
699
+ it "knife download / does not change anything" do
700
+ knife("download /").should_succeed ""
701
+ knife("diff --name-status /").should_succeed ""
702
+ end
703
+ end
704
+
705
+ context "as well as one extra copy of each thing" do
706
+ before do
707
+ file "clients/y.json", { "public_key" => ChefZero::PUBLIC_KEY }
708
+ file "cookbooks/x-1.0.0/blah.rb", ""
709
+ file "cookbooks/x-2.0.0/metadata.rb", 'version "2.0.0"'
710
+ file "cookbooks/y-1.0.0/metadata.rb", 'version "1.0.0"'
711
+ file "data_bags/x/z.json", {}
712
+ file "data_bags/y/zz.json", {}
713
+ file "environments/y.json", {}
714
+ file "nodes/y.json", {}
715
+ file "roles/y.json", {}
716
+ file "users/y.json", { "public_key" => ChefZero::PUBLIC_KEY }
717
+ end
718
+
719
+ it "knife download does nothing" do
720
+ knife("download /").should_succeed ""
721
+ knife("diff --name-status /").should_succeed <<~EOM
722
+ A\t/clients/y.json
723
+ A\t/cookbooks/x-1.0.0/blah.rb
724
+ A\t/cookbooks/x-2.0.0
725
+ A\t/cookbooks/y-1.0.0
726
+ A\t/data_bags/x/z.json
727
+ A\t/data_bags/y
728
+ A\t/environments/y.json
729
+ A\t/nodes/y.json
730
+ A\t/roles/y.json
731
+ A\t/users/y.json
732
+ EOM
733
+ end
734
+
735
+ it "knife download --purge deletes the extra files" do
736
+ knife("download --purge /").should_succeed <<~EOM
737
+ Deleted extra entry /clients/y.json (purge is on)
738
+ Deleted extra entry /cookbooks/x-1.0.0/blah.rb (purge is on)
739
+ Deleted extra entry /cookbooks/x-2.0.0 (purge is on)
740
+ Deleted extra entry /cookbooks/y-1.0.0 (purge is on)
741
+ Deleted extra entry /data_bags/x/z.json (purge is on)
742
+ Deleted extra entry /data_bags/y (purge is on)
743
+ Deleted extra entry /environments/y.json (purge is on)
744
+ Deleted extra entry /nodes/y.json (purge is on)
745
+ Deleted extra entry /roles/y.json (purge is on)
746
+ Deleted extra entry /users/y.json (purge is on)
747
+ EOM
748
+ knife("diff --name-status /").should_succeed ""
749
+ end
750
+ end
751
+ end
752
+
753
+ when_the_repository "is empty" do
754
+ it "knife download creates the extra files" do
755
+ knife("download /").should_succeed <<~EOM
756
+ Created /clients
757
+ Created /clients/chef-validator.json
758
+ Created /clients/chef-webui.json
759
+ Created /clients/x.json
760
+ Created /cookbooks
761
+ Created /cookbooks/x-1.0.0
762
+ Created /cookbooks/x-1.0.0/metadata.rb
763
+ Created /data_bags
764
+ Created /data_bags/x
765
+ Created /data_bags/x/y.json
766
+ Created /environments
767
+ Created /environments/_default.json
768
+ Created /environments/x.json
769
+ Created /nodes
770
+ Created /nodes/x.json
771
+ Created /roles
772
+ Created /roles/x.json
773
+ Created /users
774
+ Created /users/admin.json
775
+ Created /users/x.json
776
+ EOM
777
+ knife("diff --name-status /").should_succeed ""
778
+ end
779
+
780
+ context "when current directory is top level" do
781
+ before do
782
+ cwd "."
783
+ end
784
+ it "knife download with no parameters reports an error" do
785
+ knife("download").should_fail "FATAL: You must specify at least one argument. If you want to download everything in this directory, run \"knife download .\"\n", stdout: /USAGE/
786
+ end
787
+ end
788
+ end
789
+ end
790
+
791
+ # Test download of an item when the other end doesn't even have the container
792
+ when_the_repository "is empty" do
793
+ when_the_chef_server "has two data bag items" do
794
+ before do
795
+ data_bag "x", { "y" => {}, "z" => {} }
796
+ end
797
+
798
+ it "knife download of one data bag item itself succeeds" do
799
+ knife("download /data_bags/x/y.json").should_succeed <<~EOM
800
+ Created /data_bags
801
+ Created /data_bags/x
802
+ Created /data_bags/x/y.json
803
+ EOM
804
+ knife("diff --name-status /data_bags").should_succeed <<~EOM
805
+ D\t/data_bags/x/z.json
806
+ EOM
807
+ end
808
+ end
809
+ end
810
+
811
+ when_the_repository "has three data bag items" do
812
+ before do
813
+ file "data_bags/x/deleted.json", <<~EOM
814
+ {
815
+ "id": "deleted"
816
+ }
817
+ EOM
818
+ file "data_bags/x/modified.json", <<~EOM
819
+ {
820
+ "id": "modified"
821
+ }
822
+ EOM
823
+ file "data_bags/x/unmodified.json", <<~EOM
824
+ {
825
+ "id": "unmodified"
826
+ }
827
+ EOM
828
+ end
829
+
830
+ when_the_chef_server "has a modified, unmodified, added and deleted data bag item" do
831
+ before do
832
+ data_bag "x", {
833
+ "added" => {},
834
+ "modified" => { "foo" => "bar" },
835
+ "unmodified" => {},
836
+ }
837
+ end
838
+
839
+ it "knife download of the modified file succeeds" do
840
+ knife("download /data_bags/x/modified.json").should_succeed <<~EOM
841
+ Updated /data_bags/x/modified.json
842
+ EOM
843
+ knife("diff --name-status /data_bags").should_succeed <<~EOM
844
+ D\t/data_bags/x/added.json
845
+ A\t/data_bags/x/deleted.json
846
+ EOM
847
+ end
848
+ it "knife download of the unmodified file does nothing" do
849
+ knife("download /data_bags/x/unmodified.json").should_succeed ""
850
+ knife("diff --name-status /data_bags").should_succeed <<~EOM
851
+ D\t/data_bags/x/added.json
852
+ M\t/data_bags/x/modified.json
853
+ A\t/data_bags/x/deleted.json
854
+ EOM
855
+ end
856
+ it "knife download of the added file succeeds" do
857
+ knife("download /data_bags/x/added.json").should_succeed <<~EOM
858
+ Created /data_bags/x/added.json
859
+ EOM
860
+ knife("diff --name-status /data_bags").should_succeed <<~EOM
861
+ M\t/data_bags/x/modified.json
862
+ A\t/data_bags/x/deleted.json
863
+ EOM
864
+ end
865
+ it "knife download of the deleted file does nothing" do
866
+ knife("download /data_bags/x/deleted.json").should_succeed ""
867
+ knife("diff --name-status /data_bags").should_succeed <<~EOM
868
+ D\t/data_bags/x/added.json
869
+ M\t/data_bags/x/modified.json
870
+ A\t/data_bags/x/deleted.json
871
+ EOM
872
+ end
873
+ it "knife download --purge of the deleted file deletes it" do
874
+ knife("download --purge /data_bags/x/deleted.json").should_succeed <<~EOM
875
+ Deleted extra entry /data_bags/x/deleted.json (purge is on)
876
+ EOM
877
+ knife("diff --name-status /data_bags").should_succeed <<~EOM
878
+ D\t/data_bags/x/added.json
879
+ M\t/data_bags/x/modified.json
880
+ EOM
881
+ end
882
+ it "knife download of the entire data bag downloads everything" do
883
+ knife("download /data_bags/x").should_succeed <<~EOM
884
+ Created /data_bags/x/added.json
885
+ Updated /data_bags/x/modified.json
886
+ EOM
887
+ knife("diff --name-status /data_bags").should_succeed <<~EOM
888
+ A\t/data_bags/x/deleted.json
889
+ EOM
890
+ end
891
+ it "knife download --purge of the entire data bag downloads everything" do
892
+ knife("download --purge /data_bags/x").should_succeed <<~EOM
893
+ Created /data_bags/x/added.json
894
+ Updated /data_bags/x/modified.json
895
+ Deleted extra entry /data_bags/x/deleted.json (purge is on)
896
+ EOM
897
+ knife("diff --name-status /data_bags").should_succeed ""
898
+ end
899
+ context "when cwd is the /data_bags directory" do
900
+ before do
901
+ cwd "data_bags"
902
+ end
903
+ it "knife download fails" do
904
+ knife("download").should_fail "FATAL: You must specify at least one argument. If you want to download everything in this directory, run \"knife download .\"\n", stdout: /USAGE/
905
+ end
906
+ it "knife download --purge . downloads everything" do
907
+ knife("download --purge .").should_succeed <<~EOM
908
+ Created x/added.json
909
+ Updated x/modified.json
910
+ Deleted extra entry x/deleted.json (purge is on)
911
+ EOM
912
+ knife("diff --name-status /data_bags").should_succeed ""
913
+ end
914
+ it "knife download --purge * downloads everything" do
915
+ knife("download --purge *").should_succeed <<~EOM
916
+ Created x/added.json
917
+ Updated x/modified.json
918
+ Deleted extra entry x/deleted.json (purge is on)
919
+ EOM
920
+ knife("diff --name-status /data_bags").should_succeed ""
921
+ end
922
+ end
923
+ end
924
+ end
925
+
926
+ when_the_repository "has a cookbook" do
927
+ before do
928
+ file "cookbooks/x-1.0.0/metadata.rb", 'name "x"; version "1.0.0"#unmodified'
929
+ file "cookbooks/x-1.0.0/z.rb", ""
930
+ end
931
+
932
+ when_the_chef_server "has a modified, added and deleted file for the cookbook" do
933
+ before do
934
+ cookbook "x", "1.0.0", { "y.rb" => "hi" }
935
+ end
936
+
937
+ it "knife download of a modified file succeeds" do
938
+ knife("download /cookbooks/x-1.0.0/metadata.rb").should_succeed "Updated /cookbooks/x-1.0.0/metadata.rb\n"
939
+ knife("diff --name-status /cookbooks").should_succeed <<~EOM
940
+ D\t/cookbooks/x-1.0.0/y.rb
941
+ A\t/cookbooks/x-1.0.0/z.rb
942
+ EOM
943
+ end
944
+ it "knife download of a deleted file does nothing" do
945
+ knife("download /cookbooks/x-1.0.0/z.rb").should_succeed ""
946
+ knife("diff --name-status /cookbooks").should_succeed <<~EOM
947
+ M\t/cookbooks/x-1.0.0/metadata.rb
948
+ D\t/cookbooks/x-1.0.0/y.rb
949
+ A\t/cookbooks/x-1.0.0/z.rb
950
+ EOM
951
+ end
952
+ it "knife download --purge of a deleted file succeeds" do
953
+ knife("download --purge /cookbooks/x-1.0.0/z.rb").should_succeed "Deleted extra entry /cookbooks/x-1.0.0/z.rb (purge is on)\n"
954
+ knife("diff --name-status /cookbooks").should_succeed <<~EOM
955
+ M\t/cookbooks/x-1.0.0/metadata.rb
956
+ D\t/cookbooks/x-1.0.0/y.rb
957
+ EOM
958
+ end
959
+ it "knife download of an added file succeeds" do
960
+ knife("download /cookbooks/x-1.0.0/y.rb").should_succeed "Created /cookbooks/x-1.0.0/y.rb\n"
961
+ knife("diff --name-status /cookbooks").should_succeed <<~EOM
962
+ M\t/cookbooks/x-1.0.0/metadata.rb
963
+ A\t/cookbooks/x-1.0.0/z.rb
964
+ EOM
965
+ end
966
+ it "knife download of the cookbook itself succeeds" do
967
+ knife("download /cookbooks/x-1.0.0").should_succeed <<~EOM
968
+ Updated /cookbooks/x-1.0.0/metadata.rb
969
+ Created /cookbooks/x-1.0.0/y.rb
970
+ EOM
971
+ knife("diff --name-status /cookbooks").should_succeed <<~EOM
972
+ A\t/cookbooks/x-1.0.0/z.rb
973
+ EOM
974
+ end
975
+ it "knife download --purge of the cookbook itself succeeds" do
976
+ knife("download --purge /cookbooks/x-1.0.0").should_succeed <<~EOM
977
+ Updated /cookbooks/x-1.0.0/metadata.rb
978
+ Created /cookbooks/x-1.0.0/y.rb
979
+ Deleted extra entry /cookbooks/x-1.0.0/z.rb (purge is on)
980
+ EOM
981
+ knife("diff --name-status /cookbooks").should_succeed ""
982
+ end
983
+ end
984
+ end
985
+
986
+ when_the_repository "has a cookbook" do
987
+ before do
988
+ file "cookbooks/x-1.0.0/metadata.rb", cb_metadata("x", "1.0.0")
989
+ file "cookbooks/x-1.0.0/onlyin1.0.0.rb", "old_text"
990
+ end
991
+
992
+ when_the_chef_server "has a later version for the cookbook" do
993
+ before do
994
+ cookbook "x", "1.0.0", { "onlyin1.0.0.rb" => "" }
995
+ cookbook "x", "1.0.1", { "onlyin1.0.1.rb" => "hi" }
996
+ end
997
+
998
+ it "knife download /cookbooks/x downloads the latest version" do
999
+ knife("download --purge /cookbooks").should_succeed <<~EOM
1000
+ Updated /cookbooks/x-1.0.0/onlyin1.0.0.rb
1001
+ Created /cookbooks/x-1.0.1
1002
+ Created /cookbooks/x-1.0.1/metadata.rb
1003
+ Created /cookbooks/x-1.0.1/onlyin1.0.1.rb
1004
+ EOM
1005
+ knife("diff --name-status /cookbooks").should_succeed ""
1006
+ end
1007
+ end
1008
+
1009
+ when_the_chef_server "has an earlier version for the cookbook" do
1010
+ before do
1011
+ cookbook "x", "1.0.0", { "onlyin1.0.0.rb" => "" }
1012
+ cookbook "x", "0.9.9", { "onlyin0.9.9.rb" => "hi" }
1013
+ end
1014
+
1015
+ it "knife download /cookbooks downloads the updated file" do
1016
+ knife("download --purge /cookbooks").should_succeed <<~EOM
1017
+ Created /cookbooks/x-0.9.9
1018
+ Created /cookbooks/x-0.9.9/metadata.rb
1019
+ Created /cookbooks/x-0.9.9/onlyin0.9.9.rb
1020
+ Updated /cookbooks/x-1.0.0/onlyin1.0.0.rb
1021
+ EOM
1022
+ knife("diff --name-status /cookbooks").should_succeed ""
1023
+ end
1024
+ end
1025
+
1026
+ when_the_chef_server "has a later version for the cookbook, and no current version" do
1027
+ before do
1028
+ cookbook "x", "1.0.1", { "onlyin1.0.1.rb" => "hi" }
1029
+ end
1030
+
1031
+ it "knife download /cookbooks/x downloads the latest version" do
1032
+ knife("download --purge /cookbooks").should_succeed <<~EOM
1033
+ Created /cookbooks/x-1.0.1
1034
+ Created /cookbooks/x-1.0.1/metadata.rb
1035
+ Created /cookbooks/x-1.0.1/onlyin1.0.1.rb
1036
+ Deleted extra entry /cookbooks/x-1.0.0 (purge is on)
1037
+ EOM
1038
+ knife("diff --name-status /cookbooks").should_succeed ""
1039
+ end
1040
+ end
1041
+
1042
+ when_the_chef_server "has an earlier version for the cookbook, and no current version" do
1043
+ before do
1044
+ cookbook "x", "0.9.9", { "onlyin0.9.9.rb" => "hi" }
1045
+ end
1046
+
1047
+ it "knife download --purge /cookbooks downloads the old version and deletes the new version" do
1048
+ knife("download --purge /cookbooks").should_succeed <<~EOM
1049
+ Created /cookbooks/x-0.9.9
1050
+ Created /cookbooks/x-0.9.9/metadata.rb
1051
+ Created /cookbooks/x-0.9.9/onlyin0.9.9.rb
1052
+ Deleted extra entry /cookbooks/x-1.0.0 (purge is on)
1053
+ EOM
1054
+ knife("diff --name-status /cookbooks").should_succeed ""
1055
+ end
1056
+ end
1057
+ end
1058
+
1059
+ when_the_chef_server "has an environment" do
1060
+ before do
1061
+ environment "x", {}
1062
+ end
1063
+
1064
+ when_the_repository "has the same environment with the wrong name in the file" do
1065
+ before do
1066
+ file "environments/x.json", { "name" => "y" }
1067
+ end
1068
+
1069
+ it "knife download succeeds" do
1070
+ knife("download /environments/x.json").should_succeed "Updated /environments/x.json\n"
1071
+ knife("diff --name-status /environments/x.json").should_succeed ""
1072
+ end
1073
+ end
1074
+
1075
+ when_the_repository "has the same environment with no name in the file" do
1076
+ before do
1077
+ file "environments/x.json", { "description" => "hi" }
1078
+ end
1079
+
1080
+ it "knife download succeeds" do
1081
+ knife("download /environments/x.json").should_succeed "Updated /environments/x.json\n"
1082
+ knife("diff --name-status /environments/x.json").should_succeed ""
1083
+ end
1084
+ end
1085
+ end
1086
+ end # with versioned cookbooks
1087
+
1088
+ when_the_chef_server "has a cookbook" do
1089
+ before do
1090
+ cookbook "x", "1.0.0"
1091
+ end
1092
+
1093
+ when_the_repository "is empty" do
1094
+ it "knife download /cookbooks/x signs all requests" do
1095
+
1096
+ # Check that BasicClient.request() always gets called with X-OPS-USERID
1097
+ original_new = Chef::HTTP::BasicClient.method(:new)
1098
+ expect(Chef::HTTP::BasicClient).to receive(:new) { |args|
1099
+ new_result = original_new.call(*args)
1100
+ original_request = new_result.method(:request)
1101
+ expect(new_result).to receive(:request) { |method, url, body, headers, &response_handler|
1102
+ expect(headers["X-OPS-USERID"]).not_to be_nil
1103
+ original_request.call(method, url, body, headers, &response_handler)
1104
+ }.at_least(:once)
1105
+ new_result
1106
+ }.at_least(:once)
1107
+
1108
+ knife("download /cookbooks/x").should_succeed <<~EOM
1109
+ Created /cookbooks
1110
+ Created /cookbooks/x
1111
+ Created /cookbooks/x/metadata.rb
1112
+ EOM
1113
+ end
1114
+ end
1115
+ end
1116
+
1117
+ when_the_chef_server "is in Enterprise mode", osc_compat: false, single_org: false do
1118
+ before do
1119
+ user "foo", {}
1120
+ user "bar", {}
1121
+ user "foobar", {}
1122
+ organization "foo", { "full_name" => "Something" }
1123
+ end
1124
+
1125
+ before :each do
1126
+ Chef::Config.chef_server_url = URI.join(Chef::Config.chef_server_url, "/organizations/foo")
1127
+ end
1128
+
1129
+ when_the_repository "has all the default stuff" do
1130
+ before do
1131
+ knife("download /").should_succeed <<~EOM
1132
+ Created /acls
1133
+ Created /acls/clients
1134
+ Created /acls/clients/foo-validator.json
1135
+ Created /acls/containers
1136
+ Created /acls/containers/clients.json
1137
+ Created /acls/containers/containers.json
1138
+ Created /acls/containers/cookbook_artifacts.json
1139
+ Created /acls/containers/cookbooks.json
1140
+ Created /acls/containers/data.json
1141
+ Created /acls/containers/environments.json
1142
+ Created /acls/containers/groups.json
1143
+ Created /acls/containers/nodes.json
1144
+ Created /acls/containers/policies.json
1145
+ Created /acls/containers/policy_groups.json
1146
+ Created /acls/containers/roles.json
1147
+ Created /acls/containers/sandboxes.json
1148
+ Created /acls/cookbook_artifacts
1149
+ Created /acls/cookbooks
1150
+ Created /acls/data_bags
1151
+ Created /acls/environments
1152
+ Created /acls/environments/_default.json
1153
+ Created /acls/groups
1154
+ Created /acls/groups/admins.json
1155
+ Created /acls/groups/billing-admins.json
1156
+ Created /acls/groups/clients.json
1157
+ Created /acls/groups/users.json
1158
+ Created /acls/nodes
1159
+ Created /acls/policies
1160
+ Created /acls/policy_groups
1161
+ Created /acls/roles
1162
+ Created /acls/organization.json
1163
+ Created /clients
1164
+ Created /clients/foo-validator.json
1165
+ Created /containers
1166
+ Created /containers/clients.json
1167
+ Created /containers/containers.json
1168
+ Created /containers/cookbook_artifacts.json
1169
+ Created /containers/cookbooks.json
1170
+ Created /containers/data.json
1171
+ Created /containers/environments.json
1172
+ Created /containers/groups.json
1173
+ Created /containers/nodes.json
1174
+ Created /containers/policies.json
1175
+ Created /containers/policy_groups.json
1176
+ Created /containers/roles.json
1177
+ Created /containers/sandboxes.json
1178
+ Created /cookbook_artifacts
1179
+ Created /cookbooks
1180
+ Created /data_bags
1181
+ Created /environments
1182
+ Created /environments/_default.json
1183
+ Created /groups
1184
+ Created /groups/admins.json
1185
+ Created /groups/billing-admins.json
1186
+ Created /groups/clients.json
1187
+ Created /groups/users.json
1188
+ Created /invitations.json
1189
+ Created /members.json
1190
+ Created /nodes
1191
+ Created /org.json
1192
+ Created /policies
1193
+ Created /policy_groups
1194
+ Created /roles
1195
+ EOM
1196
+ end
1197
+
1198
+ context "and the server has one of each thing" do
1199
+ before do
1200
+ # acl_for %w(organizations foo groups blah)
1201
+ client "x", {}
1202
+ cookbook "x", "1.0.0"
1203
+ cookbook_artifact "x", "1x1", { "metadata.rb" => cb_metadata("x", "1.0.0") }
1204
+ container "x", {}
1205
+ data_bag "x", { "y" => {} }
1206
+ environment "x", {}
1207
+ group "x", {}
1208
+ org_invite "foo"
1209
+ org_member "bar"
1210
+ node "x", {}
1211
+ policy "x", "1.0.0", {}
1212
+ policy "blah", "1.0.0", {}
1213
+ policy_group "x", {
1214
+ "policies" => {
1215
+ "x" => { "revision_id" => "1.0.0" },
1216
+ "blah" => { "revision_id" => "1.0.0" },
1217
+ },
1218
+ }
1219
+ role "x", {}
1220
+ end
1221
+
1222
+ before do
1223
+ knife("download /acls /groups/clients.json /groups/users.json").should_succeed <<~EOM
1224
+ Created /acls/clients/x.json
1225
+ Created /acls/containers/x.json
1226
+ Created /acls/cookbook_artifacts/x.json
1227
+ Created /acls/cookbooks/x.json
1228
+ Created /acls/data_bags/x.json
1229
+ Created /acls/environments/x.json
1230
+ Created /acls/groups/x.json
1231
+ Created /acls/nodes/x.json
1232
+ Created /acls/policies/blah.json
1233
+ Created /acls/policies/x.json
1234
+ Created /acls/policy_groups/x.json
1235
+ Created /acls/roles/x.json
1236
+ Updated /groups/clients.json
1237
+ Updated /groups/users.json
1238
+ EOM
1239
+ end
1240
+
1241
+ it "knife download / downloads everything" do
1242
+ knife("download /").should_succeed <<~EOM
1243
+ Created /clients/x.json
1244
+ Created /containers/x.json
1245
+ Created /cookbook_artifacts/x-1x1
1246
+ Created /cookbook_artifacts/x-1x1/metadata.rb
1247
+ Created /cookbooks/x
1248
+ Created /cookbooks/x/metadata.rb
1249
+ Created /data_bags/x
1250
+ Created /data_bags/x/y.json
1251
+ Created /environments/x.json
1252
+ Created /groups/x.json
1253
+ Updated /invitations.json
1254
+ Updated /members.json
1255
+ Created /nodes/x.json
1256
+ Created /policies/blah-1.0.0.json
1257
+ Created /policies/x-1.0.0.json
1258
+ Created /policy_groups/x.json
1259
+ Created /roles/x.json
1260
+ EOM
1261
+ knife("diff --name-status /").should_succeed ""
1262
+ end
1263
+
1264
+ context "and the repository has an identical copy of each thing" do
1265
+ before do
1266
+ # TODO We have to upload acls for an existing group due to a lack of
1267
+ # dependency detection during upload. Fix that!
1268
+ file "clients/x.json", { "public_key" => ChefZero::PUBLIC_KEY }
1269
+ file "containers/x.json", {}
1270
+ file "cookbooks/x/metadata.rb", cb_metadata("x", "1.0.0")
1271
+ file "cookbook_artifacts/x-1x1/metadata.rb", cb_metadata("x", "1.0.0")
1272
+ file "data_bags/x/y.json", {}
1273
+ file "environments/x.json", {}
1274
+ file "groups/x.json", {}
1275
+ file "invitations.json", [ "foo" ]
1276
+ file "members.json", [ "bar" ]
1277
+ file "nodes/x.json", { "normal" => { "tags" => [] } }
1278
+ file "org.json", { "full_name" => "Something" }
1279
+ file "policies/x-1.0.0.json", { "policy_group_list" => [ "x" ] }
1280
+ file "policies/blah-1.0.0.json", { "policy_group_list" => [ "x" ] }
1281
+ file "policy_groups/x.json", { "policies" => { "x" => { "revision_id" => "1.0.0" }, "blah" => { "revision_id" => "1.0.0" } } }
1282
+ file "roles/x.json", {}
1283
+ end
1284
+
1285
+ it "knife download makes no changes" do
1286
+ knife("download /").should_succeed ""
1287
+ end
1288
+ end
1289
+
1290
+ context "and the repository has a slightly different copy of each thing" do
1291
+ before do
1292
+ # acl_for %w(organizations foo groups blah)
1293
+ file "clients/x.json", { "validator" => true }
1294
+ file "containers/x.json", {}
1295
+ file "cookbooks/x/metadata.rb", cb_metadata("x", "1.0.1")
1296
+ file "cookbook_artifacts/x-1x1/metadata.rb", cb_metadata("x", "1.0.1")
1297
+ file "data_bags/x/y.json", { "a" => "b" }
1298
+ file "environments/x.json", { "description" => "foo" }
1299
+ file "groups/x.json", { "description" => "foo" }
1300
+ file "groups/x.json", { "groups" => [ "admin" ] }
1301
+ file "nodes/x.json", { "normal" => { "tags" => [] }, "run_list" => [ "blah" ] }
1302
+ file "org.json", { "full_name" => "Something Else " }
1303
+ file "policies/x-1.0.0.json", { "run_list" => [ "blah" ] }
1304
+ file "policy_groups/x.json", {
1305
+ "policies" => {
1306
+ "x" => { "revision_id" => "1.0.1" },
1307
+ "y" => { "revision_id" => "1.0.0" },
1308
+ },
1309
+ }
1310
+ file "roles/x.json", { "run_list" => [ "blah" ] }
1311
+ end
1312
+
1313
+ it "knife download updates everything" do
1314
+ knife("download /").should_succeed <<~EOM
1315
+ Updated /clients/x.json
1316
+ Updated /cookbook_artifacts/x-1x1/metadata.rb
1317
+ Updated /cookbooks/x/metadata.rb
1318
+ Updated /data_bags/x/y.json
1319
+ Updated /environments/x.json
1320
+ Updated /groups/x.json
1321
+ Updated /invitations.json
1322
+ Updated /members.json
1323
+ Updated /nodes/x.json
1324
+ Updated /org.json
1325
+ Created /policies/blah-1.0.0.json
1326
+ Updated /policies/x-1.0.0.json
1327
+ Updated /policy_groups/x.json
1328
+ Updated /roles/x.json
1329
+ EOM
1330
+ knife("diff --name-status /").should_succeed ""
1331
+ end
1332
+ end
1333
+ end
1334
+ end
1335
+ end
1336
+ end