`vagrant status` updated to work with multi-VM. Global status not yet functional.
This commit is contained in:
parent
0314e6ef6c
commit
709c50e7b6
|
@ -126,7 +126,6 @@ module Vagrant
|
|||
# to parse command line options.
|
||||
def parse_options(args)
|
||||
option_parser.parse!(args)
|
||||
options
|
||||
rescue OptionParser::InvalidOption
|
||||
show_help
|
||||
end
|
||||
|
|
|
@ -8,43 +8,84 @@ module Vagrant
|
|||
description "Shows the status of the Vagrant environment."
|
||||
|
||||
def execute(args=[])
|
||||
parse_options(args)
|
||||
args = parse_options(args)
|
||||
if args.length > 1
|
||||
# There should never be more than 1 arg
|
||||
show_help
|
||||
return
|
||||
end
|
||||
|
||||
if !options[:global]
|
||||
show_local_status
|
||||
show_local_status(*args)
|
||||
else
|
||||
show_global_status
|
||||
end
|
||||
end
|
||||
|
||||
# Shows the status of the CURRENT environment (the current working
|
||||
# directory). This prints out a human friendly sentence or paragraph
|
||||
# describing the state of the Vagrant environment represented by the
|
||||
# current working directory.
|
||||
def show_local_status
|
||||
# directory). If a specific VM was given, it will print out
|
||||
# detailed information regarding that VM. If no single VM was
|
||||
# specified and it is a multi-VM environment, it will simply
|
||||
# show a listing of all the VMs and their short one word
|
||||
# statuses.
|
||||
def show_local_status(vm=nil)
|
||||
if !env.root_path
|
||||
wrap_output { puts Translator.t(:status_no_environment) }
|
||||
return
|
||||
end
|
||||
|
||||
if vm.nil?
|
||||
if env.multivm?
|
||||
# No specific VM was specified in a multi-vm environment,
|
||||
# so show short info for each VM
|
||||
show_list
|
||||
else
|
||||
# Set the VM to just be the root VM
|
||||
vm = env.vms.values.first
|
||||
end
|
||||
else
|
||||
# Try to get the vm based on the name. If the specified VM
|
||||
# doesn't exist, then error saying so
|
||||
vm = env.vms[vm.to_sym]
|
||||
end
|
||||
|
||||
show_single(vm)
|
||||
end
|
||||
|
||||
# Lists the available VMs and brief statuses about each.
|
||||
def show_list
|
||||
wrap_output do
|
||||
puts Translator.t(:status_listing)
|
||||
|
||||
env.vms.each do |name, vm|
|
||||
puts "#{name.ljust(20)}#{vm.state}"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Shows a paragraph of information based on the current state of
|
||||
# a single, specified VM.
|
||||
def show_single(vm)
|
||||
string_key = nil
|
||||
|
||||
if !env.root_path
|
||||
string_key = :status_no_environment
|
||||
elsif !env.vm
|
||||
if !vm.created?
|
||||
string_key = :status_not_created
|
||||
else
|
||||
additional_key = nil
|
||||
if env.vm.vm.running?
|
||||
if vm.vm.running?
|
||||
additional_key = :status_created_running
|
||||
elsif env.vm.vm.saved?
|
||||
elsif vm.vm.saved?
|
||||
additional_key = :status_created_saved
|
||||
elsif env.vm.vm.powered_off?
|
||||
elsif vm.vm.powered_off?
|
||||
additional_key = :status_created_powered_off
|
||||
end
|
||||
|
||||
string_key = [:status_created, {
|
||||
:vm_state => env.vm.vm.state,
|
||||
:vm_state => vm.vm.state,
|
||||
:additional_message => additional_key ? Translator.t(additional_key) : ""
|
||||
}]
|
||||
end
|
||||
|
||||
string_key = [string_key, {}] unless string_key.is_a?(Array)
|
||||
wrap_output { puts Translator.t(*string_key) }
|
||||
end
|
||||
|
||||
|
@ -70,6 +111,7 @@ module Vagrant
|
|||
|
||||
# Defaults
|
||||
options[:global] = false
|
||||
options[:vm] = nil
|
||||
|
||||
opts.on("-g", "--global", "Show global status of Vagrant (running VMs managed by Vagrant)") do |v|
|
||||
options[:global] = true
|
||||
|
|
|
@ -100,6 +100,17 @@ module Vagrant
|
|||
@vms ||= {}
|
||||
end
|
||||
|
||||
# Returns a boolean whether this environment represents a multi-VM
|
||||
# environment or not. This will work even when called on child
|
||||
# environments.
|
||||
def multivm?
|
||||
if parent
|
||||
parent.multivm?
|
||||
else
|
||||
vms.length > 1
|
||||
end
|
||||
end
|
||||
|
||||
#---------------------------------------------------------------
|
||||
# Load Methods
|
||||
#---------------------------------------------------------------
|
||||
|
|
|
@ -4,6 +4,7 @@ module Vagrant
|
|||
|
||||
attr_reader :env
|
||||
attr_reader :system
|
||||
attr_reader :name
|
||||
attr_accessor :vm
|
||||
|
||||
class << self
|
||||
|
@ -25,6 +26,7 @@ module Vagrant
|
|||
opts = defaults.merge(opts || {})
|
||||
|
||||
@vm = opts[:vm]
|
||||
@name = opts[:vm_name]
|
||||
|
||||
if !opts[:env].nil?
|
||||
# We have an environment, so we create a new child environment
|
||||
|
|
|
@ -6,6 +6,10 @@
|
|||
#---------------------------------------------------------------------
|
||||
# CATEGORY: Status Messages
|
||||
#---------------------------------------------------------------------
|
||||
:status_listing: |-
|
||||
This environment represents multiple VMs. The VMs will be listed
|
||||
below with a short status. For more detailed information about a
|
||||
VM, run `vagrant status NAME`.
|
||||
:status_no_environment: |-
|
||||
No vagrant environment detected. Run `vagrant init` to setup a Vagrantfile
|
||||
in the current directory to get started with Vagrant.
|
||||
|
|
|
@ -112,8 +112,9 @@ class CommandsBaseTest < Test::Unit::TestCase
|
|||
end
|
||||
|
||||
should "parse the options with the args" do
|
||||
@option_parser.expects(:parse!).with(@args).once
|
||||
assert_equal @options, @instance.parse_options(@args)
|
||||
result = mock("result")
|
||||
@option_parser.expects(:parse!).with(@args).once.returns(result)
|
||||
assert_equal result, @instance.parse_options(@args)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -26,5 +26,15 @@ class CommandsStatusTest < Test::Unit::TestCase
|
|||
@instance.expects(:show_global_status).once
|
||||
@instance.execute(["--global"])
|
||||
end
|
||||
|
||||
should "show help if too many args are given" do
|
||||
@instance.expects(:show_help).once
|
||||
@instance.execute(["1","2","3"])
|
||||
end
|
||||
|
||||
should "pass the VM name to local status if given" do
|
||||
@instance.expects(:show_local_status).with("foo").once
|
||||
@instance.execute(["foo"])
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -124,6 +124,41 @@ class EnvironmentTest < Test::Unit::TestCase
|
|||
end
|
||||
end
|
||||
|
||||
context "multivm? helper" do
|
||||
setup do
|
||||
@env = mock_environment
|
||||
end
|
||||
|
||||
context "with a parent" do
|
||||
setup do
|
||||
@parent = mock('parent')
|
||||
@env.stubs(:parent).returns(@parent)
|
||||
end
|
||||
|
||||
should "return the value of multivm? from the parent" do
|
||||
result = mock("result")
|
||||
@parent.stubs(:multivm?).returns(result)
|
||||
assert_equal result, @env.multivm?
|
||||
end
|
||||
end
|
||||
|
||||
context "without a parent" do
|
||||
setup do
|
||||
@env.stubs(:parent).returns(nil)
|
||||
end
|
||||
|
||||
should "return true if VM length greater than 1" do
|
||||
@env.stubs(:vms).returns([1,2,3])
|
||||
assert @env.multivm?
|
||||
end
|
||||
|
||||
should "return false if VM length is 1" do
|
||||
@env.stubs(:vms).returns([1])
|
||||
assert !@env.multivm?
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context "loading" do
|
||||
setup do
|
||||
@env = mock_environment
|
||||
|
|
|
@ -9,7 +9,7 @@ Gem::Specification.new do |s|
|
|||
|
||||
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
|
||||
s.authors = ["Mitchell Hashimoto", "John Bender"]
|
||||
s.date = %q{2010-05-15}
|
||||
s.date = %q{2010-05-16}
|
||||
s.default_executable = %q{vagrant}
|
||||
s.description = %q{Vagrant is a tool for building and distributing virtualized development environments.}
|
||||
s.email = ["mitchell.hashimoto@gmail.com", "john.m.bender@gmail.com"]
|
||||
|
|
Loading…
Reference in New Issue