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