fixed-vagrant 0.7.4.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 +15 -0
- data/.yardopts +1 -0
- data/CHANGELOG.md +272 -0
- data/Gemfile +21 -0
- data/LICENSE +21 -0
- data/README.md +75 -0
- data/Rakefile +22 -0
- data/bin/vagrant +22 -0
- data/config/default.rb +39 -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 +42 -0
- data/lib/vagrant/action.rb +134 -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 +104 -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 +109 -0
- data/lib/vagrant/action/general/validate.rb +19 -0
- data/lib/vagrant/action/vm.rb +31 -0
- data/lib/vagrant/action/vm/boot.rb +48 -0
- data/lib/vagrant/action/vm/check_box.rb +28 -0
- data/lib/vagrant/action/vm/check_guest_additions.rb +30 -0
- data/lib/vagrant/action/vm/clean_machine_folder.rb +43 -0
- data/lib/vagrant/action/vm/clear_forwarded_ports.rb +39 -0
- data/lib/vagrant/action/vm/clear_nfs_exports.rb +20 -0
- data/lib/vagrant/action/vm/clear_shared_folders.rb +32 -0
- data/lib/vagrant/action/vm/customize.rb +21 -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 +134 -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 +35 -0
- data/lib/vagrant/action/vm/match_mac_address.rb +21 -0
- data/lib/vagrant/action/vm/network.rb +139 -0
- data/lib/vagrant/action/vm/nfs.rb +159 -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 +41 -0
- data/lib/vagrant/action/vm/resume.rb +20 -0
- data/lib/vagrant/action/vm/share_folders.rb +70 -0
- data/lib/vagrant/action/vm/suspend.rb +20 -0
- data/lib/vagrant/action/warden.rb +79 -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 +17 -0
- data/lib/vagrant/command/reload.rb +17 -0
- data/lib/vagrant/command/resume.rb +17 -0
- data/lib/vagrant/command/ssh.rb +42 -0
- data/lib/vagrant/command/ssh_config.rb +26 -0
- data/lib/vagrant/command/status.rb +22 -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 +33 -0
- data/lib/vagrant/config/top.rb +61 -0
- data/lib/vagrant/config/vagrant.rb +16 -0
- data/lib/vagrant/config/vm.rb +137 -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 +64 -0
- data/lib/vagrant/environment.rb +392 -0
- data/lib/vagrant/errors.rb +332 -0
- data/lib/vagrant/hosts.rb +8 -0
- data/lib/vagrant/hosts/arch.rb +27 -0
- data/lib/vagrant/hosts/base.rb +78 -0
- data/lib/vagrant/hosts/bsd.rb +52 -0
- data/lib/vagrant/hosts/linux.rb +47 -0
- data/lib/vagrant/plugin.rb +57 -0
- data/lib/vagrant/provisioners.rb +9 -0
- data/lib/vagrant/provisioners/base.rb +63 -0
- data/lib/vagrant/provisioners/chef.rb +130 -0
- data/lib/vagrant/provisioners/chef_server.rb +103 -0
- data/lib/vagrant/provisioners/chef_solo.rb +142 -0
- data/lib/vagrant/provisioners/puppet.rb +137 -0
- data/lib/vagrant/provisioners/puppet_server.rb +55 -0
- data/lib/vagrant/provisioners/shell.rb +52 -0
- data/lib/vagrant/ssh.rb +173 -0
- data/lib/vagrant/ssh/session.rb +125 -0
- data/lib/vagrant/systems.rb +11 -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 +83 -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 +39 -0
- data/lib/vagrant/systems/solaris.rb +62 -0
- data/lib/vagrant/systems/ubuntu.rb +17 -0
- data/lib/vagrant/test_helpers.rb +128 -0
- data/lib/vagrant/ui.rb +69 -0
- data/lib/vagrant/util.rb +13 -0
- data/lib/vagrant/util/busy.rb +59 -0
- data/lib/vagrant/util/hash_with_indifferent_access.rb +63 -0
- data/lib/vagrant/util/plain_logger.rb +25 -0
- data/lib/vagrant/util/platform.rb +65 -0
- data/lib/vagrant/util/resource_logger.rb +63 -0
- data/lib/vagrant/util/retryable.rb +25 -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 +177 -0
- data/templates/chef_server_client.erb +18 -0
- data/templates/chef_solo_solo.erb +19 -0
- data/templates/commands/init/Vagrantfile.erb +82 -0
- data/templates/config/validation_failed.erb +7 -0
- data/templates/locales/en.yml +535 -0
- data/templates/network_entry_debian.erb +8 -0
- data/templates/network_entry_gentoo.erb +5 -0
- data/templates/network_entry_redhat.erb +8 -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 +9 -0
- data/test/locales/en.yml +8 -0
- data/test/test_helper.rb +26 -0
- data/test/vagrant/action/box/destroy_test.rb +18 -0
- data/test/vagrant/action/box/download_test.rb +125 -0
- data/test/vagrant/action/box/package_test.rb +25 -0
- data/test/vagrant/action/box/unpackage_test.rb +84 -0
- data/test/vagrant/action/box/verify_test.rb +30 -0
- data/test/vagrant/action/builder_test.rb +203 -0
- data/test/vagrant/action/env/set_test.rb +24 -0
- data/test/vagrant/action/environment_test.rb +27 -0
- data/test/vagrant/action/general/package_test.rb +268 -0
- data/test/vagrant/action/general/validate_test.rb +31 -0
- data/test/vagrant/action/vm/boot_test.rb +66 -0
- data/test/vagrant/action/vm/check_box_test.rb +56 -0
- data/test/vagrant/action/vm/check_guest_additions_test.rb +9 -0
- data/test/vagrant/action/vm/clean_machine_folder_test.rb +84 -0
- data/test/vagrant/action/vm/clear_forwarded_ports_test.rb +72 -0
- data/test/vagrant/action/vm/clear_nfs_exports_test.rb +22 -0
- data/test/vagrant/action/vm/clear_shared_folders_test.rb +49 -0
- data/test/vagrant/action/vm/customize_test.rb +30 -0
- data/test/vagrant/action/vm/destroy_test.rb +25 -0
- data/test/vagrant/action/vm/destroy_unused_network_interfaces_test.rb +49 -0
- data/test/vagrant/action/vm/discard_state_test.rb +45 -0
- data/test/vagrant/action/vm/export_test.rb +107 -0
- data/test/vagrant/action/vm/forward_ports_helpers_test.rb +70 -0
- data/test/vagrant/action/vm/forward_ports_test.rb +194 -0
- data/test/vagrant/action/vm/halt_test.rb +79 -0
- data/test/vagrant/action/vm/host_name_test.rb +36 -0
- data/test/vagrant/action/vm/import_test.rb +66 -0
- data/test/vagrant/action/vm/match_mac_address_test.rb +36 -0
- data/test/vagrant/action/vm/network_test.rb +286 -0
- data/test/vagrant/action/vm/nfs_helpers_test.rb +26 -0
- data/test/vagrant/action/vm/nfs_test.rb +260 -0
- data/test/vagrant/action/vm/package_test.rb +25 -0
- data/test/vagrant/action/vm/package_vagrantfile_test.rb +46 -0
- data/test/vagrant/action/vm/provision_test.rb +90 -0
- data/test/vagrant/action/vm/resume_test.rb +35 -0
- data/test/vagrant/action/vm/share_folders_test.rb +139 -0
- data/test/vagrant/action/vm/suspend_test.rb +35 -0
- data/test/vagrant/action/warden_test.rb +119 -0
- data/test/vagrant/action_test.rb +89 -0
- data/test/vagrant/box_collection_test.rb +45 -0
- data/test/vagrant/box_test.rb +74 -0
- data/test/vagrant/cli_test.rb +35 -0
- data/test/vagrant/command/base_test.rb +23 -0
- data/test/vagrant/command/group_base_test.rb +15 -0
- data/test/vagrant/command/helpers_test.rb +88 -0
- data/test/vagrant/command/package_test.rb +27 -0
- data/test/vagrant/config/base_test.rb +52 -0
- data/test/vagrant/config/error_recorder_test.rb +18 -0
- data/test/vagrant/config/ssh_test.rb +12 -0
- data/test/vagrant/config/vagrant_test.rb +35 -0
- data/test/vagrant/config/vm/provisioner_test.rb +92 -0
- data/test/vagrant/config/vm_test.rb +86 -0
- data/test/vagrant/config_test.rb +162 -0
- data/test/vagrant/data_store_test.rb +77 -0
- data/test/vagrant/downloaders/base_test.rb +28 -0
- data/test/vagrant/downloaders/file_test.rb +48 -0
- data/test/vagrant/downloaders/http_test.rb +80 -0
- data/test/vagrant/environment_test.rb +508 -0
- data/test/vagrant/errors_test.rb +42 -0
- data/test/vagrant/hosts/base_test.rb +46 -0
- data/test/vagrant/hosts/bsd_test.rb +53 -0
- data/test/vagrant/hosts/linux_test.rb +54 -0
- data/test/vagrant/plugin_test.rb +9 -0
- data/test/vagrant/provisioners/base_test.rb +63 -0
- data/test/vagrant/provisioners/chef_server_test.rb +188 -0
- data/test/vagrant/provisioners/chef_solo_test.rb +219 -0
- data/test/vagrant/provisioners/chef_test.rb +179 -0
- data/test/vagrant/provisioners/puppet_server_test.rb +68 -0
- data/test/vagrant/provisioners/puppet_test.rb +182 -0
- data/test/vagrant/provisioners/shell_test.rb +68 -0
- data/test/vagrant/ssh/session_test.rb +40 -0
- data/test/vagrant/ssh_test.rb +342 -0
- data/test/vagrant/systems/base_test.rb +18 -0
- data/test/vagrant/systems/linux_test.rb +114 -0
- data/test/vagrant/ui_test.rb +29 -0
- data/test/vagrant/util/busy_test.rb +106 -0
- data/test/vagrant/util/hash_with_indifferent_access_test.rb +39 -0
- data/test/vagrant/util/plain_logger_test.rb +17 -0
- data/test/vagrant/util/platform_test.rb +18 -0
- data/test/vagrant/util/resource_logger_test.rb +78 -0
- data/test/vagrant/util/retryable_test.rb +50 -0
- data/test/vagrant/util/stacked_proc_runner_test.rb +43 -0
- data/test/vagrant/util/template_renderer_test.rb +145 -0
- data/test/vagrant/vm_test.rb +291 -0
- data/vagrant.gemspec +36 -0
- metadata +514 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
class Config
|
|
3
|
+
# A class which is passed into the various {Base#validate} methods and
|
|
4
|
+
# can be used as a helper to add error messages about a single config
|
|
5
|
+
# class.
|
|
6
|
+
class ErrorRecorder
|
|
7
|
+
attr_reader :errors
|
|
8
|
+
|
|
9
|
+
def initialize
|
|
10
|
+
@errors = []
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Adds an error to the list of errors.
|
|
14
|
+
def add(message)
|
|
15
|
+
@errors << message
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
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 :max_tries
|
|
10
|
+
attr_accessor :timeout
|
|
11
|
+
attr_writer :private_key_path
|
|
12
|
+
attr_accessor :forward_agent
|
|
13
|
+
attr_accessor :forward_x11
|
|
14
|
+
attr_accessor :sudo_shell
|
|
15
|
+
|
|
16
|
+
def initialize
|
|
17
|
+
@sudo_shell = "bash"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def private_key_path
|
|
21
|
+
File.expand_path(@private_key_path, env.root_path)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def validate(errors)
|
|
25
|
+
[:username, :host, :forwarded_port_key, :max_tries, :timeout, :private_key_path].each do |field|
|
|
26
|
+
errors.add(I18n.t("vagrant.config.common.error_empty", :field => field)) if !instance_variable_get("@#{field}".to_sym)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
errors.add(I18n.t("vagrant.config.ssh.private_key_missing", :path => private_key_path)) if !File.file?(private_key_path)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
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,16 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
class Config
|
|
3
|
+
class VagrantConfig < Base
|
|
4
|
+
configures :vagrant
|
|
5
|
+
|
|
6
|
+
attr_accessor :dotfile_name
|
|
7
|
+
attr_accessor :host
|
|
8
|
+
|
|
9
|
+
def validate(errors)
|
|
10
|
+
[:dotfile_name, :host].each do |field|
|
|
11
|
+
errors.add(I18n.t("vagrant.config.common.error_empty", :field => field)) if !instance_variable_get("@#{field}".to_sym)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,137 @@
|
|
|
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 :disk_image_format
|
|
23
|
+
attr_writer :shared_folder_uid
|
|
24
|
+
attr_writer :shared_folder_gid
|
|
25
|
+
attr_accessor :system
|
|
26
|
+
|
|
27
|
+
def initialize
|
|
28
|
+
@forwarded_ports = {}
|
|
29
|
+
@shared_folders = {}
|
|
30
|
+
@network_options = []
|
|
31
|
+
@provisioners = []
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def forward_port(name, guestport, hostport, options=nil)
|
|
35
|
+
options = {
|
|
36
|
+
:guestport => guestport,
|
|
37
|
+
:hostport => hostport,
|
|
38
|
+
:protocol => :tcp,
|
|
39
|
+
:adapter => 0,
|
|
40
|
+
:auto => false
|
|
41
|
+
}.merge(options || {})
|
|
42
|
+
|
|
43
|
+
forwarded_ports[name] = options
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def share_folder(name, guestpath, hostpath, opts=nil)
|
|
47
|
+
@shared_folders[name] = {
|
|
48
|
+
:guestpath => guestpath,
|
|
49
|
+
:hostpath => hostpath
|
|
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
|
+
# This shows an error message to smooth the transition for the
|
|
70
|
+
# backwards incompatible provisioner syntax change introduced
|
|
71
|
+
# in Vagrant 0.7.0.
|
|
72
|
+
def provisioner=(_value)
|
|
73
|
+
raise Errors::VagrantError, :_key => :provisioner_equals_not_supported
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def shared_folder_uid
|
|
77
|
+
@shared_folder_uid || env.config.ssh.username
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def shared_folder_gid
|
|
81
|
+
@shared_folder_gid || env.config.ssh.username
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def customize(&block)
|
|
85
|
+
push_proc(&block)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def has_multi_vms?
|
|
89
|
+
!defined_vms.empty?
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def defined_vms
|
|
93
|
+
@defined_vms ||= {}
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# This returns the keys of the sub-vms in the order they were
|
|
97
|
+
# defined.
|
|
98
|
+
def defined_vm_keys
|
|
99
|
+
@defined_vm_keys ||= []
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def define(name, options=nil, &block)
|
|
103
|
+
name = name.to_sym
|
|
104
|
+
options ||= {}
|
|
105
|
+
|
|
106
|
+
# Add the name to the array of VM keys. This array is used to
|
|
107
|
+
# preserve the order in which VMs are defined.
|
|
108
|
+
defined_vm_keys << name
|
|
109
|
+
|
|
110
|
+
# Add the SubVM to the hash of defined VMs
|
|
111
|
+
defined_vms[name] ||= SubVM.new
|
|
112
|
+
defined_vms[name].options.merge!(options)
|
|
113
|
+
defined_vms[name].push_proc(&block)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def validate(errors)
|
|
117
|
+
errors.add(I18n.t("vagrant.config.vm.box_missing")) if !box
|
|
118
|
+
errors.add(I18n.t("vagrant.config.vm.box_not_found", :name => box)) if box && !box_url && !env.box
|
|
119
|
+
errors.add(I18n.t("vagrant.config.vm.boot_mode_invalid")) if ![:vrdp, :gui].include?(boot_mode.to_sym)
|
|
120
|
+
errors.add(I18n.t("vagrant.config.vm.base_mac_invalid")) if env.box && !base_mac
|
|
121
|
+
|
|
122
|
+
shared_folders.each do |name, options|
|
|
123
|
+
if !File.directory?(File.expand_path(options[:hostpath].to_s, env.root_path))
|
|
124
|
+
errors.add(I18n.t("vagrant.config.vm.shared_folder_hostpath_missing",
|
|
125
|
+
:name => name,
|
|
126
|
+
:path => options[:hostpath]))
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
# Each provisioner can validate itself
|
|
131
|
+
provisioners.each do |prov|
|
|
132
|
+
prov.validate(errors)
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
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
|