beaker 2.7.1 → 2.8.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 +121 -2
- data/lib/beaker/dsl.rb +2 -2
- data/lib/beaker/dsl/helpers.rb +13 -1429
- data/lib/beaker/dsl/helpers/facter_helpers.rb +48 -0
- data/lib/beaker/dsl/helpers/hiera_helpers.rb +71 -0
- data/lib/beaker/dsl/helpers/host_helpers.rb +506 -0
- data/lib/beaker/dsl/helpers/puppet_helpers.rb +698 -0
- data/lib/beaker/dsl/helpers/tk_helpers.rb +101 -0
- data/lib/beaker/dsl/helpers/web_helpers.rb +115 -0
- data/lib/beaker/dsl/install_utils.rb +8 -1570
- data/lib/beaker/dsl/install_utils/ezbake_utils.rb +256 -0
- data/lib/beaker/dsl/install_utils/module_utils.rb +237 -0
- data/lib/beaker/dsl/install_utils/pe_utils.rb +518 -0
- data/lib/beaker/dsl/install_utils/puppet_utils.rb +722 -0
- data/lib/beaker/dsl/outcomes.rb +0 -4
- data/lib/beaker/dsl/roles.rb +0 -3
- data/lib/beaker/dsl/structure.rb +127 -4
- data/lib/beaker/dsl/wrappers.rb +0 -4
- data/lib/beaker/host.rb +23 -0
- data/lib/beaker/host/unix/pkg.rb +4 -4
- data/lib/beaker/host_prebuilt_steps.rb +11 -5
- data/lib/beaker/hypervisor/vagrant.rb +1 -0
- data/lib/beaker/hypervisor/vmpooler.rb +38 -0
- data/lib/beaker/logger.rb +10 -4
- data/lib/beaker/network_manager.rb +5 -4
- data/lib/beaker/options/command_line_parser.rb +7 -0
- data/lib/beaker/shared.rb +2 -1
- data/lib/beaker/shared/semvar.rb +41 -0
- data/lib/beaker/test_suite.rb +20 -6
- data/lib/beaker/version.rb +1 -1
- data/spec/beaker/dsl/helpers/facter_helpers_spec.rb +59 -0
- data/spec/beaker/dsl/helpers/hiera_helpers_spec.rb +96 -0
- data/spec/beaker/dsl/helpers/host_helpers_spec.rb +413 -0
- data/spec/beaker/dsl/{helpers_spec.rb → helpers/puppet_helpers_spec.rb} +2 -611
- data/spec/beaker/dsl/helpers/tk_helpers_spec.rb +83 -0
- data/spec/beaker/dsl/helpers/web_helpers_spec.rb +60 -0
- data/spec/beaker/dsl/install_utils/module_utils_spec.rb +241 -0
- data/spec/beaker/dsl/install_utils/pe_utils_spec.rb +475 -0
- data/spec/beaker/dsl/install_utils/puppet_utils_spec.rb +523 -0
- data/spec/beaker/dsl/structure_spec.rb +108 -0
- data/spec/beaker/host_prebuilt_steps_spec.rb +44 -0
- data/spec/beaker/host_spec.rb +41 -0
- data/spec/beaker/hypervisor/vagrant_spec.rb +2 -1
- data/spec/beaker/logger_spec.rb +9 -2
- data/spec/beaker/network_manager_spec.rb +7 -1
- data/spec/beaker/options/command_line_parser_spec.rb +3 -2
- data/spec/beaker/shared/semvar_spec.rb +36 -0
- data/spec/beaker/test_suite_spec.rb +48 -0
- data/spec/mocks.rb +10 -0
- metadata +23 -5
- data/lib/beaker/dsl/ezbake_utils.rb +0 -259
- data/spec/beaker/dsl/install_utils_spec.rb +0 -1242
    
        data/lib/beaker/dsl/outcomes.rb
    CHANGED
    
    | @@ -37,7 +37,6 @@ module Beaker | |
| 37 37 | 
             
                  #
         | 
| 38 38 | 
             
                  # @param [String] msg An optional message to log
         | 
| 39 39 | 
             
                  # @raise [FailTest]
         | 
| 40 | 
            -
                  # @api dsl
         | 
| 41 40 | 
             
                  def fail_test msg = nil
         | 
| 42 41 | 
             
                    message = formatted_message( msg, 'Failed' )
         | 
| 43 42 | 
             
                    logger.warn( [message, logger.pretty_backtrace].join("\n") )
         | 
| @@ -49,7 +48,6 @@ module Beaker | |
| 49 48 | 
             
                  #
         | 
| 50 49 | 
             
                  # @param [String] msg An optional message to log
         | 
| 51 50 | 
             
                  # @raise [PassTest]
         | 
| 52 | 
            -
                  # @api dsl
         | 
| 53 51 | 
             
                  def pass_test msg = nil
         | 
| 54 52 | 
             
                    message = formatted_message( msg, 'Passed' )
         | 
