# frozen_string_literal: true require 'serverspec' require 'puppet_litmus' require 'spec_helper_acceptance_local' if File.file?(File.join(File.dirname(__FILE__), 'spec_helper_acceptance_local.rb')) include PuppetLitmus UNSUPPORTED_PLATFORMS = ['RedHat', 'Suse', 'windows', 'AIX', 'Solaris'].freeze MAX_RETRY_COUNT = 5 RETRY_WAIT = 3 ERROR_MATCHER = %r{(no valid OpenPGP data found|keyserver timed out|keyserver receive failed)} # This method allows a block to be passed in and if an exception is raised # that matches the 'error_matcher' matcher, the block will wait a set number # of seconds before retrying. # Params: # - max_retry_count - Max number of retries # - retry_wait_interval_secs - Number of seconds to wait before retry # - error_matcher - Matcher which the exception raised must match to allow retry # Example Usage: # retry_on_error_matching(3, 5, /OpenGPG Error/) do # apply_manifest(pp, :catch_failures => true) # end def retry_on_error_matching(max_retry_count = MAX_RETRY_COUNT, retry_wait_interval_secs = RETRY_WAIT, error_matcher = ERROR_MATCHER) try = 0 begin puts "retry_on_error_matching: try #{try}" unless try.zero? try += 1 yield rescue StandardError => e raise(_('Attempted this %{value0} times. Raising %{value1}') % { value0: max_retry_count, value1: e }) unless try < max_retry_count && (error_matcher.nil? || e.message =~ error_matcher) sleep retry_wait_interval_secs retry end end def pe_install? false end if ENV['TARGET_HOST'].nil? || ENV['TARGET_HOST'] == 'localhost' puts 'Running tests against this machine !' if Gem.win_platform? set :backend, :cmd else set :backend, :exec end else # load inventory inventory_hash = inventory_hash_from_inventory_file node_config = config_from_node(inventory_hash, ENV['TARGET_HOST']) if target_in_group(inventory_hash, ENV['TARGET_HOST'], 'docker_nodes') host = ENV['TARGET_HOST'] set :backend, :docker set :docker_container, host elsif target_in_group(inventory_hash, ENV['TARGET_HOST'], 'ssh_nodes') set :backend, :ssh options = Net::SSH::Config.for(host) options[:user] = node_config.dig('ssh', 'user') unless node_config.dig('ssh', 'user').nil? options[:port] = node_config.dig('ssh', 'port') unless node_config.dig('ssh', 'port').nil? options[:keys] = node_config.dig('ssh', 'private-key') unless node_config.dig('ssh', 'private-key').nil? options[:password] = node_config.dig('ssh', 'password') unless node_config.dig('ssh', 'password').nil? options[:verify_host_key] = Net::SSH::Verifiers::Null.new unless node_config.dig('ssh', 'host-key-check').nil? host = if ENV['TARGET_HOST'].include?(':') ENV['TARGET_HOST'].split(':').first else ENV['TARGET_HOST'] end set :host, options[:host_name] || host set :ssh_options, options set :request_pty, true elsif target_in_group(inventory_hash, ENV['TARGET_HOST'], 'winrm_nodes') require 'winrm' set :backend, :winrm set :os, family: 'windows' user = node_config.dig('winrm', 'user') unless node_config.dig('winrm', 'user').nil? pass = node_config.dig('winrm', 'password') unless node_config.dig('winrm', 'password').nil? endpoint = "http://#{ENV['TARGET_HOST']}:5985/wsman" opts = { user: user, password: pass, endpoint: endpoint, operation_timeout: 300, } winrm = WinRM::Connection.new opts Specinfra.configuration.winrm = winrm end lsb_package = <<-MANIFEST package { 'lsb-release': ensure => installed, } MANIFEST apply_manifest(lsb_package) run_shell('puppet module install stahnma/epel') end