Class: Vagrant::MachineIndex::Entry

Inherits:
Object
  • Object
show all
Defined in:
lib/vagrant/machine_index.rb

Overview

An entry in the MachineIndex.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(id = nil, raw = nil) ⇒ Entry

Initializes an entry.

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


407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
# File 'lib/vagrant/machine_index.rb', line 407

def initialize(id=nil, raw=nil)
  @extra_data = {}

  # Do nothing if we aren't given a raw value. Otherwise, parse it.
  return if !raw

  @id               = id
  @local_data_path  = raw["local_data_path"]
  @name             = raw["name"]
  @provider         = raw["provider"]
  @state            = raw["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

Instance Attribute Details

#extra_dataHash

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

Returns:

  • (Hash)

401
402
403
# File 'lib/vagrant/machine_index.rb', line 401

def extra_data
  @extra_data
end

#idString (readonly)

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

Returns:

  • (String)

360
361
362
# File 'lib/vagrant/machine_index.rb', line 360

def id
  @id
end

#local_data_pathPathname

The path for the "local data" directory for the environment.

Returns:

  • (Pathname)

365
366
367
# File 'lib/vagrant/machine_index.rb', line 365

def local_data_path
  @local_data_path
end

#nameString

The name of the machine.

Returns:

  • (String)

370
371
372
# File 'lib/vagrant/machine_index.rb', line 370

def name
  @name
end

#providerString

The name of the provider.

Returns:

  • (String)

375
376
377
# File 'lib/vagrant/machine_index.rb', line 375

def provider
  @provider
end

#stateString

The last known state of this machine.

Returns:

  • (String)

380
381
382
# File 'lib/vagrant/machine_index.rb', line 380

def state
  @state
end

#updated_atDateTime (readonly)

The last time this entry was updated.

Returns:

  • (DateTime)

395
396
397
# File 'lib/vagrant/machine_index.rb', line 395

def updated_at
  @updated_at
end

#vagrantfile_nameArray<String>

The valid Vagrantfile filenames for this environment.

Returns:

  • (Array<String>)

385
386
387
# File 'lib/vagrant/machine_index.rb', line 385

def vagrantfile_name
  @vagrantfile_name
end

#vagrantfile_pathPathname

The path to the Vagrantfile that manages this machine.

Returns:

  • (Pathname)

390
391
392
# File 'lib/vagrant/machine_index.rb', line 390

def vagrantfile_path
  @vagrantfile_path
end

Instance Method Details

#to_json_structObject

Converts to the structure used by the JSON


494
495
496
497
498
499
500
501
502
503
504
505
# File 'lib/vagrant/machine_index.rb', line 494

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 = {}) ⇒ Vagrant::Environment

Creates a Environment for this entry.


482
483
484
485
486
487
488
489
490
491
# File 'lib/vagrant/machine_index.rb', line 482

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) ⇒ Boolean

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.

Parameters:

  • home_path (Pathname)

    The home path for the Vagrant environment.

Returns:

  • (Boolean)

445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
# File 'lib/vagrant/machine_index.rb', line 445

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