require 'rake/clean'
require 'rototiller'

desc 'Run acceptance tests'

desc "Generate Beaker Host config"
task :host_config do
  if ENV["BEAKER_CONFIG"]
    next
  end
  if not ENV['TEST_TARGET']
    fail "FATAL: must set TEST_TARGET environment variable."
  end

  generate = "bundle exec beaker-hostgenerator"
  generate += " --disable-default-role #{ENV['TEST_TARGET']}"
  generate += " > hosts.cfg"
  sh generate
  sh "cat hosts.cfg"
end

desc "Run beaker based acceptance tests"
task acceptance: :host_config
task :acceptance do

  # fail if SHA not present
  fail "SHA must be set in order to setup repositories!!!" if ENV["BEAKER_TYPE"] == "pe" && !ENV['SHA']

  # hardcode the pe_dir into the repo instead of the jenkins job
  ENV['BEAKER_PE_DIR'] = "http://enterprise.delivery.puppetlabs.net/#{ENV['PE_FAMILY']}/ci-ready" unless ENV["BEAKER_TYPE"] == 'foss'

  config = ENV["BEAKER_CONFIG"] || 'hosts.cfg'
  preserve_hosts = ENV["BEAKER_PRESERVE_HOSTS"] || 'onfail'
  type = ENV["BEAKER_TYPE"] || 'pe'
  keyfile = ENV["BEAKER_KEYFILE"] || "#{ENV['HOME']}/.ssh/id_rsa-acceptance"
  test_suite = ENV["BEAKER_TESTSUITE"] || "#{type}/tests/"
  pre_suite = ENV["BEAKER_PRESUITE"] || "#{type}/setup/pre_suite"
  opts = ENV["BEAKER_OPTS"] || ''

  beaker = "bundle exec beaker "
  beaker += " --xml"
  beaker += " --debug"
  beaker += " --no-color"
  beaker += " --repo-proxy"
  beaker += " --config #{config}" if config != ''
  beaker += " --preserve-hosts #{preserve_hosts}" if preserve_hosts != ''
  beaker += " --type #{type}" if type != ''
  beaker += " --keyfile #{keyfile}" if keyfile != ''
  beaker += " --tests #{test_suite}" if test_suite != ''
  beaker += " --pre-suite #{pre_suite}" if pre_suite != ''
  beaker += " #{opts}" if opts != ''
  sh beaker
end

namespace :ci do
  namespace :test do

    desc 'This task is used by CI to test the package pe-client-tools'
    rototiller_task :package => [:set_test_target]do |t|

      flags = [
          {:name => '--xml', :is_boolean => true},
          {:name => '--no-color', :is_boolean => true},
          {:name => '--debug', :is_boolean => true},
          {:name => '--hosts', :override_env => 'BEAKER_HOSTS'},
          {:name => '--preserve-hosts', :default => 'onfail', :override_env => 'BEAKER_PRESERVE_HOSTS'},
          {:name => '--keyfile', :default => "#{ENV['HOME']}/.ssh/id_rsa-acceptance", :override_env => 'BEAKER_KEYFILE'},
          {:name => '--pre-suite', :default => 'pe/setup/pre_suite', :override_env => 'BEAKER_PRESUITE'},
          {:name => '--tests', :default => 'pe/tests', :override_env => 'BEAKER_TESTSUITE'},
      ]

      t.add_flag(*flags)

      t.add_env(:name => 'SHA',           :message => 'The sha for pe-client-tools')
      t.add_env(:name => 'SUITE_VERSION', :message => 'The suite version used by Jenkins')
      t.add_env(:name => 'PE_FAMILY',     :message => 'The puppet enterprise major branch to install from')

      t.add_env do |env|
        env.name = 'pe_dist_dir'
        env.message = 'The location to download PE from example "http://neptune.puppetlabs.lan/20XX.X/ci-ready"'
        ENV['pe_dist_dir'] ||= "http://neptune.puppetlabs.lan/#{ENV['PE_FAMILY']}/ci-ready"
      end

      t.add_command({:name => 'beaker', :override_env => 'BEAKER_EXECUTABLE'})
    end

    task :set_test_target do
      if ENV['BEAKER_HOSTS'].nil?
        client = ENV['CLIENT_TEST_TARGET'] || (fail 'The environment variable CLIENT_TEST_TARGET must be set.')
        # process the CLIENT_TEST_TARGET variable and assign it to TEST_TARGET so that rototiller will pick it up
        monolithic_config = "#{client}client.mdca"
        master_agent_config = "centos7-64.mdca-#{client}client.a"
        ENV['BEAKER_HOSTS'] ||= (client =~ /win|osx/) ? master_agent_config : monolithic_config
      end
    end

  end
end

