class Vagrant::MachineIndex::Entry

An entry in the MachineIndex.

Attributes

extra_data[RW]

Extra data to store with the index entry. This can be anything and is treated like a general global state bag.

@return [Hash]

full_state[RW]

The last known state of this machine.

@return [MachineState]

id[R]

The unique ID for this entry. This is not the ID for the machine itself (which is provider-specific and in the data directory).

@return [String]

local_data_path[RW]

The path for the “local data” directory for the environment.

@return [Pathname]

name[RW]

The name of the machine.

@return [String]

provider[RW]

The name of the provider.

@return [String]

state[RW]

The last known state of this machine.

@return [String]

updated_at[R]

The last time this entry was updated.

@return [DateTime]

vagrantfile_name[RW]

The valid Vagrantfile filenames for this environment.

@return [Array<String>]

vagrantfile_path[RW]

The path to the Vagrantfile that manages this machine.

@return [Pathname]

Public Class Methods

new(id=nil, raw=nil) click to toggle source

Initializes an entry.

The parameter given should be nil if this is being created publicly.

# File lib/vagrant/machine_index.rb, line 416
def initialize(id=nil, raw=nil)
  @logger = Log4r::Logger.new("vagrant::machine_index::entry")

  @extra_data = {}
  @id = id
  # Do nothing if we aren't given a raw value. Otherwise, parse it.
  return if !raw

  @local_data_path  = raw["local_data_path"]
  @name             = raw["name"]
  @provider         = raw["provider"]
  @state            = raw["state"]
  @full_state       = raw["full_state"]
  @vagrantfile_name = raw["vagrantfile_name"]
  @vagrantfile_path = raw["vagrantfile_path"]
  # TODO(mitchellh): parse into a proper datetime
  @updated_at       = raw["updated_at"]
  @extra_data       = raw["extra_data"] || {}

  # Be careful with the paths
  @local_data_path = nil  if @local_data_path == ""
  @vagrantfile_path = nil if @vagrantfile_path == ""

  # Convert to proper types
  @local_data_path = Pathname.new(@local_data_path) if @local_data_path
  @vagrantfile_path = Pathname.new(@vagrantfile_path) if @vagrantfile_path
end

Public Instance Methods

to_json_struct() click to toggle source

Converts to the structure used by the JSON

# File lib/vagrant/machine_index.rb, line 505
def to_json_struct
  {
    "local_data_path"  => @local_data_path.to_s,
    "name"             => @name,
    "provider"         => @provider,
    "state"            => @state,
    "vagrantfile_name" => @vagrantfile_name,
    "vagrantfile_path" => @vagrantfile_path.to_s,
    "updated_at"       => @updated_at,
    "extra_data"       => @extra_data,
  }
end
vagrant_env(home_path, opts={}) click to toggle source

Creates a {Vagrant::Environment} for this entry.

@return [Vagrant::Environment]

# File lib/vagrant/machine_index.rb, line 493
def vagrant_env(home_path, opts={})
  Vagrant::Util::SilenceWarnings.silence! do
    Environment.new({
      cwd: @vagrantfile_path,
      home_path: home_path,
      local_data_path: @local_data_path,
      vagrantfile_name: @vagrantfile_name,
    }.merge(opts))
  end
end
valid?(home_path) click to toggle source

Returns boolean true if this entry appears to be valid. The criteria for being valid:

* Vagrantfile directory exists
* Vagrant environment contains a machine with this
  name and provider.

This method is slow. It should be used with care.

@param [Pathname] home_path The home path for the Vagrant

environment.

@return [Boolean]

# File lib/vagrant/machine_index.rb, line 456
def valid?(home_path)
  return false if !vagrantfile_path
  return false if !vagrantfile_path.directory?

  # Create an environment so we can determine the active
  # machines...
  found = false
  env = vagrant_env(home_path)
  env.active_machines.each do |name, provider|
    if name.to_s == self.name.to_s &&
      provider.to_s == self.provider.to_s
      found = true
      break
    end
  end

  # If an active machine of the same name/provider was not
  # found, it is already false.
  return false if !found

  # Get the machine
  machine = nil
  begin
    machine = env.machine(self.name.to_sym, self.provider.to_sym)
  rescue Errors::MachineNotFound
    return false
  end

  # Refresh the machine state
  return false if machine.state.id == MachineState::NOT_CREATED_ID

  true
end