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
@@ -12,8 +12,8 @@ module Vagrant
|
|
12
12
|
def call(env)
|
13
13
|
@app.call(env)
|
14
14
|
|
15
|
-
if
|
16
|
-
@env.
|
15
|
+
if provisioning_enabled?
|
16
|
+
@env.ui.info I18n.t("vagrant.actions.vm.provision.beginning")
|
17
17
|
@provisioner.provision!
|
18
18
|
end
|
19
19
|
end
|
@@ -27,7 +27,7 @@ module Vagrant
|
|
27
27
|
|
28
28
|
if provisioner.is_a?(Class)
|
29
29
|
@provisioner = provisioner.new(@env)
|
30
|
-
|
30
|
+
raise Errors::ProvisionInvalidClass.new if !@provisioner.is_a?(Provisioners::Base)
|
31
31
|
elsif provisioner.is_a?(Symbol)
|
32
32
|
# We have a few hard coded provisioners for built-ins
|
33
33
|
mapping = {
|
@@ -36,11 +36,11 @@ module Vagrant
|
|
36
36
|
}
|
37
37
|
|
38
38
|
provisioner_klass = mapping[provisioner]
|
39
|
-
|
39
|
+
raise Errors::ProvisionUnknownType.new(:provisioner => provisioner.to_s) if provisioner_klass.nil?
|
40
40
|
@provisioner = provisioner_klass.new(@env)
|
41
41
|
end
|
42
42
|
|
43
|
-
@env.
|
43
|
+
@env.ui.info I18n.t("vagrant.actions.vm.provision.enabled", :provisioner => @provisioner.class.to_s)
|
44
44
|
@provisioner.prepare
|
45
45
|
@provisioner
|
46
46
|
end
|
@@ -2,8 +2,6 @@ module Vagrant
|
|
2
2
|
class Action
|
3
3
|
module VM
|
4
4
|
class ShareFolders
|
5
|
-
include ExceptionCatcher
|
6
|
-
|
7
5
|
def initialize(app, env)
|
8
6
|
@app = app
|
9
7
|
@env = env
|
@@ -16,14 +14,7 @@ module Vagrant
|
|
16
14
|
|
17
15
|
@app.call(env)
|
18
16
|
|
19
|
-
|
20
|
-
catch_action_exception(env) do
|
21
|
-
# Only mount and setup shared folders in the absense of an
|
22
|
-
# error
|
23
|
-
mount_shared_folders
|
24
|
-
setup_unison
|
25
|
-
end
|
26
|
-
end
|
17
|
+
mount_shared_folders
|
27
18
|
end
|
28
19
|
|
29
20
|
# This method returns an actual list of VirtualBox shared
|
@@ -36,31 +27,13 @@ module Vagrant
|
|
36
27
|
|
37
28
|
# This to prevent overwriting the actual shared folders data
|
38
29
|
value = value.dup
|
39
|
-
|
40
|
-
if value[:sync]
|
41
|
-
# Syncing this folder. Change the guestpath to reflect
|
42
|
-
# what we're actually mounting.
|
43
|
-
value[:original] = value.dup
|
44
|
-
value[:guestpath] = "#{value[:guestpath]}#{@env.env.config.unison.folder_suffix}"
|
45
|
-
end
|
46
|
-
|
47
30
|
acc[key] = value
|
48
31
|
acc
|
49
32
|
end
|
50
33
|
end
|
51
34
|
|
52
|
-
# This method returns the list of shared folders which are to
|
53
|
-
# be synced via unison.
|
54
|
-
def unison_folders
|
55
|
-
shared_folders.inject({}) do |acc, data|
|
56
|
-
key, value = data
|
57
|
-
acc[key] = value if !!value[:sync]
|
58
|
-
acc
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
35
|
def create_metadata
|
63
|
-
@env.
|
36
|
+
@env.ui.info I18n.t("vagrant.actions.vm.share_folders.creating")
|
64
37
|
|
65
38
|
shared_folders.each do |name, data|
|
66
39
|
folder = VirtualBox::SharedFolder.new
|
@@ -73,28 +46,17 @@ module Vagrant
|
|
73
46
|
end
|
74
47
|
|
75
48
|
def mount_shared_folders
|
76
|
-
@env.
|
49
|
+
@env.ui.info I18n.t("vagrant.actions.vm.share_folders.mounting")
|
77
50
|
|
78
51
|
@env["vm"].ssh.execute do |ssh|
|
79
52
|
shared_folders.each do |name, data|
|
80
|
-
@env.
|
53
|
+
@env.ui.info(I18n.t("vagrant.actions.vm.share_folders.mounting_entry",
|
54
|
+
:name => name,
|
55
|
+
:guest_path => data[:guestpath]))
|
81
56
|
@env["vm"].system.mount_shared_folder(ssh, name, data[:guestpath])
|
82
57
|
end
|
83
58
|
end
|
84
59
|
end
|
85
|
-
|
86
|
-
def setup_unison
|
87
|
-
return if unison_folders.empty?
|
88
|
-
|
89
|
-
@env["vm"].ssh.execute do |ssh|
|
90
|
-
@env["vm"].system.prepare_unison(ssh)
|
91
|
-
|
92
|
-
@env.logger.info "Creating unison crontab entries..."
|
93
|
-
unison_folders.each do |name, data|
|
94
|
-
@env["vm"].system.create_unison(ssh, data)
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
98
60
|
end
|
99
61
|
end
|
100
62
|
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module Vagrant
|
2
|
+
class Action
|
3
|
+
# The action warden is a middleware which injects itself between
|
4
|
+
# every other middleware, watching for exceptions which are raised
|
5
|
+
# and performing proper cleanup on every action by calling the `recover`
|
6
|
+
# method. The warden therefore allows middlewares to not worry about
|
7
|
+
# exceptional events, and by providing a simple callback, can clean up
|
8
|
+
# in any erroneous case.
|
9
|
+
#
|
10
|
+
# Except for those who are curious about the internal workings of Vagrant,
|
11
|
+
# Warden will "just work" behind the scenes.
|
12
|
+
class Warden
|
13
|
+
attr_accessor :actions, :stack
|
14
|
+
|
15
|
+
def initialize(actions, env)
|
16
|
+
@stack = []
|
17
|
+
@actions = actions.map { |m| finalize_action(m, env) }
|
18
|
+
end
|
19
|
+
|
20
|
+
def call(env)
|
21
|
+
return if @actions.empty?
|
22
|
+
|
23
|
+
begin
|
24
|
+
# Call the next middleware in the sequence, appending to the stack
|
25
|
+
# of "recoverable" middlewares in case something goes wrong!
|
26
|
+
raise Errors::VagrantInterrupt.new if env.interrupted?
|
27
|
+
@stack.unshift(@actions.shift).first.call(env)
|
28
|
+
raise Errors::VagrantInterrupt.new if env.interrupted?
|
29
|
+
rescue Exception => e
|
30
|
+
env["vagrant.error"] = e
|
31
|
+
|
32
|
+
# Something went horribly wrong. Start the rescue chain then
|
33
|
+
# reraise the exception to properly kick us out of limbo here.
|
34
|
+
begin_rescue(env)
|
35
|
+
raise
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# Begins the recovery sequence for all middlewares which have run.
|
40
|
+
# It does this by calling `recover` (if it exists) on each middleware
|
41
|
+
# which has already run, in reverse order.
|
42
|
+
def begin_rescue(env)
|
43
|
+
@stack.each do |act|
|
44
|
+
act.recover(env) if act.respond_to?(:recover)
|
45
|
+
end
|
46
|
+
|
47
|
+
# Clear stack so that warden down the middleware chain doesn't
|
48
|
+
# rescue again.
|
49
|
+
@stack.clear
|
50
|
+
end
|
51
|
+
|
52
|
+
# A somewhat confusing function which simply initializes each
|
53
|
+
# middleware properly to call the next middleware in the sequence.
|
54
|
+
def finalize_action(action, env)
|
55
|
+
klass, args, block = action
|
56
|
+
|
57
|
+
if klass.is_a?(Class)
|
58
|
+
# A action klass which is to be instantiated with the
|
59
|
+
# app, env, and any arguments given
|
60
|
+
klass.new(self, env, *args, &block)
|
61
|
+
elsif klass.respond_to?(:call)
|
62
|
+
# Make it a lambda which calls the item then forwards
|
63
|
+
# up the chain
|
64
|
+
lambda do |e|
|
65
|
+
klass.call(e)
|
66
|
+
self.call(e)
|
67
|
+
end
|
68
|
+
else
|
69
|
+
raise "Invalid action: #{action.inspect}"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
data/lib/vagrant/box.rb
CHANGED
@@ -4,42 +4,7 @@ module Vagrant
|
|
4
4
|
# virtual machine, at the least. They are created with `vagrant package`
|
5
5
|
# and may contain additional files if specified by the creator. This
|
6
6
|
# class serves to help manage these boxes, although most of the logic
|
7
|
-
# is kicked out to
|
8
|
-
#
|
9
|
-
# What can the {Box} class do?
|
10
|
-
#
|
11
|
-
# * Find boxes
|
12
|
-
# * Add existing boxes (from some URI)
|
13
|
-
# * Delete existing boxes
|
14
|
-
#
|
15
|
-
# # Finding Boxes
|
16
|
-
#
|
17
|
-
# Using the {Box.find} method, you can search for existing boxes. This
|
18
|
-
# method will return `nil` if none is found or an instance of {Box}
|
19
|
-
# otherwise.
|
20
|
-
#
|
21
|
-
# box = Vagrant::Box.find("base")
|
22
|
-
# if box.nil?
|
23
|
-
# puts "Box not found!"
|
24
|
-
# else
|
25
|
-
# puts "Box exists at #{box.directory}"
|
26
|
-
# end
|
27
|
-
#
|
28
|
-
# # Adding a Box
|
29
|
-
#
|
30
|
-
# Boxes can be added from any URI. Some schemas aren't supported; if this
|
31
|
-
# is the case, the error will output to the logger.
|
32
|
-
#
|
33
|
-
# Vagrant::Box.add("foo", "http://myfiles.com/foo.box")
|
34
|
-
#
|
35
|
-
# # Destroying a box
|
36
|
-
#
|
37
|
-
# Boxes can be deleted as well. This method is _final_ and there is no way
|
38
|
-
# to undo this action once it is completed.
|
39
|
-
#
|
40
|
-
# box = Vagrant::Box.find("foo")
|
41
|
-
# box.destroy
|
42
|
-
#
|
7
|
+
# is kicked out to middlewares.
|
43
8
|
class Box
|
44
9
|
# The name of the box.
|
45
10
|
attr_accessor :name
|
@@ -50,36 +15,9 @@ module Vagrant
|
|
50
15
|
# The environment which this box belongs to. Although this could
|
51
16
|
# actually be many environments, this points to the environment
|
52
17
|
# of a specific instance.
|
53
|
-
|
18
|
+
attr_reader :env
|
54
19
|
|
55
20
|
class << self
|
56
|
-
# Returns an array of all created boxes, as strings.
|
57
|
-
#
|
58
|
-
# @return [Array<String>]
|
59
|
-
def all(env)
|
60
|
-
results = []
|
61
|
-
|
62
|
-
Dir.open(env.boxes_path) do |dir|
|
63
|
-
dir.each do |d|
|
64
|
-
next if d == "." || d == ".." || !File.directory?(File.join(env.boxes_path, d))
|
65
|
-
results << d.to_s
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
results
|
70
|
-
end
|
71
|
-
|
72
|
-
# Finds a box with the given name. This method searches for a box
|
73
|
-
# with the given name, returning `nil` if none is found or returning
|
74
|
-
# a {Box} instance otherwise.
|
75
|
-
#
|
76
|
-
# @param [String] name The name of the box
|
77
|
-
# @return [Box] Instance of {Box} representing the box found
|
78
|
-
def find(env, name)
|
79
|
-
return nil unless File.directory?(directory(env, name))
|
80
|
-
new(env, name)
|
81
|
-
end
|
82
|
-
|
83
21
|
# Adds a new box with given name from the given URI. This method
|
84
22
|
# begins the process of adding a box from a given URI by setting up
|
85
23
|
# the {Box} instance and calling {#add}.
|
@@ -87,22 +25,10 @@ module Vagrant
|
|
87
25
|
# @param [String] name The name of the box
|
88
26
|
# @param [String] uri URI to the box file
|
89
27
|
def add(env, name, uri)
|
90
|
-
box = new
|
91
|
-
box.name = name
|
28
|
+
box = new(env, name)
|
92
29
|
box.uri = uri
|
93
|
-
box.env = env
|
94
30
|
box.add
|
95
31
|
end
|
96
|
-
|
97
|
-
# Returns the directory to a box of the given name. The name given
|
98
|
-
# as a parameter is not checked for existence; this method simply
|
99
|
-
# returns the directory which would be used if the box did exist.
|
100
|
-
#
|
101
|
-
# @param [String] name Name of the box whose directory you're interested in.
|
102
|
-
# @return [String] Full path to the box directory.
|
103
|
-
def directory(env, name)
|
104
|
-
File.join(env.boxes_path, name)
|
105
|
-
end
|
106
32
|
end
|
107
33
|
|
108
34
|
# Creates a new box instance. Given an optional `name` parameter,
|
@@ -120,19 +46,21 @@ module Vagrant
|
|
120
46
|
# virtual machine file which contains specifications of the exported
|
121
47
|
# virtual machine this box contains.
|
122
48
|
#
|
49
|
+
# This will only be valid once the box is imported.
|
50
|
+
#
|
123
51
|
# @return [String]
|
124
52
|
def ovf_file
|
125
|
-
|
53
|
+
directory.join(env.config.vm.box_ovf)
|
126
54
|
end
|
127
55
|
|
128
56
|
# Begins the process of adding a box to the vagrant installation. This
|
129
57
|
# method requires that `name` and `uri` be set. The logic of this method
|
130
|
-
# is kicked out to the
|
58
|
+
# is kicked out to the `box_add` registered middleware.
|
131
59
|
def add
|
132
60
|
env.actions.run(:box_add, { "box" => self })
|
133
61
|
end
|
134
62
|
|
135
|
-
# Begins the process of destroying this box.
|
63
|
+
# Begins the process of destroying this box. This cannot be undone!
|
136
64
|
def destroy
|
137
65
|
env.actions.run(:box_remove, { "box" => self })
|
138
66
|
end
|
@@ -143,11 +71,19 @@ module Vagrant
|
|
143
71
|
end
|
144
72
|
|
145
73
|
# Returns the directory to the location of this boxes content in the local
|
146
|
-
# filesystem.
|
74
|
+
# filesystem. Note that if the box isn't imported yet, then the path may not
|
75
|
+
# yet exist, but still represents where the box will be imported to.
|
147
76
|
#
|
148
77
|
# @return [String]
|
149
78
|
def directory
|
150
|
-
|
79
|
+
env.boxes_path.join(name)
|
80
|
+
end
|
81
|
+
|
82
|
+
# Implemented for comparison with other boxes. Comparison is implemented
|
83
|
+
# by simply comparing name.
|
84
|
+
def <=>(other)
|
85
|
+
return super if !other.is_a?(self.class)
|
86
|
+
name <=> other.name
|
151
87
|
end
|
152
88
|
end
|
153
89
|
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Vagrant
|
2
|
+
# Represents a collection of boxes, providing helpful methods for
|
3
|
+
# finding boxes. An instance of this is returned by {Environment#boxes}.
|
4
|
+
#
|
5
|
+
# # Finding a Box
|
6
|
+
#
|
7
|
+
# To find a box, use the {#find} method with the name of the box. The name
|
8
|
+
# is an exact match search.
|
9
|
+
#
|
10
|
+
# env.boxes.find("base") # => #<Vagrant::Box>
|
11
|
+
#
|
12
|
+
class BoxCollection < Array
|
13
|
+
# The environment this box collection belongs to
|
14
|
+
attr_reader :env
|
15
|
+
|
16
|
+
def initialize(env)
|
17
|
+
super()
|
18
|
+
|
19
|
+
@env = env
|
20
|
+
reload!
|
21
|
+
end
|
22
|
+
|
23
|
+
# Find a box in the collection by the given name. The name must
|
24
|
+
# be a string, for now.
|
25
|
+
def find(name)
|
26
|
+
each do |box|
|
27
|
+
return box if box.name == name
|
28
|
+
end
|
29
|
+
|
30
|
+
nil
|
31
|
+
end
|
32
|
+
|
33
|
+
# Loads the list of all boxes from the source. This modifies the
|
34
|
+
# current array.
|
35
|
+
def reload!
|
36
|
+
clear
|
37
|
+
|
38
|
+
Dir.open(env.boxes_path) do |dir|
|
39
|
+
dir.each do |d|
|
40
|
+
next if d == "." || d == ".." || !File.directory?(env.boxes_path.join(d))
|
41
|
+
self << Box.new(env, d)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
data/lib/vagrant/cli.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'thor'
|
2
|
+
|
3
|
+
module Vagrant
|
4
|
+
# Entrypoint for the Vagrant CLI. This class should never be
|
5
|
+
# initialized directly (like a typical Thor class). Instead,
|
6
|
+
# use {Environment#cli} to invoke the CLI.
|
7
|
+
#
|
8
|
+
# # Defining Custom CLI Commands
|
9
|
+
#
|
10
|
+
# If you're looking to define custom CLI commands, then look at
|
11
|
+
# one of the two following classes:
|
12
|
+
#
|
13
|
+
# * {Command::Base} - Implementing a single command such as `vagrant up`, e.g.
|
14
|
+
# one without subcommands. Also take a look at {Command::NamedBase}.
|
15
|
+
# * {Command::GroupBase} - Implementing a command with subcommands, such as
|
16
|
+
# `vagrant box`, which has the `list`, `add`, etc. subcommands.
|
17
|
+
#
|
18
|
+
# The above linked classes contain the main documentation for each
|
19
|
+
# type of command.
|
20
|
+
class CLI < Thor
|
21
|
+
# Registers the given class with the CLI so it can be accessed.
|
22
|
+
# The class must be a subclass of either {Command::Base} or {Command::GroupBase}.
|
23
|
+
# Don't call this method directly, instead call the {Command::Base.register}
|
24
|
+
# or {Command::GroupBase.register} methods.
|
25
|
+
#
|
26
|
+
# @param [Class] klass Command class
|
27
|
+
# @param [String] name Command name, accessed at `vagrant NAME`
|
28
|
+
# @param [String] usage Command usage, such as "vagrant NAME [--option]"
|
29
|
+
# @param [String] description Description of the command shown during the
|
30
|
+
# command listing.
|
31
|
+
# @param [Hash] opts Other options (not gone into detail here, look at
|
32
|
+
# the source instead).
|
33
|
+
def self.register(klass, name, usage, description, opts=nil)
|
34
|
+
opts ||= {}
|
35
|
+
|
36
|
+
if klass <= Command::GroupBase
|
37
|
+
# A subclass of GroupBase is a subcommand, since it contains
|
38
|
+
# many smaller commands within it.
|
39
|
+
desc usage, description, opts
|
40
|
+
subcommand name, klass
|
41
|
+
elsif klass <= Command::Base
|
42
|
+
# A subclass of Base is a single command, since it
|
43
|
+
# is invoked as a whole (as Thor::Group)
|
44
|
+
desc usage, description, opts
|
45
|
+
define_method(name) { |*args| invoke klass, args }
|
46
|
+
end
|
47
|
+
|
48
|
+
if opts[:alias]
|
49
|
+
# Alises are defined for this command, so properly alias the
|
50
|
+
# newly defined method/subcommand:
|
51
|
+
map opts[:alias] => name
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|