| 55 53 | 
             
                    logger.notify( message )
         | 
| @@ -61,7 +59,6 @@ module Beaker | |
| 61 59 | 
             
                  #
         | 
| 62 60 | 
             
                  # @param [String] msg An optional message to log
         | 
| 63 61 | 
             
                  # @raise [PendingTest]
         | 
| 64 | 
            -
                  # @api dsl
         | 
| 65 62 | 
             
                  def pending_test msg = nil
         | 
| 66 63 | 
             
                    message = formatted_message( msg, 'is Pending' )
         | 
| 67 64 | 
             
                    logger.warn( message )
         | 
| @@ -73,7 +70,6 @@ module Beaker | |
| 73 70 | 
             
                  #
         | 
| 74 71 | 
             
                  # @param [String] msg An optional message to log
         | 
| 75 72 | 
             
                  # @raise [SkipTest]
         | 
| 76 | 
            -
                  # @api dsl
         | 
| 77 73 | 
             
                  def skip_test msg = nil
         | 
| 78 74 | 
             
                    message = formatted_message( msg, 'was Skipped' )
         | 
| 79 75 | 
             
                    logger.notify( message )
         | 
    
        data/lib/beaker/dsl/roles.rb
    CHANGED
    
    | @@ -13,7 +13,6 @@ module Beaker | |
| 13 13 | 
             
                # Also the constant {FailTest} needs to be defined it will be raised
         | 
| 14 14 | 
             
                # in error conditions
         | 
| 15 15 | 
             
                #
         | 
| 16 | 
            -
                # @api dsl
         | 
| 17 16 | 
             
                module Roles
         | 
| 18 17 |  | 
| 19 18 | 
             
                  # The hosts for which ['roles'] include 'agent'
         | 
| @@ -127,7 +126,6 @@ module Beaker | |
| 127 126 | 
             
                  #   puts "master is defined"
         | 
| 128 127 | 
             
                  # end
         | 
| 129 128 | 
             
                  #
         | 
| 130 | 
            -
                  # @api public
         | 
| 131 129 | 
             
                  def any_hosts_as?(role)
         | 
| 132 130 | 
             
                    hosts_as(role).length > 0
         | 
| 133 131 | 
             
                  end
         | 
| @@ -144,7 +142,6 @@ module Beaker | |
| 144 142 | 
             
                  #       on yak, 'shave'
         | 
| 145 143 | 
             
                  #     end
         | 
| 146 144 | 
             
                  #
         | 
| 147 | 
            -
                  # @api public
         | 
| 148 145 | 
             
                  def hosts_as(desired_role = nil)
         | 
| 149 146 | 
             
                    hosts_with_role(hosts, desired_role)
         | 
| 150 147 | 
             
                  end
         | 
    
        data/lib/beaker/dsl/structure.rb
    CHANGED
    
    | @@ -35,7 +35,6 @@ module Beaker | |
| 35 35 | 
             
                  # Provides a method to help structure tests into coherent steps.
         | 
| 36 36 | 
             
                  # @param [String] step_name The name of the step to be logged.
         | 
| 37 37 | 
             
                  # @param [Proc] block The actions to be performed in this step.
         | 
| 38 | 
            -
                  # @api dsl
         | 
| 39 38 | 
             
                  def step step_name, &block
         | 
| 40 39 | 
             
                    logger.notify "\n  * #{step_name}\n"
         | 
| 41 40 | 
             
                    yield if block_given?
         | 
| @@ -46,7 +45,6 @@ module Beaker | |
| 46 45 | 
             
                  # @param [String] my_name The name of the test to be logged.
         | 
| 47 46 | 
             
                  # @param [Proc] block The actions to be performed during this test.
         | 
| 48 47 | 
             
                  #
         | 
| 49 | 
            -
                  # @api dsl
         | 
| 50 48 | 
             
                  def test_name my_name, &block
         | 
| 51 49 | 
             
                    logger.notify "\n#{my_name}\n"
         | 
| 52 50 | 
             
                    yield if block_given?
         | 
| @@ -61,7 +59,6 @@ module Beaker | |
| 61 59 | 
             
                  #     on(master, puppet_resource('file', '/etc/puppet/modules',
         | 
| 62 60 | 
             
                  #       'ensure=absent', 'purge=true'))
         | 
| 63 61 | 
             
                  #   end
         | 
| 64 | 
            -
                  # @api dsl
         | 
| 65 62 | 
             
                  def teardown &block
         | 
| 66 63 | 
             
                    @teardown_procs << block
         | 
| 67 64 | 
             
                  end
         | 
| @@ -105,7 +102,6 @@ module Beaker | |
| 105 102 | 
             
                  #                       a {Beaker::Assertions} (i.e., if the assert
         | 
| 106 103 | 
             
                  #                       passes)
         | 
| 107 104 | 
             
                  # @author Chris Cowell-Shah (<tt>ccs@puppetlabs.com</tt>)
         | 
