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,163 @@
|
|
|
1
|
+
require "log4r"
|
|
2
|
+
|
|
3
|
+
module Vagrant
|
|
4
|
+
# This class handles guest-OS specific interactions with a machine.
|
|
5
|
+
# It is primarily responsible for detecting the proper guest OS
|
|
6
|
+
# implementation and then delegating capabilities.
|
|
7
|
+
#
|
|
8
|
+
# Vagrant has many tasks which require specific guest OS knowledge.
|
|
9
|
+
# These are implemented using a guest/capability system. Various plugins
|
|
10
|
+
# register as "guests" which determine the underlying OS of the system.
|
|
11
|
+
# Then, "guest capabilities" register themselves for a specific OS (one
|
|
12
|
+
# or more), and these capabilities are called.
|
|
13
|
+
#
|
|
14
|
+
# Example capabilities might be "mount_virtualbox_shared_folder" or
|
|
15
|
+
# "configure_networks".
|
|
16
|
+
#
|
|
17
|
+
# This system allows for maximum flexibility and pluginability for doing
|
|
18
|
+
# guest OS specific operations.
|
|
19
|
+
class Guest
|
|
20
|
+
attr_reader :chain
|
|
21
|
+
|
|
22
|
+
# The name of the guest OS. This is available after {#detect!} is
|
|
23
|
+
# called.
|
|
24
|
+
#
|
|
25
|
+
# @return [Symbol]
|
|
26
|
+
attr_reader :name
|
|
27
|
+
|
|
28
|
+
def initialize(machine, guests, capabilities)
|
|
29
|
+
@logger = Log4r::Logger.new("vagrant::guest")
|
|
30
|
+
@capabilities = capabilities
|
|
31
|
+
@chain = []
|
|
32
|
+
@guests = guests
|
|
33
|
+
@machine = machine
|
|
34
|
+
@name = nil
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# This will detect the proper guest OS for the machine and set up
|
|
38
|
+
# the class to actually execute capabilities.
|
|
39
|
+
def detect!
|
|
40
|
+
@logger.info("Detect guest for machine: #{@machine}")
|
|
41
|
+
|
|
42
|
+
# Get the mapping of guests with the most parents. We start searching
|
|
43
|
+
# with the guests with the most parents first.
|
|
44
|
+
parent_count = {}
|
|
45
|
+
@guests.each do |name, parts|
|
|
46
|
+
parent_count[name] = 0
|
|
47
|
+
|
|
48
|
+
parent = parts[1]
|
|
49
|
+
while parent
|
|
50
|
+
parent_count[name] += 1
|
|
51
|
+
parent = @guests[parent]
|
|
52
|
+
parent = parent[1] if parent
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Now swap around the mapping so that it is a mapping of
|
|
57
|
+
# count to the actual list of guest names
|
|
58
|
+
parent_count_to_guests = {}
|
|
59
|
+
parent_count.each do |name, count|
|
|
60
|
+
parent_count_to_guests[count] ||= []
|
|
61
|
+
parent_count_to_guests[count] << name
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
catch(:guest_os) do
|
|
65
|
+
sorted_counts = parent_count_to_guests.keys.sort.reverse
|
|
66
|
+
sorted_counts.each do |count|
|
|
67
|
+
parent_count_to_guests[count].each do |name|
|
|
68
|
+
@logger.debug("Trying: #{name}")
|
|
69
|
+
guest_info = @guests[name]
|
|
70
|
+
guest = guest_info[0].new
|
|
71
|
+
|
|
72
|
+
if guest.detect?(@machine)
|
|
73
|
+
@logger.info("Detected: #{name}!")
|
|
74
|
+
@chain << [name, guest]
|
|
75
|
+
@name = name
|
|
76
|
+
|
|
77
|
+
# Build the proper chain of parents if there are any.
|
|
78
|
+
# This allows us to do "inheritence" of capabilities later
|
|
79
|
+
if guest_info[1]
|
|
80
|
+
parent_name = guest_info[1]
|
|
81
|
+
parent_info = @guests[parent_name]
|
|
82
|
+
while parent_info
|
|
83
|
+
@chain << [parent_name, parent_info[0].new]
|
|
84
|
+
parent_name = parent_info[1]
|
|
85
|
+
parent_info = @guests[parent_name]
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
@logger.info("Full guest chain: #{@chain.inspect}")
|
|
90
|
+
|
|
91
|
+
# Exit the search
|
|
92
|
+
throw :guest_os
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# We shouldn't reach this point. Ideally we would detect
|
|
99
|
+
# all operating systems.
|
|
100
|
+
raise Errors::GuestNotDetected if @chain.empty?
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# Tests whether the guest has the named capability.
|
|
104
|
+
#
|
|
105
|
+
# @return [Boolean]
|
|
106
|
+
def capability?(cap_name)
|
|
107
|
+
!capability_module(cap_name).nil?
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# Executes the capability with the given name, optionally passing
|
|
111
|
+
# more arguments onwards to the capability.
|
|
112
|
+
def capability(cap_name, *args)
|
|
113
|
+
@logger.info("Execute capability: #{cap_name} (#{@chain[0][0]})")
|
|
114
|
+
cap_mod = capability_module(cap_name.to_sym)
|
|
115
|
+
if !cap_mod
|
|
116
|
+
raise Errors::GuestCapabilityNotFound,
|
|
117
|
+
:cap => cap_name.to_s,
|
|
118
|
+
:guest => @chain[0][0].to_s
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
cap_method = nil
|
|
122
|
+
begin
|
|
123
|
+
cap_method = cap_mod.method(cap_name)
|
|
124
|
+
rescue NameError
|
|
125
|
+
raise Errors::GuestCapabilityInvalid,
|
|
126
|
+
:cap => cap_name.to_s,
|
|
127
|
+
:guest => @chain[0][0].to_s
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
cap_method.call(@machine, *args)
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# This returns whether the guest is ready to work. If this returns
|
|
134
|
+
# `false`, then {#detect!} should be called in order to detect the
|
|
135
|
+
# guest OS.
|
|
136
|
+
#
|
|
137
|
+
# @return [Boolean]
|
|
138
|
+
def ready?
|
|
139
|
+
!@chain.empty?
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
protected
|
|
143
|
+
|
|
144
|
+
# Returns the registered module for a capability with the given name.
|
|
145
|
+
#
|
|
146
|
+
# @param [Symbol] cap_name
|
|
147
|
+
# @return [Module]
|
|
148
|
+
def capability_module(cap_name)
|
|
149
|
+
@logger.debug("Searching for cap: #{cap_name}")
|
|
150
|
+
@chain.each do |guest_name, guest|
|
|
151
|
+
@logger.debug("Checking in: #{guest_name}")
|
|
152
|
+
caps = @capabilities[guest_name]
|
|
153
|
+
|
|
154
|
+
if caps && caps.has_key?(cap_name)
|
|
155
|
+
@logger.debug("Found cap: #{cap_name} in #{guest_name}")
|
|
156
|
+
return caps[cap_name]
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
nil
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require 'log4r'
|
|
2
|
+
|
|
3
|
+
module Vagrant
|
|
4
|
+
module Hosts
|
|
5
|
+
# This method detects the correct host based on the `match?` methods
|
|
6
|
+
# implemented in the registered hosts.
|
|
7
|
+
#
|
|
8
|
+
# @param [Hash] registry Hash mapping key to host class
|
|
9
|
+
def self.detect(registry)
|
|
10
|
+
logger = Log4r::Logger.new("vagrant::hosts")
|
|
11
|
+
|
|
12
|
+
# Sort the hosts by their precedence
|
|
13
|
+
host_klasses = registry.values.sort_by { |a| a.precedence }.reverse
|
|
14
|
+
logger.debug("Host path search classes: #{host_klasses.inspect}")
|
|
15
|
+
|
|
16
|
+
# Test for matches and return the host class that matches
|
|
17
|
+
host_klasses.each do |klass|
|
|
18
|
+
if klass.match?
|
|
19
|
+
logger.info("Host class: #{klass}")
|
|
20
|
+
return klass
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# No matches found...
|
|
25
|
+
return nil
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
require "log4r"
|
|
2
|
+
|
|
3
|
+
module Vagrant
|
|
4
|
+
# This represents a machine that Vagrant manages. This provides a singular
|
|
5
|
+
# API for querying the state and making state changes to the machine, which
|
|
6
|
+
# is backed by any sort of provider (VirtualBox, VMWare, etc.).
|
|
7
|
+
class Machine
|
|
8
|
+
# The box that is backing this machine.
|
|
9
|
+
#
|
|
10
|
+
# @return [Box]
|
|
11
|
+
attr_reader :box
|
|
12
|
+
|
|
13
|
+
# Configuration for the machine.
|
|
14
|
+
#
|
|
15
|
+
# @return [Object]
|
|
16
|
+
attr_reader :config
|
|
17
|
+
|
|
18
|
+
# Directory where machine-specific data can be stored.
|
|
19
|
+
#
|
|
20
|
+
# @return [Pathname]
|
|
21
|
+
attr_reader :data_dir
|
|
22
|
+
|
|
23
|
+
# The environment that this machine is a part of.
|
|
24
|
+
#
|
|
25
|
+
# @return [Environment]
|
|
26
|
+
attr_reader :env
|
|
27
|
+
|
|
28
|
+
# ID of the machine. This ID comes from the provider and is not
|
|
29
|
+
# guaranteed to be of any particular format except that it is
|
|
30
|
+
# a string.
|
|
31
|
+
#
|
|
32
|
+
# @return [String]
|
|
33
|
+
attr_reader :id
|
|
34
|
+
|
|
35
|
+
# Name of the machine. This is assigned by the Vagrantfile.
|
|
36
|
+
#
|
|
37
|
+
# @return [String]
|
|
38
|
+
attr_reader :name
|
|
39
|
+
|
|
40
|
+
# The provider backing this machine.
|
|
41
|
+
#
|
|
42
|
+
# @return [Object]
|
|
43
|
+
attr_reader :provider
|
|
44
|
+
|
|
45
|
+
# The provider-specific configuration for this machine.
|
|
46
|
+
#
|
|
47
|
+
# @return [Object]
|
|
48
|
+
attr_reader :provider_config
|
|
49
|
+
|
|
50
|
+
# The name of the provider.
|
|
51
|
+
#
|
|
52
|
+
# @return [Symbol]
|
|
53
|
+
attr_reader :provider_name
|
|
54
|
+
|
|
55
|
+
# The options given to the provider when registering the plugin.
|
|
56
|
+
#
|
|
57
|
+
# @return [Hash]
|
|
58
|
+
attr_reader :provider_options
|
|
59
|
+
|
|
60
|
+
# The UI for outputting in the scope of this machine.
|
|
61
|
+
#
|
|
62
|
+
# @return [UI]
|
|
63
|
+
attr_reader :ui
|
|
64
|
+
|
|
65
|
+
# Initialize a new machine.
|
|
66
|
+
#
|
|
67
|
+
# @param [String] name Name of the virtual machine.
|
|
68
|
+
# @param [Class] provider The provider backing this machine. This is
|
|
69
|
+
# currently expected to be a V1 `provider` plugin.
|
|
70
|
+
# @param [Object] provider_config The provider-specific configuration for
|
|
71
|
+
# this machine.
|
|
72
|
+
# @param [Hash] provider_options The provider-specific options from the
|
|
73
|
+
# plugin definition.
|
|
74
|
+
# @param [Object] config The configuration for this machine.
|
|
75
|
+
# @param [Pathname] data_dir The directory where machine-specific data
|
|
76
|
+
# can be stored. This directory is ensured to exist.
|
|
77
|
+
# @param [Box] box The box that is backing this virtual machine.
|
|
78
|
+
# @param [Environment] env The environment that this machine is a
|
|
79
|
+
# part of.
|
|
80
|
+
def initialize(name, provider_name, provider_cls, provider_config, provider_options, config, data_dir, box, env, base=false)
|
|
81
|
+
@logger = Log4r::Logger.new("vagrant::machine")
|
|
82
|
+
@logger.info("Initializing machine: #{name}")
|
|
83
|
+
@logger.info(" - Provider: #{provider_cls}")
|
|
84
|
+
@logger.info(" - Box: #{box}")
|
|
85
|
+
@logger.info(" - Data dir: #{data_dir}")
|
|
86
|
+
|
|
87
|
+
@box = box
|
|
88
|
+
@config = config
|
|
89
|
+
@data_dir = data_dir
|
|
90
|
+
@env = env
|
|
91
|
+
@guest = Guest.new(
|
|
92
|
+
self,
|
|
93
|
+
Vagrant.plugin("2").manager.guests,
|
|
94
|
+
Vagrant.plugin("2").manager.guest_capabilities)
|
|
95
|
+
@name = name
|
|
96
|
+
@provider_config = provider_config
|
|
97
|
+
@provider_name = provider_name
|
|
98
|
+
@provider_options = provider_options
|
|
99
|
+
@ui = @env.ui.scope(@name)
|
|
100
|
+
|
|
101
|
+
# Read the ID, which is usually in local storage
|
|
102
|
+
@id = nil
|
|
103
|
+
|
|
104
|
+
# XXX: This is temporary. This will be removed very soon.
|
|
105
|
+
if base
|
|
106
|
+
@id = name
|
|
107
|
+
else
|
|
108
|
+
# Read the id file from the data directory if it exists as the
|
|
109
|
+
# ID for the pre-existing physical representation of this machine.
|
|
110
|
+
id_file = @data_dir.join("id")
|
|
111
|
+
@id = id_file.read if id_file.file?
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Initializes the provider last so that it has access to all the
|
|
115
|
+
# state we setup on this machine.
|
|
116
|
+
@provider = provider_cls.new(self)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# This calls an action on the provider. The provider may or may not
|
|
120
|
+
# actually implement the action.
|
|
121
|
+
#
|
|
122
|
+
# @param [Symbol] name Name of the action to run.
|
|
123
|
+
# @param [Hash] extra_env This data will be passed into the action runner
|
|
124
|
+
# as extra data set on the environment hash for the middleware
|
|
125
|
+
# runner.
|
|
126
|
+
def action(name, extra_env=nil)
|
|
127
|
+
@logger.info("Calling action: #{name} on provider #{@provider}")
|
|
128
|
+
|
|
129
|
+
# Get the callable from the provider.
|
|
130
|
+
callable = @provider.action(name)
|
|
131
|
+
|
|
132
|
+
# If this action doesn't exist on the provider, then an exception
|
|
133
|
+
# must be raised.
|
|
134
|
+
if callable.nil?
|
|
135
|
+
raise Errors::UnimplementedProviderAction,
|
|
136
|
+
:action => name,
|
|
137
|
+
:provider => @provider.to_s
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# Run the action with the action runner on the environment
|
|
141
|
+
env = {
|
|
142
|
+
:action_name => "machine_action_#{name}".to_sym,
|
|
143
|
+
:machine => self,
|
|
144
|
+
:machine_action => name,
|
|
145
|
+
:ui => @ui
|
|
146
|
+
}.merge(extra_env || {})
|
|
147
|
+
@env.action_runner.run(callable, env)
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# Returns a communication object for executing commands on the remote
|
|
151
|
+
# machine. Note that the _exact_ semantics of this are up to the
|
|
152
|
+
# communication provider itself. Despite this, the semantics are expected
|
|
153
|
+
# to be consistent across operating systems. For example, all linux-based
|
|
154
|
+
# systems should have similar communication (usually a shell). All
|
|
155
|
+
# Windows systems should have similar communication as well. Therefore,
|
|
156
|
+
# prior to communicating with the machine, users of this method are
|
|
157
|
+
# expected to check the guest OS to determine their behavior.
|
|
158
|
+
#
|
|
159
|
+
# This method will _always_ return some valid communication object.
|
|
160
|
+
# The `ready?` API can be used on the object to check if communication
|
|
161
|
+
# is actually ready.
|
|
162
|
+
#
|
|
163
|
+
# @return [Object]
|
|
164
|
+
def communicate
|
|
165
|
+
if !@communicator
|
|
166
|
+
# For now, we always return SSH. In the future, we'll abstract
|
|
167
|
+
# this and allow plugins to define new methods of communication.
|
|
168
|
+
klass = Vagrant.plugin("2").manager.communicators[:ssh]
|
|
169
|
+
@communicator = klass.new(self)
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
@communicator
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
# Returns a guest implementation for this machine. The guest implementation
|
|
176
|
+
# knows how to do guest-OS specific tasks, such as configuring networks,
|
|
177
|
+
# mounting folders, etc.
|
|
178
|
+
#
|
|
179
|
+
# @return [Guest]
|
|
180
|
+
def guest
|
|
181
|
+
raise Errors::MachineGuestNotReady if !communicate.ready?
|
|
182
|
+
@guest.detect! if !@guest.ready?
|
|
183
|
+
@guest
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
# This sets the unique ID associated with this machine. This will
|
|
187
|
+
# persist this ID so that in the future Vagrant will be able to find
|
|
188
|
+
# this machine again. The unique ID must be absolutely unique to the
|
|
189
|
+
# virtual machine, and can be used by providers for finding the
|
|
190
|
+
# actual machine associated with this instance.
|
|
191
|
+
#
|
|
192
|
+
# **WARNING:** Only providers should ever use this method.
|
|
193
|
+
#
|
|
194
|
+
# @param [String] value The ID.
|
|
195
|
+
def id=(value)
|
|
196
|
+
# The file that will store the id if we have one. This allows the
|
|
197
|
+
# ID to persist across Vagrant runs.
|
|
198
|
+
id_file = @data_dir.join("id")
|
|
199
|
+
|
|
200
|
+
if value
|
|
201
|
+
# Write the "id" file with the id given.
|
|
202
|
+
id_file.open("w+") do |f|
|
|
203
|
+
f.write(value)
|
|
204
|
+
end
|
|
205
|
+
else
|
|
206
|
+
# Delete the file, since the machine is now destroyed
|
|
207
|
+
id_file.delete if id_file.file?
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
# Store the ID locally
|
|
211
|
+
@id = value
|
|
212
|
+
|
|
213
|
+
# Notify the provider that the ID changed in case it needs to do
|
|
214
|
+
# any accounting from it.
|
|
215
|
+
@provider.machine_id_changed
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
# This returns a clean inspect value so that printing the value via
|
|
219
|
+
# a pretty print (`p`) results in a readable value.
|
|
220
|
+
#
|
|
221
|
+
# @return [String]
|
|
222
|
+
def inspect
|
|
223
|
+
"#<#{self.class}: #{@name} (#{@provider.class})>"
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
# This returns the SSH info for accessing this machine. This SSH info
|
|
227
|
+
# is queried from the underlying provider. This method returns `nil` if
|
|
228
|
+
# the machine is not ready for SSH communication.
|
|
229
|
+
#
|
|
230
|
+
# The structure of the resulting hash is guaranteed to contain the
|
|
231
|
+
# following structure, although it may return other keys as well
|
|
232
|
+
# not documented here:
|
|
233
|
+
#
|
|
234
|
+
# {
|
|
235
|
+
# :host => "1.2.3.4",
|
|
236
|
+
# :port => "22",
|
|
237
|
+
# :username => "mitchellh",
|
|
238
|
+
# :private_key_path => "/path/to/my/key"
|
|
239
|
+
# }
|
|
240
|
+
#
|
|
241
|
+
# Note that Vagrant makes no guarantee that this info works or is
|
|
242
|
+
# correct. This is simply the data that the provider gives us or that
|
|
243
|
+
# is configured via a Vagrantfile. It is still possible after this
|
|
244
|
+
# point when attempting to connect via SSH to get authentication
|
|
245
|
+
# errors.
|
|
246
|
+
#
|
|
247
|
+
# @return [Hash] SSH information.
|
|
248
|
+
def ssh_info
|
|
249
|
+
# First, ask the provider for their information. If the provider
|
|
250
|
+
# returns nil, then the machine is simply not ready for SSH, and
|
|
251
|
+
# we return nil as well.
|
|
252
|
+
info = @provider.ssh_info
|
|
253
|
+
return nil if info.nil?
|
|
254
|
+
|
|
255
|
+
# Delete out the nil entries.
|
|
256
|
+
info.dup.each do |key, value|
|
|
257
|
+
info.delete(key) if value.nil?
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
# We set the defaults
|
|
261
|
+
info[:host] ||= @config.ssh.default.host
|
|
262
|
+
info[:port] ||= @config.ssh.default.port
|
|
263
|
+
info[:private_key_path] ||= @config.ssh.default.private_key_path
|
|
264
|
+
info[:username] ||= @config.ssh.default.username
|
|
265
|
+
|
|
266
|
+
# We set overrides if they are set. These take precedence over
|
|
267
|
+
# provider-returned data.
|
|
268
|
+
info[:host] = @config.ssh.host if @config.ssh.host
|
|
269
|
+
info[:port] = @config.ssh.port if @config.ssh.port
|
|
270
|
+
info[:username] = @config.ssh.username if @config.ssh.username
|
|
271
|
+
|
|
272
|
+
# We also set some fields that are purely controlled by Varant
|
|
273
|
+
info[:forward_agent] = @config.ssh.forward_agent
|
|
274
|
+
info[:forward_x11] = @config.ssh.forward_x11
|
|
275
|
+
|
|
276
|
+
# Set the private key path. If a specific private key is given in
|
|
277
|
+
# the Vagrantfile we set that. Otherwise, we use the default (insecure)
|
|
278
|
+
# private key, but only if the provider didn't give us one.
|
|
279
|
+
if !info[:private_key_path]
|
|
280
|
+
if @config.ssh.private_key_path
|
|
281
|
+
info[:private_key_path] = @config.ssh.private_key_path
|
|
282
|
+
else
|
|
283
|
+
info[:private_key_path] = @env.default_private_key_path
|
|
284
|
+
end
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
# Expand the private key path relative to the root path
|
|
288
|
+
info[:private_key_path] = File.expand_path(info[:private_key_path], @env.root_path)
|
|
289
|
+
|
|
290
|
+
# Return the final compiled SSH info data
|
|
291
|
+
info
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
# Returns the state of this machine. The state is queried from the
|
|
295
|
+
# backing provider, so it can be any arbitrary symbol.
|
|
296
|
+
#
|
|
297
|
+
# @return [Symbol]
|
|
298
|
+
def state
|
|
299
|
+
result = @provider.state
|
|
300
|
+
raise Errors::MachineStateInvalid if !result.is_a?(MachineState)
|
|
301
|
+
result
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
protected
|
|
305
|
+
|
|
306
|
+
# Given a guest name (such as `:windows`), this will load the associated
|
|
307
|
+
# guest implementation and return an instance.
|
|
308
|
+
#
|
|
309
|
+
# @param [Symbol] guest The name of the guest implementation.
|
|
310
|
+
# @return [Object]
|
|
311
|
+
def load_guest(guest)
|
|
312
|
+
@logger.info("Loading guest: #{guest}")
|
|
313
|
+
|
|
314
|
+
klass = Vagrant.plugin("2").manager.guests[guest]
|
|
315
|
+
|
|
316
|
+
if klass.nil?
|
|
317
|
+
raise Errors::VMGuestError,
|
|
318
|
+
:_key => :unknown_type,
|
|
319
|
+
:guest => guest.to_s
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
return klass.new(self)
|
|
323
|
+
end
|
|
324
|
+
end
|
|
325
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
# This represents the state of a given machine. This is a very basic
|
|
3
|
+
# class that simply stores a short and long description of the state
|
|
4
|
+
# of a machine.
|
|
5
|
+
#
|
|
6
|
+
# The state also stores a state "id" which ca be used as a unique
|
|
7
|
+
# identifier for a state. This should be a symbol. This allows internal
|
|
8
|
+
# code to compare state such as ":not_created" instead of using
|
|
9
|
+
# string comparison.
|
|
10
|
+
#
|
|
11
|
+
# The short description should be a single word description of the
|
|
12
|
+
# state of the machine such as "running" or "not created".
|
|
13
|
+
#
|
|
14
|
+
# The long description can span multiple lines describing what the
|
|
15
|
+
# state actually means.
|
|
16
|
+
class MachineState
|
|
17
|
+
# Unique ID for this state.
|
|
18
|
+
#
|
|
19
|
+
# @return [Symbol]
|
|
20
|
+
attr_reader :id
|
|
21
|
+
|
|
22
|
+
# Short description for this state.
|
|
23
|
+
#
|
|
24
|
+
# @return [String]
|
|
25
|
+
attr_reader :short_description
|
|
26
|
+
|
|
27
|
+
# Long description for this state.
|
|
28
|
+
#
|
|
29
|
+
# @return [String]
|
|
30
|
+
attr_reader :long_description
|
|
31
|
+
|
|
32
|
+
# Creates a new instance to represent the state of a machine.
|
|
33
|
+
#
|
|
34
|
+
# @param [Symbol] id Unique identifier for this state.
|
|
35
|
+
# @param [String] short Short (preferably one-word) description of
|
|
36
|
+
# the state.
|
|
37
|
+
# @param [String] long Long description (can span multiple lines)
|
|
38
|
+
# of the state.
|
|
39
|
+
def initialize(id, short, long)
|
|
40
|
+
@id = id
|
|
41
|
+
@short_description = short
|
|
42
|
+
@long_description = long
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|