class Beaker::NetworkManager

Object that holds all the provisioned and non-provisioned virtual machines. Controls provisioning, configuration, validation and cleanup of those virtual machines.

Attributes

hosts[RW]
hypervisors[RW]

Public Class Methods

new(options, logger) click to toggle source
# File lib/beaker/network_manager.rb, line 24
def initialize(options, logger)
  @logger = logger
  @options = options
  @hosts = []
  @machines = {}
  @hypervisors = nil

  # user provided prefix has top priority
  if not @options[:log_prefix]
    # name it after the hosts file
    @options[:log_prefix] = if @options[:hosts_file]
                              File.basename(@options[:hosts_file], '.yml')
                            else
                              # here be the default
                              @options[:default_log_prefix]
                            end
  end
  @options[:timestamp]      = Time.now unless @options.has_key?(:timestamp)
  @options[:xml_dated_dir]  = Beaker::Logger.generate_dated_log_folder(@options[:xml_dir], @options[:log_prefix], @options[:timestamp])
  @options[:log_dated_dir]  = Beaker::Logger.generate_dated_log_folder(@options[:log_dir], @options[:log_prefix], @options[:timestamp])
  @options[:logger_sut]     = Beaker::Logger.new(File.join(@options[:log_dated_dir], @options[:log_sut_event]), { :quiet => true })
end

Public Instance Methods

cleanup() click to toggle source

Shut down network connections and revert all provisioned virtual machines

# File lib/beaker/network_manager.rb, line 110
def cleanup
  # shut down connections
  @hosts.each { |host| host.close }

  if @hypervisors
    @hypervisors.each_key do |type|
      @hypervisors[type].cleanup
      @hypervisors[type].instance_variable_get(:@hosts).each do |host|
        log_sut_event host, false
      end
    end
  end
  @hypervisors = nil
end
configure() click to toggle source

Configure all provisioned machines, adding any packages or settings required for SUTs @raise [Exception] Raise an exception if virtual machines fail to be configured

# File lib/beaker/network_manager.rb, line 91
def configure
  return unless @hypervisors

  @hypervisors.each_key do |type|
    @hypervisors[type].configure
  end
end
log_sut_event(host, create) click to toggle source

logs provisioning events

@param [Host] host The host that the event is happening to @param [Boolean] create Whether the event is creation or cleaning up

@return [String] the log line created for this event

# File lib/beaker/network_manager.rb, line 131
def log_sut_event host, create
  raise ArgumentError.new "log_sut_event called before sut logger created. skipping #{host}, #{create}" unless @options.has_key?(:logger_sut)

  sut_logger = @options[:logger_sut]
  time = Time.new
  stamp = time.strftime('%Y-%m-%d %H:%M:%S')
  verb = create ? '+' : '-'
  line = "#{stamp}\t[#{verb}]\t#{host['hypervisor']}\t#{host['platform']}\t#{host.log_prefix}"
  sut_logger.notify line
  line
end
provision() click to toggle source

Provision all virtual machines. Provision machines according to their set hypervisor, if no hypervisor is selected assume that the described hosts are already up and reachable and do no provisioning.

# File lib/beaker/network_manager.rb, line 49
def provision
  cleanup if @hypervisors
  @hypervisors = {}
  # sort hosts by their hypervisor, use hypervisor 'none' if no hypervisor is specified
  hostless_options = Beaker::Options::OptionsHash.new.merge(@options.select { |k, _v| !k.to_s.include?('HOSTS') })
  @options['HOSTS'].each_key do |name|
    host_hash = @options['HOSTS'][name]
    hypervisor = host_hash['hypervisor']
    if @options[:provision]
      hypervisor = provision?(@options, host_hash) ? host_hash['hypervisor'] : 'none'
    end
    @logger.debug "Hypervisor for #{name} is #{hypervisor}"
    @machines[hypervisor] = [] unless @machines[hypervisor]
    hostless_options[:timesync] = host_hash[:timesync] if host_hash[:timesync] != nil
    host_itself = Beaker::Host.create(name, host_hash, hostless_options)
    @machines[hypervisor] << host_itself
  end

  @machines.each_key do |type|
    @hypervisors[type] = Beaker::Hypervisor.create(type, @machines[type], @options)
    @hosts << @machines[type]
    @machines[type].each do |host|
      log_sut_event host, true
    end
  end
  @hosts = @hosts.flatten
  @hosts
end
provision?(options, host) click to toggle source

Determine if a given host should be provisioned. Provision if:

  • only if we are running with —provision

  • only if we have a hypervisor

  • only if either the specific hosts has no specification or has ‘provision’ in its config

  • always if it is a vagrant box (vagrant boxes are always provisioned as they always need ssh key hacking.)

# File lib/beaker/network_manager.rb, line 16
def provision? options, host
  command_line_says = options[:provision]
  host_says = host['hypervisor'] && (host.has_key?('provision') ? host['provision'] : true)
  (command_line_says && host_says) or host['hypervisor'].include?('vagrant')
end
proxy_package_manager() click to toggle source

configure proxy on all provioned machines @raise [Exception] Raise an exception if virtual machines fail to be configured

# File lib/beaker/network_manager.rb, line 101
def proxy_package_manager
  return unless @hypervisors

  @hypervisors.each_key do |type|
    @hypervisors[type].proxy_package_manager
  end
end
validate() click to toggle source

Validate all provisioned machines, ensure that required packages are installed - if they are missing attempt to add them. @raise [Exception] Raise an exception if virtual machines fail to be validated

# File lib/beaker/network_manager.rb, line 81
def validate
  return unless @hypervisors

  @hypervisors.each_key do |type|
    @hypervisors[type].validate
  end
end