chef-dk 3.0.36 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (377) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +124 -126
  3. data/Gemfile.lock +815 -812
  4. data/LICENSE +201 -201
  5. data/README.md +333 -333
  6. data/Rakefile +74 -74
  7. data/acceptance/.shared/kitchen_acceptance/.kitchen.digitalocean.yml +27 -27
  8. data/acceptance/.shared/kitchen_acceptance/.kitchen.ec2.yml +287 -287
  9. data/acceptance/.shared/kitchen_acceptance/.kitchen.vagrant.yml +52 -52
  10. data/acceptance/.shared/kitchen_acceptance/libraries/kitchen.rb +51 -51
  11. data/acceptance/.shared/kitchen_acceptance/metadata.rb +1 -1
  12. data/acceptance/Gemfile +21 -21
  13. data/acceptance/Gemfile.lock +334 -334
  14. data/acceptance/README.md +132 -132
  15. data/acceptance/trivial/.acceptance/acceptance-cookbook/.gitignore +2 -2
  16. data/acceptance/trivial/.acceptance/acceptance-cookbook/metadata.rb +2 -2
  17. data/acceptance/trivial/.acceptance/acceptance-cookbook/recipes/destroy.rb +1 -1
  18. data/acceptance/trivial/.acceptance/acceptance-cookbook/recipes/provision.rb +1 -1
  19. data/acceptance/trivial/.acceptance/acceptance-cookbook/recipes/verify.rb +1 -1
  20. data/acceptance/trivial/.kitchen.yml +7 -7
  21. data/acceptance/trivial/test/integration/chefdk-current-install/inspec/chef_client_spec.rb +5 -5
  22. data/bin/chef +25 -25
  23. data/chef-dk.gemspec +60 -60
  24. data/lib/chef-dk.rb +19 -19
  25. data/lib/chef-dk/authenticated_http.rb +22 -22
  26. data/lib/chef-dk/builtin_commands.rb +59 -59
  27. data/lib/chef-dk/chef_runner.rb +114 -114
  28. data/lib/chef-dk/chef_server_api_multi.rb +73 -73
  29. data/lib/chef-dk/cli.rb +201 -201
  30. data/lib/chef-dk/command/base.rb +79 -79
  31. data/lib/chef-dk/command/clean_policy_cookbooks.rb +114 -114
  32. data/lib/chef-dk/command/clean_policy_revisions.rb +111 -111
  33. data/lib/chef-dk/command/delete_policy.rb +120 -120
  34. data/lib/chef-dk/command/delete_policy_group.rb +120 -120
  35. data/lib/chef-dk/command/diff.rb +315 -315
  36. data/lib/chef-dk/command/env.rb +89 -89
  37. data/lib/chef-dk/command/exec.rb +44 -44
  38. data/lib/chef-dk/command/export.rb +155 -155
  39. data/lib/chef-dk/command/gem.rb +47 -47
  40. data/lib/chef-dk/command/generate.rb +125 -125
  41. data/lib/chef-dk/command/generator_commands.rb +83 -83
  42. data/lib/chef-dk/command/generator_commands/app.rb +106 -106
  43. data/lib/chef-dk/command/generator_commands/attribute.rb +36 -36
  44. data/lib/chef-dk/command/generator_commands/base.rb +157 -157
  45. data/lib/chef-dk/command/generator_commands/build_cookbook.rb +125 -125
  46. data/lib/chef-dk/command/generator_commands/chef_exts/generator_desc_resource.rb +85 -85
  47. data/lib/chef-dk/command/generator_commands/chef_exts/quieter_doc_formatter.rb +38 -38
  48. data/lib/chef-dk/command/generator_commands/chef_exts/recipe_dsl_ext.rb +39 -39
  49. data/lib/chef-dk/command/generator_commands/cookbook.rb +241 -241
  50. data/lib/chef-dk/command/generator_commands/cookbook_code_file.rb +100 -100
  51. data/lib/chef-dk/command/generator_commands/cookbook_file.rb +45 -45
  52. data/lib/chef-dk/command/generator_commands/generator_generator.rb +174 -174
  53. data/lib/chef-dk/command/generator_commands/helpers.rb +36 -36
  54. data/lib/chef-dk/command/generator_commands/policyfile.rb +124 -124
  55. data/lib/chef-dk/command/generator_commands/recipe.rb +36 -36
  56. data/lib/chef-dk/command/generator_commands/repo.rb +123 -123
  57. data/lib/chef-dk/command/generator_commands/resource.rb +36 -36
  58. data/lib/chef-dk/command/generator_commands/template.rb +46 -46
  59. data/lib/chef-dk/command/install.rb +120 -120
  60. data/lib/chef-dk/command/provision.rb +436 -436
  61. data/lib/chef-dk/command/push.rb +117 -117
  62. data/lib/chef-dk/command/push_archive.rb +125 -125
  63. data/lib/chef-dk/command/shell_init.rb +179 -179
  64. data/lib/chef-dk/command/show_policy.rb +163 -163
  65. data/lib/chef-dk/command/undelete.rb +154 -154
  66. data/lib/chef-dk/command/update.rb +133 -133
  67. data/lib/chef-dk/command/verify.rb +629 -629
  68. data/lib/chef-dk/commands_map.rb +113 -113
  69. data/lib/chef-dk/completions/bash.sh.erb +5 -5
  70. data/lib/chef-dk/completions/chef.fish.erb +10 -10
  71. data/lib/chef-dk/completions/zsh.zsh.erb +21 -21
  72. data/lib/chef-dk/component_test.rb +227 -227
  73. data/lib/chef-dk/configurable.rb +88 -88
  74. data/lib/chef-dk/cookbook_metadata.rb +45 -45
  75. data/lib/chef-dk/cookbook_omnifetch.rb +32 -32
  76. data/lib/chef-dk/cookbook_profiler/git.rb +152 -152
  77. data/lib/chef-dk/cookbook_profiler/identifiers.rb +72 -72
  78. data/lib/chef-dk/cookbook_profiler/null_scm.rb +31 -31
  79. data/lib/chef-dk/exceptions.rb +151 -151
  80. data/lib/chef-dk/generator.rb +165 -165
  81. data/lib/chef-dk/helpers.rb +176 -176
  82. data/lib/chef-dk/pager.rb +104 -104
  83. data/lib/chef-dk/policyfile/artifactory_cookbook_source.rb +102 -102
  84. data/lib/chef-dk/policyfile/attribute_merge_checker.rb +110 -110
  85. data/lib/chef-dk/policyfile/chef_repo_cookbook_source.rb +138 -138
  86. data/lib/chef-dk/policyfile/chef_server_cookbook_source.rb +99 -99
  87. data/lib/chef-dk/policyfile/chef_server_lock_fetcher.rb +167 -167
  88. data/lib/chef-dk/policyfile/community_cookbook_source.rb +95 -95
  89. data/lib/chef-dk/policyfile/comparison_base.rb +123 -123
  90. data/lib/chef-dk/policyfile/cookbook_location_specification.rb +154 -154
  91. data/lib/chef-dk/policyfile/cookbook_locks.rb +466 -466
  92. data/lib/chef-dk/policyfile/cookbook_sources.rb +23 -23
  93. data/lib/chef-dk/policyfile/delivery_supermarket_source.rb +89 -89
  94. data/lib/chef-dk/policyfile/differ.rb +263 -263
  95. data/lib/chef-dk/policyfile/dsl.rb +288 -288
  96. data/lib/chef-dk/policyfile/git_lock_fetcher.rb +265 -265
  97. data/lib/chef-dk/policyfile/included_policies_cookbook_source.rb +156 -156
  98. data/lib/chef-dk/policyfile/lister.rb +229 -229
  99. data/lib/chef-dk/policyfile/local_lock_fetcher.rb +129 -129
  100. data/lib/chef-dk/policyfile/lock_applier.rb +80 -80
  101. data/lib/chef-dk/policyfile/null_cookbook_source.rb +49 -49
  102. data/lib/chef-dk/policyfile/policyfile_location_specification.rb +125 -125
  103. data/lib/chef-dk/policyfile/read_cookbook_for_compat_mode_upload.rb +124 -124
  104. data/lib/chef-dk/policyfile/reports/install.rb +69 -69
  105. data/lib/chef-dk/policyfile/reports/table_printer.rb +57 -57
  106. data/lib/chef-dk/policyfile/reports/upload.rb +70 -70
  107. data/lib/chef-dk/policyfile/solution_dependencies.rb +311 -311
  108. data/lib/chef-dk/policyfile/source_uri.rb +57 -57
  109. data/lib/chef-dk/policyfile/storage_config.rb +112 -112
  110. data/lib/chef-dk/policyfile/undo_record.rb +139 -139
  111. data/lib/chef-dk/policyfile/undo_stack.rb +128 -128
  112. data/lib/chef-dk/policyfile/uploader.rb +213 -213
  113. data/lib/chef-dk/policyfile_compiler.rb +528 -528
  114. data/lib/chef-dk/policyfile_lock.rb +581 -581
  115. data/lib/chef-dk/policyfile_services/clean_policies.rb +95 -95
  116. data/lib/chef-dk/policyfile_services/clean_policy_cookbooks.rb +123 -123
  117. data/lib/chef-dk/policyfile_services/export_repo.rb +419 -419
  118. data/lib/chef-dk/policyfile_services/install.rb +162 -162
  119. data/lib/chef-dk/policyfile_services/push.rb +112 -112
  120. data/lib/chef-dk/policyfile_services/push_archive.rb +164 -164
  121. data/lib/chef-dk/policyfile_services/rm_policy.rb +141 -141
  122. data/lib/chef-dk/policyfile_services/rm_policy_group.rb +85 -85
  123. data/lib/chef-dk/policyfile_services/show_policy.rb +234 -234
  124. data/lib/chef-dk/policyfile_services/undelete.rb +108 -108
  125. data/lib/chef-dk/policyfile_services/update_attributes.rb +110 -110
  126. data/lib/chef-dk/service_exception_inspectors.rb +24 -24
  127. data/lib/chef-dk/service_exception_inspectors/base.rb +39 -39
  128. data/lib/chef-dk/service_exception_inspectors/http.rb +119 -119
  129. data/lib/chef-dk/service_exceptions.rb +142 -142
  130. data/lib/chef-dk/shell_out.rb +36 -36
  131. data/lib/chef-dk/skeletons/code_generator/files/default/Berksfile +4 -4
  132. data/lib/chef-dk/skeletons/code_generator/files/default/build_cookbook/.kitchen.yml +21 -21
  133. data/lib/chef-dk/skeletons/code_generator/files/default/build_cookbook/README.md +146 -146
  134. data/lib/chef-dk/skeletons/code_generator/files/default/build_cookbook/test-fixture-recipe.rb +9 -9
  135. data/lib/chef-dk/skeletons/code_generator/files/default/chefignore +104 -104
  136. data/lib/chef-dk/skeletons/code_generator/files/default/cookbook_readmes/README-policy.md +9 -9
  137. data/lib/chef-dk/skeletons/code_generator/files/default/cookbook_readmes/README.md +66 -66
  138. data/lib/chef-dk/skeletons/code_generator/files/default/delivery-config.json +17 -17
  139. data/lib/chef-dk/skeletons/code_generator/files/default/delivery-project.toml +36 -36
  140. data/lib/chef-dk/skeletons/code_generator/files/default/gitignore +22 -22
  141. data/lib/chef-dk/skeletons/code_generator/files/default/repo/README.md +24 -24
  142. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/README.md +27 -27
  143. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/attributes/default.rb +8 -8
  144. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/metadata.rb +7 -7
  145. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/recipes/default.rb +9 -9
  146. data/lib/chef-dk/skeletons/code_generator/files/default/repo/data_bags/README.md +56 -56
  147. data/lib/chef-dk/skeletons/code_generator/files/default/repo/data_bags/example/example_item.json +3 -3
  148. data/lib/chef-dk/skeletons/code_generator/files/default/repo/dot-chef-repo.txt +6 -6
  149. data/lib/chef-dk/skeletons/code_generator/files/default/repo/environments/README.md +9 -9
  150. data/lib/chef-dk/skeletons/code_generator/files/default/repo/environments/example.json +12 -12
  151. data/lib/chef-dk/skeletons/code_generator/files/default/repo/policies/README.md +24 -24
  152. data/lib/chef-dk/skeletons/code_generator/files/default/repo/roles/README.md +9 -9
  153. data/lib/chef-dk/skeletons/code_generator/files/default/repo/roles/example.json +12 -12
  154. data/lib/chef-dk/skeletons/code_generator/files/default/spec_helper.rb +3 -3
  155. data/lib/chef-dk/skeletons/code_generator/files/default/spec_helper_policyfile.rb +3 -3
  156. data/lib/chef-dk/skeletons/code_generator/metadata.rb +8 -8
  157. data/lib/chef-dk/skeletons/code_generator/recipes/app.rb +89 -89
  158. data/lib/chef-dk/skeletons/code_generator/recipes/attribute.rb +13 -13
  159. data/lib/chef-dk/skeletons/code_generator/recipes/build_cookbook.rb +177 -177
  160. data/lib/chef-dk/skeletons/code_generator/recipes/cookbook.rb +158 -158
  161. data/lib/chef-dk/skeletons/code_generator/recipes/cookbook_file.rb +25 -25
  162. data/lib/chef-dk/skeletons/code_generator/recipes/helpers.rb +21 -21
  163. data/lib/chef-dk/skeletons/code_generator/recipes/policyfile.rb +9 -9
  164. data/lib/chef-dk/skeletons/code_generator/recipes/recipe.rb +52 -52
  165. data/lib/chef-dk/skeletons/code_generator/recipes/repo.rb +68 -68
  166. data/lib/chef-dk/skeletons/code_generator/recipes/resource.rb +13 -13
  167. data/lib/chef-dk/skeletons/code_generator/recipes/template.rb +32 -32
  168. data/lib/chef-dk/skeletons/code_generator/templates/default/CHANGELOG.md.erb +11 -11
  169. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.all_rights.erb +3 -3
  170. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.apachev2.erb +201 -201
  171. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.gplv2.erb +339 -339
  172. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.gplv3.erb +674 -674
  173. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.mit.erb +21 -21
  174. data/lib/chef-dk/skeletons/code_generator/templates/default/Policyfile.rb.erb +25 -25
  175. data/lib/chef-dk/skeletons/code_generator/templates/default/README.md.erb +4 -4
  176. data/lib/chef-dk/skeletons/code_generator/templates/default/build_cookbook/Berksfile.erb +7 -7
  177. data/lib/chef-dk/skeletons/code_generator/templates/default/build_cookbook/metadata.rb.erb +10 -10
  178. data/lib/chef-dk/skeletons/code_generator/templates/default/build_cookbook/recipe.rb.erb +8 -8
  179. data/lib/chef-dk/skeletons/code_generator/templates/default/helpers.rb.erb +39 -39
  180. data/lib/chef-dk/skeletons/code_generator/templates/default/inspec_default_test.rb.erb +18 -18
  181. data/lib/chef-dk/skeletons/code_generator/templates/default/kitchen.yml.erb +26 -26
  182. data/lib/chef-dk/skeletons/code_generator/templates/default/kitchen_policyfile.yml.erb +33 -33
  183. data/lib/chef-dk/skeletons/code_generator/templates/default/metadata.rb.erb +20 -20
  184. data/lib/chef-dk/skeletons/code_generator/templates/default/recipe.rb.erb +5 -5
  185. data/lib/chef-dk/skeletons/code_generator/templates/default/recipe_spec.rb.erb +35 -35
  186. data/lib/chef-dk/skeletons/code_generator/templates/default/repo/gitignore.erb +128 -128
  187. data/lib/chef-dk/skeletons/code_generator/templates/default/resource.rb.erb +1 -1
  188. data/lib/chef-dk/ui.rb +57 -57
  189. data/lib/chef-dk/version.rb +20 -20
  190. data/lib/kitchen/provisioner/policyfile_zero.rb +195 -195
  191. data/omnibus_overrides.rb +25 -25
  192. data/spec/shared/a_file_generator.rb +125 -125
  193. data/spec/shared/a_generated_file.rb +12 -12
  194. data/spec/shared/command_with_ui_object.rb +11 -11
  195. data/spec/shared/custom_generator_cookbook.rb +136 -136
  196. data/spec/shared/fixture_cookbook_checksums.rb +46 -46
  197. data/spec/shared/setup_git_committer_config.rb +54 -54
  198. data/spec/shared/setup_git_cookbooks.rb +53 -53
  199. data/spec/spec_helper.rb +51 -51
  200. data/spec/test_helpers.rb +84 -84
  201. data/spec/unit/chef_runner_spec.rb +139 -139
  202. data/spec/unit/chef_server_api_multi_spec.rb +120 -120
  203. data/spec/unit/cli_spec.rb +377 -377
  204. data/spec/unit/command/base_spec.rb +172 -172
  205. data/spec/unit/command/clean_policy_cookbooks_spec.rb +180 -180
  206. data/spec/unit/command/clean_policy_revisions_spec.rb +180 -180
  207. data/spec/unit/command/delete_policy_group_spec.rb +206 -206
  208. data/spec/unit/command/delete_policy_spec.rb +206 -206
  209. data/spec/unit/command/diff_spec.rb +311 -311
  210. data/spec/unit/command/env_spec.rb +52 -52
  211. data/spec/unit/command/exec_spec.rb +178 -178
  212. data/spec/unit/command/export_spec.rb +199 -199
  213. data/spec/unit/command/generate_spec.rb +142 -142
  214. data/spec/unit/command/generator_commands/app_spec.rb +166 -166
  215. data/spec/unit/command/generator_commands/attribute_spec.rb +31 -31
  216. data/spec/unit/command/generator_commands/base_spec.rb +181 -181
  217. data/spec/unit/command/generator_commands/build_cookbook_spec.rb +377 -377
  218. data/spec/unit/command/generator_commands/chef_exts/generator_desc_resource_spec.rb +97 -97
  219. data/spec/unit/command/generator_commands/chef_exts/recipe_dsl_ext_spec.rb +111 -111
  220. data/spec/unit/command/generator_commands/cookbook_file_spec.rb +31 -31
  221. data/spec/unit/command/generator_commands/cookbook_spec.rb +765 -765
  222. data/spec/unit/command/generator_commands/generator_generator_spec.rb +227 -227
  223. data/spec/unit/command/generator_commands/helpers_spec.rb +31 -31
  224. data/spec/unit/command/generator_commands/policyfile_spec.rb +223 -223
  225. data/spec/unit/command/generator_commands/recipe_spec.rb +37 -37
  226. data/spec/unit/command/generator_commands/repo_spec.rb +374 -374
  227. data/spec/unit/command/generator_commands/resource_spec.rb +31 -31
  228. data/spec/unit/command/generator_commands/template_spec.rb +31 -31
  229. data/spec/unit/command/install_spec.rb +179 -179
  230. data/spec/unit/command/provision_spec.rb +589 -589
  231. data/spec/unit/command/push_archive_spec.rb +153 -153
  232. data/spec/unit/command/push_spec.rb +198 -198
  233. data/spec/unit/command/shell_init_spec.rb +339 -339
  234. data/spec/unit/command/show_policy_spec.rb +234 -234
  235. data/spec/unit/command/undelete_spec.rb +244 -244
  236. data/spec/unit/command/update_spec.rb +283 -283
  237. data/spec/unit/command/verify_spec.rb +341 -341
  238. data/spec/unit/commands_map_spec.rb +57 -57
  239. data/spec/unit/component_test_spec.rb +128 -128
  240. data/spec/unit/configurable_spec.rb +68 -68
  241. data/spec/unit/cookbook_metadata_spec.rb +96 -96
  242. data/spec/unit/cookbook_profiler/git_spec.rb +176 -176
  243. data/spec/unit/cookbook_profiler/identifiers_spec.rb +81 -81
  244. data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_one.rb +9 -9
  245. data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_two.rb +9 -9
  246. data/spec/unit/fixtures/command/cli_test_command.rb +26 -26
  247. data/spec/unit/fixtures/command/explicit_path_example.rb +7 -7
  248. data/spec/unit/fixtures/configurable/test_config_loader.rb +5 -5
  249. data/spec/unit/fixtures/configurable/test_configurable.rb +10 -10
  250. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -16
  251. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/Berksfile +3 -3
  252. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -4
  253. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/chefignore +96 -96
  254. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -8
  255. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -8
  256. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/.kitchen.yml +16 -16
  257. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/Berksfile +3 -3
  258. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/README.md +4 -4
  259. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/chefignore +96 -96
  260. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/metadata.rb +8 -8
  261. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/recipes/default.rb +8 -8
  262. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/.kitchen.yml +16 -16
  263. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/Berksfile +3 -3
  264. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/README.md +4 -4
  265. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/chefignore +96 -96
  266. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/metadata.rb +8 -8
  267. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/recipes/default.rb +8 -8
  268. data/spec/unit/fixtures/cookbooks_api/chef_server_universe.json +56 -56
  269. data/spec/unit/fixtures/cookbooks_api/pruned_chef_server_universe.json +30 -30
  270. data/spec/unit/fixtures/cookbooks_api/pruned_small_universe.json +1321 -1321
  271. data/spec/unit/fixtures/cookbooks_api/small_universe.json +2987 -2987
  272. data/spec/unit/fixtures/cookbooks_api/universe.json +1 -1
  273. data/spec/unit/fixtures/cookbooks_api/update_fixtures.rb +33 -33
  274. data/spec/unit/fixtures/dev_cookbooks/README.md +16 -16
  275. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/integration_test +2 -2
  276. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/verify_me +5 -5
  277. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/chef/verify_me +3 -3
  278. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/test-kitchen/verify_me +2 -2
  279. data/spec/unit/fixtures/example_cookbook/.gitignore +17 -17
  280. data/spec/unit/fixtures/example_cookbook/.kitchen.yml +16 -16
  281. data/spec/unit/fixtures/example_cookbook/Berksfile +3 -3
  282. data/spec/unit/fixtures/example_cookbook/README.md +4 -4
  283. data/spec/unit/fixtures/example_cookbook/chefignore +96 -96
  284. data/spec/unit/fixtures/example_cookbook/metadata.rb +8 -8
  285. data/spec/unit/fixtures/example_cookbook/recipes/default.rb +8 -8
  286. data/spec/unit/fixtures/example_cookbook_metadata_json_only/.gitignore +17 -17
  287. data/spec/unit/fixtures/example_cookbook_metadata_json_only/.kitchen.yml +16 -16
  288. data/spec/unit/fixtures/example_cookbook_metadata_json_only/Berksfile +3 -3
  289. data/spec/unit/fixtures/example_cookbook_metadata_json_only/README.md +4 -4
  290. data/spec/unit/fixtures/example_cookbook_metadata_json_only/chefignore +96 -96
  291. data/spec/unit/fixtures/example_cookbook_metadata_json_only/metadata.json +5 -5
  292. data/spec/unit/fixtures/example_cookbook_metadata_json_only/recipes/default.rb +8 -8
  293. data/spec/unit/fixtures/example_cookbook_no_metadata/.gitignore +17 -17
  294. data/spec/unit/fixtures/example_cookbook_no_metadata/.kitchen.yml +16 -16
  295. data/spec/unit/fixtures/example_cookbook_no_metadata/Berksfile +3 -3
  296. data/spec/unit/fixtures/example_cookbook_no_metadata/README.md +4 -4
  297. data/spec/unit/fixtures/example_cookbook_no_metadata/chefignore +96 -96
  298. data/spec/unit/fixtures/example_cookbook_no_metadata/recipes/default.rb +8 -8
  299. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/README.md +4 -4
  300. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/chefignore +96 -96
  301. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/metadata.rb +8 -8
  302. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/recipes/default.rb +8 -8
  303. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/Berksfile +3 -3
  304. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/README.md +4 -4
  305. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/chefignore +96 -96
  306. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/metadata.rb +9 -9
  307. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/recipes/default.rb +8 -8
  308. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/.kitchen.yml +16 -16
  309. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/Berksfile +3 -3
  310. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/README.md +4 -4
  311. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/chefignore +96 -96
  312. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/metadata.rb +8 -8
  313. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/recipes/default.rb +8 -8
  314. data/spec/unit/fixtures/local_path_cookbooks/metadata-missing/README.md +2 -2
  315. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -16
  316. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -4
  317. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -8
  318. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -8
  319. data/spec/unit/generator_spec.rb +119 -119
  320. data/spec/unit/pager_spec.rb +117 -117
  321. data/spec/unit/policyfile/artifactory_cookbook_source_spec.rb +59 -59
  322. data/spec/unit/policyfile/attribute_merge_checker_spec.rb +80 -80
  323. data/spec/unit/policyfile/chef_repo_cookbook_source_spec.rb +93 -93
  324. data/spec/unit/policyfile/chef_server_cookbook_source_spec.rb +55 -55
  325. data/spec/unit/policyfile/chef_server_lock_fetcher_spec.rb +161 -161
  326. data/spec/unit/policyfile/community_cookbook_source_spec.rb +83 -83
  327. data/spec/unit/policyfile/comparison_base_spec.rb +340 -340
  328. data/spec/unit/policyfile/cookbook_location_specification_spec.rb +347 -347
  329. data/spec/unit/policyfile/cookbook_locks_spec.rb +527 -527
  330. data/spec/unit/policyfile/delivery_supermarket_source_spec.rb +129 -129
  331. data/spec/unit/policyfile/differ_spec.rb +686 -686
  332. data/spec/unit/policyfile/git_lock_fetcher_spec.rb +155 -155
  333. data/spec/unit/policyfile/included_policies_cookbook_source_spec.rb +242 -242
  334. data/spec/unit/policyfile/lister_spec.rb +268 -268
  335. data/spec/unit/policyfile/local_lock_fetcher_spec.rb +173 -173
  336. data/spec/unit/policyfile/lock_applier_spec.rb +100 -100
  337. data/spec/unit/policyfile/null_cookbook_source_spec.rb +34 -34
  338. data/spec/unit/policyfile/read_cookbook_for_compat_mode_upload_spec.rb +92 -92
  339. data/spec/unit/policyfile/reports/install_spec.rb +114 -114
  340. data/spec/unit/policyfile/reports/upload_spec.rb +94 -94
  341. data/spec/unit/policyfile/solution_dependencies_spec.rb +170 -170
  342. data/spec/unit/policyfile/source_uri_spec.rb +36 -36
  343. data/spec/unit/policyfile/storage_config_spec.rb +180 -180
  344. data/spec/unit/policyfile/undo_record_spec.rb +258 -258
  345. data/spec/unit/policyfile/undo_stack_spec.rb +265 -265
  346. data/spec/unit/policyfile/uploader_spec.rb +409 -409
  347. data/spec/unit/policyfile_demands_spec.rb +1197 -1197
  348. data/spec/unit/policyfile_evaluation_spec.rb +628 -628
  349. data/spec/unit/policyfile_includes_dsl_spec.rb +159 -159
  350. data/spec/unit/policyfile_includes_spec.rb +720 -720
  351. data/spec/unit/policyfile_install_with_includes_spec.rb +232 -232
  352. data/spec/unit/policyfile_lock_build_spec.rb +1065 -1065
  353. data/spec/unit/policyfile_lock_install_spec.rb +137 -137
  354. data/spec/unit/policyfile_lock_serialization_spec.rb +424 -424
  355. data/spec/unit/policyfile_lock_validation_spec.rb +608 -608
  356. data/spec/unit/policyfile_services/clean_policies_spec.rb +236 -236
  357. data/spec/unit/policyfile_services/clean_policy_cookbooks_spec.rb +272 -272
  358. data/spec/unit/policyfile_services/export_repo_spec.rb +473 -473
  359. data/spec/unit/policyfile_services/install_spec.rb +209 -209
  360. data/spec/unit/policyfile_services/push_archive_spec.rb +359 -359
  361. data/spec/unit/policyfile_services/push_spec.rb +249 -249
  362. data/spec/unit/policyfile_services/rm_policy_group_spec.rb +237 -237
  363. data/spec/unit/policyfile_services/rm_policy_spec.rb +263 -263
  364. data/spec/unit/policyfile_services/show_policy_spec.rb +887 -887
  365. data/spec/unit/policyfile_services/undelete_spec.rb +302 -302
  366. data/spec/unit/policyfile_services/update_attributes_spec.rb +229 -229
  367. data/spec/unit/policyfile_services/update_spec.rb +140 -140
  368. data/spec/unit/service_exception_inspectors/base_spec.rb +41 -41
  369. data/spec/unit/service_exception_inspectors/http_spec.rb +138 -138
  370. data/spec/unit/shell_out_spec.rb +34 -34
  371. data/tasks/announce.rb +57 -57
  372. data/tasks/bin/bundle-platform.bat +2 -2
  373. data/tasks/dependencies.rb +89 -89
  374. data/tasks/templates/prerelease.md.erb +35 -35
  375. data/tasks/templates/release.md.erb +34 -34
  376. data/warning.txt +9 -9
  377. metadata +2 -2