| 108 | 
            -
                  # @api dsl
         | 
| 109 105 | 
             
                  def expect_failure(explanation, &block)
         | 
| 110 106 | 
             
                    begin
         | 
| 111 107 | 
             
                      yield if block_given?  # code block should contain an assert that you expect to fail
         | 
| @@ -125,6 +121,133 @@ module Beaker | |
| 125 121 | 
             
                             '"expect_failure()" needs to be removed from this test. ' +
         | 
| 126 122 | 
             
                             "Additional info: '#{explanation}'")
         | 
| 127 123 | 
             
                  end
         | 
| 124 | 
            +
             | 
| 125 | 
            +
                  # Limit the hosts a test case is run against
         | 
| 126 | 
            +
                  # @note This will modify the {Beaker::TestCase#hosts} member
         | 
| 127 | 
            +
                  #   in place unless an array of hosts is passed into it and
         | 
| 128 | 
            +
                  #   {Beaker::TestCase#logger} yielding an object that responds
         | 
| 129 | 
            +
                  #   like {Beaker::Logger#warn}, as well as
         | 
| 130 | 
            +
                  #   {Beaker::DSL::Outcomes#skip_test}, and optionally
         | 
| 131 | 
            +
                  #   {Beaker::TestCase#hosts}.
         | 
| 132 | 
            +
                  #
         | 
| 133 | 
            +
                  # @param [Symbol] type The type of confinement to do. Valid parameters
         | 
| 134 | 
            +
                  #                      are *:to* to confine the hosts to only those that
         | 
| 135 | 
            +
                  #                      match *criteria* or *:except* to confine the test
         | 
| 136 | 
            +
                  #                      case to only those hosts that do not match
         | 
| 137 | 
            +
                  #                      criteria.
         | 
| 138 | 
            +
                  # @param [Hash{Symbol,String=>String,Regexp,Array<String,Regexp>}]
         | 
| 139 | 
            +
                  #   criteria Specify the criteria with which a host should be
         | 
| 140 | 
            +
                  #   considered for inclusion or exclusion.  The key is any attribute
         | 
| 141 | 
            +
                  #   of the host that will be yielded by {Beaker::Host#[]}.
         | 
| 142 | 
            +
                  #   The value can be any string/regex or array of strings/regexp.
         | 
| 143 | 
            +
                  #   The values are compared using [Enumerable#any?] so that if one
         | 
| 144 | 
            +
                  #   value of an array matches the host is considered a match for that
         | 
| 145 | 
            +
                  #   criteria.
         | 
| 146 | 
            +
                  # @param [Array<Host>] host_array This creatively named parameter is
         | 
| 147 | 
            +
                  #   an optional array of hosts to confine to.  If not passed in, this
         | 
| 148 | 
            +
                  #   method will modify {Beaker::TestCase#hosts} in place.
         | 
| 149 | 
            +
                  # @param [Proc] block Addition checks to determine suitability of hosts
         | 
| 150 | 
            +
                  #   for confinement.  Each host that is still valid after checking
         | 
| 151 | 
            +
                  #   *criteria* is then passed in turn into this block.  The block
         | 
| 152 | 
            +
                  #   should return true if the host matches this additional criteria.
         | 
| 153 | 
            +
                  #
         | 
| 154 | 
            +
                  # @example Basic usage to confine to debian OSes.
         | 
| 155 | 
            +
                  #     confine :to, :platform => 'debian'
         | 
| 156 | 
            +
                  #
         | 
| 157 | 
            +
                  # @example Confining to anything but Windows and Solaris
         | 
| 158 | 
            +
                  #     confine :except, :platform => ['windows', 'solaris']
         | 
| 159 | 
            +
                  #
         | 
| 160 | 
            +
                  # @example Using additional block to confine to Solaris global zone.
         | 
| 161 | 
            +
                  #     confine :to, :platform => 'solaris' do |solaris|
         | 
| 162 | 
            +
                  #       on( solaris, 'zonename' ) =~ /global/
         | 
| 163 | 
            +
                  #     end
         | 
| 164 | 
            +
                  #
         | 
| 165 | 
            +
                  # @return [Array<Host>] Returns an array of hosts that are still valid
         | 
| 166 | 
            +
                  #   targets for this tests case.
         | 
| 167 | 
            +
                  # @raise [SkipTest] Raises skip test if there are no valid hosts for
         | 
| 168 | 
            +
                  #   this test case after confinement.
         | 
| 169 | 
            +
                  def confine(type, criteria, host_array = nil, &block)
         | 
| 170 | 
            +
                    hosts_to_modify = host_array || hosts
         | 
| 171 | 
            +
                    case type
         | 
| 172 | 
            +
                    when :except
         | 
| 173 | 
            +
                      hosts_to_modify = hosts_to_modify - select_hosts(criteria, hosts_to_modify, &block)
         | 
| 174 | 
            +
                    when :to
         | 
