Class: Beaker::NetworkManager
- Inherits:
-
Object
- Object
- Beaker::NetworkManager
- Defined in:
- lib/beaker/network_manager.rb
Overview
Object that holds all the provisioned and non-provisioned virtual machines. Controls provisioning, configuration, validation and cleanup of those virtual machines.
Instance Attribute Summary collapse
-
#hosts ⇒ Object
Returns the value of attribute hosts.
-
#hypervisors ⇒ Object
Returns the value of attribute hypervisors.
Instance Method Summary collapse
-
#cleanup ⇒ Object
Shut down network connections and revert all provisioned virtual machines.
-
#configure ⇒ Object
Configure all provisioned machines, adding any packages or settings required for SUTs.
-
#initialize(options, logger) ⇒ NetworkManager
constructor
A new instance of NetworkManager.
-
#log_sut_event(host, create) ⇒ String
logs provisioning events.
-
#provision ⇒ Object
Provision all virtual machines.
-
#provision?(options, host) ⇒ Boolean
Determine if a given host should be provisioned.
-
#proxy_package_manager ⇒ Object
configure proxy on all provioned machines.
-
#validate ⇒ Object
Validate all provisioned machines, ensure that required packages are installed - if they are missing attempt to add them.
Constructor Details
#initialize(options, logger) ⇒ NetworkManager
Returns a new instance of NetworkManager.
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/beaker/network_manager.rb', line 26 def initialize(, logger) @logger = logger @options = @hosts = [] @machines = {} @hypervisors = nil # user provided prefix has top priority if not @options[:log_prefix] # name it after the hosts file if @options[:hosts_file] @options[:log_prefix] = File.basename(@options[:hosts_file], '.yml') else #here be the default @options[:log_prefix] = @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 |
Instance Attribute Details
#hosts ⇒ Object
Returns the value of attribute hosts.
24 25 26 |
# File 'lib/beaker/network_manager.rb', line 24 def hosts @hosts end |
#hypervisors ⇒ Object
Returns the value of attribute hypervisors.
24 25 26 |
# File 'lib/beaker/network_manager.rb', line 24 def hypervisors @hypervisors end |
Instance Method Details
#cleanup ⇒ Object
Shut down network connections and revert all provisioned virtual machines
115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
# File 'lib/beaker/network_manager.rb', line 115 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 ⇒ Object
Configure all provisioned machines, adding any packages or settings required for SUTs
96 97 98 99 100 101 102 |
# File 'lib/beaker/network_manager.rb', line 96 def configure if @hypervisors @hypervisors.each_key do |type| @hypervisors[type].configure end end end |
#log_sut_event(host, create) ⇒ String
logs provisioning events
136 137 138 139 140 141 142 143 144 145 |
# File 'lib/beaker/network_manager.rb', line 136 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 ⇒ Object
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.
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
# File 'lib/beaker/network_manager.rb', line 51 def provision if @hypervisors cleanup end @hypervisors = {} #sort hosts by their hypervisor, use hypervisor 'none' if no hypervisor is specified = Beaker::Options::OptionsHash.new.merge(@options.select{ |k,v| k.to_s !~ /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] [:timesync] = host_hash[:timesync] if host_hash[:timesync]!=nil host_itself = Beaker::Host.create(name, host_hash, ) host_itself.validate_setup @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) ⇒ Boolean
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 or docker box (vagrant boxes are always provisioned
as they always need ssh key hacking. docker boxes need to have docker_container_name specified)
18 19 20 21 22 |
# File 'lib/beaker/network_manager.rb', line 18 def provision? , host command_line_says = [:provision] host_says = host['hypervisor'] && (host.has_key?('provision') ? host['provision'] : true) (command_line_says && host_says) or (host['hypervisor'] =~/(vagrant|docker)/) end |
#proxy_package_manager ⇒ Object
configure proxy on all provioned machines
106 107 108 109 110 111 112 |
# File 'lib/beaker/network_manager.rb', line 106 def proxy_package_manager if @hypervisors @hypervisors.each_key do |type| @hypervisors[type].proxy_package_manager end end end |
#validate ⇒ Object
Validate all provisioned machines, ensure that required packages are installed - if they are missing attempt to add them.
86 87 88 89 90 91 92 |
# File 'lib/beaker/network_manager.rb', line 86 def validate if @hypervisors @hypervisors.each_key do |type| @hypervisors[type].validate end end end |