@@ -1,887 +1,887 @@
1
- #
2
- # Copyright:: Copyright (c) 2015 Chef Software Inc.
3
- # License:: Apache License, Version 2.0
4
- #
5
- # Licensed under the Apache License, Version 2.0 (the "License");
6
- # you may not use this file except in compliance with the License.
7
- # You may obtain a copy of the License at
8
- #
9
- # http://www.apache.org/licenses/LICENSE-2.0
10
- #
11
- # Unless required by applicable law or agreed to in writing, software
12
- # distributed under the License is distributed on an "AS IS" BASIS,
13
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- # See the License for the specific language governing permissions and
15
- # limitations under the License.
16
- #
17
-
18
- require "spec_helper"
19
- require "chef-dk/policyfile_services/show_policy"
20
-
21
- describe ChefDK::PolicyfileServices::ShowPolicy do
22
-
23
- let(:chef_config) { double("Chef::Config") }
24
-
25
- let(:ui) { TestHelpers::TestUI.new }
26
-
27
- let(:policy_name) { nil }
28
-
29
- let(:policy_group) { nil }
30
-
31
- let(:show_orphans) { false }
32
-
33
- let(:summary_diff) { false }
34
-
35
- subject(:show_policy_service) do
36
- described_class.new(config: chef_config,
37
- ui: ui,
38
- policy_name: policy_name,
39
- policy_group: policy_group,
40
- show_orphans: show_orphans,
41
- summary_diff: summary_diff)
42
- end
43
-
44
- let(:policy_lister) do
45
- show_policy_service.policy_lister
46
- end
47
-
48
- let(:policyfile_locks_content) {}
49
-
50
- describe "show all" do
51
-
52
- let(:params) { [] }
53
-
54
- let(:policies_by_name) { {} }
55
- let(:policies_by_group) { {} }
56
-
57
- describe "when an error occurs fetching data from the server" do
58
-
59
- let(:http_client) { instance_double(Chef::ServerAPI) }
60
-
61
- let(:response) do
62
- Net::HTTPResponse.send(:response_class, "500").new("1.0", "500", "Internal Server Error").tap do |r|
63
- r.instance_variable_set(:@body, "oops")
64
- end
65
- end
66
-
67
- let(:http_exception) do
68
- begin
69
- response.error!
70
- rescue => e
71
- e
72
- end
73
- end
74
-
75
- let(:policies_url) { "/policies" }
76
-
77
- let(:policy_groups_url) { "/policy_groups" }
78
-
79
- before do
80
- allow(policy_lister).to receive(:http_client).and_return(http_client)
81
- end
82
-
83
- describe "when fetching policy revisions by policy group" do
84
-
85
- before do
86
- expect(http_client).to receive(:get).and_raise(http_exception)
87
- end
88
-
89
- it "raises an error" do
90
- expect { show_policy_service.run }.to raise_error(ChefDK::PolicyfileListError)
91
- end
92
- end
93
-
94
- end
95
-
96
- context "when the server returns the data successfully" do
97
-
98
- before do
99
- policy_lister.set!(policies_by_name, policies_by_group)
100
- policy_lister.policy_lock_content = policyfile_locks_content
101
-
102
- show_policy_service.run
103
- end
104
-
105
- context "when there are no policies or groups on the server" do
106
-
107
- it "prints a message to stderr that there aren't any policies or groups" do
108
- expect(ui.output).to eq("No policies or policy groups exist on the server\n")
109
- end
110
-
111
- end
112
-
113
- context "when there are policies but no groups" do
114
-
115
- let(:policies_by_name) do
116
- {
117
- "appserver" => {
118
- "1111111111111111111111111111111111111111111111111111111111111111" => {},
119
- "2222222222222222222222222222222222222222222222222222222222222222" => {},
120
- },
121
- "load-balancer" => {
122
- "5555555555555555555555555555555555555555555555555555555555555555" => {},
123
- "6666666666666666666666666666666666666666666666666666666666666666" => {},
124
- },
125
- "db" => {
126
- "9999999999999999999999999999999999999999999999999999999999999999" => {},
127
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" => {},
128
- },
129
- }
130
- end
131
-
132
- it "prints a message to stderr that there are no active policies" do
133
- expected_output = <<-OUTPUT
134
- appserver
135
- =========
136
-
137
- Policy appserver is not assigned to any groups
138
-
139
- load-balancer
140
- =============
141
-
142
- Policy load-balancer is not assigned to any groups
143
-
144
- db
145
- ==
146
-
147
- Policy db is not assigned to any groups
148
-
149
- OUTPUT
150
- expect(ui.output).to eq(expected_output)
151
- end
152
-
153
- context "with orphans shown" do
154
-
155
- let(:show_orphans) { true }
156
-
157
- it "shows all policies as orphaned" do
158
- expected_output = <<-OUTPUT
159
- appserver
160
- =========
161
-
162
- Policy appserver is not assigned to any groups
163
-
164
- Orphaned:
165
- ---------
166
-
167
- * 1111111111
168
- * 2222222222
169
-
170
- load-balancer
171
- =============
172
-
173
- Policy load-balancer is not assigned to any groups
174
-
175
- Orphaned:
176
- ---------
177
-
178
- * 5555555555
179
- * 6666666666
180
-
181
- db
182
- ==
183
-
184
- Policy db is not assigned to any groups
185
-
186
- Orphaned:
187
- ---------
188
-
189
- * 9999999999
190
- * aaaaaaaaaa
191
-
192
- OUTPUT
193
- expect(ui.output).to eq(expected_output)
194
- end
195
- end
196
-
197
- end
198
-
199
- context "when there are groups but no policies" do
200
-
201
- let(:policies_by_group) do
202
- {
203
- "dev" => {},
204
- "staging" => {},
205
- "prod" => {},
206
- }
207
- end
208
-
209
- it "prints a message to stderr and exits" do
210
- expect(ui.output).to eq("No policies exist on the server\n")
211
- end
212
-
213
- end
214
-
215
- context "when there is a revision of each kind of policy assigned to every policy group" do
216
-
217
- let(:policies_by_name) do
218
- {
219
- "appserver" => {
220
- "1111111111111111111111111111111111111111111111111111111111111111" => {},
221
- "2222222222222222222222222222222222222222222222222222222222222222" => {},
222
- },
223
- "load-balancer" => {
224
- "5555555555555555555555555555555555555555555555555555555555555555" => {},
225
- "6666666666666666666666666666666666666666666666666666666666666666" => {},
226
- },
227
- "db" => {
228
- "9999999999999999999999999999999999999999999999999999999999999999" => {},
229
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" => {},
230
- },
231
- }
232
- end
233
-
234
- let(:policies_by_group) do
235
- {
236
- "dev" => {
237
- "appserver" => "1111111111111111111111111111111111111111111111111111111111111111",
238
- "load-balancer" => "5555555555555555555555555555555555555555555555555555555555555555",
239
- "db" => "9999999999999999999999999999999999999999999999999999999999999999",
240
- },
241
- "staging" => {
242
- "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
243
- "load-balancer" => "5555555555555555555555555555555555555555555555555555555555555555",
244
- "db" => "9999999999999999999999999999999999999999999999999999999999999999",
245
- },
246
- "prod" => {
247
- "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
248
- "load-balancer" => "6666666666666666666666666666666666666666666666666666666666666666",
249
- "db" => "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
250
- },
251
- }
252
- end
253
-
254
- it "shows each policy name, followed by a list of group_name -> revision" do
255
- expected_output = <<-OUTPUT
256
- appserver
257
- =========
258
-
259
- * dev: 1111111111
260
- * staging: 2222222222
261
- * prod: 2222222222
262
-
263
- load-balancer
264
- =============
265
-
266
- * dev: 5555555555
267
- * staging: 5555555555
268
- * prod: 6666666666
269
-
270
- db
271
- ==
272
-
273
- * dev: 9999999999
274
- * staging: 9999999999
275
- * prod: aaaaaaaaaa
276
-
277
- OUTPUT
278
- expect(ui.output).to eq(expected_output)
279
- end
280
-
281
- end
282
-
283
- context "when there is a revision of each kind of policy assigned to every policy group, plus orphaned policies" do
284
- let(:policies_by_name) do
285
- {
286
- "appserver" => {
287
- "1111111111111111111111111111111111111111111111111111111111111111" => {},
288
- "2222222222222222222222222222222222222222222222222222222222222222" => {},
289
- "3333333333333333333333333333333333333333333333333333333333333333" => {},
290
- },
291
- "load-balancer" => {
292
- "5555555555555555555555555555555555555555555555555555555555555555" => {},
293
- "6666666666666666666666666666666666666666666666666666666666666666" => {},
294
- "7777777777777777777777777777777777777777777777777777777777777777" => {},
295
- },
296
- "db" => {
297
- "9999999999999999999999999999999999999999999999999999999999999999" => {},
298
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" => {},
299
- "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" => {},
300
- },
301
- }
302
- end
303
-
304
- let(:policies_by_group) do
305
- {
306
- "dev" => {
307
- "appserver" => "1111111111111111111111111111111111111111111111111111111111111111",
308
- "load-balancer" => "5555555555555555555555555555555555555555555555555555555555555555",
309
- "db" => "9999999999999999999999999999999999999999999999999999999999999999",
310
- },
311
- "staging" => {
312
- "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
313
- "load-balancer" => "5555555555555555555555555555555555555555555555555555555555555555",
314
- "db" => "9999999999999999999999999999999999999999999999999999999999999999",
315
- },
316
- "prod" => {
317
- "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
318
- "load-balancer" => "6666666666666666666666666666666666666666666666666666666666666666",
319
- "db" => "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
320
- },
321
- }
322
- end
323
-
324
- it "shows each policy name, followed by a list of group_name -> revision, followed by a list of orphaned policies" do
325
- expected_output = <<-OUTPUT
326
- appserver
327
- =========
328
-
329
- * dev: 1111111111
330
- * staging: 2222222222
331
- * prod: 2222222222
332
-
333
- load-balancer
334
- =============
335
-
336
- * dev: 5555555555
337
- * staging: 5555555555
338
- * prod: 6666666666
339
-
340
- db
341
- ==
342
-
343
- * dev: 9999999999
344
- * staging: 9999999999
345
- * prod: aaaaaaaaaa
346
-
347
- OUTPUT
348
- expect(ui.output).to eq(expected_output)
349
- end
350
-
351
- context "with orphans shown" do
352
-
353
- let(:show_orphans) { true }
354
-
355
- it "shows each policy name, followed by a list of group_name -> revision, followed by a list of orphaned policies" do
356
- expected_output = <<-OUTPUT
357
- appserver
358
- =========
359
-
360
- * dev: 1111111111
361
- * staging: 2222222222
362
- * prod: 2222222222
363
-
364
- Orphaned:
365
- ---------
366
-
367
- * 3333333333
368
-
369
- load-balancer
370
- =============
371
-
372
- * dev: 5555555555
373
- * staging: 5555555555
374
- * prod: 6666666666
375
-
376
- Orphaned:
377
- ---------
378
-
379
- * 7777777777
380
-
381
- db
382
- ==
383
-
384
- * dev: 9999999999
385
- * staging: 9999999999
386
- * prod: aaaaaaaaaa
387
-
388
- Orphaned:
389
- ---------
390
-
391
- * bbbbbbbbbb
392
-
393
- OUTPUT
394
- expect(ui.output).to eq(expected_output)
395
- end
396
-
397
- end
398
- end
399
-
400
- context "when some groups do not have a revision of every policy" do
401
- let(:policies_by_name) do
402
- {
403
- "appserver" => {
404
- "1111111111111111111111111111111111111111111111111111111111111111" => {},
405
- "2222222222222222222222222222222222222222222222222222222222222222" => {},
406
- },
407
- "load-balancer" => {
408
- "5555555555555555555555555555555555555555555555555555555555555555" => {},
409
- "6666666666666666666666666666666666666666666666666666666666666666" => {},
410
- },
411
- "db" => {
412
- "9999999999999999999999999999999999999999999999999999999999999999" => {},
413
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" => {},
414
- },
415
- "memcache" => {
416
- "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd" => {},
417
- },
418
- }
419
- end
420
-
421
- let(:policies_by_group) do
422
- {
423
- "dev" => {
424
- "appserver" => "1111111111111111111111111111111111111111111111111111111111111111",
425
- "load-balancer" => "5555555555555555555555555555555555555555555555555555555555555555",
426
- "db" => "9999999999999999999999999999999999999999999999999999999999999999",
427
- "memcache" => "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
428
- },
429
- "staging" => {
430
- "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
431
- "load-balancer" => "5555555555555555555555555555555555555555555555555555555555555555",
432
- "db" => "9999999999999999999999999999999999999999999999999999999999999999",
433
- "memcache" => "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
434
- },
435
- "prod" => {
436
- "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
437
- "load-balancer" => "6666666666666666666666666666666666666666666666666666666666666666",
438
- "db" => "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
439
- },
440
- }
441
- end
442
-
443
- it "shows each policy name, followed by a list of group_name -> revision, omitting groups that don't have that policy" do
444
- expected_output = <<-OUTPUT
445
- appserver
446
- =========
447
-
448
- * dev: 1111111111
449
- * staging: 2222222222
450
- * prod: 2222222222
451
-
452
- load-balancer
453
- =============
454
-
455
- * dev: 5555555555
456
- * staging: 5555555555
457
- * prod: 6666666666
458
-
459
- db
460
- ==
461
-
462
- * dev: 9999999999
463
- * staging: 9999999999
464
- * prod: aaaaaaaaaa
465
-
466
- memcache
467
- ========
468
-
469
- * dev: dddddddddd
470
- * staging: dddddddddd
471
- * prod: *NOT APPLIED*
472
-
473
- OUTPUT
474
- expect(ui.output).to eq(expected_output)
475
- end
476
-
477
- end
478
- end
479
- end
480
-
481
- describe "showing a single policy" do
482
-
483
- let(:policy_name) { "appserver" }
484
-
485
- let(:policies_by_name) { {} }
486
- let(:policies_by_group) { {} }
487
-
488
- before do
489
- policy_lister.set!(policies_by_name, policies_by_group)
490
- end
491
-
492
- context "when the server returns the data successfully" do
493
-
494
- before do
495
- policy_lister.set!(policies_by_name, policies_by_group)
496
- policy_lister.policy_lock_content = policyfile_locks_content
497
-
498
- show_policy_service.run
499
- end
500
-
501
- context "when there are no policies or groups on the server" do
502
-
503
- let(:policies_by_name) do
504
- {}
505
- end
506
-
507
- let(:policies_by_group) do
508
- {}
509
- end
510
-
511
- it "prints a message to stderr that there are no copies of the policy on the server" do
512
- expected_output = <<-OUTPUT
513
- appserver
514
- =========
515
-
516
- No policies named 'appserver' are associated with a policy group
517
-
518
- OUTPUT
519
-
520
- expect(ui.output).to eq(expected_output)
521
- end
522
- end
523
-
524
- context "when there are no revisions of the policy on the server" do
525
-
526
- let(:policies_by_name) do
527
- {
528
- "load-balancer" => {
529
- "5555555555555555555555555555555555555555555555555555555555555555" => {},
530
- "6666666666666666666666666666666666666666666666666666666666666666" => {},
531
- },
532
- "db" => {
533
- "9999999999999999999999999999999999999999999999999999999999999999" => {},
534
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" => {},
535
- },
536
- "memcache" => {
537
- "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd" => {},
538
- },
539
- }
540
- end
541
-
542
- let(:policies_by_group) do
543
- {
544
- "dev" => {
545
- "load-balancer" => "5555555555555555555555555555555555555555555555555555555555555555",
546
- "db" => "9999999999999999999999999999999999999999999999999999999999999999",
547
- "memcache" => "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
548
- },
549
- "staging" => {
550
- "load-balancer" => "5555555555555555555555555555555555555555555555555555555555555555",
551
- "db" => "9999999999999999999999999999999999999999999999999999999999999999",
552
- "memcache" => "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
553
- },
554
- "prod" => {
555
- "load-balancer" => "6666666666666666666666666666666666666666666666666666666666666666",
556
- "db" => "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
557
- },
558
- }
559
- end
560
-
561
- it "prints a message to stderr that there are no copies of the policy on the server" do
562
- expected_output = <<-OUTPUT
563
- appserver
564
- =========
565
-
566
- No policies named 'appserver' are associated with a policy group
567
-
568
- OUTPUT
569
-
570
- expect(ui.output).to eq(expected_output)
571
- end
572
-
573
- end
574
-
575
- context "when all policies are orphaned and orphans are not shown" do
576
- let(:policies_by_name) do
577
- {
578
- "appserver" => {
579
- "1111111111111111111111111111111111111111111111111111111111111111" => {},
580
- "2222222222222222222222222222222222222222222222222222222222222222" => {},
581
- "3333333333333333333333333333333333333333333333333333333333333333" => {},
582
- },
583
- }
584
-
585
- end
586
-
587
- let(:policies_by_group) do
588
- {}
589
- end
590
-
591
- it "explains that no policies are assigned to a group" do
592
- expected_output = <<-OUTPUT
593
- appserver
594
- =========
595
-
596
- No policies named 'appserver' are associated with a policy group
597
-
598
- OUTPUT
599
-
600
- expect(ui.output).to eq(expected_output)
601
- end
602
- end
603
-
604
- context "when all policy groups have the same revision of the policy" do
605
-
606
- let(:policies_by_name) do
607
- {
608
- "appserver" => {
609
- "1111111111111111111111111111111111111111111111111111111111111111" => {},
610
- "2222222222222222222222222222222222222222222222222222222222222222" => {},
611
- "3333333333333333333333333333333333333333333333333333333333333333" => {},
612
- },
613
- }
614
-
615
- end
616
-
617
- let(:policies_by_group) do
618
- {
619
- "dev" => {
620
- "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
621
- },
622
- "staging" => {
623
- "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
624
- },
625
- "prod" => {
626
- "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
627
- },
628
- }
629
- end
630
- it "lists each of the groups with the associated revision" do
631
- expected_output = <<-OUTPUT
632
- appserver
633
- =========
634
-
635
- * dev: 2222222222
636
- * staging: 2222222222
637
- * prod: 2222222222
638
-
639
- OUTPUT
640
- expect(ui.output).to eq(expected_output)
641
- end
642
-
643
- end
644
-
645
- context "when policy groups have revisions with differing cookbooks" do
646
-
647
- let(:policies_by_name) do
648
- {
649
- "appserver" => {
650
- "1111111111111111111111111111111111111111111111111111111111111111" => {},
651
- "2222222222222222222222222222222222222222222222222222222222222222" => {},
652
- "3333333333333333333333333333333333333333333333333333333333333333" => {},
653
- },
654
- }
655
-
656
- end
657
-
658
- let(:policies_by_group) do
659
- {
660
- "dev" => {
661
- "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
662
- },
663
- "staging" => {
664
- "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
665
- },
666
- "prod" => {
667
- "appserver" => "1111111111111111111111111111111111111111111111111111111111111111",
668
- },
669
- }
670
- end
671
-
672
- it "lists each of the groups with the associated revision" do
673
- expected_output = <<-OUTPUT
674
- appserver
675
- =========
676
-
677
- * dev: 2222222222
678
- * staging: 2222222222
679
- * prod: 1111111111
680
-
681
- OUTPUT
682
- expect(ui.output).to eq(expected_output)
683
- end
684
-
685
- context "when the diff summary option is given" do
686
-
687
- let(:appserver_lock_contents_111) do
688
- {
689
- "cookbook_locks" => {
690
- "apache2" => {
691
- "version" => "2.1.3",
692
- "identifier" => "abcdef" + ("0" * 34),
693
- },
694
- "yum" => {
695
- "version" => "4.5.6",
696
- "identifier" => "123abc" + ("0" * 34),
697
- },
698
- "apt" => {
699
- "version" => "10.0.0",
700
- "identifier" => "ffffff" + ("0" * 34),
701
- },
702
-
703
- },
704
- }
705
- end
706
-
707
- let(:appserver_lock_contents_222) do
708
- {
709
- "cookbook_locks" => {
710
- "apache2" => {
711
- "version" => "2.0.5",
712
- "identifier" => "aaa123" + ("0" * 34),
713
- },
714
- "yum" => {
715
- "version" => "4.5.2",
716
- "identifier" => "867530" + ("9" * 34),
717
- },
718
- "apt" => {
719
- "version" => "10.0.0",
720
- "identifier" => "ffffff" + ("0" * 34),
721
- },
722
- "other_cookbook" => {
723
- "version" => "9.8.7",
724
- "identifier" => "113113" + ("0" * 34),
725
- },
726
- },
727
- }
728
- end
729
-
730
- let(:policyfile_locks_content) do
731
- {
732
- "appserver" => {
733
- "1111111111111111111111111111111111111111111111111111111111111111" => appserver_lock_contents_111,
734
- "2222222222222222222222222222222222222222222222222222222222222222" => appserver_lock_contents_222,
735
- },
736
- }
737
- end
738
-
739
- let(:summary_diff) { true }
740
-
741
- it "lists each of the groups and displays the version and identifier of the differing cookbooks" do
742
- expected_output = <<-OUTPUT
743
- appserver
744
- =========
745
-
746
- dev: 2222222222
747
- -------------------
748
-
749
- * apache2: 2.0.5 (aaa1230000)
750
- * yum: 4.5.2 (8675309999)
751
- * other_cookbook: 9.8.7 (1131130000)
752
-
753
- staging: 2222222222
754
- -------------------
755
-
756
- * apache2: 2.0.5 (aaa1230000)
757
- * yum: 4.5.2 (8675309999)
758
- * other_cookbook: 9.8.7 (1131130000)
759
-
760
- prod: 1111111111
761
- -------------------
762
-
763
- * apache2: 2.1.3 (abcdef0000)
764
- * yum: 4.5.6 (123abc0000)
765
- * other_cookbook: *NONE*
766
-
767
- OUTPUT
768
- expect(ui.output).to eq(expected_output)
769
- end
770
- end
771
-
772
- context "when orphans are displayed" do
773
-
774
- let(:show_orphans) { true }
775
-
776
- it "lists each of the groups, then lists the orphaned revisions" do
777
- expected_output = <<-OUTPUT
778
- appserver
779
- =========
780
-
781
- * dev: 2222222222
782
- * staging: 2222222222
783
- * prod: 1111111111
784
-
785
- Orphaned:
786
- ---------
787
-
788
- * 3333333333
789
-
790
- OUTPUT
791
-
792
- expect(ui.output).to eq(expected_output)
793
- end
794
-
795
- end
796
- end
797
-
798
- end
799
- end # showing a single policy
800
-
801
- describe "show policy in a specific policy group" do
802
-
803
- let(:policy_name) { "appserver" }
804
-
805
- let(:policy_group) { "dev" }
806
-
807
- let(:http_client) { instance_double("Chef::ServerAPI", url: "https://chef.example/organizations/monkeynews") }
808
-
809
- before do
810
- allow(show_policy_service).to receive(:http_client).and_return(http_client)
811
- end
812
-
813
- it "enables show_policy_revision" do
814
- expect(show_policy_service.show_policy_revision?).to be(true)
815
- end
816
-
817
- context "when there is no policy assigned for the given name and group" do
818
-
819
- let(:response) do
820
- Net::HTTPResponse.send(:response_class, "404").new("1.0", "404", "Not Found").tap do |r|
821
- r.instance_variable_set(:@body, "nope")
822
- end
823
- end
824
-
825
- let(:http_exception) do
826
- begin
827
- response.error!
828
- rescue => e
829
- e
830
- end
831
- end
832
-
833
- before do
834
- expect(http_client).to receive(:get).with("policy_groups/dev/policies/appserver").and_raise(http_exception)
835
- end
836
-
837
- it "prints a message saying there is no policy assigned" do
838
- message = "No policyfile lock named 'appserver' found in policy_group 'dev' at https://chef.example/organizations/monkeynews"
839
- expect { show_policy_service.run }.to raise_error(ChefDK::PolicyfileDownloadError, message)
840
- end
841
-
842
- end
843
-
844
- context "when the policy exists" do
845
-
846
- let(:policyfile_lock_data) do
847
- {
848
- "revision_id" => "cf5b8a020bdc1ba6914093a8a07a5514cce8a3a2979a967b1f32ea704a61785b",
849
- "name" => "example",
850
- "run_list" => [ "recipe[omnibus::default]" ],
851
- "cookbook_locks" => {
852
- "omnibus" => {
853
- "version" => "2.2.0",
854
- "identifier" => "64b3e64306cff223206348e46af545b19032b170",
855
- "dotted_decimal_identifier" => "28345299219435506.9887234981653237.76628930769264",
856
- "cache_key" => "omnibus-2cf98f9797cacce9c8688fc4e74858b858e2bc14",
857
- "origin" => "git@github.com:opscode-cookbooks/omnibus.git",
858
- "source_options" => {
859
- "git" => "git@github.com:opscode-cookbooks/omnibus.git",
860
- "revision" => "2cf98f9797cacce9c8688fc4e74858b858e2bc14",
861
- "branch" => "master",
862
- },
863
- },
864
- },
865
- }
866
- end
867
-
868
- let(:policyfile_lock_json) { FFI_Yajl::Encoder.encode(policyfile_lock_data, pretty: true) }
869
-
870
- let(:pager) { instance_double("ChefDK::Pager", ui: ui) }
871
-
872
- before do
873
- allow(ChefDK::Pager).to receive(:new).and_return(pager)
874
- allow(pager).to receive(:with_pager).and_yield(pager)
875
- allow(http_client).to receive(:get).with("policy_groups/dev/policies/appserver").and_return(policyfile_lock_data)
876
- end
877
-
878
- it "displays the policy" do
879
- show_policy_service.run
880
- expect(ui.output).to include(policyfile_lock_json)
881
- end
882
-
883
- end
884
-
885
- end
886
-
887
- end
1
+ #
2
+ # Copyright:: Copyright (c) 2015 Chef Software Inc.
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ require "spec_helper"
19
+ require "chef-dk/policyfile_services/show_policy"
20
+
21
+ describe ChefDK::PolicyfileServices::ShowPolicy do
22
+
23
+ let(:chef_config) { double("Chef::Config") }
24
+
25
+ let(:ui) { TestHelpers::TestUI.new }
26
+
27
+ let(:policy_name) { nil }
28
+
29
+ let(:policy_group) { nil }
30
+
31
+ let(:show_orphans) { false }
32
+
33
+ let(:summary_diff) { false }
34
+
35
+ subject(:show_policy_service) do
36
+ described_class.new(config: chef_config,
37
+ ui: ui,
38
+ policy_name: policy_name,
39
+ policy_group: policy_group,
40
+ show_orphans: show_orphans,
41
+ summary_diff: summary_diff)
42
+ end
43
+
44
+ let(:policy_lister) do
45
+ show_policy_service.policy_lister
46
+ end
47
+
48
+ let(:policyfile_locks_content) {}
49
+
50
+ describe "show all" do
51
+
52
+ let(:params) { [] }
53
+
54
+ let(:policies_by_name) { {} }
55
+ let(:policies_by_group) { {} }
56
+
57
+ describe "when an error occurs fetching data from the server" do
58
+
59
+ let(:http_client) { instance_double(Chef::ServerAPI) }
60
+
61
+ let(:response) do
62
+ Net::HTTPResponse.send(:response_class, "500").new("1.0", "500", "Internal Server Error").tap do |r|
63
+ r.instance_variable_set(:@body, "oops")
64
+ end
65
+ end
66
+
67
+ let(:http_exception) do
68
+ begin
69
+ response.error!
70
+ rescue => e
71
+ e
72
+ end
73
+ end
74
+
75
+ let(:policies_url) { "/policies" }
76
+
77
+ let(:policy_groups_url) { "/policy_groups" }
78
+
79
+ before do
80
+ allow(policy_lister).to receive(:http_client).and_return(http_client)
81
+ end
82
+
83
+ describe "when fetching policy revisions by policy group" do
84
+
85
+ before do
86
+ expect(http_client).to receive(:get).and_raise(http_exception)
87
+ end
88
+
89
+ it "raises an error" do
90
+ expect { show_policy_service.run }.to raise_error(ChefDK::PolicyfileListError)
91
+ end
92
+ end
93
+
94
+ end
95
+
96
+ context "when the server returns the data successfully" do
97
+
98
+ before do
99
+ policy_lister.set!(policies_by_name, policies_by_group)
100
+ policy_lister.policy_lock_content = policyfile_locks_content
101
+
102
+ show_policy_service.run
103
+ end
104
+
105
+ context "when there are no policies or groups on the server" do
106
+
107
+ it "prints a message to stderr that there aren't any policies or groups" do
108
+ expect(ui.output).to eq("No policies or policy groups exist on the server\n")
109
+ end
110
+
111
+ end
112
+
113
+ context "when there are policies but no groups" do
114
+
115
+ let(:policies_by_name) do
116
+ {
117
+ "appserver" => {
118
+ "1111111111111111111111111111111111111111111111111111111111111111" => {},
119
+ "2222222222222222222222222222222222222222222222222222222222222222" => {},
120
+ },
121
+ "load-balancer" => {
122
+ "5555555555555555555555555555555555555555555555555555555555555555" => {},
123
+ "6666666666666666666666666666666666666666666666666666666666666666" => {},
124
+ },
125
+ "db" => {
126
+ "9999999999999999999999999999999999999999999999999999999999999999" => {},
127
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" => {},
128
+ },
129
+ }
130
+ end
131
+
132
+ it "prints a message to stderr that there are no active policies" do
133
+ expected_output = <<-OUTPUT
134
+ appserver
135
+ =========
136
+
137
+ Policy appserver is not assigned to any groups
138
+
139
+ load-balancer
140
+ =============
141
+
142
+ Policy load-balancer is not assigned to any groups
143
+
144
+ db
145
+ ==
146
+
147
+ Policy db is not assigned to any groups
148
+
149
+ OUTPUT
150
+ expect(ui.output).to eq(expected_output)
151
+ end
152
+
153
+ context "with orphans shown" do
154
+
155
+ let(:show_orphans) { true }
156
+
157
+ it "shows all policies as orphaned" do
158
+ expected_output = <<-OUTPUT
159
+ appserver
160
+ =========
161
+
162
+ Policy appserver is not assigned to any groups
163
+
164
+ Orphaned:
165
+ ---------
166
+
167
+ * 1111111111
168
+ * 2222222222
169
+
170
+ load-balancer
171
+ =============
172
+
173
+ Policy load-balancer is not assigned to any groups
174
+
175
+ Orphaned:
176
+ ---------
177
+
178
+ * 5555555555
179
+ * 6666666666
180
+
181
+ db
182
+ ==
183
+
184
+ Policy db is not assigned to any groups
185
+
186
+ Orphaned:
187
+ ---------
188
+
189
+ * 9999999999
190
+ * aaaaaaaaaa
191
+
192
+ OUTPUT
193
+ expect(ui.output).to eq(expected_output)
194
+ end
195
+ end
196
+
197
+ end
198
+
199
+ context "when there are groups but no policies" do
200
+
201
+ let(:policies_by_group) do
202
+ {
203
+ "dev" => {},
204
+ "staging" => {},
205
+ "prod" => {},
206
+ }
207
+ end
208
+
209
+ it "prints a message to stderr and exits" do
210
+ expect(ui.output).to eq("No policies exist on the server\n")
211
+ end
212
+
213
+ end
214
+
215
+ context "when there is a revision of each kind of policy assigned to every policy group" do
216
+
217
+ let(:policies_by_name) do
218
+ {
219
+ "appserver" => {
220
+ "1111111111111111111111111111111111111111111111111111111111111111" => {},
221
+ "2222222222222222222222222222222222222222222222222222222222222222" => {},
222
+ },
223
+ "load-balancer" => {
224
+ "5555555555555555555555555555555555555555555555555555555555555555" => {},
225
+ "6666666666666666666666666666666666666666666666666666666666666666" => {},
226
+ },
227
+ "db" => {
228
+ "9999999999999999999999999999999999999999999999999999999999999999" => {},
229
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" => {},
230
+ },
231
+ }
232
+ end
233
+
234
+ let(:policies_by_group) do
235
+ {
236
+ "dev" => {
237
+ "appserver" => "1111111111111111111111111111111111111111111111111111111111111111",
238
+ "load-balancer" => "5555555555555555555555555555555555555555555555555555555555555555",
239
+ "db" => "9999999999999999999999999999999999999999999999999999999999999999",
240
+ },
241
+ "staging" => {
242
+ "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
243
+ "load-balancer" => "5555555555555555555555555555555555555555555555555555555555555555",
244
+ "db" => "9999999999999999999999999999999999999999999999999999999999999999",
245
+ },
246
+ "prod" => {
247
+ "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
248
+ "load-balancer" => "6666666666666666666666666666666666666666666666666666666666666666",
249
+ "db" => "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
250
+ },
251
+ }
252
+ end
253
+
254
+ it "shows each policy name, followed by a list of group_name -> revision" do
255
+ expected_output = <<-OUTPUT
256
+ appserver
257
+ =========
258
+
259
+ * dev: 1111111111
260
+ * staging: 2222222222
261
+ * prod: 2222222222
262
+
263
+ load-balancer
264
+ =============
265
+
266
+ * dev: 5555555555
267
+ * staging: 5555555555
268
+ * prod: 6666666666
269
+
270
+ db
271
+ ==
272
+
273
+ * dev: 9999999999
274
+ * staging: 9999999999
275
+ * prod: aaaaaaaaaa
276
+
277
+ OUTPUT
278
+ expect(ui.output).to eq(expected_output)
279
+ end
280
+
281
+ end
282
+
283
+ context "when there is a revision of each kind of policy assigned to every policy group, plus orphaned policies" do
284
+ let(:policies_by_name) do
285
+ {
286
+ "appserver" => {
287
+ "1111111111111111111111111111111111111111111111111111111111111111" => {},
288
+ "2222222222222222222222222222222222222222222222222222222222222222" => {},
289
+ "3333333333333333333333333333333333333333333333333333333333333333" => {},
290
+ },
291
+ "load-balancer" => {
292
+ "5555555555555555555555555555555555555555555555555555555555555555" => {},
293
+ "6666666666666666666666666666666666666666666666666666666666666666" => {},
294
+ "7777777777777777777777777777777777777777777777777777777777777777" => {},
295
+ },
296
+ "db" => {
297
+ "9999999999999999999999999999999999999999999999999999999999999999" => {},
298
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" => {},
299
+ "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" => {},
300
+ },
301
+ }
302
+ end
303
+
304
+ let(:policies_by_group) do
305
+ {
306
+ "dev" => {
307
+ "appserver" => "1111111111111111111111111111111111111111111111111111111111111111",
308
+ "load-balancer" => "5555555555555555555555555555555555555555555555555555555555555555",
309
+ "db" => "9999999999999999999999999999999999999999999999999999999999999999",
310
+ },
311
+ "staging" => {
312
+ "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
313
+ "load-balancer" => "5555555555555555555555555555555555555555555555555555555555555555",
314
+ "db" => "9999999999999999999999999999999999999999999999999999999999999999",
315
+ },
316
+ "prod" => {
317
+ "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
318
+ "load-balancer" => "6666666666666666666666666666666666666666666666666666666666666666",
319
+ "db" => "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
320
+ },
321
+ }
322
+ end
323
+
324
+ it "shows each policy name, followed by a list of group_name -> revision, followed by a list of orphaned policies" do
325
+ expected_output = <<-OUTPUT
326
+ appserver
327
+ =========
328
+
329
+ * dev: 1111111111
330
+ * staging: 2222222222
331
+ * prod: 2222222222
332
+
333
+ load-balancer
334
+ =============
335
+
336
+ * dev: 5555555555
337
+ * staging: 5555555555
338
+ * prod: 6666666666
339
+
340
+ db
341
+ ==
342
+
343
+ * dev: 9999999999
344
+ * staging: 9999999999
345
+ * prod: aaaaaaaaaa
346
+
347
+ OUTPUT
348
+ expect(ui.output).to eq(expected_output)
349
+ end
350
+
351
+ context "with orphans shown" do
352
+
353
+ let(:show_orphans) { true }
354
+
355
+ it "shows each policy name, followed by a list of group_name -> revision, followed by a list of orphaned policies" do
356
+ expected_output = <<-OUTPUT
357
+ appserver
358
+ =========
359
+
360
+ * dev: 1111111111
361
+ * staging: 2222222222
362
+ * prod: 2222222222
363
+
364
+ Orphaned:
365
+ ---------
366
+
367
+ * 3333333333
368
+
369
+ load-balancer
370
+ =============
371
+
372
+ * dev: 5555555555
373
+ * staging: 5555555555
374
+ * prod: 6666666666
375
+
376
+ Orphaned:
377
+ ---------
378
+
379
+ * 7777777777
380
+
381
+ db
382
+ ==
383
+
384
+ * dev: 9999999999
385
+ * staging: 9999999999
386
+ * prod: aaaaaaaaaa
387
+
388
+ Orphaned:
389
+ ---------
390
+
391
+ * bbbbbbbbbb
392
+
393
+ OUTPUT
394
+ expect(ui.output).to eq(expected_output)
395
+ end
396
+
397
+ end
398
+ end
399
+
400
+ context "when some groups do not have a revision of every policy" do
401
+ let(:policies_by_name) do
402
+ {
403
+ "appserver" => {
404
+ "1111111111111111111111111111111111111111111111111111111111111111" => {},
405
+ "2222222222222222222222222222222222222222222222222222222222222222" => {},
406
+ },
407
+ "load-balancer" => {
408
+ "5555555555555555555555555555555555555555555555555555555555555555" => {},
409
+ "6666666666666666666666666666666666666666666666666666666666666666" => {},
410
+ },
411
+ "db" => {
412
+ "9999999999999999999999999999999999999999999999999999999999999999" => {},
413
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" => {},
414
+ },
415
+ "memcache" => {
416
+ "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd" => {},
417
+ },
418
+ }
419
+ end
420
+
421
+ let(:policies_by_group) do
422
+ {
423
+ "dev" => {
424
+ "appserver" => "1111111111111111111111111111111111111111111111111111111111111111",
425
+ "load-balancer" => "5555555555555555555555555555555555555555555555555555555555555555",
426
+ "db" => "9999999999999999999999999999999999999999999999999999999999999999",
427
+ "memcache" => "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
428
+ },
429
+ "staging" => {
430
+ "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
431
+ "load-balancer" => "5555555555555555555555555555555555555555555555555555555555555555",
432
+ "db" => "9999999999999999999999999999999999999999999999999999999999999999",
433
+ "memcache" => "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
434
+ },
435
+ "prod" => {
436
+ "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
437
+ "load-balancer" => "6666666666666666666666666666666666666666666666666666666666666666",
438
+ "db" => "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
439
+ },
440
+ }
441
+ end
442
+
443
+ it "shows each policy name, followed by a list of group_name -> revision, omitting groups that don't have that policy" do
444
+ expected_output = <<-OUTPUT
445
+ appserver
446
+ =========
447
+
448
+ * dev: 1111111111
449
+ * staging: 2222222222
450
+ * prod: 2222222222
451
+
452
+ load-balancer
453
+ =============
454
+
455
+ * dev: 5555555555
456
+ * staging: 5555555555
457
+ * prod: 6666666666
458
+
459
+ db
460
+ ==
461
+
462
+ * dev: 9999999999
463
+ * staging: 9999999999
464
+ * prod: aaaaaaaaaa
465
+
466
+ memcache
467
+ ========
468
+
469
+ * dev: dddddddddd
470
+ * staging: dddddddddd
471
+ * prod: *NOT APPLIED*
472
+
473
+ OUTPUT
474
+ expect(ui.output).to eq(expected_output)
475
+ end
476
+
477
+ end
478
+ end
479
+ end
480
+
481
+ describe "showing a single policy" do
482
+
483
+ let(:policy_name) { "appserver" }
484
+
485
+ let(:policies_by_name) { {} }
486
+ let(:policies_by_group) { {} }
487
+
488
+ before do
489
+ policy_lister.set!(policies_by_name, policies_by_group)
490
+ end
491
+
492
+ context "when the server returns the data successfully" do
493
+
494
+ before do
495
+ policy_lister.set!(policies_by_name, policies_by_group)
496
+ policy_lister.policy_lock_content = policyfile_locks_content
497
+
498
+ show_policy_service.run
499
+ end
500
+
501
+ context "when there are no policies or groups on the server" do
502
+
503
+ let(:policies_by_name) do
504
+ {}
505
+ end
506
+
507
+ let(:policies_by_group) do
508
+ {}
509
+ end
510
+
511
+ it "prints a message to stderr that there are no copies of the policy on the server" do
512
+ expected_output = <<-OUTPUT
513
+ appserver
514
+ =========
515
+
516
+ No policies named 'appserver' are associated with a policy group
517
+
518
+ OUTPUT
519
+
520
+ expect(ui.output).to eq(expected_output)
521
+ end
522
+ end
523
+
524
+ context "when there are no revisions of the policy on the server" do
525
+
526
+ let(:policies_by_name) do
527
+ {
528
+ "load-balancer" => {
529
+ "5555555555555555555555555555555555555555555555555555555555555555" => {},
530
+ "6666666666666666666666666666666666666666666666666666666666666666" => {},
531
+ },
532
+ "db" => {
533
+ "9999999999999999999999999999999999999999999999999999999999999999" => {},
534
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" => {},
535
+ },
536
+ "memcache" => {
537
+ "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd" => {},
538
+ },
539
+ }
540
+ end
541
+
542
+ let(:policies_by_group) do
543
+ {
544
+ "dev" => {
545
+ "load-balancer" => "5555555555555555555555555555555555555555555555555555555555555555",
546
+ "db" => "9999999999999999999999999999999999999999999999999999999999999999",
547
+ "memcache" => "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
548
+ },
549
+ "staging" => {
550
+ "load-balancer" => "5555555555555555555555555555555555555555555555555555555555555555",
551
+ "db" => "9999999999999999999999999999999999999999999999999999999999999999",
552
+ "memcache" => "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
553
+ },
554
+ "prod" => {
555
+ "load-balancer" => "6666666666666666666666666666666666666666666666666666666666666666",
556
+ "db" => "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
557
+ },
558
+ }
559
+ end
560
+
561
+ it "prints a message to stderr that there are no copies of the policy on the server" do
562
+ expected_output = <<-OUTPUT
563
+ appserver
564
+ =========
565
+
566
+ No policies named 'appserver' are associated with a policy group
567
+
568
+ OUTPUT
569
+
570
+ expect(ui.output).to eq(expected_output)
571
+ end
572
+
573
+ end
574
+
575
+ context "when all policies are orphaned and orphans are not shown" do
576
+ let(:policies_by_name) do
577
+ {
578
+ "appserver" => {
579
+ "1111111111111111111111111111111111111111111111111111111111111111" => {},
580
+ "2222222222222222222222222222222222222222222222222222222222222222" => {},
581
+ "3333333333333333333333333333333333333333333333333333333333333333" => {},
582
+ },
583
+ }
584
+
585
+ end
586
+
587
+ let(:policies_by_group) do
588
+ {}
589
+ end
590
+
591
+ it "explains that no policies are assigned to a group" do
592
+ expected_output = <<-OUTPUT
593
+ appserver
594
+ =========
595
+
596
+ No policies named 'appserver' are associated with a policy group
597
+
598
+ OUTPUT
599
+
600
+ expect(ui.output).to eq(expected_output)
601
+ end
602
+ end
603
+
604
+ context "when all policy groups have the same revision of the policy" do
605
+
606
+ let(:policies_by_name) do
607
+ {
608
+ "appserver" => {
609
+ "1111111111111111111111111111111111111111111111111111111111111111" => {},
610
+ "2222222222222222222222222222222222222222222222222222222222222222" => {},
611
+ "3333333333333333333333333333333333333333333333333333333333333333" => {},
612
+ },
613
+ }
614
+
615
+ end
616
+
617
+ let(:policies_by_group) do
618
+ {
619
+ "dev" => {
620
+ "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
621
+ },
622
+ "staging" => {
623
+ "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
624
+ },
625
+ "prod" => {
626
+ "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
627
+ },
628
+ }
629
+ end
630
+ it "lists each of the groups with the associated revision" do
631
+ expected_output = <<-OUTPUT
632
+ appserver
633
+ =========
634
+
635
+ * dev: 2222222222
636
+ * staging: 2222222222
637
+ * prod: 2222222222
638
+
639
+ OUTPUT
640
+ expect(ui.output).to eq(expected_output)
641
+ end
642
+
643
+ end
644
+
645
+ context "when policy groups have revisions with differing cookbooks" do
646
+
647
+ let(:policies_by_name) do
648
+ {
649
+ "appserver" => {
650
+ "1111111111111111111111111111111111111111111111111111111111111111" => {},
651
+ "2222222222222222222222222222222222222222222222222222222222222222" => {},
652
+ "3333333333333333333333333333333333333333333333333333333333333333" => {},
653
+ },
654
+ }
655
+
656
+ end
657
+
658
+ let(:policies_by_group) do
659
+ {
660
+ "dev" => {
661
+ "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
662
+ },
663
+ "staging" => {
664
+ "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
665
+ },
666
+ "prod" => {
667
+ "appserver" => "1111111111111111111111111111111111111111111111111111111111111111",
668
+ },
669
+ }
670
+ end
671
+
672
+ it "lists each of the groups with the associated revision" do
673
+ expected_output = <<-OUTPUT
674
+ appserver
675
+ =========
676
+
677
+ * dev: 2222222222
678
+ * staging: 2222222222
679
+ * prod: 1111111111
680
+
681
+ OUTPUT
682
+ expect(ui.output).to eq(expected_output)
683
+ end
684
+
685
+ context "when the diff summary option is given" do
686
+
687
+ let(:appserver_lock_contents_111) do
688
+ {
689
+ "cookbook_locks" => {
690
+ "apache2" => {
691
+ "version" => "2.1.3",
692
+ "identifier" => "abcdef" + ("0" * 34),
693
+ },
694
+ "yum" => {
695
+ "version" => "4.5.6",
696
+ "identifier" => "123abc" + ("0" * 34),
697
+ },
698
+ "apt" => {
699
+ "version" => "10.0.0",
700
+ "identifier" => "ffffff" + ("0" * 34),
701
+ },
702
+
703
+ },
704
+ }
705
+ end
706
+
707
+ let(:appserver_lock_contents_222) do
708
+ {
709
+ "cookbook_locks" => {
710
+ "apache2" => {
711
+ "version" => "2.0.5",
712
+ "identifier" => "aaa123" + ("0" * 34),
713
+ },
714
+ "yum" => {
715
+ "version" => "4.5.2",
716
+ "identifier" => "867530" + ("9" * 34),
717
+ },
718
+ "apt" => {
719
+ "version" => "10.0.0",
720
+ "identifier" => "ffffff" + ("0" * 34),
721
+ },
722
+ "other_cookbook" => {
723
+ "version" => "9.8.7",
724
+ "identifier" => "113113" + ("0" * 34),
725
+ },
726
+ },
727
+ }
728
+ end
729
+
730
+ let(:policyfile_locks_content) do
731
+ {
732
+ "appserver" => {
733
+ "1111111111111111111111111111111111111111111111111111111111111111" => appserver_lock_contents_111,
734
+ "2222222222222222222222222222222222222222222222222222222222222222" => appserver_lock_contents_222,
735
+ },
736
+ }
737
+ end
738
+
739
+ let(:summary_diff) { true }
740
+
741
+ it "lists each of the groups and displays the version and identifier of the differing cookbooks" do
742
+ expected_output = <<-OUTPUT
743
+ appserver
744
+ =========
745
+
746
+ dev: 2222222222
747
+ -------------------
748
+
749
+ * apache2: 2.0.5 (aaa1230000)
750
+ * yum: 4.5.2 (8675309999)
751
+ * other_cookbook: 9.8.7 (1131130000)
752
+
753
+ staging: 2222222222
754
+ -------------------
755
+
756
+ * apache2: 2.0.5 (aaa1230000)
757
+ * yum: 4.5.2 (8675309999)
758
+ * other_cookbook: 9.8.7 (1131130000)
759
+
760
+ prod: 1111111111
761
+ -------------------
762
+
763
+ * apache2: 2.1.3 (abcdef0000)
764
+ * yum: 4.5.6 (123abc0000)
765
+ * other_cookbook: *NONE*
766
+
767
+ OUTPUT
768
+ expect(ui.output).to eq(expected_output)
769
+ end
770
+ end
771
+
772
+ context "when orphans are displayed" do
773
+
774
+ let(:show_orphans) { true }
775
+
776
+ it "lists each of the groups, then lists the orphaned revisions" do
777
+ expected_output = <<-OUTPUT
778
+ appserver
779
+ =========
780
+
781
+ * dev: 2222222222
782
+ * staging: 2222222222
783
+ * prod: 1111111111
784
+
785
+ Orphaned:
786
+ ---------
787
+
788
+ * 3333333333
789
+
790
+ OUTPUT
791
+
792
+ expect(ui.output).to eq(expected_output)
793
+ end
794
+
795
+ end
796
+ end
797
+
798
+ end
799
+ end # showing a single policy
800
+
801
+ describe "show policy in a specific policy group" do
802
+
803
+ let(:policy_name) { "appserver" }
804
+
805
+ let(:policy_group) { "dev" }
806
+
807
+ let(:http_client) { instance_double("Chef::ServerAPI", url: "https://chef.example/organizations/monkeynews") }
808
+
809
+ before do
810
+ allow(show_policy_service).to receive(:http_client).and_return(http_client)
811
+ end
812
+
813
+ it "enables show_policy_revision" do
814
+ expect(show_policy_service.show_policy_revision?).to be(true)
815
+ end
816
+
817
+ context "when there is no policy assigned for the given name and group" do
818
+
819
+ let(:response) do
820
+ Net::HTTPResponse.send(:response_class, "404").new("1.0", "404", "Not Found").tap do |r|
821
+ r.instance_variable_set(:@body, "nope")
822
+ end
823
+ end
824
+
825
+ let(:http_exception) do
826
+ begin
827
+ response.error!
828
+ rescue => e
829
+ e
830
+ end
831
+ end
832
+
833
+ before do
834
+ expect(http_client).to receive(:get).with("policy_groups/dev/policies/appserver").and_raise(http_exception)
835
+ end
836
+
837
+ it "prints a message saying there is no policy assigned" do
838
+ message = "No policyfile lock named 'appserver' found in policy_group 'dev' at https://chef.example/organizations/monkeynews"
839
+ expect { show_policy_service.run }.to raise_error(ChefDK::PolicyfileDownloadError, message)
840
+ end
841
+
842
+ end
843
+
844
+ context "when the policy exists" do
845
+
846
+ let(:policyfile_lock_data) do
847
+ {
848
+ "revision_id" => "cf5b8a020bdc1ba6914093a8a07a5514cce8a3a2979a967b1f32ea704a61785b",
849
+ "name" => "example",
850
+ "run_list" => [ "recipe[omnibus::default]" ],
851
+ "cookbook_locks" => {
852
+ "omnibus" => {
853
+ "version" => "2.2.0",
854
+ "identifier" => "64b3e64306cff223206348e46af545b19032b170",
855
+ "dotted_decimal_identifier" => "28345299219435506.9887234981653237.76628930769264",
856
+ "cache_key" => "omnibus-2cf98f9797cacce9c8688fc4e74858b858e2bc14",
857
+ "origin" => "git@github.com:opscode-cookbooks/omnibus.git",
858
+ "source_options" => {
859
+ "git" => "git@github.com:opscode-cookbooks/omnibus.git",
860
+ "revision" => "2cf98f9797cacce9c8688fc4e74858b858e2bc14",
861
+ "branch" => "master",
862
+ },
863
+ },
864
+ },
865
+ }
866
+ end
867
+
868
+ let(:policyfile_lock_json) { FFI_Yajl::Encoder.encode(policyfile_lock_data, pretty: true) }
869
+
870
+ let(:pager) { instance_double("ChefDK::Pager", ui: ui) }
871
+
872
+ before do
873
+ allow(ChefDK::Pager).to receive(:new).and_return(pager)
874
+ allow(pager).to receive(:with_pager).and_yield(pager)
875
+ allow(http_client).to receive(:get).with("policy_groups/dev/policies/appserver").and_return(policyfile_lock_data)
876
+ end
877
+
878
+ it "displays the policy" do
879
+ show_policy_service.run
880
+ expect(ui.output).to include(policyfile_lock_json)
881
+ end
882
+
883
+ end
884
+
885
+ end
886
+
887
+ end