beaker 2.2.0 → 2.3.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/HISTORY.md +222 -4
 - data/ext/completion/beaker-completion.bash +53 -0
 - data/lib/beaker/answers/version30.rb +98 -93
 - data/lib/beaker/answers/version32.rb +3 -0
 - data/lib/beaker/answers/version34.rb +4 -1
 - data/lib/beaker/dsl/helpers.rb +42 -1
 - data/lib/beaker/dsl/install_utils.rb +76 -35
 - data/lib/beaker/dsl/roles.rb +43 -15
 - data/lib/beaker/host.rb +1 -0
 - data/lib/beaker/host_prebuilt_steps.rb +10 -4
 - data/lib/beaker/hypervisor/aws_sdk.rb +24 -9
 - data/lib/beaker/hypervisor/openstack.rb +26 -1
 - data/lib/beaker/hypervisor/vagrant.rb +8 -2
 - data/lib/beaker/hypervisor/vagrant_virtualbox.rb +2 -0
 - data/lib/beaker/options/presets.rb +1 -0
 - data/lib/beaker/shared/host_manager.rb +21 -0
 - data/lib/beaker/version.rb +1 -1
 - data/spec/beaker/answers_spec.rb +38 -0
 - data/spec/beaker/dsl/helpers_spec.rb +52 -0
 - data/spec/beaker/dsl/install_utils_spec.rb +58 -1
 - data/spec/beaker/dsl/roles_spec.rb +27 -2
 - data/spec/beaker/host_spec.rb +18 -0
 - data/spec/beaker/hypervisor/vagrant_spec.rb +11 -0
 - data/spec/beaker/shared/host_manager_spec.rb +20 -0
 - metadata +3 -2
 
| 
         @@ -40,7 +40,7 @@ module Beaker 
     | 
|
| 
       40 
40 
     | 
    
         
             
                  if not @compute_client
         
     | 
| 
       41 
41 
     | 
    
         
             
                    raise "Unable to create OpenStack Compute instance (api key: #{@options[:openstack_api_key]}, username: #{@options[:openstack_username]}, auth_url: #{@options[:openstack_auth_url]}, tenant: #{@options[:openstack_tenant]})"
         
     | 
| 
       42 
42 
     | 
    
         
             
                  end
         
     | 
| 
       43 
     | 
    
         
            -
                  @network_client  
     | 
| 
      
 43 
     | 
    
         
            +
                  @network_client ||= Fog::Network.new(
         
     | 
| 
       44 
44 
     | 
    
         
             
                    :provider => :openstack,
         
     | 
| 
       45 
45 
     | 
    
         
             
                    :openstack_api_key => @options[:openstack_api_key],
         
     | 
| 
       46 
46 
     | 
    
         
             
                    :openstack_username => @options[:openstack_username],
         
     | 
| 
         @@ -132,6 +132,8 @@ module Beaker 
     | 
|
| 
       132 
132 
     | 
    
         
             
                                        :project           => @options[:project].to_s })
         
     | 
| 
       133 
133 
     | 
    
         
             
                    @vms << vm
         
     | 
| 
       134 
134 
     | 
    
         | 
| 
      
 135 
     | 
    
         
            +
                    #enable root if user is not root
         
     | 
| 
      
 136 
     | 
    
         
            +
                    enable_root_on_hosts()
         
     | 
| 
       135 
137 
     | 
    
         
             
                  end
         
     | 
| 
       136 
138 
     | 
    
         
             
                end
         
     | 
| 
       137 
139 
     | 
    
         | 
| 
         @@ -150,5 +152,28 @@ module Beaker 
     | 
|
| 
       150 
152 
     | 
    
         
             
                  end
         
     | 
| 
       151 
153 
     | 
    
         
             
                end
         
     | 
| 
       152 
154 
     | 
    
         | 
| 
      
 155 
     | 
    
         
            +
                # Enables root for instances with custom username like ubuntu-amis
         
     | 
| 
      
 156 
     | 
    
         
            +
                #
         
     | 
| 
      
 157 
     | 
    
         
            +
                # @return [void]
         
     | 
| 
      
 158 
     | 
    
         
            +
                # @api private
         
     | 
| 
      
 159 
     | 
    
         
            +
                def enable_root_on_hosts
         
     | 
| 
      
 160 
     | 
    
         
            +
                  @hosts.each do |host|
         
     | 
| 
      
 161 
     | 
    
         
            +
                    enable_root(host)
         
     | 
| 
      
 162 
     | 
    
         
            +
                  end
         
     | 
| 
      
 163 
     | 
    
         
            +
                end
         
     | 
| 
      
 164 
     | 
    
         
            +
             
     | 
| 
      
 165 
     | 
    
         
            +
                # Enables root access for a host when username is not root
         
     | 
| 
      
 166 
     | 
    
         
            +
                #
         
     | 
| 
      
 167 
     | 
    
         
            +
                # @return [void]
         
     | 
| 
      
 168 
     | 
    
         
            +
                # @api private
         
     | 
| 
      
 169 
     | 
    
         
            +
                def enable_root(host)
         
     | 
| 
      
 170 
     | 
    
         
            +
                  if host['user'] != 'root'
         
     | 
| 
      
 171 
     | 
    
         
            +
                    copy_ssh_to_root(host, @options)
         
     | 
| 
      
 172 
     | 
    
         
            +
                    enable_root_login(host, @options)
         
     | 
| 
      
 173 
     | 
    
         
            +
                    host['user'] = 'root'
         
     | 
| 
      
 174 
     | 
    
         
            +
                    host.close
         
     | 
| 
      
 175 
     | 
    
         
            +
                  end
         
     | 
| 
      
 176 
     | 
    
         
            +
                end
         
     | 
| 
      
 177 
     | 
    
         
            +
             
     | 
| 
       153 
178 
     | 
    
         
             
              end
         
     | 
| 
       154 
179 
     | 
    
         
             
            end
         
     | 
