rvagrant 0.8.7.dev
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +25 -0
- data/.yardopts +1 -0
- data/CHANGELOG.md +386 -0
- data/Gemfile +21 -0
- data/LICENSE +21 -0
- data/README.md +61 -0
- data/Rakefile +11 -0
- data/bin/vagrant +28 -0
- data/config/default.rb +38 -0
- data/contrib/README.md +12 -0
- data/contrib/emacs/vagrant.el +8 -0
- data/contrib/vim/vagrantfile.vim +9 -0
- data/keys/README.md +17 -0
- data/keys/vagrant +27 -0
- data/keys/vagrant.ppk +26 -0
- data/keys/vagrant.pub +1 -0
- data/lib/vagrant.rb +44 -0
- data/lib/vagrant/action.rb +138 -0
- data/lib/vagrant/action/box.rb +11 -0
- data/lib/vagrant/action/box/destroy.rb +21 -0
- data/lib/vagrant/action/box/download.rb +72 -0
- data/lib/vagrant/action/box/package.rb +19 -0
- data/lib/vagrant/action/box/unpackage.rb +55 -0
- data/lib/vagrant/action/box/verify.rb +23 -0
- data/lib/vagrant/action/builder.rb +124 -0
- data/lib/vagrant/action/builtin.rb +108 -0
- data/lib/vagrant/action/env.rb +7 -0
- data/lib/vagrant/action/env/set.rb +18 -0
- data/lib/vagrant/action/environment.rb +50 -0
- data/lib/vagrant/action/general.rb +8 -0
- data/lib/vagrant/action/general/package.rb +113 -0
- data/lib/vagrant/action/general/validate.rb +19 -0
- data/lib/vagrant/action/vm.rb +34 -0
- data/lib/vagrant/action/vm/boot.rb +48 -0
- data/lib/vagrant/action/vm/check_accessible.rb +23 -0
- data/lib/vagrant/action/vm/check_box.rb +28 -0
- data/lib/vagrant/action/vm/check_guest_additions.rb +35 -0
- data/lib/vagrant/action/vm/clean_machine_folder.rb +43 -0
- data/lib/vagrant/action/vm/clear_forwarded_ports.rb +26 -0
- data/lib/vagrant/action/vm/clear_nfs_exports.rb +20 -0
- data/lib/vagrant/action/vm/clear_shared_folders.rb +27 -0
- data/lib/vagrant/action/vm/customize.rb +26 -0
- data/lib/vagrant/action/vm/destroy.rb +19 -0
- data/lib/vagrant/action/vm/destroy_unused_network_interfaces.rb +30 -0
- data/lib/vagrant/action/vm/discard_state.rb +22 -0
- data/lib/vagrant/action/vm/export.rb +52 -0
- data/lib/vagrant/action/vm/forward_ports.rb +133 -0
- data/lib/vagrant/action/vm/forward_ports_helpers.rb +28 -0
- data/lib/vagrant/action/vm/halt.rb +29 -0
- data/lib/vagrant/action/vm/host_name.rb +21 -0
- data/lib/vagrant/action/vm/import.rb +40 -0
- data/lib/vagrant/action/vm/match_mac_address.rb +26 -0
- data/lib/vagrant/action/vm/modify.rb +37 -0
- data/lib/vagrant/action/vm/network.rb +146 -0
- data/lib/vagrant/action/vm/nfs.rb +160 -0
- data/lib/vagrant/action/vm/nfs_helpers.rb +11 -0
- data/lib/vagrant/action/vm/package.rb +23 -0
- data/lib/vagrant/action/vm/package_vagrantfile.rb +33 -0
- data/lib/vagrant/action/vm/provision.rb +34 -0
- data/lib/vagrant/action/vm/provisioner_cleanup.rb +26 -0
- data/lib/vagrant/action/vm/resume.rb +20 -0
- data/lib/vagrant/action/vm/share_folders.rb +78 -0
- data/lib/vagrant/action/vm/suspend.rb +20 -0
- data/lib/vagrant/action/warden.rb +85 -0
- data/lib/vagrant/box.rb +90 -0
- data/lib/vagrant/box_collection.rb +53 -0
- data/lib/vagrant/cli.rb +55 -0
- data/lib/vagrant/command.rb +25 -0
- data/lib/vagrant/command/base.rb +106 -0
- data/lib/vagrant/command/box.rb +33 -0
- data/lib/vagrant/command/destroy.rb +17 -0
- data/lib/vagrant/command/group_base.rb +107 -0
- data/lib/vagrant/command/halt.rb +18 -0
- data/lib/vagrant/command/helpers.rb +33 -0
- data/lib/vagrant/command/init.rb +14 -0
- data/lib/vagrant/command/named_base.rb +14 -0
- data/lib/vagrant/command/package.rb +41 -0
- data/lib/vagrant/command/provision.rb +23 -0
- data/lib/vagrant/command/reload.rb +17 -0
- data/lib/vagrant/command/resume.rb +17 -0
- data/lib/vagrant/command/ssh.rb +49 -0
- data/lib/vagrant/command/ssh_config.rb +29 -0
- data/lib/vagrant/command/status.rb +31 -0
- data/lib/vagrant/command/suspend.rb +17 -0
- data/lib/vagrant/command/up.rb +19 -0
- data/lib/vagrant/command/upgrade_to_060.rb +45 -0
- data/lib/vagrant/command/version.rb +13 -0
- data/lib/vagrant/config.rb +123 -0
- data/lib/vagrant/config/base.rb +85 -0
- data/lib/vagrant/config/error_recorder.rb +19 -0
- data/lib/vagrant/config/nfs.rb +10 -0
- data/lib/vagrant/config/package.rb +9 -0
- data/lib/vagrant/config/ssh.rb +38 -0
- data/lib/vagrant/config/top.rb +61 -0
- data/lib/vagrant/config/vagrant.rb +17 -0
- data/lib/vagrant/config/vm.rb +148 -0
- data/lib/vagrant/config/vm/provisioner.rb +56 -0
- data/lib/vagrant/config/vm/sub_vm.rb +17 -0
- data/lib/vagrant/data_store.rb +70 -0
- data/lib/vagrant/downloaders.rb +7 -0
- data/lib/vagrant/downloaders/base.rb +23 -0
- data/lib/vagrant/downloaders/file.rb +22 -0
- data/lib/vagrant/downloaders/http.rb +70 -0
- data/lib/vagrant/environment.rb +516 -0
- data/lib/vagrant/errors.rb +352 -0
- data/lib/vagrant/hosts.rb +9 -0
- data/lib/vagrant/hosts/arch.rb +27 -0
- data/lib/vagrant/hosts/base.rb +76 -0
- data/lib/vagrant/hosts/bsd.rb +58 -0
- data/lib/vagrant/hosts/fedora.rb +11 -0
- data/lib/vagrant/hosts/linux.rb +69 -0
- data/lib/vagrant/plugin.rb +79 -0
- data/lib/vagrant/provisioners.rb +9 -0
- data/lib/vagrant/provisioners/base.rb +67 -0
- data/lib/vagrant/provisioners/chef.rb +155 -0
- data/lib/vagrant/provisioners/chef_client.rb +120 -0
- data/lib/vagrant/provisioners/chef_solo.rb +135 -0
- data/lib/vagrant/provisioners/puppet.rb +137 -0
- data/lib/vagrant/provisioners/puppet_server.rb +55 -0
- data/lib/vagrant/provisioners/shell.rb +96 -0
- data/lib/vagrant/ssh.rb +224 -0
- data/lib/vagrant/ssh/session.rb +136 -0
- data/lib/vagrant/systems.rb +13 -0
- data/lib/vagrant/systems/arch.rb +34 -0
- data/lib/vagrant/systems/base.rb +87 -0
- data/lib/vagrant/systems/debian.rb +36 -0
- data/lib/vagrant/systems/freebsd.rb +84 -0
- data/lib/vagrant/systems/gentoo.rb +27 -0
- data/lib/vagrant/systems/linux.rb +82 -0
- data/lib/vagrant/systems/linux/config.rb +21 -0
- data/lib/vagrant/systems/linux/error.rb +9 -0
- data/lib/vagrant/systems/redhat.rb +48 -0
- data/lib/vagrant/systems/solaris.rb +67 -0
- data/lib/vagrant/systems/suse.rb +9 -0
- data/lib/vagrant/systems/ubuntu.rb +17 -0
- data/lib/vagrant/test_helpers.rb +128 -0
- data/lib/vagrant/ui.rb +81 -0
- data/lib/vagrant/util.rb +13 -0
- data/lib/vagrant/util/busy.rb +59 -0
- data/lib/vagrant/util/counter.rb +24 -0
- data/lib/vagrant/util/hash_with_indifferent_access.rb +63 -0
- data/lib/vagrant/util/platform.rb +57 -0
- data/lib/vagrant/util/retryable.rb +25 -0
- data/lib/vagrant/util/safe_exec.rb +35 -0
- data/lib/vagrant/util/stacked_proc_runner.rb +35 -0
- data/lib/vagrant/util/template_renderer.rb +83 -0
- data/lib/vagrant/version.rb +6 -0
- data/lib/vagrant/vm.rb +181 -0
- data/templates/chef_server_client.erb +32 -0
- data/templates/chef_solo_solo.erb +23 -0
- data/templates/commands/init/Vagrantfile.erb +86 -0
- data/templates/config/validation_failed.erb +7 -0
- data/templates/locales/en.yml +556 -0
- data/templates/network_entry_arch.erb +9 -0
- data/templates/network_entry_debian.erb +8 -0
- data/templates/network_entry_gentoo.erb +5 -0
- data/templates/network_entry_redhat.erb +9 -0
- data/templates/nfs/exports.erb +5 -0
- data/templates/nfs/exports_linux.erb +5 -0
- data/templates/package_Vagrantfile.erb +11 -0
- data/templates/ssh_config.erb +15 -0
- data/test/unit/locales/en.yml +8 -0
- data/test/unit/test_helper.rb +28 -0
- data/test/unit/vagrant/action/box/destroy_test.rb +18 -0
- data/test/unit/vagrant/action/box/download_test.rb +125 -0
- data/test/unit/vagrant/action/box/package_test.rb +25 -0
- data/test/unit/vagrant/action/box/unpackage_test.rb +84 -0
- data/test/unit/vagrant/action/box/verify_test.rb +30 -0
- data/test/unit/vagrant/action/builder_test.rb +207 -0
- data/test/unit/vagrant/action/env/set_test.rb +24 -0
- data/test/unit/vagrant/action/environment_test.rb +27 -0
- data/test/unit/vagrant/action/general/package_test.rb +268 -0
- data/test/unit/vagrant/action/general/validate_test.rb +31 -0
- data/test/unit/vagrant/action/vm/boot_test.rb +66 -0
- data/test/unit/vagrant/action/vm/check_accessible_test.rb +61 -0
- data/test/unit/vagrant/action/vm/check_box_test.rb +56 -0
- data/test/unit/vagrant/action/vm/check_guest_additions_test.rb +9 -0
- data/test/unit/vagrant/action/vm/clean_machine_folder_test.rb +84 -0
- data/test/unit/vagrant/action/vm/clear_forwarded_ports_test.rb +52 -0
- data/test/unit/vagrant/action/vm/clear_nfs_exports_test.rb +22 -0
- data/test/unit/vagrant/action/vm/clear_shared_folders_test.rb +40 -0
- data/test/unit/vagrant/action/vm/customize_test.rb +37 -0
- data/test/unit/vagrant/action/vm/destroy_test.rb +25 -0
- data/test/unit/vagrant/action/vm/destroy_unused_network_interfaces_test.rb +49 -0
- data/test/unit/vagrant/action/vm/discard_state_test.rb +45 -0
- data/test/unit/vagrant/action/vm/export_test.rb +107 -0
- data/test/unit/vagrant/action/vm/forward_ports_helpers_test.rb +77 -0
- data/test/unit/vagrant/action/vm/forward_ports_test.rb +213 -0
- data/test/unit/vagrant/action/vm/halt_test.rb +79 -0
- data/test/unit/vagrant/action/vm/host_name_test.rb +36 -0
- data/test/unit/vagrant/action/vm/import_test.rb +66 -0
- data/test/unit/vagrant/action/vm/match_mac_address_test.rb +40 -0
- data/test/unit/vagrant/action/vm/modify_test.rb +38 -0
- data/test/unit/vagrant/action/vm/network_test.rb +286 -0
- data/test/unit/vagrant/action/vm/nfs_helpers_test.rb +26 -0
- data/test/unit/vagrant/action/vm/nfs_test.rb +260 -0
- data/test/unit/vagrant/action/vm/package_test.rb +25 -0
- data/test/unit/vagrant/action/vm/package_vagrantfile_test.rb +46 -0
- data/test/unit/vagrant/action/vm/provision_test.rb +65 -0
- data/test/unit/vagrant/action/vm/provisioner_cleanup_test.rb +56 -0
- data/test/unit/vagrant/action/vm/resume_test.rb +35 -0
- data/test/unit/vagrant/action/vm/share_folders_test.rb +144 -0
- data/test/unit/vagrant/action/vm/suspend_test.rb +35 -0
- data/test/unit/vagrant/action/warden_test.rb +125 -0
- data/test/unit/vagrant/action_test.rb +89 -0
- data/test/unit/vagrant/box_collection_test.rb +45 -0
- data/test/unit/vagrant/box_test.rb +74 -0
- data/test/unit/vagrant/cli_test.rb +35 -0
- data/test/unit/vagrant/command/base_test.rb +23 -0
- data/test/unit/vagrant/command/group_base_test.rb +15 -0
- data/test/unit/vagrant/command/helpers_test.rb +88 -0
- data/test/unit/vagrant/command/package_test.rb +27 -0
- data/test/unit/vagrant/config/base_test.rb +52 -0
- data/test/unit/vagrant/config/error_recorder_test.rb +18 -0
- data/test/unit/vagrant/config/ssh_test.rb +12 -0
- data/test/unit/vagrant/config/vagrant_test.rb +35 -0
- data/test/unit/vagrant/config/vm/provisioner_test.rb +92 -0
- data/test/unit/vagrant/config/vm_test.rb +56 -0
- data/test/unit/vagrant/config_test.rb +162 -0
- data/test/unit/vagrant/data_store_test.rb +77 -0
- data/test/unit/vagrant/downloaders/base_test.rb +28 -0
- data/test/unit/vagrant/downloaders/file_test.rb +48 -0
- data/test/unit/vagrant/downloaders/http_test.rb +82 -0
- data/test/unit/vagrant/environment_test.rb +598 -0
- data/test/unit/vagrant/errors_test.rb +42 -0
- data/test/unit/vagrant/hosts/base_test.rb +46 -0
- data/test/unit/vagrant/hosts/bsd_test.rb +53 -0
- data/test/unit/vagrant/hosts/linux_test.rb +54 -0
- data/test/unit/vagrant/plugin_test.rb +9 -0
- data/test/unit/vagrant/provisioners/base_test.rb +63 -0
- data/test/unit/vagrant/provisioners/chef_client_test.rb +190 -0
- data/test/unit/vagrant/provisioners/chef_solo_test.rb +114 -0
- data/test/unit/vagrant/provisioners/chef_test.rb +202 -0
- data/test/unit/vagrant/provisioners/puppet_server_test.rb +68 -0
- data/test/unit/vagrant/provisioners/puppet_test.rb +182 -0
- data/test/unit/vagrant/provisioners/shell_test.rb +79 -0
- data/test/unit/vagrant/ssh/session_test.rb +40 -0
- data/test/unit/vagrant/ssh_test.rb +307 -0
- data/test/unit/vagrant/systems/base_test.rb +18 -0
- data/test/unit/vagrant/systems/linux_test.rb +104 -0
- data/test/unit/vagrant/ui_test.rb +29 -0
- data/test/unit/vagrant/util/busy_test.rb +106 -0
- data/test/unit/vagrant/util/counter_test.rb +29 -0
- data/test/unit/vagrant/util/hash_with_indifferent_access_test.rb +39 -0
- data/test/unit/vagrant/util/platform_test.rb +18 -0
- data/test/unit/vagrant/util/retryable_test.rb +50 -0
- data/test/unit/vagrant/util/stacked_proc_runner_test.rb +43 -0
- data/test/unit/vagrant/util/template_renderer_test.rb +145 -0
- data/test/unit/vagrant/vm_test.rb +300 -0
- data/vagrant.gemspec +35 -0
- metadata +431 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
class Action
|
|
3
|
+
module VM
|
|
4
|
+
class ProvisionerCleanup
|
|
5
|
+
def initialize(app, env)
|
|
6
|
+
@app = app
|
|
7
|
+
@env = env
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def call(env)
|
|
11
|
+
enabled_provisioners.each do |instance|
|
|
12
|
+
instance.cleanup
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
@app.call(env)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def enabled_provisioners
|
|
19
|
+
@env["config"].vm.provisioners.map do |provisioner|
|
|
20
|
+
provisioner.provisioner.new(@env, provisioner.config)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
class Action
|
|
3
|
+
module VM
|
|
4
|
+
class Resume
|
|
5
|
+
def initialize(app, env)
|
|
6
|
+
@app = app
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def call(env)
|
|
10
|
+
if env["vm"].vm.saved?
|
|
11
|
+
env.ui.info I18n.t("vagrant.actions.vm.resume.resuming")
|
|
12
|
+
env["actions"].run(Boot)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
@app.call(env)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
class Action
|
|
3
|
+
module VM
|
|
4
|
+
class ShareFolders
|
|
5
|
+
def initialize(app, env)
|
|
6
|
+
@app = app
|
|
7
|
+
@env = env
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def call(env)
|
|
11
|
+
@env = env
|
|
12
|
+
|
|
13
|
+
create_metadata
|
|
14
|
+
|
|
15
|
+
@app.call(env)
|
|
16
|
+
|
|
17
|
+
mount_shared_folders
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# This method returns an actual list of VirtualBox shared
|
|
21
|
+
# folders to create and their proper path.
|
|
22
|
+
def shared_folders
|
|
23
|
+
@env.env.config.vm.shared_folders.inject({}) do |acc, data|
|
|
24
|
+
key, value = data
|
|
25
|
+
|
|
26
|
+
next acc if value[:disabled]
|
|
27
|
+
|
|
28
|
+
# This to prevent overwriting the actual shared folders data
|
|
29
|
+
value = value.dup
|
|
30
|
+
acc[key] = value
|
|
31
|
+
acc
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def create_metadata
|
|
36
|
+
proc = lambda do |vm|
|
|
37
|
+
@env.ui.info I18n.t("vagrant.actions.vm.share_folders.creating")
|
|
38
|
+
|
|
39
|
+
shared_folders.each do |name, data|
|
|
40
|
+
folder = VirtualBox::SharedFolder.new
|
|
41
|
+
folder.name = name
|
|
42
|
+
folder.host_path = File.expand_path(data[:hostpath], @env.env.root_path)
|
|
43
|
+
vm.shared_folders << folder
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
@env["vm.modify"].call(proc)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def mount_shared_folders
|
|
51
|
+
@env.ui.info I18n.t("vagrant.actions.vm.share_folders.mounting")
|
|
52
|
+
|
|
53
|
+
@env["vm"].ssh.execute do |ssh|
|
|
54
|
+
shared_folders.each do |name, data|
|
|
55
|
+
if data[:guestpath]
|
|
56
|
+
# Guest path specified, so mount the folder to specified point
|
|
57
|
+
@env.ui.info(I18n.t("vagrant.actions.vm.share_folders.mounting_entry",
|
|
58
|
+
:name => name,
|
|
59
|
+
:guest_path => data[:guestpath]))
|
|
60
|
+
|
|
61
|
+
# Calculate the owner and group
|
|
62
|
+
owner = data[:owner] || @env["config"].ssh.username
|
|
63
|
+
group = data[:group] || @env["config"].ssh.username
|
|
64
|
+
|
|
65
|
+
# Mount the actual folder
|
|
66
|
+
@env["vm"].system.mount_shared_folder(ssh, name, data[:guestpath], owner, group)
|
|
67
|
+
else
|
|
68
|
+
# If no guest path is specified, then automounting is disabled
|
|
69
|
+
@env.ui.info(I18n.t("vagrant.actions.vm.share_folders.nomount_entry",
|
|
70
|
+
:name => name))
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
class Action
|
|
3
|
+
module VM
|
|
4
|
+
class Suspend
|
|
5
|
+
def initialize(app, env)
|
|
6
|
+
@app = app
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def call(env)
|
|
10
|
+
if env["vm"].vm.running?
|
|
11
|
+
env.ui.info I18n.t("vagrant.actions.vm.suspend.suspending")
|
|
12
|
+
env["vm"].vm.save_state
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
@app.call(env)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,85 @@
|
|
|
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
|
+
# Warden will "just work" behind the scenes, and is not of particular
|
|
11
|
+
# interest except to those who are curious about the internal workings
|
|
12
|
+
# of Vagrant.
|
|
13
|
+
class Warden
|
|
14
|
+
attr_accessor :actions, :stack
|
|
15
|
+
|
|
16
|
+
def initialize(actions, env)
|
|
17
|
+
@stack = []
|
|
18
|
+
@actions = actions.map { |m| finalize_action(m, env) }
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def call(env)
|
|
22
|
+
return if @actions.empty?
|
|
23
|
+
|
|
24
|
+
begin
|
|
25
|
+
# Call the next middleware in the sequence, appending to the stack
|
|
26
|
+
# of "recoverable" middlewares in case something goes wrong!
|
|
27
|
+
raise Errors::VagrantInterrupt if env.interrupted?
|
|
28
|
+
action = @actions.shift
|
|
29
|
+
env["logger"].info("warden") { "Calling action: #{action}" }
|
|
30
|
+
@stack.unshift(action).first.call(env)
|
|
31
|
+
raise Errors::VagrantInterrupt if env.interrupted?
|
|
32
|
+
rescue SystemExit
|
|
33
|
+
# This means that an "exit" or "abort" was called. In these cases,
|
|
34
|
+
# we just exit immediately.
|
|
35
|
+
raise
|
|
36
|
+
rescue Exception => e
|
|
37
|
+
env["logger"].info("warden") { "Error occurred: #{e}" }
|
|
38
|
+
env["vagrant.error"] = e
|
|
39
|
+
|
|
40
|
+
# Something went horribly wrong. Start the rescue chain then
|
|
41
|
+
# reraise the exception to properly kick us out of limbo here.
|
|
42
|
+
begin_rescue(env)
|
|
43
|
+
raise
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Begins the recovery sequence for all middlewares which have run.
|
|
48
|
+
# It does this by calling `recover` (if it exists) on each middleware
|
|
49
|
+
# which has already run, in reverse order.
|
|
50
|
+
def begin_rescue(env)
|
|
51
|
+
@stack.each do |act|
|
|
52
|
+
if act.respond_to?(:recover)
|
|
53
|
+
env["logger"].info("warden") { "Calling recover: #{act}" }
|
|
54
|
+
act.recover(env)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Clear stack so that warden down the middleware chain doesn't
|
|
59
|
+
# rescue again.
|
|
60
|
+
@stack.clear
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# A somewhat confusing function which simply initializes each
|
|
64
|
+
# middleware properly to call the next middleware in the sequence.
|
|
65
|
+
def finalize_action(action, env)
|
|
66
|
+
klass, args, block = action
|
|
67
|
+
|
|
68
|
+
if klass.is_a?(Class)
|
|
69
|
+
# A action klass which is to be instantiated with the
|
|
70
|
+
# app, env, and any arguments given
|
|
71
|
+
klass.new(self, env, *args, &block)
|
|
72
|
+
elsif klass.respond_to?(:call)
|
|
73
|
+
# Make it a lambda which calls the item then forwards
|
|
74
|
+
# up the chain
|
|
75
|
+
lambda do |e|
|
|
76
|
+
klass.call(e)
|
|
77
|
+
self.call(e)
|
|
78
|
+
end
|
|
79
|
+
else
|
|
80
|
+
raise "Invalid action: #{action.inspect}"
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
data/lib/vagrant/box.rb
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
# Represents a "box," which is simply a packaged vagrant environment.
|
|
3
|
+
# Boxes are simply `tar` files which contain an exported VirtualBox
|
|
4
|
+
# virtual machine, at the least. They are created with `vagrant package`
|
|
5
|
+
# and may contain additional files if specified by the creator. This
|
|
6
|
+
# class serves to help manage these boxes, although most of the logic
|
|
7
|
+
# is kicked out to middlewares.
|
|
8
|
+
class Box
|
|
9
|
+
# The name of the box.
|
|
10
|
+
attr_accessor :name
|
|
11
|
+
|
|
12
|
+
# The URI for a new box. This is not available for existing boxes.
|
|
13
|
+
attr_accessor :uri
|
|
14
|
+
|
|
15
|
+
# The environment which this box belongs to. Although this could
|
|
16
|
+
# actually be many environments, this points to the environment
|
|
17
|
+
# of a specific instance.
|
|
18
|
+
attr_reader :env
|
|
19
|
+
|
|
20
|
+
class << self
|
|
21
|
+
# Adds a new box with given name from the given URI. This method
|
|
22
|
+
# begins the process of adding a box from a given URI by setting up
|
|
23
|
+
# the {Box} instance and calling {#add}.
|
|
24
|
+
#
|
|
25
|
+
# @param [String] name The name of the box
|
|
26
|
+
# @param [String] uri URI to the box file
|
|
27
|
+
def add(env, name, uri)
|
|
28
|
+
box = new(env, name)
|
|
29
|
+
box.uri = uri
|
|
30
|
+
box.add
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Creates a new box instance. Given an optional `name` parameter,
|
|
35
|
+
# newly created instance will have that name, otherwise it defaults
|
|
36
|
+
# to `nil`.
|
|
37
|
+
#
|
|
38
|
+
# **Note:** This method does not actually _create_ the box, but merely
|
|
39
|
+
# returns a new, abstract representation of it. To add a box, see {#add}.
|
|
40
|
+
def initialize(env=nil, name=nil)
|
|
41
|
+
@name = name
|
|
42
|
+
@env = env
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Returns path to the OVF file of the box. The OVF file is an open
|
|
46
|
+
# virtual machine file which contains specifications of the exported
|
|
47
|
+
# virtual machine this box contains.
|
|
48
|
+
#
|
|
49
|
+
# This will only be valid once the box is imported.
|
|
50
|
+
#
|
|
51
|
+
# @return [String]
|
|
52
|
+
def ovf_file
|
|
53
|
+
directory.join(env.config.vm.box_ovf)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Begins the process of adding a box to the vagrant installation. This
|
|
57
|
+
# method requires that `name` and `uri` be set. The logic of this method
|
|
58
|
+
# is kicked out to the `box_add` registered middleware.
|
|
59
|
+
def add
|
|
60
|
+
raise Errors::BoxAlreadyExists, :name => name if File.directory?(directory)
|
|
61
|
+
env.actions.run(:box_add, { "box" => self, "validate" => false })
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Begins the process of destroying this box. This cannot be undone!
|
|
65
|
+
def destroy
|
|
66
|
+
env.actions.run(:box_remove, { "box" => self, "validate" => false })
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Begins sequence to repackage this box.
|
|
70
|
+
def repackage(options=nil)
|
|
71
|
+
env.actions.run(:box_repackage, { "box" => self, "validate" => false }.merge(options || {}))
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Returns the directory to the location of this boxes content in the local
|
|
75
|
+
# filesystem. Note that if the box isn't imported yet, then the path may not
|
|
76
|
+
# yet exist, but still represents where the box will be imported to.
|
|
77
|
+
#
|
|
78
|
+
# @return [String]
|
|
79
|
+
def directory
|
|
80
|
+
env.boxes_path.join(name)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Implemented for comparison with other boxes. Comparison is implemented
|
|
84
|
+
# by simply comparing name.
|
|
85
|
+
def <=>(other)
|
|
86
|
+
return super if !other.is_a?(self.class)
|
|
87
|
+
name <=> other.name
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
require 'forwardable'
|
|
2
|
+
|
|
3
|
+
module Vagrant
|
|
4
|
+
# Represents a collection of boxes, providing helpful methods for
|
|
5
|
+
# finding boxes. An instance of this is returned by {Environment#boxes}.
|
|
6
|
+
#
|
|
7
|
+
# # Finding a Box
|
|
8
|
+
#
|
|
9
|
+
# To find a box, use the {#find} method with the name of the box. The name
|
|
10
|
+
# is an exact match search.
|
|
11
|
+
#
|
|
12
|
+
# env.boxes.find("base") # => #<Vagrant::Box>
|
|
13
|
+
#
|
|
14
|
+
class BoxCollection
|
|
15
|
+
include Enumerable
|
|
16
|
+
extend Forwardable
|
|
17
|
+
def_delegators :@boxes, :length, :each
|
|
18
|
+
|
|
19
|
+
# The environment this box collection belongs to
|
|
20
|
+
attr_reader :env
|
|
21
|
+
|
|
22
|
+
def initialize(env)
|
|
23
|
+
@env = env
|
|
24
|
+
@boxes = []
|
|
25
|
+
|
|
26
|
+
reload!
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Find a box in the collection by the given name. The name must
|
|
30
|
+
# be a string, for now.
|
|
31
|
+
def find(name)
|
|
32
|
+
@boxes.each do |box|
|
|
33
|
+
return box if box.name == name
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
nil
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Loads the list of all boxes from the source. This modifies the
|
|
40
|
+
# current array.
|
|
41
|
+
def reload!
|
|
42
|
+
@boxes.clear
|
|
43
|
+
|
|
44
|
+
Dir.open(env.boxes_path) do |dir|
|
|
45
|
+
dir.each do |d|
|
|
46
|
+
next if d == "." || d == ".." || !File.directory?(env.boxes_path.join(d))
|
|
47
|
+
@boxes << Box.new(env, d)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
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
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
module Command
|
|
3
|
+
autoload :Base, 'vagrant/command/base'
|
|
4
|
+
autoload :GroupBase, 'vagrant/command/group_base'
|
|
5
|
+
autoload :Helpers, 'vagrant/command/helpers'
|
|
6
|
+
autoload :NamedBase, 'vagrant/command/named_base'
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# The built-in commands must always be loaded
|
|
11
|
+
require 'vagrant/command/box'
|
|
12
|
+
require 'vagrant/command/destroy'
|
|
13
|
+
require 'vagrant/command/halt'
|
|
14
|
+
require 'vagrant/command/init'
|
|
15
|
+
require 'vagrant/command/package'
|
|
16
|
+
require 'vagrant/command/provision'
|
|
17
|
+
require 'vagrant/command/reload'
|
|
18
|
+
require 'vagrant/command/resume'
|
|
19
|
+
require 'vagrant/command/ssh'
|
|
20
|
+
require 'vagrant/command/ssh_config'
|
|
21
|
+
require 'vagrant/command/status'
|
|
22
|
+
require 'vagrant/command/suspend'
|
|
23
|
+
require 'vagrant/command/up'
|
|
24
|
+
require 'vagrant/command/upgrade_to_060'
|
|
25
|
+
require 'vagrant/command/version'
|