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,229 @@
|
|
|
1
|
+
require "set"
|
|
2
|
+
|
|
3
|
+
require "log4r"
|
|
4
|
+
|
|
5
|
+
module Vagrant
|
|
6
|
+
module Plugin
|
|
7
|
+
module V1
|
|
8
|
+
# This is the superclass for all V1 plugins.
|
|
9
|
+
class Plugin
|
|
10
|
+
# Special marker that can be used for action hooks that matches
|
|
11
|
+
# all action sequences.
|
|
12
|
+
ALL_ACTIONS = :__all_actions__
|
|
13
|
+
|
|
14
|
+
# The logger for this class.
|
|
15
|
+
LOGGER = Log4r::Logger.new("vagrant::plugin::v1::plugin")
|
|
16
|
+
|
|
17
|
+
# Set the root class up to be ourself, so that we can reference this
|
|
18
|
+
# from within methods which are probably in subclasses.
|
|
19
|
+
ROOT_CLASS = self
|
|
20
|
+
|
|
21
|
+
# This returns the manager for all V1 plugins.
|
|
22
|
+
#
|
|
23
|
+
# @return [V1::Manager]
|
|
24
|
+
def self.manager
|
|
25
|
+
@manager ||= Manager.new
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Set the name of the plugin. The moment that this is called, the
|
|
29
|
+
# plugin will be registered and available. Before this is called, a
|
|
30
|
+
# plugin does not exist. The name must be unique among all installed
|
|
31
|
+
# plugins.
|
|
32
|
+
#
|
|
33
|
+
# @param [String] name Name of the plugin.
|
|
34
|
+
# @return [String] The name of the plugin.
|
|
35
|
+
def self.name(name=UNSET_VALUE)
|
|
36
|
+
# Get or set the value first, so we have a name for logging when
|
|
37
|
+
# we register.
|
|
38
|
+
result = get_or_set(:name, name)
|
|
39
|
+
|
|
40
|
+
# The plugin should be registered if we're setting a real name on it
|
|
41
|
+
Plugin.manager.register(self) if name != UNSET_VALUE
|
|
42
|
+
|
|
43
|
+
# Return the result
|
|
44
|
+
result
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Sets a human-friendly descrition of the plugin.
|
|
48
|
+
#
|
|
49
|
+
# @param [String] value Description of the plugin.
|
|
50
|
+
# @return [String] Description of the plugin.
|
|
51
|
+
def self.description(value=UNSET_VALUE)
|
|
52
|
+
get_or_set(:description, value)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Registers a callback to be called when a specific action sequence
|
|
56
|
+
# is run. This allows plugin authors to hook into things like VM
|
|
57
|
+
# bootup, VM provisioning, etc.
|
|
58
|
+
#
|
|
59
|
+
# @param [Symbol] name Name of the action.
|
|
60
|
+
# @return [Array] List of the hooks for the given action.
|
|
61
|
+
def self.action_hook(name, &block)
|
|
62
|
+
# Get the list of hooks for the given hook name
|
|
63
|
+
data[:action_hooks] ||= {}
|
|
64
|
+
hooks = data[:action_hooks][name.to_sym] ||= []
|
|
65
|
+
|
|
66
|
+
# Return the list if we don't have a block
|
|
67
|
+
return hooks if !block_given?
|
|
68
|
+
|
|
69
|
+
# Otherwise add the block to the list of hooks for this action.
|
|
70
|
+
hooks << block
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Defines additional command line commands available by key. The key
|
|
74
|
+
# becomes the subcommand, so if you register a command "foo" then
|
|
75
|
+
# "vagrant foo" becomes available.
|
|
76
|
+
#
|
|
77
|
+
# @param [String] name Subcommand key.
|
|
78
|
+
def self.command(name=UNSET_VALUE, &block)
|
|
79
|
+
data[:command] ||= Registry.new
|
|
80
|
+
|
|
81
|
+
if name != UNSET_VALUE
|
|
82
|
+
# Validate the name of the command
|
|
83
|
+
if name.to_s !~ /^[-a-z0-9]+$/i
|
|
84
|
+
raise InvalidCommandName, "Commands can only contain letters, numbers, and hyphens"
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Register a new command class only if a name was given.
|
|
88
|
+
data[:command].register(name.to_sym, &block)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Return the registry
|
|
92
|
+
data[:command]
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Defines additional communicators to be available. Communicators
|
|
96
|
+
# should be returned by a block passed to this method. This is done
|
|
97
|
+
# to ensure that the class is lazy loaded, so if your class inherits
|
|
98
|
+
# from or uses any Vagrant internals specific to Vagrant 1.0, then
|
|
99
|
+
# the plugin can still be defined without breaking anything in future
|
|
100
|
+
# versions of Vagrant.
|
|
101
|
+
#
|
|
102
|
+
# @param [String] name Communicator name.
|
|
103
|
+
def self.communicator(name=UNSET_VALUE, &block)
|
|
104
|
+
data[:communicator] ||= Registry.new
|
|
105
|
+
|
|
106
|
+
# Register a new communicator class only if a name was given.
|
|
107
|
+
data[:communicator].register(name.to_sym, &block) if name != UNSET_VALUE
|
|
108
|
+
|
|
109
|
+
# Return the registry
|
|
110
|
+
data[:communicator]
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Defines additional configuration keys to be available in the
|
|
114
|
+
# Vagrantfile. The configuration class should be returned by a
|
|
115
|
+
# block passed to this method. This is done to ensure that the class
|
|
116
|
+
# is lazy loaded, so if your class inherits from any classes that
|
|
117
|
+
# are specific to Vagrant 1.0, then the plugin can still be defined
|
|
118
|
+
# without breaking anything in future versions of Vagrant.
|
|
119
|
+
#
|
|
120
|
+
# @param [String] name Configuration key.
|
|
121
|
+
# @param [Boolean] upgrade_safe If this is true, then this configuration
|
|
122
|
+
# key is safe to load during an upgrade, meaning that it depends
|
|
123
|
+
# on NO Vagrant internal classes. Do _not_ set this to true unless
|
|
124
|
+
# you really know what you're doing, since you can cause Vagrant
|
|
125
|
+
# to crash (although Vagrant will output a user-friendly error
|
|
126
|
+
# message if this were to happen).
|
|
127
|
+
def self.config(name=UNSET_VALUE, upgrade_safe=false, &block)
|
|
128
|
+
data[:config] ||= Registry.new
|
|
129
|
+
|
|
130
|
+
# Register a new config class only if a name was given.
|
|
131
|
+
if name != UNSET_VALUE
|
|
132
|
+
data[:config].register(name.to_sym, &block)
|
|
133
|
+
|
|
134
|
+
# If we were told this is an upgrade safe configuration class
|
|
135
|
+
# then we add it to the set.
|
|
136
|
+
if upgrade_safe
|
|
137
|
+
data[:config_upgrade_safe] ||= Set.new
|
|
138
|
+
data[:config_upgrade_safe].add(name.to_sym)
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# Return the registry
|
|
143
|
+
data[:config]
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
# Defines an additionally available guest implementation with
|
|
147
|
+
# the given key.
|
|
148
|
+
#
|
|
149
|
+
# @param [String] name Name of the guest.
|
|
150
|
+
def self.guest(name=UNSET_VALUE, &block)
|
|
151
|
+
data[:guests] ||= Registry.new
|
|
152
|
+
|
|
153
|
+
# Register a new guest class only if a name was given
|
|
154
|
+
data[:guests].register(name.to_sym, &block) if name != UNSET_VALUE
|
|
155
|
+
|
|
156
|
+
# Return the registry
|
|
157
|
+
data[:guests]
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# Defines an additionally available host implementation with
|
|
161
|
+
# the given key.
|
|
162
|
+
#
|
|
163
|
+
# @param [String] name Name of the host.
|
|
164
|
+
def self.host(name=UNSET_VALUE, &block)
|
|
165
|
+
data[:hosts] ||= Registry.new
|
|
166
|
+
|
|
167
|
+
# Register a new host class only if a name was given
|
|
168
|
+
data[:hosts].register(name.to_sym, &block) if name != UNSET_VALUE
|
|
169
|
+
|
|
170
|
+
# Return the registry
|
|
171
|
+
data[:hosts]
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
# Registers additional providers to be available.
|
|
175
|
+
#
|
|
176
|
+
# @param [Symbol] name Name of the provider.
|
|
177
|
+
def self.provider(name=UNSET_VALUE, &block)
|
|
178
|
+
data[:providers] ||= Registry.new
|
|
179
|
+
|
|
180
|
+
# Register a new provider class only if a name was given
|
|
181
|
+
data[:providers].register(name.to_sym, &block) if name != UNSET_VALUE
|
|
182
|
+
|
|
183
|
+
# Return the registry
|
|
184
|
+
data[:providers]
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
# Registers additional provisioners to be available.
|
|
188
|
+
#
|
|
189
|
+
# @param [String] name Name of the provisioner.
|
|
190
|
+
def self.provisioner(name=UNSET_VALUE, &block)
|
|
191
|
+
data[:provisioners] ||= Registry.new
|
|
192
|
+
|
|
193
|
+
# Register a new provisioner class only if a name was given
|
|
194
|
+
data[:provisioners].register(name.to_sym, &block) if name != UNSET_VALUE
|
|
195
|
+
|
|
196
|
+
# Return the registry
|
|
197
|
+
data[:provisioners]
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
# Returns the internal data associated with this plugin. This
|
|
201
|
+
# should NOT be called by the general public.
|
|
202
|
+
#
|
|
203
|
+
# @return [Hash]
|
|
204
|
+
def self.data
|
|
205
|
+
@data ||= {}
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
protected
|
|
209
|
+
|
|
210
|
+
# Sentinel value denoting that a value has not been set.
|
|
211
|
+
UNSET_VALUE = Object.new
|
|
212
|
+
|
|
213
|
+
# Helper method that will set a value if a value is given, or otherwise
|
|
214
|
+
# return the already set value.
|
|
215
|
+
#
|
|
216
|
+
# @param [Symbol] key Key for the data
|
|
217
|
+
# @param [Object] value Value to store.
|
|
218
|
+
# @return [Object] Stored value.
|
|
219
|
+
def self.get_or_set(key, value=UNSET_VALUE)
|
|
220
|
+
# If no value is to be set, then return the value we have already set
|
|
221
|
+
return data[key] if value.eql?(UNSET_VALUE)
|
|
222
|
+
|
|
223
|
+
# Otherwise set the value
|
|
224
|
+
data[key] = value
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
module Plugin
|
|
3
|
+
module V1
|
|
4
|
+
# This is the base class for a provider for the V1 API. A provider
|
|
5
|
+
# is responsible for creating compute resources to match the needs
|
|
6
|
+
# of a Vagrant-configured system.
|
|
7
|
+
class Provider
|
|
8
|
+
# Initialize the provider to represent the given machine.
|
|
9
|
+
#
|
|
10
|
+
# @param [Vagrant::Machine] machine The machine that this provider
|
|
11
|
+
# is responsible for.
|
|
12
|
+
def initialize(machine)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# This should return an action callable for the given name.
|
|
16
|
+
#
|
|
17
|
+
# @param [Symbol] name Name of the action.
|
|
18
|
+
# @return [Object] A callable action sequence object, whether it
|
|
19
|
+
# is a proc, object, etc.
|
|
20
|
+
def action(name)
|
|
21
|
+
nil
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# This method is called if the underying machine ID changes. Providers
|
|
25
|
+
# can use this method to load in new data for the actual backing
|
|
26
|
+
# machine or to realize that the machine is now gone (the ID can
|
|
27
|
+
# become `nil`). No parameters are given, since the underlying machine
|
|
28
|
+
# is simply the machine instance given to this object. And no
|
|
29
|
+
# return value is necessary.
|
|
30
|
+
def machine_id_changed
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# This should return a hash of information that explains how to
|
|
34
|
+
# SSH into the machine. If the machine is not at a point where
|
|
35
|
+
# SSH is even possible, then `nil` should be returned.
|
|
36
|
+
#
|
|
37
|
+
# The general structure of this returned hash should be the
|
|
38
|
+
# following:
|
|
39
|
+
#
|
|
40
|
+
# {
|
|
41
|
+
# :host => "1.2.3.4",
|
|
42
|
+
# :port => "22",
|
|
43
|
+
# :username => "mitchellh",
|
|
44
|
+
# :private_key_path => "/path/to/my/key"
|
|
45
|
+
# }
|
|
46
|
+
#
|
|
47
|
+
# **Note:** Vagrant only supports private key based authentication,
|
|
48
|
+
# mainly for the reason that there is no easy way to exec into an
|
|
49
|
+
# `ssh` prompt with a password, whereas we can pass a private key
|
|
50
|
+
# via commandline.
|
|
51
|
+
#
|
|
52
|
+
# @return [Hash] SSH information. For the structure of this hash
|
|
53
|
+
# read the accompanying documentation for this method.
|
|
54
|
+
def ssh_info
|
|
55
|
+
nil
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# This should return the state of the machine within this provider.
|
|
59
|
+
# The state can be any symbol.
|
|
60
|
+
#
|
|
61
|
+
# @return [Symbol]
|
|
62
|
+
def state
|
|
63
|
+
nil
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
module Plugin
|
|
3
|
+
module V1
|
|
4
|
+
# This is the base class for a provisioner for the V1 API. A provisioner
|
|
5
|
+
# is primarily responsible for installing software on a Vagrant guest.
|
|
6
|
+
class Provisioner
|
|
7
|
+
# The environment which provisioner is running in. This is the
|
|
8
|
+
# action environment, not a Vagrant::Environment.
|
|
9
|
+
attr_reader :env
|
|
10
|
+
|
|
11
|
+
# The configuration for this provisioner. This will be an instance of
|
|
12
|
+
# the `Config` class which is part of the provisioner.
|
|
13
|
+
attr_reader :config
|
|
14
|
+
|
|
15
|
+
def initialize(env, config)
|
|
16
|
+
@env = env
|
|
17
|
+
@config = config
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# This method is expected to return a class that is used for
|
|
21
|
+
# configuring the provisioner. This return value is expected to be
|
|
22
|
+
# a subclass of {Config}.
|
|
23
|
+
#
|
|
24
|
+
# @return [Config]
|
|
25
|
+
def self.config_class
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# This is the method called to "prepare" the provisioner. This is called
|
|
29
|
+
# before any actions are run by the action runner (see {Vagrant::Actions::Runner}).
|
|
30
|
+
# This can be used to setup shared folders, forward ports, etc. Whatever is
|
|
31
|
+
# necessary on a "meta" level.
|
|
32
|
+
#
|
|
33
|
+
# No return value is expected.
|
|
34
|
+
def prepare
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# This is the method called to provision the system. This method
|
|
38
|
+
# is expected to do whatever necessary to provision the system (create files,
|
|
39
|
+
# SSH, etc.)
|
|
40
|
+
def provision!
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# This is the method called to when the system is being destroyed
|
|
44
|
+
# and allows the provisioners to engage in any cleanup tasks necessary.
|
|
45
|
+
def cleanup
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require "log4r"
|
|
2
|
+
|
|
3
|
+
require "vagrant/plugin/v1/errors"
|
|
4
|
+
|
|
5
|
+
module Vagrant
|
|
6
|
+
module Plugin
|
|
7
|
+
module V1
|
|
8
|
+
autoload :Command, "vagrant/plugin/v1/command"
|
|
9
|
+
autoload :Communicator, "vagrant/plugin/v1/communicator"
|
|
10
|
+
autoload :Config, "vagrant/plugin/v1/config"
|
|
11
|
+
autoload :Guest, "vagrant/plugin/v1/guest"
|
|
12
|
+
autoload :Host, "vagrant/plugin/v1/host"
|
|
13
|
+
autoload :Manager, "vagrant/plugin/v1/manager"
|
|
14
|
+
autoload :Plugin, "vagrant/plugin/v1/plugin"
|
|
15
|
+
autoload :Provider, "vagrant/plugin/v1/provider"
|
|
16
|
+
autoload :Provisioner, "vagrant/plugin/v1/provisioner"
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
require 'log4r'
|
|
2
|
+
|
|
3
|
+
require "vagrant/util/safe_puts"
|
|
4
|
+
|
|
5
|
+
module Vagrant
|
|
6
|
+
module Plugin
|
|
7
|
+
module V2
|
|
8
|
+
# This is the base class for a CLI command.
|
|
9
|
+
class Command
|
|
10
|
+
include Util::SafePuts
|
|
11
|
+
|
|
12
|
+
def initialize(argv, env)
|
|
13
|
+
@argv = argv
|
|
14
|
+
@env = env
|
|
15
|
+
@logger = Log4r::Logger.new("vagrant::command::#{self.class.to_s.downcase}")
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# This is what is called on the class to actually execute it. Any
|
|
19
|
+
# subclasses should implement this method and do any option parsing
|
|
20
|
+
# and validation here.
|
|
21
|
+
def execute
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
protected
|
|
25
|
+
|
|
26
|
+
# Parses the options given an OptionParser instance.
|
|
27
|
+
#
|
|
28
|
+
# This is a convenience method that properly handles duping the
|
|
29
|
+
# originally argv array so that it is not destroyed.
|
|
30
|
+
#
|
|
31
|
+
# This method will also automatically detect "-h" and "--help"
|
|
32
|
+
# and print help. And if any invalid options are detected, the help
|
|
33
|
+
# will be printed, as well.
|
|
34
|
+
#
|
|
35
|
+
# If this method returns `nil`, then you should assume that help
|
|
36
|
+
# was printed and parsing failed.
|
|
37
|
+
def parse_options(opts=nil)
|
|
38
|
+
# Creating a shallow copy of the arguments so the OptionParser
|
|
39
|
+
# doesn't destroy the originals.
|
|
40
|
+
argv = @argv.dup
|
|
41
|
+
|
|
42
|
+
# Default opts to a blank optionparser if none is given
|
|
43
|
+
opts ||= OptionParser.new
|
|
44
|
+
|
|
45
|
+
# Add the help option, which must be on every command.
|
|
46
|
+
opts.on_tail("-h", "--help", "Print this help") do
|
|
47
|
+
safe_puts(opts.help)
|
|
48
|
+
return nil
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
opts.parse!(argv)
|
|
52
|
+
return argv
|
|
53
|
+
rescue OptionParser::InvalidOption
|
|
54
|
+
raise Errors::CLIInvalidOptions, :help => opts.help.chomp
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Yields a VM for each target VM for the command.
|
|
58
|
+
#
|
|
59
|
+
# This is a convenience method for easily implementing methods that
|
|
60
|
+
# take a target VM (in the case of multi-VM) or every VM if no
|
|
61
|
+
# specific VM name is specified.
|
|
62
|
+
#
|
|
63
|
+
# @param [String] name The name of the VM. Nil if every VM.
|
|
64
|
+
# @param [Hash] options Additional tweakable settings.
|
|
65
|
+
# @option options [Symbol] :provider The provider to back the
|
|
66
|
+
# machines with. All machines will be backed with this
|
|
67
|
+
# provider. If none is given, a sensible default is chosen.
|
|
68
|
+
# @option options [Boolean] :reverse If true, the resulting order
|
|
69
|
+
# of machines is reversed.
|
|
70
|
+
# @option options [Boolean] :single_target If true, then an
|
|
71
|
+
# exception will be raised if more than one target is found.
|
|
72
|
+
def with_target_vms(names=nil, options=nil)
|
|
73
|
+
@logger.debug("Getting target VMs for command. Arguments:")
|
|
74
|
+
@logger.debug(" -- names: #{names.inspect}")
|
|
75
|
+
@logger.debug(" -- options: #{options.inspect}")
|
|
76
|
+
|
|
77
|
+
# Using VMs requires a Vagrant environment to be properly setup
|
|
78
|
+
raise Errors::NoEnvironmentError if !@env.root_path
|
|
79
|
+
|
|
80
|
+
# Setup the options hash
|
|
81
|
+
options ||= {}
|
|
82
|
+
|
|
83
|
+
# Require that names be an array
|
|
84
|
+
names ||= []
|
|
85
|
+
names = [names] if !names.is_a?(Array)
|
|
86
|
+
|
|
87
|
+
# This is a helper that gets a single machine with the proper
|
|
88
|
+
# provider. The "proper provider" in this case depends on what was
|
|
89
|
+
# given:
|
|
90
|
+
#
|
|
91
|
+
# * If a provider was explicitly specified, then use that provider.
|
|
92
|
+
# But if an active machine exists with a DIFFERENT provider,
|
|
93
|
+
# then throw an error (for now), since we don't yet support
|
|
94
|
+
# bringing up machines with different providers.
|
|
95
|
+
#
|
|
96
|
+
# * If no provider was specified, then use the active machine's
|
|
97
|
+
# provider if it exists, otherwise use the default provider.
|
|
98
|
+
#
|
|
99
|
+
get_machine = lambda do |name|
|
|
100
|
+
# Check for an active machine with the same name
|
|
101
|
+
provider_to_use = options[:provider]
|
|
102
|
+
provider_to_use = provider_to_use.to_sym if provider_to_use
|
|
103
|
+
|
|
104
|
+
@env.active_machines.each do |active_name, active_provider|
|
|
105
|
+
if name == active_name
|
|
106
|
+
# We found an active machine with the same name
|
|
107
|
+
|
|
108
|
+
if provider_to_use && provider_to_use != active_provider
|
|
109
|
+
# We found an active machine with a provider that doesn't
|
|
110
|
+
# match the requested provider. Show an error.
|
|
111
|
+
raise Errors::ActiveMachineWithDifferentProvider,
|
|
112
|
+
:name => active_name.to_s,
|
|
113
|
+
:active_provider => active_provider.to_s,
|
|
114
|
+
:requested_provider => provider_to_use.to_s
|
|
115
|
+
else
|
|
116
|
+
# Use this provider and exit out of the loop. One of the
|
|
117
|
+
# invariants [for now] is that there shouldn't be machines
|
|
118
|
+
# with multiple providers.
|
|
119
|
+
@logger.info("Active machine found with name #{active_name}. " +
|
|
120
|
+
"Using provider: #{active_provider}")
|
|
121
|
+
provider_to_use = active_provider
|
|
122
|
+
break
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# Use the default provider if nothing else
|
|
128
|
+
provider_to_use ||= @env.default_provider
|
|
129
|
+
|
|
130
|
+
# Get the right machine with the right provider
|
|
131
|
+
@env.machine(name, provider_to_use)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# First determine the proper array of VMs.
|
|
135
|
+
machines = []
|
|
136
|
+
if names.length > 0
|
|
137
|
+
names.each do |name|
|
|
138
|
+
if pattern = name[/^\/(.+?)\/$/, 1]
|
|
139
|
+
@logger.debug("Finding machines that match regex: #{pattern}")
|
|
140
|
+
|
|
141
|
+
# This is a regular expression name, so we convert to a regular
|
|
142
|
+
# expression and allow that sort of matching.
|
|
143
|
+
regex = Regexp.new(pattern)
|
|
144
|
+
|
|
145
|
+
@env.machine_names.each do |machine_name|
|
|
146
|
+
if machine_name =~ regex
|
|
147
|
+
machines << get_machine.call(machine_name)
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
raise Errors::VMNoMatchError if machines.empty?
|
|
152
|
+
else
|
|
153
|
+
# String name, just look for a specific VM
|
|
154
|
+
@logger.debug("Finding machine that match name: #{name}")
|
|
155
|
+
machines << get_machine.call(name.to_sym)
|
|
156
|
+
raise Errors::VMNotFoundError, :name => name if !machines[0]
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
else
|
|
160
|
+
# No name was given, so we return every VM in the order
|
|
161
|
+
# configured.
|
|
162
|
+
@logger.debug("Loading all machines...")
|
|
163
|
+
machines = @env.machine_names.map do |machine_name|
|
|
164
|
+
get_machine.call(machine_name)
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
# Make sure we're only working with one VM if single target
|
|
169
|
+
if options[:single_target] && machines.length != 1
|
|
170
|
+
@logger.debug("Using primary machine since single target")
|
|
171
|
+
primary_name = @env.primary_machine_name
|
|
172
|
+
raise Errors::MultiVMTargetRequired if !primary_name
|
|
173
|
+
machines = [get_machine.call(primary_name)]
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
# If we asked for reversed ordering, then reverse it
|
|
177
|
+
machines.reverse! if options[:reverse]
|
|
178
|
+
|
|
179
|
+
# Go through each VM and yield it!
|
|
180
|
+
machines.each do |machine|
|
|
181
|
+
@logger.info("With machine: #{machine.name} (#{machine.provider.inspect})")
|
|
182
|
+
yield machine
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
# This method will split the argv given into three parts: the
|
|
187
|
+
# flags to this command, the subcommand, and the flags to the
|
|
188
|
+
# subcommand. For example:
|
|
189
|
+
#
|
|
190
|
+
# -v status -h -v
|
|
191
|
+
#
|
|
192
|
+
# The above would yield 3 parts:
|
|
193
|
+
#
|
|
194
|
+
# ["-v"]
|
|
195
|
+
# "status"
|
|
196
|
+
# ["-h", "-v"]
|
|
197
|
+
#
|
|
198
|
+
# These parts are useful because the first is a list of arguments
|
|
199
|
+
# given to the current command, the second is a subcommand, and the
|
|
200
|
+
# third are the commands given to the subcommand.
|
|
201
|
+
#
|
|
202
|
+
# @return [Array] The three parts.
|
|
203
|
+
def split_main_and_subcommand(argv)
|
|
204
|
+
# Initialize return variables
|
|
205
|
+
main_args = nil
|
|
206
|
+
sub_command = nil
|
|
207
|
+
sub_args = []
|
|
208
|
+
|
|
209
|
+
# We split the arguments into two: One set containing any
|
|
210
|
+
# flags before a word, and then the rest. The rest are what
|
|
211
|
+
# get actually sent on to the subcommand.
|
|
212
|
+
argv.each_index do |i|
|
|
213
|
+
if !argv[i].start_with?("-")
|
|
214
|
+
# We found the beginning of the sub command. Split the
|
|
215
|
+
# args up.
|
|
216
|
+
main_args = argv[0, i]
|
|
217
|
+
sub_command = argv[i]
|
|
218
|
+
sub_args = argv[i + 1, argv.length - i + 1]
|
|
219
|
+
|
|
220
|
+
# Break so we don't find the next non flag and shift our
|
|
221
|
+
# main args.
|
|
222
|
+
break
|
|
223
|
+
end
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
# Handle the case that argv was empty or didn't contain any subcommand
|
|
227
|
+
main_args = argv.dup if main_args.nil?
|
|
228
|
+
|
|
229
|
+
return [main_args, sub_command, sub_args]
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
end
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
module Plugin
|
|
3
|
+
module V2
|
|
4
|
+
# Base class for a communicator in Vagrant. A communicator is
|
|
5
|
+
# responsible for communicating with a machine in some way. There
|
|
6
|
+
# are various stages of Vagrant that require things such as uploading
|
|
7
|
+
# files to the machine, executing shell commands, etc. Implementors
|
|
8
|
+
# of this class are expected to provide this functionality in some
|
|
9
|
+
# way.
|
|
10
|
+
#
|
|
11
|
+
# Note that a communicator must provide **all** of the methods
|
|
12
|
+
# in this base class. There is currently no way for one communicator
|
|
13
|
+
# to provide say a more efficient way of uploading a file, but not
|
|
14
|
+
# provide shell execution. This sort of thing will come in a future
|
|
15
|
+
# version.
|
|
16
|
+
class Communicator
|
|
17
|
+
# This returns true/false depending on if the given machine
|
|
18
|
+
# can be communicated with using this communicator. If this returns
|
|
19
|
+
# `true`, then this class will be used as the primary communication
|
|
20
|
+
# method for the machine.
|
|
21
|
+
#
|
|
22
|
+
# @return [Boolean]
|
|
23
|
+
def self.match?(machine)
|
|
24
|
+
false
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Initializes the communicator with the machine that we will be
|
|
28
|
+
# communicating with. This base method does nothing (it doesn't
|
|
29
|
+
# even store the machine in an instance variable for you), so you're
|
|
30
|
+
# expected to override this and do something with the machine if
|
|
31
|
+
# you care about it.
|
|
32
|
+
#
|
|
33
|
+
# @param [Machine] machine The machine this instance is expected to
|
|
34
|
+
# communicate with.
|
|
35
|
+
def initialize(machine)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Checks if the target machine is ready for communication. If this
|
|
39
|
+
# returns true, then all the other methods for communicating with
|
|
40
|
+
# the machine are expected to be functional.
|
|
41
|
+
#
|
|
42
|
+
# @return [Boolean]
|
|
43
|
+
def ready?
|
|
44
|
+
false
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Download a file from the remote machine to the local machine.
|
|
48
|
+
#
|
|
49
|
+
# @param [String] from Path of the file on the remote machine.
|
|
50
|
+
# @param [String] to Path of where to save the file locally.
|
|
51
|
+
def download(from, to)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Upload a file to the remote machine.
|
|
55
|
+
#
|
|
56
|
+
# @param [String] from Path of the file locally to upload.
|
|
57
|
+
# @param [String] to Path of where to save the file on the remote
|
|
58
|
+
# machine.
|
|
59
|
+
def upload(from, to)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Execute a command on the remote machine. The exact semantics
|
|
63
|
+
# of this method are up to the implementor, but in general the
|
|
64
|
+
# users of this class will expect this to be a shell.
|
|
65
|
+
#
|
|
66
|
+
# This method gives you no way to write data back to the remote
|
|
67
|
+
# machine, so only execute commands that don't expect input.
|
|
68
|
+
#
|
|
69
|
+
# @param [String] command Command to execute.
|
|
70
|
+
# @yield [type, data] Realtime output of the command being executed.
|
|
71
|
+
# @yieldparam [String] type Type of the output. This can be
|
|
72
|
+
# `:stdout`, `:stderr`, etc. The exact types are up to the
|
|
73
|
+
# implementor.
|
|
74
|
+
# @yieldparam [String] data Data for the given output.
|
|
75
|
+
# @return [Integer] Exit code of the command.
|
|
76
|
+
def execute(command, opts=nil)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Executes a command on the remote machine with administrative
|
|
80
|
+
# privileges. See {#execute} for documentation, as the API is the
|
|
81
|
+
# same.
|
|
82
|
+
#
|
|
83
|
+
# @see #execute
|
|
84
|
+
def sudo(command, opts=nil)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Executes a command and returns true if the command succeeded,
|
|
88
|
+
# and false otherwise. By default, this executes as a normal user,
|
|
89
|
+
# and it is up to the communicator implementation if they expose an
|
|
90
|
+
# option for running tests as an administrator.
|
|
91
|
+
#
|
|
92
|
+
# @see #execute
|
|
93
|
+
def test(command, opts=nil)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|