chef-dk 0.4.0 → 0.5.0.rc.1
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/CONTRIBUTING.md +1 -3
- data/README.md +20 -15
- data/lib/chef-dk/cli.rb +18 -1
- data/lib/chef-dk/command/verify.rb +1 -1
- data/lib/chef-dk/policyfile/cookbook_location_specification.rb +5 -1
- data/lib/chef-dk/policyfile/read_cookbook_for_compat_mode_upload.rb +44 -0
- data/lib/chef-dk/policyfile/uploader.rb +58 -6
- data/lib/chef-dk/policyfile_lock.rb +42 -0
- data/lib/chef-dk/skeletons/code_generator/files/default/{repo/cookbooks → cookbook_readmes}/README-policy.md +0 -0
- data/lib/chef-dk/skeletons/code_generator/files/default/{repo/cookbooks → cookbook_readmes}/README.md +1 -1
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/attributes/default.rb +7 -0
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/metadata.rb +3 -0
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/recipes/default.rb +8 -0
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/data_bags/README.md +13 -18
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/data_bags/example/example_item.json +4 -0
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/environments/README.md +7 -3
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/environments/example.json +13 -0
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/roles/README.md +6 -13
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/roles/example.json +13 -0
- data/lib/chef-dk/skeletons/code_generator/recipes/app.rb +5 -1
- data/lib/chef-dk/skeletons/code_generator/recipes/cookbook.rb +5 -1
- data/lib/chef-dk/skeletons/code_generator/recipes/repo.rb +5 -20
- data/lib/chef-dk/version.rb +1 -1
- data/lib/kitchen/provisioner/policyfile_zero.rb +21 -9
- data/spec/spec_helper.rb +8 -0
- data/spec/unit/cli_spec.rb +49 -3
- data/spec/unit/command/generator_commands/app_spec.rb +1 -1
- data/spec/unit/command/generator_commands/cookbook_spec.rb +1 -1
- data/spec/unit/command/generator_commands/repo_spec.rb +46 -50
- data/spec/unit/policyfile/uploader_spec.rb +225 -171
- data/spec/unit/policyfile_evaluation_spec.rb +16 -0
- data/spec/unit/policyfile_lock_build_spec.rb +156 -0
- metadata +18 -9
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/Rakefile +0 -65
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/certificates/README.md +0 -19
- data/lib/chef-dk/skeletons/code_generator/templates/default/repo/config/rake.rb.erb +0 -38
    
        data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/recipes/default.rb
    ADDED
    
    | @@ -0,0 +1,8 @@ | |
| 1 | 
            +
            # This is a Chef recipe file. It can be used to specify resources which will
         | 
| 2 | 
            +
            # apply configuration to a server.
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            log "Welcome to Chef, #{node["example"]["name"]}!" do
         | 
| 5 | 
            +
              level :info
         | 
| 6 | 
            +
            end
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            # For more information, see the documentation: http://docs.getchef.com/essentials_cookbook_recipes.html
         | 
| @@ -3,28 +3,19 @@ Data Bags | |
| 3 3 |  | 
| 4 4 | 
             
            This directory contains directories of the various data bags you create for your infrastructure. Each subdirectory corresponds to a data bag on the Chef Server, and contains JSON files of the items that go in the bag.
         | 
| 5 5 |  | 
| 6 | 
            -
             | 
| 6 | 
            +
            For example, in this directory you'll find an example data bag directory called `example`, which contains an item definition called `example_item.json` 
         | 
| 7 | 
            +
             
         | 
| 8 | 
            +
            Before uploading this item to the server, we must first create the data bag on the Chef Server.
         | 
| 7 9 |  | 
| 8 | 
            -
                 | 
| 10 | 
            +
                knife data bag create example
         | 
| 9 11 |  | 
| 10 | 
            -
            Then  | 
| 12 | 
            +
            Then we can upload the items in the data bag's directory to the Chef Server.
         | 
| 11 13 |  | 
| 12 | 
            -
                 | 
| 13 | 
            -
             | 
| 14 | 
            -
            The JSON for the ITEM must contain a key named "id" with a value equal to "ITEM". For example,
         | 
| 15 | 
            -
             | 
| 16 | 
            -
                {
         | 
| 17 | 
            -
                  "id": "foo"
         | 
| 18 | 
            -
                }
         | 
| 19 | 
            -
             | 
