tnargav 1.2.2
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 +31 -0
- data/.gitsetup.yml +5 -0
- data/.travis.yml +7 -0
- data/.yardopts +1 -0
- data/CHANGELOG.md +1067 -0
- data/Gemfile +3 -0
- data/LICENSE +21 -0
- data/README.md +89 -0
- data/Rakefile +18 -0
- data/bin/vagrant +106 -0
- data/config/default.rb +36 -0
- data/contrib/README.md +12 -0
- data/contrib/bash/completion.sh +3 -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.pub +1 -0
- data/lib/vagrant/action/builder.rb +174 -0
- data/lib/vagrant/action/builtin/box_add.rb +81 -0
- data/lib/vagrant/action/builtin/call.rb +67 -0
- data/lib/vagrant/action/builtin/config_validate.rb +30 -0
- data/lib/vagrant/action/builtin/confirm.rb +38 -0
- data/lib/vagrant/action/builtin/destroy_confirm.rb +21 -0
- data/lib/vagrant/action/builtin/env_set.rb +24 -0
- data/lib/vagrant/action/builtin/graceful_halt.rb +73 -0
- data/lib/vagrant/action/builtin/handle_box_url.rb +77 -0
- data/lib/vagrant/action/builtin/handle_forwarded_port_collisions.rb +134 -0
- data/lib/vagrant/action/builtin/lock.rb +57 -0
- data/lib/vagrant/action/builtin/nfs.rb +118 -0
- data/lib/vagrant/action/builtin/provision.rb +70 -0
- data/lib/vagrant/action/builtin/set_hostname.rb +27 -0
- data/lib/vagrant/action/builtin/ssh_exec.rb +42 -0
- data/lib/vagrant/action/builtin/ssh_run.rb +43 -0
- data/lib/vagrant/action/general/package.rb +103 -0
- data/lib/vagrant/action/hook.rb +107 -0
- data/lib/vagrant/action/runner.rb +69 -0
- data/lib/vagrant/action/warden.rb +103 -0
- data/lib/vagrant/action.rb +43 -0
- data/lib/vagrant/batch_action.rb +113 -0
- data/lib/vagrant/box.rb +97 -0
- data/lib/vagrant/box_collection.rb +375 -0
- data/lib/vagrant/cli.rb +82 -0
- data/lib/vagrant/config/loader.rb +222 -0
- data/lib/vagrant/config/v1/dummy_config.rb +13 -0
- data/lib/vagrant/config/v1/loader.rb +105 -0
- data/lib/vagrant/config/v1/root.rb +60 -0
- data/lib/vagrant/config/v1.rb +9 -0
- data/lib/vagrant/config/v2/dummy_config.rb +13 -0
- data/lib/vagrant/config/v2/loader.rb +141 -0
- data/lib/vagrant/config/v2/root.rb +105 -0
- data/lib/vagrant/config/v2/util.rb +21 -0
- data/lib/vagrant/config/v2.rb +9 -0
- data/lib/vagrant/config/version_base.rb +80 -0
- data/lib/vagrant/config.rb +61 -0
- data/lib/vagrant/environment.rb +843 -0
- data/lib/vagrant/errors.rb +570 -0
- data/lib/vagrant/guest.rb +163 -0
- data/lib/vagrant/hosts.rb +28 -0
- data/lib/vagrant/machine.rb +325 -0
- data/lib/vagrant/machine_state.rb +45 -0
- data/lib/vagrant/plugin/v1/command.rb +169 -0
- data/lib/vagrant/plugin/v1/communicator.rb +98 -0
- data/lib/vagrant/plugin/v1/config.rb +112 -0
- data/lib/vagrant/plugin/v1/errors.rb +15 -0
- data/lib/vagrant/plugin/v1/guest.rb +92 -0
- data/lib/vagrant/plugin/v1/host.rb +66 -0
- data/lib/vagrant/plugin/v1/manager.rb +131 -0
- data/lib/vagrant/plugin/v1/plugin.rb +229 -0
- data/lib/vagrant/plugin/v1/provider.rb +68 -0
- data/lib/vagrant/plugin/v1/provisioner.rb +50 -0
- data/lib/vagrant/plugin/v1.rb +19 -0
- data/lib/vagrant/plugin/v2/command.rb +234 -0
- data/lib/vagrant/plugin/v2/communicator.rb +98 -0
- data/lib/vagrant/plugin/v2/components.rb +47 -0
- data/lib/vagrant/plugin/v2/config.rb +136 -0
- data/lib/vagrant/plugin/v2/errors.rb +15 -0
- data/lib/vagrant/plugin/v2/guest.rb +78 -0
- data/lib/vagrant/plugin/v2/host.rb +66 -0
- data/lib/vagrant/plugin/v2/manager.rb +173 -0
- data/lib/vagrant/plugin/v2/plugin.rb +226 -0
- data/lib/vagrant/plugin/v2/provider.rb +69 -0
- data/lib/vagrant/plugin/v2/provisioner.rb +47 -0
- data/lib/vagrant/plugin/v2.rb +22 -0
- data/lib/vagrant/plugin.rb +6 -0
- data/lib/vagrant/registry.rb +78 -0
- data/lib/vagrant/ui.rb +215 -0
- data/lib/vagrant/util/ansi_escape_code_remover.rb +34 -0
- data/lib/vagrant/util/busy.rb +59 -0
- data/lib/vagrant/util/counter.rb +24 -0
- data/lib/vagrant/util/downloader.rb +146 -0
- data/lib/vagrant/util/file_checksum.rb +38 -0
- data/lib/vagrant/util/file_mode.rb +12 -0
- data/lib/vagrant/util/hash_with_indifferent_access.rb +63 -0
- data/lib/vagrant/util/is_port_open.rb +38 -0
- data/lib/vagrant/util/line_ending_helpers.rb +14 -0
- data/lib/vagrant/util/network_ip.rb +28 -0
- data/lib/vagrant/util/platform.rb +58 -0
- data/lib/vagrant/util/retryable.rb +31 -0
- data/lib/vagrant/util/safe_chdir.rb +33 -0
- data/lib/vagrant/util/safe_exec.rb +36 -0
- data/lib/vagrant/util/safe_puts.rb +31 -0
- data/lib/vagrant/util/scoped_hash_override.rb +45 -0
- data/lib/vagrant/util/ssh.rb +150 -0
- data/lib/vagrant/util/stacked_proc_runner.rb +35 -0
- data/lib/vagrant/util/string_block_editor.rb +77 -0
- data/lib/vagrant/util/subprocess.rb +273 -0
- data/lib/vagrant/util/template_renderer.rb +83 -0
- data/lib/vagrant/util/which.rb +43 -0
- data/lib/vagrant/util.rb +12 -0
- data/lib/vagrant/version.rb +6 -0
- data/lib/vagrant.rb +258 -0
- data/plugins/README.md +5 -0
- data/plugins/commands/box/command/add.rb +51 -0
- data/plugins/commands/box/command/list.rb +41 -0
- data/plugins/commands/box/command/remove.rb +37 -0
- data/plugins/commands/box/command/repackage.rb +43 -0
- data/plugins/commands/box/command/root.rb +75 -0
- data/plugins/commands/box/plugin.rb +15 -0
- data/plugins/commands/destroy/command.rb +31 -0
- data/plugins/commands/destroy/plugin.rb +18 -0
- data/plugins/commands/halt/command.rb +33 -0
- data/plugins/commands/halt/plugin.rb +18 -0
- data/plugins/commands/init/command.rb +40 -0
- data/plugins/commands/init/plugin.rb +18 -0
- data/plugins/commands/package/command.rb +83 -0
- data/plugins/commands/package/plugin.rb +18 -0
- data/plugins/commands/plugin/action/bundler_check.rb +25 -0
- data/plugins/commands/plugin/action/install_gem.rb +81 -0
- data/plugins/commands/plugin/action/license_plugin.rb +54 -0
- data/plugins/commands/plugin/action/list_plugins.rb +54 -0
- data/plugins/commands/plugin/action/prune_gems.rb +149 -0
- data/plugins/commands/plugin/action/uninstall_plugin.rb +23 -0
- data/plugins/commands/plugin/action.rb +52 -0
- data/plugins/commands/plugin/command/base.rb +22 -0
- data/plugins/commands/plugin/command/install.rb +58 -0
- data/plugins/commands/plugin/command/license.rb +31 -0
- data/plugins/commands/plugin/command/list.rb +28 -0
- data/plugins/commands/plugin/command/root.rb +75 -0
- data/plugins/commands/plugin/command/uninstall.rb +28 -0
- data/plugins/commands/plugin/gem_helper.rb +74 -0
- data/plugins/commands/plugin/plugin.rb +22 -0
- data/plugins/commands/plugin/state_file.rb +57 -0
- data/plugins/commands/provision/command.rb +34 -0
- data/plugins/commands/provision/plugin.rb +18 -0
- data/plugins/commands/reload/command.rb +37 -0
- data/plugins/commands/reload/plugin.rb +18 -0
- data/plugins/commands/resume/command.rb +25 -0
- data/plugins/commands/resume/plugin.rb +17 -0
- data/plugins/commands/ssh/command.rb +63 -0
- data/plugins/commands/ssh/plugin.rb +17 -0
- data/plugins/commands/ssh_config/command.rb +49 -0
- data/plugins/commands/ssh_config/plugin.rb +18 -0
- data/plugins/commands/status/command.rb +39 -0
- data/plugins/commands/status/plugin.rb +18 -0
- data/plugins/commands/suspend/command.rb +25 -0
- data/plugins/commands/suspend/plugin.rb +18 -0
- data/plugins/commands/up/command.rb +57 -0
- data/plugins/commands/up/plugin.rb +17 -0
- data/plugins/commands/up/start_mixins.rb +26 -0
- data/plugins/communicators/ssh/communicator.rb +342 -0
- data/plugins/communicators/ssh/plugin.rb +19 -0
- data/plugins/guests/arch/cap/change_host_name.rb +18 -0
- data/plugins/guests/arch/cap/configure_networks.rb +23 -0
- data/plugins/guests/arch/guest.rb +11 -0
- data/plugins/guests/arch/plugin.rb +25 -0
- data/plugins/guests/debian/cap/change_host_name.rb +18 -0
- data/plugins/guests/debian/cap/configure_networks.rb +61 -0
- data/plugins/guests/debian/guest.rb +9 -0
- data/plugins/guests/debian/plugin.rb +25 -0
- data/plugins/guests/fedora/cap/configure_networks.rb +59 -0
- data/plugins/guests/fedora/cap/network_scripts_dir.rb +15 -0
- data/plugins/guests/fedora/guest.rb +11 -0
- data/plugins/guests/fedora/plugin.rb +25 -0
- data/plugins/guests/freebsd/cap/change_host_name.rb +14 -0
- data/plugins/guests/freebsd/cap/configure_networks.rb +39 -0
- data/plugins/guests/freebsd/cap/halt.rb +16 -0
- data/plugins/guests/freebsd/cap/mount_nfs_folder.rb +14 -0
- data/plugins/guests/freebsd/guest.rb +14 -0
- data/plugins/guests/freebsd/plugin.rb +35 -0
- data/plugins/guests/gentoo/cap/change_host_name.rb +17 -0
- data/plugins/guests/gentoo/cap/configure_networks.rb +43 -0
- data/plugins/guests/gentoo/guest.rb +9 -0
- data/plugins/guests/gentoo/plugin.rb +25 -0
- data/plugins/guests/linux/cap/halt.rb +16 -0
- data/plugins/guests/linux/cap/mount_nfs.rb +30 -0
- data/plugins/guests/linux/cap/mount_virtualbox_shared_folder.rb +40 -0
- data/plugins/guests/linux/cap/read_ip_address.rb +17 -0
- data/plugins/guests/linux/cap/shell_expand_guest_path.rb +26 -0
- data/plugins/guests/linux/guest.rb +11 -0
- data/plugins/guests/linux/plugin.rb +40 -0
- data/plugins/guests/openbsd/cap/halt.rb +16 -0
- data/plugins/guests/openbsd/guest.rb +11 -0
- data/plugins/guests/openbsd/plugin.rb +20 -0
- data/plugins/guests/pld/cap/network_scripts_dir.rb +11 -0
- data/plugins/guests/pld/guest.rb +11 -0
- data/plugins/guests/pld/plugin.rb +20 -0
- data/plugins/guests/redhat/cap/change_host_name.rb +18 -0
- data/plugins/guests/redhat/cap/configure_networks.rb +60 -0
- data/plugins/guests/redhat/cap/network_scripts_dir.rb +11 -0
- data/plugins/guests/redhat/guest.rb +11 -0
- data/plugins/guests/redhat/plugin.rb +30 -0
- data/plugins/guests/solaris/cap/change_host_name.rb +17 -0
- data/plugins/guests/solaris/cap/configure_networks.rb +25 -0
- data/plugins/guests/solaris/cap/halt.rb +21 -0
- data/plugins/guests/solaris/cap/mount_virtualbox_shared_folder.rb +28 -0
- data/plugins/guests/solaris/config.rb +18 -0
- data/plugins/guests/solaris/guest.rb +14 -0
- data/plugins/guests/solaris/plugin.rb +40 -0
- data/plugins/guests/suse/cap/change_host_name.rb +18 -0
- data/plugins/guests/suse/cap/network_scripts_dir.rb +11 -0
- data/plugins/guests/suse/guest.rb +11 -0
- data/plugins/guests/suse/plugin.rb +25 -0
- data/plugins/guests/ubuntu/cap/change_host_name.rb +23 -0
- data/plugins/guests/ubuntu/guest.rb +32 -0
- data/plugins/guests/ubuntu/plugin.rb +20 -0
- data/plugins/hosts/arch/host.rb +68 -0
- data/plugins/hosts/arch/plugin.rb +15 -0
- data/plugins/hosts/bsd/host.rb +102 -0
- data/plugins/hosts/bsd/plugin.rb +15 -0
- data/plugins/hosts/fedora/host.rb +51 -0
- data/plugins/hosts/fedora/plugin.rb +15 -0
- data/plugins/hosts/freebsd/host.rb +43 -0
- data/plugins/hosts/freebsd/plugin.rb +15 -0
- data/plugins/hosts/gentoo/host.rb +24 -0
- data/plugins/hosts/gentoo/plugin.rb +15 -0
- data/plugins/hosts/linux/host.rb +95 -0
- data/plugins/hosts/linux/plugin.rb +15 -0
- data/plugins/hosts/opensuse/host.rb +34 -0
- data/plugins/hosts/opensuse/plugin.rb +15 -0
- data/plugins/hosts/windows/host.rb +17 -0
- data/plugins/hosts/windows/plugin.rb +15 -0
- data/plugins/kernel_v1/config/nfs.rb +20 -0
- data/plugins/kernel_v1/config/package.rb +17 -0
- data/plugins/kernel_v1/config/ssh.rb +46 -0
- data/plugins/kernel_v1/config/vagrant.rb +31 -0
- data/plugins/kernel_v1/config/vm.rb +184 -0
- data/plugins/kernel_v1/plugin.rb +44 -0
- data/plugins/kernel_v2/config/nfs.rb +14 -0
- data/plugins/kernel_v2/config/package.rb +13 -0
- data/plugins/kernel_v2/config/ssh.rb +76 -0
- data/plugins/kernel_v2/config/ssh_connect.rb +40 -0
- data/plugins/kernel_v2/config/vagrant.rb +13 -0
- data/plugins/kernel_v2/config/vm.rb +416 -0
- data/plugins/kernel_v2/config/vm_provisioner.rb +55 -0
- data/plugins/kernel_v2/config/vm_subvm.rb +30 -0
- data/plugins/kernel_v2/plugin.rb +44 -0
- data/plugins/providers/virtualbox/action/boot.rb +49 -0
- data/plugins/providers/virtualbox/action/check_accessible.rb +23 -0
- data/plugins/providers/virtualbox/action/check_created.rb +21 -0
- data/plugins/providers/virtualbox/action/check_guest_additions.rb +45 -0
- data/plugins/providers/virtualbox/action/check_running.rb +21 -0
- data/plugins/providers/virtualbox/action/check_virtualbox.rb +22 -0
- data/plugins/providers/virtualbox/action/clean_machine_folder.rb +43 -0
- data/plugins/providers/virtualbox/action/clear_forwarded_ports.rb +18 -0
- data/plugins/providers/virtualbox/action/clear_network_interfaces.rb +31 -0
- data/plugins/providers/virtualbox/action/clear_shared_folders.rb +17 -0
- data/plugins/providers/virtualbox/action/created.rb +20 -0
- data/plugins/providers/virtualbox/action/customize.rb +36 -0
- data/plugins/providers/virtualbox/action/destroy.rb +19 -0
- data/plugins/providers/virtualbox/action/destroy_unused_network_interfaces.rb +16 -0
- data/plugins/providers/virtualbox/action/discard_state.rb +20 -0
- data/plugins/providers/virtualbox/action/export.rb +57 -0
- data/plugins/providers/virtualbox/action/forced_halt.rb +25 -0
- data/plugins/providers/virtualbox/action/forward_ports.rb +87 -0
- data/plugins/providers/virtualbox/action/import.rb +51 -0
- data/plugins/providers/virtualbox/action/is_paused.rb +20 -0
- data/plugins/providers/virtualbox/action/is_running.rb +20 -0
- data/plugins/providers/virtualbox/action/is_saved.rb +20 -0
- data/plugins/providers/virtualbox/action/match_mac_address.rb +21 -0
- data/plugins/providers/virtualbox/action/message_already_running.rb +16 -0
- data/plugins/providers/virtualbox/action/message_not_created.rb +16 -0
- data/plugins/providers/virtualbox/action/message_not_running.rb +16 -0
- data/plugins/providers/virtualbox/action/message_will_not_destroy.rb +17 -0
- data/plugins/providers/virtualbox/action/network.rb +410 -0
- data/plugins/providers/virtualbox/action/package.rb +20 -0
- data/plugins/providers/virtualbox/action/package_vagrantfile.rb +33 -0
- data/plugins/providers/virtualbox/action/prepare_forwarded_port_collision_params.rb +35 -0
- data/plugins/providers/virtualbox/action/prepare_nfs_settings.rb +64 -0
- data/plugins/providers/virtualbox/action/prune_nfs_exports.rb +20 -0
- data/plugins/providers/virtualbox/action/resume.rb +25 -0
- data/plugins/providers/virtualbox/action/sane_defaults.rb +91 -0
- data/plugins/providers/virtualbox/action/set_name.rb +40 -0
- data/plugins/providers/virtualbox/action/setup_package_files.rb +51 -0
- data/plugins/providers/virtualbox/action/share_folders.rb +128 -0
- data/plugins/providers/virtualbox/action/suspend.rb +20 -0
- data/plugins/providers/virtualbox/action.rb +311 -0
- data/plugins/providers/virtualbox/config.rb +86 -0
- data/plugins/providers/virtualbox/driver/base.rb +360 -0
- data/plugins/providers/virtualbox/driver/meta.rb +142 -0
- data/plugins/providers/virtualbox/driver/version_4_0.rb +485 -0
- data/plugins/providers/virtualbox/driver/version_4_1.rb +485 -0
- data/plugins/providers/virtualbox/driver/version_4_2.rb +482 -0
- data/plugins/providers/virtualbox/model/forwarded_port.rb +58 -0
- data/plugins/providers/virtualbox/plugin.rb +42 -0
- data/plugins/providers/virtualbox/provider.rb +92 -0
- data/plugins/providers/virtualbox/util/compile_forwarded_ports.rb +31 -0
- data/plugins/provisioners/ansible/config.rb +72 -0
- data/plugins/provisioners/ansible/plugin.rb +23 -0
- data/plugins/provisioners/ansible/provisioner.rb +45 -0
- data/plugins/provisioners/cfengine/cap/debian/cfengine_install.rb +19 -0
- data/plugins/provisioners/cfengine/cap/linux/cfengine_installed.rb +14 -0
- data/plugins/provisioners/cfengine/cap/linux/cfengine_needs_bootstrap.rb +34 -0
- data/plugins/provisioners/cfengine/cap/redhat/cfengine_install.rb +24 -0
- data/plugins/provisioners/cfengine/config.rb +120 -0
- data/plugins/provisioners/cfengine/plugin.rb +42 -0
- data/plugins/provisioners/cfengine/provisioner.rb +136 -0
- data/plugins/provisioners/chef/config/base.rb +85 -0
- data/plugins/provisioners/chef/config/chef_client.rb +57 -0
- data/plugins/provisioners/chef/config/chef_solo.rb +87 -0
- data/plugins/provisioners/chef/plugin.rb +33 -0
- data/plugins/provisioners/chef/provisioner/base.rb +93 -0
- data/plugins/provisioners/chef/provisioner/chef_client.rb +107 -0
- data/plugins/provisioners/chef/provisioner/chef_solo.rb +192 -0
- data/plugins/provisioners/puppet/config/puppet.rb +70 -0
- data/plugins/provisioners/puppet/config/puppet_server.rb +16 -0
- data/plugins/provisioners/puppet/plugin.rb +33 -0
- data/plugins/provisioners/puppet/provisioner/puppet.rb +117 -0
- data/plugins/provisioners/puppet/provisioner/puppet_server.rb +67 -0
- data/plugins/provisioners/shell/config.rb +56 -0
- data/plugins/provisioners/shell/plugin.rb +23 -0
- data/plugins/provisioners/shell/provisioner.rb +86 -0
- data/tasks/acceptance.rake +113 -0
- data/tasks/bundler.rake +3 -0
- data/tasks/test.rake +20 -0
- data/templates/commands/init/Vagrantfile.erb +111 -0
- data/templates/commands/ssh_config/config.erb +16 -0
- data/templates/config/messages.erb +14 -0
- data/templates/config/validation_failed.erb +7 -0
- data/templates/guests/arch/network_dhcp.erb +4 -0
- data/templates/guests/arch/network_static.erb +6 -0
- data/templates/guests/debian/network_dhcp.erb +11 -0
- data/templates/guests/debian/network_static.erb +7 -0
- data/templates/guests/fedora/network_dhcp.erb +6 -0
- data/templates/guests/fedora/network_static.erb +13 -0
- data/templates/guests/freebsd/network_dhcp.erb +3 -0
- data/templates/guests/freebsd/network_static.erb +3 -0
- data/templates/guests/gentoo/network_dhcp.erb +4 -0
- data/templates/guests/gentoo/network_static.erb +4 -0
- data/templates/guests/redhat/network_dhcp.erb +6 -0
- data/templates/guests/redhat/network_static.erb +8 -0
- data/templates/locales/en.yml +1126 -0
- data/templates/nfs/exports.erb +5 -0
- data/templates/nfs/exports_freebsd.erb +5 -0
- data/templates/nfs/exports_linux.erb +5 -0
- data/templates/package_Vagrantfile.erb +11 -0
- data/templates/provisioners/chef_client/client.erb +32 -0
- data/templates/provisioners/chef_solo/solo.erb +25 -0
- data/templates/rgloader.rb +9 -0
- data/test/acceptance/base.rb +48 -0
- data/test/acceptance/box_test.rb +99 -0
- data/test/acceptance/destroy_test.rb +37 -0
- data/test/acceptance/halt_test.rb +72 -0
- data/test/acceptance/init_test.rb +33 -0
- data/test/acceptance/networking/host_only_test.rb +37 -0
- data/test/acceptance/networking/port_forward_test.rb +125 -0
- data/test/acceptance/package_test.rb +46 -0
- data/test/acceptance/provisioning/basic_test.rb +61 -0
- data/test/acceptance/provisioning/chef_solo_test.rb +37 -0
- data/test/acceptance/provisioning/shell_test.rb +53 -0
- data/test/acceptance/resume_test.rb +17 -0
- data/test/acceptance/shared_folders_test.rb +84 -0
- data/test/acceptance/skeletons/chef_solo_basic/README.md +3 -0
- data/test/acceptance/skeletons/chef_solo_basic/cookbooks/basic/recipes/default.rb +5 -0
- data/test/acceptance/skeletons/chef_solo_json/README.md +3 -0
- data/test/acceptance/skeletons/chef_solo_json/cookbooks/basic/recipes/default.rb +6 -0
- data/test/acceptance/skeletons/provisioner_multi/README.md +3 -0
- data/test/acceptance/skeletons/provisioner_multi/cookbooks/basic/recipes/default.rb +5 -0
- data/test/acceptance/ssh_test.rb +46 -0
- data/test/acceptance/support/config.rb +42 -0
- data/test/acceptance/support/isolated_environment.rb +118 -0
- data/test/acceptance/support/matchers/have_color.rb +9 -0
- data/test/acceptance/support/matchers/match_output.rb +14 -0
- data/test/acceptance/support/matchers/succeed.rb +14 -0
- data/test/acceptance/support/network_tests.rb +29 -0
- data/test/acceptance/support/output.rb +95 -0
- data/test/acceptance/support/shared/base_context.rb +72 -0
- data/test/acceptance/support/shared/command_examples.rb +33 -0
- data/test/acceptance/support/virtualbox.rb +36 -0
- data/test/acceptance/suspend_test.rb +56 -0
- data/test/acceptance/up_basic_test.rb +33 -0
- data/test/acceptance/up_with_box_url.rb +40 -0
- data/test/acceptance/vagrant_test.rb +47 -0
- data/test/acceptance/version_test.rb +15 -0
- data/test/config/acceptance_boxes.yml +7 -0
- data/test/support/isolated_environment.rb +46 -0
- data/test/support/tempdir.rb +43 -0
- data/test/unit/base.rb +27 -0
- data/test/unit/support/dummy_provider.rb +16 -0
- data/test/unit/support/isolated_environment.rb +179 -0
- data/test/unit/support/shared/base_context.rb +104 -0
- data/test/unit/vagrant/action/builder_test.rb +242 -0
- data/test/unit/vagrant/action/builtin/call_test.rb +145 -0
- data/test/unit/vagrant/action/builtin/confirm_test.rb +36 -0
- data/test/unit/vagrant/action/builtin/env_set_test.rb +20 -0
- data/test/unit/vagrant/action/builtin/graceful_halt_test.rb +61 -0
- data/test/unit/vagrant/action/builtin/lock_test.rb +98 -0
- data/test/unit/vagrant/action/builtin/ssh_exec_test.rb +57 -0
- data/test/unit/vagrant/action/hook_test.rb +120 -0
- data/test/unit/vagrant/action/runner_test.rb +71 -0
- data/test/unit/vagrant/action/warden_test.rb +92 -0
- data/test/unit/vagrant/batch_action_test.rb +36 -0
- data/test/unit/vagrant/box_collection_test.rb +237 -0
- data/test/unit/vagrant/box_test.rb +122 -0
- data/test/unit/vagrant/cli_test.rb +27 -0
- data/test/unit/vagrant/config/loader_test.rb +184 -0
- data/test/unit/vagrant/config/v1/dummy_config_test.rb +24 -0
- data/test/unit/vagrant/config/v1/loader_test.rb +145 -0
- data/test/unit/vagrant/config/v1/root_test.rb +40 -0
- data/test/unit/vagrant/config/v2/dummy_config_test.rb +24 -0
- data/test/unit/vagrant/config/v2/loader_test.rb +151 -0
- data/test/unit/vagrant/config/v2/root_test.rb +97 -0
- data/test/unit/vagrant/config/v2/util_test.rb +21 -0
- data/test/unit/vagrant/config_test.rb +66 -0
- data/test/unit/vagrant/environment_test.rb +721 -0
- data/test/unit/vagrant/guest_test.rb +166 -0
- data/test/unit/vagrant/hosts_test.rb +37 -0
- data/test/unit/vagrant/machine_state_test.rb +26 -0
- data/test/unit/vagrant/machine_test.rb +384 -0
- data/test/unit/vagrant/plugin/v1/command_test.rb +143 -0
- data/test/unit/vagrant/plugin/v1/communicator_test.rb +9 -0
- data/test/unit/vagrant/plugin/v1/config_test.rb +50 -0
- data/test/unit/vagrant/plugin/v1/host_test.rb +5 -0
- data/test/unit/vagrant/plugin/v1/manager_test.rb +114 -0
- data/test/unit/vagrant/plugin/v1/plugin_test.rb +267 -0
- data/test/unit/vagrant/plugin/v1/provider_test.rb +18 -0
- data/test/unit/vagrant/plugin/v2/command_test.rb +238 -0
- data/test/unit/vagrant/plugin/v2/communicator_test.rb +9 -0
- data/test/unit/vagrant/plugin/v2/components_test.rb +17 -0
- data/test/unit/vagrant/plugin/v2/config_test.rb +60 -0
- data/test/unit/vagrant/plugin/v2/host_test.rb +5 -0
- data/test/unit/vagrant/plugin/v2/manager_test.rb +174 -0
- data/test/unit/vagrant/plugin/v2/plugin_test.rb +305 -0
- data/test/unit/vagrant/plugin/v2/provider_test.rb +18 -0
- data/test/unit/vagrant/registry_test.rb +128 -0
- data/test/unit/vagrant/util/ansi_escape_code_remover_test.rb +16 -0
- data/test/unit/vagrant/util/downloader_test.rb +57 -0
- data/test/unit/vagrant/util/file_checksum_test.rb +23 -0
- data/test/unit/vagrant/util/hash_with_indifferent_access_test.rb +38 -0
- data/test/unit/vagrant/util/is_port_open_test.rb +53 -0
- data/test/unit/vagrant/util/line_endings_helper_test.rb +16 -0
- data/test/unit/vagrant/util/network_ip_test.rb +17 -0
- data/test/unit/vagrant/util/retryable_test.rb +106 -0
- data/test/unit/vagrant/util/safe_chdir_test.rb +43 -0
- data/test/unit/vagrant/util/scoped_hash_override_test.rb +48 -0
- data/test/unit/vagrant/util/ssh_test.rb +30 -0
- data/test/unit/vagrant/util/string_block_editor_test.rb +106 -0
- data/test/unit/vagrant/util/which_test.rb +43 -0
- data/test/unit/vagrant_test.rb +56 -0
- data/tnargav.gemspec +69 -0
- data/vagrant.gemspec +69 -0
- metadata +730 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
require "log4r"
|
|
2
|
+
|
|
3
|
+
module Vagrant
|
|
4
|
+
module Action
|
|
5
|
+
module Builtin
|
|
6
|
+
# This class will run the configured provisioners against the
|
|
7
|
+
# machine.
|
|
8
|
+
#
|
|
9
|
+
# This action should be placed BEFORE the machine is booted so it
|
|
10
|
+
# can do some setup, and then run again (on the return path) against
|
|
11
|
+
# a running machine.
|
|
12
|
+
class Provision
|
|
13
|
+
def initialize(app, env)
|
|
14
|
+
@app = app
|
|
15
|
+
@logger = Log4r::Logger.new("vagrant::action::builtin::provision")
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def call(env)
|
|
19
|
+
# Check if we're even provisioning things.
|
|
20
|
+
enabled = true
|
|
21
|
+
enabled = env[:provision_enabled] if env.has_key?(:provision_enabled)
|
|
22
|
+
|
|
23
|
+
# This keeps track of a mapping between provisioner and type
|
|
24
|
+
type_map = {}
|
|
25
|
+
|
|
26
|
+
# Get all the configured provisioners
|
|
27
|
+
provisioners = env[:machine].config.vm.provisioners.map do |provisioner|
|
|
28
|
+
# Instantiate the provisioner
|
|
29
|
+
klass = Vagrant.plugin("2").manager.provisioners[provisioner.name]
|
|
30
|
+
result = klass.new(env[:machine], provisioner.config)
|
|
31
|
+
|
|
32
|
+
# Store in the type map so that --provision-with works properly
|
|
33
|
+
type_map[result] = provisioner.name
|
|
34
|
+
|
|
35
|
+
# Return the result
|
|
36
|
+
result
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Ask the provisioners to modify the configuration if needed
|
|
40
|
+
provisioners.each do |p|
|
|
41
|
+
p.configure(env[:machine].config)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Continue, we need the VM to be booted.
|
|
45
|
+
@app.call(env)
|
|
46
|
+
|
|
47
|
+
# Actually provision if we enabled it
|
|
48
|
+
if enabled
|
|
49
|
+
provisioners.each do |p|
|
|
50
|
+
next if env[:provision_types] && \
|
|
51
|
+
!env[:provision_types].include?(type_map[p])
|
|
52
|
+
|
|
53
|
+
run_provisioner(env, type_map[p].to_s, p)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# This is pulled out into a seperate method so that users can
|
|
59
|
+
# subclass and implement custom behavior if they'd like around
|
|
60
|
+
# this step.
|
|
61
|
+
def run_provisioner(env, name, p)
|
|
62
|
+
env[:ui].info(I18n.t("vagrant.actions.vm.provision.beginning",
|
|
63
|
+
:provisioner => name))
|
|
64
|
+
|
|
65
|
+
p.provision
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
require "log4r"
|
|
2
|
+
|
|
3
|
+
module Vagrant
|
|
4
|
+
module Action
|
|
5
|
+
module Builtin
|
|
6
|
+
# This middleware sets the hostname of the guest according to the
|
|
7
|
+
# "vm.hostname" configuration parameter if it is set. This middleware
|
|
8
|
+
# should be placed such that the after the @app.call, a booted machine
|
|
9
|
+
# is available (this generally means BEFORE the boot middleware).
|
|
10
|
+
class SetHostname
|
|
11
|
+
def initialize(app, env)
|
|
12
|
+
@app = app
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def call(env)
|
|
16
|
+
@app.call(env)
|
|
17
|
+
|
|
18
|
+
hostname = env[:machine].config.vm.hostname
|
|
19
|
+
if !hostname.nil?
|
|
20
|
+
env[:ui].info I18n.t("vagrant.actions.vm.hostname.setting")
|
|
21
|
+
env[:machine].guest.capability(:change_host_name, hostname)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
require "pathname"
|
|
2
|
+
|
|
3
|
+
require "vagrant/util/ssh"
|
|
4
|
+
|
|
5
|
+
module Vagrant
|
|
6
|
+
module Action
|
|
7
|
+
module Builtin
|
|
8
|
+
# This class will exec into a full fledged SSH console into the
|
|
9
|
+
# remote machine. This middleware assumes that the VM is running and
|
|
10
|
+
# ready for SSH, and uses the {Machine#ssh_info} method to retrieve
|
|
11
|
+
# SSH information necessary to connect.
|
|
12
|
+
#
|
|
13
|
+
# Note: If there are any middleware after `SSHExec`, they will **not**
|
|
14
|
+
# run, since exec replaces the currently running process.
|
|
15
|
+
class SSHExec
|
|
16
|
+
# For quick access to the `SSH` class.
|
|
17
|
+
include Vagrant::Util
|
|
18
|
+
|
|
19
|
+
def initialize(app, env)
|
|
20
|
+
@app = app
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def call(env)
|
|
24
|
+
# Grab the SSH info from the machine
|
|
25
|
+
info = env[:machine].ssh_info
|
|
26
|
+
|
|
27
|
+
# If the result is nil, then the machine is telling us that it is
|
|
28
|
+
# not yet ready for SSH, so we raise this exception.
|
|
29
|
+
raise Errors::SSHNotReady if info.nil?
|
|
30
|
+
|
|
31
|
+
if info[:private_key_path]
|
|
32
|
+
# Check the SSH key permissions
|
|
33
|
+
SSH.check_key_permissions(Pathname.new(info[:private_key_path]))
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Exec!
|
|
37
|
+
SSH.exec(info, env[:ssh_opts])
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
require "log4r"
|
|
2
|
+
|
|
3
|
+
module Vagrant
|
|
4
|
+
module Action
|
|
5
|
+
module Builtin
|
|
6
|
+
# This class will run a single command on the remote machine and will
|
|
7
|
+
# mirror the output to the UI. The resulting exit status of the command
|
|
8
|
+
# will exist in the `:ssh_run_exit_status` key in the environment.
|
|
9
|
+
class SSHRun
|
|
10
|
+
def initialize(app, env)
|
|
11
|
+
@app = app
|
|
12
|
+
@logger = Log4r::Logger.new("vagrant::action::builtin::ssh_run")
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def call(env)
|
|
16
|
+
command = env[:ssh_run_command]
|
|
17
|
+
|
|
18
|
+
@logger.debug("Executing command: #{command}")
|
|
19
|
+
exit_status = 0
|
|
20
|
+
exit_status = env[:machine].communicate.execute(command, :error_check => false) do |type, data|
|
|
21
|
+
# Determine the proper channel to send the output onto depending
|
|
22
|
+
# on the type of data we are receiving.
|
|
23
|
+
channel = type == :stdout ? :out : :error
|
|
24
|
+
|
|
25
|
+
# Print the output as it comes in, but don't prefix it and don't
|
|
26
|
+
# force a new line so that the output is properly preserved however
|
|
27
|
+
# it may be formatted.
|
|
28
|
+
env[:ui].info(data.to_s,
|
|
29
|
+
:prefix => false,
|
|
30
|
+
:new_line => false,
|
|
31
|
+
:channel => channel)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Set the exit status on a known environmental variable
|
|
35
|
+
env[:ssh_run_exit_status] = exit_status
|
|
36
|
+
|
|
37
|
+
# Call the next middleware
|
|
38
|
+
@app.call(env)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
|
|
3
|
+
require 'vagrant/util/safe_chdir'
|
|
4
|
+
require 'vagrant/util/subprocess'
|
|
5
|
+
|
|
6
|
+
module Vagrant
|
|
7
|
+
module Action
|
|
8
|
+
module General
|
|
9
|
+
# A general packaging (tar) middleware. Given the following options,
|
|
10
|
+
# it will do the right thing:
|
|
11
|
+
#
|
|
12
|
+
# * package.output - The filename of the outputted package.
|
|
13
|
+
# * package.include - An array of files to include in the package.
|
|
14
|
+
# * package.directory - The directory which contains the contents to
|
|
15
|
+
# compress into the package.
|
|
16
|
+
#
|
|
17
|
+
# This middleware always produces the final file in the current working
|
|
18
|
+
# directory (FileUtils.pwd)
|
|
19
|
+
class Package
|
|
20
|
+
include Util
|
|
21
|
+
|
|
22
|
+
def initialize(app, env)
|
|
23
|
+
@app = app
|
|
24
|
+
|
|
25
|
+
env["package.files"] ||= {}
|
|
26
|
+
env["package.output"] ||= env[:global_config].package.name
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def call(env)
|
|
30
|
+
@env = env
|
|
31
|
+
|
|
32
|
+
raise Errors::PackageOutputDirectory if File.directory?(tar_path)
|
|
33
|
+
raise Errors::PackageOutputExists if File.exist?(tar_path)
|
|
34
|
+
raise Errors::PackageRequiresDirectory if !env["package.directory"] ||
|
|
35
|
+
!File.directory?(env["package.directory"])
|
|
36
|
+
|
|
37
|
+
compress
|
|
38
|
+
|
|
39
|
+
@app.call(env)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def recover(env)
|
|
43
|
+
# There are certain exceptions that we don't delete the file for.
|
|
44
|
+
ignore_exc = [Errors::PackageOutputDirectory, Errors::PackageOutputExists]
|
|
45
|
+
ignore_exc.each do |exc|
|
|
46
|
+
return if env["vagrant.error"].is_a?(exc)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Cleanup any packaged files if the packaging failed at some point.
|
|
50
|
+
File.delete(tar_path) if File.exist?(tar_path)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# This method copies the include files (passed in via command line)
|
|
54
|
+
# to the temporary directory so they are included in a sub-folder within
|
|
55
|
+
# the actual box
|
|
56
|
+
def copy_include_files
|
|
57
|
+
include_directory = Pathname.new(@env["package.directory"]).join("include")
|
|
58
|
+
|
|
59
|
+
@env["package.files"].each do |from, dest|
|
|
60
|
+
# We place the file in the include directory
|
|
61
|
+
to = include_directory.join(dest)
|
|
62
|
+
|
|
63
|
+
@env[:ui].info I18n.t("vagrant.actions.general.package.packaging", :file => from)
|
|
64
|
+
FileUtils.mkdir_p(to.parent)
|
|
65
|
+
|
|
66
|
+
# Copy direcotry contents recursively.
|
|
67
|
+
if File.directory?(from)
|
|
68
|
+
FileUtils.cp_r(Dir.glob(from), to.parent, :preserve => true)
|
|
69
|
+
else
|
|
70
|
+
FileUtils.cp(from, to, :preserve => true)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Compress the exported file into a package
|
|
76
|
+
def compress
|
|
77
|
+
@env[:ui].info I18n.t("vagrant.actions.general.package.compressing", :tar_path => tar_path)
|
|
78
|
+
|
|
79
|
+
# Copy over the included files
|
|
80
|
+
copy_include_files
|
|
81
|
+
|
|
82
|
+
# Get the output path. We have to do this up here so that the
|
|
83
|
+
# pwd returns the proper thing.
|
|
84
|
+
output_path = tar_path.to_s
|
|
85
|
+
|
|
86
|
+
# Switch into that directory and package everything up
|
|
87
|
+
Util::SafeChdir.safe_chdir(@env["package.directory"]) do
|
|
88
|
+
# Find all the files in our current directory and tar it up!
|
|
89
|
+
files = Dir.glob(File.join(".", "**", "*"))
|
|
90
|
+
|
|
91
|
+
# Package!
|
|
92
|
+
Util::Subprocess.execute("bsdtar", "-czf", output_path, *files)
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Path to the final box output file
|
|
97
|
+
def tar_path
|
|
98
|
+
File.expand_path(@env["package.output"], FileUtils.pwd)
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
module Action
|
|
3
|
+
# This class manages hooks into existing {Builder} stacks, and lets you
|
|
4
|
+
# add and remove middleware classes. This is the primary method by which
|
|
5
|
+
# plugins can hook into built-in middleware stacks.
|
|
6
|
+
class Hook
|
|
7
|
+
# This is a hash of the middleware to prepend to a certain
|
|
8
|
+
# other middleware.
|
|
9
|
+
#
|
|
10
|
+
# @return [Hash<Class, Array<Class>>]
|
|
11
|
+
attr_reader :before_hooks
|
|
12
|
+
|
|
13
|
+
# This is a hash of the middleware to append to a certain other
|
|
14
|
+
# middleware.
|
|
15
|
+
#
|
|
16
|
+
# @return [Hash<Class, Array<Class>>]
|
|
17
|
+
attr_reader :after_hooks
|
|
18
|
+
|
|
19
|
+
# This is a list of the hooks to just prepend to the beginning
|
|
20
|
+
#
|
|
21
|
+
# @return [Array<Class>]
|
|
22
|
+
attr_reader :prepend_hooks
|
|
23
|
+
|
|
24
|
+
# This is a list of the hooks to just append to the end
|
|
25
|
+
#
|
|
26
|
+
# @return [Array<Class>]
|
|
27
|
+
attr_reader :append_hooks
|
|
28
|
+
|
|
29
|
+
def initialize
|
|
30
|
+
@before_hooks = Hash.new { |h, k| h[k] = [] }
|
|
31
|
+
@after_hooks = Hash.new { |h, k| h[k] = [] }
|
|
32
|
+
@prepend_hooks = []
|
|
33
|
+
@append_hooks = []
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Add a middleware before an existing middleware.
|
|
37
|
+
#
|
|
38
|
+
# @param [Class] existing The existing middleware.
|
|
39
|
+
# @param [Class] new The new middleware.
|
|
40
|
+
def before(existing, new, *args, &block)
|
|
41
|
+
@before_hooks[existing] << [new, args, block]
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Add a middleware after an existing middleware.
|
|
45
|
+
#
|
|
46
|
+
# @param [Class] existing The existing middleware.
|
|
47
|
+
# @param [Class] new The new middleware.
|
|
48
|
+
def after(existing, new, *args, &block)
|
|
49
|
+
@after_hooks[existing] << [new, args, block]
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Append a middleware to the end of the stack. Note that if the
|
|
53
|
+
# middleware sequence ends early, then the new middleware won't
|
|
54
|
+
# be run.
|
|
55
|
+
#
|
|
56
|
+
# @param [Class] new The middleware to append.
|
|
57
|
+
def append(new, *args, &block)
|
|
58
|
+
@append_hooks << [new, args, block]
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Prepend a middleware to the beginning of the stack.
|
|
62
|
+
#
|
|
63
|
+
# @param [Class] new The new middleware to prepend.
|
|
64
|
+
def prepend(new, *args, &block)
|
|
65
|
+
@prepend_hooks << [new, args, block]
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# This applies the given hook to a builder. This should not be
|
|
69
|
+
# called directly.
|
|
70
|
+
#
|
|
71
|
+
# @param [Builder] builder
|
|
72
|
+
def apply(builder, options=nil)
|
|
73
|
+
options ||= {}
|
|
74
|
+
|
|
75
|
+
if !options[:no_prepend_or_append]
|
|
76
|
+
# Prepends first
|
|
77
|
+
@prepend_hooks.each do |klass, args, block|
|
|
78
|
+
builder.insert(0, klass, *args, &block)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Appends
|
|
82
|
+
@append_hooks.each do |klass, args, block|
|
|
83
|
+
builder.use(klass, *args, &block)
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Before hooks
|
|
88
|
+
@before_hooks.each do |key, list|
|
|
89
|
+
next if !builder.index(key)
|
|
90
|
+
|
|
91
|
+
list.each do |klass, args, block|
|
|
92
|
+
builder.insert_before(key, klass, *args, &block)
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# After hooks
|
|
97
|
+
@after_hooks.each do |key, list|
|
|
98
|
+
next if !builder.index(key)
|
|
99
|
+
|
|
100
|
+
list.each do |klass, args, block|
|
|
101
|
+
builder.insert_after(key, klass, *args, &block)
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
require 'log4r'
|
|
2
|
+
|
|
3
|
+
require 'vagrant/action/hook'
|
|
4
|
+
require 'vagrant/util/busy'
|
|
5
|
+
|
|
6
|
+
# TODO:
|
|
7
|
+
# * env.lock
|
|
8
|
+
|
|
9
|
+
module Vagrant
|
|
10
|
+
module Action
|
|
11
|
+
class Runner
|
|
12
|
+
@@reported_interrupt = false
|
|
13
|
+
|
|
14
|
+
def initialize(globals=nil, &block)
|
|
15
|
+
@globals = globals || {}
|
|
16
|
+
@lazy_globals = block
|
|
17
|
+
@logger = Log4r::Logger.new("vagrant::action::runner")
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def run(callable_id, options=nil)
|
|
21
|
+
callable = callable_id
|
|
22
|
+
callable = Builder.build(callable_id) if callable_id.kind_of?(Class)
|
|
23
|
+
raise ArgumentError, "Argument to run must be a callable object or registered action." if !callable || !callable.respond_to?(:call)
|
|
24
|
+
|
|
25
|
+
# Create the initial environment with the options given
|
|
26
|
+
environment = {}
|
|
27
|
+
environment.merge!(@globals)
|
|
28
|
+
environment.merge!(@lazy_globals.call) if @lazy_globals
|
|
29
|
+
environment.merge!(options || {})
|
|
30
|
+
|
|
31
|
+
# Setup the action hooks
|
|
32
|
+
hooks = Vagrant.plugin("2").manager.action_hooks(environment[:action_name])
|
|
33
|
+
if !hooks.empty?
|
|
34
|
+
@logger.info("Preparing hooks for middleware sequence...")
|
|
35
|
+
environment[:action_hooks] = hooks.map do |hook_proc|
|
|
36
|
+
Hook.new.tap do |h|
|
|
37
|
+
hook_proc.call(h)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
@logger.info("#{environment[:action_hooks].length} hooks defined.")
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Run the action chain in a busy block, marking the environment as
|
|
45
|
+
# interrupted if a SIGINT occurs, and exiting cleanly once the
|
|
46
|
+
# chain has been run.
|
|
47
|
+
ui = environment[:ui] if environment.has_key?(:ui)
|
|
48
|
+
int_callback = lambda do
|
|
49
|
+
if environment[:interrupted]
|
|
50
|
+
ui.error I18n.t("vagrant.actions.runner.exit_immediately") if ui
|
|
51
|
+
abort
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
ui.warn I18n.t("vagrant.actions.runner.waiting_cleanup") if ui && !@@reported_interrupt
|
|
55
|
+
environment[:interrupted] = true
|
|
56
|
+
@@reported_interrupt = true
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# We place a process lock around every action that is called
|
|
60
|
+
@logger.info("Running action: #{callable_id}")
|
|
61
|
+
Util::Busy.busy(int_callback) { callable.call(environment) }
|
|
62
|
+
|
|
63
|
+
# Return the environment in case there are things in there that
|
|
64
|
+
# the caller wants to use.
|
|
65
|
+
environment
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
require "log4r"
|
|
2
|
+
|
|
3
|
+
module Vagrant
|
|
4
|
+
module Action
|
|
5
|
+
# The action warden is a middleware which injects itself between
|
|
6
|
+
# every other middleware, watching for exceptions which are raised
|
|
7
|
+
# and performing proper cleanup on every action by calling the `recover`
|
|
8
|
+
# method. The warden therefore allows middlewares to not worry about
|
|
9
|
+
# exceptional events, and by providing a simple callback, can clean up
|
|
10
|
+
# in any erroneous case.
|
|
11
|
+
#
|
|
12
|
+
# Warden will "just work" behind the scenes, and is not of particular
|
|
13
|
+
# interest except to those who are curious about the internal workings
|
|
14
|
+
# of Vagrant.
|
|
15
|
+
class Warden
|
|
16
|
+
attr_accessor :actions, :stack
|
|
17
|
+
|
|
18
|
+
def initialize(actions, env)
|
|
19
|
+
@stack = []
|
|
20
|
+
@actions = actions.map { |m| finalize_action(m, env) }
|
|
21
|
+
@logger = Log4r::Logger.new("vagrant::action::warden")
|
|
22
|
+
@last_error = nil
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def call(env)
|
|
26
|
+
return if @actions.empty?
|
|
27
|
+
|
|
28
|
+
begin
|
|
29
|
+
# Call the next middleware in the sequence, appending to the stack
|
|
30
|
+
# of "recoverable" middlewares in case something goes wrong!
|
|
31
|
+
raise Errors::VagrantInterrupt if env[:interrupted]
|
|
32
|
+
action = @actions.shift
|
|
33
|
+
@logger.info("Calling action: #{action}")
|
|
34
|
+
@stack.unshift(action).first.call(env)
|
|
35
|
+
raise Errors::VagrantInterrupt if env[:interrupted]
|
|
36
|
+
rescue SystemExit
|
|
37
|
+
# This means that an "exit" or "abort" was called. In these cases,
|
|
38
|
+
# we just exit immediately.
|
|
39
|
+
raise
|
|
40
|
+
rescue Exception => e
|
|
41
|
+
# We guard this so that the Warden only outputs this once for
|
|
42
|
+
# an exception that bubbles up.
|
|
43
|
+
if e != @last_error
|
|
44
|
+
@logger.error("Error occurred: #{e}")
|
|
45
|
+
@last_error = e
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
env["vagrant.error"] = e
|
|
49
|
+
|
|
50
|
+
# Something went horribly wrong. Start the rescue chain then
|
|
51
|
+
# reraise the exception to properly kick us out of limbo here.
|
|
52
|
+
recover(env)
|
|
53
|
+
raise
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# We implement the recover method ourselves in case a Warden is
|
|
58
|
+
# embedded within another Warden. To recover, we just do our own
|
|
59
|
+
# recovery process on our stack.
|
|
60
|
+
def recover(env)
|
|
61
|
+
@logger.info("Beginning recovery process...")
|
|
62
|
+
|
|
63
|
+
@stack.each do |act|
|
|
64
|
+
if act.respond_to?(:recover)
|
|
65
|
+
@logger.info("Calling recover: #{act}")
|
|
66
|
+
act.recover(env)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
@logger.info("Recovery complete.")
|
|
71
|
+
|
|
72
|
+
# Clear stack so that warden down the middleware chain doesn't
|
|
73
|
+
# rescue again.
|
|
74
|
+
@stack.clear
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# A somewhat confusing function which simply initializes each
|
|
78
|
+
# middleware properly to call the next middleware in the sequence.
|
|
79
|
+
def finalize_action(action, env)
|
|
80
|
+
klass, args, block = action
|
|
81
|
+
|
|
82
|
+
# Default the arguments to an empty array. Otherwise in Ruby 1.8
|
|
83
|
+
# a `nil` args will actually pass `nil` into the class.
|
|
84
|
+
args ||= []
|
|
85
|
+
|
|
86
|
+
if klass.is_a?(Class)
|
|
87
|
+
# A action klass which is to be instantiated with the
|
|
88
|
+
# app, env, and any arguments given
|
|
89
|
+
klass.new(self, env, *args, &block)
|
|
90
|
+
elsif klass.respond_to?(:call)
|
|
91
|
+
# Make it a lambda which calls the item then forwards
|
|
92
|
+
# up the chain
|
|
93
|
+
lambda do |e|
|
|
94
|
+
klass.call(e)
|
|
95
|
+
self.call(e)
|
|
96
|
+
end
|
|
97
|
+
else
|
|
98
|
+
raise "Invalid action: #{action.inspect}"
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
require 'vagrant/action/builder'
|
|
2
|
+
|
|
3
|
+
module Vagrant
|
|
4
|
+
module Action
|
|
5
|
+
autoload :Runner, 'vagrant/action/runner'
|
|
6
|
+
autoload :Warden, 'vagrant/action/warden'
|
|
7
|
+
|
|
8
|
+
# Builtin contains middleware classes that are shipped with Vagrant-core
|
|
9
|
+
# and are thus available to all plugins as a "standard library" of sorts.
|
|
10
|
+
module Builtin
|
|
11
|
+
autoload :BoxAdd, "vagrant/action/builtin/box_add"
|
|
12
|
+
autoload :Call, "vagrant/action/builtin/call"
|
|
13
|
+
autoload :Confirm, "vagrant/action/builtin/confirm"
|
|
14
|
+
autoload :ConfigValidate, "vagrant/action/builtin/config_validate"
|
|
15
|
+
autoload :DestroyConfirm, "vagrant/action/builtin/destroy_confirm"
|
|
16
|
+
autoload :EnvSet, "vagrant/action/builtin/env_set"
|
|
17
|
+
autoload :GracefulHalt, "vagrant/action/builtin/graceful_halt"
|
|
18
|
+
autoload :HandleBoxUrl, "vagrant/action/builtin/handle_box_url"
|
|
19
|
+
autoload :HandleForwardedPortCollisions, "vagrant/action/builtin/handle_forwarded_port_collisions"
|
|
20
|
+
autoload :Lock, "vagrant/action/builtin/lock"
|
|
21
|
+
autoload :NFS, "vagrant/action/builtin/nfs"
|
|
22
|
+
autoload :Provision, "vagrant/action/builtin/provision"
|
|
23
|
+
autoload :SetHostname, "vagrant/action/builtin/set_hostname"
|
|
24
|
+
autoload :SSHExec, "vagrant/action/builtin/ssh_exec"
|
|
25
|
+
autoload :SSHRun, "vagrant/action/builtin/ssh_run"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
module General
|
|
29
|
+
autoload :Package, 'vagrant/action/general/package'
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# This is the action that will add a box from a URL. This middleware
|
|
33
|
+
# sequence is built-in to Vagrant. Plugins can hook into this like any
|
|
34
|
+
# other middleware sequence. This is particularly useful for provider
|
|
35
|
+
# plugins, which can hook in to do things like verification of boxes
|
|
36
|
+
# that are downloaded.
|
|
37
|
+
def self.action_box_add
|
|
38
|
+
Builder.new.tap do |b|
|
|
39
|
+
b.use Builtin::BoxAdd
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|