class SpecHelper

Does all the setup fo r the serverspec tests

Attributes

properties[R]
target_properties[R]
target_variables[R]

Public Class Methods

load(host = ENV['TARGET_HOST'], target = ENV['TARGET'], properties = nil, task_source = ENV['TASK_SOURCE'], environment = ENV['TASK_ENV']) click to toggle source
# File lib/serverspec_launcher/spec_helper.rb, line 191
def self.load(host = ENV['TARGET_HOST'], target = ENV['TARGET'], properties = nil, task_source = ENV['TASK_SOURCE'], environment = ENV['TASK_ENV'])
  props = PropertiesLoader.new properties
  helper = SpecHelper.new host, target, props.properties, task_source, environment
  props = helper.properties[:shared_example_gems] || []
  helper.load_shared_examples props
  helper.setup_backend
  helper
end
new(host = ENV['TARGET_HOST'], target = ENV['TARGET'], properties = nil, task_source = ENV['TASK_SOURCE'], environment = ENV['TASK_ENV']) click to toggle source
# File lib/serverspec_launcher/spec_helper.rb, line 26
def initialize(host = ENV['TARGET_HOST'], target = ENV['TARGET'], properties = nil, task_source = ENV['TASK_SOURCE'], environment = ENV['TASK_ENV'])
  @host = host
  @target = target
  @source = task_source
  @environment = environment
  load_properties properties
end

Public Instance Methods

docker_backend() click to toggle source
# File lib/serverspec_launcher/spec_helper.rb, line 163
def docker_backend
  set :backend, :docker

  set_docker_image
  set_docker_container
  set :docker_url, @target_properties[:docker_url] if @target_properties[:docker_url]
end
load_properties(properties = nil) click to toggle source
# File lib/serverspec_launcher/spec_helper.rb, line 34
def load_properties(properties = nil)
  @properties = if properties
                  properties.deep_symbolize_keys
                else
                  YAML.load_file('properties.yml').deep_symbolize_keys
                end
  @target_properties = if @source == 'environment'
   @properties[:environments][@environment.to_sym][:targets][@target.to_sym]
  else
    @properties[:targets][@target.to_sym]
  end
  if @source == 'environment'
    vars = @properties[:environments][@environment.to_sym][:variables] ? @properties[:environments][@environment.to_sym][:variables] : {}
    @target_variables =  @properties[:variables] ? @properties[:variables].deep_merge(vars) : {}.deep_merge(vars)
  else
    @target_variables = @properties[:variables] ? @properties[:variables] : {}
  end

  @backend = @target_properties[:backend] || 'ssh'
  @target_properties[:target] = ENV['TASK_NAME']

  @target_properties[:variables] =  @target_variables.deep_merge(@target_properties[:variables])
  @target_properties[:environment] =  @properties[:environment] ? @properties[:variables].deep_merge(@target_properties[:environment]) : {}.deep_merge(@target_properties[:environment])

  set_property @target_properties
end
password_checks(options) click to toggle source
# File lib/serverspec_launcher/spec_helper.rb, line 123
def password_checks(options)
  if ENV['ASK_LOGIN_PASSWORD']
    begin
      require 'highline/import'
    rescue LoadError
      raise 'highline is not available. Try installing it.'
    end
    options[:password] = ask('Enter login password: ') { |q| q.echo = false }
  else
    options[:password] =  ENV['LOGIN_PASSWORD']
  end
end
set_docker_container() click to toggle source
# File lib/serverspec_launcher/spec_helper.rb, line 171
def set_docker_container
  set :docker_container, @target_properties[:docker_container] if @target_properties[:docker_container]
  set :docker_container_create_options, @target_properties[:docker_options] if @target_properties[:docker_options]
end
set_docker_image() click to toggle source
# File lib/serverspec_launcher/spec_helper.rb, line 176
def set_docker_image
  if @target_properties[:dockerfile]
    puts "Building Docker Image from #{@target_properties[:dockerfile]}"
    commands = File.read(@target_properties[:dockerfile])
    image = Docker::Image.build(commands)
    set :docker_image, image.id
  elsif @target_properties[:docker_build_dir]
    puts "Building Docker Image in dir #{@target_properties[:docker_build_dir]}"
    image = Docker::Image.build_from_dir(@target_properties[:docker_build_dir])
    set :docker_image, image.id
  else
    set :docker_image, @target_properties[:docker_image] if @target_properties[:docker_image]
  end
end
setup_backend() click to toggle source
# File lib/serverspec_launcher/spec_helper.rb, line 61
def setup_backend
  if @backend == 'exec'
    set :backend, :exec
  elsif @backend == 'docker'
    docker_backend
  elsif @backend == 'inspec'
  else
    ssh_backend
  end
end
ssh_backend() click to toggle source
# File lib/serverspec_launcher/spec_helper.rb, line 72
def ssh_backend
  set :backend, :ssh

  sudo_checks



  ssh_user = @target_properties[:user] || Etc.getlogin

  options = if @backend == 'vagrant'
              vagrant_backend
            else
              Net::SSH::Config.for(@host)
            end
  password_checks(options)
  options[:user] ||= ssh_user
  options[:keys] = [@target_properties[:identity_file]] if @target_properties[:identity_file]
  options[:port] = @target_properties[:ssh_port] if @target_properties[:ssh_port]
  host_key_checking(options)


  set :host, options[:host_name] || @host
  set :ssh_options, options


  # Disable sudo
  # set :disable_sudo, true

  # Set environment variables
  return unless @target_properties[:environment]

  env = @target_properties[:environment].map do |en|
    variable, value = en.split('=')
    { variable.to_sym => value }
  end.reduce({}, :merge)
  set :env, env
end
sudo_checks() click to toggle source
# File lib/serverspec_launcher/spec_helper.rb, line 110
def sudo_checks
  if ENV['ASK_SUDO_PASSWORD']
    begin
      require 'highline/import'
    rescue LoadError
      raise 'highline is not available. Try installing it.'
    end
    set :sudo_password, ask('Enter sudo password: ') { |q| q.echo = false }
  else
    set :sudo_password, ENV['SUDO_PASSWORD']
  end
end
vagrant_backend() click to toggle source
# File lib/serverspec_launcher/spec_helper.rb, line 136
def vagrant_backend
  @host = @target_properties[:vagrant_host] || 'default'
  vagrant_dir = @target_properties[:vagrant_dir]

  old_dir = Dir.pwd
  Dir.chdir(vagrant_dir) if vagrant_dir
  reprovision = @target_properties[:vagrant_reprovision] ? '--provision' : ''
  vagrant_up = "vagrant up #{@host} #{reprovision}"
  if @target_properties[:vagrant_output]
    Open3.popen2e vagrant_up do |_stdin, stdout_and_stderr, _wait_thr|
      while (line = stdout_and_stderr.gets) do
        puts line
      end
    end
  elsif @target_properties[:vagrant_errors]
    system(vagrant_up, out: File::NULL)
  else
    system(vagrant_up, out: File::NULL, err: File::NULL)
  end

  config = Tempfile.new('', Dir.tmpdir)
  config.write(`vagrant ssh-config #{@host}`)
  config.close
  Dir.chdir old_dir
  Net::SSH::Config.for(@host, [config.path])
end

Private Instance Methods

host_key_checking(options) click to toggle source
# File lib/serverspec_launcher/spec_helper.rb, line 202
def host_key_checking(options)
  options[:verify_host_key] = @target_properties[:verify_host_key].to_sym if @target_properties[:verify_host_key]
end