def call(env)
env[:metrics] ||= {}
domain = env[:machine].provider.driver.get_domain(env[:machine].id.to_s)
if domain.nil?
raise Errors::NoDomainError,
error_message: "Domain #{env[:machine].id} not found"
end
env[:ip_address] = nil
@logger.debug("Searching for IP for MAC address: #{domain.mac}")
env[:ui].info(I18n.t('vagrant_libvirt.waiting_for_ip'))
if env[:machine].provider_config.qemu_use_session
env[:metrics]['instance_ip_time'] = Util::Timer.time do
retryable(on: Fog::Errors::TimeoutError, tries: 300) do
return terminate(env) if env[:interrupted]
domain.wait_for(2) do
env[:ip_address] = env[:machine].provider.driver.get_ipaddress_system(domain.mac)
!env[:ip_address].nil?
end
end
end
else
env[:metrics]['instance_ip_time'] = Util::Timer.time do
retryable(on: Fog::Errors::TimeoutError, tries: 300) do
return terminate(env) if env[:interrupted]
domain.wait_for(2) do
addresses.each_pair do |_type, ip|
env[:ip_address] = ip[0] unless ip[0].nil?
end
!env[:ip_address].nil?
end
end
end
end
@logger.info("Got IP address #{env[:ip_address]}")
@logger.info("Time for getting IP: #{env[:metrics]['instance_ip_time']}")
env[:metrics]['instance_ssh_time'] = Util::Timer.time do
env[:ui].info(I18n.t('vagrant_libvirt.waiting_for_ssh'))
retryable(on: Fog::Errors::TimeoutError, tries: 60) do
next if env[:interrupted]
loop do
break if env[:interrupted]
break if env[:machine].communicate.ready?
sleep 2
end
end
end
return terminate(env) if env[:interrupted]
@logger.info("Time for SSH ready: #{env[:metrics]['instance_ssh_time']}")
@app.call(env)
end