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,27 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
class Action
|
|
3
|
+
module VM
|
|
4
|
+
class ClearSharedFolders
|
|
5
|
+
def initialize(app, env)
|
|
6
|
+
@app = app
|
|
7
|
+
@env = env
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def call(env)
|
|
11
|
+
proc = lambda do |vm|
|
|
12
|
+
if vm.shared_folders.length > 0
|
|
13
|
+
env.ui.info I18n.t("vagrant.actions.vm.clear_shared_folders.deleting")
|
|
14
|
+
|
|
15
|
+
vm.shared_folders.dup.each do |shared_folder|
|
|
16
|
+
shared_folder.destroy
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
env["vm.modify"].call(proc)
|
|
22
|
+
@app.call(env)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
class Action
|
|
3
|
+
module VM
|
|
4
|
+
class Customize
|
|
5
|
+
def initialize(app, env)
|
|
6
|
+
@app = app
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def call(env)
|
|
10
|
+
if !env["config"].vm.proc_stack.empty?
|
|
11
|
+
# Create the proc which runs all of our procs
|
|
12
|
+
proc = lambda do |vm|
|
|
13
|
+
env.ui.info I18n.t("vagrant.actions.vm.customize.running")
|
|
14
|
+
env["config"].vm.run_procs!(vm)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Add it to modify sequence
|
|
18
|
+
env["vm.modify"].call(proc)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
@app.call(env)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
class Action
|
|
3
|
+
module VM
|
|
4
|
+
class Destroy
|
|
5
|
+
def initialize(app, env)
|
|
6
|
+
@app = app
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def call(env)
|
|
10
|
+
env.ui.info I18n.t("vagrant.actions.vm.destroy.destroying")
|
|
11
|
+
env["vm"].vm.destroy
|
|
12
|
+
env["vm"].vm = nil
|
|
13
|
+
|
|
14
|
+
@app.call(env)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
class Action
|
|
3
|
+
module VM
|
|
4
|
+
# Destroys the unused host only interfaces. This middleware cleans
|
|
5
|
+
# up any created host only networks.
|
|
6
|
+
class DestroyUnusedNetworkInterfaces
|
|
7
|
+
def initialize(app, env)
|
|
8
|
+
@app = app
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def call(env)
|
|
12
|
+
# Destroy all the host only network adapters which are empty.
|
|
13
|
+
VirtualBox::Global.global(true).host.network_interfaces.each do |iface|
|
|
14
|
+
# We only care about host only interfaces
|
|
15
|
+
next if iface.interface_type != :host_only
|
|
16
|
+
|
|
17
|
+
# Destroy it if there is nothing attached
|
|
18
|
+
if iface.attached_vms.empty?
|
|
19
|
+
env.ui.info I18n.t("vagrant.actions.vm.destroy_network.destroying")
|
|
20
|
+
iface.destroy
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Continue along
|
|
25
|
+
@app.call(env)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
class Action
|
|
3
|
+
module VM
|
|
4
|
+
# Discards the saved state of the VM if its saved. If its
|
|
5
|
+
# not saved, does nothing.
|
|
6
|
+
class DiscardState
|
|
7
|
+
def initialize(app, env)
|
|
8
|
+
@app = app
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def call(env)
|
|
12
|
+
if env["vm"].created? && env["vm"].vm.saved?
|
|
13
|
+
env.ui.info I18n.t("vagrant.actions.vm.discard_state.discarding")
|
|
14
|
+
env["vm"].vm.discard_state
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
@app.call(env)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
|
|
3
|
+
module Vagrant
|
|
4
|
+
class Action
|
|
5
|
+
module VM
|
|
6
|
+
class Export
|
|
7
|
+
attr_reader :temp_dir
|
|
8
|
+
|
|
9
|
+
def initialize(app, env)
|
|
10
|
+
@app = app
|
|
11
|
+
@env = env
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def call(env)
|
|
15
|
+
@env = env
|
|
16
|
+
|
|
17
|
+
raise Errors::VMPowerOffToPackage if !@env["vm"].vm.powered_off?
|
|
18
|
+
|
|
19
|
+
setup_temp_dir
|
|
20
|
+
export
|
|
21
|
+
|
|
22
|
+
@app.call(env)
|
|
23
|
+
|
|
24
|
+
recover(env) # called to cleanup temp directory
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def recover(env)
|
|
28
|
+
if temp_dir && File.exist?(temp_dir)
|
|
29
|
+
FileUtils.rm_rf(temp_dir)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def setup_temp_dir
|
|
34
|
+
@env.ui.info I18n.t("vagrant.actions.vm.export.create_dir")
|
|
35
|
+
@temp_dir = @env["export.temp_dir"] = @env.env.tmp_path.join(Time.now.to_i.to_s)
|
|
36
|
+
FileUtils.mkpath(@env["export.temp_dir"])
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def export
|
|
40
|
+
@env.ui.info I18n.t("vagrant.actions.vm.export.exporting")
|
|
41
|
+
@env["vm"].vm.export(ovf_path) do |progress|
|
|
42
|
+
@env.ui.report_progress(progress.percent, 100, false)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def ovf_path
|
|
47
|
+
File.join(@env["export.temp_dir"], @env.env.config.vm.box_ovf)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'forward_ports_helpers')
|
|
2
|
+
|
|
3
|
+
module Vagrant
|
|
4
|
+
class Action
|
|
5
|
+
module VM
|
|
6
|
+
class ForwardPorts
|
|
7
|
+
include ForwardPortsHelpers
|
|
8
|
+
|
|
9
|
+
def initialize(app,env)
|
|
10
|
+
@app = app
|
|
11
|
+
@env = env
|
|
12
|
+
|
|
13
|
+
threshold_check unless ENV["USER"] == "root"
|
|
14
|
+
external_collision_check
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
#--------------------------------------------------------------
|
|
18
|
+
# Prepare Helpers - These functions are not involved in actually
|
|
19
|
+
# executing the action
|
|
20
|
+
#--------------------------------------------------------------
|
|
21
|
+
|
|
22
|
+
# This method checks for any forwarded ports on the host below
|
|
23
|
+
# 1024, which causes the forwarded ports to fail.
|
|
24
|
+
def threshold_check
|
|
25
|
+
@env.env.config.vm.forwarded_ports.each do |name, options|
|
|
26
|
+
raise Errors::ForwardPortBelowThreshold if options[:hostport] <= 1024
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# This method checks for any port collisions with any VMs
|
|
31
|
+
# which are already created (by Vagrant or otherwise).
|
|
32
|
+
# report the collisions detected or will attempt to fix them
|
|
33
|
+
# automatically if the port is configured to do so.
|
|
34
|
+
def external_collision_check
|
|
35
|
+
existing = used_ports
|
|
36
|
+
@env.env.config.vm.forwarded_ports.each do |name, options|
|
|
37
|
+
if existing.include?(options[:hostport].to_i)
|
|
38
|
+
handle_collision(name, options, existing)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Handles any collisions. This method will either attempt to
|
|
44
|
+
# fix the collision automatically or will raise an error if
|
|
45
|
+
# auto fixing is disabled.
|
|
46
|
+
def handle_collision(name, options, existing_ports)
|
|
47
|
+
if !options[:auto]
|
|
48
|
+
# Auto fixing is disabled for this port forward, so we
|
|
49
|
+
# must throw an error so the user can fix it.
|
|
50
|
+
raise Errors::ForwardPortCollision, :name => name,
|
|
51
|
+
:host_port => options[:hostport].to_s,
|
|
52
|
+
:guest_port => options[:guestport].to_s
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Get the auto port range and get rid of the used ports and
|
|
56
|
+
# ports which are being used in other forwards so we're just
|
|
57
|
+
# left with available ports.
|
|
58
|
+
range = @env.env.config.vm.auto_port_range.to_a
|
|
59
|
+
range -= @env.env.config.vm.forwarded_ports.collect { |n, o| o[:hostport].to_i }
|
|
60
|
+
range -= existing_ports
|
|
61
|
+
|
|
62
|
+
if range.empty?
|
|
63
|
+
raise Errors::ForwardPortAutolistEmpty, :vm_name => @env["vm"].name,
|
|
64
|
+
:name => name,
|
|
65
|
+
:host_port => options[:hostport].to_s,
|
|
66
|
+
:guest_port => options[:guestport].to_s
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Set the port up to be the first one and add that port to
|
|
70
|
+
# the used list.
|
|
71
|
+
options[:hostport] = range.shift
|
|
72
|
+
existing_ports << options[:hostport]
|
|
73
|
+
|
|
74
|
+
# Notify the user
|
|
75
|
+
@env.ui.info(I18n.t("vagrant.actions.vm.forward_ports.fixed_collision",
|
|
76
|
+
:name => name,
|
|
77
|
+
:new_port => options[:hostport]))
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
#--------------------------------------------------------------
|
|
81
|
+
# Execution
|
|
82
|
+
#--------------------------------------------------------------
|
|
83
|
+
def call(env)
|
|
84
|
+
@env = env
|
|
85
|
+
|
|
86
|
+
proc = lambda do |vm|
|
|
87
|
+
env.ui.info I18n.t("vagrant.actions.vm.forward_ports.forwarding")
|
|
88
|
+
forward_ports(vm)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
env["vm.modify"].call(proc)
|
|
92
|
+
@app.call(env)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def forward_ports(vm)
|
|
96
|
+
@env.env.config.vm.forwarded_ports.each do |name, options|
|
|
97
|
+
adapter = options[:adapter]
|
|
98
|
+
message_attributes = {
|
|
99
|
+
:name => name,
|
|
100
|
+
:guest_port => options[:guestport],
|
|
101
|
+
:host_port => options[:hostport],
|
|
102
|
+
:adapter => adapter + 1
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
# Assuming the only reason to establish port forwarding is because the VM is using Virtualbox NAT networking.
|
|
106
|
+
# Host-only or Bridged networking don't require port-forwarding and establishing forwarded ports on these
|
|
107
|
+
# attachment types has uncertain behaviour.
|
|
108
|
+
if vm.network_adapters[adapter].attachment_type == :nat
|
|
109
|
+
@env.ui.info(I18n.t("vagrant.actions.vm.forward_ports.forwarding_entry", message_attributes))
|
|
110
|
+
forward_port(vm, name, options)
|
|
111
|
+
else
|
|
112
|
+
@env.ui.info(I18n.t("vagrant.actions.vm.forward_ports.non_nat", message_attributes))
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
#--------------------------------------------------------------
|
|
118
|
+
# General Helpers
|
|
119
|
+
#--------------------------------------------------------------
|
|
120
|
+
|
|
121
|
+
# Forwards a port.
|
|
122
|
+
def forward_port(vm, name, options)
|
|
123
|
+
port = VirtualBox::NATForwardedPort.new
|
|
124
|
+
port.name = name
|
|
125
|
+
port.guestport = options[:guestport]
|
|
126
|
+
port.hostport = options[:hostport]
|
|
127
|
+
port.protocol = options[:protocol] || :tcp
|
|
128
|
+
vm.network_adapters[options[:adapter]].nat_driver.forwarded_ports << port
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
class Action
|
|
3
|
+
module VM
|
|
4
|
+
# Helper methods for forwarding ports. Requires that the environment
|
|
5
|
+
# is set to the `@env` instance variable.
|
|
6
|
+
module ForwardPortsHelpers
|
|
7
|
+
# Returns an array of used ports. This method is implemented
|
|
8
|
+
# differently depending on the VirtualBox version, but the
|
|
9
|
+
# behavior is the same.
|
|
10
|
+
#
|
|
11
|
+
# @return [Array<String>]
|
|
12
|
+
def used_ports
|
|
13
|
+
result = VirtualBox::VM.all.collect do |vm|
|
|
14
|
+
if vm.accessible? && vm.running? && vm.uuid != @env["vm"].uuid
|
|
15
|
+
vm.network_adapters.collect do |na|
|
|
16
|
+
na.nat_driver.forwarded_ports.collect do |fp|
|
|
17
|
+
fp.hostport.to_i
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
result.flatten.uniq
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
class Action
|
|
3
|
+
module VM
|
|
4
|
+
class Halt
|
|
5
|
+
def initialize(app, env, options=nil)
|
|
6
|
+
@app = app
|
|
7
|
+
env.merge!(options || {})
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def call(env)
|
|
11
|
+
if env["vm"].created? && env["vm"].vm.running?
|
|
12
|
+
env["vm"].system.halt if !env["force"]
|
|
13
|
+
|
|
14
|
+
if env["vm"].vm.state(true) != :powered_off
|
|
15
|
+
env.ui.info I18n.t("vagrant.actions.vm.halt.force")
|
|
16
|
+
env["vm"].vm.stop
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Sleep for a second to verify that the VM properly
|
|
20
|
+
# cleans itself up
|
|
21
|
+
sleep 1 if !env["vagrant.test"]
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
@app.call(env)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
class Action
|
|
3
|
+
module VM
|
|
4
|
+
class HostName
|
|
5
|
+
def initialize(app, env)
|
|
6
|
+
@app = app
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def call(env)
|
|
10
|
+
@app.call(env)
|
|
11
|
+
|
|
12
|
+
host_name = env["config"].vm.host_name
|
|
13
|
+
if !host_name.nil?
|
|
14
|
+
env.ui.info I18n.t("vagrant.actions.vm.host_name.setting")
|
|
15
|
+
env["vm"].system.change_host_name(host_name)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
class Action
|
|
3
|
+
module VM
|
|
4
|
+
class Import
|
|
5
|
+
def initialize(app, env)
|
|
6
|
+
@app = app
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def call(env)
|
|
10
|
+
env.ui.info I18n.t("vagrant.actions.vm.import.importing", :name => env.env.box.name)
|
|
11
|
+
|
|
12
|
+
# Import the virtual machine
|
|
13
|
+
env.env.vm.vm = VirtualBox::VM.import(env.env.box.ovf_file.to_s) do |progress|
|
|
14
|
+
env.ui.clear_line
|
|
15
|
+
env.ui.report_progress(progress.percent, 100, false)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Clear the line one last time since the progress meter doesn't disappear
|
|
19
|
+
# immediately.
|
|
20
|
+
env.ui.clear_line
|
|
21
|
+
|
|
22
|
+
# Flag as erroneous and return if import failed
|
|
23
|
+
raise Errors::VMImportFailure if !env["vm"].vm
|
|
24
|
+
|
|
25
|
+
# Import completed successfully. Continue the chain
|
|
26
|
+
@app.call(env)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def recover(env)
|
|
30
|
+
if env["vm"].created?
|
|
31
|
+
return if env["vagrant.error"].is_a?(Errors::VagrantError)
|
|
32
|
+
|
|
33
|
+
# Interrupted, destroy the VM
|
|
34
|
+
env["actions"].run(:destroy)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
class Action
|
|
3
|
+
module VM
|
|
4
|
+
class MatchMACAddress
|
|
5
|
+
def initialize(app, env)
|
|
6
|
+
@app = app
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def call(env)
|
|
10
|
+
raise Errors::VMBaseMacNotSpecified if !env.env.config.vm.base_mac
|
|
11
|
+
|
|
12
|
+
# Create the proc which we want to use to modify the virtual machine
|
|
13
|
+
proc = lambda do |vm|
|
|
14
|
+
env.ui.info I18n.t("vagrant.actions.vm.match_mac.matching")
|
|
15
|
+
vm.network_adapters.first.mac_address = env["config"].vm.base_mac
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Add the proc to the modification chain
|
|
19
|
+
env["vm.modify"].call(proc)
|
|
20
|
+
|
|
21
|
+
@app.call(env)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|