| 175 | 
            +
                      hosts_to_modify = select_hosts(criteria, hosts_to_modify, &block)
         | 
| 176 | 
            +
                    else
         | 
| 177 | 
            +
                      raise "Unknown option #{type}"
         | 
| 178 | 
            +
                    end
         | 
| 179 | 
            +
                    if hosts_to_modify.empty?
         | 
| 180 | 
            +
                      logger.warn "No suitable hosts with: #{criteria.inspect}"
         | 
| 181 | 
            +
                      skip_test 'No suitable hosts found'
         | 
| 182 | 
            +
                    end
         | 
| 183 | 
            +
                    self.hosts = hosts_to_modify
         | 
| 184 | 
            +
                    hosts_to_modify
         | 
| 185 | 
            +
                  end
         | 
| 186 | 
            +
             | 
| 187 | 
            +
                  # Ensures that host restrictions as specifid by type, criteria and
         | 
| 188 | 
            +
                  # host_array are confined to activity within the passed block.
         | 
| 189 | 
            +
                  # TestCase#hosts is reset after block has executed.
         | 
| 190 | 
            +
                  #
         | 
| 191 | 
            +
                  # @see #confine
         | 
| 192 | 
            +
                  def confine_block(type, criteria, host_array = nil, &block)
         | 
| 193 | 
            +
                    begin
         | 
| 194 | 
            +
                      original_hosts = self.hosts.dup
         | 
| 195 | 
            +
                      confine(type, criteria, host_array)
         | 
| 196 | 
            +
             | 
| 197 | 
            +
                      yield
         | 
| 198 | 
            +
             | 
| 199 | 
            +
                    ensure
         | 
| 200 | 
            +
                      self.hosts = original_hosts
         | 
| 201 | 
            +
                    end
         | 
| 202 | 
            +
                  end
         | 
| 203 | 
            +
             | 
| 204 | 
            +
                  #Return a set of hosts that meet the given criteria
         | 
| 205 | 
            +
                  # @param [Hash{Symbol,String=>String,Regexp,Array<String,Regexp>}]
         | 
| 206 | 
            +
                  #   criteria Specify the criteria with which a host should be
         | 
| 207 | 
            +
                  #   considered for inclusion.  The key is any attribute
         | 
| 208 | 
            +
                  #   of the host that will be yielded by {Beaker::Host#[]}.
         | 
| 209 | 
            +
                  #   The value can be any string/regex or array of strings/regexp.
         | 
| 210 | 
            +
                  #   The values are compared using [Enumerable#any?] so that if one
         | 
| 211 | 
            +
                  #   value of an array matches the host is considered a match for that
         | 
| 212 | 
            +
                  #   criteria.
         | 
| 213 | 
            +
                  # @param [Array<Host>] host_array This creatively named parameter is
         | 
| 214 | 
            +
                  #   an optional array of hosts to confine to.  If not passed in, this
         | 
| 215 | 
            +
                  #   method will modify {Beaker::TestCase#hosts} in place.
         | 
| 216 | 
            +
                  # @param [Proc] block Addition checks to determine suitability of hosts
         | 
| 217 | 
            +
                  #   for selection.  Each host that is still valid after checking
         | 
| 218 | 
            +
                  #   *criteria* is then passed in turn into this block.  The block
         | 
| 219 | 
            +
                  #   should return true if the host matches this additional criteria.
         | 
| 220 | 
            +
                  #
         | 
| 221 | 
            +
                  # @return [Array<Host>] Returns an array of hosts that meet the provided criteria
         | 
| 222 | 
            +
                  def select_hosts(criteria, host_array = nil, &block)
         | 
| 223 | 
            +
                    hosts_to_select_from = host_array || hosts
         | 
| 224 | 
            +
                    criteria.each_pair do |property, value|
         | 
| 225 | 
            +
                      hosts_to_select_from = hosts_to_select_from.select do |host|
         | 
| 226 | 
            +
                        inspect_host host, property, value
         | 
| 227 | 
            +
                      end
         | 
| 228 | 
            +
                    end
         | 
| 229 | 
            +
                    if block_given?
         | 
| 230 | 
            +
                      hosts_to_select_from = hosts_to_select_from.select do |host|
         | 
| 231 | 
            +
                        yield host
         | 
| 232 | 
            +
                      end
         | 
| 233 | 
            +
                    end
         | 
| 234 | 
            +
                    hosts_to_select_from
         | 
| 235 | 
            +
                  end
         | 
| 236 | 
            +
             | 
| 237 | 
            +
                  # @!visibility private
         | 
| 238 | 
            +
                  def inspect_host(host, property, one_or_more_values)
         | 
| 239 | 
            +
                    values = Array(one_or_more_values)
         | 
| 240 | 
            +
                    return values.any? do |value|
         | 
| 241 | 
            +
                      true_false = false
         | 
| 242 | 
            +
                      case value
         | 
| 243 | 
            +
                      when String
         | 
