Merge branch 'master' into client-certs

This commit is contained in:
Simon Thulbourn 2013-07-02 09:29:39 +01:00
commit ea9fde9433
26 changed files with 185 additions and 29 deletions

View File

@ -6,6 +6,7 @@ FEATURES:
- Added a `working_directory` configuration option to the Puppet apply
provisioner so you can specify the working directory when `puppet` is
called, making it friendly to Hiera data and such. [GH-1670]
- Ability to specify the host IP to bind forwarded ports to. [GH-1785]
IMPROVEMENTS:
@ -18,6 +19,14 @@ IMPROVEMENTS:
within an LXC container works properly now.
- Allow strings in addition to symbols to more places in V1 configuration
as well as V2 configuration.
- Add `ARPCHECK=0` to RedHat OS family network configuration. [GH-1815]
- Add SSH agent forwarding sample to initial Vagrantfile. [GH-1808]
- VirtualBox: Only configure networks if there are any to configure.
This allows linux's that don't implement this capability to work with
Vagrant. [GH-1796]
- Default SSH forwarded port now binds to 127.0.0.1 so only local
connections are allowed. [GH-1785]
- Use `netctl` for Arch Linux network configuration. [GH-1760]
BUG FIXES:
@ -27,6 +36,12 @@ BUG FIXES:
defined. [GH-1665]
- Finding V1 boxes now works properly again to avoid "box not found"
errors. [GH-1691]
- Setting hostname on SLES 11 works again. [GH-1781]
- `config.vm.guest` properly forces guests again. [GH-1800]
- The `read_ip_address` capability for linux properly reads the IP
of only the first network interface. [GH-1799]
- Validate that an IP is given for a private network. [GH-1788]
- Fix uninitialized constant error for Gentoo plugin. [GH-1698]
## 1.2.2 (April 23, 2013)

41
CONTRIBUTING.md Normal file
View File

