beaker 3.10.0 → 3.11.0
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 +8 -8
- data/Rakefile +8 -0
- data/acceptance/config/subcommands/acceptance-options.rb +4 -0
- data/acceptance/fixtures/files/{sles-11-x86_64.repo.txt → sles-11-x86_64.repo} +0 -0
- data/acceptance/fixtures/files/{sles-12-x86_64.repo.txt → sles-12-x86_64.repo} +0 -0
- data/acceptance/lib/helpers/test_helper.rb +2 -2
- data/acceptance/pre_suite/README.md +1 -0
- data/acceptance/pre_suite/subcommands/05_install_ruby.rb +32 -0
- data/acceptance/pre_suite/subcommands/08_install_beaker.rb +22 -0
- data/acceptance/tests/base/host/host_test.rb +14 -0
- data/acceptance/tests/subcommands/init.rb +47 -0
- data/beaker.gemspec +1 -1
- data/docs/concepts/masterless_puppet.md +1 -1
- data/docs/how_to/hypervisors/openstack.md +29 -0
- data/docs/how_to/preserve_hosts.md +5 -5
- data/lib/beaker/dsl/helpers/puppet_helpers.rb +11 -7
- data/lib/beaker/host_prebuilt_steps.rb +7 -3
- data/lib/beaker/hypervisor/aws_sdk.rb +12 -1
- data/lib/beaker/hypervisor/openstack.rb +53 -9
- data/lib/beaker/hypervisor/vagrant_libvirt.rb +7 -0
- data/lib/beaker/tasks/quick_start.rb +6 -4
- data/lib/beaker/version.rb +1 -1
- data/spec/beaker/dsl/helpers/puppet_helpers_spec.rb +3 -3
- data/spec/beaker/host_prebuilt_steps_spec.rb +31 -5
- data/spec/beaker/hypervisor/aws_sdk_spec.rb +3 -2
- data/spec/beaker/hypervisor/openstack_spec.rb +52 -0
- data/spec/beaker/hypervisor/vagrant_libvirt_spec.rb +5 -1
- metadata +12 -8
    
        checksums.yaml
    CHANGED
    
    | @@ -1,15 +1,15 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            !binary "U0hBMQ==":
         | 
| 3 3 | 
             
              metadata.gz: !binary |-
         | 
| 4 | 
            -
                 | 
| 4 | 
            +
                ZTYxNmZjMGE0NTRhOGYxZWQ0YjI2MWI3MjgwMmU3YmI2YzE5YzRkMg==
         | 
| 5 5 | 
             
              data.tar.gz: !binary |-
         | 
| 6 | 
            -
                 | 
| 6 | 
            +
                ODljNWVjNDQ1YzExNTU3Y2YwNWM3N2EwZTkwNWE2YTYxZGY1Mzg3YQ==
         | 
| 7 7 | 
             
            SHA512:
         | 
| 8 8 | 
             
              metadata.gz: !binary |-
         | 
| 9 | 
            -
                 | 
| 10 | 
            -
                 | 
| 11 | 
            -
                 | 
| 9 | 
            +
                ZWFiZGJhNTI2M2VmYTBiNWRjODllYmVmYjViYWYwNGI1NDQyY2Q3YTA2OTlh
         | 
| 10 | 
            +
                NDIyMzE4MDU3MDE3YTg0OTEzYzIyZDEwMjk3ODdlZWUwZTM0OTJkNzg1ZTA1
         | 
| 11 | 
            +
                OTkwZWVhYjBmNzIwODFjNGZkOGNjNTUwYzkwNTFiZDQ0MTliZDM=
         | 
| 12 12 | 
             
              data.tar.gz: !binary |-
         | 
| 13 | 
            -
                 | 
| 14 | 
            -
                 | 
| 15 | 
            -
                 | 
| 13 | 
            +
                NjBjOGMzODJmMjVkZTZkOGU4MDVjMzkzNTI0MGUwNGVhNTU0NjViM2IzMjVk
         | 
| 14 | 
            +
                NzNlMzVjNTUzOTBlMTNjZWE0MDdiOGQxZjJjZDJmMDcxZjg1ZTg1NTc0YzE2
         | 
| 15 | 
            +
                NDNmNDQzYTFjZmYzOGRiOGM1ZTY3N2M1OWU5ZTZhNDQ5NzVhZjM=
         | 
    
        data/Rakefile
    CHANGED
    
    | @@ -176,6 +176,14 @@ Run the base beaker acceptance tests | |
| 176 176 | 
             
                beaker_test(:base)
         | 
| 177 177 | 
             
              end
         | 
| 178 178 |  | 
| 179 | 
            +
              desc <<-EOS
         | 
| 180 | 
            +
            Run the subcommand beaker acceptance tests
         | 
| 181 | 
            +
            #{USAGE}
         | 
| 182 | 
            +
              EOS
         | 
| 183 | 
            +
              task :subcommands => 'gen_hosts' do
         | 
| 184 | 
            +
                beaker_test(:subcommands)
         | 
| 185 | 
            +
              end
         | 
| 186 | 
            +
             | 
| 179 187 | 
             
              desc <<-EOS
         | 
| 180 188 | 
             
            Run the hypervisor beaker acceptance tests
         | 
| 181 189 | 
             
            #{USAGE}
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| @@ -44,8 +44,8 @@ end | |
| 44 44 |  | 
| 45 45 | 
             
            # Returns the contents of a named fixture file, to be found in `fixture_path`.
         | 
| 46 46 | 
             
            def fixture_contents(fixture)
         | 
| 47 | 
            -
              fixture_file =  | 
| 48 | 
            -
              File.read(fixture_file)
         | 
