Move all commands to the Vagrant::Command class. Document all commands.

This commit is contained in:
Mitchell Hashimoto 2010-02-10 13:46:22 -08:00
parent aa2d3d58db
commit 6c9c09c1b1
11 changed files with 235 additions and 114 deletions

View File

@ -23,6 +23,6 @@ Destroys the vagrant environment.
EOS EOS
run do |command| run do |command|
Vagrant::VM.down Vagrant::Commands.down
end end
end end

28
bin/vagrant-init Executable file
View File

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
begin
require File.expand_path('../../.bundle/environment', __FILE__)
rescue LoadError
# Fallback on rubygems
require "rubygems"
end
require 'git-style-binary/command'
# Get library
libdir = File.join(File.dirname(__FILE__), '..', 'lib')
$:.unshift(libdir) unless $:.include?(libdir)
require 'vagrant'
GitStyleBinary.command do
short_desc "initializes directory for vagrant use"
banner <<-EOS
Usage: #{command.full_name} #{all_options_string}
Creates the initial files required for using vagrant.
EOS
run do |command|
Vagrant::Commands.init
end
end

View File

@ -23,6 +23,6 @@ Resumes the vagrant environment.
EOS EOS
run do |command| run do |command|
Vagrant::VM.resume Vagrant::Commands.resume
end end
end end

View File

@ -23,6 +23,6 @@ Opens an SSH connection into the created VM.
EOS EOS
run do |command| run do |command|
Vagrant::VM.ssh Vagrant::Commands.ssh
end end
end end

View File

@ -23,6 +23,6 @@ Suspends the vagrant environment.
EOS EOS
run do |command| run do |command|
Vagrant::VM.suspend Vagrant::Commands.suspend
end end
end end

View File

@ -23,6 +23,6 @@ Create the vagrant environment.
EOS EOS
run do |command| run do |command|
Vagrant::VM.up Vagrant::Commands.up
end end
end end

View File

@ -11,6 +11,7 @@ require 'net/ssh'
require 'net/scp' require 'net/scp'
require 'vagrant/busy' require 'vagrant/busy'
require 'vagrant/util' require 'vagrant/util'
require 'vagrant/commands'
require 'vagrant/config' require 'vagrant/config'
require 'vagrant/env' require 'vagrant/env'
require 'vagrant/provisioning' require 'vagrant/provisioning'
@ -20,4 +21,3 @@ require 'vagrant/vm'
# TODO: Make this configurable # TODO: Make this configurable
log_output = ENV['VAGRANT_ENV'] == 'test' ? nil : STDOUT log_output = ENV['VAGRANT_ENV'] == 'test' ? nil : STDOUT
VAGRANT_LOGGER = Vagrant::Logger.new(log_output) VAGRANT_LOGGER = Vagrant::Logger.new(log_output)
Vagrant::Env.load! unless ENV['VAGRANT_ENV'] == 'test'

80
lib/vagrant/commands.rb Normal file
View File

@ -0,0 +1,80 @@
module Vagrant
# Contains all the command-line commands invoked by the
# binaries. Having them all in one location assists with
# documentation and also takes the commands out of some of
# the other classes.
class Commands
extend Vagrant::Util
class <<self
# TODO: Coming soon to a theatre near you.
def init
end
# Bring up a vagrant instance. This handles everything from importing
# the base VM, setting up shared folders, forwarded ports, etc to
# provisioning the instance with chef. {up} also starts the instance,
# running it in the background.
def up
Env.load!
VM.up
end
# Tear down a vagrant instance. This not only shuts down the instance
# (if its running), but also deletes it from the system, including the
# hard disks associated with it.
#
# This command requires that an instance already be brought up with
# `vagrant up`.
def down
Env.load!
Env.require_persisted_vm
Env.persisted_vm.destroy
end
# SSH into the vagrant instance. This will setup an SSH connection into
# the vagrant instance, replacing the running ruby process with the SSH
# connection.
#
# This command requires that an instance already be brought up with
# `vagrant up`.
def ssh
Env.load!
Env.require_persisted_vm
SSH.connect
end
# Suspend a running vagrant instance. This suspends the instance, saving
# the state of the VM and "pausing" it. The instance can be resumed
# again with {resume}.
#
# This command requires that an instance already be brought up with
# `vagrant up`.
def suspend
Env.load!
Env.require_persisted_vm
error_and_exit(<<-error) if Env.persisted_vm.saved?
The vagrant virtual environment you are trying to suspend is already in a
suspended state.
error
Env.persisted_vm.save_state(true)
end
# Resume a running vagrant instance. This resumes an already suspended
# instance (from {suspend}).
#
# This command requires that an instance already be brought up with
# `vagrant up`.
def resume
Env.load!
Env.require_persisted_vm
error_and_exit(<<-error) unless Env.persisted_vm.saved?
The vagrant virtual environment you are trying to resume is not in a
suspended state.
error
Env.persisted_vm.start
end
end
end
end

