vagrant 0.7.0.beta → 0.7.0.beta2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/CHANGELOG.md +26 -0
- data/Gemfile +0 -8
- data/config/default.rb +1 -2
- data/contrib/README.md +12 -0
- data/contrib/emacs/vagrant.el +8 -0
- data/contrib/vim/vagrantfile.vim +9 -0
- data/lib/vagrant.rb +14 -18
- data/lib/vagrant/action.rb +12 -0
- data/lib/vagrant/action/box.rb +11 -0
- data/lib/vagrant/action/box/download.rb +0 -1
- data/lib/vagrant/action/env.rb +7 -0
- data/lib/vagrant/action/general.rb +8 -0
- data/lib/vagrant/action/vm.rb +30 -0
- data/lib/vagrant/action/vm/boot.rb +3 -2
- data/lib/vagrant/action/vm/check_box.rb +1 -0
- data/lib/vagrant/action/vm/network.rb +1 -1
- data/lib/vagrant/action/vm/nfs.rb +3 -1
- data/lib/vagrant/action/vm/provision.rb +14 -25
- data/lib/vagrant/action/vm/share_folders.rb +11 -4
- data/lib/vagrant/command.rb +25 -0
- data/lib/vagrant/config.rb +78 -128
- data/lib/vagrant/config/base.rb +17 -3
- data/lib/vagrant/config/ssh.rb +1 -0
- data/lib/vagrant/config/top.rb +61 -0
- data/lib/vagrant/config/vagrant.rb +1 -6
- data/lib/vagrant/config/vm.rb +34 -20
- data/lib/vagrant/config/vm/provisioner.rb +56 -0
- data/lib/vagrant/config/vm/sub_vm.rb +17 -0
- data/lib/vagrant/downloaders.rb +7 -0
- data/lib/vagrant/downloaders/file.rb +1 -0
- data/lib/vagrant/downloaders/http.rb +9 -0
- data/lib/vagrant/environment.rb +25 -13
- data/lib/vagrant/errors.rb +0 -15
- data/lib/vagrant/hosts.rb +7 -0
- data/lib/vagrant/provisioners.rb +8 -0
- data/lib/vagrant/provisioners/base.rb +19 -1
- data/lib/vagrant/provisioners/chef.rb +31 -52
- data/lib/vagrant/provisioners/chef_server.rb +34 -10
- data/lib/vagrant/provisioners/chef_solo.rb +31 -9
- data/lib/vagrant/provisioners/puppet.rb +70 -60
- data/lib/vagrant/provisioners/puppet_server.rb +57 -0
- data/lib/vagrant/ssh.rb +3 -72
- data/lib/vagrant/ssh/session.rb +81 -0
- data/lib/vagrant/systems.rb +9 -0
- data/lib/vagrant/systems/base.rb +16 -1
- data/lib/vagrant/systems/debian.rb +26 -0
- data/lib/vagrant/systems/gentoo.rb +27 -0
- data/lib/vagrant/systems/linux.rb +14 -56
- data/lib/vagrant/systems/linux/config.rb +21 -0
- data/lib/vagrant/systems/linux/error.rb +9 -0
- data/lib/vagrant/systems/redhat.rb +31 -0
- data/lib/vagrant/test_helpers.rb +1 -1
- data/lib/vagrant/version.rb +1 -1
- data/lib/vagrant/vm.rb +25 -5
- data/templates/chef_solo_solo.erb +11 -3
- data/templates/locales/en.yml +65 -25
- data/templates/{network_entry.erb → network_entry_debian.erb} +0 -0
- data/templates/network_entry_gentoo.erb +7 -0
- data/templates/network_entry_redhat.erb +8 -0
- data/test/vagrant/action/vm/check_box_test.rb +1 -0
- data/test/vagrant/action/vm/nfs_test.rb +7 -1
- data/test/vagrant/action/vm/provision_test.rb +24 -79
- data/test/vagrant/action/vm/share_folders_test.rb +6 -1
- data/test/vagrant/command/helpers_test.rb +2 -2
- data/test/vagrant/config/base_test.rb +0 -6
- data/test/vagrant/config/vagrant_test.rb +0 -8
- data/test/vagrant/config/vm/provisioner_test.rb +92 -0
- data/test/vagrant/config/vm_test.rb +8 -0
- data/test/vagrant/config_test.rb +49 -89
- data/test/vagrant/downloaders/file_test.rb +18 -4
- data/test/vagrant/environment_test.rb +36 -12
- data/test/vagrant/provisioners/base_test.rb +28 -1
- data/test/vagrant/provisioners/chef_server_test.rb +50 -41
- data/test/vagrant/provisioners/chef_solo_test.rb +39 -16
- data/test/vagrant/provisioners/chef_test.rb +11 -81
- data/test/vagrant/provisioners/puppet_server_test.rb +69 -0
- data/test/vagrant/provisioners/puppet_test.rb +69 -54
- data/test/vagrant/{ssh_session_test.rb → ssh/session_test.rb} +0 -0
- data/test/vagrant/ssh_test.rb +12 -1
- data/test/vagrant/systems/base_test.rb +18 -0
- data/test/vagrant/systems/linux_test.rb +2 -2
- data/test/vagrant/vm_test.rb +33 -5
- data/vagrant.gemspec +6 -5
- metadata +42 -16
- data/lib/vagrant/util/glob_loader.rb +0 -24
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,29 @@
|
|
1
|
+
## 0.7.0.beta2 (January 13, 2010)
|
2
|
+
|
3
|
+
- Puppet server provisioner. [GH-262]
|
4
|
+
- Use numeric uid/gid in mounting shared folders to increase portability. [GH-252]
|
5
|
+
- HTTP downloading follows redirects. [GH-163]
|
6
|
+
- Downloaders have clearer output to note what they're doing.
|
7
|
+
- Shared folders with no guest path are not automounted. [GH-184]
|
8
|
+
- Boxes downloaded during `vagrant up` reload the Vagrantfile config, which
|
9
|
+
fixes a problem with box settings not being properly loaded. [GH-231]
|
10
|
+
- `config.ssh.forward_x11` to enable the ForwardX11 SSH option. [GH-255]
|
11
|
+
- Vagrant source now has a `contrib` directory where contributions of miscellaneous
|
12
|
+
addons for Vagrant will be added.
|
13
|
+
- Vagrantfiles are now loaded only once (instead of 4+ times) [GH-238]
|
14
|
+
- Ability to move home vagrant dir (~/.vagrant) by setting VAGRANT_HOME
|
15
|
+
environmental variable.
|
16
|
+
- Removed check and error for the "OSE" version of VirtualBox, since with
|
17
|
+
VirtualBox 4 this distinction no longer exists.
|
18
|
+
- Ability to specify proxy settings for chef. [GH-169]
|
19
|
+
- Helpful error message shown if NFS mounting fails. [GH-135]
|
20
|
+
- Gentoo guests now support host only networks. [GH-240]
|
21
|
+
- RedHat (CentOS included) guests now support host only networks. [GH-260]
|
22
|
+
- New Vagrantfile syntax for enabling and configuring provisioners. This
|
23
|
+
change is not backwards compatible. [GH-265]
|
24
|
+
- Provisioners are now RVM-friendly, meaning if you installed chef or puppet
|
25
|
+
with an RVM managed Ruby, Vagrant now finds then. [GH-254]
|
26
|
+
|
1
27
|
## 0.7.0.beta (December 24, 2010)
|
2
28
|
|
3
29
|
- VirtualBox 4.0 support. Support for VirtualBox 3.2 is _dropped_, since
|
data/Gemfile
CHANGED
data/config/default.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
Vagrant::Config.run do |config|
|
2
2
|
# default config goes here
|
3
3
|
config.vagrant.dotfile_name = ".vagrant"
|
4
|
-
config.vagrant.home = "~/.vagrant"
|
5
4
|
config.vagrant.host = :detect
|
6
5
|
|
7
6
|
config.ssh.username = "vagrant"
|
@@ -12,6 +11,7 @@ Vagrant::Config.run do |config|
|
|
12
11
|
config.ssh.timeout = 30
|
13
12
|
config.ssh.private_key_path = File.expand_path("keys/vagrant", Vagrant.source_root)
|
14
13
|
config.ssh.forward_agent = false
|
14
|
+
config.ssh.forward_x11 = false
|
15
15
|
|
16
16
|
config.vm.auto_port_range = (2200..2250)
|
17
17
|
config.vm.box_ovf = "box.ovf"
|
@@ -19,7 +19,6 @@ Vagrant::Config.run do |config|
|
|
19
19
|
config.vm.base_mac = nil
|
20
20
|
config.vm.forward_port("ssh", 22, 2222, :auto => true)
|
21
21
|
config.vm.disk_image_format = 'VMDK'
|
22
|
-
config.vm.provisioner = nil
|
23
22
|
config.vm.shared_folder_uid = nil
|
24
23
|
config.vm.shared_folder_gid = nil
|
25
24
|
config.vm.boot_mode = "vrdp"
|
data/contrib/README.md
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
# Vagrant Contrib
|
2
|
+
|
3
|
+
Miscellaneous contributions which assist people in using Vagrant will
|
4
|
+
make their way into this directory. An up-to-date list of short descriptions
|
5
|
+
for each item will be kept below.
|
6
|
+
|
7
|
+
## List of Contrib Items
|
8
|
+
|
9
|
+
* `emacs` - Contains a file showing how to associate `Vagrantfile` with
|
10
|
+
Ruby syntax highlighting.
|
11
|
+
* `vim` - Contains a `.vim` file for enabling Ruby syntax highlighting
|
12
|
+
for `Vagrantfile`s.
|
@@ -0,0 +1,8 @@
|
|
1
|
+
;;--------------------------------------------------------------------
|
2
|
+
;; Teach emacs to syntax highlight Vagrantfile as Ruby.
|
3
|
+
;;
|
4
|
+
;; Installation: Copy the line below into your emacs configuration,
|
5
|
+
;; or drop this file anywhere in your "~/.emacs.d" directory and be
|
6
|
+
;; sure to "load" it.
|
7
|
+
;;--------------------------------------------------------------------
|
8
|
+
(add-to-list 'auto-mode-alist '("Vagrantfile$" . ruby-mode))
|
data/lib/vagrant.rb
CHANGED
@@ -4,25 +4,21 @@ require 'i18n'
|
|
4
4
|
require 'virtualbox'
|
5
5
|
|
6
6
|
module Vagrant
|
7
|
-
|
8
|
-
# start small, but slowly move everything over.
|
9
|
-
|
7
|
+
autoload :Action, 'vagrant/action'
|
10
8
|
autoload :Box, 'vagrant/box'
|
11
9
|
autoload :BoxCollection, 'vagrant/box_collection'
|
12
10
|
autoload :CLI, 'vagrant/cli'
|
13
11
|
autoload :Config, 'vagrant/config'
|
14
12
|
autoload :DataStore, 'vagrant/data_store'
|
13
|
+
autoload :Downloaders, 'vagrant/downloaders'
|
14
|
+
autoload :Environment, 'vagrant/environment'
|
15
15
|
autoload :Errors, 'vagrant/errors'
|
16
|
+
autoload :Hosts, 'vagrant/hosts'
|
16
17
|
autoload :Plugin, 'vagrant/plugin'
|
17
18
|
autoload :TestHelpers, 'vagrant/test_helpers'
|
19
|
+
autoload :UI, 'vagrant/ui'
|
18
20
|
autoload :Util, 'vagrant/util'
|
19
|
-
|
20
|
-
module Command
|
21
|
-
autoload :Base, 'vagrant/command/base'
|
22
|
-
autoload :GroupBase, 'vagrant/command/group_base'
|
23
|
-
autoload :Helpers, 'vagrant/command/helpers'
|
24
|
-
autoload :NamedBase, 'vagrant/command/named_base'
|
25
|
-
end
|
21
|
+
autoload :VM, 'vagrant/vm'
|
26
22
|
|
27
23
|
# The source root is the path to the root directory of
|
28
24
|
# the Vagrant gem.
|
@@ -34,13 +30,13 @@ end
|
|
34
30
|
# Default I18n to load the en locale
|
35
31
|
I18n.load_path << File.expand_path("templates/locales/en.yml", Vagrant.source_root)
|
36
32
|
|
37
|
-
# Load
|
38
|
-
#
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
33
|
+
# Load the things which must be loaded before anything else. Note that
|
34
|
+
# I'm not sure why 'vagrant/ssh' must be loaded. But if I don't, I get
|
35
|
+
# a very scary "unsupported cipher" error from net-ssh for no apparent reason.
|
36
|
+
require 'vagrant/command'
|
37
|
+
require 'vagrant/provisioners'
|
38
|
+
require 'vagrant/systems'
|
39
|
+
require 'vagrant/ssh'
|
40
|
+
require 'vagrant/version'
|
45
41
|
Vagrant::Action.builtin!
|
46
42
|
Vagrant::Plugin.load!
|
data/lib/vagrant/action.rb
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
require 'vagrant/action/builder'
|
2
|
+
require 'vagrant/action/builtin'
|
3
|
+
|
4
|
+
# The builtin middlewares
|
5
|
+
require 'vagrant/action/box'
|
6
|
+
require 'vagrant/action/env'
|
7
|
+
require 'vagrant/action/general'
|
8
|
+
require 'vagrant/action/vm'
|
9
|
+
|
1
10
|
module Vagrant
|
2
11
|
# Manages action running and registration. Every Vagrant environment
|
3
12
|
# has an instance of {Action} to allow for running in the context of
|
@@ -44,6 +53,9 @@ module Vagrant
|
|
44
53
|
# Where `:name` is the name of the registered action.
|
45
54
|
#
|
46
55
|
class Action
|
56
|
+
autoload :Environment, 'vagrant/action/environment'
|
57
|
+
autoload :Warden, 'vagrant/action/warden'
|
58
|
+
|
47
59
|
include Util
|
48
60
|
@@reported_interrupt = false
|
49
61
|
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Vagrant
|
2
|
+
class Action
|
3
|
+
module Box
|
4
|
+
autoload :Destroy, 'vagrant/action/box/destroy'
|
5
|
+
autoload :Download, 'vagrant/action/box/download'
|
6
|
+
autoload :Package, 'vagrant/action/box/package'
|
7
|
+
autoload :Unpackage, 'vagrant/action/box/unpackage'
|
8
|
+
autoload :Verify, 'vagrant/action/box/verify'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Vagrant
|
2
|
+
class Action
|
3
|
+
module VM
|
4
|
+
autoload :Boot, 'vagrant/action/vm/boot'
|
5
|
+
autoload :CheckBox, 'vagrant/action/vm/check_box'
|
6
|
+
autoload :CheckGuestAdditions, 'vagrant/action/vm/check_guest_additions'
|
7
|
+
autoload :CleanMachineFolder, 'vagrant/action/vm/clean_machine_folder'
|
8
|
+
autoload :ClearForwardedPorts, 'vagrant/action/vm/clear_forwarded_ports'
|
9
|
+
autoload :ClearNFSExports, 'vagrant/action/vm/clear_nfs_exports'
|
10
|
+
autoload :ClearSharedFolders, 'vagrant/action/vm/clear_shared_folders'
|
11
|
+
autoload :Customize, 'vagrant/action/vm/customize'
|
12
|
+
autoload :Destroy, 'vagrant/action/vm/destroy'
|
13
|
+
autoload :DestroyUnusedNetworkInterfaces, 'vagrant/action/vm/destroy_unused_network_interfaces'
|
14
|
+
autoload :DiscardState, 'vagrant/action/vm/discard_state'
|
15
|
+
autoload :Export, 'vagrant/action/vm/export'
|
16
|
+
autoload :ForwardPorts, 'vagrant/action/vm/forward_ports'
|
17
|
+
autoload :Halt, 'vagrant/action/vm/halt'
|
18
|
+
autoload :Import, 'vagrant/action/vm/import'
|
19
|
+
autoload :MatchMACAddress, 'vagrant/action/vm/match_mac_address'
|
20
|
+
autoload :Network, 'vagrant/action/vm/network'
|
21
|
+
autoload :NFS, 'vagrant/action/vm/nfs'
|
22
|
+
autoload :Package, 'vagrant/action/vm/package'
|
23
|
+
autoload :PackageVagrantfile, 'vagrant/action/vm/package_vagrantfile'
|
24
|
+
autoload :Provision, 'vagrant/action/vm/provision'
|
25
|
+
autoload :Resume, 'vagrant/action/vm/resume'
|
26
|
+
autoload :ShareFolders, 'vagrant/action/vm/share_folders'
|
27
|
+
autoload :Suspend, 'vagrant/action/vm/suspend'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -13,6 +13,7 @@ module Vagrant
|
|
13
13
|
# Start up the VM and wait for it to boot.
|
14
14
|
boot
|
15
15
|
raise Errors::VMFailedToBoot if !wait_for_boot
|
16
|
+
|
16
17
|
@app.call(env)
|
17
18
|
end
|
18
19
|
|
@@ -24,7 +25,7 @@ module Vagrant
|
|
24
25
|
def wait_for_boot
|
25
26
|
@env.ui.info I18n.t("vagrant.actions.vm.boot.waiting")
|
26
27
|
|
27
|
-
@env
|
28
|
+
@env["config"].ssh.max_tries.to_i.times do |i|
|
28
29
|
if @env["vm"].ssh.up?
|
29
30
|
@env.ui.info I18n.t("vagrant.actions.vm.boot.ready")
|
30
31
|
return true
|
@@ -34,7 +35,7 @@ module Vagrant
|
|
34
35
|
# get shown
|
35
36
|
return true if @env.interrupted?
|
36
37
|
|
37
|
-
sleep
|
38
|
+
sleep 2 if !@env["vagrant.test"]
|
38
39
|
end
|
39
40
|
|
40
41
|
@env.ui.error I18n.t("vagrant.actions.vm.boot.failed")
|
@@ -25,8 +25,8 @@ module Vagrant
|
|
25
25
|
|
26
26
|
if enable_network?
|
27
27
|
@env.ui.info I18n.t("vagrant.actions.vm.network.enabling")
|
28
|
-
@env["vm"].system.prepare_host_only_network
|
29
28
|
@env.env.config.vm.network_options.compact.each do |network_options|
|
29
|
+
@env["vm"].system.prepare_host_only_network(network_options)
|
30
30
|
@env["vm"].system.enable_host_only_network(network_options)
|
31
31
|
end
|
32
32
|
end
|
@@ -113,7 +113,9 @@ module Vagrant
|
|
113
113
|
def mount_folders
|
114
114
|
@env.ui.info I18n.t("vagrant.actions.vm.nfs.mounting")
|
115
115
|
|
116
|
-
|
116
|
+
# Only mount the folders which have a guest path specified
|
117
|
+
am_folders = folders.select { |name, folder| folder[:guestpath] }
|
118
|
+
@env["vm"].system.mount_nfs(host_ip, Hash[am_folders])
|
117
119
|
end
|
118
120
|
|
119
121
|
# Returns the IP address of the first host only network adapter
|
@@ -2,49 +2,38 @@ module Vagrant
|
|
2
2
|
class Action
|
3
3
|
module VM
|
4
4
|
class Provision
|
5
|
+
attr_reader :provisioners
|
6
|
+
|
5
7
|
def initialize(app, env)
|
6
8
|
@app = app
|
7
9
|
@env = env
|
8
10
|
@env["provision.enabled"] = true if !@env.has_key?("provision.enabled")
|
11
|
+
@provisioners = []
|
9
12
|
|
10
|
-
|
13
|
+
load_provisioners if provisioning_enabled?
|
11
14
|
end
|
12
15
|
|
13
16
|
def call(env)
|
14
17
|
@app.call(env)
|
15
18
|
|
16
|
-
|
17
|
-
@env.ui.info I18n.t("vagrant.actions.vm.provision.beginning")
|
18
|
-
|
19
|
+
@provisioners.each do |instance|
|
20
|
+
@env.ui.info I18n.t("vagrant.actions.vm.provision.beginning", :provisioner => instance.class)
|
21
|
+
instance.provision!
|
19
22
|
end
|
20
23
|
end
|
21
24
|
|
22
25
|
def provisioning_enabled?
|
23
|
-
!@env["config"].vm.
|
26
|
+
!@env["config"].vm.provisioners.empty? && @env["provision.enabled"]
|
24
27
|
end
|
25
28
|
|
26
|
-
def
|
27
|
-
|
28
|
-
|
29
|
-
if provisioner.is_a?(Class)
|
30
|
-
@provisioner = provisioner.new(@env)
|
31
|
-
raise Errors::ProvisionInvalidClass if !@provisioner.is_a?(Provisioners::Base)
|
32
|
-
elsif provisioner.is_a?(Symbol)
|
33
|
-
# We have a few hard coded provisioners for built-ins
|
34
|
-
mapping = {
|
35
|
-
:chef_solo => Provisioners::ChefSolo,
|
36
|
-
:chef_server => Provisioners::ChefServer,
|
37
|
-
:puppet => Provisioners::Puppet
|
38
|
-
}
|
29
|
+
def load_provisioners
|
30
|
+
@env["config"].vm.provisioners.each do |provisioner|
|
31
|
+
@env.ui.info I18n.t("vagrant.actions.vm.provision.enabled", :provisioner => provisioner.shortcut)
|
39
32
|
|
40
|
-
|
41
|
-
|
42
|
-
@
|
33
|
+
instance = provisioner.provisioner.new(@env, provisioner.config)
|
34
|
+
instance.prepare
|
35
|
+
@provisioners << instance
|
43
36
|
end
|
44
|
-
|
45
|
-
@env.ui.info I18n.t("vagrant.actions.vm.provision.enabled", :provisioner => @provisioner.class.to_s)
|
46
|
-
@provisioner.prepare
|
47
|
-
@provisioner
|
48
37
|
end
|
49
38
|
end
|
50
39
|
end
|
@@ -50,10 +50,17 @@ module Vagrant
|
|
50
50
|
|
51
51
|
@env["vm"].ssh.execute do |ssh|
|
52
52
|
shared_folders.each do |name, data|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
53
|
+
if data[:guestpath]
|
54
|
+
# Guest path specified, so mount the folder to specified point
|
55
|
+
@env.ui.info(I18n.t("vagrant.actions.vm.share_folders.mounting_entry",
|
56
|
+
:name => name,
|
57
|
+
:guest_path => data[:guestpath]))
|
58
|
+
@env["vm"].system.mount_shared_folder(ssh, name, data[:guestpath])
|
59
|
+
else
|
60
|
+
# If no guest path is specified, then automounting is disabled
|
61
|
+
@env.ui.info(I18n.t("vagrant.actions.vm.share_folders.nomount_entry",
|
62
|
+
:name => name))
|
63
|
+
end
|
57
64
|
end
|
58
65
|
end
|
59
66
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Vagrant
|
2
|
+
module Command
|
3
|
+
autoload :Base, 'vagrant/command/base'
|
4
|
+
autoload :GroupBase, 'vagrant/command/group_base'
|
5
|
+
autoload :Helpers, 'vagrant/command/helpers'
|
6
|
+
autoload :NamedBase, 'vagrant/command/named_base'
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
# The built-in commands must always be loaded
|
11
|
+
require 'vagrant/command/box'
|
12
|
+
require 'vagrant/command/destroy'
|
13
|
+
require 'vagrant/command/halt'
|
14
|
+
require 'vagrant/command/init'
|
15
|
+
require 'vagrant/command/package'
|
16
|
+
require 'vagrant/command/provision'
|
17
|
+
require 'vagrant/command/reload'
|
18
|
+
require 'vagrant/command/resume'
|
19
|
+
require 'vagrant/command/ssh'
|
20
|
+
require 'vagrant/command/ssh_config'
|
21
|
+
require 'vagrant/command/status'
|
22
|
+
require 'vagrant/command/suspend'
|
23
|
+
require 'vagrant/command/up'
|
24
|
+
require 'vagrant/command/upgrade_to_060'
|
25
|
+
require 'vagrant/command/version'
|
data/lib/vagrant/config.rb
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
require 'vagrant/config/base'
|
2
2
|
require 'vagrant/config/error_recorder'
|
3
|
+
require 'vagrant/config/top'
|
4
|
+
|
5
|
+
# The built-in configuration classes
|
6
|
+
require 'vagrant/config/vagrant'
|
7
|
+
require 'vagrant/config/ssh'
|
8
|
+
require 'vagrant/config/nfs'
|
9
|
+
require 'vagrant/config/vm'
|
10
|
+
require 'vagrant/config/package'
|
3
11
|
|
4
12
|
module Vagrant
|
5
13
|
# The config class is responsible for loading Vagrant configurations, which
|
@@ -17,157 +25,99 @@ module Vagrant
|
|
17
25
|
# class you are looking for. Loading configuration is quite easy. The following
|
18
26
|
# example assumes `env` is already a loaded instance of {Environment}:
|
19
27
|
#
|
20
|
-
# config = Vagrant::Config.new
|
21
|
-
# config.
|
22
|
-
#
|
28
|
+
# config = Vagrant::Config.new
|
29
|
+
# config.set(:first, "/path/to/some/Vagrantfile")
|
30
|
+
# config.set(:second, "/path/to/another/Vagrantfile")
|
31
|
+
# config.load_order = [:first, :second]
|
32
|
+
# result = config.load(env)
|
23
33
|
#
|
24
34
|
# p "Your box is: #{result.vm.box}"
|
25
35
|
#
|
36
|
+
# The load order determines what order the config files specified are loaded.
|
37
|
+
# If a key is not mentioned (for example if above the load order was set to
|
38
|
+
# `[:first]`, therefore `:second` was not mentioned), then that config file
|
39
|
+
# won't be loaded.
|
26
40
|
class Config
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
attr_reader :queue
|
32
|
-
|
33
|
-
class << self
|
34
|
-
# Resets the current loaded config object to the specified environment.
|
35
|
-
# This clears the proc stack and initializes a new {Top} for loading.
|
36
|
-
# This method shouldn't be called directly, instead use an instance of this
|
37
|
-
# class for config loading.
|
38
|
-
#
|
39
|
-
# @param [Environment] env
|
40
|
-
def reset!(env=nil)
|
41
|
-
@@config = nil
|
42
|
-
proc_stack.clear
|
41
|
+
# An array of symbols specifying the load order for the procs.
|
42
|
+
attr_accessor :load_order
|
43
|
+
attr_reader :procs
|
43
44
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
# Adds the given proc/block to the stack of config procs which are all
|
56
|
-
# run later on a single config object. This is the main way to configure
|
57
|
-
# Vagrant, and is how all Vagrantfiles are formatted:
|
58
|
-
#
|
59
|
-
# Vagrant::Config.run do |config|
|
60
|
-
# # ...
|
61
|
-
# end
|
62
|
-
#
|
63
|
-
def run(&block)
|
64
|
-
push_proc(&block)
|
65
|
-
end
|
66
|
-
|
67
|
-
# Executes all the config procs onto the currently loaded {Top} object,
|
68
|
-
# and returns the final configured object. This also validates the
|
69
|
-
# configuration by calling {Top#validate!} on every configuration
|
70
|
-
# class.
|
71
|
-
def execute!
|
72
|
-
config_object ||= config
|
73
|
-
run_procs!(config_object)
|
74
|
-
config_object
|
75
|
-
end
|
45
|
+
# This is the method which is called by all Vagrantfiles to configure Vagrant.
|
46
|
+
# This method expects a block which accepts a single argument representing
|
47
|
+
# an instance of the {Config::Top} class.
|
48
|
+
#
|
49
|
+
# Note that the block is not run immediately. Instead, it's proc is stored
|
50
|
+
# away for execution later.
|
51
|
+
def self.run(&block)
|
52
|
+
# Store it for later
|
53
|
+
@last_procs ||= []
|
54
|
+
@last_procs << block
|
76
55
|
end
|
77
56
|
|
78
|
-
#
|
57
|
+
# Returns the last proc which was activated for the class via {run}. This
|
58
|
+
# also sets the last proc to `nil` so that calling this method multiple times
|
59
|
+
# will not return duplicates.
|
79
60
|
#
|
80
|
-
# @
|
81
|
-
|
82
|
-
|
83
|
-
@
|
84
|
-
|
61
|
+
# @return [Proc]
|
62
|
+
def self.last_proc
|
63
|
+
value = @last_procs
|
64
|
+
@last_procs = nil
|
65
|
+
value
|
85
66
|
end
|
86
67
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
self.class.reset!(@env)
|
68
|
+
def initialize(parent=nil)
|
69
|
+
@procs = {}
|
70
|
+
@load_order = []
|
91
71
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
rescue SyntaxError => e
|
97
|
-
# Report syntax errors in a nice way for Vagrantfiles
|
98
|
-
raise Errors::VagrantfileSyntaxError, :file => e.message
|
99
|
-
end
|
100
|
-
elsif item.is_a?(Proc)
|
101
|
-
self.class.run(&item)
|
102
|
-
end
|
72
|
+
if parent
|
73
|
+
# Shallow copy the procs and load order from parent if given
|
74
|
+
@procs = parent.procs.dup
|
75
|
+
@load_order = parent.load_order.dup
|
103
76
|
end
|
77
|
+
end
|
104
78
|
|
105
|
-
|
79
|
+
# Adds a Vagrantfile to be loaded to the queue of config procs. Note
|
80
|
+
# that this causes the Vagrantfile file to be loaded at this point,
|
81
|
+
# and it will never be loaded again.
|
82
|
+
def set(key, path)
|
83
|
+
return if @procs.has_key?(key)
|
84
|
+
@procs[key] = [path].flatten.map(&method(:proc_for)).flatten
|
106
85
|
end
|
107
|
-
end
|
108
86
|
|
109
|
-
|
110
|
-
#
|
111
|
-
#
|
112
|
-
# classes. This is the object which is returned by {Environment#config}
|
113
|
-
# and has accessors to all other configuration classes.
|
87
|
+
# Loads the added procs using the set `load_order` attribute and returns
|
88
|
+
# the {Config::Top} object result. The configuration is loaded for the
|
89
|
+
# given {Environment} object.
|
114
90
|
#
|
115
|
-
#
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
# Registers a configuration class with the given key. This method shouldn't
|
127
|
-
# be called. Instead, inherit from {Base} and call {Base.configures}.
|
128
|
-
def configures(key, klass)
|
129
|
-
configures_list[key] = klass
|
130
|
-
attr_reader key.to_sym
|
91
|
+
# @param [Environment] env
|
92
|
+
def load(env)
|
93
|
+
config = Top.new(env)
|
94
|
+
|
95
|
+
# Only run the procs specified in the load order, in the order
|
96
|
+
# specified.
|
97
|
+
load_order.each do |key|
|
98
|
+
if @procs[key]
|
99
|
+
@procs[key].each do |proc|
|
100
|
+
proc.call(config) if proc
|
101
|
+
end
|
131
102
|
end
|
132
103
|
end
|
133
104
|
|
134
|
-
|
135
|
-
|
136
|
-
config = klass.new
|
137
|
-
config.env = env
|
138
|
-
config.top = self
|
139
|
-
instance_variable_set("@#{key}".to_sym, config)
|
140
|
-
end
|
105
|
+
config
|
106
|
+
end
|
141
107
|
|
142
|
-
|
143
|
-
end
|
108
|
+
protected
|
144
109
|
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
# the method that checks all the validation, not one which defines
|
149
|
-
# validation rules.
|
150
|
-
def validate!
|
151
|
-
# Validate each of the configured classes and store the results into
|
152
|
-
# a hash.
|
153
|
-
errors = self.class.configures_list.inject({}) do |container, data|
|
154
|
-
key, _ = data
|
155
|
-
recorder = ErrorRecorder.new
|
156
|
-
send(key.to_sym).validate(recorder)
|
157
|
-
container[key.to_sym] = recorder if !recorder.errors.empty?
|
158
|
-
container
|
159
|
-
end
|
110
|
+
def proc_for(path)
|
111
|
+
return nil if !path
|
112
|
+
return path if path.is_a?(Proc)
|
160
113
|
|
161
|
-
|
162
|
-
|
114
|
+
begin
|
115
|
+
Kernel.load path if File.exist?(path)
|
116
|
+
return self.class.last_proc
|
117
|
+
rescue SyntaxError => e
|
118
|
+
# Report syntax errors in a nice way for Vagrantfiles
|
119
|
+
raise Errors::VagrantfileSyntaxError, :file => e.message
|
163
120
|
end
|
164
121
|
end
|
165
122
|
end
|
166
123
|
end
|
167
|
-
|
168
|
-
# The built-in configuration classes
|
169
|
-
require 'vagrant/config/vagrant'
|
170
|
-
require 'vagrant/config/ssh'
|
171
|
-
require 'vagrant/config/nfs'
|
172
|
-
require 'vagrant/config/vm'
|
173
|
-
require 'vagrant/config/package'
|