chef-dk 2.6.2 → 3.0.36
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 +4 -4
- data/Gemfile +126 -121
- data/Gemfile.lock +812 -807
- 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 -21
- 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 +124 -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 +152 -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 +151 -150
- data/lib/chef-dk/generator.rb +165 -165
- data/lib/chef-dk/helpers.rb +176 -176
- data/lib/chef-dk/pager.rb +104 -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 +167 -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/git_lock_fetcher.rb +265 -0
- 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 +129 -123
- 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 +125 -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 +311 -312
- data/lib/chef-dk/policyfile/source_uri.rb +57 -57
- data/lib/chef-dk/policyfile/storage_config.rb +112 -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 +419 -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 +164 -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 +234 -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 +104 -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 +66 -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 +158 -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/CHANGELOG.md.erb +11 -0
- 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 +25 -25
- 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 +765 -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/git_lock_fetcher_spec.rb +155 -0
- 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 -173
- 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 +628 -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 +473 -478
- data/spec/unit/policyfile_services/install_spec.rb +209 -209
- data/spec/unit/policyfile_services/push_archive_spec.rb +359 -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 +9 -5
|
@@ -1,120 +1,120 @@
|
|
|
1
|
-
#
|
|
2
|
-
# Copyright:: Copyright (c) 2017 Chef Software Inc.
|
|
3
|
-
# License:: Apache License, Version 2.0
|
|
4
|
-
#
|
|
5
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
-
# you may not use this file except in compliance with the License.
|
|
7
|
-
# You may obtain a copy of the License at
|
|
8
|
-
#
|
|
9
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
-
#
|
|
11
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
-
# See the License for the specific language governing permissions and
|
|
15
|
-
# limitations under the License.
|
|
16
|
-
#
|
|
17
|
-
|
|
18
|
-
require "spec_helper"
|
|
19
|
-
require "chef-dk/chef_server_api_multi"
|
|
20
|
-
|
|
21
|
-
describe ChefDK::ChefServerAPIMulti do
|
|
22
|
-
|
|
23
|
-
let(:url) { "https://chef.example/organizations/myorg" }
|
|
24
|
-
|
|
25
|
-
let(:opts) do
|
|
26
|
-
{
|
|
27
|
-
signing_key_filename: "/path/to/key.pem",
|
|
28
|
-
client_name: "example-user",
|
|
29
|
-
}
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
let(:expected_server_api_opts) do
|
|
33
|
-
{
|
|
34
|
-
signing_key_filename: "/path/to/key.pem",
|
|
35
|
-
client_name: "example-user",
|
|
36
|
-
keepalives: true,
|
|
37
|
-
}
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
let(:chef_server_api) { instance_double("Chef::ServerAPI") }
|
|
41
|
-
|
|
42
|
-
subject(:server_api_multi) { described_class.new(url, opts) }
|
|
43
|
-
|
|
44
|
-
before do
|
|
45
|
-
# clean out thread local storage or else `chef_server_api` instance double
|
|
46
|
-
# will get re-used across test examples and rspec will complain:
|
|
47
|
-
Thread.current[:chef_server_api_multi] = nil
|
|
48
|
-
allow(Chef::ServerAPI).to receive(:new).with(url, expected_server_api_opts).and_return(chef_server_api)
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
it "has a url" do
|
|
52
|
-
expect(server_api_multi.url).to eq(url)
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
it "has an options hash for Chef::ServerAPI, with `keepalives: true` added" do
|
|
56
|
-
expect(server_api_multi.opts).to eq(expected_server_api_opts)
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
it "creates a thread-local Chef::ServerAPI object for requests" do
|
|
60
|
-
server_api_multi.client_for_thread # force `||=` to run
|
|
61
|
-
expect(server_api_multi.client_for_thread).to eq(Thread.current[:chef_server_api_multi])
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
describe "when keepalives are disabled" do
|
|
65
|
-
|
|
66
|
-
let(:opts) do
|
|
67
|
-
{
|
|
68
|
-
signing_key_filename: "/path/to/key.pem",
|
|
69
|
-
client_name: "example-user",
|
|
70
|
-
keepalives: false,
|
|
71
|
-
}
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
it "does not override disabling them" do
|
|
75
|
-
expect(server_api_multi.opts[:keepalives]).to be(false)
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
describe "delegating request methods to thread-local ServerAPI object" do
|
|
81
|
-
|
|
82
|
-
it "delegates #head" do
|
|
83
|
-
expect(chef_server_api).to receive(:head).with("/foo")
|
|
84
|
-
server_api_multi.head("/foo")
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
it "delegates #get" do
|
|
88
|
-
expect(chef_server_api).to receive(:get).with("/foo")
|
|
89
|
-
server_api_multi.get("/foo")
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
it "delegates #put" do
|
|
93
|
-
expect(chef_server_api).to receive(:put).with("/foo", "data")
|
|
94
|
-
server_api_multi.put("/foo", "data")
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
it "delegates #post" do
|
|
98
|
-
expect(chef_server_api).to receive(:post).with("/foo", "data")
|
|
99
|
-
server_api_multi.post("/foo", "data")
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
it "delegates #delete" do
|
|
103
|
-
expect(chef_server_api).to receive(:delete).with("/foo")
|
|
104
|
-
server_api_multi.delete("/foo")
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
it "delegates #streaming_request" do
|
|
108
|
-
expect(chef_server_api).to receive(:streaming_request).with("/foo")
|
|
109
|
-
server_api_multi.streaming_request("/foo")
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
it "passes a block argument to #streaming_request" do
|
|
113
|
-
expect(chef_server_api).to receive(:streaming_request).with("/foo").and_yield
|
|
114
|
-
x = 0
|
|
115
|
-
server_api_multi.streaming_request("/foo") { x = 5 }
|
|
116
|
-
expect(x).to eq(5)
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
end
|
|
120
|
-
end
|
|
1
|
+
#
|
|
2
|
+
# Copyright:: Copyright (c) 2017 Chef Software Inc.
|
|
3
|
+
# License:: Apache License, Version 2.0
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
#
|
|
17
|
+
|
|
18
|
+
require "spec_helper"
|
|
19
|
+
require "chef-dk/chef_server_api_multi"
|
|
20
|
+
|
|
21
|
+
describe ChefDK::ChefServerAPIMulti do
|
|
22
|
+
|
|
23
|
+
let(:url) { "https://chef.example/organizations/myorg" }
|
|
24
|
+
|
|
25
|
+
let(:opts) do
|
|
26
|
+
{
|
|
27
|
+
signing_key_filename: "/path/to/key.pem",
|
|
28
|
+
client_name: "example-user",
|
|
29
|
+
}
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
let(:expected_server_api_opts) do
|
|
33
|
+
{
|
|
34
|
+
signing_key_filename: "/path/to/key.pem",
|
|
35
|
+
client_name: "example-user",
|
|
36
|
+
keepalives: true,
|
|
37
|
+
}
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
let(:chef_server_api) { instance_double("Chef::ServerAPI") }
|
|
41
|
+
|
|
42
|
+
subject(:server_api_multi) { described_class.new(url, opts) }
|
|
43
|
+
|
|
44
|
+
before do
|
|
45
|
+
# clean out thread local storage or else `chef_server_api` instance double
|
|
46
|
+
# will get re-used across test examples and rspec will complain:
|
|
47
|
+
Thread.current[:chef_server_api_multi] = nil
|
|
48
|
+
allow(Chef::ServerAPI).to receive(:new).with(url, expected_server_api_opts).and_return(chef_server_api)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "has a url" do
|
|
52
|
+
expect(server_api_multi.url).to eq(url)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
it "has an options hash for Chef::ServerAPI, with `keepalives: true` added" do
|
|
56
|
+
expect(server_api_multi.opts).to eq(expected_server_api_opts)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it "creates a thread-local Chef::ServerAPI object for requests" do
|
|
60
|
+
server_api_multi.client_for_thread # force `||=` to run
|
|
61
|
+
expect(server_api_multi.client_for_thread).to eq(Thread.current[:chef_server_api_multi])
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
describe "when keepalives are disabled" do
|
|
65
|
+
|
|
66
|
+
let(:opts) do
|
|
67
|
+
{
|
|
68
|
+
signing_key_filename: "/path/to/key.pem",
|
|
69
|
+
client_name: "example-user",
|
|
70
|
+
keepalives: false,
|
|
71
|
+
}
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
it "does not override disabling them" do
|
|
75
|
+
expect(server_api_multi.opts[:keepalives]).to be(false)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
describe "delegating request methods to thread-local ServerAPI object" do
|
|
81
|
+
|
|
82
|
+
it "delegates #head" do
|
|
83
|
+
expect(chef_server_api).to receive(:head).with("/foo")
|
|
84
|
+
server_api_multi.head("/foo")
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
it "delegates #get" do
|
|
88
|
+
expect(chef_server_api).to receive(:get).with("/foo")
|
|
89
|
+
server_api_multi.get("/foo")
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
it "delegates #put" do
|
|
93
|
+
expect(chef_server_api).to receive(:put).with("/foo", "data")
|
|
94
|
+
server_api_multi.put("/foo", "data")
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it "delegates #post" do
|
|
98
|
+
expect(chef_server_api).to receive(:post).with("/foo", "data")
|
|
99
|
+
server_api_multi.post("/foo", "data")
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
it "delegates #delete" do
|
|
103
|
+
expect(chef_server_api).to receive(:delete).with("/foo")
|
|
104
|
+
server_api_multi.delete("/foo")
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
it "delegates #streaming_request" do
|
|
108
|
+
expect(chef_server_api).to receive(:streaming_request).with("/foo")
|
|
109
|
+
server_api_multi.streaming_request("/foo")
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
it "passes a block argument to #streaming_request" do
|
|
113
|
+
expect(chef_server_api).to receive(:streaming_request).with("/foo").and_yield
|
|
114
|
+
x = 0
|
|
115
|
+
server_api_multi.streaming_request("/foo") { x = 5 }
|
|
116
|
+
expect(x).to eq(5)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
end
|
|
120
|
+
end
|
data/spec/unit/cli_spec.rb
CHANGED
|
@@ -1,377 +1,377 @@
|
|
|
1
|
-
# Copyright:: Copyright (c) 2014 Chef Software Inc.
|
|
2
|
-
# License:: Apache License, Version 2.0
|
|
3
|
-
#
|
|
4
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
# you may not use this file except in compliance with the License.
|
|
6
|
-
# You may obtain a copy of the License at
|
|
7
|
-
#
|
|
8
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
#
|
|
10
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
# See the License for the specific language governing permissions and
|
|
14
|
-
# limitations under the License.
|
|
15
|
-
#
|
|
16
|
-
|
|
17
|
-
require "spec_helper"
|
|
18
|
-
require "stringio"
|
|
19
|
-
require "chef-dk/cli"
|
|
20
|
-
require "unit/fixtures/command/cli_test_command"
|
|
21
|
-
|
|
22
|
-
describe ChefDK::CLI do
|
|
23
|
-
|
|
24
|
-
let(:argv) { [] }
|
|
25
|
-
|
|
26
|
-
# Setup a new commands map so we control what subcommands exist. Otherwise
|
|
27
|
-
# we'd have to update this test for every new subcommand we add or code the
|
|
28
|
-
# tests defensively.
|
|
29
|
-
let(:commands_map) { ChefDK::CommandsMap.new }
|
|
30
|
-
|
|
31
|
-
let(:stdout_io) { StringIO.new }
|
|
32
|
-
let(:stderr_io) { StringIO.new }
|
|
33
|
-
|
|
34
|
-
def stdout
|
|
35
|
-
stdout_io.string
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def stderr
|
|
39
|
-
stderr_io.string
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
let(:base_help_message) do
|
|
43
|
-
<<-E
|
|
44
|
-
Usage:
|
|
45
|
-
chef -h/--help
|
|
46
|
-
chef -v/--version
|
|
47
|
-
chef command [arguments...] [options...]
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
Available Commands:
|
|
51
|
-
verify Test the embedded ChefDK applications
|
|
52
|
-
gem Runs the `gem` command in context of the embedded ruby
|
|
53
|
-
example Example subcommand for testing
|
|
54
|
-
E
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
let(:version_message) { "Chef Development Kit Version: #{ChefDK::VERSION}\n" }
|
|
58
|
-
|
|
59
|
-
def run_cli(expected_exit_code)
|
|
60
|
-
expect(cli).to receive(:exit).with(expected_exit_code)
|
|
61
|
-
expect(cli).to receive(:sanity_check!)
|
|
62
|
-
cli.run
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
def run_cli_with_sanity_check(expected_exit_code)
|
|
66
|
-
expect(cli).to receive(:exit).with(expected_exit_code)
|
|
67
|
-
cli.run
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
def run_cli_and_validate_tool_versions
|
|
71
|
-
full_version_message = version_message
|
|
72
|
-
tools.each do |name, version|
|
|
73
|
-
expect(cli).to receive(:shell_out).with("#{name} --version").and_return(mock_shell_out(0, "#{version["version_output"]}", ""))
|
|
74
|
-
full_version_message += "#{name} version: #{version["expected_version"]}\n"
|
|
75
|
-
end
|
|
76
|
-
run_cli(0)
|
|
77
|
-
expect(stdout).to eq(full_version_message)
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
def mock_shell_out(exitstatus, stdout, stderr)
|
|
81
|
-
shell_out = double("mixlib_shell_out")
|
|
82
|
-
allow(shell_out).to receive(:exitstatus).and_return(exitstatus)
|
|
83
|
-
allow(shell_out).to receive(:stdout).and_return(stdout)
|
|
84
|
-
allow(shell_out).to receive(:stderr).and_return(stderr)
|
|
85
|
-
shell_out
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
subject(:cli) do
|
|
89
|
-
ChefDK::CLI.new(argv).tap do |c|
|
|
90
|
-
allow(c).to receive(:commands_map).and_return(commands_map)
|
|
91
|
-
allow(c).to receive(:stdout).and_return(stdout_io)
|
|
92
|
-
allow(c).to receive(:stderr).and_return(stderr_io)
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
before do
|
|
97
|
-
commands_map.builtin "verify", :Verify, desc: "Test the embedded ChefDK applications"
|
|
98
|
-
|
|
99
|
-
commands_map.builtin "gem", :GemForwarder, require_path: "chef-dk/command/gem",
|
|
100
|
-
desc: "Runs the `gem` command in context of the embedded ruby"
|
|
101
|
-
|
|
102
|
-
commands_map.builtin "example", :TestCommand, require_path: "unit/fixtures/command/cli_test_command",
|
|
103
|
-
desc: "Example subcommand for testing"
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
context "given no arguments or options" do
|
|
107
|
-
|
|
108
|
-
it "prints the help output" do
|
|
109
|
-
run_cli(0)
|
|
110
|
-
expect(stdout).to eq(base_help_message)
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
context "given -h" do
|
|
116
|
-
let(:argv) { %w{-h} }
|
|
117
|
-
|
|
118
|
-
it "prints the help output" do
|
|
119
|
-
run_cli(0)
|
|
120
|
-
expect(stdout).to eq(base_help_message)
|
|
121
|
-
end
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
context "given -v" do
|
|
125
|
-
let(:argv) { %w{-v} }
|
|
126
|
-
let(:delivery_version) { "master (454c3f37819ed508a49c971f38e42267ce8a47de)" }
|
|
127
|
-
|
|
128
|
-
let(:tools) do
|
|
129
|
-
{
|
|
130
|
-
"chef-client" => {
|
|
131
|
-
"version_output" => "Chef: 12.0.3",
|
|
132
|
-
"expected_version" => "12.0.3",
|
|
133
|
-
},
|
|
134
|
-
"delivery" => {
|
|
135
|
-
"version_output" => "delivery #{delivery_version}",
|
|
136
|
-
"expected_version" => delivery_version,
|
|
137
|
-
},
|
|
138
|
-
"berks" => {
|
|
139
|
-
"version_output" => "3.2.3",
|
|
140
|
-
"expected_version" => "3.2.3",
|
|
141
|
-
},
|
|
142
|
-
"kitchen" => {
|
|
143
|
-
"version_output" => "Test Kitchen version 1.3.1",
|
|
144
|
-
"expected_version" => "1.3.1",
|
|
145
|
-
},
|
|
146
|
-
"inspec" => {
|
|
147
|
-
"version_output" => "1.19.1\n\nYour version of InSpec is out of date! The latest version is 1.21.0.",
|
|
148
|
-
"expected_version" => "1.19.1",
|
|
149
|
-
},
|
|
150
|
-
}
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
it "does not print versions of tools with missing or errored tools" do
|
|
154
|
-
full_version_message = version_message
|
|
155
|
-
tools.each do |name, version|
|
|
156
|
-
if name == "berks"
|
|
157
|
-
expect(cli).to receive(:shell_out).with("#{name} --version").and_return(mock_shell_out(1, "#{version["version_output"]}", ""))
|
|
158
|
-
full_version_message += "#{name} version: ERROR\n"
|
|
159
|
-
else
|
|
160
|
-
expect(cli).to receive(:shell_out).with("#{name} --version").and_return(mock_shell_out(0, "#{version["version_output"]}", ""))
|
|
161
|
-
full_version_message += "#{name} version: #{version["expected_version"]}\n"
|
|
162
|
-
end
|
|
163
|
-
end
|
|
164
|
-
run_cli(0)
|
|
165
|
-
expect(stdout).to eq(full_version_message)
|
|
166
|
-
end
|
|
167
|
-
|
|
168
|
-
it "prints the version and versions of chef-dk tools" do
|
|
169
|
-
run_cli_and_validate_tool_versions
|
|
170
|
-
end
|
|
171
|
-
|
|
172
|
-
context "alternate Delivery CLI version format" do
|
|
173
|
-
let(:delivery_version) { "0.0.15 (454c3f37819ed508a49c971f38e42267ce8a47de)" }
|
|
174
|
-
|
|
175
|
-
it "prints the expected version of Delivery CLI" do
|
|
176
|
-
run_cli_and_validate_tool_versions
|
|
177
|
-
end
|
|
178
|
-
end
|
|
179
|
-
end
|
|
180
|
-
|
|
181
|
-
context "given an invalid option" do
|
|
182
|
-
|
|
183
|
-
let(:argv) { %w{-nope} }
|
|
184
|
-
|
|
185
|
-
it "prints an 'invalid option message and the help output, then exits non-zero" do
|
|
186
|
-
run_cli(1)
|
|
187
|
-
expect(stdout).to eq(base_help_message)
|
|
188
|
-
expect(stderr).to eq("invalid option: -nope\n")
|
|
189
|
-
end
|
|
190
|
-
|
|
191
|
-
end
|
|
192
|
-
|
|
193
|
-
context "given an invalid/unknown subcommand" do
|
|
194
|
-
let(:argv) { %w{ancient-aliens} }
|
|
195
|
-
|
|
196
|
-
it "prints an 'unknown command' message and the help output" do
|
|
197
|
-
expected_err = "Unknown command `ancient-aliens'.\n"
|
|
198
|
-
|
|
199
|
-
run_cli(1)
|
|
200
|
-
|
|
201
|
-
expect(stderr).to eq(expected_err)
|
|
202
|
-
expect(stdout).to eq(base_help_message)
|
|
203
|
-
end
|
|
204
|
-
|
|
205
|
-
end
|
|
206
|
-
|
|
207
|
-
context "given a valid subcommand" do
|
|
208
|
-
let(:argv) { %w{example with some args --and-an-option} }
|
|
209
|
-
|
|
210
|
-
def test_result
|
|
211
|
-
ChefDK::Command::TestCommand.test_result
|
|
212
|
-
end
|
|
213
|
-
|
|
214
|
-
before do
|
|
215
|
-
ChefDK::Command::TestCommand.reset!
|
|
216
|
-
end
|
|
217
|
-
|
|
218
|
-
it "runs the subcommand" do
|
|
219
|
-
run_cli(23)
|
|
220
|
-
expect(test_result[:status]).to eq(:success)
|
|
221
|
-
end
|
|
222
|
-
|
|
223
|
-
it "exits with the return code given by the subcommand" do
|
|
224
|
-
run_cli(23)
|
|
225
|
-
end
|
|
226
|
-
|
|
227
|
-
it "passes arguments and options to the subcommand" do
|
|
228
|
-
params = %w{with some args --and-an-option}
|
|
229
|
-
run_cli(23)
|
|
230
|
-
expect(test_result[:params]).to eq(params)
|
|
231
|
-
end
|
|
232
|
-
end
|
|
233
|
-
|
|
234
|
-
context "sanity_check!" do
|
|
235
|
-
|
|
236
|
-
before do
|
|
237
|
-
allow(Gem).to receive(:ruby).and_return(ruby_path)
|
|
238
|
-
allow(File).to receive(:exist?).with(chefdk_embedded_path).and_return(true)
|
|
239
|
-
allow(cli).to receive(:omnibus_chefdk_location).and_return(chefdk_embedded_path)
|
|
240
|
-
end
|
|
241
|
-
|
|
242
|
-
context "when installed via omnibus" do
|
|
243
|
-
|
|
244
|
-
context "on unix" do
|
|
245
|
-
|
|
246
|
-
let(:ruby_path) { "/opt/chefdk/embedded/bin/ruby" }
|
|
247
|
-
let(:chefdk_embedded_path) { "/opt/chefdk/embedded/apps/chef-dk" }
|
|
248
|
-
|
|
249
|
-
before do
|
|
250
|
-
stub_const("File::PATH_SEPARATOR", ":")
|
|
251
|
-
allow(Chef::Util::PathHelper).to receive(:cleanpath) do |path|
|
|
252
|
-
path
|
|
253
|
-
end
|
|
254
|
-
end
|
|
255
|
-
|
|
256
|
-
it "complains if embedded is first" do
|
|
257
|
-
allow(cli).to receive(:env).and_return({ "PATH" => "/opt/chefdk/embedded/bin:/opt/chefdk/bin" })
|
|
258
|
-
allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("/opt/chefdk/embedded/bin")
|
|
259
|
-
allow(cli).to receive(:omnibus_bin_dir).and_return("/opt/chefdk/bin")
|
|
260
|
-
run_cli_with_sanity_check(0)
|
|
261
|
-
expect(stdout).to eq(base_help_message)
|
|
262
|
-
expect(stderr).to include("please reverse that order")
|
|
263
|
-
expect(stderr).to include("chef shell-init")
|
|
264
|
-
end
|
|
265
|
-
|
|
266
|
-
it "complains if only embedded is present" do
|
|
267
|
-
allow(cli).to receive(:env).and_return({ "PATH" => "/opt/chefdk/embedded/bin" })
|
|
268
|
-
allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("/opt/chefdk/embedded/bin")
|
|
269
|
-
allow(cli).to receive(:omnibus_bin_dir).and_return("/opt/chefdk/bin")
|
|
270
|
-
run_cli_with_sanity_check(0)
|
|
271
|
-
expect(stdout).to eq(base_help_message)
|
|
272
|
-
expect(stderr).to include("you must add")
|
|
273
|
-
expect(stderr).to include("chef shell-init")
|
|
274
|
-
end
|
|
275
|
-
|
|
276
|
-
it "passes when both are present in the correct order" do
|
|
277
|
-
allow(cli).to receive(:env).and_return({ "PATH" => "/opt/chefdk/bin:/opt/chefdk/embedded/bin" })
|
|
278
|
-
allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("/opt/chefdk/embedded/bin")
|
|
279
|
-
allow(cli).to receive(:omnibus_bin_dir).and_return("/opt/chefdk/bin")
|
|
280
|
-
run_cli_with_sanity_check(0)
|
|
281
|
-
expect(stdout).to eq(base_help_message)
|
|
282
|
-
end
|
|
283
|
-
|
|
284
|
-
it "passes when only the omnibus bin dir is present" do
|
|
285
|
-
allow(cli).to receive(:env).and_return({ "PATH" => "/opt/chefdk/bin" })
|
|
286
|
-
allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("/opt/chefdk/embedded/bin")
|
|
287
|
-
allow(cli).to receive(:omnibus_bin_dir).and_return("/opt/chefdk/bin")
|
|
288
|
-
run_cli_with_sanity_check(0)
|
|
289
|
-
expect(stdout).to eq(base_help_message)
|
|
290
|
-
end
|
|
291
|
-
end
|
|
292
|
-
|
|
293
|
-
context "on windows" do
|
|
294
|
-
|
|
295
|
-
let(:ruby_path) { "c:/opscode/chefdk/embedded/bin/ruby.exe" }
|
|
296
|
-
let(:chefdk_embedded_path) { "c:/opscode/chefdk/embedded/apps/chef-dk" }
|
|
297
|
-
|
|
298
|
-
before do
|
|
299
|
-
# Would be preferable not to stub this, but `File.expand_path` does
|
|
300
|
-
# weird things with windows paths on unix machines.
|
|
301
|
-
#
|
|
302
|
-
# I manually verified the behavior:
|
|
303
|
-
#
|
|
304
|
-
# $ /c/opscode/chefdk/embedded/bin/ruby -e 'p File.expand_path(File.join(Gem.ruby, "..", "..", ".."))'
|
|
305
|
-
# "c:/opscode/chefdk"
|
|
306
|
-
allow(cli).to receive(:omnibus_chefdk_location).and_return(chefdk_embedded_path)
|
|
307
|
-
|
|
308
|
-
allow(Chef::Platform).to receive(:windows?).and_return(true)
|
|
309
|
-
stub_const("File::PATH_SEPARATOR", ";")
|
|
310
|
-
allow(Chef::Util::PathHelper).to receive(:cleanpath) do |path|
|
|
311
|
-
path.tr "/", "\\"
|
|
312
|
-
end
|
|
313
|
-
end
|
|
314
|
-
|
|
315
|
-
it "complains if embedded is first" do
|
|
316
|
-
allow(cli).to receive(:env).and_return({ "PATH" => 'C:\opscode\chefdk\embedded\bin;C:\opscode\chefdk\bin' })
|
|
317
|
-
allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("c:/opscode/chefdk/embedded/bin")
|
|
318
|
-
allow(cli).to receive(:omnibus_bin_dir).and_return("c:/opscode/chefdk/bin")
|
|
319
|
-
run_cli_with_sanity_check(0)
|
|
320
|
-
expect(stdout).to eq(base_help_message)
|
|
321
|
-
expect(stderr).to include("please reverse that order")
|
|
322
|
-
expect(stderr).to include("chef shell-init")
|
|
323
|
-
end
|
|
324
|
-
|
|
325
|
-
it "complains if only embedded is present" do
|
|
326
|
-
allow(cli).to receive(:env).and_return({ "PATH" => 'C:\opscode\chefdk\embedded\bin' })
|
|
327
|
-
allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("c:/opscode/chefdk/embedded/bin")
|
|
328
|
-
allow(cli).to receive(:omnibus_bin_dir).and_return("c:/opscode/chefdk/bin")
|
|
329
|
-
run_cli_with_sanity_check(0)
|
|
330
|
-
expect(stdout).to eq(base_help_message)
|
|
331
|
-
expect(stderr).to include("you must add")
|
|
332
|
-
expect(stderr).to include("chef shell-init")
|
|
333
|
-
end
|
|
334
|
-
|
|
335
|
-
it "passes when both are present in the correct order" do
|
|
336
|
-
allow(cli).to receive(:env).and_return({ "PATH" => 'C:\opscode\chefdk\bin;C:\opscode\chefdk\embedded\bin' })
|
|
337
|
-
allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("c:/opscode/chefdk/embedded/bin")
|
|
338
|
-
allow(cli).to receive(:omnibus_bin_dir).and_return("c:/opscode/chefdk/bin")
|
|
339
|
-
run_cli_with_sanity_check(0)
|
|
340
|
-
expect(stdout).to eq(base_help_message)
|
|
341
|
-
end
|
|
342
|
-
|
|
343
|
-
it "passes when only the omnibus bin dir is present" do
|
|
344
|
-
allow(cli).to receive(:env).and_return({ "PATH" => 'C:\opscode\chefdk\bin' })
|
|
345
|
-
allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("c:/opscode/chefdk/embedded/bin")
|
|
346
|
-
allow(cli).to receive(:omnibus_bin_dir).and_return("c:/opscode/chefdk/bin")
|
|
347
|
-
run_cli_with_sanity_check(0)
|
|
348
|
-
expect(stdout).to eq(base_help_message)
|
|
349
|
-
end
|
|
350
|
-
end
|
|
351
|
-
end
|
|
352
|
-
|
|
353
|
-
context "when not installed via omnibus" do
|
|
354
|
-
|
|
355
|
-
let(:ruby_path) { "/Users/bog/.lots_o_rubies/2.1.2/bin/ruby" }
|
|
356
|
-
let(:chefdk_embedded_path) { "/Users/bog/.lots_o_rubies/embedded/apps/chef-dk" }
|
|
357
|
-
|
|
358
|
-
before do
|
|
359
|
-
allow(File).to receive(:exist?).with(chefdk_embedded_path).and_return(false)
|
|
360
|
-
|
|
361
|
-
[
|
|
362
|
-
:omnibus_root,
|
|
363
|
-
:omnibus_apps_dir,
|
|
364
|
-
:omnibus_bin_dir,
|
|
365
|
-
:omnibus_embedded_bin_dir,
|
|
366
|
-
].each do |method_name|
|
|
367
|
-
allow(cli).to receive(method_name).and_raise(ChefDK::OmnibusInstallNotFound.new)
|
|
368
|
-
end
|
|
369
|
-
end
|
|
370
|
-
|
|
371
|
-
it "skips the sanity check without error" do
|
|
372
|
-
run_cli_with_sanity_check(0)
|
|
373
|
-
end
|
|
374
|
-
|
|
375
|
-
end
|
|
376
|
-
end
|
|
377
|
-
end
|
|
1
|
+
# Copyright:: Copyright (c) 2014-2018 Chef Software Inc.
|
|
2
|
+
# License:: Apache License, Version 2.0
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
#
|
|
16
|
+
|
|
17
|
+
require "spec_helper"
|
|
18
|
+
require "stringio"
|
|
19
|
+
require "chef-dk/cli"
|
|
20
|
+
require "unit/fixtures/command/cli_test_command"
|
|
21
|
+
|
|
22
|
+
describe ChefDK::CLI do
|
|
23
|
+
|
|
24
|
+
let(:argv) { [] }
|
|
25
|
+
|
|
26
|
+
# Setup a new commands map so we control what subcommands exist. Otherwise
|
|
27
|
+
# we'd have to update this test for every new subcommand we add or code the
|
|
28
|
+
# tests defensively.
|
|
29
|
+
let(:commands_map) { ChefDK::CommandsMap.new }
|
|
30
|
+
|
|
31
|
+
let(:stdout_io) { StringIO.new }
|
|
32
|
+
let(:stderr_io) { StringIO.new }
|
|
33
|
+
|
|
34
|
+
def stdout
|
|
35
|
+
stdout_io.string
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def stderr
|
|
39
|
+
stderr_io.string
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
let(:base_help_message) do
|
|
43
|
+
<<-E
|
|
44
|
+
Usage:
|
|
45
|
+
chef -h/--help
|
|
46
|
+
chef -v/--version
|
|
47
|
+
chef command [arguments...] [options...]
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
Available Commands:
|
|
51
|
+
verify Test the embedded ChefDK applications
|
|
52
|
+
gem Runs the `gem` command in context of the embedded ruby
|
|
53
|
+
example Example subcommand for testing
|
|
54
|
+
E
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
let(:version_message) { "Chef Development Kit Version: #{ChefDK::VERSION}\n" }
|
|
58
|
+
|
|
59
|
+
def run_cli(expected_exit_code)
|
|
60
|
+
expect(cli).to receive(:exit).with(expected_exit_code)
|
|
61
|
+
expect(cli).to receive(:sanity_check!)
|
|
62
|
+
cli.run
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def run_cli_with_sanity_check(expected_exit_code)
|
|
66
|
+
expect(cli).to receive(:exit).with(expected_exit_code)
|
|
67
|
+
cli.run
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def run_cli_and_validate_tool_versions
|
|
71
|
+
full_version_message = version_message
|
|
72
|
+
tools.each do |name, version|
|
|
73
|
+
expect(cli).to receive(:shell_out).with("#{name} --version").and_return(mock_shell_out(0, "#{version["version_output"]}", ""))
|
|
74
|
+
full_version_message += "#{name} version: #{version["expected_version"]}\n"
|
|
75
|
+
end
|
|
76
|
+
run_cli(0)
|
|
77
|
+
expect(stdout).to eq(full_version_message)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def mock_shell_out(exitstatus, stdout, stderr)
|
|
81
|
+
shell_out = double("mixlib_shell_out")
|
|
82
|
+
allow(shell_out).to receive(:exitstatus).and_return(exitstatus)
|
|
83
|
+
allow(shell_out).to receive(:stdout).and_return(stdout)
|
|
84
|
+
allow(shell_out).to receive(:stderr).and_return(stderr)
|
|
85
|
+
shell_out
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
subject(:cli) do
|
|
89
|
+
ChefDK::CLI.new(argv).tap do |c|
|
|
90
|
+
allow(c).to receive(:commands_map).and_return(commands_map)
|
|
91
|
+
allow(c).to receive(:stdout).and_return(stdout_io)
|
|
92
|
+
allow(c).to receive(:stderr).and_return(stderr_io)
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
before do
|
|
97
|
+
commands_map.builtin "verify", :Verify, desc: "Test the embedded ChefDK applications"
|
|
98
|
+
|
|
99
|
+
commands_map.builtin "gem", :GemForwarder, require_path: "chef-dk/command/gem",
|
|
100
|
+
desc: "Runs the `gem` command in context of the embedded ruby"
|
|
101
|
+
|
|
102
|
+
commands_map.builtin "example", :TestCommand, require_path: "unit/fixtures/command/cli_test_command",
|
|
103
|
+
desc: "Example subcommand for testing"
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
context "given no arguments or options" do
|
|
107
|
+
|
|
108
|
+
it "prints the help output" do
|
|
109
|
+
run_cli(0)
|
|
110
|
+
expect(stdout).to eq(base_help_message)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
context "given -h" do
|
|
116
|
+
let(:argv) { %w{-h} }
|
|
117
|
+
|
|
118
|
+
it "prints the help output" do
|
|
119
|
+
run_cli(0)
|
|
120
|
+
expect(stdout).to eq(base_help_message)
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
context "given -v" do
|
|
125
|
+
let(:argv) { %w{-v} }
|
|
126
|
+
let(:delivery_version) { "master (454c3f37819ed508a49c971f38e42267ce8a47de)" }
|
|
127
|
+
|
|
128
|
+
let(:tools) do
|
|
129
|
+
{
|
|
130
|
+
"chef-client" => {
|
|
131
|
+
"version_output" => "Chef: 12.0.3",
|
|
132
|
+
"expected_version" => "12.0.3",
|
|
133
|
+
},
|
|
134
|
+
"delivery" => {
|
|
135
|
+
"version_output" => "delivery #{delivery_version}",
|
|
136
|
+
"expected_version" => delivery_version,
|
|
137
|
+
},
|
|
138
|
+
"berks" => {
|
|
139
|
+
"version_output" => "3.2.3",
|
|
140
|
+
"expected_version" => "3.2.3",
|
|
141
|
+
},
|
|
142
|
+
"kitchen" => {
|
|
143
|
+
"version_output" => "Test Kitchen version 1.3.1",
|
|
144
|
+
"expected_version" => "1.3.1",
|
|
145
|
+
},
|
|
146
|
+
"inspec" => {
|
|
147
|
+
"version_output" => "1.19.1\n\nYour version of InSpec is out of date! The latest version is 1.21.0.",
|
|
148
|
+
"expected_version" => "1.19.1",
|
|
149
|
+
},
|
|
150
|
+
}
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
it "does not print versions of tools with missing or errored tools" do
|
|
154
|
+
full_version_message = version_message
|
|
155
|
+
tools.each do |name, version|
|
|
156
|
+
if name == "berks"
|
|
157
|
+
expect(cli).to receive(:shell_out).with("#{name} --version").and_return(mock_shell_out(1, "#{version["version_output"]}", ""))
|
|
158
|
+
full_version_message += "#{name} version: ERROR\n"
|
|
159
|
+
else
|
|
160
|
+
expect(cli).to receive(:shell_out).with("#{name} --version").and_return(mock_shell_out(0, "#{version["version_output"]}", ""))
|
|
161
|
+
full_version_message += "#{name} version: #{version["expected_version"]}\n"
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
run_cli(0)
|
|
165
|
+
expect(stdout).to eq(full_version_message)
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
it "prints the version and versions of chef-dk tools" do
|
|
169
|
+
run_cli_and_validate_tool_versions
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
context "alternate Delivery CLI version format" do
|
|
173
|
+
let(:delivery_version) { "0.0.15 (454c3f37819ed508a49c971f38e42267ce8a47de)" }
|
|
174
|
+
|
|
175
|
+
it "prints the expected version of Delivery CLI" do
|
|
176
|
+
run_cli_and_validate_tool_versions
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
context "given an invalid option" do
|
|
182
|
+
|
|
183
|
+
let(:argv) { %w{-nope} }
|
|
184
|
+
|
|
185
|
+
it "prints an 'invalid option message and the help output, then exits non-zero" do
|
|
186
|
+
run_cli(1)
|
|
187
|
+
expect(stdout).to eq(base_help_message)
|
|
188
|
+
expect(stderr).to eq("invalid option: -nope\n")
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
context "given an invalid/unknown subcommand" do
|
|
194
|
+
let(:argv) { %w{ancient-aliens} }
|
|
195
|
+
|
|
196
|
+
it "prints an 'unknown command' message and the help output" do
|
|
197
|
+
expected_err = "Unknown command `ancient-aliens'.\n"
|
|
198
|
+
|
|
199
|
+
run_cli(1)
|
|
200
|
+
|
|
201
|
+
expect(stderr).to eq(expected_err)
|
|
202
|
+
expect(stdout).to eq(base_help_message)
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
context "given a valid subcommand" do
|
|
208
|
+
let(:argv) { %w{example with some args --and-an-option} }
|
|
209
|
+
|
|
210
|
+
def test_result
|
|
211
|
+
ChefDK::Command::TestCommand.test_result
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
before do
|
|
215
|
+
ChefDK::Command::TestCommand.reset!
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
it "runs the subcommand" do
|
|
219
|
+
run_cli(23)
|
|
220
|
+
expect(test_result[:status]).to eq(:success)
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
it "exits with the return code given by the subcommand" do
|
|
224
|
+
run_cli(23)
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
it "passes arguments and options to the subcommand" do
|
|
228
|
+
params = %w{with some args --and-an-option}
|
|
229
|
+
run_cli(23)
|
|
230
|
+
expect(test_result[:params]).to eq(params)
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
context "sanity_check!" do
|
|
235
|
+
|
|
236
|
+
before do
|
|
237
|
+
allow(Gem).to receive(:ruby).and_return(ruby_path)
|
|
238
|
+
allow(File).to receive(:exist?).with(chefdk_embedded_path).and_return(true)
|
|
239
|
+
allow(cli).to receive(:omnibus_chefdk_location).and_return(chefdk_embedded_path)
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
context "when installed via omnibus" do
|
|
243
|
+
|
|
244
|
+
context "on unix" do
|
|
245
|
+
|
|
246
|
+
let(:ruby_path) { "/opt/chefdk/embedded/bin/ruby" }
|
|
247
|
+
let(:chefdk_embedded_path) { "/opt/chefdk/embedded/apps/chef-dk" }
|
|
248
|
+
|
|
249
|
+
before do
|
|
250
|
+
stub_const("File::PATH_SEPARATOR", ":")
|
|
251
|
+
allow(Chef::Util::PathHelper).to receive(:cleanpath) do |path|
|
|
252
|
+
path
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
it "complains if embedded is first" do
|
|
257
|
+
allow(cli).to receive(:env).and_return({ "PATH" => "/opt/chefdk/embedded/bin:/opt/chefdk/bin" })
|
|
258
|
+
allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("/opt/chefdk/embedded/bin")
|
|
259
|
+
allow(cli).to receive(:omnibus_bin_dir).and_return("/opt/chefdk/bin")
|
|
260
|
+
run_cli_with_sanity_check(0)
|
|
261
|
+
expect(stdout).to eq(base_help_message)
|
|
262
|
+
expect(stderr).to include("please reverse that order")
|
|
263
|
+
expect(stderr).to include("chef shell-init")
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
it "complains if only embedded is present" do
|
|
267
|
+
allow(cli).to receive(:env).and_return({ "PATH" => "/opt/chefdk/embedded/bin" })
|
|
268
|
+
allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("/opt/chefdk/embedded/bin")
|
|
269
|
+
allow(cli).to receive(:omnibus_bin_dir).and_return("/opt/chefdk/bin")
|
|
270
|
+
run_cli_with_sanity_check(0)
|
|
271
|
+
expect(stdout).to eq(base_help_message)
|
|
272
|
+
expect(stderr).to include("you must add")
|
|
273
|
+
expect(stderr).to include("chef shell-init")
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
it "passes when both are present in the correct order" do
|
|
277
|
+
allow(cli).to receive(:env).and_return({ "PATH" => "/opt/chefdk/bin:/opt/chefdk/embedded/bin" })
|
|
278
|
+
allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("/opt/chefdk/embedded/bin")
|
|
279
|
+
allow(cli).to receive(:omnibus_bin_dir).and_return("/opt/chefdk/bin")
|
|
280
|
+
run_cli_with_sanity_check(0)
|
|
281
|
+
expect(stdout).to eq(base_help_message)
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
it "passes when only the omnibus bin dir is present" do
|
|
285
|
+
allow(cli).to receive(:env).and_return({ "PATH" => "/opt/chefdk/bin" })
|
|
286
|
+
allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("/opt/chefdk/embedded/bin")
|
|
287
|
+
allow(cli).to receive(:omnibus_bin_dir).and_return("/opt/chefdk/bin")
|
|
288
|
+
run_cli_with_sanity_check(0)
|
|
289
|
+
expect(stdout).to eq(base_help_message)
|
|
290
|
+
end
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
context "on windows" do
|
|
294
|
+
|
|
295
|
+
let(:ruby_path) { "c:/opscode/chefdk/embedded/bin/ruby.exe" }
|
|
296
|
+
let(:chefdk_embedded_path) { "c:/opscode/chefdk/embedded/apps/chef-dk" }
|
|
297
|
+
|
|
298
|
+
before do
|
|
299
|
+
# Would be preferable not to stub this, but `File.expand_path` does
|
|
300
|
+
# weird things with windows paths on unix machines.
|
|
301
|
+
#
|
|
302
|
+
# I manually verified the behavior:
|
|
303
|
+
#
|
|
304
|
+
# $ /c/opscode/chefdk/embedded/bin/ruby -e 'p File.expand_path(File.join(Gem.ruby, "..", "..", ".."))'
|
|
305
|
+
# "c:/opscode/chefdk"
|
|
306
|
+
allow(cli).to receive(:omnibus_chefdk_location).and_return(chefdk_embedded_path)
|
|
307
|
+
|
|
308
|
+
allow(Chef::Platform).to receive(:windows?).and_return(true)
|
|
309
|
+
stub_const("File::PATH_SEPARATOR", ";")
|
|
310
|
+
allow(Chef::Util::PathHelper).to receive(:cleanpath) do |path|
|
|
311
|
+
path.tr "/", "\\"
|
|
312
|
+
end
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
it "complains if embedded is first" do
|
|
316
|
+
allow(cli).to receive(:env).and_return({ "PATH" => 'C:\opscode\chefdk\embedded\bin;C:\opscode\chefdk\bin' })
|
|
317
|
+
allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("c:/opscode/chefdk/embedded/bin")
|
|
318
|
+
allow(cli).to receive(:omnibus_bin_dir).and_return("c:/opscode/chefdk/bin")
|
|
319
|
+
run_cli_with_sanity_check(0)
|
|
320
|
+
expect(stdout).to eq(base_help_message)
|
|
321
|
+
expect(stderr).to include("please reverse that order")
|
|
322
|
+
expect(stderr).to include("chef shell-init")
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
it "complains if only embedded is present" do
|
|
326
|
+
allow(cli).to receive(:env).and_return({ "PATH" => 'C:\opscode\chefdk\embedded\bin' })
|
|
327
|
+
allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("c:/opscode/chefdk/embedded/bin")
|
|
328
|
+
allow(cli).to receive(:omnibus_bin_dir).and_return("c:/opscode/chefdk/bin")
|
|
329
|
+
run_cli_with_sanity_check(0)
|
|
330
|
+
expect(stdout).to eq(base_help_message)
|
|
331
|
+
expect(stderr).to include("you must add")
|
|
332
|
+
expect(stderr).to include("chef shell-init")
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
it "passes when both are present in the correct order" do
|
|
336
|
+
allow(cli).to receive(:env).and_return({ "PATH" => 'C:\opscode\chefdk\bin;C:\opscode\chefdk\embedded\bin' })
|
|
337
|
+
allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("c:/opscode/chefdk/embedded/bin")
|
|
338
|
+
allow(cli).to receive(:omnibus_bin_dir).and_return("c:/opscode/chefdk/bin")
|
|
339
|
+
run_cli_with_sanity_check(0)
|
|
340
|
+
expect(stdout).to eq(base_help_message)
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
it "passes when only the omnibus bin dir is present" do
|
|
344
|
+
allow(cli).to receive(:env).and_return({ "PATH" => 'C:\opscode\chefdk\bin' })
|
|
345
|
+
allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("c:/opscode/chefdk/embedded/bin")
|
|
346
|
+
allow(cli).to receive(:omnibus_bin_dir).and_return("c:/opscode/chefdk/bin")
|
|
347
|
+
run_cli_with_sanity_check(0)
|
|
348
|
+
expect(stdout).to eq(base_help_message)
|
|
349
|
+
end
|
|
350
|
+
end
|
|
351
|
+
end
|
|
352
|
+
|
|
353
|
+
context "when not installed via omnibus" do
|
|
354
|
+
|
|
355
|
+
let(:ruby_path) { "/Users/bog/.lots_o_rubies/2.1.2/bin/ruby" }
|
|
356
|
+
let(:chefdk_embedded_path) { "/Users/bog/.lots_o_rubies/embedded/apps/chef-dk" }
|
|
357
|
+
|
|
358
|
+
before do
|
|
359
|
+
allow(File).to receive(:exist?).with(chefdk_embedded_path).and_return(false)
|
|
360
|
+
|
|
361
|
+
[
|
|
362
|
+
:omnibus_root,
|
|
363
|
+
:omnibus_apps_dir,
|
|
364
|
+
:omnibus_bin_dir,
|
|
365
|
+
:omnibus_embedded_bin_dir,
|
|
366
|
+
].each do |method_name|
|
|
367
|
+
allow(cli).to receive(method_name).and_raise(ChefDK::OmnibusInstallNotFound.new)
|
|
368
|
+
end
|
|
369
|
+
end
|
|
370
|
+
|
|
371
|
+
it "skips the sanity check without error" do
|
|
372
|
+
run_cli_with_sanity_check(0)
|
|
373
|
+
end
|
|
374
|
+
|
|
375
|
+
end
|
|
376
|
+
end
|
|
377
|
+
end
|