chef-cli 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (372) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +32 -0
  3. data/LICENSE +201 -0
  4. data/Rakefile +70 -0
  5. data/bin/chef +25 -0
  6. data/chef-cli.gemspec +53 -0
  7. data/lib/chef-cli.rb +19 -0
  8. data/lib/chef-cli/authenticated_http.rb +22 -0
  9. data/lib/chef-cli/builtin_commands.rb +62 -0
  10. data/lib/chef-cli/chef_runner.rb +114 -0
  11. data/lib/chef-cli/chef_server_api_multi.rb +73 -0
  12. data/lib/chef-cli/cli.rb +206 -0
  13. data/lib/chef-cli/command/base.rb +89 -0
  14. data/lib/chef-cli/command/clean_policy_cookbooks.rb +115 -0
  15. data/lib/chef-cli/command/clean_policy_revisions.rb +112 -0
  16. data/lib/chef-cli/command/delete_policy.rb +121 -0
  17. data/lib/chef-cli/command/delete_policy_group.rb +121 -0
  18. data/lib/chef-cli/command/describe_cookbook.rb +98 -0
  19. data/lib/chef-cli/command/diff.rb +316 -0
  20. data/lib/chef-cli/command/env.rb +99 -0
  21. data/lib/chef-cli/command/exec.rb +45 -0
  22. data/lib/chef-cli/command/export.rb +156 -0
  23. data/lib/chef-cli/command/gem.rb +48 -0
  24. data/lib/chef-cli/command/generate.rb +123 -0
  25. data/lib/chef-cli/command/generator_commands.rb +83 -0
  26. data/lib/chef-cli/command/generator_commands/attribute.rb +37 -0
  27. data/lib/chef-cli/command/generator_commands/base.rb +157 -0
  28. data/lib/chef-cli/command/generator_commands/build_cookbook.rb +126 -0
  29. data/lib/chef-cli/command/generator_commands/chef_exts/generator_desc_resource.rb +40 -0
  30. data/lib/chef-cli/command/generator_commands/chef_exts/quieter_doc_formatter.rb +38 -0
  31. data/lib/chef-cli/command/generator_commands/chef_exts/recipe_dsl_ext.rb +39 -0
  32. data/lib/chef-cli/command/generator_commands/cookbook.rb +251 -0
  33. data/lib/chef-cli/command/generator_commands/cookbook_code_file.rb +100 -0
  34. data/lib/chef-cli/command/generator_commands/cookbook_file.rb +46 -0
  35. data/lib/chef-cli/command/generator_commands/generator_generator.rb +175 -0
  36. data/lib/chef-cli/command/generator_commands/helpers.rb +37 -0
  37. data/lib/chef-cli/command/generator_commands/policyfile.rb +125 -0
  38. data/lib/chef-cli/command/generator_commands/recipe.rb +37 -0
  39. data/lib/chef-cli/command/generator_commands/repo.rb +140 -0
  40. data/lib/chef-cli/command/generator_commands/resource.rb +37 -0
  41. data/lib/chef-cli/command/generator_commands/template.rb +47 -0
  42. data/lib/chef-cli/command/install.rb +121 -0
  43. data/lib/chef-cli/command/provision.rb +38 -0
  44. data/lib/chef-cli/command/push.rb +118 -0
  45. data/lib/chef-cli/command/push_archive.rb +126 -0
  46. data/lib/chef-cli/command/shell_init.rb +185 -0
  47. data/lib/chef-cli/command/show_policy.rb +164 -0
  48. data/lib/chef-cli/command/undelete.rb +155 -0
  49. data/lib/chef-cli/command/update.rb +140 -0
  50. data/lib/chef-cli/command/verify.rb +548 -0
  51. data/lib/chef-cli/commands_map.rb +113 -0
  52. data/lib/chef-cli/completions/bash.sh.erb +5 -0
  53. data/lib/chef-cli/completions/chef.fish.erb +10 -0
  54. data/lib/chef-cli/completions/zsh.zsh.erb +21 -0
  55. data/lib/chef-cli/component_test.rb +226 -0
  56. data/lib/chef-cli/configurable.rb +88 -0
  57. data/lib/chef-cli/cookbook_metadata.rb +45 -0
  58. data/lib/chef-cli/cookbook_omnifetch.rb +32 -0
  59. data/lib/chef-cli/cookbook_profiler/git.rb +152 -0
  60. data/lib/chef-cli/cookbook_profiler/identifiers.rb +72 -0
  61. data/lib/chef-cli/cookbook_profiler/null_scm.rb +31 -0
  62. data/lib/chef-cli/dist.rb +31 -0
  63. data/lib/chef-cli/exceptions.rb +153 -0
  64. data/lib/chef-cli/generator.rb +165 -0
  65. data/lib/chef-cli/helpers.rb +170 -0
  66. data/lib/chef-cli/pager.rb +104 -0
  67. data/lib/chef-cli/policyfile/artifactory_cookbook_source.rb +102 -0
  68. data/lib/chef-cli/policyfile/attribute_merge_checker.rb +110 -0
  69. data/lib/chef-cli/policyfile/chef_repo_cookbook_source.rb +138 -0
  70. data/lib/chef-cli/policyfile/chef_server_cookbook_source.rb +99 -0
  71. data/lib/chef-cli/policyfile/chef_server_lock_fetcher.rb +167 -0
  72. data/lib/chef-cli/policyfile/community_cookbook_source.rb +95 -0
  73. data/lib/chef-cli/policyfile/comparison_base.rb +123 -0
  74. data/lib/chef-cli/policyfile/cookbook_location_specification.rb +154 -0
  75. data/lib/chef-cli/policyfile/cookbook_locks.rb +466 -0
  76. data/lib/chef-cli/policyfile/cookbook_sources.rb +23 -0
  77. data/lib/chef-cli/policyfile/delivery_supermarket_source.rb +89 -0
  78. data/lib/chef-cli/policyfile/differ.rb +263 -0
  79. data/lib/chef-cli/policyfile/dsl.rb +288 -0
  80. data/lib/chef-cli/policyfile/git_lock_fetcher.rb +265 -0
  81. data/lib/chef-cli/policyfile/included_policies_cookbook_source.rb +156 -0
  82. data/lib/chef-cli/policyfile/lister.rb +229 -0
  83. data/lib/chef-cli/policyfile/local_lock_fetcher.rb +132 -0
  84. data/lib/chef-cli/policyfile/lock_applier.rb +80 -0
  85. data/lib/chef-cli/policyfile/lock_fetcher_mixin.rb +37 -0
  86. data/lib/chef-cli/policyfile/null_cookbook_source.rb +49 -0
  87. data/lib/chef-cli/policyfile/policyfile_location_specification.rb +128 -0
  88. data/lib/chef-cli/policyfile/read_cookbook_for_compat_mode_upload.rb +124 -0
  89. data/lib/chef-cli/policyfile/remote_lock_fetcher.rb +108 -0
  90. data/lib/chef-cli/policyfile/reports/install.rb +69 -0
  91. data/lib/chef-cli/policyfile/reports/table_printer.rb +57 -0
  92. data/lib/chef-cli/policyfile/reports/upload.rb +70 -0
  93. data/lib/chef-cli/policyfile/solution_dependencies.rb +311 -0
  94. data/lib/chef-cli/policyfile/source_uri.rb +57 -0
  95. data/lib/chef-cli/policyfile/storage_config.rb +112 -0
  96. data/lib/chef-cli/policyfile/undo_record.rb +139 -0
  97. data/lib/chef-cli/policyfile/undo_stack.rb +128 -0
  98. data/lib/chef-cli/policyfile/uploader.rb +222 -0
  99. data/lib/chef-cli/policyfile_compiler.rb +528 -0
  100. data/lib/chef-cli/policyfile_lock.rb +581 -0
  101. data/lib/chef-cli/policyfile_services/clean_policies.rb +95 -0
  102. data/lib/chef-cli/policyfile_services/clean_policy_cookbooks.rb +123 -0
  103. data/lib/chef-cli/policyfile_services/export_repo.rb +419 -0
  104. data/lib/chef-cli/policyfile_services/install.rb +167 -0
  105. data/lib/chef-cli/policyfile_services/push.rb +112 -0
  106. data/lib/chef-cli/policyfile_services/push_archive.rb +164 -0
  107. data/lib/chef-cli/policyfile_services/rm_policy.rb +141 -0
  108. data/lib/chef-cli/policyfile_services/rm_policy_group.rb +85 -0
  109. data/lib/chef-cli/policyfile_services/show_policy.rb +234 -0
  110. data/lib/chef-cli/policyfile_services/undelete.rb +108 -0
  111. data/lib/chef-cli/policyfile_services/update_attributes.rb +110 -0
  112. data/lib/chef-cli/service_exception_inspectors.rb +24 -0
  113. data/lib/chef-cli/service_exception_inspectors/base.rb +39 -0
  114. data/lib/chef-cli/service_exception_inspectors/http.rb +119 -0
  115. data/lib/chef-cli/service_exceptions.rb +142 -0
  116. data/lib/chef-cli/shell_out.rb +36 -0
  117. data/lib/chef-cli/skeletons/code_generator/files/default/Berksfile +3 -0
  118. data/lib/chef-cli/skeletons/code_generator/files/default/build_cookbook/README.md +146 -0
  119. data/lib/chef-cli/skeletons/code_generator/files/default/build_cookbook/kitchen.yml +21 -0
  120. data/lib/chef-cli/skeletons/code_generator/files/default/build_cookbook/test-fixture-recipe.rb +8 -0
  121. data/lib/chef-cli/skeletons/code_generator/files/default/chefignore +110 -0
  122. data/lib/chef-cli/skeletons/code_generator/files/default/cookbook_readmes/README-policy.md +9 -0
  123. data/lib/chef-cli/skeletons/code_generator/files/default/cookbook_readmes/README.md +66 -0
  124. data/lib/chef-cli/skeletons/code_generator/files/default/delivery-config.json +17 -0
  125. data/lib/chef-cli/skeletons/code_generator/files/default/delivery-project.toml +34 -0
  126. data/lib/chef-cli/skeletons/code_generator/files/default/gitignore +22 -0
  127. data/lib/chef-cli/skeletons/code_generator/files/default/repo/README.md +20 -0
  128. data/lib/chef-cli/skeletons/code_generator/files/default/repo/cookbooks/example/README.md +27 -0
  129. data/lib/chef-cli/skeletons/code_generator/files/default/repo/cookbooks/example/attributes/default.rb +7 -0
  130. data/lib/chef-cli/skeletons/code_generator/files/default/repo/cookbooks/example/metadata.rb +6 -0
  131. data/lib/chef-cli/skeletons/code_generator/files/default/repo/cookbooks/example/recipes/default.rb +8 -0
  132. data/lib/chef-cli/skeletons/code_generator/files/default/repo/data_bags/README.md +56 -0
  133. data/lib/chef-cli/skeletons/code_generator/files/default/repo/data_bags/example/example_item.json +4 -0
  134. data/lib/chef-cli/skeletons/code_generator/files/default/repo/dot-chef-repo.txt +6 -0
  135. data/lib/chef-cli/skeletons/code_generator/files/default/repo/environments/README.md +9 -0
  136. data/lib/chef-cli/skeletons/code_generator/files/default/repo/environments/example.json +13 -0
  137. data/lib/chef-cli/skeletons/code_generator/files/default/repo/policyfiles/README.md +24 -0
  138. data/lib/chef-cli/skeletons/code_generator/files/default/repo/roles/README.md +9 -0
  139. data/lib/chef-cli/skeletons/code_generator/files/default/repo/roles/example.json +13 -0
  140. data/lib/chef-cli/skeletons/code_generator/files/default/spec_helper.rb +2 -0
  141. data/lib/chef-cli/skeletons/code_generator/files/default/spec_helper_policyfile.rb +2 -0
  142. data/lib/chef-cli/skeletons/code_generator/metadata.rb +8 -0
  143. data/lib/chef-cli/skeletons/code_generator/recipes/attribute.rb +11 -0
  144. data/lib/chef-cli/skeletons/code_generator/recipes/build_cookbook.rb +175 -0
  145. data/lib/chef-cli/skeletons/code_generator/recipes/cookbook.rb +167 -0
  146. data/lib/chef-cli/skeletons/code_generator/recipes/cookbook_file.rb +23 -0
  147. data/lib/chef-cli/skeletons/code_generator/recipes/helpers.rb +19 -0
  148. data/lib/chef-cli/skeletons/code_generator/recipes/policyfile.rb +7 -0
  149. data/lib/chef-cli/skeletons/code_generator/recipes/recipe.rb +50 -0
  150. data/lib/chef-cli/skeletons/code_generator/recipes/repo.rb +71 -0
  151. data/lib/chef-cli/skeletons/code_generator/recipes/resource.rb +12 -0
  152. data/lib/chef-cli/skeletons/code_generator/recipes/template.rb +31 -0
  153. data/lib/chef-cli/skeletons/code_generator/templates/default/CHANGELOG.md.erb +11 -0
  154. data/lib/chef-cli/skeletons/code_generator/templates/default/LICENSE.all_rights.erb +3 -0
  155. data/lib/chef-cli/skeletons/code_generator/templates/default/LICENSE.apachev2.erb +201 -0
  156. data/lib/chef-cli/skeletons/code_generator/templates/default/LICENSE.gplv2.erb +339 -0
  157. data/lib/chef-cli/skeletons/code_generator/templates/default/LICENSE.gplv3.erb +674 -0
  158. data/lib/chef-cli/skeletons/code_generator/templates/default/LICENSE.mit.erb +21 -0
  159. data/lib/chef-cli/skeletons/code_generator/templates/default/Policyfile.rb.erb +25 -0
  160. data/lib/chef-cli/skeletons/code_generator/templates/default/README.md.erb +4 -0
  161. data/lib/chef-cli/skeletons/code_generator/templates/default/attribute.rb.erb +0 -0
  162. data/lib/chef-cli/skeletons/code_generator/templates/default/build_cookbook/Berksfile.erb +7 -0
  163. data/lib/chef-cli/skeletons/code_generator/templates/default/build_cookbook/metadata.rb.erb +10 -0
  164. data/lib/chef-cli/skeletons/code_generator/templates/default/build_cookbook/recipe.rb.erb +9 -0
  165. data/lib/chef-cli/skeletons/code_generator/templates/default/cookbook_file.erb +0 -0
  166. data/lib/chef-cli/skeletons/code_generator/templates/default/helpers.rb.erb +39 -0
  167. data/lib/chef-cli/skeletons/code_generator/templates/default/inspec_default_test.rb.erb +16 -0
  168. data/lib/chef-cli/skeletons/code_generator/templates/default/kitchen.yml.erb +38 -0
  169. data/lib/chef-cli/skeletons/code_generator/templates/default/kitchen_dokken.yml.erb +36 -0
  170. data/lib/chef-cli/skeletons/code_generator/templates/default/kitchen_policyfile.yml.erb +32 -0
  171. data/lib/chef-cli/skeletons/code_generator/templates/default/metadata.rb.erb +20 -0
  172. data/lib/chef-cli/skeletons/code_generator/templates/default/recipe.rb.erb +5 -0
  173. data/lib/chef-cli/skeletons/code_generator/templates/default/recipe_spec.rb.erb +29 -0
  174. data/lib/chef-cli/skeletons/code_generator/templates/default/repo/gitignore.erb +128 -0
  175. data/lib/chef-cli/skeletons/code_generator/templates/default/resource.rb.erb +1 -0
  176. data/lib/chef-cli/skeletons/code_generator/templates/default/template.erb +0 -0
  177. data/lib/chef-cli/ui.rb +57 -0
  178. data/lib/chef-cli/version.rb +20 -0
  179. data/lib/kitchen/provisioner/policyfile_zero.rb +195 -0
  180. data/spec/shared/a_file_generator.rb +125 -0
  181. data/spec/shared/a_generated_file.rb +12 -0
  182. data/spec/shared/command_with_ui_object.rb +11 -0
  183. data/spec/shared/custom_generator_cookbook.rb +136 -0
  184. data/spec/shared/fixture_cookbook_checksums.rb +46 -0
  185. data/spec/shared/setup_git_committer_config.rb +54 -0
  186. data/spec/shared/setup_git_cookbooks.rb +53 -0
  187. data/spec/spec_helper.rb +51 -0
  188. data/spec/test_helpers.rb +84 -0
  189. data/spec/unit/chef_runner_spec.rb +139 -0
  190. data/spec/unit/chef_server_api_multi_spec.rb +120 -0
  191. data/spec/unit/cli_spec.rb +375 -0
  192. data/spec/unit/command/base_spec.rb +195 -0
  193. data/spec/unit/command/clean_policy_cookbooks_spec.rb +180 -0
  194. data/spec/unit/command/clean_policy_revisions_spec.rb +180 -0
  195. data/spec/unit/command/delete_policy_group_spec.rb +206 -0
  196. data/spec/unit/command/delete_policy_spec.rb +206 -0
  197. data/spec/unit/command/diff_spec.rb +311 -0
  198. data/spec/unit/command/env_spec.rb +86 -0
  199. data/spec/unit/command/exec_spec.rb +178 -0
  200. data/spec/unit/command/export_spec.rb +199 -0
  201. data/spec/unit/command/generate_spec.rb +142 -0
  202. data/spec/unit/command/generator_commands/attribute_spec.rb +31 -0
  203. data/spec/unit/command/generator_commands/base_spec.rb +180 -0
  204. data/spec/unit/command/generator_commands/build_cookbook_spec.rb +377 -0
  205. data/spec/unit/command/generator_commands/chef_exts/generator_desc_resource_spec.rb +77 -0
  206. data/spec/unit/command/generator_commands/chef_exts/recipe_dsl_ext_spec.rb +111 -0
  207. data/spec/unit/command/generator_commands/cookbook_file_spec.rb +31 -0
  208. data/spec/unit/command/generator_commands/cookbook_spec.rb +769 -0
  209. data/spec/unit/command/generator_commands/generator_generator_spec.rb +227 -0
  210. data/spec/unit/command/generator_commands/helpers_spec.rb +31 -0
  211. data/spec/unit/command/generator_commands/policyfile_spec.rb +223 -0
  212. data/spec/unit/command/generator_commands/recipe_spec.rb +37 -0
  213. data/spec/unit/command/generator_commands/repo_spec.rb +374 -0
  214. data/spec/unit/command/generator_commands/resource_spec.rb +31 -0
  215. data/spec/unit/command/generator_commands/template_spec.rb +31 -0
  216. data/spec/unit/command/install_spec.rb +179 -0
  217. data/spec/unit/command/push_archive_spec.rb +153 -0
  218. data/spec/unit/command/push_spec.rb +198 -0
  219. data/spec/unit/command/shell_init_spec.rb +339 -0
  220. data/spec/unit/command/show_policy_spec.rb +234 -0
  221. data/spec/unit/command/undelete_spec.rb +244 -0
  222. data/spec/unit/command/update_spec.rb +283 -0
  223. data/spec/unit/command/verify_spec.rb +341 -0
  224. data/spec/unit/commands_map_spec.rb +57 -0
  225. data/spec/unit/component_test_spec.rb +128 -0
  226. data/spec/unit/configurable_spec.rb +68 -0
  227. data/spec/unit/cookbook_metadata_spec.rb +96 -0
  228. data/spec/unit/cookbook_profiler/git_spec.rb +176 -0
  229. data/spec/unit/cookbook_profiler/identifiers_spec.rb +81 -0
  230. data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_one.rb +9 -0
  231. data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_two.rb +9 -0
  232. data/spec/unit/fixtures/command/cli_test_command.rb +26 -0
  233. data/spec/unit/fixtures/command/explicit_path_example.rb +7 -0
  234. data/spec/unit/fixtures/configurable/test_config_loader.rb +5 -0
  235. data/spec/unit/fixtures/configurable/test_configurable.rb +10 -0
  236. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -0
  237. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/Berksfile +3 -0
  238. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -0
  239. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/chefignore +96 -0
  240. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -0
  241. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -0
  242. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/.kitchen.yml +16 -0
  243. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/Berksfile +3 -0
  244. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/README.md +4 -0
  245. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/chefignore +96 -0
  246. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/metadata.rb +8 -0
  247. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/recipes/default.rb +8 -0
  248. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/Berksfile +3 -0
  249. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/README.md +4 -0
  250. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/chefignore +96 -0
  251. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/kitchen.yml +16 -0
  252. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/metadata.rb +8 -0
  253. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/recipes/default.rb +8 -0
  254. data/spec/unit/fixtures/cookbooks_api/chef_server_universe.json +56 -0
  255. data/spec/unit/fixtures/cookbooks_api/pruned_chef_server_universe.json +30 -0
  256. data/spec/unit/fixtures/cookbooks_api/pruned_small_universe.json +1322 -0
  257. data/spec/unit/fixtures/cookbooks_api/small_universe.json +2987 -0
  258. data/spec/unit/fixtures/cookbooks_api/universe.json +1 -0
  259. data/spec/unit/fixtures/cookbooks_api/update_fixtures.rb +33 -0
  260. data/spec/unit/fixtures/dev_cookbooks/README.md +16 -0
  261. data/spec/unit/fixtures/dev_cookbooks/bar-cookbook.gitbundle +0 -0
  262. data/spec/unit/fixtures/eg_omnibus_dir/missing_apps/bin/.keep +0 -0
  263. data/spec/unit/fixtures/eg_omnibus_dir/missing_apps/embedded/.keep +0 -0
  264. data/spec/unit/fixtures/eg_omnibus_dir/missing_apps/embedded/bin/.keep +0 -0
  265. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/bin/.keep +0 -0
  266. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/embedded/apps/berkshelf/.keep +0 -0
  267. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/embedded/apps/test-kitchen/.keep +0 -0
  268. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/embedded/bin/.keep +0 -0
  269. data/spec/unit/fixtures/eg_omnibus_dir/valid/bin/.keep +0 -0
  270. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/integration_test +2 -0
  271. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/verify_me +5 -0
  272. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/chef-dk/.keep +0 -0
  273. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/chef/verify_me +3 -0
  274. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/test-kitchen/verify_me +2 -0
  275. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/bin/.keep +0 -0
  276. data/spec/unit/fixtures/example_app/Policyfile.rb +0 -0
  277. data/spec/unit/fixtures/example_cookbook/.gitignore +17 -0
  278. data/spec/unit/fixtures/example_cookbook/.kitchen.yml +16 -0
  279. data/spec/unit/fixtures/example_cookbook/Berksfile +3 -0
  280. data/spec/unit/fixtures/example_cookbook/README.md +4 -0
  281. data/spec/unit/fixtures/example_cookbook/chefignore +96 -0
  282. data/spec/unit/fixtures/example_cookbook/metadata.rb +8 -0
  283. data/spec/unit/fixtures/example_cookbook/recipes/default.rb +8 -0
  284. data/spec/unit/fixtures/example_cookbook_metadata_json_only/.gitignore +17 -0
  285. data/spec/unit/fixtures/example_cookbook_metadata_json_only/.kitchen.yml +16 -0
  286. data/spec/unit/fixtures/example_cookbook_metadata_json_only/Berksfile +3 -0
  287. data/spec/unit/fixtures/example_cookbook_metadata_json_only/README.md +4 -0
  288. data/spec/unit/fixtures/example_cookbook_metadata_json_only/chefignore +96 -0
  289. data/spec/unit/fixtures/example_cookbook_metadata_json_only/metadata.json +5 -0
  290. data/spec/unit/fixtures/example_cookbook_metadata_json_only/recipes/default.rb +8 -0
  291. data/spec/unit/fixtures/example_cookbook_no_metadata/.gitignore +17 -0
  292. data/spec/unit/fixtures/example_cookbook_no_metadata/.kitchen.yml +16 -0
  293. data/spec/unit/fixtures/example_cookbook_no_metadata/Berksfile +3 -0
  294. data/spec/unit/fixtures/example_cookbook_no_metadata/README.md +4 -0
  295. data/spec/unit/fixtures/example_cookbook_no_metadata/chefignore +96 -0
  296. data/spec/unit/fixtures/example_cookbook_no_metadata/recipes/default.rb +8 -0
  297. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/README.md +4 -0
  298. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/chefignore +96 -0
  299. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/metadata.rb +8 -0
  300. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/recipes/default.rb +8 -0
  301. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/Berksfile +3 -0
  302. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/README.md +4 -0
  303. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/chefignore +96 -0
  304. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/metadata.rb +9 -0
  305. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/recipes/default.rb +8 -0
  306. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/.kitchen.yml +16 -0
  307. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/Berksfile +3 -0
  308. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/README.md +4 -0
  309. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/chefignore +96 -0
  310. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/extra/extra_file.txt +0 -0
  311. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/metadata.rb +8 -0
  312. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/recipes/default.rb +8 -0
  313. data/spec/unit/fixtures/local_path_cookbooks/metadata-missing/README.md +2 -0
  314. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -0
  315. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -0
  316. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -0
  317. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -0
  318. data/spec/unit/generator_spec.rb +119 -0
  319. data/spec/unit/pager_spec.rb +117 -0
  320. data/spec/unit/policyfile/artifactory_cookbook_source_spec.rb +59 -0
  321. data/spec/unit/policyfile/attribute_merge_checker_spec.rb +80 -0
  322. data/spec/unit/policyfile/chef_repo_cookbook_source_spec.rb +93 -0
  323. data/spec/unit/policyfile/chef_server_cookbook_source_spec.rb +55 -0
  324. data/spec/unit/policyfile/chef_server_lock_fetcher_spec.rb +161 -0
  325. data/spec/unit/policyfile/community_cookbook_source_spec.rb +83 -0
  326. data/spec/unit/policyfile/comparison_base_spec.rb +340 -0
  327. data/spec/unit/policyfile/cookbook_location_specification_spec.rb +347 -0
  328. data/spec/unit/policyfile/cookbook_locks_spec.rb +527 -0
  329. data/spec/unit/policyfile/delivery_supermarket_source_spec.rb +129 -0
  330. data/spec/unit/policyfile/differ_spec.rb +686 -0
  331. data/spec/unit/policyfile/git_lock_fetcher_spec.rb +155 -0
  332. data/spec/unit/policyfile/included_policies_cookbook_source_spec.rb +242 -0
  333. data/spec/unit/policyfile/lister_spec.rb +268 -0
  334. data/spec/unit/policyfile/local_lock_fetcher_spec.rb +199 -0
  335. data/spec/unit/policyfile/lock_applier_spec.rb +100 -0
  336. data/spec/unit/policyfile/lock_fetcher_mixin_spec.rb +60 -0
  337. data/spec/unit/policyfile/null_cookbook_source_spec.rb +34 -0
  338. data/spec/unit/policyfile/read_cookbook_for_compat_mode_upload_spec.rb +92 -0
  339. data/spec/unit/policyfile/remote_lock_fetcher_spec.rb +129 -0
  340. data/spec/unit/policyfile/reports/install_spec.rb +114 -0
  341. data/spec/unit/policyfile/reports/upload_spec.rb +94 -0
  342. data/spec/unit/policyfile/solution_dependencies_spec.rb +170 -0
  343. data/spec/unit/policyfile/source_uri_spec.rb +36 -0
  344. data/spec/unit/policyfile/storage_config_spec.rb +180 -0
  345. data/spec/unit/policyfile/undo_record_spec.rb +258 -0
  346. data/spec/unit/policyfile/undo_stack_spec.rb +265 -0
  347. data/spec/unit/policyfile/uploader_spec.rb +410 -0
  348. data/spec/unit/policyfile_demands_spec.rb +1197 -0
  349. data/spec/unit/policyfile_evaluation_spec.rb +628 -0
  350. data/spec/unit/policyfile_includes_dsl_spec.rb +220 -0
  351. data/spec/unit/policyfile_includes_spec.rb +720 -0
  352. data/spec/unit/policyfile_install_with_includes_spec.rb +232 -0
  353. data/spec/unit/policyfile_lock_build_spec.rb +1065 -0
  354. data/spec/unit/policyfile_lock_install_spec.rb +137 -0
  355. data/spec/unit/policyfile_lock_serialization_spec.rb +424 -0
  356. data/spec/unit/policyfile_lock_validation_spec.rb +608 -0
  357. data/spec/unit/policyfile_services/clean_policies_spec.rb +236 -0
  358. data/spec/unit/policyfile_services/clean_policy_cookbooks_spec.rb +272 -0
  359. data/spec/unit/policyfile_services/export_repo_spec.rb +473 -0
  360. data/spec/unit/policyfile_services/install_spec.rb +209 -0
  361. data/spec/unit/policyfile_services/push_archive_spec.rb +359 -0
  362. data/spec/unit/policyfile_services/push_spec.rb +249 -0
  363. data/spec/unit/policyfile_services/rm_policy_group_spec.rb +237 -0
  364. data/spec/unit/policyfile_services/rm_policy_spec.rb +263 -0
  365. data/spec/unit/policyfile_services/show_policy_spec.rb +887 -0
  366. data/spec/unit/policyfile_services/undelete_spec.rb +302 -0
  367. data/spec/unit/policyfile_services/update_attributes_spec.rb +229 -0
  368. data/spec/unit/policyfile_services/update_spec.rb +162 -0
  369. data/spec/unit/service_exception_inspectors/base_spec.rb +41 -0
  370. data/spec/unit/service_exception_inspectors/http_spec.rb +138 -0
  371. data/spec/unit/shell_out_spec.rb +34 -0
  372. metadata +796 -0
