def call(env)
if env[:machine].provider_config.qemu_use_session
@app.call(env)
return
end
created_networks_file = env[:machine].data_dir + 'created_networks'
@logger.info 'Checking if any networks were created'
unless File.exist?(created_networks_file)
env[:machine].id = nil
return @app.call(env)
end
@logger.info 'File with created networks exists'
created_networks = []
file = File.open(created_networks_file, 'r')
file.readlines.each do |network_uuid|
@logger.info "Checking for #{network_uuid}"
begin
libvirt_network = env[:machine].provider.driver.connection.client.lookup_network_by_uuid(
network_uuid
)
rescue Libvirt::RetrieveError => e
if e.message =~ /Network not found/
@logger.info 'It is already undefined'
next
else
raise e
end
end
xml = Nokogiri::XML(libvirt_network.xml_desc)
connections = xml.xpath('/network/@connections').first
unless connections.nil?
@logger.info 'Still has connections so will not undefine'
created_networks << network_uuid
next
end
begin
libvirt_network.destroy
libvirt_network.undefine
@logger.info 'Undefined it'
rescue => e
raise Errors::DestroyNetworkError,
network_name: libvirt_network.name,
error_message: e.message
end
end
file.close
if !created_networks.empty?
File.open(created_networks_file, 'w') do |file|
@logger.info 'Writing new created_networks file'
created_networks.each do |network_uuid|
file.puts network_uuid
end
end
else
@logger.info 'Deleting created_networks file'
File.delete(created_networks_file)
end
env[:machine].id = nil
@app.call(env)
end