Class: VagrantPlugins::OVirtProvider::Action::WaitTillUp

Inherits:
Object
  • Object
show all
Includes:
Vagrant::Util::Retryable
Defined in:
lib/vagrant-ovirt4/action/wait_till_up.rb

Overview

Wait till VM is started, till it obtains an IP address and is accessible via ssh.

Instance Method Summary collapse

Constructor Details

#initialize(app, env) ⇒ WaitTillUp

Returns a new instance of WaitTillUp.



14
15
16
17
# File 'lib/vagrant-ovirt4/action/wait_till_up.rb', line 14

def initialize(app, env)
  @logger = Log4r::Logger.new("vagrant_ovirt4::action::wait_till_up")
  @app = app
end

Instance Method Details

#call(env) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/vagrant-ovirt4/action/wait_till_up.rb', line 19

def call(env)
  # Initialize metrics if they haven't been
  env[:metrics] ||= {}

  # Get config.
  config = env[:machine].provider_config

  # Wait for VM to obtain an ip address.
  env[:metrics]["instance_ip_time"] = Util::Timer.time do
    env[:ui].info(I18n.t("vagrant_ovirt4.waiting_for_ip"))
    for i in 1..300
      # If we're interrupted don't worry about waiting
      next if env[:interrupted]

      # Get VM.
      server = env[:vms_service].vm_service(env[:machine].id)
      if server == nil
        raise Errors::NoVMError, :vm_name => ''
      end

      nics_service = server.nics_service
      nics = nics_service.list
      ip_addr = nics.collect { |nic_attachment| env[:connection].follow_link(nic_attachment).reported_devices.collect { |dev| dev.ips.collect { |ip| ip.address if ip.version == 'v4' } } }.flatten.reject { |ip| ip.nil? }.first rescue nil
      unless ip_addr.nil?
        env[:ip_address] = ip_addr
        break
        @logger.debug("Got output #{env[:ip_address]}")
      end
      sleep 5
    end
  end
  terminate(env) if env[:interrupted]
  if env[:ip_address].nil?
    raise Errors::NoIPError
  else
    @logger.info("Got IP address #{env[:ip_address]}")
    @logger.info("Time for getting IP: #{env[:metrics]["instance_ip_time"]}")
    
    @logger.info("Time for SSH ready: #{env[:metrics]["instance_ssh_time"]}")

    # Booted and ready for use.
    env[:ui].info(I18n.t("vagrant_ovirt4.ready"))
    
    @app.call(env)
  end
end

#recover(env) ⇒ Object



66
67
68
69
70
71
72
73
# File 'lib/vagrant-ovirt4/action/wait_till_up.rb', line 66

def recover(env)
  return if env["vagrant.error"].is_a?(Vagrant::Errors::VagrantError)

  if env[:machine].provider.state.id != :not_created
    # Undo the import
    terminate(env)
  end
end

#terminate(env) ⇒ Object



75
76
77
78
79
80
81
# File 'lib/vagrant-ovirt4/action/wait_till_up.rb', line 75

def terminate(env)
  destroy_env = env.dup
  destroy_env.delete(:interrupted)
  destroy_env[:config_validate] = false
  destroy_env[:force_confirm_destroy] = true
  env[:action_runner].run(Action.action_destroy, destroy_env)        
end