| 244 | 
            +
                        true_false = host[property.to_s].include? value
         | 
| 245 | 
            +
                      when Regexp
         | 
| 246 | 
            +
                        true_false = host[property.to_s] =~ value
         | 
| 247 | 
            +
                      end
         | 
| 248 | 
            +
                      true_false
         | 
| 249 | 
            +
                    end
         | 
| 250 | 
            +
                  end
         | 
| 128 251 | 
             
                end
         | 
| 129 252 | 
             
              end
         | 
| 130 253 | 
             
            end
         | 
    
        data/lib/beaker/dsl/wrappers.rb
    CHANGED
    
    | @@ -12,7 +12,6 @@ module Beaker | |
| 12 12 | 
             
                  # work to disentangle all of the things that are being passed into
         | 
| 13 13 | 
             
                  # this catchall param.
         | 
| 14 14 | 
             
                  #
         | 
| 15 | 
            -
                  # @api dsl
         | 
| 16 15 | 
             
                  def facter(*args)
         | 
| 17 16 | 
             
                    options = args.last.is_a?(Hash) ? args.pop : {}
         | 
| 18 17 | 
             
                    options['ENV'] ||= {}
         | 
| @@ -24,7 +23,6 @@ module Beaker | |
| 24 23 | 
             
                  # work to disentangle all of the things that are being passed into
         | 
| 25 24 | 
             
                  # this catchall param.
         | 
| 26 25 | 
             
                  #
         | 
| 27 | 
            -
                  # @api dsl
         | 
| 28 26 | 
             
                  def cfacter(*args)
         | 
| 29 27 | 
             
                    options = args.last.is_a?(Hash) ? args.pop : {}
         | 
| 30 28 | 
             
                    options['ENV'] ||= {}
         | 
| @@ -36,7 +34,6 @@ module Beaker | |
| 36 34 | 
             
                  # work to disentangle all of the things that are being passed into
         | 
| 37 35 | 
             
                  # this catchall param.
         | 
| 38 36 | 
             
                  #
         | 
| 39 | 
            -
                  # @api dsl
         | 
| 40 37 | 
             
                  def hiera(*args)
         | 
| 41 38 | 
             
                    options = args.last.is_a?(Hash) ? args.pop : {}
         | 
| 42 39 | 
             
                    options['ENV'] ||= {}
         | 
| @@ -57,7 +54,6 @@ module Beaker | |
| 57 54 | 
             
                  # work to disentangle all of the things that are being passed into
         | 
| 58 55 | 
             
                  # this catchall param.
         | 
| 59 56 | 
             
                  #
         | 
| 60 | 
            -
                  # @api dsl
         | 
| 61 57 | 
             
                  def puppet(*args)
         | 
| 62 58 | 
             
                    options = args.last.is_a?(Hash) ? args.pop : {}
         | 
| 63 59 | 
             
                    options['ENV'] ||= {}
         | 
    
        data/lib/beaker/host.rb
    CHANGED
    
    | @@ -59,6 +59,26 @@ module Beaker | |
| 59 59 | 
             
                  pkg_initialize
         | 
| 60 60 | 
             
                end
         | 
| 61 61 |  | 
| 62 | 
            +
                # Builds a deprecated keys array, for checking to see if a key is deprecated.
         | 
| 63 | 
            +
                # The recommended check after using this method is +result.include?(key)+
         | 
| 64 | 
            +
                #
         | 
| 65 | 
            +
                # @note an unsupported host type (meaning it has no _aio_defaults_) will return
         | 
| 66 | 
            +
                #   an empty hash
         | 
| 67 | 
            +
                #
         | 
| 68 | 
            +
                # @return [Array<Symbol>] An array of keys that are deprecated for a host
         | 
| 69 | 
            +
                def build_deprecated_keys()
         | 
| 70 | 
            +
                  begin
         | 
| 71 | 
            +
                    deprecated_keys_hash = self.class.send "foss_defaults".to_sym
         | 
| 72 | 
            +
                    delete_exceptions_hash = self.class.send "aio_defaults".to_sym
         | 
| 73 | 
            +
                    deprecated_keys_hash.delete_if do |key, value|
         | 
| 74 | 
            +
                      delete_exceptions_hash.has_key?(key)
         | 
| 75 | 
            +
                    end
         | 
| 76 | 
            +
                  rescue NoMethodError
         | 
| 77 | 
            +
                    deprecated_keys_hash = {}
         | 
| 78 | 
            +
                  end
         | 
| 79 | 
            +
                  deprecated_keys_hash.keys()
         | 
| 80 | 
            +
                end
         | 
| 81 | 
            +
             | 
| 62 82 | 
             
                def pkg_initialize
         | 
| 63 83 | 
             
                  # This method should be overridden by platform-specific code to
         | 
| 64 84 | 
             
                  # handle whatever packaging-related initialization is necessary.
         | 
| @@ -114,6 +134,9 @@ module Beaker | |
| 114 134 | 
             
                end
         | 