View File

@ -13,39 +13,6 @@ module Vagrant
new.create new.create
end end
# Tear down a virtual machine.
def down
Env.require_persisted_vm
Env.persisted_vm.destroy
end
# SSHs into the VM and replaces the ruby process with the SSH process
def ssh
Env.require_persisted_vm
SSH.connect
end
# Save the state of the current vagrant environment to disk
def suspend
Env.require_persisted_vm
error_and_exit(<<-error) if Env.persisted_vm.saved?
The vagrant virtual environment you are trying to suspend is already in a
suspended state.
error
logger.info "Saving VM state..."
Env.persisted_vm.save_state(true)
end
# Resume the current vagrant environment from disk
def resume
Env.require_persisted_vm
error_and_exit(<<-error) unless Env.persisted_vm.saved?
The vagrant virtual environment you are trying to resume is not in a
suspended state.
error
Env.persisted_vm.start
end
# Finds a virtual machine by a given UUID and either returns # Finds a virtual machine by a given UUID and either returns
# a Vagrant::VM object or returns nil. # a Vagrant::VM object or returns nil.
def find(uuid) def find(uuid)
@ -202,8 +169,9 @@ error
@vm.saved? @vm.saved?
end end
def save_state(errs) def save_state
@vm.save_state(errs) logger.info "Saving VM state..."
@vm.save_state(true)
end end
# TODO need a better way to which controller is the hd # TODO need a better way to which controller is the hd

View File

@ -0,0 +1,106 @@
require File.join(File.dirname(__FILE__), '..', 'test_helper')
class CommandsTest < Test::Unit::TestCase
setup do
Vagrant::Env.stubs(:load!)
@persisted_vm = mock("persisted_vm")
Vagrant::Env.stubs(:persisted_vm).returns(@persisted_vm)
end
context "up" do
setup do
Vagrant::VM.stubs(:up)
end
should "require load the environment" do
Vagrant::Env.expects(:load!).once
Vagrant::Commands.up
end
should "call up on VM" do
Vagrant::VM.expects(:up).once
Vagrant::Commands.up
end
end
context "down" do
setup do
@persisted_vm.stubs(:destroy)
end
should "require a persisted VM" do
Vagrant::Env.expects(:require_persisted_vm).once
Vagrant::Commands.down
end
should "destroy the persisted VM and the VM image" do
@persisted_vm.expects(:destroy).once
Vagrant::Commands.down
end
end
context "ssh" do
setup do
Vagrant::SSH.stubs(:connect)
end
should "require a persisted VM" do
Vagrant::Env.expects(:require_persisted_vm).once
Vagrant::Commands.ssh
end
should "connect to SSH" do
Vagrant::SSH.expects(:connect).once
Vagrant::Commands.ssh
end
end
context "suspend" do
setup do
@persisted_vm.stubs(:save_state)
@persisted_vm.stubs(:saved?).returns(false)
end
should "require a persisted VM" do
Vagrant::Env.expects(:require_persisted_vm).once
Vagrant::Commands.suspend
end
should "error and exit if the VM is already saved" do
@persisted_vm.expects(:saved?).returns(true)
Vagrant::Commands.expects(:error_and_exit).once
@persisted_vm.expects(:save_state).never
Vagrant::Commands.suspend
end
should "save the state of the VM" do
@persisted_vm.expects(:save_state).once
Vagrant::Commands.suspend
end
end
context "resume" do
setup do
@persisted_vm.stubs(:start)
@persisted_vm.stubs(:saved?).returns(true)
end
should "require a persisted VM" do
Vagrant::Env.expects(:require_persisted_vm).once
Vagrant::Commands.resume
end
should "error and exit if the VM is not already saved" do
@persisted_vm.expects(:saved?).returns(false)
Vagrant::Commands.expects(:error_and_exit).once
@persisted_vm.expects(:save_state).never
Vagrant::Commands.resume
end
should "save the state of the VM" do
@persisted_vm.expects(:start).once
Vagrant::Commands.resume
end
end
end