| 
         @@ -31,6 +31,7 @@ module Beaker 
     | 
|
| 
       31 
31 
     | 
    
         
             
                    v_file << "    v.vm.box_url = '#{host['box_url']}'\n" unless host['box_url'].nil?
         
     | 
| 
       32 
32 
     | 
    
         
             
                    v_file << "    v.vm.box_version = '#{host['box_version']}'\n" unless host['box_version'].nil?
         
     | 
| 
       33 
33 
     | 
    
         
             
                    v_file << "    v.vm.box_check_update = '#{host['box_check_update'] ||= 'true'}'\n"
         
     | 
| 
      
 34 
     | 
    
         
            +
                    v_file << "    v.vm.synced_folder '.', '/vagrant', disabled: true\n" if host['synced_folder'] == 'disabled'
         
     | 
| 
       34 
35 
     | 
    
         
             
                    v_file << "    v.vm.network :private_network, ip: \"#{host['ip'].to_s}\", :netmask => \"#{host['netmask'] ||= "255.255.0.0"}\", :mac => \"#{randmac}\"\n"
         
     | 
| 
       35 
36 
     | 
    
         | 
| 
       36 
37 
     | 
    
         
             
                    if /windows/i.match(host['platform'])
         
     | 
| 
         @@ -39,6 +40,11 @@ module Beaker 
     | 
|
| 
       39 
40 
     | 
    
         
             
                      v_file << "    v.vm.guest = :windows"
         
     | 
| 
       40 
41 
     | 
    
         
             
                    end
         
     | 
| 
       41 
42 
     | 
    
         | 
| 
      
 43 
     | 
    
         
            +
                    if /osx/i.match(host['platform'])
         
     | 
| 
      
 44 
     | 
    
         
            +
                      v_file << "    v.vm.network 'private_network', ip: '10.0.1.10'\n"
         
     | 
| 
      
 45 
     | 
    
         
            +
                      v_file << "    v.vm.synced_folder '.', '/vagrant', :nfs => true\n"
         
     | 
| 
      
 46 
     | 
    
         
            +
                    end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
       42 
48 
     | 
    
         
             
                    v_file << self.class.provider_vfile_section(host, options)
         
     | 
| 
       43 
49 
     | 
    
         | 
| 
       44 
50 
     | 
    
         
             
                    v_file << "  end\n"
         
     | 
| 
         @@ -163,12 +169,12 @@ module Beaker 
     | 
|
| 
       163 
169 
     | 
    
         
             
                        @logger.info(line)
         
     | 
| 
       164 
170 
     | 
    
         
             
                      end
         
     | 
| 
       165 
171 
     | 
    
         
             
                      if not wait_thr.value.success?
         
     | 
| 
       166 
     | 
    
         
            -
                        raise "Failed to exec 'vagrant #{args}'"
         
     | 
| 
      
 172 
     | 
    
         
            +
                        raise "Failed to exec 'vagrant #{args}'. Error was #{stderr.read}"
         
     | 
| 
       167 
173 
     | 
    
         
             
                      end
         
     | 
| 
       168 
174 
     | 
    
         
             
                      exit_status = wait_thr.value
         
     | 
| 
       169 
175 
     | 
    
         
             
                    }
         
     | 
| 
       170 
176 
     | 
    
         
             
                    if exit_status != 0
         
     | 
| 
       171 
     | 
    
         
            -
                      raise "Failed to execute vagrant_cmd ( #{args} )"
         
     | 
| 
      
 177 
     | 
    
         
            +
                      raise "Failed to execute vagrant_cmd ( #{args} ). Error was #{stderr.read}"
         
     | 
| 
       172 
178 
     | 
    
         
             
                    end
         
     | 
| 
       173 
179 
     | 
    
         
             
                  end
         
     | 
| 
       174 
180 
     | 
    
         
             
                end
         
     | 
| 
         @@ -18,6 +18,8 @@ class Beaker::VagrantVirtualbox < Beaker::Vagrant 
     | 
|
| 
       18 
18 
     | 
    
         
             
                  provider_section << "      vb.customize ['storageattach', :id, '--storagectl', 'SATA Controller', '--port', 1, '--device', 0, '--type', 'hdd', '--medium','#{host['disk_path']}']\n"
         
     | 
| 
       19 
19 
     | 
    
         
             
                  provider_section << "      vb.customize [\"modifyvm\", :id, \"--natdnshostresolver1\", \"#{host['natdns']}\"]\n" unless host['natdns'].nil?
         
     | 
| 
       20 
20 
     | 
    
         
             
                  provider_section << "      vb.customize [\"modifyvm\", :id, \"--natdnsproxy1\", \"#{host['natdns']}\"]\n" unless host['natdns'].nil?
         
     | 
| 
      
 21 
     | 
    
         
            +
                  provider_section << "      vb.gui = true\n" unless host['vb_gui'].nil?
         
     | 
| 
      
 22 
     | 
    
         
            +
                  provider_section << "      [\"modifyvm\", :id, \"--cpuidset\", \"1\",\"000206a7\",\"02100800\",\"1fbae3bf\",\"bfebfbff\"\]" if /osx/i.match(host['platform'])
         
     | 
| 
       21 
23 
     | 
    
         
             
                end
         
     | 
| 
       22 
24 
     | 
    
         
             
                provider_section << "    end\n"
         
     | 
| 
       23 
25 
     | 
    
         | 
| 
         @@ -46,6 +46,27 @@ module Beaker 
     | 
|
| 
       46 
46 
     | 
    
         
             
                    a_host.first
         
     | 
| 
       47 
47 
     | 
    
         
             
                  end
         
     | 
| 
       48 
48 
     | 
    
         | 
| 
      
 49 
     | 
    
         
            +
                  # Find at most a single host with the role provided.  Raise an error if
         
     | 
| 
      
 50 
     | 
    
         
            +
                  # more than one host is found to have the provided role.
         
     | 