@ -0,0 +1,41 @@
# How to contribute
We like to encourage you to contribute to the repository.
This should be as easy as possible for you but there are a few things to consider when contributing.
The following guidelines for contribution should be followed if you want to submit a pull request.
## How to prepare
* You need a [GitHub account](https://github.com/signup/free)
* Submit an [issue ticket](https://github.com/mitchellh/vagrant/issues) for your issue if the is no one yet.
* Describe the issue and include steps to reproduce when it's a bug.
* Ensure to mention the earliest version that you know is affected.
* If you plan on submitting a bug report, please submit debug-level logs along
with the report using [gist](https://gist.github.com/) or some other paste
service by prepending `VAGRANT_LOG=debug` to your `vagrant` commands.
* Fork the repository on GitHub
## Make Changes
* In your forked repository, create a topic branch for your upcoming patch.
* Usually this is based on the master branch.
* Create a branch based on master; `git branch
fix/master/my_contribution master` then checkout the new branch with `git
checkout fix/master/my_contribution`. Please avoid working directly on the `master` branch.
* Make commits of logical units and describe them properly.
* Check for unnecessary whitespace with `git diff --check` before committing.
* If possible, submit tests to your patch / new feature so it can be tested easily.
* Assure nothing is broken by running all the tests.
## Submit Changes
* Push your changes to a topic branch in your fork of the repository.
* Open a pull request to the original repository and choose the right original branch you want to patch.
* If not done in commit messages (which you really should do) please reference and update your issue with the code changes.
* Even if you have write access to the repository, do not directly push or merge pull-requests. Let another team member review your pull request and approve.
# Additional Resources
* [General GitHub documentation](http://help.github.com/)
* [GitHub pull request documentation](http://help.github.com/send-pull-requests/)

View File

@ -17,12 +17,12 @@ Vagrant.configure("2") do |config|
config.vm.client_cert = nil
config.vm.graceful_halt_retry_count = 60
config.vm.graceful_halt_retry_interval = 1
config.vm.guest = :linux
# Share SSH locally by default
config.vm.network :forwarded_port,
guest: 22,
host: 2222,
host_ip: "127.0.0.1",
id: "ssh",
auto_correct: true

View File

@ -1,3 +1,31 @@
# Autocompletion for Vagrant just put this line in your ~/.profile or link this file into it like:
# source /path/to/vagrant/contrib/bash/completion.sh
complete -W "$(echo `vagrant --help | awk '/^ /{print $1}'`;)" vagrant
_vagrant() {
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
preprev="${COMP_WORDS[COMP_CWORD-2]}"
commands=$(vagrant --help | awk '/^ /{print $1}')
if [ $COMP_CWORD == 1 ] ; then
COMPREPLY=( $(compgen -W "${commands}" -- ${cur}) )
return 0
fi
if [ $COMP_CWORD == 2 ] ; then
local sub_commands=$(vagrant $prev --help | awk '/^ /{print $1}')
COMPREPLY=( $(compgen -W "${sub_commands}" -- ${cur}) )
return 0
fi
if [[ ${cur} == -* ]] ; then
local command_opts=$(vagrant $preprev $prev --help | grep -E -o "((-\w{1}|--(\w|-)*=?)){1,2}")
COMPREPLY=( $(compgen -W "${command_opts}" -- ${cur}) )
return 0
fi
}
complete -F _vagrant vagrant
# /* vim: set filetype=sh : */

View File

@ -163,6 +163,14 @@ module Vagrant
error_key(:cli_invalid_options)
end
class CommandUnavailable < VagrantError
error_key(:command_unavailable)
end
class CommandUnavailableWindows < VagrantError
error_key(:command_unavailable_windows)
end
class ConfigInvalid < VagrantError
error_key(:config_invalid)
end

View File

@ -69,7 +69,16 @@ module Vagrant
guest_info = @guests[name]
guest = guest_info[0].new
if guest.detect?(@machine)
# If a specific guest was specified, then attempt to use that
# guest no matter what. Otherwise, only use it if it was detected.
use_this_guest = false
if @machine.config.vm.guest.nil?
use_this_guest = guest.detect?(@machine)
else
use_this_guest = @machine.config.vm.guest.to_sym == name.to_sym
end
if use_this_guest
@logger.info("Detected: #{name}!")
@chain << [name, guest]
@name = name

View File

@ -5,6 +5,7 @@ require 'log4r'
require 'vagrant/util/platform'
require 'vagrant/util/safe_chdir'
require 'vagrant/util/which'
module Vagrant
module Util
@ -26,6 +27,12 @@ module Vagrant
def initialize(*command)
@options = command.last.is_a?(Hash) ? command.pop : {}
@command = command
@command[0] = Which.which(@command[0]) if !File.file? @command[0]
if !@command[0]
raise Errors::CommandUnavailableWindows, file: command[0] if Platform.windows?
raise Errors::CommandUnavailable, file: command[0]
end
@logger = Log4r::Logger.new("vagrant::util::subprocess")
end

View File

@ -16,7 +16,7 @@ module VagrantPlugins
results = []
with_target_vms(argv) do |machine|
state = machine.state if !state
results << "#{machine.name.to_s.ljust(25)}#{machine.state.short_description} (#{machine.provider_name})"
results << "#{machine.name.to_s.ljust(25)} #{machine.state.short_description} (#{machine.provider_name})"
end
message = nil

View File

@ -13,8 +13,9 @@ module VagrantPlugins
temp.close
machine.communicate.upload(temp.path, "/tmp/vagrant_network")
machine.communicate.sudo("mv /tmp/vagrant_network /etc/network.d/interfaces/eth#{network[:interface]}")
machine.communicate.sudo("netcfg interfaces/eth#{network[:interface]}")
machine.communicate.sudo("ln -sf /dev/null /etc/udev/rules.d/80-net-name-slot.rules")
machine.communicate.sudo("mv /tmp/vagrant_network /etc/netctl/eth#{network[:interface]}")
machine.communicate.sudo("netctl start eth#{network[:interface]}")
end
end
end

View File

@ -1,5 +1,5 @@
module VagrantPlugins
module GuestFreeBSD
module GuestGentoo
module Cap
class ChangeHostName
def self.change_host_name(machine, name)

View File

@ -3,9 +3,9 @@ require "tempfile"
require "vagrant/util/template_renderer"
module VagrantPlugins
module GuestFreeBSD
module GuestGentoo
module Cap
class ChangeHostName
class ConfigureNetworks
include Vagrant::Util
def self.configure_networks(machine, networks)

View File

@ -3,13 +3,13 @@ module VagrantPlugins
module Cap
class ReadIPAddress
def self.read_ip_address(machine)
command = "ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}'"
command = "ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1 }'"
result = ""
machine.communicate.execute(command) do |type, data|
result << data if type == :stdout
end
result.chomp
result.chomp.split("\n").first
end
end
end

View File

@ -48,7 +48,7 @@ module VagrantPlugins
retryable(:on => Vagrant::Errors::VagrantError, :tries => 3, :sleep => 2) do
machine.communicate.sudo("/sbin/ifdown eth#{interface} 2> /dev/null", :error_check => false)
machine.communicate.sudo("cat /tmp/vagrant-network-entry_#{interface} >> #{network_scripts_dir}/ifcfg-eth#{interface}")
machine.communicate.sudo("/sbin/ifup eth#{interface} 2> /dev/null")
machine.communicate.sudo("ARPCHECK=no /sbin/ifup eth#{interface} 2> /dev/null")
end
machine.communicate.sudo("rm /tmp/vagrant-network-entry_#{interface}")

View File

@ -7,7 +7,7 @@ module VagrantPlugins
# Contributed by Blake Irvin <b.irvin@modcloth.com>
class Guest < Vagrant.plugin("2", :guest)
def detect?(machine)
machine.communicate.test("uname -o | grep Solaris")
machine.communicate.test("uname -s | grep SunOS")
end
end
end

View File

@ -6,7 +6,7 @@ module VagrantPlugins
machine.communicate.tap do |comm|
# Only do this if the hostname is not already set
if !comm.test("sudo hostname | grep '#{name}'")
comm.sudo("sed -i 's/\\(HOSTNAME=\\).*/\\1#{name}/' /etc/sysconfig/network")
comm.sudo("echo #{name} > /etc/HOSTNAME")
comm.sudo("hostname #{name}")
comm.sudo("sed -i 's@^\\(127[.]0[.]0[.]1[[:space:]]\\+\\)@\\1#{name} #{name.split('.')[0]} @' /etc/hosts")
end

View File

@ -27,6 +27,7 @@ module VagrantPlugins
def initialize
@graceful_halt_retry_count = UNSET_VALUE
@graceful_halt_retry_interval = UNSET_VALUE
@guest = UNSET_VALUE
@hostname = UNSET_VALUE
@provisioners = []
@ -226,8 +227,12 @@ module VagrantPlugins
def finalize!
# Defaults
@guest = nil if @guest == UNSET_VALUE
@hostname = nil if @hostname == UNSET_VALUE
# Set the guest properly
@guest = @guest.to_sym if @guest
# If we haven't defined a single VM, then we need to define a
# default VM which just inherits the rest of the configuration.
define(DEFAULT_VM_NAME) if defined_vm_keys.empty?
@ -381,6 +386,14 @@ module VagrantPlugins
fp_host_ports.add(options[:host])
end
end
if type == :private_network
if options[:type] != :dhcp
if !options[:ip]
errors << I18n.t("vagrant.config.vm.network_ip_required")
end
end
end
end
# We're done with VM level errors so prepare the section

View File

@ -70,6 +70,7 @@ module VagrantPlugins
ports << {
:adapter => fp.adapter,
:guestport => fp.guest_port,
:hostip => fp.host_ip,
:hostport => fp.host_port,
:name => fp.id,
:protocol => fp.protocol

View File

@ -111,8 +111,10 @@ module VagrantPlugins
# Only configure the networks the user requested us to configure
networks_to_configure = networks.select { |n| n[:auto_config] }
env[:ui].info I18n.t("vagrant.actions.vm.network.configuring")
env[:machine].guest.capability(:configure_networks, networks_to_configure)
if !networks_to_configure.empty?
env[:ui].info I18n.t("vagrant.actions.vm.network.configuring")
env[:machine].guest.capability(:configure_networks, networks_to_configure)
end
end
end

View File

@ -140,9 +140,9 @@ module VagrantPlugins
ports.each do |options|
pf_builder = [options[:name],
options[:protocol] || "tcp",
"",
options[:hostip] || "",
options[:hostport],
"",
options[:guestip] || "",
options[:guestport]]
args.concat(["--natpf#{options[:adapter] || 1}",

View File

@ -29,6 +29,11 @@ module VagrantPlugins
# @return [Integer]
attr_reader :guest_port
# The IP that the forwarded port will bind to on the host machine.
#
# @return [String]
attr_reader :host_ip
# The port on the host used to access the port on the guest.
#
# @return [Integer]
@ -43,6 +48,7 @@ module VagrantPlugins
@auto_correct = true
@auto_correct = options[:auto_correct] if options.has_key?(:auto_correct)
@adapter = (options[:adapter] || 1).to_i
@host_ip = options[:host_ip] || nil
@protocol = options[:protocol] || "tcp"
end

View File

@ -27,6 +27,10 @@ Vagrant.configure("2") do |config|
# your network.
# config.vm.network :public_network
# If true, then any SSH connections made will enable agent forwarding.
# Default value: false
# config.ssh.forward_agent = true
# Share an additional folder to the guest VM. The first argument is
# the path on the host to the actual folder. The second argument is
# the path on the guest to mount the folder. And the optional third

View File

@ -1,4 +1,4 @@
CONNECTION='ethernet'
DESCRIPTION='A basic dhcp ethernet connection'
INTERFACE='eth<%= options[:interface] %>'
IP='dhcp'
Description='A basic dhcp ethernet connection'
Interface=eth<%= options[:interface] %>
Connection=ethernet
IP=dhcp

View File

@ -1,6 +1,5 @@
CONNECTION='ethernet'
DESCRIPTION='A basic static ethernet connection'
INTERFACE='eth<%= options[:interface] %>'
IP='static'
ADDR='<%= options[:ip]%>'
NETMASK='<%= options[:netmask] %>'
Connection=ethernet
Description='A basic static ethernet connection'
Interface=eth<%= options[:interface] %>
IP=static
Address=('<%= options[:ip]%>/24')

View File

@ -167,6 +167,14 @@ en:
available below.
%{help}
command_unavailable: |-
The executable '%(file)' Vagrant is trying to run was not
found in the PATH variable. This is an error. Please verify
this software is installed and on the path.
command_unavailable_windows: |-
The executable '%(file)' Vagrant is trying to run was not
found in the %PATH% variable. This is an error. Please verify
this software is installed and on the path.
config_invalid: |-
There are errors in the configuration of this machine. Please fix
the following errors and try again:
@ -613,6 +621,8 @@ en:
nfs_requires_host: |-
Using NFS shared folders requires a host to be specified
using `config.vagrant.host`.
network_ip_required: |-
An IP is required for a private network.
network_fp_host_not_unique: |-
Forwarded port '%{host}' (host port) is declared multiple times
network_fp_requires_ports: |-

View File

@ -10,6 +10,9 @@ describe Vagrant::Guest do
let(:machine) do
double("machine").tap do |m|
m.stub(:inspect => "machine")
m.stub(:config => double("config"))
m.config.stub(:vm => double("vm_config"))
m.config.vm.stub(:guest => nil)
end
end
@ -143,6 +146,16 @@ describe Vagrant::Guest do
subject.chain.map { |x| x[1] }.map(&:name).should == [:baz, :bar, :foo]
end
it "detects the forced guest setting" do
register_guest(:foo, nil, false)
register_guest(:bar, nil, false)
machine.config.vm.stub(:guest => :bar)
subject.detect!
subject.name.should == :bar
end
it "raises an exception if no guest can be detected" do
expect { subject.detect! }.
to raise_error(Vagrant::Errors::GuestNotDetected)

View File

@ -17,7 +17,6 @@ Gem::Specification.new do |s|
s.add_dependency "childprocess", "~> 0.3.7"
s.add_dependency "erubis", "~> 2.7.0"
s.add_dependency "i18n", "~> 0.6.0"
s.add_dependency "json", ">= 1.5.1", "< 1.8.0"
s.add_dependency "log4r", "~> 1.1.9"
s.add_dependency "net-ssh", "~> 2.6.6"
s.add_dependency "net-scp", "~> 1.1.0"