View File

@ -11,38 +11,6 @@ class VMTest < Test::Unit::TestCase
Net::SSH.stubs(:start) Net::SSH.stubs(:start)
end end
context "vagrant ssh" do
setup do
Vagrant::SSH.stubs(:connect)
end
should "require a persisted VM" do
Vagrant::Env.expects(:require_persisted_vm).once
Vagrant::VM.ssh
end
should "connect to SSH" do
Vagrant::SSH.expects(:connect).once
Vagrant::VM.ssh
end
end
context "vagrant down" do
setup do
@persisted_vm.stubs(:destroy)
end
should "require a persisted VM" do
Vagrant::Env.expects(:require_persisted_vm).once
Vagrant::VM.down
end
should "destroy the persisted VM and the VM image" do
@persisted_vm.expects(:destroy).once
Vagrant::VM.down
end
end
context "vagrant up" do context "vagrant up" do
should "create a Vagrant::VM instance and call create" do should "create a Vagrant::VM instance and call create" do
inst = mock("instance") inst = mock("instance")
@ -174,47 +142,6 @@ class VMTest < Test::Unit::TestCase
end end
end end
context "suspending and resuming a vm" do
should "put the vm in a suspended state" do
saved_state_expectation(false)
save_expectation
Vagrant::VM.suspend
end
should "results in an error and exit if the vm is already in a saved state" do
saved_state_expectation(true)
save_expectation
Vagrant::VM.expects(:error_and_exit)
Vagrant::VM.suspend
end
should "start a vm in a suspended state" do
saved_state_expectation(true)
start_expectation
Vagrant::VM.resume
end
should "results in an error and exit if the vm is not in a saved state" do
saved_state_expectation(false)
start_expectation
# TODO research the matter of mocking exit
Vagrant::VM.expects(:error_and_exit)
Vagrant::VM.resume
end
def saved_state_expectation(saved)
@persisted_vm.expects(:saved?).returns(saved)
end
def save_expectation
@persisted_vm.expects(:save_state).with(true)
end
def start_expectation
Vagrant::Env.persisted_vm.expects(:start).once.returns(true)
end
end
context "shared folders" do context "shared folders" do
setup do setup do
@mock_vm = mock("mock_vm") @mock_vm = mock("mock_vm")
@ -268,6 +195,18 @@ class VMTest < Test::Unit::TestCase
end end
end end
context "saving the state" do
should "check if a VM is saved" do
@mock_vm.expects(:saved?).returns("foo")
assert_equal "foo", @vm.saved?
end
should "save state with errors raised" do
@mock_vm.expects(:save_state).with(true).once
@vm.save_state
end
end
context "creating a new vm with a specified disk storage location" do context "creating a new vm with a specified disk storage location" do
should "error and exit of the vm is not powered off" do should "error and exit of the vm is not powered off" do
# Exit does not prevent method from proceeding in test, so we must set expectations # Exit does not prevent method from proceeding in test, so we must set expectations