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,37 @@
|
|
|
1
|
+
require File.expand_path("../../base", __FILE__)
|
|
2
|
+
|
|
3
|
+
describe "vagrant provisioning with chef solo" do
|
|
4
|
+
include_context "acceptance"
|
|
5
|
+
|
|
6
|
+
it "runs basic cookbooks" do
|
|
7
|
+
# Create the chef solo basic skeleton
|
|
8
|
+
environment.skeleton!("chef_solo_basic")
|
|
9
|
+
|
|
10
|
+
# Setup the basic environment
|
|
11
|
+
require_box("default")
|
|
12
|
+
assert_execute("vagrant", "box", "add", "base", box_path("default"))
|
|
13
|
+
|
|
14
|
+
# Bring up the VM
|
|
15
|
+
assert_execute("vagrant", "up")
|
|
16
|
+
|
|
17
|
+
# Check for the file it should have created
|
|
18
|
+
results = assert_execute("vagrant", "ssh", "-c", "cat /tmp/chef_solo_basic")
|
|
19
|
+
results.stdout.should == "success"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "merges JSON into the attributes" do
|
|
23
|
+
# Copy the skeleton
|
|
24
|
+
environment.skeleton!("chef_solo_json")
|
|
25
|
+
|
|
26
|
+
# Setup the basic environment
|
|
27
|
+
require_box("default")
|
|
28
|
+
assert_execute("vagrant", "box", "add", "base", box_path("default"))
|
|
29
|
+
|
|
30
|
+
# Bring up the VM
|
|
31
|
+
assert_execute("vagrant", "up")
|
|
32
|
+
|
|
33
|
+
# Check for the file it should have created
|
|
34
|
+
results = assert_execute("vagrant", "ssh", "-c", "cat /tmp/chef_solo_basic")
|
|
35
|
+
results.stdout.should == "json_data"
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
require File.expand_path("../../base", __FILE__)
|
|
2
|
+
|
|
3
|
+
describe "vagrant provisioning with shell" do
|
|
4
|
+
include_context "acceptance"
|
|
5
|
+
|
|
6
|
+
it "runs a script on boot" do
|
|
7
|
+
require_box("default")
|
|
8
|
+
|
|
9
|
+
assert_execute("vagrant", "box", "add", "base", box_path("default"))
|
|
10
|
+
|
|
11
|
+
environment.workdir.join("Vagrantfile").open("w+") do |f|
|
|
12
|
+
f.write(<<-vf)
|
|
13
|
+
Vagrant::Config.run do |config|
|
|
14
|
+
config.vm.box = "base"
|
|
15
|
+
config.vm.provision :shell, :path => "script.sh"
|
|
16
|
+
end
|
|
17
|
+
vf
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
environment.workdir.join("script.sh").open("w+") do |f|
|
|
21
|
+
f.write(<<-vf)
|
|
22
|
+
echo success > /vagrant/results
|
|
23
|
+
vf
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
assert_execute("vagrant", "up")
|
|
27
|
+
|
|
28
|
+
result_file = environment.workdir.join("results")
|
|
29
|
+
result_file.exist?.should be
|
|
30
|
+
result_file.read.should == "success\n"
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it "runs an inline script" do
|
|
34
|
+
require_box("default")
|
|
35
|
+
|
|
36
|
+
assert_execute("vagrant", "box", "add", "base", box_path("default"))
|
|
37
|
+
|
|
38
|
+
environment.workdir.join("Vagrantfile").open("w+") do |f|
|
|
39
|
+
f.write(<<-vf)
|
|
40
|
+
Vagrant::Config.run do |config|
|
|
41
|
+
config.vm.box = "base"
|
|
42
|
+
config.vm.provision :shell, :inline => "echo success > /vagrant/results"
|
|
43
|
+
end
|
|
44
|
+
vf
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
assert_execute("vagrant", "up")
|
|
48
|
+
|
|
49
|
+
result_file = environment.workdir.join("results")
|
|
50
|
+
result_file.exist?.should be
|
|
51
|
+
result_file.read.should == "success\n"
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require File.expand_path("../base", __FILE__)
|
|
2
|
+
require "acceptance/support/shared/command_examples"
|
|
3
|
+
|
|
4
|
+
describe "vagrant resume" do
|
|
5
|
+
include_context "acceptance"
|
|
6
|
+
it_behaves_like "a command that requires a Vagrantfile", ["vagrant", "resume"]
|
|
7
|
+
|
|
8
|
+
it "succeeds and ignores if the VM is not created" do
|
|
9
|
+
require_box("default")
|
|
10
|
+
|
|
11
|
+
assert_execute("vagrant", "box", "add", "base", box_path("default"))
|
|
12
|
+
assert_execute("vagrant", "init")
|
|
13
|
+
|
|
14
|
+
result = assert_execute("vagrant", "resume")
|
|
15
|
+
result.stdout.should match_output(:vm_not_created_warning)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
require File.expand_path("../base", __FILE__)
|
|
2
|
+
require "acceptance/support/shared/command_examples"
|
|
3
|
+
|
|
4
|
+
describe "vagrant shared folders" do
|
|
5
|
+
include_context "acceptance"
|
|
6
|
+
|
|
7
|
+
# This creates an initial environment that is ready for a "vagrant up"
|
|
8
|
+
def initialize_valid_environment
|
|
9
|
+
require_box("default")
|
|
10
|
+
|
|
11
|
+
assert_execute("vagrant", "box", "add", "base", box_path("default"))
|
|
12
|
+
assert_execute("vagrant", "init")
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "should have a '/vagrant' shared folder" do
|
|
16
|
+
initialize_valid_environment
|
|
17
|
+
|
|
18
|
+
# This is the file that will be created from the VM,
|
|
19
|
+
# but should then exist on the host machine
|
|
20
|
+
foofile = environment.workdir.join("foo")
|
|
21
|
+
|
|
22
|
+
assert_execute("vagrant", "up")
|
|
23
|
+
foofile.exist?.should_not be,
|
|
24
|
+
"'foo' should not exist yet."
|
|
25
|
+
|
|
26
|
+
assert_execute("vagrant", "ssh", "-c", "touch /vagrant/foo")
|
|
27
|
+
foofile.exist?.should be, "'foo' should exist since it was touched in the shared folder"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "should create a shared folder if the :create flag is set" do
|
|
31
|
+
initialize_valid_environment
|
|
32
|
+
|
|
33
|
+
# Setup the custom Vagrantfile
|
|
34
|
+
environment.workdir.join("Vagrantfile").open("w+") do |f|
|
|
35
|
+
f.write(<<-VF)
|
|
36
|
+
Vagrant::Config.run do |config|
|
|
37
|
+
config.vm.box = "base"
|
|
38
|
+
config.vm.share_folder "v-root", "/vagrant", "./data", :create => true
|
|
39
|
+
end
|
|
40
|
+
VF
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
data_dir = environment.workdir.join("data")
|
|
44
|
+
|
|
45
|
+
# Verify the directory doesn't exist prior, for sanity
|
|
46
|
+
data_dir.exist?.should_not be
|
|
47
|
+
|
|
48
|
+
# Bring up the VM
|
|
49
|
+
assert_execute("vagrant", "up")
|
|
50
|
+
|
|
51
|
+
# Verify the directory exists
|
|
52
|
+
data_dir.should be_directory
|
|
53
|
+
|
|
54
|
+
# Touch a file and verify it is shared
|
|
55
|
+
assert_execute("vagrant", "ssh", "-c", "touch /vagrant/foo")
|
|
56
|
+
data_dir.join("foo").exist?.should be
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it "should properly shell expand relative directories on the guest" do
|
|
60
|
+
initialize_valid_environment
|
|
61
|
+
|
|
62
|
+
# Setup the custom Vagrantfile
|
|
63
|
+
environment.workdir.join("Vagrantfile").open("w+") do |f|
|
|
64
|
+
f.write(<<-VF)
|
|
65
|
+
Vagrant::Config.run do |config|
|
|
66
|
+
config.vm.box = "base"
|
|
67
|
+
config.vm.share_folder "v-root", "~/data", "."
|
|
68
|
+
end
|
|
69
|
+
VF
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Sanity
|
|
73
|
+
foo_file = environment.workdir.join("foo")
|
|
74
|
+
foo_file.exist?.should_not be
|
|
75
|
+
|
|
76
|
+
# Bring up the VM
|
|
77
|
+
assert_execute("vagrant", "up")
|
|
78
|
+
|
|
79
|
+
# Touch a file in the shared folder we expect and verify
|
|
80
|
+
# it is shared.
|
|
81
|
+
assert_execute("vagrant", "ssh", "-c", "touch ~/data/foo")
|
|
82
|
+
foo_file.exist?.should be
|
|
83
|
+
end
|
|
84
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
require File.expand_path("../base", __FILE__)
|
|
2
|
+
require "acceptance/support/shared/command_examples"
|
|
3
|
+
|
|
4
|
+
describe "vagrant ssh" do
|
|
5
|
+
include_context "acceptance"
|
|
6
|
+
it_behaves_like "a command that requires a Vagrantfile", ["vagrant", "ssh"]
|
|
7
|
+
it_behaves_like "a command that requires a virtual machine", ["vagrant", "ssh"]
|
|
8
|
+
|
|
9
|
+
it "is able to SSH into a running virtual machine" do
|
|
10
|
+
require_box("default")
|
|
11
|
+
|
|
12
|
+
assert_execute("vagrant", "box", "add", "base", box_path("default"))
|
|
13
|
+
assert_execute("vagrant", "init")
|
|
14
|
+
assert_execute("vagrant", "up")
|
|
15
|
+
|
|
16
|
+
outputted = false
|
|
17
|
+
result = assert_execute("vagrant", "ssh") do |io_type, data|
|
|
18
|
+
if io_type == :stdin and !outputted
|
|
19
|
+
data.puts("echo hello")
|
|
20
|
+
data.puts("exit")
|
|
21
|
+
outputted = true
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
result.stdout.chomp.should eql("hello"), "Vagrant should bring up a VM to be able to SSH into."
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "is able to execute a single command via the command line" do
|
|
29
|
+
require_box("default")
|
|
30
|
+
|
|
31
|
+
assert_execute("vagrant", "box", "add", "base", box_path("default"))
|
|
32
|
+
assert_execute("vagrant", "init")
|
|
33
|
+
assert_execute("vagrant", "up")
|
|
34
|
+
|
|
35
|
+
result = execute("vagrant", "ssh", "-c", "echo foo")
|
|
36
|
+
result.exit_code.should == 0
|
|
37
|
+
result.stdout.should == "foo\n"
|
|
38
|
+
|
|
39
|
+
result = execute("vagrant", "ssh", "-c", "foooooooooo")
|
|
40
|
+
result.exit_code.should == 127
|
|
41
|
+
result.stderr.should =~ /foooooooooo: command not found/
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# TODO:
|
|
45
|
+
# SSH should fail if the VM is not running
|
|
46
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
require "yaml"
|
|
2
|
+
|
|
3
|
+
require "log4r"
|
|
4
|
+
|
|
5
|
+
module Acceptance
|
|
6
|
+
# This represents a configuration object for acceptance tests.
|
|
7
|
+
class Config
|
|
8
|
+
attr_reader :vagrant_path
|
|
9
|
+
attr_reader :vagrant_version
|
|
10
|
+
attr_reader :env
|
|
11
|
+
attr_reader :box_directory
|
|
12
|
+
|
|
13
|
+
def initialize(path)
|
|
14
|
+
@logger = Log4r::Logger.new("test::acceptance::config")
|
|
15
|
+
@logger.info("Loading configuration from: #{path}")
|
|
16
|
+
options = YAML.load_file(path)
|
|
17
|
+
@logger.info("Loaded: #{options.inspect}")
|
|
18
|
+
|
|
19
|
+
@vagrant_path = options["vagrant_path"]
|
|
20
|
+
@vagrant_version = options["vagrant_version"]
|
|
21
|
+
@env = options["env"]
|
|
22
|
+
@box_directory = options["box_directory"]
|
|
23
|
+
|
|
24
|
+
# Verify the configuration object.
|
|
25
|
+
validate
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# This method verifies the configuration and makes sure that
|
|
29
|
+
# all the configuration is available and appears good. This
|
|
30
|
+
# method will raise an ArgumentError in the case that anything
|
|
31
|
+
# is wrong.
|
|
32
|
+
def validate
|
|
33
|
+
if !@vagrant_path || !File.file?(@vagrant_path)
|
|
34
|
+
raise ArgumentError, "'vagrant_path' must point to the `vagrant` executable"
|
|
35
|
+
elsif !@vagrant_version
|
|
36
|
+
raise ArgumentError, "`vagrant_version' must be set to the version of the `vagrant` executable"
|
|
37
|
+
elsif !@box_directory || !File.directory?(@box_directory)
|
|
38
|
+
raise ArgumentError, "`box_directory` must be set to a folder containing boxes for the tests."
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
require "fileutils"
|
|
2
|
+
require "pathname"
|
|
3
|
+
|
|
4
|
+
require "log4r"
|
|
5
|
+
require "childprocess"
|
|
6
|
+
|
|
7
|
+
require "vagrant/util/subprocess"
|
|
8
|
+
|
|
9
|
+
require "acceptance/support/virtualbox"
|
|
10
|
+
require "support/isolated_environment"
|
|
11
|
+
|
|
12
|
+
module Acceptance
|
|
13
|
+
# This class manages an isolated environment for Vagrant to
|
|
14
|
+
# run in. It creates a temporary directory to act as the
|
|
15
|
+
# working directory as well as sets a custom home directory.
|
|
16
|
+
class IsolatedEnvironment < ::IsolatedEnvironment
|
|
17
|
+
SKELETON_DIR = Pathname.new(File.expand_path("../../skeletons", __FILE__))
|
|
18
|
+
|
|
19
|
+
def initialize(apps=nil, env=nil)
|
|
20
|
+
super()
|
|
21
|
+
|
|
22
|
+
@logger = Log4r::Logger.new("test::acceptance::isolated_environment")
|
|
23
|
+
|
|
24
|
+
@apps = apps.clone || {}
|
|
25
|
+
@env = env.clone || {}
|
|
26
|
+
|
|
27
|
+
# Set the home directory and virtualbox home directory environmental
|
|
28
|
+
# variables so that Vagrant and VirtualBox see the proper paths here.
|
|
29
|
+
@env["HOME"] ||= @homedir.to_s
|
|
30
|
+
@env["VBOX_USER_HOME"] ||= @homedir.to_s
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Copies a skeleton into this isolated environment. This is useful
|
|
34
|
+
# for testing environments that require a complex setup.
|
|
35
|
+
#
|
|
36
|
+
# @param [String] name Name of the skeleton in the skeletons/ directory.
|
|
37
|
+
def skeleton!(name)
|
|
38
|
+
# Copy all the files into the home directory
|
|
39
|
+
source = Dir.glob(SKELETON_DIR.join(name).join("*").to_s)
|
|
40
|
+
FileUtils.cp_r(source, @workdir.to_s)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Executes a command in the context of this isolated environment.
|
|
44
|
+
# Any command executed will therefore see our temporary directory
|
|
45
|
+
# as the home directory.
|
|
46
|
+
def execute(command, *argN)
|
|
47
|
+
# Create the command
|
|
48
|
+
command = replace_command(command)
|
|
49
|
+
|
|
50
|
+
# Determine the options
|
|
51
|
+
options = argN.last.is_a?(Hash) ? argN.pop : {}
|
|
52
|
+
options = {
|
|
53
|
+
:workdir => @workdir,
|
|
54
|
+
:env => @env,
|
|
55
|
+
:notify => [:stdin, :stderr, :stdout]
|
|
56
|
+
}.merge(options)
|
|
57
|
+
|
|
58
|
+
# Add the options to be passed on
|
|
59
|
+
argN << options
|
|
60
|
+
|
|
61
|
+
# Execute, logging out the stdout/stderr as we get it
|
|
62
|
+
@logger.info("Executing: #{[command].concat(argN).inspect}")
|
|
63
|
+
Vagrant::Util::Subprocess.execute(command *argN) do |type, data|
|
|
64
|
+
@logger.debug("#{type}: #{data}") if type == :stdout || type == :stderr
|
|
65
|
+
yield type, data if block_given?
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Closes the environment, cleans up the temporary directories, etc.
|
|
70
|
+
def close
|
|
71
|
+
# Only delete virtual machines if VBoxSVC is running, meaning
|
|
72
|
+
# that something related to VirtualBox started running in this
|
|
73
|
+
# environment.
|
|
74
|
+
delete_virtual_machines if VirtualBox.find_vboxsvc
|
|
75
|
+
|
|
76
|
+
# Let the parent handle cleaning up
|
|
77
|
+
super
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def delete_virtual_machines
|
|
81
|
+
# Delete all virtual machines
|
|
82
|
+
@logger.debug("Finding all virtual machines")
|
|
83
|
+
execute("VBoxManage", "list", "vms").stdout.lines.each do |line|
|
|
84
|
+
data = /^"(?<name>.+?)" {(?<uuid>.+?)}$/.match(line)
|
|
85
|
+
|
|
86
|
+
begin
|
|
87
|
+
@logger.debug("Removing VM: #{data[:name]}")
|
|
88
|
+
|
|
89
|
+
# We add a timeout onto this because sometimes for seemingly no
|
|
90
|
+
# reason it will simply freeze, although the VM is successfully
|
|
91
|
+
# "aborted." The timeout gets around this strange behavior.
|
|
92
|
+
execute("VBoxManage", "controlvm", data[:uuid], "poweroff", :timeout => 5)
|
|
93
|
+
rescue Vagrant::Util::Subprocess::TimeoutExceeded => e
|
|
94
|
+
@logger.info("Failed to poweroff VM '#{data[:uuid]}'. Killing process.")
|
|
95
|
+
|
|
96
|
+
# Kill the process and wait a bit for it to disappear
|
|
97
|
+
Process.kill('KILL', e.pid)
|
|
98
|
+
Process.waitpid2(e.pid)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
sleep 0.5
|
|
102
|
+
|
|
103
|
+
result = execute("VBoxManage", "unregistervm", data[:uuid], "--delete")
|
|
104
|
+
raise Exception, "VM unregistration failed!" if result.exit_code != 0
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
@logger.info("Removed all virtual machines")
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# This replaces a command with a replacement defined when this
|
|
111
|
+
# isolated environment was initialized. If nothing was defined,
|
|
112
|
+
# then the command itself is returned.
|
|
113
|
+
def replace_command(command)
|
|
114
|
+
return @apps[command] if @apps.has_key?(command)
|
|
115
|
+
return command
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
require "acceptance/support/output"
|
|
2
|
+
|
|
3
|
+
# This creates a matcher that is used to match against certain
|
|
4
|
+
# Vagrant output. Vagrant output is not what is being tested,
|
|
5
|
+
# so all that state is hidden away in Acceptance::Output.
|
|
6
|
+
RSpec::Matchers.define :match_output do |expected, *args|
|
|
7
|
+
match do |actual|
|
|
8
|
+
Acceptance::Output.new(actual).send(expected, *args)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
failure_message_for_should do |actual|
|
|
12
|
+
"expected output to match: #{expected} #{args.inspect}"
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Matcher that verifies that a process succeeds.
|
|
2
|
+
RSpec::Matchers.define :succeed do
|
|
3
|
+
match do |thing|
|
|
4
|
+
thing.exit_code.should == 0
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
failure_message_for_should do |actual|
|
|
8
|
+
"expected process to succeed. exit code: #{actual.exit_code}"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
failure_message_for_should_not do |actual|
|
|
12
|
+
"expected process to fail. exit code: #{actual.exit_code}"
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require "vagrant/util/retryable"
|
|
2
|
+
|
|
3
|
+
module Acceptance
|
|
4
|
+
module NetworkTests
|
|
5
|
+
include Vagrant::Util::Retryable
|
|
6
|
+
|
|
7
|
+
# Tests that the host can access the VM through the network.
|
|
8
|
+
#
|
|
9
|
+
# @param [String] url URL to request from the host.
|
|
10
|
+
# @param [Integer] guest_port Port to run a web server on the guest.
|
|
11
|
+
def assert_host_to_vm_network(url, guest_port)
|
|
12
|
+
# Start up a web server in another thread by SSHing into the VM.
|
|
13
|
+
thr = Thread.new do
|
|
14
|
+
assert_execute("vagrant", "ssh", "-c", "python -m SimpleHTTPServer #{guest_port}")
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Verify that port forwarding works by making a simple HTTP request
|
|
18
|
+
# to the port. We should get a 200 response. We retry this a few times
|
|
19
|
+
# as we wait for the HTTP server to come online.
|
|
20
|
+
retryable(:tries => 5, :sleep => 2) do
|
|
21
|
+
result = Net::HTTP.get_response(URI.parse(url))
|
|
22
|
+
result.code.should == "200"
|
|
23
|
+
end
|
|
24
|
+
ensure
|
|
25
|
+
# The server needs to die. This is how.
|
|
26
|
+
thr.kill if thr
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
module Acceptance
|
|
2
|
+
# This class helps with matching against output so that every
|
|
3
|
+
# test isn't inherently tied to the output format of Vagrant.
|
|
4
|
+
class Output
|
|
5
|
+
DEFAULT_VM = "default"
|
|
6
|
+
|
|
7
|
+
def initialize(text)
|
|
8
|
+
@text = text
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def box_already_exists(name)
|
|
12
|
+
@text =~ /^A box already exists under the name of '#{name}'/
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Checks that an error message was outputted about the box
|
|
16
|
+
# being added being invalid.
|
|
17
|
+
def box_invalid
|
|
18
|
+
@text =~ /^The box file you're attempting to add is invalid./
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Checks that an error message was outputted about the path
|
|
22
|
+
# not existing to the box.
|
|
23
|
+
def box_path_doesnt_exist
|
|
24
|
+
@text =~ /^The specified path to a file doesn't exist.$/
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Tests that the box with given name is installed.
|
|
28
|
+
def box_installed(name)
|
|
29
|
+
@text =~ /^#{name}$/
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Tests that the output says there are no installed boxes.
|
|
33
|
+
def no_boxes
|
|
34
|
+
@text =~ /There are no installed boxes!/
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Tests that the output says there is no Vagrantfile, and as such
|
|
38
|
+
# can't do whatever we requested Vagrant to do.
|
|
39
|
+
def no_vagrantfile
|
|
40
|
+
@text =~ /^A Vagrant environment is required/
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Tests that the output contains a specific Vagrant version.
|
|
44
|
+
def version(version)
|
|
45
|
+
@text =~ /^Vagrant version #{version}$/
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def resume_port_collision
|
|
49
|
+
@text =~ /^This VM cannot be resumed, because the forwarded ports/
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# This checks that the VM with the given `vm_name` has the
|
|
53
|
+
# status of `status`.
|
|
54
|
+
def status(vm_name, status)
|
|
55
|
+
@text =~ /^#{vm_name}\s+#{status}$/
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# This checks that an error message that the VM must be created
|
|
59
|
+
# is shown.
|
|
60
|
+
def error_vm_must_be_created
|
|
61
|
+
@text =~ /^VM must be created/
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# This checks that the warning that the VM is not created is emitted.
|
|
65
|
+
def vm_not_created_warning
|
|
66
|
+
@text =~ /VM not created. Moving on...$/
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# This checks that the VM is destroyed.
|
|
70
|
+
def vm_destroyed
|
|
71
|
+
@text =~ /Destroying VM and associated drives...$/
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# This checks that the "up" output properly contains text showing that
|
|
75
|
+
# it is downloading the box during the up process.
|
|
76
|
+
def up_fetching_box(name, vm=DEFAULT_VM)
|
|
77
|
+
@text =~ /^\[#{vm}\] Box #{name} was not found. Fetching box from specified URL...$/
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Check that the output shows that the VM was shut down gracefully
|
|
81
|
+
def vm_halt_graceful
|
|
82
|
+
@text =~ /Attempting graceful shutdown of/
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Output shows a forceful VM shutdown.
|
|
86
|
+
def vm_halt_force
|
|
87
|
+
@text =~ /Forcing shutdown of VM...$/
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Output shows the VM is in the process of suspending
|
|
91
|
+
def vm_suspending
|
|
92
|
+
@text =~ /Saving VM state and suspending execution...$/
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
require "acceptance/support/isolated_environment"
|
|
2
|
+
require "acceptance/support/output"
|
|
3
|
+
require "acceptance/support/virtualbox"
|
|
4
|
+
|
|
5
|
+
shared_context "acceptance" do
|
|
6
|
+
# Setup variables for the loggers of this test. These can be used to
|
|
7
|
+
# create more verbose logs for tests which can be useful in the case
|
|
8
|
+
# that a test fails.
|
|
9
|
+
let(:logger_name) { "logger" }
|
|
10
|
+
let(:logger) { Log4r::Logger.new("test::acceptance::#{logger_name}") }
|
|
11
|
+
|
|
12
|
+
# This is the global configuration given by the acceptance test
|
|
13
|
+
# configurations.
|
|
14
|
+
let(:config) { $acceptance_options }
|
|
15
|
+
|
|
16
|
+
# Setup the environment so that we have an isolated area
|
|
17
|
+
# to run Vagrant. We do some configuration here as well in order
|
|
18
|
+
# to replace "vagrant" with the proper path to Vagrant as well
|
|
19
|
+
# as tell the isolated environment about custom environmental
|
|
20
|
+
# variables to pass in.
|
|
21
|
+
let!(:environment) { new_environment }
|
|
22
|
+
|
|
23
|
+
before(:each) do
|
|
24
|
+
# Wait for VBoxSVC to disappear, since each test requires its
|
|
25
|
+
# own isolated VirtualBox process.
|
|
26
|
+
Acceptance::VirtualBox.wait_for_vboxsvc
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
after(:each) do
|
|
30
|
+
environment.close
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Creates a new isolated environment instance each time it is called.
|
|
34
|
+
#
|
|
35
|
+
# @return [Acceptance::IsolatedEnvironment]
|
|
36
|
+
def new_environment(env=nil)
|
|
37
|
+
apps = { "vagrant" => config.vagrant_path }
|
|
38
|
+
env = config.env.merge(env || {})
|
|
39
|
+
|
|
40
|
+
Acceptance::IsolatedEnvironment.new(apps, env)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Executes the given command in the context of the isolated environment.
|
|
44
|
+
#
|
|
45
|
+
# @return [Object]
|
|
46
|
+
def execute(*args, &block)
|
|
47
|
+
environment.execute(*args, &block)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# This method is an assertion helper for asserting that a process
|
|
51
|
+
# succeeds. It is a wrapper around `execute` that asserts that the
|
|
52
|
+
# exit status was successful.
|
|
53
|
+
def assert_execute(*args, &block)
|
|
54
|
+
result = execute(*args, &block)
|
|
55
|
+
assert(result.exit_code == 0, "expected '#{args.join(" ")}' to succeed")
|
|
56
|
+
result
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# This can be added to the beginning of a test to verify that the
|
|
60
|
+
# box with the given name is available to a test. This will raise
|
|
61
|
+
# an exception if the box is not found.
|
|
62
|
+
def require_box(name)
|
|
63
|
+
if !File.exist?(box_path(name))
|
|
64
|
+
raise ArgumentError, "The tests should have a '#{name}' box."
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# This is used to get the path to a box of a specific name.
|
|
69
|
+
def box_path(name)
|
|
70
|
+
File.join(config.box_directory, "#{name}.box")
|
|
71
|
+
end
|
|
72
|
+
end
|