| 20 | 
            -
            Next, create the data bag on the Chef Server.
         | 
| 21 | 
            -
             | 
| 22 | 
            -
                knife data bag create BAG
         | 
| 23 | 
            -
             | 
| 24 | 
            -
            Then upload the items in the data bag's directory to the Chef Server.
         | 
| 25 | 
            -
             | 
| 26 | 
            -
                knife data bag from file BAG ITEM.json
         | 
| 14 | 
            +
                knife data bag from file example example_item.json
         | 
| 27 15 |  | 
| 16 | 
            +
            For more information on data bags, see the Chef wiki page:
         | 
| 17 | 
            +
                                           
         | 
| 18 | 
            +
            https://docs.getchef.com/essentials_data_bags.html
         | 
| 28 19 |  | 
| 29 20 | 
             
            Encrypted Data Bags
         | 
| 30 21 | 
             
            -------------------
         | 
| @@ -61,3 +52,7 @@ Use the secret_key to view the contents. | |
| 61 52 | 
             
                id:        mysql
         | 
| 62 53 | 
             
                password:  abc123
         | 
| 63 54 |  | 
| 55 | 
            +
             | 
| 56 | 
            +
            For more information on encrypted data bags, see the Chef wiki page:
         | 
| 57 | 
            +
                                           
         | 
| 58 | 
            +
            https://docs.getchef.com/essentials_data_bags.html
         | 
| @@ -1,5 +1,9 @@ | |
| 1 | 
            -
             | 
| 1 | 
            +
            Create environments here, in either the Role Ruby DSL (.rb) or JSON (.json) files. To install environments on the server, use knife.
         | 
| 2 2 |  | 
| 3 | 
            -
             | 
| 3 | 
            +
            For example, in this directory you'll find an example environment file called `example.json` which can be uploaded to the Chef Server:
         | 
| 4 4 |  | 
| 5 | 
            -
             | 
| 5 | 
            +
                knife environment from file environments/example.json
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            For more information on environments, see the Chef wiki page:
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            https://docs.chef.io/environments.html
         | 
| @@ -0,0 +1,13 @@ | |
| 1 | 
            +
            {
         | 
| 2 | 
            +
                "name": "example",
         | 
| 3 | 
            +
                "description": "This is an example environment defined as JSON",
         | 
| 4 | 
            +
                "chef_type": "environment",
         | 
| 5 | 
            +
                "json_class": "Chef::Environment",
         | 
| 6 | 
            +
                "default_attributes": {
         | 
| 7 | 
            +
                },
         | 
| 8 | 
            +
                "override_attributes": {
         | 
| 9 | 
            +
                },
         | 
| 10 | 
            +
                "cookbook_versions": {
         | 
| 11 | 
            +
                    "example": "= 1.0.0"
         | 
| 12 | 
            +
                }
         | 
| 13 | 
            +
            }
         | 
| @@ -1,16 +1,9 @@ | |
| 1 1 | 
             
            Create roles here, in either the Role Ruby DSL (.rb) or JSON (.json) files. To install roles on the server, use knife.
         | 
| 2 2 |  | 
| 3 | 
            -
            For example,  | 
| 4 | 
            -
             | 
| 5 | 
            -
                name "base_example"
         | 
| 6 | 
            -
                description "Example base role applied to all nodes."
         | 
| 7 | 
            -
                # List of recipes and roles to apply. Requires Chef 0.8, earlier versions use 'recipes()'.
         | 
| 8 | 
            -
                #run_list()
         | 
| 9 | 
            -
                # Attributes applied if the node doesn't have it set already.
         | 
| 10 | 
            -
                #default_attributes()
         | 
| 11 | 
            -
                # Attributes applied no matter what the node has set already.
         | 
| 12 | 
            -
                #override_attributes()
         | 
| 13 | 
            -
             | 
| 14 | 
            -
            Then upload it to the Chef Server:
         | 
| 3 | 
            +
            For example, in this directory you'll find an example role file called `example.json` which can be uploaded to the Chef Server:
         | 
| 15 4 |  | 
| 16 | 
            -
                knife role from file roles/ | 
| 5 | 
            +
                knife role from file roles/example.json
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            For more information on roles, see the Chef wiki page:
         | 
| 8 | 
            +
                                           
         | 
| 9 | 
            +
            https://docs.getchef.com/essentials_roles.html
         | 
