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,33 @@
|
|
|
1
|
+
# This is a shared example that tests that a command requires a
|
|
2
|
+
# Vagrant environment to run properly. The exact command to run
|
|
3
|
+
# should be given as a parameter to the shared examples.
|
|
4
|
+
shared_examples "a command that requires a Vagrantfile" do |*args|
|
|
5
|
+
let(:command) do
|
|
6
|
+
raise ArgumentError, "A command must be set for the shared example." if args.empty?
|
|
7
|
+
args[0]
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
it "fails if no Vagrantfile is found" do
|
|
11
|
+
result = execute(*command)
|
|
12
|
+
result.should_not succeed
|
|
13
|
+
result.stderr.should match_output(:no_vagrantfile)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# This is a shared example that tests that the command requires a
|
|
18
|
+
# virtual machine to be created, and additionally to be in one of
|
|
19
|
+
# many states.
|
|
20
|
+
shared_examples "a command that requires a virtual machine" do |*args|
|
|
21
|
+
let(:command) do
|
|
22
|
+
raise ArgumentError, "A command must be set for the shared example." if args.empty?
|
|
23
|
+
args[0]
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "fails if the virtual machine is not created" do
|
|
27
|
+
assert_execute("vagrant", "init")
|
|
28
|
+
|
|
29
|
+
result = execute(*command)
|
|
30
|
+
result.should_not succeed
|
|
31
|
+
result.stderr.should match_output(:error_vm_must_be_created)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
require 'sys/proctable'
|
|
2
|
+
|
|
3
|
+
module Acceptance
|
|
4
|
+
module VirtualBox
|
|
5
|
+
extend self
|
|
6
|
+
|
|
7
|
+
# This method will wait for the "VBoxSVC" process to end. This will
|
|
8
|
+
# block during that time period. The reason for this is because only
|
|
9
|
+
# one "VBoxSVC" can run per user and manages all state within VirtualBox.
|
|
10
|
+
# Before you can run VirtualBox with a custom home directory, you must
|
|
11
|
+
# wait for this VBoxSVC process to die.
|
|
12
|
+
def wait_for_vboxsvc
|
|
13
|
+
time_passed = 0
|
|
14
|
+
while find_vboxsvc
|
|
15
|
+
if time_passed > 5
|
|
16
|
+
raise Exception, "VBoxSVC process is not going away."
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
sleep 1
|
|
20
|
+
time_passed += 1
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# This method finds the VBoxSVC process and returns information about it.
|
|
25
|
+
# This will return "nil" if VBoxSVC is not found.
|
|
26
|
+
def find_vboxsvc
|
|
27
|
+
Sys::ProcTable.ps do |process|
|
|
28
|
+
if process.comm == "VBoxSVC"
|
|
29
|
+
return process
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
nil
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
require File.expand_path("../base", __FILE__)
|
|
2
|
+
require "acceptance/support/shared/command_examples"
|
|
3
|
+
|
|
4
|
+
describe "vagrant suspend" do
|
|
5
|
+
include_context "acceptance"
|
|
6
|
+
it_behaves_like "a command that requires a Vagrantfile", ["vagrant", "suspend"]
|
|
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", "suspend")
|
|
15
|
+
result.stdout.should match_output(:vm_not_created_warning)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "is able to suspend a running virtual machine" do
|
|
19
|
+
require_box("default")
|
|
20
|
+
|
|
21
|
+
assert_execute("vagrant", "box", "add", "base", box_path("default"))
|
|
22
|
+
assert_execute("vagrant", "init")
|
|
23
|
+
assert_execute("vagrant", "up")
|
|
24
|
+
|
|
25
|
+
# Suspend the VM and assert that it worked properly (seemingly)
|
|
26
|
+
result = assert_execute("vagrant", "suspend")
|
|
27
|
+
result.stdout.should match_output(:vm_suspending)
|
|
28
|
+
|
|
29
|
+
# Assert that the VM is no longer running
|
|
30
|
+
result = assert_execute("vagrant", "status")
|
|
31
|
+
result.stdout.should match_output(:status, "default", "saved")
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# These tests are parameterized since both "vagrant resume" and
|
|
35
|
+
# "vagrant up" should achieve the same result.
|
|
36
|
+
["resume", "up"].each do |command|
|
|
37
|
+
it "is able to resume after the machine has been suspended using #{command}" do
|
|
38
|
+
require_box("default")
|
|
39
|
+
|
|
40
|
+
assert_execute("vagrant", "box", "add", "base", box_path("default"))
|
|
41
|
+
assert_execute("vagrant", "init")
|
|
42
|
+
assert_execute("vagrant", "up")
|
|
43
|
+
assert_execute("vagrant", "suspend")
|
|
44
|
+
|
|
45
|
+
# Assert that the VM is no longer running
|
|
46
|
+
result = assert_execute("vagrant", "status")
|
|
47
|
+
result.stdout.should match_output(:status, "default", "saved")
|
|
48
|
+
|
|
49
|
+
assert_execute("vagrant", command)
|
|
50
|
+
|
|
51
|
+
# Assert that the VM is once again running
|
|
52
|
+
result = assert_execute("vagrant", "status")
|
|
53
|
+
result.stdout.should match_output(:status, "default", "running")
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
require File.expand_path("../base", __FILE__)
|
|
2
|
+
require "acceptance/support/shared/command_examples"
|
|
3
|
+
|
|
4
|
+
describe "vagrant up", "basics" do
|
|
5
|
+
include_context "acceptance"
|
|
6
|
+
it_behaves_like "a command that requires a Vagrantfile", ["vagrant", "up"]
|
|
7
|
+
|
|
8
|
+
# This creates an initial environment that is ready for a "vagrant up"
|
|
9
|
+
def initialize_valid_environment
|
|
10
|
+
require_box("default")
|
|
11
|
+
|
|
12
|
+
assert_execute("vagrant", "box", "add", "base", box_path("default"))
|
|
13
|
+
assert_execute("vagrant", "init")
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "brings up a running virtual machine" do
|
|
17
|
+
initialize_valid_environment
|
|
18
|
+
|
|
19
|
+
assert_execute("vagrant", "up")
|
|
20
|
+
result = assert_execute("vagrant", "status")
|
|
21
|
+
result.stdout.should match_output(:status, "default", "running")
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "is able to run if Vagrantfile is in a parent directory" do
|
|
25
|
+
initialize_valid_environment
|
|
26
|
+
|
|
27
|
+
# Create a subdirectory in the working directory and use
|
|
28
|
+
# that as the CWD for `vagrant up` and verify it still works
|
|
29
|
+
foodir = environment.workdir.join("foo")
|
|
30
|
+
foodir.mkdir
|
|
31
|
+
assert_execute("vagrant", "up", :chdir => foodir.to_s)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
require File.expand_path("../base", __FILE__)
|
|
2
|
+
require "acceptance/support/shared/command_examples"
|
|
3
|
+
|
|
4
|
+
describe "vagrant up", "with a box URL set" do
|
|
5
|
+
include_context "acceptance"
|
|
6
|
+
|
|
7
|
+
it "downloads and brings up the VM if the box doesn't exist" do
|
|
8
|
+
require_box("default")
|
|
9
|
+
|
|
10
|
+
assert_execute("vagrant", "init", "base", box_path("default"))
|
|
11
|
+
result = assert_execute("vagrant", "up")
|
|
12
|
+
result.stdout.should match_output(:up_fetching_box, "base")
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "downloads the file only once and works if shared by multiple VMs", :issue => "GH-564" do
|
|
16
|
+
require_box("default")
|
|
17
|
+
|
|
18
|
+
environment.workdir.join("Vagrantfile").open("w+") do |f|
|
|
19
|
+
f.puts(<<-VFILE)
|
|
20
|
+
Vagrant::Config.run do |config|
|
|
21
|
+
config.vm.define :machine1 do |vm_config|
|
|
22
|
+
vm_config.vm.box = "base"
|
|
23
|
+
vm_config.vm.box_url = "#{box_path("default")}"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
config.vm.define :machine2 do |vm_config|
|
|
27
|
+
vm_config.vm.box = "base"
|
|
28
|
+
vm_config.vm.box_url = "#{box_path("default")}"
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
VFILE
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Bring up the environment, which should work. `machine1` should download
|
|
35
|
+
# the box while `machine2` doesn't.
|
|
36
|
+
result = assert_execute("vagrant", "up")
|
|
37
|
+
result.stdout.should match_output(:up_fetching_box, "base", "machine1")
|
|
38
|
+
result.stdout.should_not match_output(:up_fetching_box, "base", "machine2")
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
require File.expand_path("../base", __FILE__)
|
|
2
|
+
require "acceptance/support/matchers/have_color"
|
|
3
|
+
|
|
4
|
+
describe "vagrant and color output" do
|
|
5
|
+
include_context "acceptance"
|
|
6
|
+
|
|
7
|
+
# This is a check to see if the `expect` program is installed on this
|
|
8
|
+
# computer. Some tests require this and if this doesn't exist then the
|
|
9
|
+
# test itself will be skipped.
|
|
10
|
+
def self.has_expect?
|
|
11
|
+
`which expect`
|
|
12
|
+
$?.success?
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "outputs color if there is a TTY", :if => has_expect? do
|
|
16
|
+
environment.workdir.join("color.exp").open("w+") do |f|
|
|
17
|
+
f.puts(<<-SCRIPT)
|
|
18
|
+
spawn #{environment.replace_command("vagrant")} status
|
|
19
|
+
expect default {}
|
|
20
|
+
SCRIPT
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
result = execute("expect", "color.exp")
|
|
24
|
+
result.stdout.should have_color
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "doesn't output color if there is a TTY but --no-color is present", :if => has_expect? do
|
|
28
|
+
environment.workdir.join("color.exp").open("w+") do |f|
|
|
29
|
+
f.puts(<<-SCRIPT)
|
|
30
|
+
spawn #{environment.replace_command("vagrant")} status --no-color
|
|
31
|
+
expect default {}
|
|
32
|
+
SCRIPT
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
result = execute("expect", "color.exp")
|
|
36
|
+
result.stdout.should_not have_color
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "doesn't output color in the absense of a TTY" do
|
|
40
|
+
# This should always output an error, which on a TTY would
|
|
41
|
+
# output color. We check that this doesn't output color.
|
|
42
|
+
# If `vagrant status` itself is broken, another acceptance test
|
|
43
|
+
# should catch that. We just assume it works here.
|
|
44
|
+
result = execute("vagrant", "status")
|
|
45
|
+
result.stdout.should_not have_color
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
require File.expand_path("../base", __FILE__)
|
|
2
|
+
|
|
3
|
+
describe "vagrant version" do
|
|
4
|
+
include_context "acceptance"
|
|
5
|
+
|
|
6
|
+
it "prints the version when called with '-v'" do
|
|
7
|
+
result = execute("vagrant", "-v")
|
|
8
|
+
result.stdout.should match_output(:version, config.vagrant_version)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "prints the version when called with '--version'" do
|
|
12
|
+
result = execute("vagrant", "--version")
|
|
13
|
+
result.stdout.should match_output(:version, config.vagrant_version)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# This is the list of required boxes for acceptance tests, and
|
|
2
|
+
# their locations. The locations are used to download the boxes
|
|
3
|
+
# on the fly, if necessary. Additionally, a SHA1 checksum is
|
|
4
|
+
# given to determine if the box needs to be updated.
|
|
5
|
+
- name: default
|
|
6
|
+
url: http://files.vagrantup.com/test/boxes/default.box
|
|
7
|
+
checksum: 1b0a7eb6e152c5b43f45485654ff4965a7f9f604
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
require "fileutils"
|
|
2
|
+
require "pathname"
|
|
3
|
+
|
|
4
|
+
require "log4r"
|
|
5
|
+
|
|
6
|
+
require "support/tempdir"
|
|
7
|
+
|
|
8
|
+
# This class manages an isolated environment for Vagrant to
|
|
9
|
+
# run in. It creates a temporary directory to act as the
|
|
10
|
+
# working directory as well as sets a custom home directory.
|
|
11
|
+
#
|
|
12
|
+
# This class also provides various helpers to create Vagrantfiles,
|
|
13
|
+
# boxes, etc.
|
|
14
|
+
class IsolatedEnvironment
|
|
15
|
+
attr_reader :homedir
|
|
16
|
+
attr_reader :workdir
|
|
17
|
+
|
|
18
|
+
# Initializes an isolated environment. You can pass in some
|
|
19
|
+
# options here to configure runing custom applications in place
|
|
20
|
+
# of others as well as specifying environmental variables.
|
|
21
|
+
#
|
|
22
|
+
# @param [Hash] apps A mapping of application name (such as "vagrant")
|
|
23
|
+
# to an alternate full path to the binary to run.
|
|
24
|
+
# @param [Hash] env Additional environmental variables to inject
|
|
25
|
+
# into the execution environments.
|
|
26
|
+
def initialize
|
|
27
|
+
@logger = Log4r::Logger.new("test::isolated_environment")
|
|
28
|
+
|
|
29
|
+
# Create a temporary directory for our work
|
|
30
|
+
@tempdir = Tempdir.new("vagrant")
|
|
31
|
+
@logger.info("Initialize isolated environment: #{@tempdir.path}")
|
|
32
|
+
|
|
33
|
+
# Setup the home and working directories
|
|
34
|
+
@homedir = Pathname.new(File.join(@tempdir.path, "home"))
|
|
35
|
+
@workdir = Pathname.new(File.join(@tempdir.path, "work"))
|
|
36
|
+
|
|
37
|
+
@homedir.mkdir
|
|
38
|
+
@workdir.mkdir
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# This closes the environment by cleaning it up.
|
|
42
|
+
def close
|
|
43
|
+
@logger.info("Removing isolated environment: #{@tempdir.path}")
|
|
44
|
+
FileUtils.rm_rf(@tempdir.path)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
require 'tempfile'
|
|
3
|
+
|
|
4
|
+
# This class provides an easy way of creating a temporary
|
|
5
|
+
# directory and having it removed when the application exits.
|
|
6
|
+
class Tempdir
|
|
7
|
+
attr_reader :path
|
|
8
|
+
|
|
9
|
+
def initialize(basename="vagrant")
|
|
10
|
+
@path = nil
|
|
11
|
+
|
|
12
|
+
# Loop and attempt to create a temporary directory until
|
|
13
|
+
# it succeeds.
|
|
14
|
+
while @path.nil?
|
|
15
|
+
file = Tempfile.new(basename)
|
|
16
|
+
@path = file.path
|
|
17
|
+
file.unlink
|
|
18
|
+
|
|
19
|
+
begin
|
|
20
|
+
Dir.mkdir(@path)
|
|
21
|
+
rescue
|
|
22
|
+
@path = nil
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Setup a finalizer to delete the directory. This is the same way
|
|
27
|
+
# that Tempfile and friends do this...
|
|
28
|
+
@cleanup_proc = lambda do
|
|
29
|
+
FileUtils.rm_rf(@path) if File.directory?(@path)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
ObjectSpace.define_finalizer(self, @cleanup_proc)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# This deletes the temporary directory.
|
|
36
|
+
def unlink
|
|
37
|
+
# Delete the directory
|
|
38
|
+
@cleanup_proc.call
|
|
39
|
+
|
|
40
|
+
# Undefine the finalizer since we're all cleaned up
|
|
41
|
+
ObjectSpace.undefine_finalizer(self)
|
|
42
|
+
end
|
|
43
|
+
end
|
data/test/unit/base.rb
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
require "rubygems"
|
|
2
|
+
require "rspec/autorun"
|
|
3
|
+
|
|
4
|
+
# Require Vagrant itself so we can reference the proper
|
|
5
|
+
# classes to test.
|
|
6
|
+
require "vagrant"
|
|
7
|
+
|
|
8
|
+
# Add the test directory to the load path
|
|
9
|
+
$:.unshift File.expand_path("../../", __FILE__)
|
|
10
|
+
|
|
11
|
+
# Load in helpers
|
|
12
|
+
require "support/tempdir"
|
|
13
|
+
require "unit/support/dummy_provider"
|
|
14
|
+
require "unit/support/shared/base_context"
|
|
15
|
+
|
|
16
|
+
# Do not buffer output
|
|
17
|
+
$stdout.sync = true
|
|
18
|
+
$stderr.sync = true
|
|
19
|
+
|
|
20
|
+
# Configure RSpec
|
|
21
|
+
RSpec.configure do |c|
|
|
22
|
+
c.expect_with :rspec, :stdlib
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Configure VAGRANT_CWD so that the tests never find an actual
|
|
26
|
+
# Vagrantfile anywhere, or at least this minimizes those chances.
|
|
27
|
+
ENV["VAGRANT_CWD"] = Tempdir.new.path
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module VagrantTests
|
|
2
|
+
class DummyProviderPlugin < Vagrant.plugin("2")
|
|
3
|
+
name "Dummy Provider"
|
|
4
|
+
description <<-EOF
|
|
5
|
+
This creates a provider named "dummy" which does nothing, so that
|
|
6
|
+
the unit tests aren't reliant on VirtualBox (or any other real
|
|
7
|
+
provider for that matter).
|
|
8
|
+
EOF
|
|
9
|
+
|
|
10
|
+
provider(:dummy) { DummyProvider }
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
class DummyProvider < Vagrant.plugin("2", :provider)
|
|
14
|
+
# No-op
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
require "fileutils"
|
|
2
|
+
require "pathname"
|
|
3
|
+
require "tempfile"
|
|
4
|
+
|
|
5
|
+
require "json"
|
|
6
|
+
require "log4r"
|
|
7
|
+
|
|
8
|
+
require "vagrant/util/platform"
|
|
9
|
+
require "vagrant/util/subprocess"
|
|
10
|
+
|
|
11
|
+
require "support/isolated_environment"
|
|
12
|
+
require "support/tempdir"
|
|
13
|
+
|
|
14
|
+
module Unit
|
|
15
|
+
class IsolatedEnvironment < ::IsolatedEnvironment
|
|
16
|
+
def create_vagrant_env(options=nil)
|
|
17
|
+
options = {
|
|
18
|
+
:cwd => @workdir,
|
|
19
|
+
:home_path => @homedir
|
|
20
|
+
}.merge(options || {})
|
|
21
|
+
|
|
22
|
+
Vagrant::Environment.new(options)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# This creates a file in the isolated environment. By default this file
|
|
26
|
+
# will be created in the working directory of the isolated environment.
|
|
27
|
+
def file(name, contents)
|
|
28
|
+
@workdir.join(name).open("w+") do |f|
|
|
29
|
+
f.write(contents)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def vagrantfile(contents, root=nil)
|
|
34
|
+
root ||= @workdir
|
|
35
|
+
root.join("Vagrantfile").open("w+") do |f|
|
|
36
|
+
f.write(contents)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def box(name, vagrantfile_contents="")
|
|
41
|
+
# Create the box directory
|
|
42
|
+
box_dir = boxes_dir.join(name)
|
|
43
|
+
box_dir.mkpath
|
|
44
|
+
|
|
45
|
+
# Create the "box.ovf" file because that is how Vagrant heuristically
|
|
46
|
+
# determines a box is a V1 box.
|
|
47
|
+
box_dir.join("box.ovf").open("w") { |f| f.write("") }
|
|
48
|
+
|
|
49
|
+
# Populate the vagrantfile
|
|
50
|
+
vagrantfile(vagrantfile_contents, box_dir)
|
|
51
|
+
|
|
52
|
+
# Return the directory
|
|
53
|
+
box_dir
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Create an alias because "box" makes a V1 box, so "box1"
|
|
57
|
+
alias :box1 :box
|
|
58
|
+
|
|
59
|
+
# Creates a fake box to exist in this environment.
|
|
60
|
+
#
|
|
61
|
+
# @param [String] name Name of the box
|
|
62
|
+
# @param [Symbol] provider Provider the box was built for.
|
|
63
|
+
# @return [Pathname] Path to the box directory.
|
|
64
|
+
def box2(name, provider, options=nil)
|
|
65
|
+
# Default options
|
|
66
|
+
options = {
|
|
67
|
+
:vagrantfile => ""
|
|
68
|
+
}.merge(options || {})
|
|
69
|
+
|
|
70
|
+
# Make the box directory
|
|
71
|
+
box_dir = boxes_dir.join(name, provider.to_s)
|
|
72
|
+
box_dir.mkpath
|
|
73
|
+
|
|
74
|
+
# Create a metadata.json file
|
|
75
|
+
box_metadata_file = box_dir.join("metadata.json")
|
|
76
|
+
box_metadata_file.open("w") do |f|
|
|
77
|
+
f.write(JSON.generate({
|
|
78
|
+
:provider => provider.to_s
|
|
79
|
+
}))
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# Create a Vagrantfile
|
|
83
|
+
box_vagrantfile = box_dir.join("Vagrantfile")
|
|
84
|
+
box_vagrantfile.open("w") do |f|
|
|
85
|
+
f.write(options[:vagrantfile])
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Return the box directory
|
|
89
|
+
box_dir
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# This creates a "box" file that is a valid V1 box.
|
|
93
|
+
#
|
|
94
|
+
# @return [Pathname] Path to the newly created box.
|
|
95
|
+
def box1_file
|
|
96
|
+
# Create a temporary directory to store our data we will tar up
|
|
97
|
+
td_source = Tempdir.new
|
|
98
|
+
td_dest = Tempdir.new
|
|
99
|
+
|
|
100
|
+
# Store the temporary directory so it is not deleted until
|
|
101
|
+
# this instance is garbage collected.
|
|
102
|
+
@_box2_file_temp ||= []
|
|
103
|
+
@_box2_file_temp << td_dest
|
|
104
|
+
|
|
105
|
+
# The source as a Pathname, which is easier to work with
|
|
106
|
+
source = Pathname.new(td_source.path)
|
|
107
|
+
|
|
108
|
+
# The destination file
|
|
109
|
+
result = Pathname.new(td_dest.path).join("temporary.box")
|
|
110
|
+
|
|
111
|
+
# Put a "box.ovf" in there.
|
|
112
|
+
source.join("box.ovf").open("w") do |f|
|
|
113
|
+
f.write("FOO!")
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
Dir.chdir(source) do
|
|
117
|
+
# Find all the files in our current directory and tar it up!
|
|
118
|
+
files = Dir.glob(File.join(".", "**", "*"))
|
|
119
|
+
|
|
120
|
+
# Package!
|
|
121
|
+
Vagrant::Util::Subprocess.execute("bsdtar", "-czf", result.to_s, *files)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# Resulting box
|
|
125
|
+
result
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# This creates a "box" file with the given provider.
|
|
129
|
+
#
|
|
130
|
+
# @param [Symbol] provider Provider for the box.
|
|
131
|
+
# @return [Pathname] Path to the newly created box.
|
|
132
|
+
def box2_file(provider, options=nil)
|
|
133
|
+
options ||= {}
|
|
134
|
+
|
|
135
|
+
# This is the metadata we want to store in our file
|
|
136
|
+
metadata = {
|
|
137
|
+
"type" => "v2_box",
|
|
138
|
+
"provider" => provider
|
|
139
|
+
}.merge(options[:metadata] || {})
|
|
140
|
+
|
|
141
|
+
# Create a temporary directory to store our data we will tar up
|
|
142
|
+
td_source = Tempdir.new
|
|
143
|
+
td_dest = Tempdir.new
|
|
144
|
+
|
|
145
|
+
# Store the temporary directory so it is not deleted until
|
|
146
|
+
# this instance is garbage collected.
|
|
147
|
+
@_box2_file_temp ||= []
|
|
148
|
+
@_box2_file_temp << td_dest
|
|
149
|
+
|
|
150
|
+
# The source as a Pathname, which is easier to work with
|
|
151
|
+
source = Pathname.new(td_source.path)
|
|
152
|
+
|
|
153
|
+
# The destination file
|
|
154
|
+
result = Pathname.new(td_dest.path).join("temporary.box")
|
|
155
|
+
|
|
156
|
+
# Put the metadata.json in here.
|
|
157
|
+
source.join("metadata.json").open("w") do |f|
|
|
158
|
+
f.write(JSON.generate(metadata))
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
Dir.chdir(source) do
|
|
162
|
+
# Find all the files in our current directory and tar it up!
|
|
163
|
+
files = Dir.glob(File.join(".", "**", "*"))
|
|
164
|
+
|
|
165
|
+
# Package!
|
|
166
|
+
Vagrant::Util::Subprocess.execute("bsdtar", "-czf", result.to_s, *files)
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
# Resulting box
|
|
170
|
+
result
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def boxes_dir
|
|
174
|
+
dir = @homedir.join("boxes")
|
|
175
|
+
dir.mkpath
|
|
176
|
+
dir
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
end
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
require "tempfile"
|
|
2
|
+
|
|
3
|
+
require "support/tempdir"
|
|
4
|
+
require "unit/support/isolated_environment"
|
|
5
|
+
|
|
6
|
+
shared_context "unit" do
|
|
7
|
+
before(:each) do
|
|
8
|
+
# State to store the list of registered plugins that we have to
|
|
9
|
+
# unregister later.
|
|
10
|
+
@_plugins = []
|
|
11
|
+
|
|
12
|
+
# Create a thing to store our temporary files so that they aren't
|
|
13
|
+
# unlinked right away.
|
|
14
|
+
@_temp_files = []
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
after(:each) do
|
|
18
|
+
# Unregister each of the plugins we have may have temporarily
|
|
19
|
+
# registered for the duration of this test.
|
|
20
|
+
@_plugins.each do |plugin|
|
|
21
|
+
Vagrant.plugin("1").manager.unregister(plugin)
|
|
22
|
+
Vagrant.plugin("2").manager.unregister(plugin)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# This creates an isolated environment so that Vagrant doesn't
|
|
27
|
+
# muck around with your real system during unit tests.
|
|
28
|
+
#
|
|
29
|
+
# The returned isolated environment has a variety of helper
|
|
30
|
+
# methods on it to easily create files, Vagrantfiles, boxes,
|
|
31
|
+
# etc.
|
|
32
|
+
def isolated_environment
|
|
33
|
+
env = Unit::IsolatedEnvironment.new
|
|
34
|
+
yield env if block_given?
|
|
35
|
+
env
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# This registers a Vagrant plugin for the duration of a single test.
|
|
39
|
+
# This will yield a new plugin class that you can then call the
|
|
40
|
+
# public plugin methods on.
|
|
41
|
+
#
|
|
42
|
+
# @yield [plugin] Yields the plugin class for you to call the public
|
|
43
|
+
# API that you need to.
|
|
44
|
+
def register_plugin(version=nil)
|
|
45
|
+
version ||= Vagrant::Config::CURRENT_VERSION
|
|
46
|
+
plugin = Class.new(Vagrant.plugin(version))
|
|
47
|
+
plugin.name("Test Plugin #{plugin.inspect}")
|
|
48
|
+
yield plugin if block_given?
|
|
49
|
+
@_plugins << plugin
|
|
50
|
+
plugin
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# This helper creates a temporary file and returns a Pathname
|
|
54
|
+
# object pointed to it.
|
|
55
|
+
#
|
|
56
|
+
# @return [Pathname]
|
|
57
|
+
def temporary_file(contents=nil)
|
|
58
|
+
f = Tempfile.new("vagrant-unit")
|
|
59
|
+
|
|
60
|
+
if contents
|
|
61
|
+
f.write(contents)
|
|
62
|
+
f.flush
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Store the tempfile in an instance variable so that it is not
|
|
66
|
+
# garbage collected, so that the tempfile is not unlinked.
|
|
67
|
+
@_temp_files << f
|
|
68
|
+
|
|
69
|
+
return Pathname.new(f.path)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# This creates a temporary directory and returns a {Pathname}
|
|
73
|
+
# pointing to it.
|
|
74
|
+
#
|
|
75
|
+
# @return [Pathname]
|
|
76
|
+
def temporary_dir
|
|
77
|
+
# Create a temporary directory and append it to the instance
|
|
78
|
+
# variabe so that it isn't garbage collected and deleted
|
|
79
|
+
d = Tempdir.new("vagrant-unit")
|
|
80
|
+
@_temp_files << d
|
|
81
|
+
|
|
82
|
+
# Return the pathname
|
|
83
|
+
return Pathname.new(d.path)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# This helper provides temporary environmental variable changes.
|
|
87
|
+
def with_temp_env(environment)
|
|
88
|
+
# Build up the new environment, preserving the old values so we
|
|
89
|
+
# can replace them back in later.
|
|
90
|
+
old_env = {}
|
|
91
|
+
environment.each do |key, value|
|
|
92
|
+
old_env[key] = ENV[key]
|
|
93
|
+
ENV[key] = value
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Call the block, returning its return value
|
|
97
|
+
return yield
|
|
98
|
+
ensure
|
|
99
|
+
# Reset the environment no matter what
|
|
100
|
+
old_env.each do |key, value|
|
|
101
|
+
ENV[key] = value
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|