| 47 | 
            +
              fixture_file = Dir.entries(fixture_path).find { |e| /^#{fixture}$|#{fixture}\.[a-z]/ =~ e }
         | 
| 48 | 
            +
              File.read("#{fixture_path}/#{fixture_file}")
         | 
| 49 49 | 
             
            end
         | 
| 50 50 |  | 
| 51 51 | 
             
            # Create a file on `host` in the `remote_path` with file name `filename`,
         | 
| @@ -0,0 +1,32 @@ | |
| 1 | 
            +
            test_name 'Install and configure Ruby 2.2.5 on the SUT' do
         | 
| 2 | 
            +
             | 
| 3 | 
            +
              step 'Ensure that the default system is an el-based system' do
         | 
| 4 | 
            +
                # The pre-suite currently only supports el systems, and we should
         | 
| 5 | 
            +
                #fail early if the default platform is not a supported platform
         | 
| 6 | 
            +
                assert(default.platform.variant == 'el',
         | 
| 7 | 
            +
                       "Expected the platform variant to be 'el', not #{default.platform.variant}")
         | 
| 8 | 
            +
              end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              step 'clean out current ruby and its dependencies' do
         | 
| 11 | 
            +
                on default, 'yum remove ruby ruby-devel -y'
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              # These steps install git, openssl, and wget
         | 
| 15 | 
            +
              step 'install development dependencies' do
         | 
| 16 | 
            +
                on default, 'yum groupinstall "Development Tools" -y'
         | 
| 17 | 
            +
                on default, 'yum install openssl-devel -y'
         | 
| 18 | 
            +
                on default, 'yum install wget -y'
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              step 'download and install ruby 2.2.5' do
         | 
| 22 | 
            +
                on default, 'wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.5.tar.gz'
         | 
| 23 | 
            +
                on default, 'tar xvfz ruby-2.2.5.tar.gz'
         | 
| 24 | 
            +
                on default, 'cd ruby-2.2.5;./configure'
         | 
| 25 | 
            +
                on default, 'cd ruby-2.2.5;make'
         | 
| 26 | 
            +
                on default, 'cd ruby-2.2.5;make install'
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
              step 'update gem on the SUT and install bundler' do
         | 
| 30 | 
            +
                on default, 'gem update --system;gem install bundler'
         | 
| 31 | 
            +
              end
         | 
| 32 | 
            +
            end
         | 
| @@ -0,0 +1,22 @@ | |
| 1 | 
            +
            test_name 'Install beaker and checkout branch if necessary' do
         | 
| 2 | 
            +
             | 
| 3 | 
            +
              step 'Download the beaker git repo' do
         | 
| 4 | 
            +
               on default, 'git clone https://github.com/puppetlabs/beaker.git /opt/beaker/'
         | 
| 5 | 
            +
              end
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              step 'Detect if checking out branch for testing and checkout' do
         | 
| 8 | 
            +
                if ENV['BEAKER_PULL_ID']
         | 
| 9 | 
            +
                  logger.notify "Pull Request detected, checking out PR branch"
         | 
| 10 | 
            +
                  on(default, 'cd /opt/beaker/;git -c core.askpass=true fetch --tags --progress https://github.com/puppetlabs/beaker.git +refs/pull/*:refs/remotes/origin/pr/*')
         | 
| 11 | 
            +
                  on(default, "cd /opt/beaker/;git merge origin/pr/#{ENV['BEAKER_PULL_ID']}/head --no-edit")
         | 
| 12 | 
            +
                else
         | 
| 13 | 
            +
                  logger.notify 'No PR branch detected, building from master'
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              step 'Build the gem and install it on the local system' do
         | 
| 18 | 
            +
                build_output = on(default, 'cd /opt/beaker/;gem build beaker.gemspec').stdout
         | 
| 19 | 
            +
                version = build_output.match(/^  File: (.+)$/)[1]
         | 
| 20 | 
            +
                on(default, "cd /opt/beaker/;gem install #{version} --no-rdoc --no-ri")
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
            end
         | 
| @@ -316,3 +316,17 @@ step "Ensure scp errors close the ssh connection" do | |
| 316 316 | 
             
                on default, 'true'
         | 
| 317 317 | 
             
              end
         | 
| 318 318 | 
             
            end
         | 
| 319 | 
            +
             | 
| 320 | 
            +
            step 'Ensure that a long 128+ character string with UTF-8 characters does not break net-ssh' do
         | 
| 321 | 
            +
              long_string = 'a' * 128 + "\u06FF"
         | 
| 322 | 
            +
              on(default, "mkdir /tmp/#{long_string}")
         | 
| 323 | 
            +
              result = on(default, 'ls /tmp')
         | 
| 324 | 
            +
              assert(result.stdout.include?(long_string), 'Error in folder creation with long string + UTF-8 characters')
         | 
| 325 | 
            +
             | 
| 326 | 
            +
              # remove the folder
         | 
| 327 | 
            +
              on(default, "rm -rf /tmp/#{long_string}")
         | 
| 328 | 
            +
              result = on(default, 'ls /tmp')
         | 
| 329 | 
            +
              assert(!result.stdout.include?(long_string), 'Error in folder deletion with long string + UTF-8 characters')
         | 
| 330 | 
            +
             | 
| 331 | 
            +
            end
         | 
| 332 | 
            +
             | 
| @@ -0,0 +1,47 @@ | |
| 1 | 
            +
            test_name 'use the init subcommand' do
         | 
| 2 | 
            +
             | 
| 3 | 
            +
              def delete_root_folder_contents
         | 
| 4 | 
            +
                on default, 'rm -rf /root/*'
         | 
| 5 | 
            +
              end
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              step 'ensure that `beaker init` fails correctly when not provided a hypervisor' do
         | 
| 8 | 
            +
                expect_failure('it should return a non-zero code when it fails') do
         | 
| 9 | 
            +
                  result = on(default, 'beaker init', :accept_all_exit_codes => true)
         | 
| 10 | 
            +
                  refute_equal(0, result.exit_code, '`beaker init` without a hypervisor argument should return a non-zero exit code')
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              step 'ensure that `beaker help init` works' do
         | 
| 15 | 
            +
                result = on(default, 'beaker help init')
         | 
| 16 | 
            +
                assert_equal(0, result.exit_code, '`beaker help init` should return a zero exit code')
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              step 'ensure that `beaker init` accepts both vmpooler and vagrant hypervisor arguments' do
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                ['vmpooler', 'vagrant'].each do |hypervisor|
         | 
| 22 | 
            +
                  result = on(default, "beaker init --hypervisor=#{hypervisor}")
         | 
| 23 | 
            +
                  assert_match(/Writing default host config/, result.stdout)
         | 
| 24 | 
            +
                  assert_equal(0, result.exit_code, "`beaker init --hypervisor=#{hypervisor}` should return a zero exit code")
         | 
| 25 | 
            +
                  step 'ensure that the Rakefile is present' do
         | 
| 26 | 
            +
                    on(default, '[ -e "Rakefile" ]')
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
                delete_root_folder_contents
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
             | 
| 33 | 
            +
              step 'ensure that a Rakefile is not overwritten if it does exist prior' do
         | 
| 34 | 
            +
                delete_root_folder_contents
         | 
| 35 | 
            +
                on(default, "beaker init --hypervisor=vmpooler")
         | 
| 36 | 
            +
                prepended_rakefile = on(default, 'cat Rakefile').stdout
         | 
| 37 | 
            +
                delete_root_folder_contents
         | 
| 38 | 
            +
                on(default, 'echo "require \'tempfile\'" >> Rakefile')
         | 
| 39 | 
            +
                on(default, 'beaker init --hypervisor=vmpooler', :accept_all_exit_codes => true)
         | 
| 40 | 
            +
                rakefile = on(default, 'cat Rakefile')
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                # Assert that the Rakefile contents includes the original and inserted requirements
         | 
| 43 | 
            +
                assert(result.stdout.include?(prepended_rakefile), 'Rakefile should not contain prepended require')
         | 
| 44 | 
            +
                assert(result.stdout.include?("require 'tempfile'"), 'Rakefile should not contain prepended require')
         | 
| 45 | 
            +
              end
         | 
| 46 | 
            +
            end
         | 
| 47 | 
            +
             | 
    
        data/beaker.gemspec
    CHANGED
    
    | @@ -34,7 +34,7 @@ Gem::Specification.new do |s| | |
| 34 34 | 
             
              s.add_runtime_dependency 'minitar', '~> 0.5.4'
         | 
| 35 35 |  | 
| 36 36 | 
             
              s.add_runtime_dependency 'hocon', '~> 1.0'
         | 
| 37 | 
            -
              s.add_runtime_dependency 'net-ssh', ' | 
| 37 | 
            +
              s.add_runtime_dependency 'net-ssh', '~> 4.0'
         | 
| 38 38 | 
             
              s.add_runtime_dependency 'net-scp', '~> 1.2'
         | 
| 39 39 | 
             
              s.add_runtime_dependency 'inifile', '~> 2.0'
         | 
| 40 40 | 
             
              ## inifile: keep <3.0, breaks puppet_helpers.rb:puppet_conf_for when updated
         | 
| @@ -23,7 +23,7 @@ In order to have Beaker support a masterless Puppet setup, you have to do a few | |
| 23 23 |  | 
| 24 24 | 
             
            ## What is Beaker Doing by Default?
         | 
| 25 25 |  | 
| 26 | 
            -
             | 
| 26 | 
            +
            By default (without the masterless flag), when someone calls for a host of a particular role, using the `Beaker::DSL::Roles` module's methods (ie. `master`, `dashboard`, etc), Beaker checks to verify that a host was given with that role.
         | 
| 27 27 |  | 
| 28 28 | 
             
            If no host was given with this role, then Beaker throws a `DSL::Outcomes::FailTest` Error, which causes that test case to fail.
         | 
| 29 29 |  | 
| @@ -123,3 +123,32 @@ user their own pool.  It's used in allocating new IPs.  It's an options | |
| 123 123 | 
             
            parameter in the CONFIG section of the host file:
         | 
| 124 124 |  | 
| 125 125 | 
             
                floating_ip_pool: 'my_pool_name'
         | 
| 126 | 
            +
             | 
| 127 | 
            +
            ### Volumes
         | 
| 128 | 
            +
             | 
| 129 | 
            +
            Attaching volumes to a VM is supported via the Cinder service.  All versions are transparently
         | 
| 130 | 
            +
            supported to cater for differences in the APIs.  To create and attach volumes simply add hash
         | 
| 131 | 
            +
            called 'volumes' to a host in the HOSTS section.  Each key is the name given to the volume upon
         | 
| 132 | 
            +
            resource creation.  The value is a hash with a single integer parameter 'size' which defines the
         | 
| 133 | 
            +
            volume size in MB.
         | 
| 134 | 
            +
             | 
| 135 | 
            +
            **Example OpenStack hosts file with volumes**
         | 
| 136 | 
            +
             | 
| 137 | 
            +
                HOSTS:
         | 
| 138 | 
            +
                  ceph:
         | 
| 139 | 
            +
                    roles:
         | 
| 140 | 
            +
                      - master
         | 
| 141 | 
            +
                    platform: ubuntu-16.04-amd64
         | 
| 142 | 
            +
                    hypervisor: openstack
         | 
| 143 | 
            +
                    flavor: m1.large
         | 
| 144 | 
            +
                    image: xenial-server-cloudimg-amd64-scsi
         | 
| 145 | 
            +
                    user: ubuntu
         | 
| 146 | 
            +
                    volumes:
         | 
| 147 | 
            +
                      osd0:
         | 
| 148 | 
            +
                        size: 10000
         | 
| 149 | 
            +
                      osd1:
         | 
| 150 | 
            +
                        size: 10000
         | 
| 151 | 
            +
                      osd2:
         | 
| 152 | 
            +
                        size: 10000
         | 
| 153 | 
            +
                      journal:
         | 
| 154 | 
            +
                        size: 1000
         | 
| @@ -29,7 +29,7 @@ what files you might need from your SUTs, and exploration might be necessary. | |
| 29 29 |  | 
| 30 30 | 
             
            Note that where you decide to use this option will affect its precedence. You
         | 
| 31 31 | 
             
            can learn more about this in our
         | 
| 32 | 
            -
            [argument processing & precedence doc](../ | 
| 32 | 
            +
            [argument processing & precedence doc](../concepts/argument_processing_and_precedence.md).
         | 
| 33 33 |  | 
| 34 34 | 
             
            ### Command-Line Option
         | 
| 35 35 |  | 
| @@ -54,11 +54,11 @@ You can also provide a value for this option wherever you can provide a value | |
| 54 54 | 
             
            that gets merged into beaker's global options hash. The two ways to do this are
         | 
| 55 55 | 
             
            to provide it in a local options file, or in the global `CONFIG` section of your
         | 
| 56 56 | 
             
            hosts file. To learn more about how to set these options, check out the
         | 
| 57 | 
            -
            [Options File Values](../ | 
| 57 | 
            +
            [Options File Values](../concepts/argument_processing_and_precedence.md#options-file-values)
         | 
| 58 58 | 
             
            and the
         | 
| 59 | 
            -
            [`CONFIG` Section of a Hosts File](../ | 
| 59 | 
            +
            [`CONFIG` Section of a Hosts File](../concepts/argument_processing_and_precedence.md#config-section-of-hosts-file)
         | 
| 60 60 | 
             
            sections of the
         | 
| 61 | 
            -
            [argument processing & precedence doc](../ | 
| 61 | 
            +
            [argument processing & precedence doc](../concepts/argument_processing_and_precedence.md).
         | 
| 62 62 |  | 
| 63 63 | 
             
            Either way, the underlying property name that you will have to set if you use
         | 
| 64 64 | 
             
            these options is `:preserve_hosts`.
         | 
| @@ -94,5 +94,5 @@ symlink, as mentioned at the beginning of this section. | |
| 94 94 | 
             
            For subsequent runs, if you want to set something, you'll have to pay attention
         | 
| 95 95 | 
             
            to the precedence of your arguments, to be sure that you are overriding what is
         | 
| 96 96 | 
             
            set in the preserved hosts file. Checkout the
         | 
| 97 | 
            -
            [argument processing & precedence doc](../ | 
| 97 | 
            +
            [argument processing & precedence doc](../concepts/argument_processing_and_precedence.md)
         | 
| 98 98 | 
             
            for more details on the precedence order of options parsing.
         | 
| @@ -676,7 +676,10 @@ module Beaker | |
| 676 676 | 
             
                    def sleep_until_puppetdb_started(host, nonssl_port = nil, ssl_port = nil)
         | 
| 677 677 | 
             
                      nonssl_port = options[:puppetdb_port_nonssl] if nonssl_port.nil?
         | 
| 678 678 | 
             
                      ssl_port = options[:puppetdb_port_ssl] if ssl_port.nil?
         | 
| 679 | 
            -
                       | 
| 679 | 
            +
                      endpoint = 'status/v1/services/puppetdb-status'
         | 
| 680 | 
            +
                      retry_on(host,
         | 
| 681 | 
            +
                               "curl -m 1 http://localhost:#{nonssl_port}/#{endpoint} | grep '\"state\":\"running\"'",
         | 
| 682 | 
            +
                               {:max_retries => 120})
         | 
| 680 683 | 
             
                      curl_with_retries("start puppetdb (ssl)",
         | 
| 681 684 | 
             
                                        host, "https://#{host.node_name}:#{ssl_port}", [35, 60])
         | 
| 682 685 | 
             
                    end
         | 
| @@ -754,14 +757,15 @@ module Beaker | |
| 754 757 | 
             
                    end
         | 
| 755 758 |  | 
| 756 759 | 
             
                    #wait for a given host to appear in the dashboard
         | 
| 760 | 
            +
                    # @deprecated this method should be removed in the next release since we don't believe the check is necessary.
         | 
| 757 761 | 
             
                    def wait_for_host_in_dashboard(host)
         | 
| 762 | 
            +
             | 
| 758 763 | 
             
                      hostname = host.node_name
         | 
| 759 | 
            -
                       | 
| 760 | 
            -
             | 
| 761 | 
            -
                       | 
| 762 | 
            -
             | 
| 763 | 
            -
             | 
| 764 | 
            -
                      retry_on(dashboard, "! curl #{curl_opts} https://#{dashboard}/nodes/#{hostname} | grep '404 Not Found'")
         | 
| 764 | 
            +
                      hostcert = dashboard.puppet['hostcert']
         | 
| 765 | 
            +
                      key = dashboard.puppet['hostprivkey']
         | 
| 766 | 
            +
                      cacert = dashboard.puppet['localcacert']
         | 
| 767 | 
            +
                      retry_on(dashboard, "curl --cert #{hostcert} --key #{key} --cacert #{cacert}\
         | 
| 768 | 
            +
                                          https://#{dashboard}:4433/classifier-api/v1/nodes | grep '\"name\":\"#{hostname}\"'")
         | 
| 765 769 | 
             
                    end
         | 
| 766 770 |  | 
| 767 771 | 
             
                    # Ensure the host has requested a cert, then sign it
         | 
| @@ -409,10 +409,14 @@ module Beaker | |
| 409 409 | 
             
                def enable_root_login host, opts
         | 
| 410 410 | 
             
                  logger = opts[:logger]
         | 
| 411 411 | 
             
                  block_on host do |host|
         | 
| 412 | 
            -
                    logger.debug "Update  | 
| 412 | 
            +
                    logger.debug "Update sshd_config to allow root login"
         | 
| 413 413 | 
             
                    if host['platform'] =~ /osx/
         | 
| 414 | 
            -
                       | 
| 415 | 
            -
                       | 
| 414 | 
            +
                      # If osx > 10.10 use '/private/etc/ssh/sshd_config', else use '/etc/sshd_config'
         | 
| 415 | 
            +
                      ssh_config_file = '/private/etc/ssh/sshd_config'
         | 
| 416 | 
            +
                      ssh_config_file = '/etc/sshd_config' if host['platform'] =~ /^osx-10\.(9|10)/i
         | 
| 417 | 
            +
             | 
| 418 | 
            +
                      host.exec(Command.new("sudo sed -i '' 's/#PermitRootLogin no/PermitRootLogin Yes/g' #{ssh_config_file}"))
         | 
| 419 | 
            +
                      host.exec(Command.new("sudo sed -i '' 's/#PermitRootLogin yes/PermitRootLogin Yes/g' #{ssh_config_file}"))
         | 
| 416 420 | 
             
                    elsif host['platform'] =~ /freebsd/
         | 
| 417 421 | 
             
                      host.exec(Command.new("sudo sed -i -e 's/#PermitRootLogin no/PermitRootLogin yes/g' /etc/ssh/sshd_config"), {:pty => true} )
         | 
| 418 422 | 
             
                    elsif host['platform'] =~ /openbsd/
         | 
| @@ -811,7 +811,18 @@ module Beaker | |
| 811 811 | 
             
                  ssh_string = public_key()
         | 
| 812 812 | 
             
                  region.key_pairs.import(pair_name, ssh_string)
         | 
| 813 813 | 
             
                  kp = region.key_pairs[pair_name]
         | 
| 814 | 
            -
             | 
| 814 | 
            +
             | 
| 815 | 
            +
                  exists = false
         | 
| 816 | 
            +
                  for tries in 1..5
         | 
| 817 | 
            +
                    if kp.exists?
         | 
| 818 | 
            +
                      exists = true
         | 
| 819 | 
            +
                      break
         | 
| 820 | 
            +
                    end
         | 
| 821 | 
            +
                    @logger.debug("AWS key pair doesn't appear to exist yet, sleeping before retry ")
         | 
| 822 | 
            +
                    backoff_sleep(tries)
         | 
| 823 | 
            +
                  end
         | 
| 824 | 
            +
             | 
| 825 | 
            +
                  if exists
         | 
| 815 826 | 
             
                    @logger.debug("aws-sdk: key pair #{pair_name} imported")
         | 
| 816 827 | 
             
                    kp
         | 
| 817 828 | 
             
                  else
         | 
| @@ -122,6 +122,22 @@ module Beaker | |
| 122 122 | 
             
                  end
         | 
| 123 123 | 
             
                end
         | 
| 124 124 |  | 
| 125 | 
            +
                # Get a hash of volumes from the host
         | 
| 126 | 
            +
                def get_volumes host
         | 
| 127 | 
            +
                  return host['volumes'] if host['volumes']
         | 
| 128 | 
            +
                  {}
         | 
| 129 | 
            +
                end
         | 
| 130 | 
            +
             | 
| 131 | 
            +
                # Get the API version
         | 
| 132 | 
            +
                def get_volume_api_version
         | 
| 133 | 
            +
                  case @volume_client
         | 
| 134 | 
            +
                  when Fog::Volume::OpenStack::V1
         | 
| 135 | 
            +
                    1
         | 
| 136 | 
            +
                  else
         | 
| 137 | 
            +
                    -1
         | 
| 138 | 
            +
                  end
         | 
| 139 | 
            +
                end
         | 
| 140 | 
            +
             | 
| 125 141 | 
             
                # Create and attach dynamic volumes
         | 
| 126 142 | 
             
                #
         | 
| 127 143 | 
             
                # Creates an array of volumes and attaches them to the current host.
         | 
| @@ -133,23 +149,34 @@ module Beaker | |
| 133 149 | 
             
                # @param host [Hash] thet current host defined in the nodeset
         | 
| 134 150 | 
             
                # @param vm [Fog::Compute::OpenStack::Server] the server to attach to
         | 
| 135 151 | 
             
                def provision_storage host, vm
         | 
| 136 | 
            -
                   | 
| 152 | 
            +
                  volumes = get_volumes(host)
         | 
| 153 | 
            +
                  if !volumes.empty?
         | 
| 137 154 | 
             
                    # Lazily create the volume client if needed
         | 
| 138 155 | 
             
                    volume_client_create
         | 
| 139 | 
            -
                     | 
| 156 | 
            +
                    volumes.keys.each_with_index do |volume, index|
         | 
| 140 157 | 
             
                      @logger.debug "Creating volume #{volume} for OpenStack host #{host.name}"
         | 
| 141 158 |  | 
| 142 159 | 
             
                      # The node defintion file defines volume sizes in MB (due to precedent
         | 
| 143 160 | 
             
                      # with the vagrant virtualbox implementation) however OpenStack requires
         | 
| 144 161 | 
             
                      # this translating into GB
         | 
| 145 | 
            -
                      openstack_size =  | 
| 162 | 
            +
                      openstack_size = volumes[volume]['size'].to_i / 1000
         | 
| 163 | 
            +
             | 
| 164 | 
            +
                      # Set up the volume creation arguments
         | 
| 165 | 
            +
                      args = {
         | 
| 166 | 
            +
                        :size        => openstack_size,
         | 
| 167 | 
            +
                        :description => "Beaker volume: host=#{host.name} volume=#{volume}",
         | 
| 168 | 
            +
                      }
         | 
| 169 | 
            +
             | 
| 170 | 
            +
                      # Between version 1 and subsequent versions the API was updated to
         | 
| 171 | 
            +
                      # rename 'display_name' to just 'name' for better consistency
         | 
| 172 | 
            +
                      if get_volume_api_version == 1
         | 
| 173 | 
            +
                        args[:display_name] = volume
         | 
| 174 | 
            +
                      else
         | 
| 175 | 
            +
                        args[:name] = volume
         | 
| 176 | 
            +
                      end
         | 
| 146 177 |  | 
| 147 178 | 
             
                      # Create the volume and wait for it to become available
         | 
| 148 | 
            -
                      vol = @volume_client.volumes.create(
         | 
| 149 | 
            -
                        :size         => openstack_size,
         | 
| 150 | 
            -
                        :display_name => volume,
         | 
| 151 | 
            -
                        :description  => "Beaker volume: host=#{host.name} volume=#{volume}",
         | 
| 152 | 
            -
                      )
         | 
| 179 | 
            +
                      vol = @volume_client.volumes.create(**args)
         | 
| 153 180 | 
             
                      vol.wait_for { ready? }
         | 
| 154 181 |  | 
| 155 182 | 
             
                      # Fog needs a device name to attach as, so invent one.  The guest
         | 
| @@ -309,7 +336,24 @@ module Beaker | |
| 309 336 | 
             
                    @options[:openstack_keyname]
         | 
| 310 337 | 
             
                  else
         | 
| 311 338 | 
             
                    @logger.debug "Generate a new rsa key"
         | 
| 312 | 
            -
             | 
| 339 | 
            +
             | 
| 340 | 
            +
                    # There is apparently an error that can occur when generating RSA keys, probably
         | 
| 341 | 
            +
                    # due to some timing issue, probably similar to the issue described here:
         | 
| 342 | 
            +
                    # https://github.com/negativecode/vines/issues/34
         | 
| 343 | 
            +
                    # In order to mitigate this error, we will simply try again up to three times, and
         | 
| 344 | 
            +
                    # then fail if we continue to error out.
         | 
| 345 | 
            +
                    begin
         | 
| 346 | 
            +
                      retries ||= 0
         | 
| 347 | 
            +
                      key = OpenSSL::PKey::RSA.new 2048
         | 
| 348 | 
            +
                    rescue OpenSSL::PKey::RSAError => e
         | 
| 349 | 
            +
                      retries += 1
         | 
| 350 | 
            +
                      if retries > 2
         | 
| 351 | 
            +
                        @logger.notify "error generating RSA key #{retries} times, exiting"
         | 
| 352 | 
            +
                        raise e
         | 
| 353 | 
            +
                      end
         | 
| 354 | 
            +
                      retry
         | 
| 355 | 
            +
                    end
         | 
| 356 | 
            +
             | 
| 313 357 | 
             
                    type = key.ssh_type
         | 
| 314 358 | 
             
                    data = [ key.to_blob ].pack('m0')
         | 
| 315 359 | 
             
                    @logger.debug "Creating Openstack keypair for public key '#{type} #{data}'"
         | 
| @@ -8,6 +8,13 @@ class Beaker::VagrantLibvirt < Beaker::Vagrant | |
| 8 8 | 
             
                attr_reader :memory
         | 
| 9 9 | 
             
              end
         | 
| 10 10 |  | 
| 11 | 
            +
              # Return a random mac address with colons
         | 
| 12 | 
            +
              #
         | 
| 13 | 
            +
              # @return [String] a random mac address
         | 
| 14 | 
            +
              def randmac
         | 
| 15 | 
            +
                "08:00:27:" + (1..3).map{"%0.2X"%rand(256)}.join(':')
         | 
| 16 | 
            +
              end
         | 
| 17 | 
            +
             | 
| 11 18 | 
             
              def provision(provider = 'libvirt')
         | 
| 12 19 | 
             
                super
         | 
| 13 20 | 
             
              end
         | 
| @@ -1,5 +1,7 @@ | |
| 1 1 | 
             
            require 'beaker-hostgenerator'
         | 
| 2 2 |  | 
| 3 | 
            +
            CONFIG_DIR = '.beaker/acceptance/config'
         | 
| 4 | 
            +
             | 
| 3 5 | 
             
            VAGRANT  = ['ubuntu1404-64default.mdcal-ubuntu1404-64af', '--hypervisor=vagrant',
         | 
| 4 6 | 
             
                        '--global-config={box_url=https://vagrantcloud.com/puppetlabs/boxes/ubuntu-14.04-64-nocm,box=puppetlabs/ubuntu-14.04-64-nocm}']
         | 
| 5 7 |  | 
| @@ -9,17 +11,17 @@ namespace :beaker_quickstart do | |
| 9 11 |  | 
| 10 12 | 
             
              desc 'Generate Default Beaker Host Config File, valid options are: vmpooler or vagrant.'
         | 
| 11 13 | 
             
              task :gen_hosts, [:hypervisor] do |t, args|
         | 
| 12 | 
            -
                hosts_file = " | 
| 14 | 
            +
                hosts_file = "#{CONFIG_DIR}/default_#{args[:hypervisor]}_hosts.yaml"
         | 
| 13 15 | 
             
                if args[:hypervisor] == 'vagrant'
         | 
| 14 16 | 
             
                  cli = VAGRANT
         | 
| 15 17 | 
             
                elsif args[:hypervisor] == 'vmpooler'
         | 
| 16 18 | 
             
                  cli = VMPOOLER
         | 
| 17 19 | 
             
                else
         | 
| 18 20 | 
             
                  puts "No hypervisor provided, defaulting to vagrant."
         | 
| 19 | 
            -
                  hosts_file = " | 
| 21 | 
            +
                  hosts_file = "#{CONFIG_DIR}/default_vagrant_hosts.yaml"
         | 
| 20 22 | 
             
                  cli = VAGRANT
         | 
| 21 23 | 
             
                end
         | 
| 22 | 
            -
                FileUtils.mkdir_p( | 
| 24 | 
            +
                FileUtils.mkdir_p("#{CONFIG_DIR}") # -p creates intermediate directories as required
         | 
| 23 25 | 
             
                puts "About to run - beaker-hostgenerator #{cli.to_s.delete!('[]"')}"
         | 
| 24 26 | 
             
                if !File.exist?(hosts_file) then
         | 
| 25 27 | 
             
                  puts "Writing default host config to file - #{hosts_file}"
         | 
| @@ -90,4 +92,4 @@ def beaker_command(system_args) | |
| 90 92 | 
             
              cmd_parts << "--pre-suite #{system_args[:pre_suite]}"
         | 
| 91 93 | 
             
              cmd_parts << "--tests #{system_args[:tests]}"
         | 
| 92 94 | 
             
              cmd_parts.flatten.join(" ")
         | 
| 93 | 
            -
            end
         | 
| 95 | 
            +
            end
         | 
    
        data/lib/beaker/version.rb
    CHANGED
    
    
| @@ -1096,14 +1096,14 @@ describe ClassMixedWithDSLHelpers do | |
| 1096 1096 |  | 
| 1097 1097 | 
             
                it 'uses the default ports if none given' do
         | 
| 1098 1098 | 
             
                  host = hosts[0]
         | 
| 1099 | 
            -
                  expect( subject ).to receive( : | 
| 1099 | 
            +
                  expect( subject ).to receive( :retry_on ).with( anything(), /8080/, anything() ).once.ordered
         | 
| 1100 1100 | 
             
                  expect( subject ).to receive( :curl_with_retries ).with( anything(), anything(), /8081/, anything() ).once.ordered
         | 
| 1101 1101 | 
             
                  subject.sleep_until_puppetdb_started( host )
         | 
| 1102 1102 | 
             
                end
         | 
| 1103 1103 |  | 
| 1104 1104 | 
             
                it 'allows setting the nonssl_port' do
         | 
| 1105 1105 | 
             
                  host = hosts[0]
         | 
| 1106 | 
            -
                  expect( subject ).to receive( : | 
| 1106 | 
            +
                  expect( subject ).to receive( :retry_on ).with( anything(), /8084/, anything() ).once.ordered
         | 
| 1107 1107 | 
             
                  expect( subject ).to receive( :curl_with_retries ).with( anything(), anything(), /8081/, anything() ).once.ordered
         | 
| 1108 1108 | 
             
                  subject.sleep_until_puppetdb_started( host, 8084 )
         | 
| 1109 1109 |  | 
| @@ -1111,7 +1111,7 @@ describe ClassMixedWithDSLHelpers do | |
| 1111 1111 |  | 
| 1112 1112 | 
             
                it 'allows setting the ssl_port' do
         | 
| 1113 1113 | 
             
                  host = hosts[0]
         | 
| 1114 | 
            -
                  expect( subject ).to receive( : | 
| 1114 | 
            +
                  expect( subject ).to receive( :retry_on ).with( anything(), /8080/, anything() ).once.ordered
         | 
| 1115 1115 | 
             
                  expect( subject ).to receive( :curl_with_retries ).with( anything(), anything(), /8085/, anything() ).once.ordered
         | 
| 1116 1116 | 
             
                  subject.sleep_until_puppetdb_started( host, nil, 8085 )
         | 
| 1117 1117 | 
             
                end
         | 
| @@ -51,11 +51,21 @@ describe Beaker do | |
| 51 51 | 
             
                "sudo su -c \"sed -ri 's/^#?PermitRootLogin no|^#?PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config\""
         | 
| 52 52 | 
             
              ], true
         | 
| 53 53 |  | 
| 54 | 
            -
              it_should_behave_like 'enables_root_login', 'osx', [
         | 
| 54 | 
            +
              it_should_behave_like 'enables_root_login', 'osx-10.10', [
         | 
| 55 55 | 
             
                "sudo sed -i '' 's/#PermitRootLogin yes/PermitRootLogin Yes/g' /etc/sshd_config",
         | 
| 56 56 | 
             
                "sudo sed -i '' 's/#PermitRootLogin no/PermitRootLogin Yes/g' /etc/sshd_config"
         | 
| 57 57 | 
             
              ]
         | 
| 58 58 |  | 
| 59 | 
            +
              it_should_behave_like 'enables_root_login', 'osx-10.11', [
         | 
| 60 | 
            +
                "sudo sed -i '' 's/#PermitRootLogin yes/PermitRootLogin Yes/g' /private/etc/ssh/sshd_config",
         | 
| 61 | 
            +
                "sudo sed -i '' 's/#PermitRootLogin no/PermitRootLogin Yes/g' /private/etc/ssh/sshd_config"
         | 
| 62 | 
            +
              ]
         | 
| 63 | 
            +
             | 
| 64 | 
            +
              it_should_behave_like 'enables_root_login', 'osx-10.12', [
         | 
| 65 | 
            +
                  "sudo sed -i '' 's/#PermitRootLogin yes/PermitRootLogin Yes/g' /private/etc/ssh/sshd_config",
         | 
| 66 | 
            +
                  "sudo sed -i '' 's/#PermitRootLogin no/PermitRootLogin Yes/g' /private/etc/ssh/sshd_config"
         | 
| 67 | 
            +
              ]
         | 
| 68 | 
            +
             | 
| 59 69 | 
             
              # Solaris
         | 
| 60 70 | 
             
              it_should_behave_like 'enables_root_login', 'solaris-10', [
         | 
| 61 71 | 
             
                "sudo -E svcadm restart network/ssh",
         | 
| @@ -538,8 +548,16 @@ describe Beaker do | |
| 538 548 | 
             
              context "set_env" do
         | 
| 539 549 | 
             
                subject { dummy_class.new }
         | 
| 540 550 |  | 
| 541 | 
            -
                it "permits user environments on an OS X host" do
         | 
| 542 | 
            -
                  test_host_ssh_permit_user_environment('osx')
         | 
| 551 | 
            +
                it "permits user environments on an OS X 10.10 host" do
         | 
| 552 | 
            +
                  test_host_ssh_permit_user_environment('osx-10.10')
         | 
| 553 | 
            +
                end
         | 
| 554 | 
            +
             | 
| 555 | 
            +
                it "permits user environments on an OS X 10.11 host" do
         | 
| 556 | 
            +
                  test_host_ssh_permit_user_environment('osx-10.11')
         | 
| 557 | 
            +
                end
         | 
| 558 | 
            +
             | 
| 559 | 
            +
                it "permits user environments on an OS X 10.12 host" do
         | 
| 560 | 
            +
                  test_host_ssh_permit_user_environment('osx-10.12')
         | 
| 543 561 | 
             
                end
         | 
| 544 562 |  | 
| 545 563 | 
             
                it "permits user environments on an ssh-based linux host" do
         | 
| @@ -571,8 +589,16 @@ describe Beaker do | |
| 571 589 | 
             
                end
         | 
| 572 590 |  | 
| 573 591 |  | 
| 574 | 
            -
                it "sets user ssh environment on an OS X host" do
         | 
| 575 | 
            -
                  test_host_ssh_set_user_environment('osx')
         | 
| 592 | 
            +
                it "sets user ssh environment on an OS X 10.10 host" do
         | 
| 593 | 
            +
                  test_host_ssh_set_user_environment('osx-10.10')
         | 
| 594 | 
            +
                end
         | 
| 595 | 
            +
             | 
| 596 | 
            +
                it "sets user ssh environment on an OS X 10.11 host" do
         | 
| 597 | 
            +
                  test_host_ssh_set_user_environment('osx-10.11')
         | 
| 598 | 
            +
                end
         | 
| 599 | 
            +
             | 
| 600 | 
            +
                it "sets user ssh environment on an OS X 10.12 host" do
         | 
| 601 | 
            +
                  test_host_ssh_set_user_environment('osx-10.12')
         | 
| 576 602 | 
             
                end
         | 
| 577 603 |  | 
| 578 604 | 
             
                it "sets user ssh environment on an ssh-based linux host" do
         | 
| @@ -839,12 +839,13 @@ module Beaker | |
| 839 839 | 
             
                  end
         | 
| 840 840 |  | 
| 841 841 | 
             
                  it 'imports the key given from public_key' do
         | 
| 842 | 
            -
                    expect(pair).to receive(:exists?).and_return | 
| 842 | 
            +
                    expect(pair).to receive(:exists?).and_return(true)
         | 
| 843 843 | 
             
                    aws.create_new_key_pair(region, pair_name)
         | 
| 844 844 | 
             
                  end
         | 
| 845 845 |  | 
| 846 846 | 
             
                  it 'raises an exception if subsequent keypair check is false' do
         | 
| 847 | 
            -
                    expect(pair).to receive(:exists?).and_return | 
| 847 | 
            +
                    expect(pair).to receive(:exists?).and_return(false).exactly(5).times
         | 
| 848 | 
            +
                    expect(aws).to receive(:backoff_sleep).exactly(5).times
         | 
| 848 849 | 
             
                    expect { aws.create_new_key_pair(region, pair_name) }.
         | 
| 849 850 | 
             
                      to raise_error(RuntimeError,
         | 
| 850 851 | 
             
                        "AWS key pair #{pair_name} can not be queried, even after import")
         | 
| @@ -104,5 +104,57 @@ module Beaker | |
| 104 104 | 
             
                  (1..3).each { openstack.get_ip }
         | 
| 105 105 | 
             
                end
         | 
| 106 106 |  | 
| 107 | 
            +
                it 'creates volumes with cinder v1' do
         | 
| 108 | 
            +
                  # Mock a volume
         | 
| 109 | 
            +
                  allow(openstack).to receive(:get_volumes).and_return({'volume1' => {'size' => 1000000 }})
         | 
| 110 | 
            +
             | 
| 111 | 
            +
                  # Stub out the call to create the client and hard code the return value
         | 
| 112 | 
            +
                  allow(openstack).to receive(:volume_client_create).and_return(nil)
         | 
| 113 | 
            +
                  client = double().as_null_object
         | 
| 114 | 
            +
                  openstack.instance_variable_set(:@volume_client, client)
         | 
| 115 | 
            +
                  allow(openstack).to receive(:get_volume_api_version).and_return(1)
         | 
| 116 | 
            +
             | 
| 117 | 
            +
                  # Check the parameters are valid, correct 'name' parameter and correct size conversion
         | 
| 118 | 
            +
                  mock_volume = double().as_null_object
         | 
| 119 | 
            +
                  expect(client).to receive(:create).with(:display_name => 'volume1', :description => 'Beaker volume: host=alan volume=volume1', :size => 1000).and_return(mock_volume)
         | 
| 120 | 
            +
                  allow(mock_volume).to receive(:wait_for).and_return(nil)
         | 
| 121 | 
            +
             | 
| 122 | 
            +
                  # Perform the test!
         | 
| 123 | 
            +
                  mock_vm = double().as_null_object
         | 
| 124 | 
            +
                  allow(mock_volume).to receive(:id).and_return('Fake ID')
         | 
| 125 | 
            +
                  expect(mock_vm).to receive(:attach_volume).with('Fake ID', '/dev/vdb')
         | 
| 126 | 
            +
             | 
| 127 | 
            +
                  mock_host = double().as_null_object
         | 
| 128 | 
            +
                  allow(mock_host).to receive(:name).and_return('alan')
         | 
| 129 | 
            +
             | 
| 130 | 
            +
                  openstack.provision_storage mock_host, mock_vm
         | 
| 131 | 
            +
                end
         | 
| 132 | 
            +
             | 
| 133 | 
            +
                it 'creates volumes with cinder v2' do
         | 
| 134 | 
            +
                  # Mock a volume
         | 
| 135 | 
            +
                  allow(openstack).to receive(:get_volumes).and_return({'volume1' => {'size' => 1000000 }})
         | 
| 136 | 
            +
             | 
| 137 | 
            +
                  # Stub out the call to create the client and hard code the return value
         | 
| 138 | 
            +
                  allow(openstack).to receive(:volume_client_create).and_return(nil)
         | 
| 139 | 
            +
                  client = double().as_null_object
         | 
| 140 | 
            +
                  openstack.instance_variable_set(:@volume_client, client)
         | 
| 141 | 
            +
                  allow(openstack).to receive(:get_volume_api_version).and_return(-1)
         | 
| 142 | 
            +
             | 
| 143 | 
            +
                  # Check the parameters are valid, correct 'name' parameter and correct size conversion
         | 
| 144 | 
            +
                  mock_volume = double().as_null_object
         | 
| 145 | 
            +
                  expect(client).to receive(:create).with(:name => 'volume1', :description => 'Beaker volume: host=alan volume=volume1', :size => 1000).and_return(mock_volume)
         | 
| 146 | 
            +
                  allow(mock_volume).to receive(:wait_for).and_return(nil)
         | 
| 147 | 
            +
             | 
| 148 | 
            +
                  # Perform the test!
         | 
| 149 | 
            +
                  mock_vm = double().as_null_object
         | 
| 150 | 
            +
                  allow(mock_volume).to receive(:id).and_return('Fake ID')
         | 
| 151 | 
            +
                  expect(mock_vm).to receive(:attach_volume).with('Fake ID', '/dev/vdb')
         | 
| 152 | 
            +
             | 
| 153 | 
            +
                  mock_host = double().as_null_object
         | 
| 154 | 
            +
                  allow(mock_host).to receive(:name).and_return('alan')
         | 
| 155 | 
            +
             | 
| 156 | 
            +
                  openstack.provision_storage mock_host, mock_vm
         | 
| 157 | 
            +
                end
         | 
| 158 | 
            +
             | 
| 107 159 | 
             
              end
         | 
| 108 160 | 
             
            end
         | 
| @@ -29,7 +29,6 @@ describe Beaker::VagrantLibvirt do | |
| 29 29 | 
             
                before(:each) do
         | 
| 30 30 | 
             
                  FakeFS.activate!
         | 
| 31 31 | 
             
                  path = vagrant.instance_variable_get( :@vagrant_path )
         | 
| 32 | 
            -
                  allow( vagrant ).to receive( :randmac ).and_return( "0123456789" )
         | 
| 33 32 |  | 
| 34 33 | 
             
                  vagrant.make_vfile( @hosts, options )
         | 
| 35 34 | 
             
                  @vagrantfile = File.read( File.expand_path( File.join( path, "Vagrantfile")))
         | 
| @@ -53,5 +52,10 @@ describe Beaker::VagrantLibvirt do | |
| 53 52 | 
             
                  expect( @vagrantfile.split("\n").map(&:strip) )
         | 
| 54 53 | 
             
                    .to include("node.uri = 'qemu+ssh://root@host/system'")
         | 
| 55 54 | 
             
                end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                it "has a mac address in the proper format" do
         | 
| 57 | 
            +
                  expect( @vagrantfile.split("\n").map(&:strip) )
         | 
| 58 | 
            +
                    .to include(/:mac => "08:00:27:\h{2}:\h{2}:\h{2}"/)
         | 
| 59 | 
            +
                end
         | 
| 56 60 | 
             
              end
         | 
| 57 61 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: beaker
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 3. | 
| 4 | 
            +
              version: 3.11.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Puppetlabs
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2017- | 
| 11 | 
            +
            date: 2017-02-13 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: rspec
         | 
| @@ -140,16 +140,16 @@ dependencies: | |
| 140 140 | 
             
              name: net-ssh
         | 
| 141 141 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 142 142 | 
             
                requirements:
         | 
| 143 | 
            -
                - -  | 
| 143 | 
            +
                - - ~>
         | 
| 144 144 | 
             
                  - !ruby/object:Gem::Version
         | 
| 145 | 
            -
                    version:  | 
| 145 | 
            +
                    version: '4.0'
         | 
| 146 146 | 
             
              type: :runtime
         | 
| 147 147 | 
             
              prerelease: false
         | 
| 148 148 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 149 149 | 
             
                requirements:
         | 
| 150 | 
            -
                - -  | 
| 150 | 
            +
                - - ~>
         | 
| 151 151 | 
             
                  - !ruby/object:Gem::Version
         | 
| 152 | 
            -
                    version:  | 
| 152 | 
            +
                    version: '4.0'
         | 
| 153 153 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 154 154 | 
             
              name: net-scp
         | 
| 155 155 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -416,13 +416,14 @@ files: | |
| 416 416 | 
             
            - acceptance/config/puppetgit/acceptance-options.rb
         | 
| 417 417 | 
             
            - acceptance/config/puppetpe/acceptance-options.rb
         | 
| 418 418 | 
             
            - acceptance/config/puppetpkg/acceptance-options.rb
         | 
| 419 | 
            +
            - acceptance/config/subcommands/acceptance-options.rb
         | 
| 419 420 | 
             
            - acceptance/fixtures/README.md
         | 
| 420 421 | 
             
            - acceptance/fixtures/files/failing_shell_script.txt
         | 
| 421 422 | 
             
            - acceptance/fixtures/files/retry_script.txt
         | 
| 422 423 | 
             
            - acceptance/fixtures/files/shell_script_with_output.txt
         | 
| 423 424 | 
             
            - acceptance/fixtures/files/simple_text_file.txt
         | 
| 424 | 
            -
            - acceptance/fixtures/files/sles-11-x86_64.repo | 
| 425 | 
            -
            - acceptance/fixtures/files/sles-12-x86_64.repo | 
| 425 | 
            +
            - acceptance/fixtures/files/sles-11-x86_64.repo
         | 
| 426 | 
            +
            - acceptance/fixtures/files/sles-12-x86_64.repo
         | 
| 426 427 | 
             
            - acceptance/fixtures/module/Gemfile
         | 
| 427 428 | 
             
            - acceptance/fixtures/module/README.md
         | 
| 428 429 | 
             
            - acceptance/fixtures/module/Rakefile
         | 
| @@ -476,6 +477,8 @@ files: | |
| 476 477 | 
             
            - acceptance/pre_suite/puppet_gem/install.rb
         | 
| 477 478 | 
             
            - acceptance/pre_suite/puppet_git/install.rb
         | 
| 478 479 | 
             
            - acceptance/pre_suite/puppet_pkg/install.rb
         | 
| 480 | 
            +
            - acceptance/pre_suite/subcommands/05_install_ruby.rb
         | 
| 481 | 
            +
            - acceptance/pre_suite/subcommands/08_install_beaker.rb
         | 
| 479 482 | 
             
            - acceptance/tests/base/README.md
         | 
| 480 483 | 
             
            - acceptance/tests/base/dsl/helpers/configuration_test.rb
         | 
| 481 484 | 
             
            - acceptance/tests/base/dsl/helpers/hocon_helpers_test.rb
         | 
| @@ -520,6 +523,7 @@ files: | |
| 520 523 | 
             
            - acceptance/tests/puppet/stub_host.rb
         | 
| 521 524 | 
             
            - acceptance/tests/puppet/web_helpers_test.rb
         | 
| 522 525 | 
             
            - acceptance/tests/puppet/with_puppet_running_on.rb
         | 
| 526 | 
            +
            - acceptance/tests/subcommands/init.rb
         | 
| 523 527 | 
             
            - beaker.gemspec
         | 
| 524 528 | 
             
            - bin/beaker
         | 
| 525 529 | 
             
            - docs/README.md
         |