chef-cli 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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,155 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2015-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_relative "base"
19
+ require_relative "../ui"
20
+ require_relative "../configurable"
21
+ require_relative "../policyfile_services/undelete"
22
+ require_relative "../dist"
23
+
24
+ module ChefCLI
25
+ module Command
26
+
27
+ class Undelete < Base
28
+
29
+ banner(<<~BANNER)
30
+ Usage: #{ChefCLI::Dist::EXEC} undelete [--list | --id ID] [options]
31
+
32
+ `#{ChefCLI::Dist::EXEC} undelete` helps you recover quickly if you've deleted a policy or policy
33
+ group in error. When run with no arguements, it lists the available undo
34
+ operations. To undo the last delete operation, use `chef undelete --last`.
35
+
36
+ CAVEATS:
37
+ `#{ChefCLI::Dist::EXEC} undelete` doesn't detect conflicts. If a deleted item has been recreated,
38
+ running `chef undelete` will overwrite it.
39
+
40
+ Undo information does not include cookbooks that might be referenced by
41
+ policies. If you have cleaned the policy cookbooks after the delete operation
42
+ you want to reverse, `chef undelete` may not be able to fully restore the
43
+ previous state.
44
+
45
+ The delete commands also do not store access control data, so you may have to
46
+ manually reapply any ACL customizations you have made.
47
+
48
+ See our detailed README for more information:
49
+
50
+ https://docs.chef.io/policyfile.html
51
+
52
+ Options:
53
+
54
+ BANNER
55
+
56
+ option :undo_last,
57
+ short: "-l",
58
+ long: "--last",
59
+ description: "Undo the most recent delete operation"
60
+
61
+ option :undo_record_id,
62
+ short: "-i ID",
63
+ long: "--id ID",
64
+ description: "Undo the delete operation with the given ID"
65
+
66
+ option :config_file,
67
+ short: "-c CONFIG_FILE",
68
+ long: "--config CONFIG_FILE",
69
+ description: "Path to configuration file"
70
+
71
+ option :debug,
72
+ short: "-D",
73
+ long: "--debug",
74
+ description: "Enable stacktraces and other debug output",
75
+ default: false
76
+
77
+ include Configurable
78
+
79
+ attr_accessor :ui
80
+
81
+ attr_reader :undo_record_id
82
+
83
+ def initialize(*args)
84
+ super
85
+ @list_undo_records = false
86
+ @undo_record_id = nil
87
+ @ui = UI.new
88
+ end
89
+
90
+ def run(params)
91
+ return 1 unless apply_params!(params)
92
+ if list_undo_records?
93
+ undelete_service.list
94
+ else
95
+ undelete_service.run
96
+ end
97
+ 0
98
+ rescue PolicyfileServiceError => e
99
+ handle_error(e)
100
+ 1
101
+ end
102
+
103
+ def undelete_service
104
+ @undelete_service ||=
105
+ PolicyfileServices::Undelete.new(config: chef_config,
106
+ ui: ui,
107
+ undo_record_id: undo_record_id)
108
+ end
109
+
110
+ def debug?
111
+ !!config[:debug]
112
+ end
113
+
114
+ def list_undo_records?
115
+ @list_undo_records
116
+ end
117
+
118
+ def handle_error(error)
119
+ ui.err("Error: #{error.message}")
120
+ if error.respond_to?(:reason)
121
+ ui.err("Reason: #{error.reason}")
122
+ ui.err("")
123
+ ui.err(error.extended_error_info) if debug?
124
+ ui.err(error.cause.backtrace.join("\n")) if debug?
125
+ end
126
+ end
127
+
128
+ def apply_params!(params)
129
+ remaining_args = parse_options(params)
130
+
131
+ if !remaining_args.empty?
132
+ ui.err("Too many arguments")
133
+ ui.err("")
134
+ ui.err(opt_parser)
135
+ false
136
+ elsif config[:undo_record_id].nil? && config[:undo_last].nil?
137
+ @list_undo_records = true
138
+ true
139
+ elsif config[:undo_record_id] && config[:undo_last]
140
+ ui.err("Error: options --last and --id cannot both be given.")
141
+ ui.err("")
142
+ ui.err(opt_parser)
143
+ false
144
+ elsif config[:undo_record_id]
145
+ @undo_record_id = config[:undo_record_id]
146
+ true
147
+ elsif config[:undo_last]
148
+ @undo_record_id = nil
149
+ true
150
+ end
151
+ end
152
+
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,140 @@
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_relative "base"
19
+ require_relative "../ui"
20
+ require_relative "../policyfile_services/install"
21
+ require_relative "../policyfile_services/update_attributes"
22
+ require_relative "../configurable"
23
+ require_relative "../dist"
24
+
25
+ module ChefCLI
26
+ module Command
27
+
28
+ class Update < Base
29
+
30
+ include Configurable
31
+
32
+ banner(<<~BANNER)
33
+ Usage: #{ChefCLI::Dist::EXEC} update [ POLICY_FILE ] [options] [cookbook_1] [...]
34
+
35
+ `#{ChefCLI::Dist::EXEC} update` reads your `Policyfile.rb`, applies any changes, re-solves the
36
+ dependencies and emits an updated `Policyfile.lock.json`. The new locked policy
37
+ will reflect any changes to the `run_list` and pull in any cookbook updates
38
+ that are compatible with the version constraints stated in your `Policyfile.rb`.
39
+
40
+ Individual dependent cookbooks (and their dependencies) may be updated by
41
+ passing their names after the POLICY_FILE. The POLICY_FILE parameter is
42
+ mandatory if you want to update individual cookbooks.
43
+
44
+ See our detailed README for more information:
45
+
46
+ https://docs.chef.io/policyfile.html
47
+
48
+ Options:
49
+
50
+ BANNER
51
+
52
+ option :config_file,
53
+ short: "-c CONFIG_FILE",
54
+ long: "--config CONFIG_FILE",
55
+ description: "Path to configuration file"
56
+
57
+ option :debug,
58
+ short: "-D",
59
+ long: "--debug",
60
+ description: "Enable stacktraces and other debug output",
61
+ default: false,
62
+ boolean: true
63
+
64
+ option :update_attributes_only,
65
+ short: "-a",
66
+ long: "--attributes",
67
+ description: "Only update attributes (not cookbooks)",
68
+ default: false,
69
+ boolean: true
70
+
71
+ option :exclude_deps,
72
+ long: "--exclude-deps",
73
+ description: "Only update cookbooks explicitely mentioned on the command line",
74
+ boolean: true,
75
+ default: false
76
+
77
+ attr_reader :policyfile_relative_path
78
+
79
+ attr_accessor :ui
80
+
81
+ def initialize(*args)
82
+ super
83
+ @ui = UI.new
84
+
85
+ @policyfile_relative_path = nil
86
+ @installer = nil
87
+ @attributes_updater = nil
88
+ @cookbooks_to_update = []
89
+ end
90
+
91
+ def run(params = [])
92
+ return 1 unless apply_params!(params)
93
+ attributes_updater.run
94
+ installer.run(@cookbooks_to_update, config[:exclude_deps]) unless update_attributes_only?
95
+ 0
96
+ rescue PolicyfileServiceError => e
97
+ handle_error(e)
98
+ 1
99
+ end
100
+
101
+ def installer
102
+ @installer ||= PolicyfileServices::Install.new(policyfile: policyfile_relative_path, ui: ui, root_dir: Dir.pwd, config: chef_config, overwrite: true)
103
+ end
104
+
105
+ def attributes_updater
106
+ @attributes_updater ||=
107
+ PolicyfileServices::UpdateAttributes.new(policyfile: policyfile_relative_path, ui: ui, root_dir: Dir.pwd, chef_config: chef_config)
108
+ end
109
+
110
+ def debug?
111
+ !!config[:debug]
112
+ end
113
+
114
+ def config_path
115
+ config[:config_file]
116
+ end
117
+
118
+ def update_attributes_only?
119
+ !!config[:update_attributes_only]
120
+ end
121
+
122
+ def handle_error(error)
123
+ ui.err("Error: #{error.message}")
124
+ if error.respond_to?(:reason)
125
+ ui.err("Reason: #{error.reason}")
126
+ ui.err("")
127
+ ui.err(error.extended_error_info) if debug?
128
+ ui.err(error.cause.backtrace.join("\n")) if debug?
129
+ end
130
+ end
131
+
132
+ def apply_params!(params)
133
+ remaining_args = parse_options(params)
134
+ @policyfile_relative_path = remaining_args.shift
135
+ @cookbooks_to_update += remaining_args
136
+ true
137
+ end
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,548 @@
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_relative "base"
19
+ require_relative "../exceptions"
20
+ require_relative "../component_test"
21
+ require_relative "../dist"
22
+
23
+ module ChefCLI
24
+ module Command
25
+ class Verify < ChefCLI::Command::Base
26
+ # TODO 2019-07-05 mp - this gets a little odd, because
27
+ # this the commands that we verify here do not ship with
28
+ # the chef-cli component - they're only in Workstation and DK.
29
+ # This should continue to work in an installed Workstation package,
30
+ # but we will probably want to find some way of letting clients (Workstation)
31
+ # override this command so that it can report on all
32
+ # of the components it installs.
33
+ include ChefCLI::Helpers
34
+
35
+ banner "Usage: #{ChefCLI::Dist::EXEC} verify [component, ...] [options]"
36
+
37
+ option :omnibus_dir,
38
+ long: "--omnibus-dir OMNIBUS_DIR",
39
+ description: "Alternate path to omnibus install (used for testing)"
40
+
41
+ option :unit,
42
+ long: "--unit",
43
+ description: "Run bundled app unit tests (only smoke tests run by default)"
44
+
45
+ option :integration,
46
+ long: "--integration",
47
+ description: "Run integration tests. Possibly dangerous, for development systems only"
48
+
49
+ option :verbose,
50
+ long: "--verbose",
51
+ description: "Display all test output, not just failing tests"
52
+
53
+ class << self
54
+ def add_component(name, _delete_me = nil)
55
+ component = ComponentTest.new(name)
56
+ yield component if block_given? # delete this conditional
57
+ component_map[name] = component
58
+ end
59
+
60
+ def component(name)
61
+ component_map[name]
62
+ end
63
+
64
+ def components
65
+ component_map.values
66
+ end
67
+
68
+ def component_map
69
+ @component_map ||= {}
70
+ end
71
+ end
72
+
73
+ def components
74
+ self.class.components
75
+ end
76
+
77
+ bundle_install_mutex = Mutex.new
78
+
79
+ #
80
+ # Components included in Chef Development kit:
81
+ # :base_dir => Relative path of the component w.r.t. omnibus_apps_dir
82
+ # :gem_base_dir => Takes a gem name instead and uses first gem found
83
+ # :test_cmd => Test command to be launched for the component
84
+ #
85
+ add_component "berkshelf" do |c|
86
+ c.gem_base_dir = "berkshelf"
87
+ # For berks the real command to run is "#{embedded_bin("bundle")} exec thor spec:ci"
88
+ # We can't run it right now since graphviz specs are included in the
89
+ # test suite by default. We will be able to switch to that command when/if
90
+ # Graphviz is added to omnibus.
91
+ c.unit_test do
92
+ bundle_install_mutex.synchronize { sh("#{embedded_bin("bundle")} install") }
93
+ sh("#{embedded_bin("bundle")} exec #{embedded_bin("rspec")} --color --format progress spec/unit --tag ~graphviz")
94
+ end
95
+ c.integration_test do
96
+ bundle_install_mutex.synchronize { sh("#{embedded_bin("bundle")} install") }
97
+ sh("#{embedded_bin("bundle")} exec #{embedded_bin("cucumber")} --color --format progress --tags ~@no_run --tags ~@spawn --tags ~@graphviz --strict")
98
+ end
99
+
100
+ c.smoke_test do
101
+ tmpdir do |cwd|
102
+ FileUtils.touch(File.join(cwd, "Berksfile"))
103
+ sh("#{bin("berks")} install", cwd: cwd)
104
+ end
105
+ end
106
+ end
107
+
108
+ add_component "test-kitchen" do |c|
109
+ c.gem_base_dir = "test-kitchen"
110
+ c.unit_test do
111
+ bundle_install_mutex.synchronize { sh("#{embedded_bin("bundle")} install") }
112
+ sh("#{embedded_bin("bundle")} exec rake unit")
113
+ end
114
+ c.integration_test do
115
+ bundle_install_mutex.synchronize { sh("#{embedded_bin("bundle")} install") }
116
+ sh("#{embedded_bin("bundle")} exec rake features")
117
+ end
118
+
119
+ # NOTE: By default, kitchen tries to be helpful and install a driver
120
+ # gem for you. This causes a race condition when running the tests
121
+ # concurrently, because rubygems breaks when there are partially
122
+ # installed gems in the gem repository. Instructing kitchen to create a
123
+ # gemfile instead avoids the gem installation.
124
+ c.smoke_test { run_in_tmpdir("kitchen init --create-gemfile") }
125
+ end
126
+
127
+ add_component "tk-policyfile-provisioner" do |c|
128
+
129
+ c.gem_base_dir = "chef-cli"
130
+
131
+ c.smoke_test do
132
+ tmpdir do |cwd|
133
+ File.open(File.join(cwd, "kitchen.yml"), "w+") do |f|
134
+ f.print(<<~KITCHEN_YML)
135
+ ---
136
+ driver:
137
+ name: dummy
138
+ network:
139
+ - ["forwarded_port", {guest: 80, host: 8080}]
140
+
141
+ provisioner:
142
+ name: policyfile_zero
143
+ require_chef_omnibus: 12.3.0
144
+
145
+ platforms:
146
+ - name: ubuntu-14.04
147
+
148
+ suites:
149
+ - name: default
150
+ run_list:
151
+ - recipe[aar::default]
152
+ attributes:
153
+
154
+ KITCHEN_YML
155
+ end
156
+
157
+ sh("kitchen list", cwd: cwd)
158
+
159
+ end
160
+ end
161
+
162
+ end
163
+
164
+ add_component "chef-client" do |c|
165
+ c.gem_base_dir = "chef"
166
+ c.unit_test do
167
+ bundle_install_mutex.synchronize { sh("#{embedded_bin("bundle")} install") }
168
+ sh("#{embedded_bin("bundle")} exec #{embedded_bin("rspec")} -fp -t '~volatile_from_verify' spec/unit")
169
+ end
170
+ c.integration_test do
171
+ bundle_install_mutex.synchronize { sh("#{embedded_bin("bundle")} install") }
172
+ sh("#{embedded_bin("bundle")} exec #{embedded_bin("rspec")} -fp spec/integration spec/functional")
173
+ end
174
+
175
+ c.smoke_test do
176
+ tmpdir do |cwd|
177
+ FileUtils.touch(File.join(cwd, "apply.rb"))
178
+ sh("#{bin("chef-apply")} apply.rb --chef-license 'accept-no-persist'", cwd: cwd)
179
+ end
180
+ end
181
+ end
182
+
183
+ add_component "chef-cli" do |c|
184
+ c.gem_base_dir = "chef-cli"
185
+ c.unit_test do
186
+ bundle_install_mutex.synchronize { sh("#{embedded_bin("bundle")} install") }
187
+ sh("#{embedded_bin("bundle")} exec #{embedded_bin("rspec")}")
188
+ end
189
+ c.smoke_test do
190
+ run_in_tmpdir("#{bin("chef")} generate cookbook example")
191
+ end
192
+ end
193
+
194
+ add_component "chef-apply" do |c|
195
+ c.gem_base_dir = "chef-apply"
196
+ # c.unit_test do
197
+ # bundle_install_mutex.synchronize { sh("#{embedded_bin("bundle")} install") }
198
+ # sh("#{embedded_bin("bundle")} exec rspec")
199
+ # end
200
+ c.smoke_test { sh("#{bin("chef-run")} -v") }
201
+ end
202
+
203
+ add_component "chefspec" do |c|
204
+ c.gem_base_dir = "chefspec"
205
+ c.unit_test do
206
+ bundle_install_mutex.synchronize { sh("#{embedded_bin("bundle")} install") }
207
+ sh("#{embedded_bin("bundle")} exec #{embedded_bin("rake")} unit")
208
+ end
209
+ c.smoke_test do
210
+ tmpdir do |cwd|
211
+ FileUtils.mkdir(File.join(cwd, "spec"))
212
+ with_file(File.join(cwd, "spec", "spec_helper.rb")) do |f|
213
+ f.write <<~EOF
214
+ require 'chefspec'
215
+ require 'chefspec/berkshelf'
216
+ require 'chefspec/cacher'
217
+
218
+ RSpec.configure do |config|
219
+ config.expect_with(:rspec) { |c| c.syntax = :expect }
220
+ end
221
+ EOF
222
+ end
223
+ FileUtils.touch(File.join(cwd, "Berksfile"))
224
+ with_file(File.join(cwd, "spec", "foo_spec.rb")) do |f|
225
+ f.write <<~EOF
226
+ require 'spec_helper'
227
+ EOF
228
+ end
229
+ sh(embedded_bin("rspec"), cwd: cwd)
230
+ end
231
+ end
232
+ end
233
+
234
+ add_component "generated-cookbooks-pass-chefspec" do |c|
235
+
236
+ c.gem_base_dir = "chef-cli"
237
+ c.smoke_test do
238
+ tmpdir do |cwd|
239
+ sh("#{bin("chef")} generate cookbook example", cwd: cwd)
240
+ cb_cwd = File.join(cwd, "example")
241
+ sh(embedded_bin("rspec"), cwd: cb_cwd)
242
+ end
243
+ end
244
+ end
245
+
246
+ add_component "fauxhai" do |c|
247
+ c.gem_base_dir = "fauxhai"
248
+ c.smoke_test { sh("#{embedded_bin("gem")} list fauxhai") }
249
+ end
250
+
251
+ add_component "knife-spork" do |c|
252
+ c.gem_base_dir = "knife-spork"
253
+ c.smoke_test { sh("#{bin("knife")} spork info") }
254
+ end
255
+
256
+ add_component "kitchen-vagrant" do |c|
257
+ c.gem_base_dir = "kitchen-vagrant"
258
+ # The build is not passing in travis, so no tests
259
+ c.smoke_test { sh("#{embedded_bin("gem")} list kitchen-vagrant") }
260
+ end
261
+
262
+ add_component "package installation" do |c|
263
+
264
+ c.gem_base_dir = "chef-cli"
265
+
266
+ c.smoke_test do
267
+
268
+ if File.directory?(usr_bin_prefix)
269
+ sh!("#{usr_bin_path("berks")} -v")
270
+ sh!("#{usr_bin_path("chef")} -v")
271
+ sh!("#{usr_bin_path("chef-client")} -v")
272
+ sh!("#{usr_bin_path("chef-solo")} -v")
273
+ sh!("#{usr_bin_path("delivery")} -V") unless Chef::Platform.windows?
274
+
275
+ # In `knife`, `knife -v` follows a different code path that skips
276
+ # command/plugin loading; `knife -h` loads commands and plugins, but
277
+ # it exits with code 1, which is the same as a load error. Running
278
+ # `knife exec` forces command loading to happen and this command
279
+ # exits 0, which runs most of the code.
280
+ #
281
+ # See also: https://github.com/chef/chef-cli/issues/227
282
+ sh!("#{usr_bin_path("knife")} exec -E true")
283
+
284
+ tmpdir do |dir|
285
+ # Kitchen tries to create a .kitchen dir even when just running
286
+ # `kitchen -v`:
287
+ sh!("#{usr_bin_path("kitchen")} -v", cwd: dir)
288
+ end
289
+
290
+ sh!("#{usr_bin_path("ohai")} -v")
291
+ sh!("#{usr_bin_path("foodcritic")} -V")
292
+ sh!("#{usr_bin_path("inspec")} version")
293
+ end
294
+
295
+ # Test blocks are expected to return a Mixlib::ShellOut compatible
296
+ # object:
297
+ ComponentTest::NullTestResult.new
298
+ end
299
+ end
300
+
301
+ add_component "openssl" do |c|
302
+ # https://github.com/chef/chef-cli/issues/420
303
+ c.gem_base_dir = "chef"
304
+
305
+ test = <<-EOF.gsub(/^\s+/, "")
306
+ require "net/http" unless defined?(Net::HTTP)
307
+
308
+ uris = %w{https://www.google.com https://chef.io/ https://ec2.amazonaws.com}
309
+ uris.each do |uri|
310
+ uri = URI(uri)
311
+ puts "Fetching \#{uri} for SSL check"
312
+ Net::HTTP.get uri
313
+ end
314
+ EOF
315
+
316
+ c.unit_test do
317
+ tmpdir do |cwd|
318
+ with_file(File.join(cwd, "openssl.rb")) do |f|
319
+ f.write test
320
+ end
321
+ sh!("#{Gem.ruby} openssl.rb", cwd: cwd)
322
+ end
323
+ end
324
+ end
325
+
326
+ add_component "inspec" do |c|
327
+ c.gem_base_dir = "inspec"
328
+
329
+ # Commenting out the unit and integration tests for now until we figure
330
+ # out the bundler error
331
+ # c.unit_test { sh("#{embedded_bin("bundle")} exec rake test:isolated") }
332
+ # This runs Test Kitchen (using kitchen-inspec) with some inspec tests
333
+ # c.integration_test { sh("#{embedded_bin("bundle")} exec rake test:vm") }
334
+
335
+ # It would be nice to use a chef generator to create these specs, but
336
+ # we dont have that yet. So we do it manually.
337
+ c.smoke_test do
338
+ tmpdir do |cwd|
339
+ File.open(File.join(cwd, "some_spec.rb"), "w+") do |f|
340
+ f.print <<-INSPEC_TEST
341
+ rule '01' do
342
+ impact 0.7
343
+ title 'Some Test'
344
+ desc 'Make sure inspec is installed and loading correct'
345
+ describe 1 do
346
+ it { should eq(1) }
347
+ end
348
+ end
349
+ INSPEC_TEST
350
+ end
351
+ # TODO when we appbundle inspec, no longer `chef exec`
352
+ sh("#{bin("chef")} exec #{embedded_bin("inspec")} exec .", cwd: cwd)
353
+ end
354
+ end
355
+ end
356
+
357
+ add_component "delivery-cli" do |c|
358
+ # We'll want to come back and revisit getting unit tests added -
359
+ # currently running the tests depends on cargo , which is not included
360
+ # in our package.
361
+ c.base_dir = "bin"
362
+ c.smoke_test do
363
+ tmpdir do |cwd|
364
+ sh!("delivery setup --user=shipit --server=delivery.shipit.io --ent=chef --org=squirrels", cwd: cwd)
365
+ end
366
+ end
367
+ end
368
+
369
+ if Chef::Platform.windows?
370
+ add_component "git" do |c|
371
+ c.base_dir = "embedded/bin"
372
+ c.smoke_test do
373
+ tmpdir do |cwd|
374
+ sh!("#{embedded_bin("git")} config -l")
375
+ sh!("#{embedded_bin("git")} clone https://github.com/chef/license-acceptance", cwd: cwd)
376
+ end
377
+ end
378
+ end
379
+ else
380
+ add_component "git" do |c|
381
+ c.base_dir = "gitbin"
382
+ c.smoke_test do
383
+ tmpdir do |cwd|
384
+ sh!("#{File.join(omnibus_root, "gitbin", "git")} config -l")
385
+ sh!("#{File.join(omnibus_root, "gitbin", "git")} clone https://github.com/chef/license-acceptance", cwd: cwd)
386
+
387
+ # If /usr/bin/git is a symlink, fail the test.
388
+ # Note that this test cannot go last because it does not return a
389
+ # Mixlib::Shellout object in the windows case, which will break the tests.
390
+ failure_str = "#{nix_platform_native_bin_dir}/git contains a symlink which might mean we accidentally overwrote system git via chefcli."
391
+ result = sh("readlink #{nix_platform_native_bin_dir}/git")
392
+ # if a symlink was found, test to see if it is in a chefcli install
393
+ if result.status.exitstatus == 0
394
+ raise failure_str if result.stdout =~ /chefcli/
395
+ end
396
+
397
+ # <chef_dk>/bin/ should not contain a git binary.
398
+ failure_str = "`<chef_dk>/bin/git --help` should fail as git should be installed in gitbin"
399
+ fail_if_exit_zero("#{bin("git")} --help", failure_str)
400
+ end
401
+ end
402
+ end
403
+ end
404
+
405
+ add_component "opscode-pushy-client" do |c|
406
+ c.gem_base_dir = "opscode-pushy-client"
407
+ # TODO the unit tests are currently failing in master
408
+ # c.unit_test do
409
+ # bundle_install_mutex.synchronize { sh("#{embedded_bin("bundle")} install") }
410
+ # sh("#{embedded_bin("bundle")} exec rake spec")
411
+ # end
412
+
413
+ c.smoke_test do
414
+ tmpdir do |cwd|
415
+ sh("#{bin("pushy-client")} -v", cwd: cwd)
416
+ end
417
+ end
418
+ end
419
+
420
+ # We try and use some chef-sugar code to make sure it loads correctly
421
+ add_component "chef-sugar" do |c|
422
+ c.gem_base_dir = "chef-sugar"
423
+ c.smoke_test do
424
+ tmpdir do |cwd|
425
+ with_file(File.join(cwd, "foo.rb")) do |f|
426
+ f.write <<~EOF
427
+ require 'chef/sugar'
428
+ log 'something' do
429
+ not_if { _64_bit? }
430
+ end
431
+ EOF
432
+ end
433
+ sh("#{bin("chef-apply")} foo.rb", cwd: cwd)
434
+ end
435
+ end
436
+ end
437
+
438
+ attr_reader :verification_threads
439
+ attr_reader :verification_results
440
+ attr_reader :verification_status
441
+
442
+ def initialize
443
+ super
444
+ @verification_threads = [ ]
445
+ @verification_results = [ ]
446
+ @verification_status = 0
447
+ end
448
+
449
+ def run(params = [ ])
450
+ err("[WARN] This is an internal command used by the ChefCLI development team. If you are a ChefCLI user, please do not run it.")
451
+ @components_filter = parse_options(params)
452
+
453
+ validate_components!
454
+ invoke_tests
455
+ wait_for_tests
456
+ report_results
457
+
458
+ verification_status
459
+ end
460
+
461
+ def omnibus_root
462
+ config[:omnibus_dir] || super
463
+ end
464
+
465
+ def validate_components!
466
+ components.each do |component|
467
+ component.omnibus_root = omnibus_root
468
+ component.assert_present!
469
+ end
470
+ end
471
+
472
+ def components_to_test
473
+ if @components_filter.empty?
474
+ components
475
+ else
476
+ components.select do |component|
477
+ @components_filter.include?(component.name.to_s)
478
+ end
479
+ end
480
+ end
481
+
482
+ def invoke_tests
483
+ components_to_test.each do |component|
484
+ # Run the component specs in parallel
485
+ verification_threads << Thread.new do
486
+
487
+ results = []
488
+
489
+ results << component.run_smoke_test
490
+
491
+ if config[:unit]
492
+ results << component.run_unit_test
493
+ end
494
+
495
+ if config[:integration]
496
+ results << component.run_integration_test
497
+ end
498
+
499
+ if results.any? { |r| r.exitstatus != 0 }
500
+ component_status = 1
501
+ @verification_status = 1
502
+ else
503
+ component_status = 0
504
+ end
505
+
506
+ {
507
+ component: component,
508
+ results: results,
509
+ component_status: component_status,
510
+ }
511
+ end
512
+
513
+ msg("Running verification for component '#{component.name}'")
514
+ end
515
+ end
516
+
517
+ def wait_for_tests
518
+ until verification_threads.empty?
519
+ verification_threads.each do |t|
520
+ if t.join(1)
521
+ verification_threads.delete t
522
+ verification_results << t.value
523
+ t.value[:results].each do |result|
524
+ if config[:verbose] || t.value[:component_status] != 0
525
+ msg("")
526
+ msg(result.stdout)
527
+ msg(result.stderr) if result.stderr
528
+ end
529
+ end
530
+ else
531
+ $stdout.write "."
532
+ end
533
+ end
534
+ end
535
+ end
536
+
537
+ def report_results
538
+ msg("")
539
+ msg("---------------------------------------------")
540
+ verification_results.each do |result|
541
+ message = result[:component_status] == 0 ? "succeeded" : "failed"
542
+ msg("Verification of component '#{result[:component].name}' #{message}.")
543
+ end
544
+ end
545
+
546
+ end
547
+ end
548
+ end