| 115 135 |  | 
| 116 136 | 
             
                def [] k
         | 
| 137 | 
            +
                  @deprecated_keys ||= build_deprecated_keys()
         | 
| 138 | 
            +
                  deprecation_message = "deprecated host key '#{k}'. Perhaps you can use host.puppet[] to get what you're looking for."
         | 
| 139 | 
            +
                  @logger.warn( deprecation_message ) if @logger && @deprecated_keys.include?(k.to_sym)
         | 
| 117 140 | 
             
                  @defaults[k]
         | 
| 118 141 | 
             
                end
         | 
| 119 142 |  | 
    
        data/lib/beaker/host/unix/pkg.rb
    CHANGED
    
    | @@ -138,7 +138,7 @@ module Unix::Pkg | |
| 138 138 | 
             
              #       DEBIAN_PLATFORM_CODENAMES map must be kept up-to-date as
         | 
| 139 139 | 
             
              #       support for new versions is added.
         | 
| 140 140 | 
             
              #
         | 
| 141 | 
            -
              # @note See {Beaker::DSL::Helpers#deploy_package_repo} for info on
         | 
| 141 | 
            +
              # @note See {Beaker::DSL::Helpers::HostHelpers#deploy_package_repo} for info on
         | 
| 142 142 | 
             
              #       params
         | 
| 143 143 | 
             
              def deploy_apt_repo(path, name, version)
         | 
| 144 144 | 
             
                codename = DEBIAN_PLATFORM_CODENAMES[self['platform']]
         | 
| @@ -154,7 +154,7 @@ module Unix::Pkg | |
| 154 154 |  | 
| 155 155 | 
             
              # Deploy yum configuration generated by the packaging tooling
         | 
| 156 156 | 
             
              #
         | 
| 157 | 
            -
              # @note See {Beaker::DSL::Helpers#deploy_package_repo} for info on
         | 
| 157 | 
            +
              # @note See {Beaker::DSL::Helpers::HostHelpers#deploy_package_repo} for info on
         | 
| 158 158 | 
             
              #       params
         | 
| 159 159 | 
             
              def deploy_yum_repo(path, name, version)
         | 
| 160 160 | 
             
                repo_file = "#{path}/rpm/pl-#{name}-#{version}-repos-pe-#{self['platform']}.repo"
         | 
| @@ -163,7 +163,7 @@ module Unix::Pkg | |
| 163 163 |  | 
| 164 164 | 
             
              # Deploy zypper repo configuration generated by the packaging tooling
         | 
| 165 165 | 
             
              #
         | 
| 166 | 
            -
              # @note See {Beaker::DSL::Helpers#deploy_package_repo} for info on
         | 
| 166 | 
            +
              # @note See {Beaker::DSL::Helpers::HostHelpers#deploy_package_repo} for info on
         | 
| 167 167 | 
             
              #       params
         | 
| 168 168 | 
             
              def deploy_zyp_repo(path, name, version)
         | 
| 169 169 | 
             
                repo_file = "#{path}/rpm/pl-#{name}-#{version}-repos-pe-#{self['platform']}.repo"
         | 
| @@ -178,7 +178,7 @@ module Unix::Pkg | |
| 178 178 | 
             
              # This method calls one of #deploy_apt_repo, #deploy_yum_repo, or
         | 
| 179 179 | 
             
              # #deploy_zyp_repo depending on the platform of this Host.
         | 
| 180 180 | 
             
              #
         | 
| 181 | 
            -
              # @note See {Beaker::DSL::Helpers#deploy_package_repo} for info on
         | 
| 181 | 
            +
              # @note See {Beaker::DSL::Helpers::HostHelpers#deploy_package_repo} for info on
         | 
| 182 182 | 
             
              #       params
         | 
| 183 183 | 
             
              def deploy_package_repo(path, name, version)
         | 
| 184 184 | 
             
                if not File.exists? path
         | 
| @@ -339,12 +339,13 @@ module Beaker | |
| 339 339 | 
             
                  logger = opts[:logger]
         | 
| 340 340 | 
             
                  block_on host do |host|
         | 
| 341 341 | 
             
                    logger.debug "Update /etc/ssh/sshd_config to allow root login"
         | 
| 342 | 
            -
                    # note: this sed command only works on gnu sed
         | 
| 343 342 | 
             
                    if host['platform'] =~ /osx/
         | 
| 344 343 | 
             
                      host.exec(Command.new("sudo sed -i '' 's/#PermitRootLogin no/PermitRootLogin Yes/g' /etc/sshd_config"))
         | 
| 345 344 | 
             
                      host.exec(Command.new("sudo sed -i '' 's/#PermitRootLogin yes/PermitRootLogin Yes/g' /etc/sshd_config"))
         | 
| 346 | 
            -
                     | 
| 345 | 
            +
                    elsif host.is_cygwin?
         | 