| 
      
 51 
     | 
    
         
            +
                  # @param [Array<Host>] hosts The hosts to examine
         
     | 
| 
      
 52 
     | 
    
         
            +
                  # @param [String] role The host returned will have this role in its role list
         
     | 
| 
      
 53 
     | 
    
         
            +
                  # @return [Host] The single host with the desired role in its roles list
         
     | 
| 
      
 54 
     | 
    
         
            +
                  #                     or nil if no host is found
         
     | 
| 
      
 55 
     | 
    
         
            +
                  # @raise [ArgumentError] Raised if more than one host has the given role defined
         
     | 
| 
      
 56 
     | 
    
         
            +
                  def find_at_most_one_host_with_role(hosts, role)
         
     | 
| 
      
 57 
     | 
    
         
            +
                    role_hosts = hosts_with_role(hosts, role)
         
     | 
| 
      
 58 
     | 
    
         
            +
                    host_with_role = nil
         
     | 
| 
      
 59 
     | 
    
         
            +
                    case role_hosts.length
         
     | 
| 
      
 60 
     | 
    
         
            +
                    when 0
         
     | 
| 
      
 61 
     | 
    
         
            +
                    when 1
         
     | 
| 
      
 62 
     | 
    
         
            +
                      host_with_role = role_hosts[0]
         
     | 
| 
      
 63 
     | 
    
         
            +
                    else
         
     | 
| 
      
 64 
     | 
    
         
            +
                      host_string = ( role_hosts.map { |host| host.name } ).join( ', ')
         
     | 
| 
      
 65 
     | 
    
         
            +
                      raise ArgumentError, "There should be only one host with #{role} defined, but I found #{role_hosts.length} (#{host_string})"
         
     | 
| 
      
 66 
     | 
    
         
            +
                    end
         
     | 
| 
      
 67 
     | 
    
         
            +
                    host_with_role
         
     | 
| 
      
 68 
     | 
    
         
            +
                  end
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
       49 
70 
     | 
    
         
             
                  #Execute a block selecting the hosts that match with the provided criteria
         
     | 
| 
       50 
71 
     | 
    
         
             
                  #@param [Array<Host>, Host] hosts The host or hosts to run the provided block against
         
     | 
| 
       51 
72 
     | 
    
         
             
                  #@param [String, Symbol] filter Optional filter to apply to provided hosts - limits by name or role
         
     | 
    
        data/lib/beaker/version.rb
    CHANGED
    
    
    
        data/spec/beaker/answers_spec.rb
    CHANGED
    
    | 
         @@ -50,6 +50,44 @@ module Beaker 
     | 
|
| 
       50 
50 
     | 
    
         
             
                end
         
     | 
| 
       51 
51 
     | 
    
         
             
              end
         
     | 
| 
       52 
52 
     | 
    
         | 
| 
      
 53 
     | 
    
         
            +
              describe "Masterless Setup" do
         
     | 
| 
      
 54 
     | 
    
         
            +
                let( :ver ) { @ver || '3.0' }
         
     | 
| 
      
 55 
     | 
    
         
            +
                let( :options )     { options = Beaker::Options::Presets.new.presets
         
     | 
| 
      
 56 
     | 
    
         
            +
                                      options[:masterless] = true
         
     | 
| 
      
 57 
     | 
    
         
            +
                                      options }
         
     | 
| 
      
 58 
     | 
    
         
            +
                let( :hosts ) { make_hosts({}, 1) }
         
     | 
| 
      
 59 
     | 
    
         
            +
                let( :host ) { hosts[0] }
         
     | 
| 
      
 60 
     | 
    
         
            +
                let( :answers ) { Beaker::Answers.create(ver, hosts, options) }
         
     | 
| 
      
 61 
     | 
    
         
            +
                let( :host_answers ) { answers.answers[host.name] }
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
                it 'adds the correct answers' do
         
     | 
| 
      
 65 
     | 
    
         
            +
                  expect( host_answers[:q_puppetagent_server] ).to be === host_answers[:q_puppetagent_certname]
         
     | 
| 
      
 66 
     | 
    
         
            +
                  expect( host_answers[:q_continue_or_reenter_master_hostname]).to be === 'c'
         
     | 
| 
      
 67 
     | 
    
         
            +
                end
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
                it 'skips the correct answers' do
         
     | 
| 
      
 70 
     | 
    
         
            +
                  expect( host_answers[:q_puppetmaster_install]).to be === 'n'
         
     | 
| 
      
 71 
     | 
    
         
            +
                  expect( host_answers[:q_puppet_enterpriseconsole_install] ).to be === 'n'
         
     | 
| 
      
 72 
     | 
    
         
            +
                  expect( host_answers[:q_puppetdb_install] ).to be === 'n'
         
     | 
| 
      
 73 
     | 
    
         
            +
                end
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
      
 75 
     | 
    
         
            +
                it '3.0: never calls #only_host_with_role in #generate_answers' do
         
     | 
| 
      
 76 
     | 
    
         
            +
                  expect( answers.generate_answers ).to_not receive( :only_host_with_role )
         
     | 
| 
      
 77 
     | 
    
         
            +
                end
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
      
 79 
     | 
    
         
            +
                it '3.2: never calls #only_host_with_role in #generate_answers' do
         
     | 
| 
      
 80 
     | 
    
         
            +
                  @ver = '3.2'
         
     | 
| 
      
 81 
     | 
    
         
            +
                  expect( answers.generate_answers ).to_not receive( :only_host_with_role )
         
     | 
| 
      
 82 
     | 
    
         
            +
                end
         
     | 
| 
      
 83 
     | 
    
         
            +
             
     | 
| 
      
 84 
     | 
    
         
            +
                it '3.4: never calls #only_host_with_role in #generate_answers' do
         
     | 
| 
      
 85 
     | 
    
         
            +
                  @ver = '3.4'
         
     | 
| 
      
 86 
     | 
    
         
            +
                  expect( answers.generate_answers ).to_not receive( :only_host_with_role )
         
     | 
