vagrant 0.5.4 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/.yardopts +1 -0
- data/CHANGELOG.md +56 -0
- data/Gemfile +14 -3
- data/Gemfile.lock +38 -11
- data/README.md +1 -1
- data/bin/vagrant +20 -5
- data/config/default.rb +6 -8
- data/lib/vagrant.rb +40 -13
- data/lib/vagrant/action.rb +56 -16
- data/lib/vagrant/action/box/destroy.rb +3 -1
- data/lib/vagrant/action/box/download.rb +8 -13
- data/lib/vagrant/action/box/unpackage.rb +8 -11
- data/lib/vagrant/action/box/verify.rb +3 -3
- data/lib/vagrant/action/builder.rb +3 -30
- data/lib/vagrant/action/builtin.rb +6 -1
- data/lib/vagrant/action/environment.rb +14 -62
- data/lib/vagrant/action/general/package.rb +29 -22
- data/lib/vagrant/action/vm/boot.rb +5 -12
- data/lib/vagrant/action/vm/check_box.rb +4 -4
- data/lib/vagrant/action/vm/check_guest_additions.rb +4 -6
- data/lib/vagrant/action/vm/clear_forwarded_ports.rb +2 -2
- data/lib/vagrant/action/vm/clear_nfs_exports.rb +1 -1
- data/lib/vagrant/action/vm/clear_shared_folders.rb +1 -1
- data/lib/vagrant/action/vm/customize.rb +1 -1
- data/lib/vagrant/action/vm/destroy.rb +1 -2
- data/lib/vagrant/action/vm/destroy_unused_network_interfaces.rb +1 -1
- data/lib/vagrant/action/vm/disable_networks.rb +11 -9
- data/lib/vagrant/action/vm/discard_state.rb +2 -2
- data/lib/vagrant/action/vm/export.rb +10 -11
- data/lib/vagrant/action/vm/forward_ports.rb +21 -9
- data/lib/vagrant/action/vm/halt.rb +3 -8
- data/lib/vagrant/action/vm/import.rb +16 -14
- data/lib/vagrant/action/vm/match_mac_address.rb +1 -1
- data/lib/vagrant/action/vm/network.rb +9 -16
- data/lib/vagrant/action/vm/nfs.rb +14 -18
- data/lib/vagrant/action/vm/provision.rb +5 -5
- data/lib/vagrant/action/vm/resume.rb +1 -1
- data/lib/vagrant/action/vm/share_folders.rb +6 -44
- data/lib/vagrant/action/vm/suspend.rb +1 -1
- data/lib/vagrant/action/warden.rb +74 -0
- data/lib/vagrant/box.rb +18 -82
- data/lib/vagrant/box_collection.rb +47 -0
- data/lib/vagrant/cli.rb +55 -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 +99 -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 +41 -0
- data/lib/vagrant/command/ssh_config.rb +21 -0
- data/lib/vagrant/command/status.rb +23 -0
- data/lib/vagrant/command/suspend.rb +17 -0
- data/lib/vagrant/command/up.rb +20 -0
- data/lib/vagrant/command/upgrade_to_060.rb +45 -0
- data/lib/vagrant/command/version.rb +13 -0
- data/lib/vagrant/config.rb +107 -189
- data/lib/vagrant/config/base.rb +67 -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 +28 -0
- data/lib/vagrant/config/vagrant.rb +21 -0
- data/lib/vagrant/config/vm.rb +111 -0
- data/lib/vagrant/data_store.rb +68 -0
- data/lib/vagrant/downloaders/file.rb +3 -3
- data/lib/vagrant/downloaders/http.rb +5 -5
- data/lib/vagrant/environment.rb +246 -243
- data/lib/vagrant/errors.rb +306 -0
- data/lib/vagrant/hosts/base.rb +1 -1
- data/lib/vagrant/hosts/bsd.rb +3 -9
- data/lib/vagrant/hosts/linux.rb +3 -9
- data/lib/vagrant/plugin.rb +50 -0
- data/lib/vagrant/provisioners/base.rb +0 -6
- data/lib/vagrant/provisioners/chef.rb +63 -58
- data/lib/vagrant/provisioners/chef_server.rb +9 -11
- data/lib/vagrant/provisioners/chef_solo.rb +2 -2
- data/lib/vagrant/ssh.rb +34 -37
- data/lib/vagrant/systems/base.rb +0 -13
- data/lib/vagrant/systems/linux.rb +10 -33
- data/lib/vagrant/systems/solaris.rb +59 -0
- data/lib/vagrant/test_helpers.rb +109 -0
- data/lib/vagrant/ui.rb +65 -0
- data/lib/vagrant/util.rb +9 -19
- data/lib/vagrant/util/glob_loader.rb +19 -17
- data/lib/vagrant/util/hash_with_indifferent_access.rb +63 -0
- data/lib/vagrant/util/plain_logger.rb +2 -0
- data/lib/vagrant/util/platform.rb +2 -0
- data/lib/vagrant/util/resource_logger.rb +5 -70
- data/lib/vagrant/util/retryable.rb +25 -0
- data/lib/vagrant/util/template_renderer.rb +1 -1
- data/lib/vagrant/version.rb +1 -1
- data/lib/vagrant/vm.rb +27 -13
- data/templates/commands/init/Vagrantfile.erb +13 -0
- data/templates/config/validation_failed.erb +7 -0
- data/templates/locales/en.yml +402 -0
- data/templates/package_Vagrantfile.erb +1 -1
- data/test/locales/en.yml +8 -0
- data/test/test_helper.rb +19 -103
- data/test/vagrant/action/box/destroy_test.rb +7 -19
- data/test/vagrant/action/box/download_test.rb +9 -25
- data/test/vagrant/action/box/package_test.rb +2 -2
- data/test/vagrant/action/box/unpackage_test.rb +8 -34
- data/test/vagrant/action/box/verify_test.rb +10 -19
- data/test/vagrant/action/builder_test.rb +0 -15
- data/test/vagrant/action/env/set_test.rb +1 -1
- data/test/vagrant/action/environment_test.rb +8 -26
- data/test/vagrant/action/general/package_test.rb +53 -53
- data/test/vagrant/action/vm/boot_test.rb +5 -22
- data/test/vagrant/action/vm/check_box_test.rb +35 -25
- data/test/vagrant/action/vm/clean_machine_folder_test.rb +1 -1
- data/test/vagrant/action/vm/clear_forwarded_ports_test.rb +1 -1
- data/test/vagrant/action/vm/clear_nfs_exports_test.rb +1 -1
- data/test/vagrant/action/vm/clear_shared_folders_test.rb +1 -1
- data/test/vagrant/action/vm/customize_test.rb +2 -1
- data/test/vagrant/action/vm/destroy_test.rb +1 -2
- data/test/vagrant/action/vm/destroy_unused_network_interfaces_test.rb +1 -1
- data/test/vagrant/action/vm/disable_networks_test.rb +10 -1
- data/test/vagrant/action/vm/discard_state_test.rb +10 -1
- data/test/vagrant/action/vm/export_test.rb +9 -37
- data/test/vagrant/action/vm/forward_ports_helpers_test.rb +2 -2
- data/test/vagrant/action/vm/forward_ports_test.rb +19 -16
- data/test/vagrant/action/vm/halt_test.rb +11 -1
- data/test/vagrant/action/vm/import_test.rb +37 -21
- data/test/vagrant/action/vm/match_mac_address_test.rb +1 -1
- data/test/vagrant/action/vm/network_test.rb +8 -7
- data/test/vagrant/action/vm/nfs_helpers_test.rb +6 -3
- data/test/vagrant/action/vm/nfs_test.rb +20 -45
- data/test/vagrant/action/vm/package_test.rb +1 -1
- data/test/vagrant/action/vm/package_vagrantfile_test.rb +1 -1
- data/test/vagrant/action/vm/provision_test.rb +10 -17
- data/test/vagrant/action/vm/resume_test.rb +1 -1
- data/test/vagrant/action/vm/share_folders_test.rb +25 -106
- data/test/vagrant/action/vm/suspend_test.rb +1 -1
- data/test/vagrant/action/warden_test.rb +105 -0
- data/test/vagrant/action_test.rb +5 -27
- data/test/vagrant/box_collection_test.rb +44 -0
- data/test/vagrant/box_test.rb +5 -105
- 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/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 +11 -0
- data/test/vagrant/config/vm_test.rb +70 -0
- data/test/vagrant/config_test.rb +113 -206
- data/test/vagrant/data_store_test.rb +68 -0
- data/test/vagrant/downloaders/base_test.rb +1 -1
- data/test/vagrant/downloaders/file_test.rb +4 -3
- data/test/vagrant/downloaders/http_test.rb +14 -4
- data/test/vagrant/environment_test.rb +290 -590
- data/test/vagrant/errors_test.rb +42 -0
- data/test/vagrant/hosts/base_test.rb +1 -1
- data/test/vagrant/hosts/bsd_test.rb +3 -6
- data/test/vagrant/hosts/linux_test.rb +3 -5
- data/test/vagrant/plugin_test.rb +9 -0
- data/test/vagrant/provisioners/base_test.rb +1 -1
- data/test/vagrant/provisioners/chef_server_test.rb +31 -35
- data/test/vagrant/provisioners/chef_solo_test.rb +1 -1
- data/test/vagrant/provisioners/chef_test.rb +7 -7
- data/test/vagrant/ssh_session_test.rb +3 -10
- data/test/vagrant/ssh_test.rb +25 -33
- data/test/vagrant/systems/linux_test.rb +6 -71
- data/test/vagrant/ui_test.rb +29 -0
- data/test/vagrant/util/hash_with_indifferent_access_test.rb +39 -0
- data/test/vagrant/util/resource_logger_test.rb +14 -81
- data/test/vagrant/util/retryable_test.rb +38 -0
- data/test/vagrant/util/template_renderer_test.rb +4 -4
- data/test/vagrant/vm_test.rb +47 -26
- data/vagrant.gemspec +14 -12
- metadata +142 -108
- data/bin/.gitignore +0 -0
- data/lib/vagrant/action/action_exception.rb +0 -16
- data/lib/vagrant/action/env/error_halt.rb +0 -16
- data/lib/vagrant/action/exception_catcher.rb +0 -14
- data/lib/vagrant/action/vm/persist.rb +0 -22
- data/lib/vagrant/active_list.rb +0 -83
- data/lib/vagrant/command.rb +0 -27
- data/lib/vagrant/commands/base.rb +0 -181
- data/lib/vagrant/commands/box.rb +0 -16
- data/lib/vagrant/commands/box/add.rb +0 -30
- data/lib/vagrant/commands/box/list.rb +0 -30
- data/lib/vagrant/commands/box/remove.rb +0 -30
- data/lib/vagrant/commands/box/repackage.rb +0 -35
- data/lib/vagrant/commands/destroy.rb +0 -37
- data/lib/vagrant/commands/halt.rb +0 -43
- data/lib/vagrant/commands/init.rb +0 -36
- data/lib/vagrant/commands/package.rb +0 -81
- data/lib/vagrant/commands/provision.rb +0 -31
- data/lib/vagrant/commands/reload.rb +0 -36
- data/lib/vagrant/commands/resume.rb +0 -35
- data/lib/vagrant/commands/ssh.rb +0 -78
- data/lib/vagrant/commands/ssh_config.rb +0 -45
- data/lib/vagrant/commands/status.rb +0 -125
- data/lib/vagrant/commands/suspend.rb +0 -36
- data/lib/vagrant/commands/up.rb +0 -44
- data/lib/vagrant/exceptions/uncallable_action.rb +0 -17
- data/lib/vagrant/util/translator.rb +0 -35
- data/templates/strings.yml +0 -341
- data/templates/unison/crontab_entry.erb +0 -1
- data/templates/unison/script.erb +0 -71
- data/test/vagrant/action/env/error_halt_test.rb +0 -21
- data/test/vagrant/action/exception_catcher_test.rb +0 -30
- data/test/vagrant/action/vm/persist_test.rb +0 -50
- data/test/vagrant/active_list_test.rb +0 -173
- data/test/vagrant/command_test.rb +0 -53
- data/test/vagrant/commands/base_test.rb +0 -139
- data/test/vagrant/commands/box/add_test.rb +0 -34
- data/test/vagrant/commands/box/list_test.rb +0 -32
- data/test/vagrant/commands/box/remove_test.rb +0 -41
- data/test/vagrant/commands/box/repackage_test.rb +0 -52
- data/test/vagrant/commands/destroy_test.rb +0 -44
- data/test/vagrant/commands/halt_test.rb +0 -50
- data/test/vagrant/commands/init_test.rb +0 -71
- data/test/vagrant/commands/package_test.rb +0 -97
- data/test/vagrant/commands/provision_test.rb +0 -60
- data/test/vagrant/commands/reload_test.rb +0 -47
- data/test/vagrant/commands/resume_test.rb +0 -44
- data/test/vagrant/commands/ssh_config_test.rb +0 -77
- data/test/vagrant/commands/ssh_test.rb +0 -129
- data/test/vagrant/commands/status_test.rb +0 -40
- data/test/vagrant/commands/suspend_test.rb +0 -44
- data/test/vagrant/commands/up_test.rb +0 -49
- data/test/vagrant/util/translator_test.rb +0 -61
- data/test/vagrant/util_test.rb +0 -27
@@ -0,0 +1,67 @@
|
|
1
|
+
module Vagrant
|
2
|
+
class Config
|
3
|
+
# The base class for all configuration classes. This implements
|
4
|
+
# basic things such as the environment instance variable which all
|
5
|
+
# config classes need as well as a basic `to_json` implementation.
|
6
|
+
class Base
|
7
|
+
attr_accessor :env
|
8
|
+
|
9
|
+
# Registers a subclass with the Vagrant configuration system so
|
10
|
+
# that it can then be used in Vagrantfiles.
|
11
|
+
#
|
12
|
+
# @param [Symbol] accessor The accessor on the main config object
|
13
|
+
# that is used to access the configuration class.
|
14
|
+
#
|
15
|
+
def self.configures(accessor, klass=self)
|
16
|
+
Top.configures(accessor, klass)
|
17
|
+
end
|
18
|
+
|
19
|
+
# Loads configuration values from JSON back into the proper
|
20
|
+
# configuration classes. By default, this is done by simply
|
21
|
+
# iterating over all values in the JSON hash and assigning them
|
22
|
+
# to instance variables on the class.
|
23
|
+
def self.json_create(data)
|
24
|
+
data.inject(new) do |result, data|
|
25
|
+
key, value = data
|
26
|
+
result.instance_variable_set("@#{key}".to_sym, value) if key != "json_class"
|
27
|
+
result
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# Called by {Top} after the configuration is loaded to validate
|
32
|
+
# the configuaration objects. Subclasses should implement this
|
33
|
+
# method and add any errors to the `errors` object given.
|
34
|
+
#
|
35
|
+
# @param [ErrorRecorder] errors
|
36
|
+
def validate(errors); end
|
37
|
+
|
38
|
+
# Converts the configuration to a raw hash by calling `#to_hash`
|
39
|
+
# on all instance variables (if it can) and putting them into
|
40
|
+
# a hash.
|
41
|
+
def to_hash
|
42
|
+
instance_variables_hash.inject({}) do |acc, data|
|
43
|
+
k,v = data
|
44
|
+
v = v.to_hash if v.respond_to?(:to_hash)
|
45
|
+
acc[k] = v
|
46
|
+
acc
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Converts to JSON, with the `json_class` field set so that when
|
51
|
+
# the JSON is parsed back, it can be loaded back into the proper class.
|
52
|
+
# See {json_create}.
|
53
|
+
def to_json(*a)
|
54
|
+
result = { 'json_class' => self.class.name }
|
55
|
+
result.merge(instance_variables_hash).to_json(*a)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Returns the instance variables as a hash of key-value pairs.
|
59
|
+
def instance_variables_hash
|
60
|
+
instance_variables.inject({}) do |acc, iv|
|
61
|
+
acc[iv.to_s[1..-1]] = instance_variable_get(iv) unless iv.to_sym == :@env
|
62
|
+
acc
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -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,28 @@
|
|
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 :port
|
9
|
+
attr_accessor :forwarded_port_key
|
10
|
+
attr_accessor :max_tries
|
11
|
+
attr_accessor :timeout
|
12
|
+
attr_writer :private_key_path
|
13
|
+
attr_accessor :forward_agent
|
14
|
+
|
15
|
+
def private_key_path
|
16
|
+
File.expand_path(@private_key_path, env.root_path)
|
17
|
+
end
|
18
|
+
|
19
|
+
def validate(errors)
|
20
|
+
[:username, :host, :port, :forwarded_port_key, :max_tries, :timeout, :private_key_path].each do |field|
|
21
|
+
errors.add(I18n.t("vagrant.config.common.error_empty", :field => field)) if !instance_variable_get("@#{field}".to_sym)
|
22
|
+
end
|
23
|
+
|
24
|
+
errors.add(I18n.t("vagrant.config.ssh.private_key_missing", :path => private_key_path)) if !File.file?(private_key_path)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Vagrant
|
2
|
+
class Config
|
3
|
+
class VagrantConfig < Base
|
4
|
+
configures :vagrant
|
5
|
+
|
6
|
+
attr_accessor :dotfile_name
|
7
|
+
attr_accessor :home
|
8
|
+
attr_accessor :host
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@home = nil
|
12
|
+
end
|
13
|
+
|
14
|
+
def validate(errors)
|
15
|
+
[:dotfile_name, :home, :host].each do |field|
|
16
|
+
errors.add(I18n.t("vagrant.config.common.error_empty", :field => field)) if !instance_variable_get("@#{field}".to_sym)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
module Vagrant
|
2
|
+
class Config
|
3
|
+
class VMConfig < Base
|
4
|
+
configures :vm
|
5
|
+
|
6
|
+
include Util::StackedProcRunner
|
7
|
+
|
8
|
+
attr_accessor :auto_port_range
|
9
|
+
attr_accessor :box
|
10
|
+
attr_accessor :box_url
|
11
|
+
attr_accessor :box_ovf
|
12
|
+
attr_accessor :base_mac
|
13
|
+
attr_accessor :boot_mode
|
14
|
+
attr_reader :forwarded_ports
|
15
|
+
attr_reader :shared_folders
|
16
|
+
attr_reader :network_options
|
17
|
+
attr_reader :hd_location
|
18
|
+
attr_accessor :disk_image_format
|
19
|
+
attr_accessor :provisioner
|
20
|
+
attr_writer :shared_folder_uid
|
21
|
+
attr_writer :shared_folder_gid
|
22
|
+
attr_accessor :system
|
23
|
+
|
24
|
+
# Represents a SubVM. This class is only used here in the VMs
|
25
|
+
# hash.
|
26
|
+
class SubVM
|
27
|
+
include Util::StackedProcRunner
|
28
|
+
|
29
|
+
def options
|
30
|
+
@options ||= {}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def initialize
|
35
|
+
@forwarded_ports = {}
|
36
|
+
@shared_folders = {}
|
37
|
+
@provisioner = nil
|
38
|
+
@network_options = []
|
39
|
+
end
|
40
|
+
|
41
|
+
def forward_port(name, guestport, hostport, options=nil)
|
42
|
+
options = {
|
43
|
+
:guestport => guestport,
|
44
|
+
:hostport => hostport,
|
45
|
+
:protocol => "TCP",
|
46
|
+
:adapter => 0,
|
47
|
+
:auto => false
|
48
|
+
}.merge(options || {})
|
49
|
+
|
50
|
+
forwarded_ports[name] = options
|
51
|
+
end
|
52
|
+
|
53
|
+
def share_folder(name, guestpath, hostpath, opts=nil)
|
54
|
+
@shared_folders[name] = {
|
55
|
+
:guestpath => guestpath,
|
56
|
+
:hostpath => hostpath
|
57
|
+
}.merge(opts || {})
|
58
|
+
end
|
59
|
+
|
60
|
+
def network(ip, options=nil)
|
61
|
+
options = {
|
62
|
+
:ip => ip,
|
63
|
+
:netmask => "255.255.255.0",
|
64
|
+
:adapter => 1,
|
65
|
+
:name => nil
|
66
|
+
}.merge(options || {})
|
67
|
+
|
68
|
+
@network_options[options[:adapter]] = options
|
69
|
+
end
|
70
|
+
|
71
|
+
def shared_folder_uid
|
72
|
+
@shared_folder_uid || env.config.ssh.username
|
73
|
+
end
|
74
|
+
|
75
|
+
def shared_folder_gid
|
76
|
+
@shared_folder_gid || env.config.ssh.username
|
77
|
+
end
|
78
|
+
|
79
|
+
def customize(&block)
|
80
|
+
push_proc(&block)
|
81
|
+
end
|
82
|
+
|
83
|
+
def has_multi_vms?
|
84
|
+
!defined_vms.empty?
|
85
|
+
end
|
86
|
+
|
87
|
+
def defined_vms
|
88
|
+
@defined_vms ||= {}
|
89
|
+
end
|
90
|
+
|
91
|
+
def define(name, options=nil, &block)
|
92
|
+
options ||= {}
|
93
|
+
defined_vms[name.to_sym] ||= SubVM.new
|
94
|
+
defined_vms[name.to_sym].options.merge!(options)
|
95
|
+
defined_vms[name.to_sym].push_proc(&block)
|
96
|
+
end
|
97
|
+
|
98
|
+
def validate(errors)
|
99
|
+
shared_folders.each do |name, options|
|
100
|
+
if !File.directory?(File.expand_path(options[:hostpath].to_s, env.root_path))
|
101
|
+
errors.add(I18n.t("vagrant.config.vm.shared_folder_hostpath_missing",
|
102
|
+
:name => name,
|
103
|
+
:path => options[:hostpath]))
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
errors.add(I18n.t("vagrant.config.vm.boot_mode_invalid")) if ![:vrdp, :gui].include?(boot_mode.to_sym)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,68 @@
|
|
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
|
+
File.open(file_path, "r") do |f|
|
23
|
+
merge!(JSON.parse(f.read))
|
24
|
+
end
|
25
|
+
rescue Errno::ENOENT
|
26
|
+
clear
|
27
|
+
end
|
28
|
+
|
29
|
+
# Commits any changes to the data to disk. Even if the data
|
30
|
+
# hasn't changed, it will be reserialized and written to disk.
|
31
|
+
def commit
|
32
|
+
return if !file_path
|
33
|
+
|
34
|
+
clean_nil_and_empties
|
35
|
+
|
36
|
+
if empty?
|
37
|
+
# Delete the file since an empty data store is not useful
|
38
|
+
File.delete(file_path) if File.file?(file_path)
|
39
|
+
else
|
40
|
+
File.open(file_path, "w") { |f| f.write(to_json) }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
protected
|
45
|
+
|
46
|
+
# Removes the "nil" and "empty?" values from the hash (children
|
47
|
+
# included) so that the final output JSON is cleaner.
|
48
|
+
def clean_nil_and_empties(hash=self)
|
49
|
+
# Clean depth first
|
50
|
+
hash.each do |k, v|
|
51
|
+
clean_nil_and_empties(v) if v.is_a?(Hash)
|
52
|
+
end
|
53
|
+
|
54
|
+
# Clean ourselves, knowing that any children have already been
|
55
|
+
# cleaned up
|
56
|
+
bad_keys = hash.inject([]) do |acc, data|
|
57
|
+
k,v = data
|
58
|
+
acc.push(k) if v.nil?
|
59
|
+
acc.push(k) if v.respond_to?(:empty?) && v.empty?
|
60
|
+
acc
|
61
|
+
end
|
62
|
+
|
63
|
+
bad_keys.each do |key|
|
64
|
+
hash.delete(key)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
1
3
|
module Vagrant
|
2
4
|
module Downloaders
|
3
5
|
# "Downloads" a file to a temporary file. Basically, this downloader
|
@@ -8,9 +10,7 @@ module Vagrant
|
|
8
10
|
end
|
9
11
|
|
10
12
|
def prepare(source_url)
|
11
|
-
if !::File.file?(source_url)
|
12
|
-
return env.error!(:downloader_file_doesnt_exist, :source_url => source_url)
|
13
|
-
end
|
13
|
+
raise Errors::DownloaderFileDoesntExist.new if !::File.file?(source_url)
|
14
14
|
end
|
15
15
|
|
16
16
|
def download!(source_url, destination_file)
|
@@ -15,8 +15,10 @@ module Vagrant
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def download!(source_url, destination_file)
|
18
|
+
proxy_uri = URI.parse(ENV["http_proxy"] || "")
|
18
19
|
uri = URI.parse(source_url)
|
19
|
-
http = Net::HTTP.new(uri.host, uri.port)
|
20
|
+
http = Net::HTTP.new(uri.host, uri.port, proxy_uri.host, proxy_uri.port, proxy_uri.user, proxy_uri.password)
|
21
|
+
|
20
22
|
if uri.scheme == "https"
|
21
23
|
http.use_ssl = true
|
22
24
|
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
@@ -36,7 +38,7 @@ module Vagrant
|
|
36
38
|
# Progress reporting is limited to every 25 segments just so
|
37
39
|
# we're not constantly updating
|
38
40
|
if segment_count % 25 == 0
|
39
|
-
env.
|
41
|
+
env.ui.report_progress(progress, total)
|
40
42
|
segment_count = 0
|
41
43
|
end
|
42
44
|
|
@@ -45,10 +47,8 @@ module Vagrant
|
|
45
47
|
end
|
46
48
|
end
|
47
49
|
end
|
48
|
-
|
49
|
-
env.logger.clear_progress
|
50
50
|
rescue SocketError
|
51
|
-
|
51
|
+
raise Errors::DownloaderHTTPSocketError.new
|
52
52
|
end
|
53
53
|
end
|
54
54
|
end
|
data/lib/vagrant/environment.rb
CHANGED
@@ -1,109 +1,143 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require 'fileutils'
|
3
|
+
|
1
4
|
module Vagrant
|
2
|
-
# Represents a single Vagrant environment.
|
3
|
-
#
|
4
|
-
#
|
5
|
+
# Represents a single Vagrant environment. A "Vagrant environment" is
|
6
|
+
# defined as basically a folder with a "Vagrantfile." This class allows
|
7
|
+
# access to the VMs, CLI, etc. all in the scope of this environment.
|
5
8
|
class Environment
|
6
9
|
ROOTFILE_NAME = "Vagrantfile"
|
7
|
-
HOME_SUBDIRS = ["tmp", "boxes"]
|
10
|
+
HOME_SUBDIRS = ["tmp", "boxes", "logs"]
|
8
11
|
DEFAULT_VM = :default
|
9
12
|
|
10
|
-
|
13
|
+
# Parent environment (in the case of multi-VMs)
|
14
|
+
attr_reader :parent
|
11
15
|
|
12
|
-
|
13
|
-
attr_reader :
|
16
|
+
# The `cwd` that this environment represents
|
17
|
+
attr_reader :cwd
|
14
18
|
|
15
|
-
|
16
|
-
|
17
|
-
attr_reader :config
|
18
|
-
attr_reader :host
|
19
|
-
attr_reader :box
|
19
|
+
# The single VM that this environment represents, in the case of
|
20
|
+
# multi-VM.
|
20
21
|
attr_accessor :vm
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
attr_reader :logger
|
25
|
-
attr_reader :actions
|
22
|
+
|
23
|
+
# The {UI} object to communicate with the outside world.
|
24
|
+
attr_writer :ui
|
26
25
|
|
27
26
|
#---------------------------------------------------------------
|
28
27
|
# Class Methods
|
29
28
|
#---------------------------------------------------------------
|
30
29
|
class << self
|
31
|
-
# Loads and returns an environment given a specific working
|
32
|
-
# directory. If a working directory is not given, it will default
|
33
|
-
# to the pwd.
|
34
|
-
def load!(cwd=nil)
|
35
|
-
Environment.new(:cwd => cwd).load!
|
36
|
-
end
|
37
|
-
|
38
30
|
# Verifies that VirtualBox is installed and that the version of
|
39
|
-
# VirtualBox installed is high enough.
|
40
|
-
# configuration path is properly set.
|
31
|
+
# VirtualBox installed is high enough.
|
41
32
|
def check_virtualbox!
|
42
33
|
version = VirtualBox.version
|
43
|
-
if version.nil?
|
44
|
-
|
45
|
-
|
46
|
-
error_and_exit(:virtualbox_invalid_version, :version => version.to_s)
|
47
|
-
elsif version.to_s.downcase.include?("ose")
|
48
|
-
error_and_exit(:virtualbox_invalid_ose, :version => version.to_s)
|
49
|
-
end
|
34
|
+
raise Errors::VirtualBoxNotDetected.new if version.nil?
|
35
|
+
raise Errors::VirtualBoxInvalidVersion.new(:version => version.to_s) if version.to_f < 3.2
|
36
|
+
raise Errors::VirtualBoxInvalidOSE.new(:version => version.to_s) if version.to_s.downcase.include?("ose")
|
50
37
|
end
|
51
38
|
end
|
52
39
|
|
40
|
+
# Initializes a new environment with the given options. The options
|
41
|
+
# is a hash where the main available key is `cwd`, which defines where
|
42
|
+
# the environment represents. There are other options available but
|
43
|
+
# they shouldn't be used in general. If `cwd` is nil, then it defaults
|
44
|
+
# to the `Dir.pwd` (which is the cwd of the executing process).
|
53
45
|
def initialize(opts=nil)
|
54
|
-
|
46
|
+
opts = {
|
55
47
|
:parent => nil,
|
56
|
-
:vm_name => nil,
|
57
48
|
:vm => nil,
|
58
|
-
:cwd => nil
|
59
|
-
}
|
49
|
+
:cwd => nil,
|
50
|
+
}.merge(opts || {})
|
60
51
|
|
61
|
-
opts
|
52
|
+
opts[:cwd] ||= Dir.pwd
|
53
|
+
opts[:cwd] = Pathname.new(opts[:cwd])
|
62
54
|
|
63
|
-
|
55
|
+
opts.each do |key, value|
|
64
56
|
instance_variable_set("@#{key}".to_sym, opts[key])
|
65
57
|
end
|
58
|
+
|
59
|
+
@loaded = false
|
66
60
|
end
|
67
61
|
|
68
62
|
#---------------------------------------------------------------
|
69
63
|
# Helpers
|
70
64
|
#---------------------------------------------------------------
|
71
65
|
|
72
|
-
# Specifies the "current working directory" for this environment.
|
73
|
-
# This is vital in determining the root path and therefore the
|
74
|
-
# dotfile, rootpath vagrantfile, etc. This defaults to the
|
75
|
-
# actual cwd (`Dir.pwd`).
|
76
|
-
def cwd
|
77
|
-
@cwd || Dir.pwd
|
78
|
-
end
|
79
|
-
|
80
66
|
# The path to the `dotfile`, which contains the persisted UUID of
|
81
67
|
# the VM if it exists.
|
68
|
+
#
|
69
|
+
# @return [Pathname]
|
82
70
|
def dotfile_path
|
83
|
-
root_path
|
71
|
+
root_path.join(config.vagrant.dotfile_name) rescue nil
|
84
72
|
end
|
85
73
|
|
86
|
-
# The path to the home directory,
|
74
|
+
# The path to the home directory, expanded relative to the root path,
|
75
|
+
# and converted into a Pathname object.
|
76
|
+
#
|
77
|
+
# @return [Pathname]
|
87
78
|
def home_path
|
88
|
-
|
79
|
+
@_home_path ||= Pathname.new(File.expand_path(config.vagrant.home, root_path))
|
89
80
|
end
|
90
81
|
|
91
82
|
# The path to the Vagrant tmp directory
|
83
|
+
#
|
84
|
+
# @return [Pathname]
|
92
85
|
def tmp_path
|
93
|
-
|
86
|
+
home_path.join("tmp")
|
94
87
|
end
|
95
88
|
|
96
89
|
# The path to the Vagrant boxes directory
|
90
|
+
#
|
91
|
+
# @return [Pathname]
|
97
92
|
def boxes_path
|
98
|
-
|
93
|
+
home_path.join("boxes")
|
94
|
+
end
|
95
|
+
|
96
|
+
# Path to the Vagrant logs directory
|
97
|
+
#
|
98
|
+
# @return [Pathname]
|
99
|
+
def log_path
|
100
|
+
home_path.join("logs")
|
101
|
+
end
|
102
|
+
|
103
|
+
# Returns the name of the resource which this environment represents.
|
104
|
+
# The resource is the VM name if there is a VM it represents, otherwise
|
105
|
+
# it defaults to "vagrant"
|
106
|
+
#
|
107
|
+
# @return [String]
|
108
|
+
def resource
|
109
|
+
vm.name rescue "vagrant"
|
110
|
+
end
|
111
|
+
|
112
|
+
# Returns the collection of boxes for the environment.
|
113
|
+
#
|
114
|
+
# @return [BoxCollection]
|
115
|
+
def boxes
|
116
|
+
return parent.boxes if parent
|
117
|
+
@_boxes ||= BoxCollection.new(self)
|
118
|
+
end
|
119
|
+
|
120
|
+
# Returns the box that this environment represents.
|
121
|
+
#
|
122
|
+
# @return [Box]
|
123
|
+
def box
|
124
|
+
boxes.find(config.vm.box)
|
99
125
|
end
|
100
126
|
|
101
127
|
# Returns the VMs associated with this environment.
|
128
|
+
#
|
129
|
+
# @return [Array<VM>]
|
102
130
|
def vms
|
103
|
-
|
131
|
+
return parent.vms if parent
|
132
|
+
load! if !loaded?
|
133
|
+
@vms ||= load_vms!
|
104
134
|
end
|
105
135
|
|
106
|
-
# Returns the
|
136
|
+
# Returns the primary VM associated with this environment. This
|
137
|
+
# method is only applicable for multi-VM environments. This can
|
138
|
+
# potentially be nil if no primary VM is specified.
|
139
|
+
#
|
140
|
+
# @return [VM]
|
107
141
|
def primary_vm
|
108
142
|
return vms.values.first if !multivm?
|
109
143
|
return parent.primary_vm if parent
|
@@ -118,6 +152,8 @@ module Vagrant
|
|
118
152
|
# Returns a boolean whether this environment represents a multi-VM
|
119
153
|
# environment or not. This will work even when called on child
|
120
154
|
# environments.
|
155
|
+
#
|
156
|
+
# @return [Bool]
|
121
157
|
def multivm?
|
122
158
|
if parent
|
123
159
|
parent.multivm?
|
@@ -126,237 +162,204 @@ module Vagrant
|
|
126
162
|
end
|
127
163
|
end
|
128
164
|
|
165
|
+
# Makes a call to the CLI with the given arguments as if they
|
166
|
+
# came from the real command line (sometimes they do!). An example:
|
167
|
+
#
|
168
|
+
# env.cli("package", "--vagrantfile", "Vagrantfile")
|
169
|
+
#
|
170
|
+
def cli(*args)
|
171
|
+
CLI.start(args.flatten, :env => self)
|
172
|
+
end
|
173
|
+
|
174
|
+
# Returns the {UI} for the environment, which is responsible
|
175
|
+
# for talking with the outside world.
|
176
|
+
#
|
177
|
+
# @return [UI]
|
178
|
+
def ui
|
179
|
+
@ui ||= if parent
|
180
|
+
result = parent.ui.clone
|
181
|
+
result.env = self
|
182
|
+
result
|
183
|
+
else
|
184
|
+
UI.new(self)
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
# Returns the host object associated with this environment.
|
189
|
+
#
|
190
|
+
# @return [Hosts::Base]
|
191
|
+
def host
|
192
|
+
@host ||= Hosts::Base.load(self, config.vagrant.host)
|
193
|
+
end
|
194
|
+
|
195
|
+
# Returns the {Action} class for this environment which allows actions
|
196
|
+
# to be executed (middleware chains) in the context of this environment.
|
197
|
+
#
|
198
|
+
# @return [Action]
|
199
|
+
def actions
|
200
|
+
@actions ||= Action.new(self)
|
201
|
+
end
|
202
|
+
|
203
|
+
# Loads on initial access and reads data from the global data store.
|
204
|
+
# The global data store is global to Vagrant everywhere (in every environment),
|
205
|
+
# so it can be used to store system-wide information. Note that "system-wide"
|
206
|
+
# typically means "for this user" since the location of the global data
|
207
|
+
# store is in the home directory.
|
208
|
+
#
|
209
|
+
# @return [DataStore]
|
210
|
+
def global_data
|
211
|
+
return parent.global_data if parent
|
212
|
+
@global_data ||= DataStore.new(File.expand_path("global_data.json", home_path))
|
213
|
+
end
|
214
|
+
|
215
|
+
# Loads (on initial access) and reads data from the local data
|
216
|
+
# store. This file is always at the root path as the file "~/.vagrant"
|
217
|
+
# and contains a JSON dump of a hash. See {DataStore} for more
|
218
|
+
# information.
|
219
|
+
#
|
220
|
+
# @return [DataStore]
|
221
|
+
def local_data
|
222
|
+
return parent.local_data if parent
|
223
|
+
@local_data ||= DataStore.new(dotfile_path)
|
224
|
+
end
|
225
|
+
|
226
|
+
# Accesses the logger for Vagrant. This logger is a _detailed_
|
227
|
+
# logger which should be used to log internals only. For outward
|
228
|
+
# facing information, use {#ui}.
|
229
|
+
#
|
230
|
+
# @return [Logger]
|
231
|
+
def logger
|
232
|
+
return parent.logger if parent
|
233
|
+
@logger ||= Util::ResourceLogger.new(resource, self)
|
234
|
+
end
|
235
|
+
|
236
|
+
# The root path is the path where the top-most (loaded last)
|
237
|
+
# Vagrantfile resides. It can be considered the project root for
|
238
|
+
# this environment.
|
239
|
+
#
|
240
|
+
# @return [String]
|
241
|
+
def root_path
|
242
|
+
return @root_path if defined?(@root_path)
|
243
|
+
|
244
|
+
root_finder = lambda do |path|
|
245
|
+
return path if File.exist?(File.join(path.to_s, ROOTFILE_NAME))
|
246
|
+
return nil if path.root?
|
247
|
+
root_finder.call(path.parent)
|
248
|
+
end
|
249
|
+
|
250
|
+
@root_path = root_finder.call(cwd)
|
251
|
+
end
|
252
|
+
|
253
|
+
#---------------------------------------------------------------
|
254
|
+
# Config Methods
|
255
|
+
#---------------------------------------------------------------
|
256
|
+
|
257
|
+
# The configuration object represented by this environment. This
|
258
|
+
# will trigger the environment to load if it hasn't loaded yet (see
|
259
|
+
# {#load!}).
|
260
|
+
#
|
261
|
+
# @return [Config::Top]
|
262
|
+
def config
|
263
|
+
load! if !loaded?
|
264
|
+
@config
|
265
|
+
end
|
266
|
+
|
129
267
|
#---------------------------------------------------------------
|
130
268
|
# Load Methods
|
131
269
|
#---------------------------------------------------------------
|
132
270
|
|
271
|
+
# Returns a boolean representing if the environment has been
|
272
|
+
# loaded or not.
|
273
|
+
#
|
274
|
+
# @return [Bool]
|
275
|
+
def loaded?
|
276
|
+
!!@loaded
|
277
|
+
end
|
278
|
+
|
133
279
|
# Loads this entire environment, setting up the instance variables
|
134
280
|
# such as `vm`, `config`, etc. on this environment. The order this
|
135
281
|
# method calls its other methods is very particular.
|
136
282
|
def load!
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
load_box!
|
143
|
-
load_config!
|
144
|
-
self.class.check_virtualbox!
|
145
|
-
load_vm!
|
146
|
-
load_active_list!
|
147
|
-
load_commands!
|
148
|
-
load_actions!
|
149
|
-
self
|
150
|
-
end
|
151
|
-
|
152
|
-
# Loads the root path of this environment, given the starting
|
153
|
-
# directory (the "cwd" of this environment for lack of better words).
|
154
|
-
# This method allows an environment in `/foo` to be detected from
|
155
|
-
# `/foo/bar` (similar to how git works in subdirectories)
|
156
|
-
def load_root_path!(path=nil)
|
157
|
-
path = Pathname.new(File.expand_path(path || cwd))
|
158
|
-
|
159
|
-
# Stop if we're at the root.
|
160
|
-
return false if path.root?
|
161
|
-
|
162
|
-
file = "#{path}/#{ROOTFILE_NAME}"
|
163
|
-
if File.exist?(file)
|
164
|
-
@root_path = path.to_s
|
165
|
-
return true
|
283
|
+
if !loaded?
|
284
|
+
@loaded = true
|
285
|
+
self.class.check_virtualbox!
|
286
|
+
load_config!
|
287
|
+
actions.run(:environment_load)
|
166
288
|
end
|
167
289
|
|
168
|
-
|
290
|
+
self
|
169
291
|
end
|
170
292
|
|
171
|
-
# Loads this environment's configuration and stores it in the {config}
|
293
|
+
# Loads this environment's configuration and stores it in the {#config}
|
172
294
|
# variable. The configuration loaded by this method is specified to
|
173
295
|
# this environment, meaning that it will use the given root directory
|
174
296
|
# to load the Vagrantfile into that context.
|
175
297
|
def load_config!
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
298
|
+
first_run = @config.nil?
|
299
|
+
|
300
|
+
# First load the initial, non config-dependent Vagrantfiles
|
301
|
+
loader = Config.new(self)
|
302
|
+
loader.queue << File.expand_path("config/default.rb", Vagrant.source_root)
|
303
|
+
loader.queue << File.join(box.directory, ROOTFILE_NAME) if !first_run && box
|
304
|
+
loader.queue << File.join(home_path, ROOTFILE_NAME) if !first_run && home_path
|
305
|
+
loader.queue << File.join(root_path, ROOTFILE_NAME) if root_path
|
306
|
+
|
307
|
+
# If this environment is representing a sub-VM, then we push that
|
308
|
+
# proc on as the last configuration.
|
309
|
+
if !first_run && vm
|
310
|
+
subvm = parent.config.vm.defined_vms[vm.name]
|
311
|
+
loader.queue << subvm.proc_stack if subvm
|
187
312
|
end
|
188
313
|
|
189
|
-
#
|
190
|
-
|
191
|
-
|
192
|
-
# Clear out the old data
|
193
|
-
Config.reset!(self)
|
194
|
-
|
195
|
-
# Load each of the config files in order
|
196
|
-
config_queue.each do |item|
|
197
|
-
if item.is_a?(String) && File.exist?(item)
|
198
|
-
load item
|
199
|
-
next
|
200
|
-
end
|
201
|
-
|
202
|
-
if item.is_a?(Proc)
|
203
|
-
# Just push the proc straight onto the config runnable stack
|
204
|
-
Config.run(&item)
|
205
|
-
end
|
206
|
-
end
|
207
|
-
|
208
|
-
# Execute the configuration stack and store the result
|
209
|
-
@config = Config.execute!
|
314
|
+
# Execute the configuration stack and store the result as the final
|
315
|
+
# value in the config ivar.
|
316
|
+
@config = loader.load!
|
210
317
|
|
211
318
|
# (re)load the logger
|
212
|
-
|
213
|
-
end
|
319
|
+
@logger = nil
|
214
320
|
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
def load_logger!
|
222
|
-
resource = vm_name || "vagrant"
|
223
|
-
@logger = Util::ResourceLogger.new(resource, self)
|
321
|
+
if first_run
|
322
|
+
# After the first run we want to load the configuration again since
|
323
|
+
# it can change due to box Vagrantfiles and home directory Vagrantfiles
|
324
|
+
load_home_directory!
|
325
|
+
load_config!
|
326
|
+
end
|
224
327
|
end
|
225
328
|
|
226
329
|
# Loads the home directory path and creates the necessary subdirectories
|
227
330
|
# within the home directory if they're not already created.
|
228
331
|
def load_home_directory!
|
229
332
|
# Setup the array of necessary home directories
|
230
|
-
dirs =
|
231
|
-
dirs.
|
333
|
+
dirs = [home_path]
|
334
|
+
dirs += HOME_SUBDIRS.collect { |subdir| home_path.join(subdir) }
|
232
335
|
|
233
336
|
# Go through each required directory, creating it if it doesn't exist
|
234
337
|
dirs.each do |dir|
|
235
338
|
next if File.directory?(dir)
|
236
339
|
|
237
|
-
|
340
|
+
ui.info I18n.t("vagrant.general.creating_home_dir", :directory => dir)
|
238
341
|
FileUtils.mkdir_p(dir)
|
239
342
|
end
|
240
343
|
end
|
241
344
|
|
242
|
-
# Loads the host class for this environment.
|
243
|
-
def load_host!
|
244
|
-
@host = Hosts::Base.load(self, config.vagrant.host)
|
245
|
-
end
|
246
|
-
|
247
|
-
# Loads the specified box for this environment.
|
248
|
-
def load_box!
|
249
|
-
return unless root_path
|
250
|
-
|
251
|
-
@box = Box.find(self, config.vm.box) if config.vm.box
|
252
|
-
end
|
253
|
-
|
254
345
|
# Loads the persisted VM (if it exists) for this environment.
|
255
|
-
def
|
256
|
-
|
257
|
-
# probably (read: should be) set on the VM attribute, so we do
|
258
|
-
# nothing.
|
259
|
-
return if vm_name
|
260
|
-
|
261
|
-
# First load the defaults (blank, noncreated VMs)
|
262
|
-
load_blank_vms!
|
263
|
-
|
264
|
-
# If we have no dotfile, then return
|
265
|
-
return if !dotfile_path || !File.file?(dotfile_path)
|
266
|
-
|
267
|
-
# Open and parse the dotfile
|
268
|
-
File.open(dotfile_path) do |f|
|
269
|
-
data = { DEFAULT_VM => f.read }
|
270
|
-
|
271
|
-
begin
|
272
|
-
data = JSON.parse(data[DEFAULT_VM])
|
273
|
-
rescue JSON::ParserError
|
274
|
-
# Most likely an older (<= 0.3.x) dotfile. Try to load it
|
275
|
-
# as the :__vagrant VM.
|
276
|
-
end
|
277
|
-
|
278
|
-
data.each do |key, value|
|
279
|
-
key = key.to_sym
|
280
|
-
vms[key] = Vagrant::VM.find(value, self, key)
|
281
|
-
end
|
282
|
-
end
|
283
|
-
rescue Errno::ENOENT
|
284
|
-
# Just rescue it.
|
285
|
-
end
|
286
|
-
|
287
|
-
# Loads blank VMs into the `vms` attribute.
|
288
|
-
def load_blank_vms!
|
289
|
-
# Clear existing vms
|
290
|
-
vms.clear
|
291
|
-
|
292
|
-
# Load up the blank VMs
|
293
|
-
defined_vms = config.vm.defined_vms.keys
|
294
|
-
defined_vms = [DEFAULT_VM] if defined_vms.empty?
|
295
|
-
|
296
|
-
defined_vms.each do |name|
|
297
|
-
vms[name] = Vagrant::VM.new(:vm_name => name, :env => self)
|
298
|
-
end
|
299
|
-
end
|
300
|
-
|
301
|
-
# Loads the activelist for this environment
|
302
|
-
def load_active_list!
|
303
|
-
@active_list = ActiveList.new(self)
|
304
|
-
end
|
305
|
-
|
306
|
-
# Loads the instance of {Command} for this environment. This allows
|
307
|
-
# users of the instance to run commands such as "up" "down" etc. in
|
308
|
-
# the context of this environment.
|
309
|
-
def load_commands!
|
310
|
-
@commands = Command.new(self)
|
311
|
-
end
|
312
|
-
|
313
|
-
# Loads the instance of {Action} for this environment. This allows
|
314
|
-
# users of the instance to run action sequences in the context of
|
315
|
-
# this environment.
|
316
|
-
def load_actions!
|
317
|
-
@actions = Action.new(self)
|
318
|
-
end
|
319
|
-
|
320
|
-
#---------------------------------------------------------------
|
321
|
-
# Methods to manage VM
|
322
|
-
#---------------------------------------------------------------
|
323
|
-
|
324
|
-
# Persists this environment's VM to the dotfile so it can be
|
325
|
-
# re-loaded at a later time.
|
326
|
-
def update_dotfile
|
327
|
-
return parent.update_dotfile if parent
|
346
|
+
def load_vms!
|
347
|
+
result = {}
|
328
348
|
|
329
|
-
#
|
330
|
-
|
331
|
-
|
332
|
-
acc[key] = value.uuid if value.created?
|
333
|
-
acc
|
349
|
+
# Load the VM UUIDs from the local data store
|
350
|
+
(local_data[:active] || {}).each do |name, uuid|
|
351
|
+
result[name.to_sym] = Vagrant::VM.find(uuid, self, name.to_sym)
|
334
352
|
end
|
335
353
|
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
354
|
+
# For any VMs which aren't created, create a blank VM instance for
|
355
|
+
# them
|
356
|
+
all_keys = config.vm.defined_vms.keys
|
357
|
+
all_keys = [DEFAULT_VM] if all_keys.empty?
|
358
|
+
all_keys.each do |name|
|
359
|
+
result[name] = Vagrant::VM.new(:name => name, :env => self) if !result.has_key?(name)
|
342
360
|
end
|
343
361
|
|
344
|
-
|
345
|
-
# active_list.add(vm)
|
346
|
-
end
|
347
|
-
|
348
|
-
#---------------------------------------------------------------
|
349
|
-
# Methods to check for properties and error
|
350
|
-
#---------------------------------------------------------------
|
351
|
-
|
352
|
-
def require_root_path
|
353
|
-
error_and_exit(:rootfile_not_found) if !root_path
|
354
|
-
end
|
355
|
-
|
356
|
-
def require_persisted_vm
|
357
|
-
require_root_path
|
358
|
-
|
359
|
-
error_and_exit(:environment_not_created) if !vm
|
362
|
+
result
|
360
363
|
end
|
361
364
|
end
|
362
365
|
end
|