Merge pull request #568 from marineam/vagrant

Vagrant hackery redux
This commit is contained in:
Michael Marineau 2014-05-03 14:18:21 -07:00
commit f323a0348e
9 changed files with 235 additions and 6 deletions

View File

@ -1 +0,0 @@
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key

View File

@ -0,0 +1,27 @@
# -*- mode: ruby -*-
# # vi: set ft=ruby :
if Vagrant::VERSION < "1.5.0"
raise "Need at least vagrant version 1.5.0, please update"
end
require_relative 'change_host_name.rb'
require_relative 'configure_networks.rb'
require_relative 'base_mac.rb'
Vagrant.configure("2") do |config|
# SSH in as the default 'core' user, it has the vagrant ssh key.
config.ssh.username = "core"
# Disable the base shared folder, guest additions are unavailable.
config.vm.synced_folder ".", "/vagrant", disabled: true
config.vm.provider :virtualbox do |vb|
# Guest Additions are unavailable.
vb.check_guest_additions = false
# Fix docker not being able to resolve private registry in VirtualBox
vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
end
end

View File

@ -0,0 +1,4 @@
# This file must be rewritten with a real value for VirtualBox
Vagrant.configure("2") do |config|
config.vm.base_mac = "080027000000"
end

View File

@ -0,0 +1,37 @@
# -*- mode: ruby -*-
# # vi: set ft=ruby :
# NOTE: This monkey-patching of the coreos guest plugin is a terrible
# hack that needs to be removed once the upstream plugin works with
# alpha CoreOS images.
require 'tempfile'
require Vagrant.source_root.join("plugins/guests/coreos/cap/change_host_name.rb")
CLOUD_CONFIG = <<EOF
#cloud-config
hostname: %s
EOF
module VagrantPlugins
module GuestCoreOS
module Cap
class ChangeHostName
def self.change_host_name(machine, name)
machine.communicate.tap do |comm|
temp = Tempfile.new("coreos-vagrant")
temp.binmode
temp.write(CLOUD_CONFIG % [name])
temp.close
path = "/var/tmp/hostname.yml"
path_esc = path.gsub("/", "-")
comm.upload(temp.path, path)
comm.sudo("systemctl start system-cloudinit@#{path_esc}.service")
end
end
end
end
end
end

View File

@ -0,0 +1,142 @@
# -*- mode: ruby -*-
# # vi: set ft=ruby :
# NOTE: This monkey-patching of the coreos guest plugin is a terrible
# hack that needs to be removed once the upstream plugin works with
# alpha CoreOS images.
require 'tempfile'
require 'ipaddr'
require 'log4r'
require Vagrant.source_root.join("plugins/guests/coreos/cap/configure_networks.rb")
BASE_CLOUD_CONFIG = <<EOF
#cloud-config
write_files:
- path: /etc/environment
content: |
COREOS_PUBLIC_IPV4=%s
COREOS_PRIVATE_IPV4=%s
coreos:
units:
EOF
NETWORK_UNIT = <<EOF
- name: %s
runtime: no
content: |
[Match]
%s
[Network]
Address=%s
EOF
# Borrowed from http://stackoverflow.com/questions/1825928/netmask-to-cidr-in-ruby
IPAddr.class_eval do
def to_cidr
self.to_i.to_s(2).count("1")
end
end
module VagrantPlugins
module GuestCoreOS
module Cap
class ConfigureNetworks
@@logger = Log4r::Logger.new("vagrant::guest::coreos::configure_networks")
def self.configure_networks(machine, networks)
public_ipv4, private_ipv4 = get_environment_ips(machine, "127.0.0.1")
cfg = BASE_CLOUD_CONFIG % [public_ipv4, private_ipv4]
# Define network units by mac address if possible.
match_rules = {}
if false
#if machine.provider.capability?(:nic_mac_addresses)
# untested, required feature hasn't made it into a release yet
match_rules = match_by_mac(machine)
else
match_rules = match_by_name(machine)
end
@@logger.debug("Networks: #{networks.inspect}")
@@logger.debug("Interfaces: #{match_rules.inspect}")
# Generate any static networks, let DHCP handle the rest
networks.each do |network|
next if network[:type].to_sym != :static
interface = network[:interface].to_i
unit_name = "50-vagrant%d.network" % [interface]
match = match_rules[interface]
if match.nil?
@@logger.warn("Could not find match rule for network #{network.inspect}")
next
end
cidr = IPAddr.new(network[:netmask]).to_cidr
address = "%s/%s" % [network[:ip], cidr]
cfg << NETWORK_UNIT % [unit_name, match, address]
end
machine.communicate.tap do |comm|
temp = Tempfile.new("coreos-vagrant")
temp.binmode
temp.write(cfg)
temp.close
path = "/var/tmp/networks.yml"
path_esc = path.gsub("/", "-")
comm.upload(temp.path, path)
comm.sudo("systemctl start system-cloudinit@#{path_esc}.service")
end
end
# Find IP addresses to export in /etc/environment. This only works
# for static addresses defined in the user's Vagrantfile.
def self.get_environment_ips(machine, default)
public_ipv4 = nil
private_ipv4 = nil
machine.config.vm.networks.each do |type, options|
next if !options[:ip]
if type == :public_network
public_ipv4 = options[:ip]
elsif type == :private_network
private_ipv4 = options[:ip]
end
end
# Fall back to localhost if no static networks are configured.
private_ipv4 ||= default
public_ipv4 ||= private_ipv4
return [public_ipv4, private_ipv4]
end
def self.match_by_name(machine)
match = {}
machine.communicate.tap do |comm|
comm.sudo("ifconfig -a | grep ^en | cut -f1 -d:") do |_, result|
result.split("\n").each_with_index do |name, interface|
match[interface] = "Name=#{name}"
end
end
end
match
end
def self.match_by_mac(machine)
match = {}
macs = machine.provider.capability(:nic_mac_addresses)
macs.each do |adapter, address|
# The adapter list from VirtualBox is 1 indexed instead of 0
interface = adapter.to_i - 1
match[interface] = "MACAddress=#{address}"
end
match
end
end
end
end
end