@@ -0,0 +1,77 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2016 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 "stringio"
20
+
21
+ require "chef/run_context"
22
+ require "chef/cookbook/cookbook_collection"
23
+ require "chef/node"
24
+ require "chef/event_dispatch/dispatcher"
25
+ require "chef/formatters/base"
26
+
27
+ require "ohai/system"
28
+
29
+ require "chef-cli/command/generator_commands/chef_exts/generator_desc_resource"
30
+
31
+ describe ChefCLI::ChefResource::GeneratorDesc do
32
+
33
+ let(:node) { Chef::Node.new }
34
+
35
+ let(:stdout) { StringIO.new }
36
+
37
+ let(:stderr) { StringIO.new }
38
+
39
+ let(:null_formatter) { Chef::Formatters.new(:null, stdout, stderr) }
40
+
41
+ let(:events) do
42
+ Chef::EventDispatch::Dispatcher.new.tap do |d|
43
+ d.register(null_formatter)
44
+ end
45
+ end
46
+
47
+ let(:cookbook_collection) { Chef::CookbookCollection.new }
48
+
49
+ let(:run_context) { Chef::RunContext.new(node, cookbook_collection, events) }
50
+
51
+ let(:message) { "this part of the cookbook does a thing" }
52
+
53
+ let(:resource) { described_class.new(message, run_context) }
54
+
55
+ let(:provider) { resource.provider_for_action(:write) }
56
+
57
+ describe "resource" do
58
+
59
+ it "has the message it was created with" do
60
+ expect(resource.message).to eq(message)
61
+ end
62
+
63
+ it "defaults to action :write" do
64
+ expect(resource.action).to eq( [ :write ] )
65
+ end
66
+
67
+ it "is identified by the message property" do
68
+ expect(resource.identity).to eq(message)
69
+ end
70
+
71
+ it "writes the message to the formatter" do
72
+ provider.action_write
73
+ expect(stdout.string).to include(message)
74
+ end
75
+
76
+ end
77
+ end
@@ -0,0 +1,111 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2016 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 "stringio"
20
+
21
+ require "chef/config"
22
+ require "chef/recipe"
23
+ require "chef/run_context"
24
+ require "chef/event_dispatch/dispatcher"
25
+ require "chef/policy_builder"
26
+ require "chef/formatters/doc"
27
+ require "chef/cookbook/file_vendor"
28
+ require "chef/cookbook/file_system_file_vendor"
29
+ require "chef/cookbook/cookbook_collection"
30
+ require "chef/cookbook_loader"
31
+
32
+ require "ohai/system"
33
+
34
+ require "chef-cli/command/generator_commands/chef_exts/recipe_dsl_ext"
35
+ require "chef-cli/command/generator_commands/chef_exts/quieter_doc_formatter"
36
+
37
+ describe ChefCLI::RecipeDSLExt do
38
+
39
+ before(:all) { Chef.reset! }
40
+
41
+ let(:stdout) { StringIO.new }
42
+
43
+ let(:stderr) { StringIO.new }
44
+
45
+ let(:doc_formatter) do
46
+ Chef::Formatters.new(:chefcli_doc, stdout, stderr)
47
+ end
48
+
49
+ let(:event_dispatcher) do
50
+ Chef::EventDispatch::Dispatcher.new.tap do |d|
51
+ d.register(doc_formatter)
52
+ end
53
+ end
54
+
55
+ let(:run_list) { [ ] }
56
+
57
+ let(:ohai) do
58
+ Ohai::System.new.tap do |o|
59
+ o.all_plugins(%w{platform platform_version})
60
+ end
61
+ end
62
+
63
+ let(:policy_builder) do
64
+ Chef::PolicyBuilder::Dynamic.new("chef-cli", ohai.data, {}, nil, event_dispatcher).tap do |b|
65
+ b.load_node
66
+ b.build_node
67
+ b.node.run_list(*run_list)
68
+ b.expand_run_list
69
+ end
70
+ end
71
+
72
+ # In some circumstances (not totally clear about what), compat resource gets
73
+ # loaded and it does some weird stuff to `Chef::Recipe.new` which can fail if
74
+ # you pass in a cookbook name that is bogus and not-falsey. Using `nil` for
75
+ # the cookbook name works around that.
76
+ # https://github.com/chef-cookbooks/compat_resource/blob/3d948a5a9cabccddc7cf5e48dfea796a6b557a44/files/lib/chef_compat/monkeypatches/chef/recipe.rb#L8-L15
77
+ let(:cookbook_name) { nil }
78
+
79
+ let(:recipe_name) { "example" }
80
+
81
+ let(:run_context) { policy_builder.setup_run_context }
82
+
83
+ let(:recipe) { Chef::Recipe.new(cookbook_name, recipe_name, run_context) }
84
+
85
+ before do
86
+ Chef::Config.solo_legacy_mode = true
87
+ Chef::Config.color = true
88
+ Chef::Config.diff_disabled = true
89
+ Chef::Config.use_policyfile = false
90
+ end
91
+
92
+ describe "silence_chef_formatter" do
93
+
94
+ before do
95
+ recipe.silence_chef_formatter
96
+ end
97
+
98
+ let(:formatter) { run_context.events.subscribers.first }
99
+
100
+ it "replaces the default formatter with a null formatter" do
101
+ expect(formatter).to be_a(Chef::Formatters::NullFormatter)
102
+ end
103
+
104
+ it "passes stdout and stderr from the default formatter to the new one" do
105
+ expect(formatter.output.out).to be(stdout)
106
+ expect(formatter.output.err).to be(stderr)
107
+ end
108
+
109
+ end
110
+
111
+ end
@@ -0,0 +1,31 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2014-2018 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 "shared/a_file_generator"
20
+ require "chef-cli/command/generator_commands/cookbook_file"
21
+
22
+ describe ChefCLI::Command::GeneratorCommands::CookbookFile do
23
+
24
+ include_examples "a file generator" do
25
+
26
+ let(:generator_name) { "file" }
27
+ let(:generated_files) { [ "files/new_file.txt" ] }
28
+ let(:new_file_name) { "new_file.txt" }
29
+
30
+ end
31
+ end
@@ -0,0 +1,769 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2014-2019 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 "shared/custom_generator_cookbook"
20
+ require "shared/setup_git_committer_config"
21
+ require "chef-cli/command/generator_commands/cookbook"
22
+
23
+ describe ChefCLI::Command::GeneratorCommands::Cookbook do
24
+
25
+ include_context("setup_git_committer_config")
26
+
27
+ let(:argv) { %w{new_cookbook} }
28
+
29
+ let(:stdout_io) { StringIO.new }
30
+ let(:stderr_io) { StringIO.new }
31
+
32
+ let(:expected_cookbook_file_relpaths) do
33
+ %w{
34
+ .gitignore
35
+ kitchen.yml
36
+ test
37
+ test/integration
38
+ test/integration/default/default_test.rb
39
+ Policyfile.rb
40
+ chefignore
41
+ LICENSE
42
+ metadata.rb
43
+ README.md
44
+ CHANGELOG.md
45
+ recipes
46
+ recipes/default.rb
47
+ spec
48
+ spec/spec_helper.rb
49
+ spec/unit
50
+ spec/unit/recipes
51
+ spec/unit/recipes/default_spec.rb
52
+ }
53
+ end
54
+
55
+ let(:expected_cookbook_files) do
56
+ expected_cookbook_file_relpaths.map do |relpath|
57
+ File.join(tempdir, "new_cookbook", relpath)
58
+ end
59
+ end
60
+
61
+ let(:non_delivery_breadcrumb) do
62
+ <<~EOF
63
+ Your cookbook is ready. Type `cd new_cookbook` to enter it.
64
+
65
+ There are several commands you can run to get started locally developing and testing your cookbook.
66
+ Type `delivery local --help` to see a full list of local testing commands.
67
+
68
+ Why not start by writing an InSpec test? Tests for the default recipe are stored at:
69
+
70
+ test/integration/default/default_test.rb
71
+
72
+ If you'd prefer to dive right in, the default recipe can be found at:
73
+
74
+ recipes/default.rb
75
+ EOF
76
+ end
77
+
78
+ subject(:cookbook_generator) do
79
+ g = described_class.new(argv)
80
+ allow(g).to receive(:cookbook_path_in_git_repo?).and_return(false)
81
+ allow(g).to receive(:stdout).and_return(stdout_io)
82
+ g
83
+ end
84
+
85
+ def generator_context
86
+ ChefCLI::Generator.context
87
+ end
88
+
89
+ before do
90
+ ChefCLI::Generator.reset
91
+ end
92
+
93
+ include_examples "custom generator cookbook" do
94
+
95
+ let(:generator_arg) { "new_cookbook" }
96
+
97
+ let(:generator_name) { "cookbook" }
98
+
99
+ end
100
+
101
+ it "configures the chef runner" do
102
+ expect(cookbook_generator.chef_runner).to be_a(ChefCLI::ChefRunner)
103
+ expect(cookbook_generator.chef_runner.cookbook_path).to eq(File.expand_path("lib/chef-cli/skeletons", project_root))
104
+ end
105
+
106
+ context "when given invalid/incomplete arguments" do
107
+
108
+ let(:expected_help_message) do
109
+ "Usage: chef generate cookbook NAME [options]\n"
110
+ end
111
+
112
+ def with_argv(argv)
113
+ generator = described_class.new(argv)
114
+ allow(generator).to receive(:stdout).and_return(stdout_io)
115
+ allow(generator).to receive(:stderr).and_return(stderr_io)
116
+ generator
117
+ end
118
+
119
+ it "prints usage when args are empty" do
120
+ with_argv([]).run
121
+ expect(stderr_io.string).to include(expected_help_message)
122
+ end
123
+
124
+ it "errors if both berks and policyfiles are requested" do
125
+ expect(with_argv(%w{my_cookbook --berks --policy}).run).to eq(1)
126
+ message = "Berkshelf and Policyfiles are mutually exclusive. Please specify only one."
127
+ expect(stderr_io.string).to include(message)
128
+ end
129
+
130
+ it "warns if a hyphenated cookbook name is passed" do
131
+ expect(with_argv(%w{my-cookbook}).run).to eq(0)
132
+ message = "Hyphens are discouraged in cookbook names as they may cause problems with custom resources. See https://docs.chef.io/ctl_chef.html#chef-generate-cookbook for more information."
133
+ expect(stdout_io.string).to include(message)
134
+ end
135
+
136
+ end
137
+
138
+ context "when given the name of the cookbook to generate" do
139
+
140
+ let(:argv) { %w{new_cookbook} }
141
+
142
+ before do
143
+ reset_tempdir
144
+ end
145
+
146
+ it "configures the generator context" do
147
+ cookbook_generator.read_and_validate_params
148
+ cookbook_generator.setup_context
149
+ expect(generator_context.cookbook_root).to eq(Dir.pwd)
150
+ expect(generator_context.cookbook_name).to eq("new_cookbook")
151
+ expect(generator_context.recipe_name).to eq("default")
152
+ expect(generator_context.verbose).to be(false)
153
+ end
154
+
155
+ it "creates a new cookbook" do
156
+ Dir.chdir(tempdir) do
157
+ allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
158
+ expect(cookbook_generator.run).to eq(0)
159
+ end
160
+ generated_files = Dir.glob("#{tempdir}/new_cookbook/**/*", File::FNM_DOTMATCH)
161
+ expected_cookbook_files.each do |expected_file|
162
+ expect(generated_files).to include(expected_file)
163
+ end
164
+ end
165
+
166
+ context "when passed workflow option" do
167
+
168
+ context "generates a workflow (delivery) cookbook" do
169
+
170
+ let(:argv) { %w{new_cookbook --workflow} }
171
+
172
+ let(:dot_delivery) { File.join(tempdir, "new_cookbook", ".delivery") }
173
+
174
+ before do
175
+ Dir.chdir(tempdir) do
176
+ allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
177
+ expect(cookbook_generator.run).to eq(0)
178
+ end
179
+ end
180
+
181
+ describe ".delivery/project.toml" do
182
+
183
+ let(:file) { File.join(tempdir, "new_cookbook", ".delivery", "project.toml") }
184
+
185
+ let(:expected_content) do
186
+ <<~PROJECT_DOT_TOML
187
+ # Delivery for Local Phases Execution
188
+ #
189
+ # This file allows you to execute test phases locally on a workstation or
190
+ # in a CI pipeline. The delivery-cli will read this file and execute the
191
+ # command(s) that are configured for each phase. You can customize them
192
+ # by just modifying the phase key on this file.
193
+ #
194
+ # By default these phases are configured for Cookbook Workflow only
195
+ #
196
+
197
+ [local_phases]
198
+ unit = "chef exec rspec spec/"
199
+ lint = "chef exec cookstyle"
200
+ # Foodcritic includes rules only appropriate for community cookbooks
201
+ # uploaded to Supermarket. We turn off any rules tagged "supermarket"
202
+ # by default. If you plan to share this cookbook you should remove
203
+ # '-t ~supermarket' below to enable supermarket rules.
204
+ syntax = "chef exec foodcritic . -t ~supermarket"
205
+ provision = "chef exec kitchen create"
206
+ deploy = "chef exec kitchen converge"
207
+ smoke = "chef exec kitchen verify"
208
+ # The functional phase is optional, you can define it by uncommenting
209
+ # the line below and running the command: `delivery local functional`
210
+ # functional = ""
211
+ cleanup = "chef exec kitchen destroy"
212
+
213
+ # Remote project.toml file
214
+ #
215
+ # Instead of the local phases above, you may specify a remote URI location for
216
+ # the `project.toml` file. This is useful for teams that wish to centrally
217
+ # manage the behavior of the `delivery local` command across many different
218
+ # projects.
219
+ #
220
+ # remote_file = "https://url/project.toml"
221
+ PROJECT_DOT_TOML
222
+ end
223
+
224
+ it "exists with default config for Cookbook Workflow" do
225
+ expect(IO.read(file)).to eq(expected_content)
226
+ end
227
+
228
+ end
229
+
230
+ describe ".delivery/config.json" do
231
+
232
+ let(:file) { File.join(tempdir, "new_cookbook", ".delivery", "config.json") }
233
+
234
+ let(:expected_content) do
235
+ <<~CONFIG_DOT_JSON
236
+ {
237
+ "version": "2",
238
+ "build_cookbook": {
239
+ "name": "build_cookbook",
240
+ "path": ".delivery/build_cookbook"
241
+ },
242
+ "delivery-truck": {
243
+ "lint": {
244
+ "enable_cookstyle": true
245
+ }
246
+ },
247
+ "skip_phases": [],
248
+ "job_dispatch": {
249
+ "version": "v2"
250
+ },
251
+ "dependencies": []
252
+ }
253
+ CONFIG_DOT_JSON
254
+ end
255
+
256
+ it "configures delivery to use a local build cookbook" do
257
+ expect(IO.read(file)).to eq(expected_content)
258
+ end
259
+
260
+ end
261
+
262
+ describe "build cookbook recipes" do
263
+
264
+ let(:file) do
265
+ File.join(dot_delivery, "build_cookbook", "recipes", "publish.rb")
266
+ end
267
+
268
+ let(:expected_content) do
269
+ <<~CONFIG_DOT_JSON
270
+ #
271
+ # Cookbook:: build_cookbook
272
+ # Recipe:: publish
273
+ #
274
+ # Copyright:: 2019, The Authors, All Rights Reserved.
275
+
276
+ include_recipe 'delivery-truck::publish'
277
+ CONFIG_DOT_JSON
278
+ end
279
+
280
+ it "delegates functionality to delivery-truck" do
281
+ expect(IO.read(file)).to include(expected_content)
282
+ end
283
+
284
+ end
285
+
286
+ describe "build cookbook Berksfile" do
287
+
288
+ let(:file) do
289
+ File.join(dot_delivery, "build_cookbook", "Berksfile")
290
+ end
291
+
292
+ let(:expected_content) do
293
+ <<~CONFIG_DOT_JSON
294
+ source 'https://supermarket.chef.io'
295
+
296
+ metadata
297
+
298
+ group :workflow do
299
+ cookbook 'test', path: './test/fixtures/cookbooks/test'
300
+ end
301
+ CONFIG_DOT_JSON
302
+ end
303
+
304
+ it "sets the sources for delivery library cookbooks to github" do
305
+ expect(IO.read(file)).to include(expected_content)
306
+ end
307
+
308
+ end
309
+ end
310
+
311
+ context "when no delivery CLI configuration is present" do
312
+
313
+ let(:argv) { %w{new_cookbook --workflow} }
314
+
315
+ it "detects no delivery config" do
316
+ Dir.chdir(tempdir) do
317
+ expect(cookbook_generator.have_delivery_config?).to be(false)
318
+ end
319
+ end
320
+
321
+ it "emits concise output" do
322
+ Dir.chdir(tempdir) do
323
+ allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
324
+ expect(cookbook_generator.run).to eq(0)
325
+ end
326
+
327
+ expected = <<~OUTPUT
328
+ Generating cookbook new_cookbook
329
+ - Ensuring correct cookbook content
330
+ - Committing cookbook files to git
331
+ - Ensuring delivery CLI configuration
332
+ - Ensuring correct Workflow (Delivery) build cookbook content
333
+ - Adding delivery configuration to feature branch
334
+ - Adding build cookbook to feature branch
335
+ - Merging delivery content feature branch to master
336
+
337
+ #{non_delivery_breadcrumb}
338
+ OUTPUT
339
+
340
+ actual = stdout_io.string
341
+
342
+ # the formatter will add escape sequences to turn off any colors
343
+ actual.gsub!("\e[0m", "")
344
+ expect(actual).to eq(expected)
345
+ end
346
+ end
347
+
348
+ context "when a delivery CLI config is present" do
349
+
350
+ # Setup a situation like this:
351
+ # there is a dir for the delivery organization with the
352
+ # `.delivery/cli.toml` in it. Inside that is another dir (maybe IRL this
353
+ # would be "cookbooks"), then we create the cookbook inside that.
354
+
355
+ let(:argv) { %w{new_cookbook --workflow} }
356
+
357
+ let(:tempdir_subdir) { File.join(tempdir, "subdirectory") }
358
+
359
+ let(:dot_delivery_dir) { File.join(tempdir, ".delivery") }
360
+
361
+ let(:dot_delivery_cli_toml) { File.join(dot_delivery_dir, "cli.toml") }
362
+
363
+ before do
364
+ Dir.mkdir(tempdir_subdir)
365
+ Dir.mkdir(dot_delivery_dir)
366
+ FileUtils.touch(dot_delivery_cli_toml)
367
+ end
368
+
369
+ it "detects the delivery config" do
370
+ Dir.chdir(tempdir_subdir) do
371
+ expect(cookbook_generator.have_delivery_config?).to be(true)
372
+ end
373
+ end
374
+
375
+ it "emits concise output" do
376
+ Dir.chdir(tempdir) do
377
+ allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
378
+ expect(cookbook_generator.run).to eq(0)
379
+ end
380
+
381
+ expected = <<~OUTPUT
382
+ Generating cookbook new_cookbook
383
+ - Ensuring correct cookbook content
384
+ - Committing cookbook files to git
385
+ - Ensuring delivery CLI configuration
386
+ - Ensuring correct Workflow (Delivery) build cookbook content
387
+ - Adding delivery configuration to feature branch
388
+ - Adding build cookbook to feature branch
389
+ - Merging delivery content feature branch to master
390
+
391
+ Your cookbook is ready. To setup the pipeline, type `cd new_cookbook`, then run `delivery init`
392
+ OUTPUT
393
+
394
+ actual = stdout_io.string
395
+
396
+ # the formatter will add escape sequences to turn off any colors
397
+ actual.gsub!("\e[0m", "")
398
+ expect(actual).to eq(expected)
399
+ end
400
+ end
401
+ end
402
+
403
+ context "when given the verbose flag" do
404
+
405
+ let(:argv) { %w{ new_cookbook --verbose } }
406
+
407
+ it "configures the generator context with verbose mode enabled" do
408
+ cookbook_generator.read_and_validate_params
409
+ cookbook_generator.setup_context
410
+ expect(generator_context.verbose).to be(true)
411
+ end
412
+
413
+ it "emits verbose output" do
414
+ Dir.chdir(tempdir) do
415
+ allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
416
+ expect(cookbook_generator.run).to eq(0)
417
+ end
418
+
419
+ # The normal chef formatter puts a heading for each recipe like this.
420
+ # Full output is large and subject to change with minor changes in the
421
+ # generator cookbook, so we just look for this line
422
+ expected_line = "Recipe: code_generator::cookbook"
423
+
424
+ actual = stdout_io.string
425
+
426
+ expect(actual).to include(expected_line)
427
+ end
428
+ end
429
+
430
+ shared_examples_for "a generated file" do |context_var|
431
+ before do
432
+ Dir.chdir(tempdir) do
433
+ allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
434
+ expect(cookbook_generator.run).to eq(0)
435
+ end
436
+ end
437
+
438
+ it "should contain #{context_var} from the generator context" do
439
+ expect(File.read(file)).to match line
440
+ end
441
+ end
442
+
443
+ describe "README.md" do
444
+ let(:file) { File.join(tempdir, "new_cookbook", "README.md") }
445
+
446
+ include_examples "a generated file", :cookbook_name do
447
+ let(:line) { "# new_cookbook" }
448
+ end
449
+ end
450
+
451
+ describe "CHANGELOG.md" do
452
+ let(:file) { File.join(tempdir, "new_cookbook", "CHANGELOG.md") }
453
+
454
+ include_examples "a generated file", :cookbook_name do
455
+ let(:line) { "# new_cookbook" }
456
+ end
457
+ end
458
+
459
+ # This shared example group requires a let binding for
460
+ # `expected_kitchen_yml_content`
461
+ shared_examples_for "kitchen_yml_and_integration_tests" do
462
+
463
+ describe "Generating Test Kitchen and integration testing files" do
464
+
465
+ describe "generating kitchen config" do
466
+
467
+ before do
468
+ Dir.chdir(tempdir) do
469
+ allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
470
+ expect(cookbook_generator.run).to eq(0)
471
+ end
472
+ end
473
+
474
+ let(:file) { File.join(tempdir, "new_cookbook", "kitchen.yml") }
475
+
476
+ it "creates a kitchen.yml with the expected content" do
477
+ expect(IO.read(file)).to eq(expected_kitchen_yml_content)
478
+ end
479
+
480
+ end
481
+
482
+ describe "test/integration/default/default_test.rb" do
483
+ let(:file) { File.join(tempdir, "new_cookbook", "test", "integration", "default", "default_test.rb") }
484
+
485
+ include_examples "a generated file", :cookbook_name do
486
+ let(:line) { "describe port" }
487
+ end
488
+ end
489
+ end
490
+ end
491
+
492
+ # This shared example group requires you to define a let binding for
493
+ # `expected_chefspec_spec_helper_content`
494
+ shared_examples_for "chefspec_spec_helper_file" do
495
+
496
+ describe "Generating ChefSpec files" do
497
+
498
+ before do
499
+ Dir.chdir(tempdir) do
500
+ allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
501
+ expect(cookbook_generator.run).to eq(0)
502
+ end
503
+ end
504
+
505
+ let(:file) { File.join(tempdir, "new_cookbook", "spec", "spec_helper.rb") }
506
+
507
+ it "creates a spec/spec_helper.rb for ChefSpec with the expected content" do
508
+ expect(IO.read(file)).to eq(expected_chefspec_spec_helper_content)
509
+ end
510
+
511
+ end
512
+
513
+ end
514
+
515
+ context "when configured for Policyfiles" do
516
+
517
+ let(:argv) { %w{new_cookbook --policy} }
518
+
519
+ describe "Policyfile.rb" do
520
+
521
+ let(:file) { File.join(tempdir, "new_cookbook", "Policyfile.rb") }
522
+
523
+ let(:expected_content) do
524
+ <<~POLICYFILE_RB
525
+ # Policyfile.rb - Describe how you want Chef Infra Client to build your system.
526
+ #
527
+ # For more information on the Policyfile feature, visit
528
+ # https://docs.chef.io/policyfile.html
529
+
530
+ # A name that describes what the system you're building with Chef does.
531
+ name 'new_cookbook'
532
+
533
+ # Where to find external cookbooks:
534
+ default_source :supermarket
535
+
536
+ # run_list: chef-client will run these recipes in the order specified.
537
+ run_list 'new_cookbook::default'
538
+
539
+ # Specify a custom source for a single cookbook:
540
+ cookbook 'new_cookbook', path: '.'
541
+ POLICYFILE_RB
542
+ end
543
+
544
+ before do
545
+ Dir.chdir(tempdir) do
546
+ allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
547
+ expect(cookbook_generator.run).to eq(0)
548
+ end
549
+ end
550
+
551
+ it "has a run_list and cookbook path that will work out of the box" do
552
+ expect(IO.read(file)).to eq(expected_content)
553
+ end
554
+
555
+ end
556
+
557
+ include_examples "kitchen_yml_and_integration_tests" do
558
+
559
+ let(:expected_kitchen_yml_content) do
560
+ <<~KITCHEN_YML
561
+ ---
562
+ driver:
563
+ name: vagrant
564
+
565
+ ## The forwarded_port port feature lets you connect to ports on the VM guest via
566
+ ## localhost on the host.
567
+ ## see also: https://www.vagrantup.com/docs/networking/forwarded_ports.html
568
+
569
+ # network:
570
+ # - ["forwarded_port", {guest: 80, host: 8080}]
571
+
572
+ provisioner:
573
+ name: chef_zero
574
+
575
+ ## product_name and product_version specifies a specific Chef product and version to install.
576
+ ## see the Chef documentation for more details: https://docs.chef.io/config_yml_kitchen.html
577
+ # product_name: chef
578
+ # product_version: 15
579
+
580
+ verifier:
581
+ name: inspec
582
+
583
+ platforms:
584
+ - name: ubuntu-18.04
585
+ - name: centos-7
586
+
587
+ suites:
588
+ - name: default
589
+ verifier:
590
+ inspec_tests:
591
+ - test/integration/default
592
+ attributes:
593
+ KITCHEN_YML
594
+ end
595
+
596
+ end
597
+
598
+ include_examples "chefspec_spec_helper_file" do
599
+
600
+ let(:expected_chefspec_spec_helper_content) do
601
+ <<~SPEC_HELPER
602
+ require 'chefspec'
603
+ require 'chefspec/policyfile'
604
+ SPEC_HELPER
605
+ end
606
+
607
+ end
608
+
609
+ end
610
+
611
+ context "when configured for Berkshelf" do
612
+
613
+ let(:argv) { %w{new_cookbook --berks} }
614
+
615
+ describe "Berksfile" do
616
+
617
+ let(:file) { File.join(tempdir, "new_cookbook", "Berksfile") }
618
+
619
+ let(:expected_content) do
620
+ <<~POLICYFILE_RB
621
+ source 'https://supermarket.chef.io'
622
+
623
+ metadata
624
+ POLICYFILE_RB
625
+ end
626
+
627
+ before do
628
+ Dir.chdir(tempdir) do
629
+ allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
630
+ expect(cookbook_generator.run).to eq(0)
631
+ end
632
+ end
633
+
634
+ it "pulls deps from metadata" do
635
+ expect(IO.read(file)).to eq(expected_content)
636
+ end
637
+
638
+ end
639
+
640
+ include_examples "kitchen_yml_and_integration_tests" do
641
+
642
+ let(:expected_kitchen_yml_content) do
643
+ <<~KITCHEN_YML
644
+ ---
645
+ driver:
646
+ name: vagrant
647
+
648
+ ## The forwarded_port port feature lets you connect to ports on the VM guest via
649
+ ## localhost on the host.
650
+ ## see also: https://www.vagrantup.com/docs/networking/forwarded_ports.html
651
+
652
+ # network:
653
+ # - ["forwarded_port", {guest: 80, host: 8080}]
654
+
655
+ provisioner:
656
+ name: chef_zero
657
+ # You may wish to disable always updating cookbooks in CI or other testing environments.
658
+ # For example:
659
+ # always_update_cookbooks: <%= !ENV['CI'] %>
660
+ always_update_cookbooks: true
661
+
662
+ ## product_name and product_version specifies a specific Chef product and version to install.
663
+ ## see the Chef documentation for more details: https://docs.chef.io/config_yml_kitchen.html
664
+ # product_name: chef
665
+ # product_version: 15
666
+
667
+ verifier:
668
+ name: inspec
669
+
670
+ platforms:
671
+ - name: ubuntu-18.04
672
+ - name: centos-7
673
+
674
+ suites:
675
+ - name: default
676
+ run_list:
677
+ - recipe[new_cookbook::default]
678
+ verifier:
679
+ inspec_tests:
680
+ - test/integration/default
681
+ attributes:
682
+ KITCHEN_YML
683
+ end
684
+
685
+ end
686
+
687
+ include_examples "chefspec_spec_helper_file" do
688
+
689
+ let(:expected_chefspec_spec_helper_content) do
690
+ <<~SPEC_HELPER
691
+ require 'chefspec'
692
+ require 'chefspec/berkshelf'
693
+ SPEC_HELPER
694
+ end
695
+
696
+ end
697
+
698
+ end
699
+
700
+ describe "metadata.rb" do
701
+ let(:file) { File.join(tempdir, "new_cookbook", "metadata.rb") }
702
+
703
+ include_examples "a generated file", :cookbook_name do
704
+ let(:line) { /name\s+'new_cookbook'.+# issues_url.+# source_url/m }
705
+ end
706
+ end
707
+
708
+ describe "recipes/default.rb" do
709
+ let(:file) { File.join(tempdir, "new_cookbook", "recipes", "default.rb") }
710
+
711
+ include_examples "a generated file", :cookbook_name do
712
+ let(:line) { "# Cookbook:: new_cookbook" }
713
+ end
714
+ end
715
+
716
+ describe "spec/unit/recipes/default_spec.rb" do
717
+ let(:file) { File.join(tempdir, "new_cookbook", "spec", "unit", "recipes", "default_spec.rb") }
718
+
719
+ include_examples "a generated file", :cookbook_name do
720
+ let(:line) { "describe 'new_cookbook::default' do" }
721
+ end
722
+ end
723
+
724
+ end
725
+
726
+ context "when given the path to the cookbook to generate" do
727
+ let(:argv) { [ File.join(tempdir, "a_new_cookbook") ] }
728
+
729
+ before do
730
+ reset_tempdir
731
+ end
732
+
733
+ it "configures the generator context" do
734
+ cookbook_generator.read_and_validate_params
735
+ cookbook_generator.setup_context
736
+ expect(generator_context.cookbook_root).to eq(tempdir)
737
+ expect(generator_context.cookbook_name).to eq("a_new_cookbook")
738
+ end
739
+
740
+ end
741
+
742
+ context "when given generic arguments to populate the generator context" do
743
+ let(:argv) { [ "new_cookbook", "--generator-arg", "key1=value1", "-a", "key2=value2", "-a", " key3 = value3 " ] }
744
+
745
+ before do
746
+ reset_tempdir
747
+ end
748
+
749
+ it "configures the generator context for long form option key1" do
750
+ cookbook_generator.read_and_validate_params
751
+ cookbook_generator.setup_context
752
+ expect(generator_context.key1).to eq("value1")
753
+ end
754
+
755
+ it "configures the generator context for short form option key2" do
756
+ cookbook_generator.read_and_validate_params
757
+ cookbook_generator.setup_context
758
+ expect(generator_context.key2).to eq("value2")
759
+ end
760
+
761
+ it "configures the generator context for key3 containing additional spaces" do
762
+ cookbook_generator.read_and_validate_params
763
+ cookbook_generator.setup_context
764
+ expect(generator_context.key3).to eq("value3")
765
+ end
766
+
767
+ end
768
+
769
+ end