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.



380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
# File 'lib/vagrant/machine_index.rb', line 380

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)


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

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)


333
334
335
# File 'lib/vagrant/machine_index.rb', line 333

def id
  @id
end

#local_data_pathPathname

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

Returns:

  • (Pathname)


338
339
340
# File 'lib/vagrant/machine_index.rb', line 338

def local_data_path
  @local_data_path
end

#nameString

The name of the machine.

Returns:

  • (String)


343
344
345
# File 'lib/vagrant/machine_index.rb', line 343

def name
  @name
end

#providerString

The name of the provider.

Returns:

  • (String)


348
349
350
# File 'lib/vagrant/machine_index.rb', line 348

def provider
  @provider
end

#stateString

The last known state of this machine.

Returns:

  • (String)


353
354
355
# File 'lib/vagrant/machine_index.rb', line 353

def state
  @state
end

#updated_atDateTime (readonly)

The last time this entry was updated.

Returns:

  • (DateTime)


368
369
370
# File 'lib/vagrant/machine_index.rb', line 368

def updated_at
  @updated_at
end

#vagrantfile_nameArray<String>

The valid Vagrantfile filenames for this environment.

Returns:

  • (Array<String>)


358
359
360
# File 'lib/vagrant/machine_index.rb', line 358

def vagrantfile_name
  @vagrantfile_name
end

#vagrantfile_pathPathname

The path to the Vagrantfile that manages this machine.

Returns:

  • (Pathname)


363
364
365
# File 'lib/vagrant/machine_index.rb', line 363

def vagrantfile_path
  @vagrantfile_path
end

Instance Method Details

#to_json_structObject

Converts to the structure used by the JSON



467
468
469
470
471
472
473
474
475
476
477
478
# File 'lib/vagrant/machine_index.rb', line 467

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.



455
456
457
458
459
460
461
462
463
464
# File 'lib/vagrant/machine_index.rb', line 455

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)


418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
# File 'lib/vagrant/machine_index.rb', line 418

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