rvagrant 0.8.7.dev
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +25 -0
- data/.yardopts +1 -0
- data/CHANGELOG.md +386 -0
- data/Gemfile +21 -0
- data/LICENSE +21 -0
- data/README.md +61 -0
- data/Rakefile +11 -0
- data/bin/vagrant +28 -0
- data/config/default.rb +38 -0
- data/contrib/README.md +12 -0
- data/contrib/emacs/vagrant.el +8 -0
- data/contrib/vim/vagrantfile.vim +9 -0
- data/keys/README.md +17 -0
- data/keys/vagrant +27 -0
- data/keys/vagrant.ppk +26 -0
- data/keys/vagrant.pub +1 -0
- data/lib/vagrant.rb +44 -0
- data/lib/vagrant/action.rb +138 -0
- data/lib/vagrant/action/box.rb +11 -0
- data/lib/vagrant/action/box/destroy.rb +21 -0
- data/lib/vagrant/action/box/download.rb +72 -0
- data/lib/vagrant/action/box/package.rb +19 -0
- data/lib/vagrant/action/box/unpackage.rb +55 -0
- data/lib/vagrant/action/box/verify.rb +23 -0
- data/lib/vagrant/action/builder.rb +124 -0
- data/lib/vagrant/action/builtin.rb +108 -0
- data/lib/vagrant/action/env.rb +7 -0
- data/lib/vagrant/action/env/set.rb +18 -0
- data/lib/vagrant/action/environment.rb +50 -0
- data/lib/vagrant/action/general.rb +8 -0
- data/lib/vagrant/action/general/package.rb +113 -0
- data/lib/vagrant/action/general/validate.rb +19 -0
- data/lib/vagrant/action/vm.rb +34 -0
- data/lib/vagrant/action/vm/boot.rb +48 -0
- data/lib/vagrant/action/vm/check_accessible.rb +23 -0
- data/lib/vagrant/action/vm/check_box.rb +28 -0
- data/lib/vagrant/action/vm/check_guest_additions.rb +35 -0
- data/lib/vagrant/action/vm/clean_machine_folder.rb +43 -0
- data/lib/vagrant/action/vm/clear_forwarded_ports.rb +26 -0
- data/lib/vagrant/action/vm/clear_nfs_exports.rb +20 -0
- data/lib/vagrant/action/vm/clear_shared_folders.rb +27 -0
- data/lib/vagrant/action/vm/customize.rb +26 -0
- data/lib/vagrant/action/vm/destroy.rb +19 -0
- data/lib/vagrant/action/vm/destroy_unused_network_interfaces.rb +30 -0
- data/lib/vagrant/action/vm/discard_state.rb +22 -0
- data/lib/vagrant/action/vm/export.rb +52 -0
- data/lib/vagrant/action/vm/forward_ports.rb +133 -0
- data/lib/vagrant/action/vm/forward_ports_helpers.rb +28 -0
- data/lib/vagrant/action/vm/halt.rb +29 -0
- data/lib/vagrant/action/vm/host_name.rb +21 -0
- data/lib/vagrant/action/vm/import.rb +40 -0
- data/lib/vagrant/action/vm/match_mac_address.rb +26 -0
- data/lib/vagrant/action/vm/modify.rb +37 -0
- data/lib/vagrant/action/vm/network.rb +146 -0
- data/lib/vagrant/action/vm/nfs.rb +160 -0
- data/lib/vagrant/action/vm/nfs_helpers.rb +11 -0
- data/lib/vagrant/action/vm/package.rb +23 -0
- data/lib/vagrant/action/vm/package_vagrantfile.rb +33 -0
- data/lib/vagrant/action/vm/provision.rb +34 -0
- data/lib/vagrant/action/vm/provisioner_cleanup.rb +26 -0
- data/lib/vagrant/action/vm/resume.rb +20 -0
- data/lib/vagrant/action/vm/share_folders.rb +78 -0
- data/lib/vagrant/action/vm/suspend.rb +20 -0
- data/lib/vagrant/action/warden.rb +85 -0
- data/lib/vagrant/box.rb +90 -0
- data/lib/vagrant/box_collection.rb +53 -0
- data/lib/vagrant/cli.rb +55 -0
- data/lib/vagrant/command.rb +25 -0
- data/lib/vagrant/command/base.rb +106 -0
- data/lib/vagrant/command/box.rb +33 -0
- data/lib/vagrant/command/destroy.rb +17 -0
- data/lib/vagrant/command/group_base.rb +107 -0
- data/lib/vagrant/command/halt.rb +18 -0
- data/lib/vagrant/command/helpers.rb +33 -0
- data/lib/vagrant/command/init.rb +14 -0
- data/lib/vagrant/command/named_base.rb +14 -0
- data/lib/vagrant/command/package.rb +41 -0
- data/lib/vagrant/command/provision.rb +23 -0
- data/lib/vagrant/command/reload.rb +17 -0
- data/lib/vagrant/command/resume.rb +17 -0
- data/lib/vagrant/command/ssh.rb +49 -0
- data/lib/vagrant/command/ssh_config.rb +29 -0
- data/lib/vagrant/command/status.rb +31 -0
- data/lib/vagrant/command/suspend.rb +17 -0
- data/lib/vagrant/command/up.rb +19 -0
- data/lib/vagrant/command/upgrade_to_060.rb +45 -0
- data/lib/vagrant/command/version.rb +13 -0
- data/lib/vagrant/config.rb +123 -0
- data/lib/vagrant/config/base.rb +85 -0
- data/lib/vagrant/config/error_recorder.rb +19 -0
- data/lib/vagrant/config/nfs.rb +10 -0
- data/lib/vagrant/config/package.rb +9 -0
- data/lib/vagrant/config/ssh.rb +38 -0
- data/lib/vagrant/config/top.rb +61 -0
- data/lib/vagrant/config/vagrant.rb +17 -0
- data/lib/vagrant/config/vm.rb +148 -0
- data/lib/vagrant/config/vm/provisioner.rb +56 -0
- data/lib/vagrant/config/vm/sub_vm.rb +17 -0
- data/lib/vagrant/data_store.rb +70 -0
- data/lib/vagrant/downloaders.rb +7 -0
- data/lib/vagrant/downloaders/base.rb +23 -0
- data/lib/vagrant/downloaders/file.rb +22 -0
- data/lib/vagrant/downloaders/http.rb +70 -0
- data/lib/vagrant/environment.rb +516 -0
- data/lib/vagrant/errors.rb +352 -0
- data/lib/vagrant/hosts.rb +9 -0
- data/lib/vagrant/hosts/arch.rb +27 -0
- data/lib/vagrant/hosts/base.rb +76 -0
- data/lib/vagrant/hosts/bsd.rb +58 -0
- data/lib/vagrant/hosts/fedora.rb +11 -0
- data/lib/vagrant/hosts/linux.rb +69 -0
- data/lib/vagrant/plugin.rb +79 -0
- data/lib/vagrant/provisioners.rb +9 -0
- data/lib/vagrant/provisioners/base.rb +67 -0
- data/lib/vagrant/provisioners/chef.rb +155 -0
- data/lib/vagrant/provisioners/chef_client.rb +120 -0
- data/lib/vagrant/provisioners/chef_solo.rb +135 -0
- data/lib/vagrant/provisioners/puppet.rb +137 -0
- data/lib/vagrant/provisioners/puppet_server.rb +55 -0
- data/lib/vagrant/provisioners/shell.rb +96 -0
- data/lib/vagrant/ssh.rb +224 -0
- data/lib/vagrant/ssh/session.rb +136 -0
- data/lib/vagrant/systems.rb +13 -0
- data/lib/vagrant/systems/arch.rb +34 -0
- data/lib/vagrant/systems/base.rb +87 -0
- data/lib/vagrant/systems/debian.rb +36 -0
- data/lib/vagrant/systems/freebsd.rb +84 -0
- data/lib/vagrant/systems/gentoo.rb +27 -0
- data/lib/vagrant/systems/linux.rb +82 -0
- data/lib/vagrant/systems/linux/config.rb +21 -0
- data/lib/vagrant/systems/linux/error.rb +9 -0
- data/lib/vagrant/systems/redhat.rb +48 -0
- data/lib/vagrant/systems/solaris.rb +67 -0
- data/lib/vagrant/systems/suse.rb +9 -0
- data/lib/vagrant/systems/ubuntu.rb +17 -0
- data/lib/vagrant/test_helpers.rb +128 -0
- data/lib/vagrant/ui.rb +81 -0
- data/lib/vagrant/util.rb +13 -0
- data/lib/vagrant/util/busy.rb +59 -0
- data/lib/vagrant/util/counter.rb +24 -0
- data/lib/vagrant/util/hash_with_indifferent_access.rb +63 -0
- data/lib/vagrant/util/platform.rb +57 -0
- data/lib/vagrant/util/retryable.rb +25 -0
- data/lib/vagrant/util/safe_exec.rb +35 -0
- data/lib/vagrant/util/stacked_proc_runner.rb +35 -0
- data/lib/vagrant/util/template_renderer.rb +83 -0
- data/lib/vagrant/version.rb +6 -0
- data/lib/vagrant/vm.rb +181 -0
- data/templates/chef_server_client.erb +32 -0
- data/templates/chef_solo_solo.erb +23 -0
- data/templates/commands/init/Vagrantfile.erb +86 -0
- data/templates/config/validation_failed.erb +7 -0
- data/templates/locales/en.yml +556 -0
- data/templates/network_entry_arch.erb +9 -0
- data/templates/network_entry_debian.erb +8 -0
- data/templates/network_entry_gentoo.erb +5 -0
- data/templates/network_entry_redhat.erb +9 -0
- data/templates/nfs/exports.erb +5 -0
- data/templates/nfs/exports_linux.erb +5 -0
- data/templates/package_Vagrantfile.erb +11 -0
- data/templates/ssh_config.erb +15 -0
- data/test/unit/locales/en.yml +8 -0
- data/test/unit/test_helper.rb +28 -0
- data/test/unit/vagrant/action/box/destroy_test.rb +18 -0
- data/test/unit/vagrant/action/box/download_test.rb +125 -0
- data/test/unit/vagrant/action/box/package_test.rb +25 -0
- data/test/unit/vagrant/action/box/unpackage_test.rb +84 -0
- data/test/unit/vagrant/action/box/verify_test.rb +30 -0
- data/test/unit/vagrant/action/builder_test.rb +207 -0
- data/test/unit/vagrant/action/env/set_test.rb +24 -0
- data/test/unit/vagrant/action/environment_test.rb +27 -0
- data/test/unit/vagrant/action/general/package_test.rb +268 -0
- data/test/unit/vagrant/action/general/validate_test.rb +31 -0
- data/test/unit/vagrant/action/vm/boot_test.rb +66 -0
- data/test/unit/vagrant/action/vm/check_accessible_test.rb +61 -0
- data/test/unit/vagrant/action/vm/check_box_test.rb +56 -0
- data/test/unit/vagrant/action/vm/check_guest_additions_test.rb +9 -0
- data/test/unit/vagrant/action/vm/clean_machine_folder_test.rb +84 -0
- data/test/unit/vagrant/action/vm/clear_forwarded_ports_test.rb +52 -0
- data/test/unit/vagrant/action/vm/clear_nfs_exports_test.rb +22 -0
- data/test/unit/vagrant/action/vm/clear_shared_folders_test.rb +40 -0
- data/test/unit/vagrant/action/vm/customize_test.rb +37 -0
- data/test/unit/vagrant/action/vm/destroy_test.rb +25 -0
- data/test/unit/vagrant/action/vm/destroy_unused_network_interfaces_test.rb +49 -0
- data/test/unit/vagrant/action/vm/discard_state_test.rb +45 -0
- data/test/unit/vagrant/action/vm/export_test.rb +107 -0
- data/test/unit/vagrant/action/vm/forward_ports_helpers_test.rb +77 -0
- data/test/unit/vagrant/action/vm/forward_ports_test.rb +213 -0
- data/test/unit/vagrant/action/vm/halt_test.rb +79 -0
- data/test/unit/vagrant/action/vm/host_name_test.rb +36 -0
- data/test/unit/vagrant/action/vm/import_test.rb +66 -0
- data/test/unit/vagrant/action/vm/match_mac_address_test.rb +40 -0
- data/test/unit/vagrant/action/vm/modify_test.rb +38 -0
- data/test/unit/vagrant/action/vm/network_test.rb +286 -0
- data/test/unit/vagrant/action/vm/nfs_helpers_test.rb +26 -0
- data/test/unit/vagrant/action/vm/nfs_test.rb +260 -0
- data/test/unit/vagrant/action/vm/package_test.rb +25 -0
- data/test/unit/vagrant/action/vm/package_vagrantfile_test.rb +46 -0
- data/test/unit/vagrant/action/vm/provision_test.rb +65 -0
- data/test/unit/vagrant/action/vm/provisioner_cleanup_test.rb +56 -0
- data/test/unit/vagrant/action/vm/resume_test.rb +35 -0
- data/test/unit/vagrant/action/vm/share_folders_test.rb +144 -0
- data/test/unit/vagrant/action/vm/suspend_test.rb +35 -0
- data/test/unit/vagrant/action/warden_test.rb +125 -0
- data/test/unit/vagrant/action_test.rb +89 -0
- data/test/unit/vagrant/box_collection_test.rb +45 -0
- data/test/unit/vagrant/box_test.rb +74 -0
- data/test/unit/vagrant/cli_test.rb +35 -0
- data/test/unit/vagrant/command/base_test.rb +23 -0
- data/test/unit/vagrant/command/group_base_test.rb +15 -0
- data/test/unit/vagrant/command/helpers_test.rb +88 -0
- data/test/unit/vagrant/command/package_test.rb +27 -0
- data/test/unit/vagrant/config/base_test.rb +52 -0
- data/test/unit/vagrant/config/error_recorder_test.rb +18 -0
- data/test/unit/vagrant/config/ssh_test.rb +12 -0
- data/test/unit/vagrant/config/vagrant_test.rb +35 -0
- data/test/unit/vagrant/config/vm/provisioner_test.rb +92 -0
- data/test/unit/vagrant/config/vm_test.rb +56 -0
- data/test/unit/vagrant/config_test.rb +162 -0
- data/test/unit/vagrant/data_store_test.rb +77 -0
- data/test/unit/vagrant/downloaders/base_test.rb +28 -0
- data/test/unit/vagrant/downloaders/file_test.rb +48 -0
- data/test/unit/vagrant/downloaders/http_test.rb +82 -0
- data/test/unit/vagrant/environment_test.rb +598 -0
- data/test/unit/vagrant/errors_test.rb +42 -0
- data/test/unit/vagrant/hosts/base_test.rb +46 -0
- data/test/unit/vagrant/hosts/bsd_test.rb +53 -0
- data/test/unit/vagrant/hosts/linux_test.rb +54 -0
- data/test/unit/vagrant/plugin_test.rb +9 -0
- data/test/unit/vagrant/provisioners/base_test.rb +63 -0
- data/test/unit/vagrant/provisioners/chef_client_test.rb +190 -0
- data/test/unit/vagrant/provisioners/chef_solo_test.rb +114 -0
- data/test/unit/vagrant/provisioners/chef_test.rb +202 -0
- data/test/unit/vagrant/provisioners/puppet_server_test.rb +68 -0
- data/test/unit/vagrant/provisioners/puppet_test.rb +182 -0
- data/test/unit/vagrant/provisioners/shell_test.rb +79 -0
- data/test/unit/vagrant/ssh/session_test.rb +40 -0
- data/test/unit/vagrant/ssh_test.rb +307 -0
- data/test/unit/vagrant/systems/base_test.rb +18 -0
- data/test/unit/vagrant/systems/linux_test.rb +104 -0
- data/test/unit/vagrant/ui_test.rb +29 -0
- data/test/unit/vagrant/util/busy_test.rb +106 -0
- data/test/unit/vagrant/util/counter_test.rb +29 -0
- data/test/unit/vagrant/util/hash_with_indifferent_access_test.rb +39 -0
- data/test/unit/vagrant/util/platform_test.rb +18 -0
- data/test/unit/vagrant/util/retryable_test.rb +50 -0
- data/test/unit/vagrant/util/stacked_proc_runner_test.rb +43 -0
- data/test/unit/vagrant/util/template_renderer_test.rb +145 -0
- data/test/unit/vagrant/vm_test.rb +300 -0
- data/vagrant.gemspec +35 -0
- metadata +431 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
class Config
|
|
3
|
+
class SSHConfig < Base
|
|
4
|
+
configures :ssh
|
|
5
|
+
|
|
6
|
+
attr_accessor :username
|
|
7
|
+
attr_accessor :host
|
|
8
|
+
attr_accessor :forwarded_port_key
|
|
9
|
+
attr_accessor :forwarded_port_destination
|
|
10
|
+
attr_accessor :max_tries
|
|
11
|
+
attr_accessor :timeout
|
|
12
|
+
attr_writer :private_key_path
|
|
13
|
+
attr_accessor :forward_agent
|
|
14
|
+
attr_accessor :forward_x11
|
|
15
|
+
attr_accessor :shell
|
|
16
|
+
attr_accessor :port
|
|
17
|
+
|
|
18
|
+
def initialize
|
|
19
|
+
@shell = "bash"
|
|
20
|
+
@port = nil
|
|
21
|
+
@forward_agent = false
|
|
22
|
+
@forward_x11 = false
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def private_key_path
|
|
26
|
+
File.expand_path(@private_key_path, env.root_path)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def validate(errors)
|
|
30
|
+
[:username, :host, :forwarded_port_key, :max_tries, :timeout, :private_key_path].each do |field|
|
|
31
|
+
errors.add(I18n.t("vagrant.config.common.error_empty", :field => field)) if !instance_variable_get("@#{field}".to_sym)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
errors.add(I18n.t("vagrant.config.ssh.private_key_missing", :path => private_key_path)) if !File.file?(private_key_path)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
class Config
|
|
3
|
+
# This class is the "top" configure class, which handles registering
|
|
4
|
+
# other configuration classes as well as validation of all configured
|
|
5
|
+
# classes. This is the object which is returned by {Environment#config}
|
|
6
|
+
# and has accessors to all other configuration classes.
|
|
7
|
+
#
|
|
8
|
+
# If you're looking to create your own configuration class, see {Base}.
|
|
9
|
+
class Top < Base
|
|
10
|
+
@@configures = {} if !defined?(@@configures)
|
|
11
|
+
|
|
12
|
+
# The environment that this configuration is for.
|
|
13
|
+
attr_reader :env
|
|
14
|
+
|
|
15
|
+
class << self
|
|
16
|
+
# The list of registered configuration classes as well as the key
|
|
17
|
+
# they're registered under.
|
|
18
|
+
def configures_list
|
|
19
|
+
@@configures ||= {}
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Registers a configuration class with the given key. This method shouldn't
|
|
23
|
+
# be called. Instead, inherit from {Base} and call {Base.configures}.
|
|
24
|
+
def configures(key, klass)
|
|
25
|
+
configures_list[key] = klass
|
|
26
|
+
attr_reader key.to_sym
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def initialize(env=nil)
|
|
31
|
+
self.class.configures_list.each do |key, klass|
|
|
32
|
+
config = klass.new
|
|
33
|
+
config.top = self
|
|
34
|
+
instance_variable_set("@#{key}".to_sym, config)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
@env = env
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Validates the configuration classes of this instance and raises an
|
|
41
|
+
# exception if they are invalid. If you are implementing a custom configuration
|
|
42
|
+
# class, the method you want to implement is {Base#validate}. This is
|
|
43
|
+
# the method that checks all the validation, not one which defines
|
|
44
|
+
# validation rules.
|
|
45
|
+
def validate!
|
|
46
|
+
# Validate each of the configured classes and store the results into
|
|
47
|
+
# a hash.
|
|
48
|
+
errors = self.class.configures_list.inject({}) do |container, data|
|
|
49
|
+
key, _ = data
|
|
50
|
+
recorder = ErrorRecorder.new
|
|
51
|
+
send(key.to_sym).validate(recorder)
|
|
52
|
+
container[key.to_sym] = recorder if !recorder.errors.empty?
|
|
53
|
+
container
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
return if errors.empty?
|
|
57
|
+
raise Errors::ConfigValidationFailed, :messages => Util::TemplateRenderer.render("config/validation_failed", :errors => errors)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
class Config
|
|
3
|
+
class VagrantConfig < Base
|
|
4
|
+
configures :vagrant
|
|
5
|
+
|
|
6
|
+
attr_accessor :dotfile_name
|
|
7
|
+
attr_accessor :host
|
|
8
|
+
attr_accessor :ssh_session_cache
|
|
9
|
+
|
|
10
|
+
def validate(errors)
|
|
11
|
+
[:dotfile_name, :host].each do |field|
|
|
12
|
+
errors.add(I18n.t("vagrant.config.common.error_empty", :field => field)) if !instance_variable_get("@#{field}".to_sym)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
require 'vagrant/config/vm/sub_vm'
|
|
2
|
+
require 'vagrant/config/vm/provisioner'
|
|
3
|
+
|
|
4
|
+
module Vagrant
|
|
5
|
+
class Config
|
|
6
|
+
class VMConfig < Base
|
|
7
|
+
configures :vm
|
|
8
|
+
|
|
9
|
+
include Util::StackedProcRunner
|
|
10
|
+
|
|
11
|
+
attr_accessor :auto_port_range
|
|
12
|
+
attr_accessor :box
|
|
13
|
+
attr_accessor :box_url
|
|
14
|
+
attr_accessor :box_ovf
|
|
15
|
+
attr_accessor :base_mac
|
|
16
|
+
attr_accessor :boot_mode
|
|
17
|
+
attr_accessor :host_name
|
|
18
|
+
attr_reader :forwarded_ports
|
|
19
|
+
attr_reader :shared_folders
|
|
20
|
+
attr_reader :network_options
|
|
21
|
+
attr_reader :provisioners
|
|
22
|
+
attr_accessor :system
|
|
23
|
+
|
|
24
|
+
def initialize
|
|
25
|
+
@forwarded_ports = {}
|
|
26
|
+
@shared_folders = {}
|
|
27
|
+
@network_options = []
|
|
28
|
+
@provisioners = []
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def forward_port(name, guestport, hostport, options=nil)
|
|
32
|
+
options = {
|
|
33
|
+
:guestport => guestport,
|
|
34
|
+
:hostport => hostport,
|
|
35
|
+
:protocol => :tcp,
|
|
36
|
+
:adapter => 0,
|
|
37
|
+
:auto => false
|
|
38
|
+
}.merge(options || {})
|
|
39
|
+
|
|
40
|
+
forwarded_ports[name] = options
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def share_folder(name, guestpath, hostpath, opts=nil)
|
|
44
|
+
@shared_folders[name] = {
|
|
45
|
+
:guestpath => guestpath,
|
|
46
|
+
:hostpath => hostpath,
|
|
47
|
+
:owner => nil,
|
|
48
|
+
:group => nil,
|
|
49
|
+
:nfs => false
|
|
50
|
+
}.merge(opts || {})
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def network(ip, options=nil)
|
|
54
|
+
options = {
|
|
55
|
+
:ip => ip,
|
|
56
|
+
:netmask => "255.255.255.0",
|
|
57
|
+
:adapter => 1,
|
|
58
|
+
:mac => nil,
|
|
59
|
+
:name => nil
|
|
60
|
+
}.merge(options || {})
|
|
61
|
+
|
|
62
|
+
@network_options[options[:adapter]] = options
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def provision(name, options=nil, &block)
|
|
66
|
+
@provisioners << Provisioner.new(top, name, options, &block)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def customize(&block)
|
|
70
|
+
push_proc(&block)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def has_multi_vms?
|
|
74
|
+
!defined_vms.empty?
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def defined_vms
|
|
78
|
+
@defined_vms ||= {}
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# This returns the keys of the sub-vms in the order they were
|
|
82
|
+
# defined.
|
|
83
|
+
def defined_vm_keys
|
|
84
|
+
@defined_vm_keys ||= []
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def define(name, options=nil, &block)
|
|
88
|
+
name = name.to_sym
|
|
89
|
+
options ||= {}
|
|
90
|
+
|
|
91
|
+
# Add the name to the array of VM keys. This array is used to
|
|
92
|
+
# preserve the order in which VMs are defined.
|
|
93
|
+
defined_vm_keys << name
|
|
94
|
+
|
|
95
|
+
# Add the SubVM to the hash of defined VMs
|
|
96
|
+
defined_vms[name] ||= SubVM.new
|
|
97
|
+
defined_vms[name].options.merge!(options)
|
|
98
|
+
defined_vms[name].push_proc(&block)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def validate(errors)
|
|
102
|
+
errors.add(I18n.t("vagrant.config.vm.box_missing")) if !box
|
|
103
|
+
errors.add(I18n.t("vagrant.config.vm.box_not_found", :name => box)) if box && !box_url && !env.box
|
|
104
|
+
errors.add(I18n.t("vagrant.config.vm.boot_mode_invalid")) if ![:vrdp, :gui].include?(boot_mode.to_sym)
|
|
105
|
+
errors.add(I18n.t("vagrant.config.vm.base_mac_invalid")) if env.box && !base_mac
|
|
106
|
+
|
|
107
|
+
shared_folders.each do |name, options|
|
|
108
|
+
if !File.directory?(File.expand_path(options[:hostpath].to_s, env.root_path))
|
|
109
|
+
errors.add(I18n.t("vagrant.config.vm.shared_folder_hostpath_missing",
|
|
110
|
+
:name => name,
|
|
111
|
+
:path => options[:hostpath]))
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
if options[:nfs] && (options[:owner] || options[:group])
|
|
115
|
+
# Owner/group don't work with NFS
|
|
116
|
+
errors.add(I18n.t("vagrant.config.vm.shared_folder_nfs_owner_group",
|
|
117
|
+
:name => name))
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# Validate some basic networking
|
|
122
|
+
network_options.each do |options|
|
|
123
|
+
next if !options
|
|
124
|
+
|
|
125
|
+
ip = options[:ip].split(".")
|
|
126
|
+
|
|
127
|
+
if ip.length != 4
|
|
128
|
+
errors.add(I18n.t("vagrant.config.vm.network_ip_invalid",
|
|
129
|
+
:ip => options[:ip]))
|
|
130
|
+
elsif ip.last == "1"
|
|
131
|
+
errors.add(I18n.t("vagrant.config.vm.network_ip_ends_one",
|
|
132
|
+
:ip => options[:ip]))
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
# Each provisioner can validate itself
|
|
137
|
+
provisioners.each do |prov|
|
|
138
|
+
# TODO: Remove at some point
|
|
139
|
+
if prov.shortcut == :chef_server
|
|
140
|
+
errors.add(I18n.t("vagrant.config.vm.provisioner_chef_server_changed"))
|
|
141
|
+
else
|
|
142
|
+
prov.validate(errors)
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
class Config
|
|
3
|
+
class VMConfig < Base
|
|
4
|
+
# Represents a single configured provisioner for a VM.
|
|
5
|
+
class Provisioner
|
|
6
|
+
attr_reader :top
|
|
7
|
+
attr_reader :shortcut
|
|
8
|
+
attr_reader :provisioner
|
|
9
|
+
attr_reader :config
|
|
10
|
+
|
|
11
|
+
def initialize(top, shortcut, options=nil, &block)
|
|
12
|
+
@top = top
|
|
13
|
+
@shortcut = shortcut
|
|
14
|
+
@provisioner = shortcut
|
|
15
|
+
@provisioner = Provisioners::Base.registered[shortcut] if shortcut.is_a?(Symbol)
|
|
16
|
+
@config = nil
|
|
17
|
+
|
|
18
|
+
configure(options, &block)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Configures the provisioner if it can (if it is valid).
|
|
22
|
+
def configure(options=nil, &block)
|
|
23
|
+
# We don't want ancestors to be searched. This is the default in 1.8,
|
|
24
|
+
# but not in 1.9, hence this hackery.
|
|
25
|
+
const_args = ["Config"]
|
|
26
|
+
const_args << false if RUBY_VERSION >= "1.9"
|
|
27
|
+
|
|
28
|
+
# We assume that every provisioner has a `Config` class beneath
|
|
29
|
+
# it for configuring.
|
|
30
|
+
return if !@provisioner || !@provisioner.const_defined?(*const_args)
|
|
31
|
+
|
|
32
|
+
# Instantiate the config class and configure it
|
|
33
|
+
@config = @provisioner.const_get(*const_args).new
|
|
34
|
+
@config.top = top
|
|
35
|
+
@config.set_options(options) if options
|
|
36
|
+
block.call(@config) if block
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def validate(errors)
|
|
40
|
+
if !provisioner
|
|
41
|
+
# If we don't have a provisioner then the whole thing is invalid.
|
|
42
|
+
errors.add(I18n.t("vagrant.config.vm.provisioner_not_found", :shortcut => shortcut))
|
|
43
|
+
return
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
if !(provisioner <= Provisioners::Base)
|
|
47
|
+
errors.add(I18n.t("vagrant.config.vm.provisioner_invalid_class", :shortcut => shortcut))
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Pass on validation to the provisioner config
|
|
51
|
+
config.validate(errors) if config
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
class Config
|
|
3
|
+
class VMConfig < Base
|
|
4
|
+
# Represents a single sub-VM in a multi-VM environment.
|
|
5
|
+
class SubVM
|
|
6
|
+
include Util::StackedProcRunner
|
|
7
|
+
|
|
8
|
+
attr_reader :options
|
|
9
|
+
|
|
10
|
+
def initialize
|
|
11
|
+
@options = {}
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
# The Vagrant data store is a key-value store which is persisted
|
|
3
|
+
# as JSON in a local file which is specified in the initializer.
|
|
4
|
+
# The data store itself is accessed via typical hash accessors: `[]`
|
|
5
|
+
# and `[]=`. If a key is set to `nil`, then it is removed from the
|
|
6
|
+
# datastore. The data store is only updated on disk when {#commit}
|
|
7
|
+
# is called on the data store itself.
|
|
8
|
+
#
|
|
9
|
+
# The data store is a hash with indifferent access, meaning that
|
|
10
|
+
# while all keys are persisted as strings in the JSON, you can access
|
|
11
|
+
# them back as either symbols or strings. Note that this is only true
|
|
12
|
+
# for the top-level data store. As soon as you set a hash inside the
|
|
13
|
+
# data store, unless you explicitly use a {Util::HashWithIndifferentAccess},
|
|
14
|
+
# it will be a regular hash.
|
|
15
|
+
class DataStore < Util::HashWithIndifferentAccess
|
|
16
|
+
attr_reader :file_path
|
|
17
|
+
|
|
18
|
+
def initialize(file_path)
|
|
19
|
+
@file_path = file_path
|
|
20
|
+
return if !file_path
|
|
21
|
+
|
|
22
|
+
raise Errors::DotfileIsDirectory if File.directory?(file_path)
|
|
23
|
+
|
|
24
|
+
if File.exist?(file_path)
|
|
25
|
+
File.open(file_path, "r") do |f|
|
|
26
|
+
merge!(JSON.parse(f.read))
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Commits any changes to the data to disk. Even if the data
|
|
32
|
+
# hasn't changed, it will be reserialized and written to disk.
|
|
33
|
+
def commit
|
|
34
|
+
return if !file_path
|
|
35
|
+
|
|
36
|
+
clean_nil_and_empties
|
|
37
|
+
|
|
38
|
+
if empty?
|
|
39
|
+
# Delete the file since an empty data store is not useful
|
|
40
|
+
File.delete(file_path) if File.file?(file_path)
|
|
41
|
+
else
|
|
42
|
+
File.open(file_path, "w") { |f| f.write(to_json) }
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
protected
|
|
47
|
+
|
|
48
|
+
# Removes the "nil" and "empty?" values from the hash (children
|
|
49
|
+
# included) so that the final output JSON is cleaner.
|
|
50
|
+
def clean_nil_and_empties(hash=self)
|
|
51
|
+
# Clean depth first
|
|
52
|
+
hash.each do |k, v|
|
|
53
|
+
clean_nil_and_empties(v) if v.is_a?(Hash)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Clean ourselves, knowing that any children have already been
|
|
57
|
+
# cleaned up
|
|
58
|
+
bad_keys = hash.inject([]) do |acc, data|
|
|
59
|
+
k,v = data
|
|
60
|
+
acc.push(k) if v.nil?
|
|
61
|
+
acc.push(k) if v.respond_to?(:empty?) && v.empty?
|
|
62
|
+
acc
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
bad_keys.each do |key|
|
|
66
|
+
hash.delete(key)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
module Downloaders
|
|
3
|
+
# Represents a base class for a downloader. A downloader handles
|
|
4
|
+
# downloading a box file to a temporary file.
|
|
5
|
+
class Base
|
|
6
|
+
include Vagrant::Util
|
|
7
|
+
|
|
8
|
+
# The environment which this downloader is operating.
|
|
9
|
+
attr_reader :env
|
|
10
|
+
|
|
11
|
+
def initialize(env)
|
|
12
|
+
@env = env
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Called prior to execution so any error checks can be done
|
|
16
|
+
def prepare(source_url); end
|
|
17
|
+
|
|
18
|
+
# Downloads the source file to the destination file. It is up to
|
|
19
|
+
# implementors of this class to handle the logic.
|
|
20
|
+
def download!(source_url, destination_file); end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|