| 347 346 | 
             
                      host.exec(Command.new("sudo su -c \"sed -ri 's/^#?PermitRootLogin no|^#?PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config\""), {:pty => true})
         | 
| 347 | 
            +
                    else
         | 
| 348 | 
            +
                      logger.warn("Attempting to enable root login non-supported platform: #{host.name}: #{host['platform']}")
         | 
| 348 349 | 
             
                    end
         | 
| 349 350 | 
             
                    #restart sshd
         | 
| 350 351 | 
             
                    if host['platform'] =~ /debian|ubuntu|cumulus/
         | 
| @@ -352,7 +353,7 @@ module Beaker | |
| 352 353 | 
             
                    elsif host['platform'] =~ /centos|el-|redhat|fedora|eos/
         | 
| 353 354 | 
             
                      host.exec(Command.new("sudo -E /sbin/service sshd reload"), {:pty => true})
         | 
| 354 355 | 
             
                    else
         | 
| 355 | 
            -
                       | 
| 356 | 
            +
                      logger.warn("Attempting to update ssh on non-supported platform: #{host.name}: #{host['platform']}")
         | 
| 356 357 | 
             
                    end
         | 
| 357 358 | 
             
                  end
         | 
| 358 359 | 
             
                end
         | 
| @@ -487,8 +488,13 @@ module Beaker | |
| 487 488 | 
             
                    when /windows/
         | 
| 488 489 | 
             
                      if host.is_cygwin?
         | 
| 489 490 | 
             
                        host.exec(Command.new("echo '\nPermitUserEnvironment yes' >> /etc/sshd_config"))
         | 
| 490 | 
            -
                         | 
| 491 | 
            -
                         | 
| 491 | 
            +
                        # we get periodic failures to restart the service, so looping these with re-attempts
         | 
| 492 | 
            +
                        repeat_fibonacci_style_for(5) do
         | 
| 493 | 
            +
                          0 == host.exec(Command.new("cygrunsrv -E sshd"), :acceptable_exit_codes => [0, 1] ).exit_code
         | 
| 494 | 
            +
                        end
         | 
| 495 | 
            +
                        repeat_fibonacci_style_for(5) do
         | 
| 496 | 
            +
                          0 == host.exec(Command.new("cygrunsrv -S sshd"), :acceptable_exit_codes => [0, 1] ).exit_code
         | 
| 497 | 
            +
                        end
         | 
| 492 498 | 
             
                        env['CYGWIN'] = 'nodosfilewarning'
         | 
| 493 499 | 
             
                      else
         | 
| 494 500 | 
             
                        #nothing to do here
         | 
| @@ -23,6 +23,7 @@ module Beaker | |
| 23 23 | 
             
                  #generate the VagrantFile
         | 
| 24 24 | 
             
                  v_file = "Vagrant.configure(\"2\") do |c|\n"
         | 
| 25 25 | 
             
                  v_file << "  c.ssh.forward_agent = true\n" if options[:forward_ssh_agent] == true
         | 
| 26 | 
            +
                  v_file << "  c.ssh.insert_key = false\n"
         | 
| 26 27 | 
             
                  hosts.each do |host|
         | 
| 27 28 | 
             
                    host['ip'] ||= randip #use the existing ip, otherwise default to a random ip
         | 
| 28 29 | 
             
                    v_file << "  c.vm.define '#{host.name}' do |v|\n"
         | 
| @@ -106,6 +106,44 @@ module Beaker | |
| 106 106 | 
             
                  end
         | 
| 107 107 |  | 
| 108 108 | 
             
                  @logger.notify 'Spent %.2f seconds grabbing VMs' % (Time.now - start)
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                  start = Time.now
         | 
| 111 | 
            +
                  @logger.notify 'Tagging vmpooler VMs'
         | 
| 112 | 
            +
             | 
| 113 | 
            +
                  tags = {
         | 
| 114 | 
            +
                    'jenkins_build_url' => @options[:jenkins_build_url],
         | 
| 115 | 
            +
                    'department' => @options[:department],
         | 
| 116 | 
            +
                    'project' => @options[:project],
         | 
| 117 | 
            +
                    'created_by' => @options[:created_by]
         | 
| 118 | 
            +
                  }
         | 
| 119 | 
            +
             | 
| 120 | 
            +
                  @hosts.each_with_index do |h, i|
         | 
| 121 | 
            +
                    begin
         | 
| 122 | 
            +
                      uri = URI.parse(@options[:pooling_api] + '/vm/' + h['vmhostname'].split('.')[0])
         | 
| 123 | 
            +
             | 
| 124 | 
            +
                      http = Net::HTTP.new(uri.host, uri.port)
         | 
| 125 | 
            +
                      request = Net::HTTP::Put.new(uri.request_uri)
         | 
| 126 | 
            +
             | 
| 127 | 
            +
                      request.body = { 'tags' => tags }.to_json
         | 
| 128 | 
            +
             | 
| 129 | 
            +
                      response = http.request(request)
         | 