| 
      
 87 
     | 
    
         
            +
                end
         
     | 
| 
      
 88 
     | 
    
         
            +
             
     | 
| 
      
 89 
     | 
    
         
            +
              end
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
       53 
91 
     | 
    
         
             
              describe Version34 do
         
     | 
| 
       54 
92 
     | 
    
         
             
                let( :options )     { Beaker::Options::Presets.new.presets }
         
     | 
| 
       55 
93 
     | 
    
         
             
                let( :basic_hosts ) { make_hosts( {'pe_ver' => @ver } ) }
         
     | 
| 
         @@ -1294,4 +1294,56 @@ describe ClassMixedWithDSLHelpers do 
     | 
|
| 
       1294 
1294 
     | 
    
         
             
                  end
         
     | 
| 
       1295 
1295 
     | 
    
         
             
                end
         
     | 
| 
       1296 
1296 
     | 
    
         
             
              end
         
     | 
| 
      
 1297 
     | 
    
         
            +
             
     | 
| 
      
 1298 
     | 
    
         
            +
              describe "#write_hiera_config_on" do
         
     | 
| 
      
 1299 
     | 
    
         
            +
                let(:hierarchy) { [ 'nodes/%{::fqdn}', 'common' ] }
         
     | 
| 
      
 1300 
     | 
    
         
            +
                it 'on FOSS host' do
         
     | 
| 
      
 1301 
     | 
    
         
            +
                  host = make_host('testhost', { :platform => 'ubuntu' } )
         
     | 