| @@ -22,7 +22,11 @@ directory "#{app_dir}/test/integration/default/serverspec" do | |
| 22 22 | 
             
              recursive true
         | 
| 23 23 | 
             
            end
         | 
| 24 24 |  | 
| 25 | 
            -
             | 
| 25 | 
            +
            directory "#{app_dir}/test/integration/helpers/serverspec" do
         | 
| 26 | 
            +
              recursive true
         | 
| 27 | 
            +
            end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            cookbook_file "#{app_dir}/test/integration/helpers/serverspec/spec_helper.rb" do
         | 
| 26 30 | 
             
              source 'serverspec_spec_helper.rb'
         | 
| 27 31 | 
             
              action :create_if_missing
         | 
| 28 32 | 
             
            end
         | 
| @@ -36,7 +36,11 @@ directory "#{cookbook_dir}/test/integration/default/serverspec" do | |
| 36 36 | 
             
              recursive true
         | 
| 37 37 | 
             
            end
         | 
| 38 38 |  | 
| 39 | 
            -
             | 
| 39 | 
            +
            directory "#{cookbook_dir}/test/integration/helpers/serverspec" do
         | 
| 40 | 
            +
              recursive true
         | 
| 41 | 
            +
            end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
            cookbook_file "#{cookbook_dir}/test/integration/helpers/serverspec/spec_helper.rb" do
         | 
| 40 44 | 
             
              source 'serverspec_spec_helper.rb'
         | 
| 41 45 | 
             
              action :create_if_missing
         | 
| 42 46 | 
             
            end
         | 
| @@ -14,36 +14,21 @@ cookbook_file "#{repo_dir}/README.md" do | |
| 14 14 | 
             
              source "repo/README.md"
         | 
| 15 15 | 
             
            end
         | 
| 16 16 |  | 
| 17 | 
            -
            cookbook_file "#{repo_dir}/Rakefile" do
         | 
| 18 | 
            -
              source "repo/Rakefile"
         | 
| 19 | 
            -
            end
         | 
| 20 | 
            -
             | 
| 21 17 | 
             
            cookbook_file "#{repo_dir}/chefignore" do
         | 
| 22 18 | 
             
              source "chefignore"
         | 
| 23 19 | 
             
            end
         | 
| 24 20 |  | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
              source "repo/config/rake.rb.erb"
         | 
| 29 | 
            -
              helpers(ChefDK::Generator::TemplateHelper)
         | 
| 30 | 
            -
            end
         | 
| 31 | 
            -
             | 
| 32 | 
            -
            %w{certificates data_bags environments roles}.each do |tlo|
         | 
| 33 | 
            -
              directory "#{repo_dir}/#{tlo}"
         | 
| 34 | 
            -
             | 
| 35 | 
            -
              cookbook_file "#{repo_dir}/#{tlo}/README.md" do
         | 
| 36 | 
            -
                source "repo/#{tlo}/README.md"
         | 
| 21 | 
            +
            %w{cookbooks data_bags environments roles}.each do |tlo|
         | 
| 22 | 
            +
              remote_directory "#{repo_dir}/#{tlo}" do
         | 
| 23 | 
            +
                source "repo/#{tlo}"
         | 
| 37 24 | 
             
              end
         | 
| 38 25 | 
             
            end
         | 
| 39 26 |  | 
| 40 | 
            -
            directory "#{repo_dir}/cookbooks"
         | 
| 41 | 
            -
             | 
| 42 27 | 
             
            cookbook_file "#{repo_dir}/cookbooks/README.md" do
         | 
| 43 28 | 
             
              if context.policy_only
         | 
| 44 | 
            -
                source " | 
| 29 | 
            +
                source "cookbook_readmes/README-policy.md"
         | 
| 45 30 | 
             
              else
         | 
| 46 | 
            -
                source " | 
| 31 | 
            +
                source "cookbook_readmes/README.md"
         | 
| 47 32 | 
             
              end
         | 
| 48 33 | 
             
            end
         | 
| 49 34 |  | 
    
        data/lib/chef-dk/version.rb
    CHANGED
    
    
| @@ -19,7 +19,7 @@ | |
| 19 19 | 
             
            require "kitchen/provisioner/chef_base"
         | 
| 20 20 |  | 
| 21 21 | 
             
            # TODO: chef-dk and kitchen can only co-exist if kitchen and chef-dk agree on
         | 
