Class: Beaker::Vagrant

Inherits:
Hypervisor show all
Defined in:
lib/beaker/hypervisor/vagrant.rb

Instance Method Summary collapse

Methods inherited from Hypervisor

#configure, create

Constructor Details

#initialize(vagrant_hosts, options, config) ⇒ Vagrant

Returns a new instance of Vagrant.



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/beaker/hypervisor/vagrant.rb', line 77

def initialize(vagrant_hosts, options, config)
  require 'tempfile'
  @options = options
  @config = config['CONFIG'].dup
  @logger = options[:logger]
  @temp_files = []
  @vagrant_hosts = vagrant_hosts

  make_vfile @vagrant_hosts

  #stop anything currently running, that way vagrant up will re-do networking on existing boxes
  system("vagrant halt") 
  system("vagrant up")

  @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

Instance Method Details

#cleanupObject



108
109
110
111
112
113
114
115
# File 'lib/beaker/hypervisor/vagrant.rb', line 108

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"
  system("vagrant destroy --force")
end

#copy_ssh_to_root(host) ⇒ Object



53
54
55
56
57
58
59
60
61
# File 'lib/beaker/hypervisor/vagrant.rb', line 53

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

#hack_etc_hosts(hosts) ⇒ Object



43
44
45
46
47
48
49
50
51
# File 'lib/beaker/hypervisor/vagrant.rb', line 43

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



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/beaker/hypervisor/vagrant.rb', line 19

def make_vfile hosts
  #HACK HACK HACK - add checks here to ensure that we have box + box_url
  #generate the VagrantFile
  vagrant_file = "Vagrant.configure(\"2\") do |c|\n"
  hosts.each do |host|
    host['ip'] ||= randip #use the existing ip, otherwise default to a random ip
    vagrant_file << "  c.vm.define '#{host.name}' do |v|\n"
    vagrant_file << "    v.vm.hostname = '#{host.name}'\n"
    vagrant_file << "    v.vm.box = '#{host['box']}'\n"
    vagrant_file << "    v.vm.box_url = '#{host['box_url']}'\n" unless host['box_url'].nil?
    vagrant_file << "    v.vm.base_mac = '#{randmac}'\n"
    vagrant_file << "    v.vm.network :private_network, ip: \"#{host['ip'].to_s}\"\n"
    vagrant_file << "  end\n"
    @logger.debug "created Vagrantfile for VagrantHost #{host.name}"
  end
  vagrant_file << "  c.vm.provider :virtualbox do |vb|\n"
  vagrant_file << "    vb.customize [\"modifyvm\", :id, \"--memory\", \"1024\"]\n"
  vagrant_file << "  end\n"
  vagrant_file << "end\n"
  f = File.open("Vagrantfile", 'w') 
  f.write(vagrant_file)
  f.close()
end

#rand_chunkObject



11
12
13
# File 'lib/beaker/hypervisor/vagrant.rb', line 11

def rand_chunk
  (1 + rand(253)).to_s #don't want a 0 or a 255
end

#randipObject



15
16
17
# File 'lib/beaker/hypervisor/vagrant.rb', line 15

def randip
  "192.168.#{rand_chunk}.#{rand_chunk}"
end

#randmacString

Return a random mac address

Returns:

  • (String)

    a random mac address



7
8
9
# File 'lib/beaker/hypervisor/vagrant.rb', line 7

def randmac
  "080027" + (1..3).map{"%0.2X"%rand(256)}.join
end

#set_ssh_config(host, user) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/beaker/hypervisor/vagrant.rb', line 63

def set_ssh_config host, user
    f = Tempfile.new("#{host.name}")
    ssh_config = `vagrant ssh-config #{host.name}`
    #replace hostname with ip
    ssh_config = ssh_config.gsub(/#{host.name}/, 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