Class: Beaker::Vagrant
- Inherits:
-
Hypervisor
- Object
- Hypervisor
- Beaker::Vagrant
- Defined in:
- lib/beaker/hypervisor/vagrant.rb
Instance Method Summary collapse
- #cleanup ⇒ Object
- #copy_ssh_to_root(host) ⇒ Object
- #get_ip_from_vagrant_file(hostname) ⇒ Object
- #hack_etc_hosts(hosts) ⇒ Object
-
#initialize(vagrant_hosts, options) ⇒ Vagrant
constructor
A new instance of Vagrant.
- #make_vfile(hosts) ⇒ Object
- #provision ⇒ Object
- #rand_chunk ⇒ Object
- #randip ⇒ Object
-
#randmac ⇒ String
Return a random mac address.
- #set_ssh_config(host, user) ⇒ Object
- #vagrant_cmd(args) ⇒ Object
Methods inherited from Hypervisor
Constructor Details
#initialize(vagrant_hosts, options) ⇒ Vagrant
Returns a new instance of Vagrant.
102 103 104 105 106 107 108 109 110 111 112 |
# File 'lib/beaker/hypervisor/vagrant.rb', line 102 def initialize(vagrant_hosts, ) require 'tempfile' @options = @logger = [:logger] @temp_files = [] @vagrant_hosts = vagrant_hosts @vagrant_path = File.(File.join(File.basename(__FILE__), '..', '.vagrant', 'beaker_vagrant_files', File.basename([:hosts_file]))) FileUtils.mkdir_p(@vagrant_path) @vagrant_file = File.(File.join(@vagrant_path, "Vagrantfile")) end |
Instance Method Details
#cleanup ⇒ Object
146 147 148 149 150 151 152 153 154 |
# File 'lib/beaker/hypervisor/vagrant.rb', line 146 def cleanup @logger.debug "removing temporory ssh-config files per-vagrant box" @temp_files.each do |f| f.close() end @logger.notify "Destroying vagrant boxes" vagrant_cmd("destroy --force") FileUtils.rm_rf(@vagrant_path) end |
#copy_ssh_to_root(host) ⇒ Object
55 56 57 58 59 60 61 62 63 |
# File 'lib/beaker/hypervisor/vagrant.rb', line 55 def copy_ssh_to_root host #make is possible to log in as root by copying the ssh dir to root's account @logger.debug "Give root a copy of vagrant's keys" if host['platform'] =~ /windows/ host.exec(Command.new('sudo su -c "cp -r .ssh /home/Administrator/."')) else host.exec(Command.new('sudo su -c "cp -r .ssh /root/."')) end end |
#get_ip_from_vagrant_file(hostname) ⇒ Object
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
# File 'lib/beaker/hypervisor/vagrant.rb', line 85 def get_ip_from_vagrant_file(hostname) ip = '' if File.file?(@vagrant_file) #we should have a vagrant file available to us for reading f = File.read(@vagrant_file) m = /#{hostname}.*?ip:\s*('|")\s*([^'"]+)('|")/m.match(f) if m ip = m[2] @logger.debug("Determined existing vagrant box #{hostname} ip to be: #{ip} ") else raise("Unable to determine ip for vagrant box #{hostname}") end else raise("No vagrant file found (should be located at #{@vagrant_file})") end ip end |
#hack_etc_hosts(hosts) ⇒ Object
45 46 47 48 49 50 51 52 53 |
# File 'lib/beaker/hypervisor/vagrant.rb', line 45 def hack_etc_hosts hosts etc_hosts = "127.0.0.1\tlocalhost localhost.localdomain\n" hosts.each do |host| etc_hosts += "#{host['ip'].to_s}\t#{host.name}\n" end hosts.each do |host| set_etc_hosts(host, etc_hosts) end end |
#make_vfile(hosts) ⇒ Object
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
# File 'lib/beaker/hypervisor/vagrant.rb', line 21 def make_vfile hosts #HACK HACK HACK - add checks here to ensure that we have box + box_url #generate the VagrantFile v_file = "Vagrant.configure(\"2\") do |c|\n" hosts.each do |host| host['ip'] ||= randip #use the existing ip, otherwise default to a random ip v_file << " c.vm.define '#{host.name}' do |v|\n" v_file << " v.vm.hostname = '#{host.name}'\n" v_file << " v.vm.box = '#{host['box']}'\n" v_file << " v.vm.box_url = '#{host['box_url']}'\n" unless host['box_url'].nil? v_file << " v.vm.base_mac = '#{randmac}'\n" v_file << " v.vm.network :private_network, ip: \"#{host['ip'].to_s}\", :netmask => \"#{host['netmask'] ||= "255.255.0.0"}\"\n" v_file << " end\n" @logger.debug "created Vagrantfile for VagrantHost #{host.name}" end v_file << " c.vm.provider :virtualbox do |vb|\n" v_file << " vb.customize [\"modifyvm\", :id, \"--memory\", \"1024\"]\n" v_file << " end\n" v_file << "end\n" File.open(@vagrant_file, 'w') do |f| f.write(v_file) end end |
#provision ⇒ Object
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
# File 'lib/beaker/hypervisor/vagrant.rb', line 114 def provision if @options[:provision] #setting up new vagrant hosts #make sure that any old boxes are dead dead dead vagrant_cmd("destroy --force") if File.file?(@vagrant_file) make_vfile @vagrant_hosts vagrant_cmd("up") else #set host ip of already up boxes @vagrant_hosts.each do |host| host[:ip] = get_ip_from_vagrant_file(host.name) end end @logger.debug "configure vagrant boxes (set ssh-config, switch to root user, hack etc/hosts)" @vagrant_hosts.each do |host| default_user = host['user'] set_ssh_config host, 'vagrant' copy_ssh_to_root host #shut down connection, will reconnect on next exec host.close set_ssh_config host, default_user end hack_etc_hosts @vagrant_hosts end |
#rand_chunk ⇒ Object
13 14 15 |
# File 'lib/beaker/hypervisor/vagrant.rb', line 13 def rand_chunk (2 + rand(252)).to_s #don't want a 0, 1, or a 255 end |
#randip ⇒ Object
17 18 19 |
# File 'lib/beaker/hypervisor/vagrant.rb', line 17 def randip "10.255.#{rand_chunk}.#{rand_chunk}" end |
#randmac ⇒ String
Return a random mac address
9 10 11 |
# File 'lib/beaker/hypervisor/vagrant.rb', line 9 def randmac "080027" + (1..3).map{"%0.2X"%rand(256)}.join end |
#set_ssh_config(host, user) ⇒ Object
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
# File 'lib/beaker/hypervisor/vagrant.rb', line 65 def set_ssh_config host, user f = Tempfile.new("#{host.name}") ssh_config = Dir.chdir(@vagrant_path) do stdin, stdout, stderr, wait_thr = Open3.popen3('vagrant', 'ssh-config', host.name) if not wait_thr.value.success? raise "Failed to 'vagrant ssh-config' for #{host.name}" end stdout.read end #replace hostname with ip ssh_config = ssh_config.gsub(/#{host.name}/, host['ip']) unless not host['ip'] #set the user ssh_config = ssh_config.gsub(/User vagrant/, "User #{user}") f.write(ssh_config) f.rewind host['ssh'] = {:config => f.path()} host['user'] = user @temp_files << f end |
#vagrant_cmd(args) ⇒ Object
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 |
# File 'lib/beaker/hypervisor/vagrant.rb', line 156 def vagrant_cmd(args) Dir.chdir(@vagrant_path) do exit_status = 1 Open3.popen3("vagrant #{args}") {|stdin, stdout, stderr, wait_thr| while line = stdout.gets @logger.debug(line) end if not wait_thr.value.success? raise "Failed to exec 'vagrant #{args}'" end exit_status = wait_thr.value } if exit_status != 0 raise "Failed to execute vagrant_cmd ( #{args} )" end end end |