| 22 | 
            -
            # the version of mixlib-shellout to use. Kitchen currently locked at 1. | 
| 22 | 
            +
            # the version of mixlib-shellout to use. Kitchen currently locked at 1.4,
         | 
| 23 23 | 
             
            # chef-dk is on 2.x
         | 
| 24 24 | 
             
            require 'chef-dk/policyfile_services/export_repo'
         | 
| 25 25 |  | 
| @@ -38,15 +38,19 @@ module Kitchen | |
| 38 38 | 
             
                  # * `deployment_group`: `POLICY_NAME-local`
         | 
| 39 39 | 
             
                  # Since it makes no sense to modify these, they are hardcoded elsewhere.
         | 
| 40 40 | 
             
                  default_config :client_rb, {}
         | 
| 41 | 
            -
                  default_config : | 
| 42 | 
            -
             | 
| 43 | 
            -
                  # Policyfile mode does not support the `-j dna.json` option to
         | 
| 44 | 
            -
                  # `chef-client`.
         | 
| 45 | 
            -
                  default_config :json_attributes, false
         | 
| 41 | 
            +
                  default_config :json_attributes, true
         | 
| 42 | 
            +
                  default_config :chef_zero_host, nil
         | 
| 46 43 | 
             
                  default_config :chef_zero_port, 8889
         | 
| 47 44 |  | 
| 48 45 | 
             
                  default_config :chef_client_path do |provisioner|
         | 
| 49 | 
            -
                     | 
| 46 | 
            +
                    provisioner.
         | 