| 
      
 1302 
     | 
    
         
            +
                  expect(subject).to receive(:create_remote_file).with(host, host[:hieraconf], /#{host[:hieradatadir]}/)
         
     | 
| 
      
 1303 
     | 
    
         
            +
                  subject.write_hiera_config_on(host, hierarchy)
         
     | 
| 
      
 1304 
     | 
    
         
            +
                end
         
     | 
| 
      
 1305 
     | 
    
         
            +
             
     | 
| 
      
 1306 
     | 
    
         
            +
                it 'on PE host' do
         
     | 
| 
      
 1307 
     | 
    
         
            +
                  host = make_host('testhost', { :platform => 'ubuntu', :type => 'pe' } )
         
     | 
| 
      
 1308 
     | 
    
         
            +
                  expect(subject).to receive(:create_remote_file).with(host, host[:hieraconf], /#{host[:hieradatadir]}/)
         
     | 
| 
      
 1309 
     | 
    
         
            +
                  subject.write_hiera_config_on(host, hierarchy)
         
     | 
| 
      
 1310 
     | 
    
         
            +
                end
         
     | 
| 
      
 1311 
     | 
    
         
            +
             
     | 
| 
      
 1312 
     | 
    
         
            +
              end
         
     | 
| 
      
 1313 
     | 
    
         
            +
             
     | 
| 
      
 1314 
     | 
    
         
            +
              describe "#write_hiera_config" do
         
     | 
| 
      
 1315 
     | 
    
         
            +
                let(:hierarchy) { [ 'nodes/%{::fqdn}', 'common' ] }
         
     | 
| 
      
 1316 
     | 
    
         
            +
                it 'delegates to #write_hiera_config_on with the default host' do
         
     | 
| 
      
 1317 
     | 
    
         
            +
                  allow( subject ).to receive( :hosts ).and_return( hosts )
         
     | 
| 
      
 1318 
     | 
    
         
            +
                  expect( subject ).to receive( :write_hiera_config_on ).with( master, hierarchy).once
         
     | 
| 
      
 1319 
     | 
    
         
            +
                  subject.write_hiera_config( hierarchy )
         
     | 
| 
      
 1320 
     | 
    
         
            +
                end
         
     | 
| 
      
 1321 
     | 
    
         
            +
             
     | 
| 
      
 1322 
     | 
    
         
            +
              end
         
     | 
| 
      
 1323 
     | 
    
         
            +
             
     | 
| 
      
 1324 
     | 
    
         
            +
              describe "#copy_hiera_data_to" do
         
     | 
| 
      
 1325 
     | 
    
         
            +
                let(:path) { 'spec/fixtures/hieradata' }
         
     | 
| 
      
 1326 
     | 
    
         
            +
                it 'on FOSS host' do
         
     | 
| 
      
 1327 
     | 
    
         
            +
                  host = make_host('testhost', { :platform => 'ubuntu' } )
         
     | 
| 
      
 1328 
     | 
    
         
            +
                  expect(subject).to receive(:scp_to).with(host, File.expand_path(path), host[:hieradatadir])
         
     | 
| 
      
 1329 
     | 
    
         
            +
                  subject.copy_hiera_data_to(host, path)
         
     | 
| 
      
 1330 
     | 
    
         
            +
                end
         
     | 
| 
      
 1331 
     | 
    
         
            +
             
     | 
| 
      
 1332 
     | 
    
         
            +
                it 'on PE host' do
         
     | 
| 
      
 1333 
     | 
    
         
            +
                  host = make_host('testhost', { :platform => 'ubuntu', :type => 'pe' } )
         
     | 
| 
      
 1334 
     | 
    
         
            +
                  expect(subject).to receive(:scp_to).with(host, File.expand_path(path), host[:hieradatadir])
         
     | 
| 
      
 1335 
     | 
    
         
            +
                  subject.copy_hiera_data_to(host, path)
         
     | 
| 
      
 1336 
     | 
    
         
            +
                end
         
     | 
| 
      
 1337 
     | 
    
         
            +
              end
         
     | 
| 
      
 1338 
     | 
    
         
            +
             
     | 
| 
      
 1339 
     | 
    
         
            +
              describe "#copy_hiera_data" do
         
     | 
| 
      
 1340 
     | 
    
         
            +
                let(:path) { 'spec/fixtures/hieradata' }
         
     | 
| 
      
 1341 
     | 
    
         
            +
                it 'delegates to #copy_hiera_data_to with the default host' do
         
     | 
| 
      
 1342 
     | 
    
         
            +
                  allow( subject ).to receive( :hosts ).and_return( hosts )
         
     | 
| 
      
 1343 
     | 
    
         
            +
                  expect( subject ).to receive( :copy_hiera_data_to ).with( master, path).once
         
     | 
| 
      
 1344 
     | 
    
         
            +
                  subject.copy_hiera_data( path )
         
     | 
| 
      
 1345 
     | 
    
         
            +
                end
         
     | 
| 
      
 1346 
     | 
    
         
            +
             
     | 
| 
      
 1347 
     | 
    
         
            +
              end
         
     | 
| 
      
 1348 
     | 
    
         
            +
             
     | 
| 
       1297 
1349 
     | 
    
         
             
            end
         
     | 
| 
         @@ -154,6 +154,13 @@ describe ClassMixedWithDSLInstallUtils do 
     | 
|
| 
       154 
154 
     | 
    
         
             
                  allow( subject ).to receive( :hosts ).and_return( hosts )
         
     | 
| 
       155 
155 
     | 
    
         
             
                  expect( subject.sorted_hosts ).to be === hosts
         
     | 
| 
       156 
156 
     | 
    
         
             
                end
         
     | 
| 
      
 157 
     | 
    
         
            +
             
     | 
| 
      
 158 
     | 
    
         
            +
                it 'does not allow nil entries' do
         
     | 
| 
      
 159 
     | 
    
         
            +
                  allow( subject ).to receive( :options ).and_return( { :masterless => true } )
         
     | 
| 
      
 160 
     | 
    
         
            +
                  masterless_host = [basic_hosts[0]]
         
     | 
| 
      
 161 
     | 
    
         
            +
                  allow( subject ).to receive( :hosts ).and_return( masterless_host )
         
     | 
| 
      
 162 
     | 
    
         
            +
                  expect( subject.sorted_hosts ).to be === masterless_host
         
     | 
| 
      
 163 
     | 
    
         
            +
                end
         
     | 
| 
       157 
164 
     | 
    
         
             
              end
         
     | 
| 
       158 
165 
     | 
    
         | 
| 
       159 
166 
     | 
    
         
             
              describe 'installer_cmd' do
         
     | 
| 
         @@ -372,7 +379,7 @@ describe ClassMixedWithDSLInstallUtils do 
     | 
|
| 
       372 
379 
     | 
    
         
             
                  expect( subject ).to receive( :on ).with( hosts[2], /puppet config set certname/ ).once
         
     | 
| 
       373 
380 
     | 
    
         
             
                  expect( subject ).to receive( :on ).with( hosts[3], /puppet config set certname/ ).once
         
     | 
| 
       374 
381 
     | 
    
         
             
                  expect( subject ).to receive( :on ).with( hosts[2], /puppet agent -t/, :acceptable_exit_codes => [1] ).once
         
     | 
| 
       375 
     | 
    
         
            -
                  expect( subject ).to receive( :on ).with( hosts[3], /puppet agent -t/, :acceptable_exit_codes => [1] ).once
         
     | 
| 
      
 382 
     | 
    
         
            +
                  expect( subject ).to receive( :on ).with( hosts[3], /puppet agent -t/, :acceptable_exit_codes => [0, 1] ).once
         
     | 
| 
       376 
383 
     | 
    
         
             
                  #sign certificate per-host
         
     | 
| 
       377 
384 
     | 
    
         
             
                  expect( subject ).to receive( :sign_certificate_for ).with( hosts[0] ).once
         
     | 
| 
       378 
385 
     | 
    
         
             
                  expect( subject ).to receive( :sign_certificate_for ).with( hosts[1] ).once
         
     | 
| 
         @@ -397,6 +404,30 @@ describe ClassMixedWithDSLInstallUtils do 
     | 
|
| 
       397 
404 
     | 
    
         
             
                  expect( subject ).to receive( :on ).with( hosts, /puppet agent/, :acceptable_exit_codes => [0,2] ).once
         
     | 
| 
       398 
405 
     | 
    
         
             
                  subject.do_install( hosts, opts )
         
     | 
| 
       399 
406 
     | 
    
         
             
                end
         
     | 
| 
      
 407 
     | 
    
         
            +
             
     | 
| 
      
 408 
     | 
    
         
            +
                it 'can perform a masterless installation' do
         
     | 
| 
      
 409 
     | 
    
         
            +
                  hosts = make_hosts({
         
     | 
| 
      
 410 
     | 
    
         
            +
                    :pe_ver => '3.0',
         
     | 
| 
      
 411 
     | 
    
         
            +
                    :roles => ['agent']
         
     | 
| 
      
 412 
     | 
    
         
            +
                  }, 1)
         
     | 
| 
      
 413 
     | 
    
         
            +
             
     | 
| 
      
 414 
     | 
    
         
            +
                  allow( subject ).to receive( :hosts ).and_return( hosts )
         
     | 
| 
      
 415 
     | 
    
         
            +
                  allow( subject ).to receive( :options ).and_return({ :masterless => true })
         
     | 
| 
      
 416 
     | 
    
         
            +
                  allow( subject ).to receive( :on ).and_return( Beaker::Result.new( {}, '' ) )
         
     | 
| 
      
 417 
     | 
    
         
            +
                  allow( subject ).to receive( :fetch_puppet ).and_return( true )
         
     | 
| 
      
 418 
     | 
    
         
            +
                  allow( subject ).to receive( :create_remote_file ).and_return( true )
         
     | 
| 
      
 419 
     | 
    
         
            +
                  allow( subject ).to receive( :stop_agent_on ).and_return( true )
         
     | 
| 
      
 420 
     | 
    
         
            +
                  allow( subject ).to receive( :version_is_less ).with(anything, '3.2.0').exactly(hosts.length + 1).times.and_return( false )
         
     | 
| 
      
 421 
     | 
    
         
            +
             
     | 
| 
      
 422 
     | 
    
         
            +
                  expect( subject ).to receive( :on ).with( hosts[0], /puppet-enterprise-installer/ ).once
         
     | 
| 
      
 423 
     | 
    
         
            +
                  expect( subject ).to receive( :create_remote_file ).with( hosts[0], /answers/, /q/ ).once
         
     | 
| 
      
 424 
     | 
    
         
            +
                  expect( subject ).to_not receive( :sign_certificate_for )
         
     | 
| 
      
 425 
     | 
    
         
            +
                  expect( subject ).to receive( :stop_agent_on ).with( hosts[0] ).once
         
     | 
| 
      
 426 
     | 
    
         
            +
                  expect( subject ).to_not receive( :sleep_until_puppetdb_started )
         
     | 
| 
      
 427 
     | 
    
         
            +
                  expect( subject ).to_not receive( :wait_for_host_in_dashboard )
         
     | 
| 
      
 428 
     | 
    
         
            +
                  expect( subject ).to_not receive( :on ).with( hosts[0], /puppet agent -t/, :acceptable_exit_codes => [0,2] )
         
     | 
| 
      
 429 
     | 
    
         
            +
                  subject.do_install( hosts, opts)
         
     | 
| 
      
 430 
     | 
    
         
            +
                end
         
     | 
| 
       400 
431 
     | 
    
         
             
              end
         
     | 
| 
       401 
432 
     | 
    
         | 
| 
       402 
433 
     | 
    
         
             
              describe 'do_higgs_install' do
         
     | 
| 
         @@ -812,6 +843,32 @@ describe ClassMixedWithDSLInstallUtils do 
     | 
|
| 
       812 
843 
     | 
    
         | 
| 
       813 
844 
     | 
    
         
             
              end
         
     | 
| 
       814 
845 
     | 
    
         | 
| 
      
 846 
     | 
    
         
            +
              describe '#install_packages_from_local_dev_repo' do
         
     | 
| 
      
 847 
     | 
    
         
            +
                let( :package_name ) { 'puppet-agent' }
         
     | 
| 
      
 848 
     | 
    
         
            +
                let( :platform ) { @platform || 'other' }
         
     | 
| 
      
 849 
     | 
    
         
            +
                let( :host ) do
         
     | 
| 
      
 850 
     | 
    
         
            +
                  FakeHost.create('fakvm', platform, opts)
         
     | 
| 
      
 851 
     | 
    
         
            +
                end
         
     | 
| 
      
 852 
     | 
    
         
            +
             
     | 
| 
      
 853 
     | 
    
         
            +
                it 'sets the find command correctly for el-based systems' do
         
     | 
| 
      
 854 
     | 
    
         
            +
                  @platform = 'el-1-3'
         
     | 
| 
      
 855 
     | 
    
         
            +
                  expect( subject ).to receive( :on ).with( host, /\*\.rpm.+rpm\s-ivh/ )
         
     | 
| 
      
 856 
     | 
    
         
            +
                  subject.install_packages_from_local_dev_repo( host, package_name )
         
     | 
| 
      
 857 
     | 
    
         
            +
                end
         
     | 
| 
      
 858 
     | 
    
         
            +
             
     | 
| 
      
 859 
     | 
    
         
            +
                it 'sets the find command correctly for debian-based systems' do
         
     | 
| 
      
 860 
     | 
    
         
            +
                  @platform = 'debian-1-3'
         
     | 
| 
      
 861 
     | 
    
         
            +
                  expect( subject ).to receive( :on ).with( host, /\*\.deb.+dpkg\s-i/ )
         
     | 
| 
      
 862 
     | 
    
         
            +
                  subject.install_packages_from_local_dev_repo( host, package_name )
         
     | 
| 
      
 863 
     | 
    
         
            +
                end
         
     | 
| 
      
 864 
     | 
    
         
            +
             
     | 
| 
      
 865 
     | 
    
         
            +
                it 'fails correctly for systems not accounted for' do
         
     | 
| 
      
 866 
     | 
    
         
            +
                  @platform = 'eos-1-3'
         
     | 
| 
      
 867 
     | 
    
         
            +
                  expect{ subject.install_packages_from_local_dev_repo( host, package_name ) }.to raise_error RuntimeError
         
     | 
| 
      
 868 
     | 
    
         
            +
                end
         
     | 
| 
      
 869 
     | 
    
         
            +
             
     | 
| 
      
 870 
     | 
    
         
            +
              end
         
     | 
| 
      
 871 
     | 
    
         
            +
             
     | 
| 
       815 
872 
     | 
    
         
             
              describe '#install_puppetagent_dev_repo' do
         
     | 
| 
       816 
873 
     | 
    
         | 
| 
       817 
874 
     | 
    
         
             
                it 'raises an exception when host platform is unsupported' do
         
     | 
| 
         @@ -9,6 +9,7 @@ end 
     | 
|
| 
       9 
9 
     | 
    
         
             
            describe ClassMixedWithDSLRoles do
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
11 
     | 
    
         
             
              let( :hosts )      { @hosts || Hash.new }
         
     | 
| 
      
 12 
     | 
    
         
            +
              let( :options )    { @options || Hash.new }
         
     | 
| 
       12 
13 
     | 
    
         
             
              let( :agent1 )     { make_host( 'agent1',     { :roles => [ 'agent' ] } ) }
         
     | 
| 
       13 
14 
     | 
    
         
             
              let( :agent2 )     { make_host( 'agent2',     { :roles => [ 'agent' ] } ) }
         
     | 
| 
       14 
15 
     | 
    
         
             
              let( :a_and_dash ) { make_host( 'a_and_dash', { :roles => [ 'agent', 'dashboard' ] } ) }
         
     | 
| 
         @@ -42,6 +43,12 @@ describe ClassMixedWithDSLRoles do 
     | 
|
| 
       42 
43 
     | 
    
         
             
                  expect( subject ).to receive( :hosts ).exactly( 1 ).times.and_return( hosts )
         
     | 
| 
       43 
44 
     | 
    
         
             
                  expect { subject.master }.to raise_error Beaker::DSL::FailTest
         
     | 
| 
       44 
45 
     | 
    
         
             
                end
         
     | 
| 
      
 46 
     | 
    
         
            +
                it 'returns nil if no master and masterless is set' do
         
     | 
| 
      
 47 
     | 
    
         
            +
                  @options = { :masterless => true }
         
     | 
| 
      
 48 
     | 
    
         
            +
                  expect( subject ).to receive( :hosts ).and_return( hosts )
         
     | 
| 
      
 49 
     | 
    
         
            +
                  expect( subject ).to receive( :options ).and_return( options )
         
     | 
| 
      
 50 
     | 
    
         
            +
                  expect( subject.master ).to be_nil
         
     | 
| 
      
 51 
     | 
    
         
            +
                end
         
     | 
| 
       45 
52 
     | 
    
         
             
              end
         
     | 
| 
       46 
53 
     | 
    
         
             
              describe '#dashboard' do
         
     | 
| 
       47 
54 
     | 
    
         
             
                it 'returns the dashboard if there is one' do
         
     | 
| 
         @@ -59,6 +66,12 @@ describe ClassMixedWithDSLRoles do 
     | 
|
| 
       59 
66 
     | 
    
         
             
                  expect( subject ).to receive( :hosts ).and_return( hosts )
         
     | 
| 
       60 
67 
     | 
    
         
             
                  expect { subject.dashboard }.to raise_error Beaker::DSL::FailTest
         
     | 
| 
       61 
68 
     | 
    
         
             
                end
         
     | 
| 
      
 69 
     | 
    
         
            +
                it 'returns nil if no dashboard and masterless is set' do
         
     | 
| 
      
 70 
     | 
    
         
            +
                  @options = { :masterless => true }
         
     | 
| 
      
 71 
     | 
    
         
            +
                  expect( subject ).to receive( :hosts ).and_return( hosts )
         
     | 
| 
      
 72 
     | 
    
         
            +
                  expect( subject ).to receive( :options ).and_return( options )
         
     | 
| 
      
 73 
     | 
    
         
            +
                  expect( subject.dashboard ).to be_nil
         
     | 
| 
      
 74 
     | 
    
         
            +
                end
         
     | 
| 
       62 
75 
     | 
    
         
             
              end
         
     | 
| 
       63 
76 
     | 
    
         
             
              describe '#database' do
         
     | 
| 
       64 
77 
     | 
    
         
             
                it 'returns the database if there is one' do
         
     | 
| 
         @@ -76,6 +89,12 @@ describe ClassMixedWithDSLRoles do 
     | 
|
| 
       76 
89 
     | 
    
         
             
                  expect( subject ).to receive( :hosts ).and_return( hosts )
         
     | 
| 
       77 
90 
     | 
    
         
             
                  expect { subject.database }.to raise_error Beaker::DSL::FailTest
         
     | 
| 
       78 
91 
     | 
    
         
             
                end
         
     | 
| 
      
 92 
     | 
    
         
            +
                it 'returns nil if no database and masterless is set' do
         
     | 
| 
      
 93 
     | 
    
         
            +
                  @options = { :masterless => true }
         
     | 
| 
      
 94 
     | 
    
         
            +
                  expect( subject ).to receive( :hosts ).and_return( hosts )
         
     | 
| 
      
 95 
     | 
    
         
            +
                  expect( subject ).to receive( :options ).and_return( options )
         
     | 
| 
      
 96 
     | 
    
         
            +
                  expect( subject.database ).to be_nil
         
     | 
| 
      
 97 
     | 
    
         
            +
                end
         
     | 
| 
       79 
98 
     | 
    
         
             
              end
         
     | 
| 
       80 
99 
     | 
    
         
             
              describe '#default' do
         
     | 
| 
       81 
100 
     | 
    
         
             
                it 'returns the default host when one is specified' do
         
     | 
| 
         @@ -86,12 +105,18 @@ describe ClassMixedWithDSLRoles do 
     | 
|
| 
       86 
105 
     | 
    
         
             
                it 'raises an error if there is more than one default' do
         
     | 
| 
       87 
106 
     | 
    
         
             
                  @hosts = [ db, monolith, default, default ]
         
     | 
| 
       88 
107 
     | 
    
         
             
                  expect( subject ).to receive( :hosts ).and_return( hosts )
         
     | 
| 
       89 
     | 
    
         
            -
                  expect { subject. 
     | 
| 
      
 108 
     | 
    
         
            +
                  expect { subject.default }.to raise_error Beaker::DSL::FailTest
         
     | 
| 
       90 
109 
     | 
    
         
             
                end
         
     | 
| 
       91 
110 
     | 
    
         
             
                it 'and raises an error if there is no default' do
         
     | 
| 
       92 
111 
     | 
    
         
             
                  @hosts = [ agent1, agent2, custom ]
         
     | 
| 
       93 
112 
     | 
    
         
             
                  expect( subject ).to receive( :hosts ).and_return( hosts )
         
     | 
| 
       94 
     | 
    
         
            -
                  expect { subject. 
     | 
| 
      
 113 
     | 
    
         
            +
                  expect { subject.default }.to raise_error Beaker::DSL::FailTest
         
     | 
| 
      
 114 
     | 
    
         
            +
                end
         
     | 
| 
      
 115 
     | 
    
         
            +
                it 'returns nil if no default and masterless is set' do
         
     | 
| 
      
 116 
     | 
    
         
            +
                  @options = { :masterless => true }
         
     | 
| 
      
 117 
     | 
    
         
            +
                  expect( subject ).to receive( :hosts ).and_return( hosts )
         
     | 
| 
      
 118 
     | 
    
         
            +
                  expect( subject ).to receive( :options ).and_return( options )
         
     | 
| 
      
 119 
     | 
    
         
            +
                  expect( subject.default ).to be_nil
         
     | 
| 
       95 
120 
     | 
    
         
             
                end
         
     | 
| 
       96 
121 
     | 
    
         
             
              end
         
     | 
| 
       97 
122 
     | 
    
         
             
              describe '#add_role_def' do
         
     | 
    
        data/spec/beaker/host_spec.rb
    CHANGED
    
    | 
         @@ -56,6 +56,24 @@ module Beaker 
     | 
|
| 
       56 
56 
     | 
    
         
             
                    expect(host.is_using_passenger?).to be_truthy
         
     | 
| 
       57 
57 
     | 
    
         
             
                    expect(host.graceful_restarts?).to be_truthy
         
     | 
| 
       58 
58 
     | 
    
         
             
                  end
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
                  it 'can be an AIO host' do
         
     | 
| 
      
 61 
     | 
    
         
            +
                    options['type'] = 'aio'
         
     | 
| 
      
 62 
     | 
    
         
            +
                    expect(host.is_pe?).to be_falsy
         
     | 
| 
      
 63 
     | 
    
         
            +
                    expect(host.use_service_scripts?).to be_falsy
         
     | 
| 
      
 64 
     | 
    
         
            +
                    expect(host.is_using_passenger?).to be_falsy
         
     | 
| 
      
 65 
     | 
    
         
            +
                  end
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
                  it 'sets the paths correctly for an AIO agent host' do
         
     | 
| 
      
 68 
     | 
    
         
            +
                    options['type'] = 'aio'
         
     | 
| 
      
 69 
     | 
    
         
            +
                    expect(host['puppetvardir']).to be === Unix::Host::aio_defaults[:puppetvardir]
         
     | 
| 
      
 70 
     | 
    
         
            +
                  end
         
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
                  it 'sets the paths correctly for an AIO non-agent host' do
         
     | 
| 
      
 73 
     | 
    
         
            +
                    options['type'] = 'aio'
         
     | 
| 
      
 74 
     | 
    
         
            +
                    options['roles'] = ['master']
         
     | 
| 
      
 75 
     | 
    
         
            +
                    expect(host['puppetvardir']).to be === Unix::Host::foss_defaults[:puppetvardir]
         
     | 
| 
      
 76 
     | 
    
         
            +
                  end
         
     | 
| 
       59 
77 
     | 
    
         
             
                end
         
     | 
| 
       60 
78 
     | 
    
         | 
| 
       61 
79 
     | 
    
         
             
                describe "uses_passenger!" do
         
     | 
| 
         @@ -79,6 +79,17 @@ EOF 
     | 
|
| 
       79 
79 
     | 
    
         
             
                  expect( vagrantfile ).to match(/(ssh.forward_agent = true)/)
         
     | 
| 
       80 
80 
     | 
    
         
             
                end
         
     | 
| 
       81 
81 
     | 
    
         | 
| 
      
 82 
     | 
    
         
            +
                it "can make a Vagrantfile with synced_folder disabled" do
         
     | 
| 
      
 83 
     | 
    
         
            +
                  path = vagrant.instance_variable_get( :@vagrant_path )
         
     | 
| 
      
 84 
     | 
    
         
            +
                  allow( vagrant ).to receive( :randmac ).and_return( "0123456789" )
         
     | 
| 
      
 85 
     | 
    
         
            +
             
     | 
| 
      
 86 
     | 
    
         
            +
                  hosts = make_hosts({:synced_folder => 'disabled'},1)
         
     | 
| 
      
 87 
     | 
    
         
            +
                  vagrant.make_vfile( hosts, options )
         
     | 
| 
      
 88 
     | 
    
         
            +
             
     | 
| 
      
 89 
     | 
    
         
            +
                  vagrantfile = File.read( File.expand_path( File.join( path, "Vagrantfile")))
         
     | 
| 
      
 90 
     | 
    
         
            +
                  expect( vagrantfile ).to match(/v.vm.synced_folder .* disabled: true/)
         
     | 
| 
      
 91 
     | 
    
         
            +
                end
         
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
       82 
93 
     | 
    
         
             
                it "generates a valid windows config" do
         
     | 
| 
       83 
94 
     | 
    
         
             
                  path = vagrant.instance_variable_get( :@vagrant_path )
         
     | 
| 
       84 
95 
     | 
    
         
             
                  allow( vagrant ).to receive( :randmac ).and_return( "0123456789" )
         
     | 
| 
         @@ -56,6 +56,26 @@ module Beaker 
     | 
|
| 
       56 
56 
     | 
    
         
             
                    end
         
     | 
| 
       57 
57 
     | 
    
         
             
                  end
         
     | 
| 
       58 
58 
     | 
    
         | 
| 
      
 59 
     | 
    
         
            +
                  context "find_at_most_one_host_with_role" do
         
     | 
| 
      
 60 
     | 
    
         
            +
                    it "can find the single master in a set of hosts" do
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
                      expect( host_handler.find_at_most_one_host_with_role( hosts, 'master' ) ).to be === hosts[1]
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
                    end
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                    it "throws an error when more than one host with matching role is found" do
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
                      expect{ host_handler.find_at_most_one_host_with_role( hosts, 'agent' ) }.to raise_error(ArgumentError)
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
                    end
         
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
                    it "returns nil when no host is found matching the role" do
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
                      expect( host_handler.find_at_most_one_host_with_role( hosts, 'surprise' ) ).to be_nil
         
     | 
| 
      
 75 
     | 
    
         
            +
             
     | 
| 
      
 76 
     | 
    
         
            +
                    end
         
     | 
| 
      
 77 
     | 
    
         
            +
                  end
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
       59 
79 
     | 
    
         
             
                  context "run_block_on" do
         
     | 
| 
       60 
80 
     | 
    
         
             
                    it "can execute a block against hosts identified by a string" do
         
     | 
| 
       61 
81 
     | 
    
         
             
                      myhosts = host_handler.run_block_on( hosts, role0 ) do |hosts|
         
     |