View File

@ -1,15 +1,25 @@
#cloud-config #cloud-config
coreos: coreos:
units: units:
- name: coreos-cloudinit-vagrant.path - name: coreos-cloudinit-vagrant-mkdir.service
command: start command: start
runtime: no runtime: yes
content: |
[Service]
Type=oneshot
ExecStart=/bin/mkdir -p /var/lib/coreos-vagrant
- name: coreos-cloudinit-vagrant-user.path
command: start
runtime: yes
content: | content: |
[Path] [Path]
PathExists=/var/lib/coreos-vagrant/user-data PathExists=/var/lib/coreos-vagrant/vagrantfile-user-data
Unit=system-cloudinit@var-lib-coreos\x2dvagrant-user\x2ddata.service Unit=user-cloudinit@var-lib-coreos\x2dvagrant-vagrantfile\x2duser\x2ddata.service
oem: oem:
id: vagrant id: vagrant
name: Vagrant name: Vagrant
home-url: http://www.vagrantup.com/ home-url: http://www.vagrantup.com/
bug-report-url: https://github.com/coreos/coreos-overlay bug-report-url: https://github.com/coreos/coreos-overlay
ssh_authorized_keys:
- ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key

View File

@ -7,7 +7,17 @@ if [ -z "$ENV" ]; then
exit 1 exit 1
fi fi
now=$(date +%s)
timeout=$(( now + 60 ))
# just block until cloudinit updates environment # just block until cloudinit updates environment
while ! grep -qs ^COREOS_PUBLIC_IPV4 "$ENV"; do while ! grep -qs ^COREOS_PUBLIC_IPV4 "$ENV"; do
if [[ $timeout -lt $(date +%s) ]]; then
echo "No network configuration provided by Vagrant!" >&2
echo "Using localhost, for default public and private IPs" >&2
echo "COREOS_PUBLIC_IPV4=127.0.0.1" >> "$ENV"
echo "COREOS_PRIVATE_IPV4=127.0.0.1" >> "$ENV"
exit
fi
sleep 0.1 sleep 0.1
done done

View File

@ -17,8 +17,8 @@ S="${WORKDIR}"
src_install() { src_install() {
insinto "/usr/share/oem" insinto "/usr/share/oem"
doins "${FILESDIR}/authorized_keys"
doins "${FILESDIR}/cloud-config.yml" doins "${FILESDIR}/cloud-config.yml"
doins -r "${FILESDIR}/box"
into "/usr/share/oem" into "/usr/share/oem"
dobin ${FILESDIR}/coreos-setup-environment dobin ${FILESDIR}/coreos-setup-environment