| 47 | 
            +
                      remote_path_join(%W[#{provisioner[:chef_omnibus_root]} bin chef-client]).
         | 
| 48 | 
            +
                      tap { |path| path.concat(".bat") if provisioner.windows_os? }
         | 
| 49 | 
            +
                  end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                  default_config :ruby_bindir do |provisioner|
         | 
| 52 | 
            +
                    provisioner.
         | 
| 53 | 
            +
                      remote_path_join(%W[#{provisioner[:chef_omnibus_root]} embedded bin])
         | 
| 50 54 | 
             
                  end
         | 
| 51 55 |  | 
| 52 56 | 
             
                  # Emit a warning that Policyfile stuff is still experimental.
         | 
| @@ -62,6 +66,7 @@ module Kitchen | |
| 62 66 | 
             
                  # (see Base#create_sandbox)
         | 
| 63 67 | 
             
                  def create_sandbox
         | 
| 64 68 | 
             
                    super
         | 
| 69 | 
            +
                    prepare_cookbooks
         | 
| 65 70 | 
             
                    prepare_validation_pem
         | 
| 66 71 | 
             
                    prepare_client_rb
         | 
| 67 72 | 
             
                  end
         | 
| @@ -85,7 +90,10 @@ module Kitchen | |
| 85 90 | 
             
                      args << "--logfile #{config[:log_file]}"
         | 
| 86 91 | 
             
                    end
         | 
| 87 92 |  | 
| 88 | 
            -
                     | 
| 93 | 
            +
                    wrap_shell_code(
         | 
| 94 | 
            +
                      [cmd, *args].join(" ").
         | 
| 95 | 
            +
                      tap { |str| str.insert(0, reload_ps1_path) if windows_os? }
         | 
| 96 | 
            +
                    )
         | 
| 89 97 | 
             
                  end
         | 
| 90 98 |  | 
| 91 99 | 
             
                  private
         | 
| @@ -112,7 +120,9 @@ module Kitchen | |
| 112 120 | 
             
                  #
         | 
| 113 121 | 
             
                  # @api private
         | 
| 114 122 | 
             
                  def policy_exporter
         | 
| 115 | 
            -
                     | 
| 123 | 
            +
                    # Must force this because TK by default copies the current cookbook to the sandbox
         | 
| 124 | 
            +
                    # See ChefDK::PolicyfileServices::ExportRepo#assert_export_dir_clean!
         | 
| 125 | 
            +
                    @policy_exporter ||= ChefDK::PolicyfileServices::ExportRepo.new(export_dir: sandbox_path, force: true)
         | 
| 116 126 | 
             
                  end
         | 
| 117 127 |  | 
| 118 128 | 
             
                  # Writes a fake (but valid) validation.pem into the sandbox directory.
         | 
| @@ -135,6 +145,8 @@ module Kitchen | |
| 135 145 | 
             
                    data["use_policyfile"] = true
         | 
| 136 146 | 
             
                    data["versioned_cookbooks"] = true
         | 
| 137 147 | 
             
                    data["deployment_group"] = "#{policy_exporter.policy_name}-local"
         | 
| 148 | 
            +
                    # TODO this will need to be updated when chef-zero supports erchef paths (policy_group vs policies)
         | 
| 149 | 
            +
                    data["policy_document_native_api"] = false
         | 
| 138 150 |  | 
| 139 151 | 
             
                    info("Preparing client.rb")
         | 
| 140 152 | 
             
                    debug("Creating client.rb from #{data.inspect}")
         | 
    
        data/spec/spec_helper.rb
    CHANGED
    
    | @@ -19,10 +19,18 @@ require 'rubygems' | |
| 19 19 | 
             
            require 'rspec/mocks'
         | 
| 20 20 | 
             
            require 'test_helpers'
         | 
| 21 21 |  | 
| 22 | 
            +
            # needed since we stub it for every test
         | 
| 23 | 
            +
            require 'chef/workstation_config_loader'
         | 
| 24 | 
            +
             | 
| 22 25 | 
             
            RSpec.configure do |c|
         | 
| 23 26 | 
             
              c.include ChefDK
         | 
| 24 27 | 
             
              c.include TestHelpers
         | 
| 25 28 |  | 
| 29 | 
            +
              # Avoid loading config.rb/knife.rb unintentionally
         | 
| 30 | 
            +
              c.before(:each) do
         | 
| 31 | 
            +
                allow_any_instance_of(Chef::WorkstationConfigLoader).to receive(:load)
         | 
| 32 | 
            +
              end
         | 
| 33 | 
            +
             | 
| 26 34 | 
             
              c.after(:all) { clear_tempdir }
         | 
| 27 35 |  | 
| 28 36 | 
             
              c.filter_run :focus => true
         | 
    
        data/spec/unit/cli_spec.rb
    CHANGED
    
    | @@ -67,6 +67,14 @@ E | |
| 67 67 | 
             
                cli.run
         | 
| 68 68 | 
             
              end
         | 
| 69 69 |  | 
| 70 | 
            +
              def mock_shell_out(exitstatus, stdout, stderr)
         | 
| 71 | 
            +
                shell_out = double("mixlib_shell_out")
         | 
| 72 | 
            +
                allow(shell_out).to receive(:exitstatus).and_return(exitstatus)
         | 
| 73 | 
            +
                allow(shell_out).to receive(:stdout).and_return(stdout)
         | 
| 74 | 
            +
                allow(shell_out).to receive(:stderr).and_return(stderr)
         | 
| 75 | 
            +
                shell_out
         | 
| 76 | 
            +
              end
         | 
| 77 | 
            +
             | 
| 70 78 | 
             
              subject(:cli) do
         | 
| 71 79 | 
             
                ChefDK::CLI.new(argv).tap do |c|
         | 
| 72 80 | 
             
                  allow(c).to receive(:commands_map).and_return(commands_map)
         | 
| @@ -106,12 +114,50 @@ E | |
| 106 114 | 
             
              context "given -v" do
         | 
| 107 115 | 
             
                let(:argv) { %w[-v] }
         | 
| 108 116 |  | 
| 109 | 
            -
                 | 
| 117 | 
            +
                let(:tools) {
         | 
| 118 | 
            +
                  {
         | 
| 119 | 
            +
                    "chef-client" => {
         | 
| 120 | 
            +
                      "version_output" => "Chef: 12.0.3",
         | 
| 121 | 
            +
                      "expected_version" => "12.0.3"
         | 
| 122 | 
            +
                    },
         | 
| 123 | 
            +
                    "berks" => {
         | 
| 124 | 
            +
                      "version_output" => "3.2.3",
         | 
| 125 | 
            +
                      "expected_version" => "3.2.3"
         | 
| 126 | 
            +
                    },
         | 
| 127 | 
            +
                    "kitchen" => {
         | 
| 128 | 
            +
                      "version_output" => "Test Kitchen version 1.3.1",
         | 
| 129 | 
            +
                      "expected_version" => "1.3.1"
         | 
| 130 | 
            +
                    }
         | 
| 131 | 
            +
                  }
         | 
| 132 | 
            +
                }
         | 
| 133 | 
            +
             | 
| 134 | 
            +
                it "does not print versions of tools with missing or errored tools" do
         | 
| 135 | 
            +
                  full_version_message = version_message
         | 
| 136 | 
            +
                  tools.each do |name, version|
         | 
| 137 | 
            +
                    if name == "berks"
         | 
| 138 | 
            +
                      expect(cli).to receive(:shell_out).with("#{name} --version").and_return(mock_shell_out(1, "#{version["version_output"]}", ''))
         | 
| 139 | 
            +
                      full_version_message += "#{name} version: ERROR\n"
         | 
| 140 | 
            +
                    else
         | 
| 141 | 
            +
                      expect(cli).to receive(:shell_out).with("#{name} --version").and_return(mock_shell_out(0, "#{version["version_output"]}", ''))
         | 
| 142 | 
            +
                      full_version_message += "#{name} version: #{version["expected_version"]}\n"
         | 
| 143 | 
            +
                    end
         | 
| 144 | 
            +
                  end
         | 
| 145 | 
            +
                  run_cli(0)
         | 
| 146 | 
            +
                  expect(stdout).to eq(full_version_message)
         | 
| 147 | 
            +
                end
         | 
| 148 | 
            +
             | 
| 149 | 
            +
                it "prints the version and versions of chef-dk tools" do
         | 
| 150 | 
            +
                  full_version_message = version_message
         | 
| 151 | 
            +
                  tools.each do |name, version|
         | 
| 152 | 
            +
                    expect(cli).to receive(:shell_out).with("#{name} --version").and_return(mock_shell_out(0, "#{version["version_output"]}", ''))
         | 
| 153 | 
            +
                    full_version_message += "#{name} version: #{version["expected_version"]}\n"
         | 
| 154 | 
            +
                  end
         | 
| 110 155 | 
             
                  run_cli(0)
         | 
| 111 | 
            -
                  expect(stdout).to eq( | 
| 156 | 
            +
                  expect(stdout).to eq(full_version_message)
         | 
| 112 157 | 
             
                end
         | 
| 113 158 | 
             
              end
         | 
| 114 159 |  | 
| 160 | 
            +
             | 
| 115 161 | 
             
              context "given an invalid option" do
         | 
| 116 162 |  | 
| 117 163 | 
             
                let(:argv) { %w[-nope] }
         | 
| @@ -179,7 +225,7 @@ E | |
| 179 225 |  | 
| 180 226 | 
             
                    let(:ruby_path) { '/opt/chefdk/embedded/bin/ruby' }
         | 
| 181 227 | 
             
                    let(:chefdk_embedded_path) { '/opt/chefdk/embedded/apps/chef-dk' }
         | 
| 182 | 
            -
             | 
| 228 | 
            +
             | 
| 183 229 | 
             
                    before do
         | 
| 184 230 | 
             
                      stub_const("File::PATH_SEPARATOR", ':')
         | 
| 185 231 | 
             
                      allow(Chef::Util::PathHelper).to receive(:cleanpath) do |path|
         | 
| @@ -35,7 +35,7 @@ describe ChefDK::Command::GeneratorCommands::App do | |
| 35 35 | 
             
                  test/integration/default
         | 
| 36 36 | 
             
                  test/integration/default/serverspec
         | 
| 37 37 | 
             
                  test/integration/default/serverspec/default_spec.rb
         | 
| 38 | 
            -
                  test/integration/ | 
| 38 | 
            +
                  test/integration/helpers/serverspec/spec_helper.rb
         | 
| 39 39 | 
             
                  README.md
         | 
| 40 40 | 
             
                  cookbooks/new_app/Berksfile
         | 
| 41 41 | 
             
                  cookbooks/new_app/chefignore
         | 
| @@ -35,7 +35,7 @@ describe ChefDK::Command::GeneratorCommands::Cookbook do | |
| 35 35 | 
             
                  test/integration/default
         | 
| 36 36 | 
             
                  test/integration/default/serverspec
         | 
| 37 37 | 
             
                  test/integration/default/serverspec/default_spec.rb
         | 
| 38 | 
            -
                  test/integration/ | 
| 38 | 
            +
                  test/integration/helpers/serverspec/spec_helper.rb
         | 
| 39 39 | 
             
                  Berksfile
         | 
| 40 40 | 
             
                  chefignore
         | 
| 41 41 | 
             
                  metadata.rb
         | 
| @@ -153,14 +153,6 @@ describe ChefDK::Command::GeneratorCommands::Repo do | |
| 153 153 | 
             
                    end
         | 
| 154 154 | 
             
                  end
         | 
| 155 155 |  | 
| 156 | 
            -
                  describe "Rakefile" do
         | 
| 157 | 
            -
                    let(:file) { "Rakefile" }
         | 
| 158 | 
            -
             | 
| 159 | 
            -
                    it "loads the common tasks" do
         | 
| 160 | 
            -
                      expect(file_contents).to match(/load 'chef\/tasks\/chef_repo\.rake'/)
         | 
| 161 | 
            -
                    end
         | 
| 162 | 
            -
                  end
         | 
| 163 | 
            -
             | 
| 164 156 | 
             
                  describe "chefignore" do
         | 
| 165 157 | 
             
                    let(:file) { "chefignore" }
         | 
| 166 158 |  | 
| @@ -189,16 +181,6 @@ describe ChefDK::Command::GeneratorCommands::Repo do | |
| 189 181 | 
             
                    end
         | 
| 190 182 | 
             
                  end
         | 
| 191 183 |  | 
| 192 | 
            -
                  describe "certificates" do
         | 
| 193 | 
            -
                    describe "README.md" do
         | 
| 194 | 
            -
                      let(:file) { "certificates/README.md" }
         | 
| 195 | 
            -
             | 
| 196 | 
            -
                      it "has the right contents" do
         | 
| 197 | 
            -
                        expect(file_contents).to match(/rake ssl_cert FQDN=monitoring.example.com/)
         | 
| 198 | 
            -
                      end
         | 
| 199 | 
            -
                    end
         | 
| 200 | 
            -
                  end
         | 
| 201 | 
            -
             | 
| 202 184 | 
             
                  describe "cookbooks" do
         | 
| 203 185 | 
             
                    describe "README.md" do
         | 
| 204 186 | 
             
                      let(:file) { "cookbooks/README.md" }
         | 
| @@ -215,6 +197,30 @@ describe ChefDK::Command::GeneratorCommands::Repo do | |
| 215 197 | 
             
                        end
         | 
| 216 198 | 
             
                      end
         | 
| 217 199 | 
             
                    end
         | 
| 200 | 
            +
             | 
| 201 | 
            +
                    describe "example/metadata.rb" do
         | 
| 202 | 
            +
                      let(:file) { "cookbooks/example/metadata.rb" }
         | 
| 203 | 
            +
             | 
| 204 | 
            +
                      it "has the right contents" do
         | 
| 205 | 
            +
                        expect(file_contents).to match(/name 'example'/)
         | 
| 206 | 
            +
                      end
         | 
| 207 | 
            +
                    end
         | 
| 208 | 
            +
             | 
| 209 | 
            +
                    describe "example/attributes/default.rb" do
         | 
| 210 | 
            +
                      let(:file) { "cookbooks/example/attributes/default.rb" }
         | 
| 211 | 
            +
             | 
| 212 | 
            +
                      it "has the right contents" do
         | 
| 213 | 
            +
                        expect(file_contents).to match(/default\["example"\]\["name"\] = "Sam Doe"/)
         | 
| 214 | 
            +
                      end
         | 
| 215 | 
            +
                    end
         | 
| 216 | 
            +
             | 
| 217 | 
            +
                    describe "example/recipes/default.rb" do
         | 
| 218 | 
            +
                      let(:file) { "cookbooks/example/recipes/default.rb" }
         | 
| 219 | 
            +
             | 
| 220 | 
            +
                      it "has the right contents" do
         | 
| 221 | 
            +
                        expect(file_contents).to match(/log "Welcome to Chef, \#\{node\["example"\]\["name"\]\}!" do/)
         | 
| 222 | 
            +
                      end
         | 
| 223 | 
            +
                    end
         | 
| 218 224 | 
             
                  end
         | 
| 219 225 |  | 
| 220 226 | 
             
                  describe "data_bags" do
         | 
| @@ -225,58 +231,48 @@ describe ChefDK::Command::GeneratorCommands::Repo do | |
| 225 231 | 
             
                        expect(file_contents).to match(/This directory contains directories of the various data bags/)
         | 
| 226 232 | 
             
                      end
         | 
| 227 233 | 
             
                    end
         | 
| 228 | 
            -
                  end
         | 
| 229 234 |  | 
| 230 | 
            -
             | 
| 231 | 
            -
             | 
| 232 | 
            -
                      let(:file) { "environments/README.md" }
         | 
| 235 | 
            +
                    describe "example_item.json" do
         | 
| 236 | 
            +
                      let(:file) { "data_bags/example/example_item.json" }
         | 
| 233 237 |  | 
| 234 238 | 
             
                      it "has the right contents" do
         | 
| 235 | 
            -
                        expect(file_contents).to match(/ | 
| 239 | 
            +
                        expect(file_contents).to match(/"id": "example_item"/)
         | 
| 236 240 | 
             
                      end
         | 
| 237 241 | 
             
                    end
         | 
| 238 242 | 
             
                  end
         | 
| 239 243 |  | 
| 240 | 
            -
                  describe " | 
| 244 | 
            +
                  describe "environments" do
         | 
| 241 245 | 
             
                    describe "README.md" do
         | 
| 242 | 
            -
                      let(:file) { " | 
| 246 | 
            +
                      let(:file) { "environments/README.md" }
         | 
| 243 247 |  | 
| 244 248 | 
             
                      it "has the right contents" do
         | 
| 245 | 
            -
                        expect(file_contents).to match(/Create  | 
| 249 | 
            +
                        expect(file_contents).to match(/Create environments here, in either the Role Ruby DSL \(\.rb\) or JSON \(\.json\) files\./)
         | 
| 246 250 | 
             
                      end
         | 
| 247 251 | 
             
                    end
         | 
| 248 | 
            -
                  end
         | 
| 249 252 |  | 
| 250 | 
            -
             | 
| 251 | 
            -
             | 
| 252 | 
            -
                      let(:file) { "config/rake.rb" }
         | 
| 253 | 
            +
                    describe "example.json" do
         | 
| 254 | 
            +
                      let(:file) { "environments/example.json" }
         | 
| 253 255 |  | 
| 254 | 
            -
                      it "has the  | 
| 255 | 
            -
                        expect(file_contents).to match(/ | 
| 256 | 
            -
                      end
         | 
| 257 | 
            -
             | 
| 258 | 
            -
                      it "defaults the copyright to The Authors" do
         | 
| 259 | 
            -
                        expect(file_contents).to match(/COMPANY_NAME = "The Authors"/)
         | 
| 260 | 
            -
                      end
         | 
| 261 | 
            -
             | 
| 262 | 
            -
                      it "defaults the license to all_rights" do
         | 
| 263 | 
            -
                        expect(file_contents).to match(/NEW_COOKBOOK_LICENSE = :all_rights/)
         | 
| 256 | 
            +
                      it "has the right contents" do
         | 
| 257 | 
            +
                        expect(file_contents).to match(/"description": "This is an example environment defined as JSON"/)
         | 
| 264 258 | 
             
                      end
         | 
| 259 | 
            +
                    end
         | 
| 260 | 
            +
                  end
         | 
| 265 261 |  | 
| 266 | 
            -
             | 
| 267 | 
            -
             | 
| 262 | 
            +
                  describe "roles" do
         | 
| 263 | 
            +
                    describe "README.md" do
         | 
| 264 | 
            +
                      let(:file) { "roles/README.md" }
         | 
| 268 265 |  | 
| 269 | 
            -
             | 
| 270 | 
            -
             | 
| 271 | 
            -
                        end
         | 
| 266 | 
            +
                      it "has the right contents" do
         | 
| 267 | 
            +
                        expect(file_contents).to match(/Create roles here, in either the Role Ruby DSL \(\.rb\) or JSON \(\.json\) files\./)
         | 
| 272 268 | 
             
                      end
         | 
| 269 | 
            +
                    end
         | 
| 273 270 |  | 
| 274 | 
            -
             | 
| 275 | 
            -
             | 
| 271 | 
            +
                    describe "example.json" do
         | 
| 272 | 
            +
                      let(:file) { "roles/example.json" }
         | 
| 276 273 |  | 
| 277 | 
            -
             | 
| 278 | 
            -
             | 
| 279 | 
            -
                        end
         | 
| 274 | 
            +
                      it "has the right contents" do
         | 
| 275 | 
            +
                        expect(file_contents).to match(/"description": "This is an example role defined as JSON"/)
         | 
| 280 276 | 
             
                      end
         | 
| 281 277 | 
             
                    end
         | 
| 282 278 | 
             
                  end
         |