| 130 | 
            +
                    rescue RuntimeError, Error::EINVAL, Errno::ECONNRESET, EOFError,
         | 
| 131 | 
            +
                           Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, *SSH_EXCEPTIONS => e
         | 
| 132 | 
            +
                      @logger.notify "Failed to connect to vmpooler for tagging!"
         | 
| 133 | 
            +
                    end
         | 
| 134 | 
            +
             | 
| 135 | 
            +
                    begin
         | 
| 136 | 
            +
                      parsed_response = JSON.parse(response.body)
         | 
| 137 | 
            +
             | 
| 138 | 
            +
                      unless parsed_response['ok']
         | 
| 139 | 
            +
                        @logger.notify "Failed to tag host '#{h['vmhostname']}'!"
         | 
| 140 | 
            +
                      end
         | 
| 141 | 
            +
                    rescue JSON::ParserError => e
         | 
| 142 | 
            +
                        @logger.notify "Failed to tag host '#{h['vmhostname']}'! (failed with #{e.class})"
         | 
| 143 | 
            +
                    end
         | 
| 144 | 
            +
                  end
         | 
| 145 | 
            +
             | 
| 146 | 
            +
                  @logger.notify 'Spent %.2f seconds tagging VMs' % (Time.now - start)
         | 
| 109 147 | 
             
                end
         | 
| 110 148 |  | 
| 111 149 | 
             
                def cleanup
         | 
    
        data/lib/beaker/logger.rb
    CHANGED
    
    | @@ -302,12 +302,18 @@ module Beaker | |
| 302 302 |  | 
| 303 303 | 
             
                # Utility method to centralize dated log folder generation
         | 
| 304 304 | 
             
                #
         | 
| 305 | 
            -
                # @param [String] base_dir  | 
| 306 | 
            -
                # @param [ | 
| 305 | 
            +
                # @param [String] base_dir Path of the directory for the dated log folder to live in
         | 
| 306 | 
            +
                # @param [String] log_prefix Prefix to use for the log files
         | 
| 307 | 
            +
                # @param [Time] timestamp Timestamp that should be used to generate the dated log folder
         | 
| 308 | 
            +
                #
         | 
| 309 | 
            +
                # @example base_dir = 'junit', log_prefix = 'pants', timestamp = '2015-03-04 10:35:37 -0800'
         | 
| 310 | 
            +
                #   returns 'junit/pants/2015-03-04_10_35_37'
         | 
| 311 | 
            +
                #
         | 
| 312 | 
            +
                # @note since this uses 'mkdir -p', log_prefix can be a number of nested directories
         | 
| 307 313 | 
             
                #
         | 
| 308 314 | 
             
                # @return [String] the path of the dated log folder generated
         | 
| 309 | 
            -
                def Logger.generate_dated_log_folder(base_dir, timestamp)
         | 
| 310 | 
            -
                  log_dir = File.join(base_dir, timestamp.strftime("%F_%H_%M_%S"))
         | 
| 315 | 
            +
                def Logger.generate_dated_log_folder(base_dir, log_prefix, timestamp)
         | 
| 316 | 
            +
                  log_dir = File.join(base_dir, log_prefix, timestamp.strftime("%F_%H_%M_%S"))
         | 
| 311 317 | 
             
                  FileUtils.mkdir_p(log_dir) unless File.directory?(log_dir)
         | 
| 312 318 | 
             
                  log_dir
         | 
| 313 319 | 
             
                end
         | 
| @@ -26,10 +26,11 @@ module Beaker | |
| 26 26 | 
             
                  @machines = {}
         | 
| 27 27 | 
             
                  @hypervisors = nil
         | 
| 28 28 |  | 
| 29 | 
            -
                  @options[: | 
| 30 | 
            -
                  @options[: | 
| 31 | 
            -
                  @options[: | 
| 32 | 
            -
                  @options[: | 
| 29 | 
            +
                  @options[:log_prefix]     = File.basename(@options[:hosts_file], '.yml') unless @options[:log_prefix]
         | 
| 30 | 
            +
                  @options[:timestamp]      = Time.now unless @options.has_key?(:timestamp)
         | 
| 31 | 
            +
                  @options[:xml_dated_dir]  = Beaker::Logger.generate_dated_log_folder(@options[:xml_dir], @options[:log_prefix], @options[:timestamp])
         | 
| 32 | 
            +
                  @options[:log_dated_dir]  = Beaker::Logger.generate_dated_log_folder(@options[:log_dir], @options[:log_prefix], @options[:timestamp])
         | 
| 33 | 
            +
                  @options[:logger_sut]     = Beaker::Logger.new(File.join(@options[:log_dated_dir], @options[:log_sut_event]), { :quiet => true })
         | 
| 33 34 | 
             
                end
         | 
| 34 35 |  | 
| 35 36 | 
             
                #Provision all virtual machines.  Provision machines according to their set hypervisor, if no hypervisor
         |