drivers/kvm: Use ARP for retrieving interface ip addresses

On platforms where dhcp lease status is not updated immediately after
domain creation it fails to list ip addresses until next refresh
happens resulting in the following error:

8<----------8<----------8<----------8<----------8<----------8<----------

Creating kvm2 VM (CPUs=2, Memory=4096MB, Disk=20480MB) ...
Failed to start kvm2 VM. Running "minikube delete" may fix it: creating
  host: create: Error creating machine: Error in driver during machine
  creation: IP not available after waiting: machine minikube didn't
  return IP after 1 minute

Exiting due to GUEST_PROVISION: Failed to start host: creating host:
  create: Error creating machine: Error in driver during machine
  creation: IP not available after waiting: machine minikube didn't
  return IP after 1 minute

8<----------8<----------8<----------8<----------8<----------8<----------

Using ARP instead of LEASE for ip address query is justifiable as
listing is done following the domain creation. In case of failure we
fallback to listing via LEASE source.

Signed-off-by: Anoop C S <anoopcs@cryptolab.net>
pull/13482/head
Anoop C S 2022-01-25 11:08:39 +05:30
parent 327b1b959e
commit 061fd88d2e
1 changed files with 13 additions and 3 deletions

View File

@ -478,9 +478,19 @@ func ifListFromAPI(conn *libvirt.Connect, domain string) ([]libvirt.DomainInterf
}
defer func() { _ = dom.Free() }()
ifs, err := dom.ListAllInterfaceAddresses(libvirt.DOMAIN_INTERFACE_ADDRESSES_SRC_LEASE)
if err != nil {
return nil, fmt.Errorf("failed listing network interface addresses of domain %s: %w", domain, err)
ifs, err := dom.ListAllInterfaceAddresses(libvirt.DOMAIN_INTERFACE_ADDRESSES_SRC_ARP)
if ifs == nil {
if err != nil {
log.Debugf("failed listing network interface addresses of domain %s(source=arp): %w", domain, err)
} else {
log.Debugf("No network interface addresses found for domain %s(source=arp)", domain)
}
log.Debugf("trying to list again with source=lease")
ifs, err = dom.ListAllInterfaceAddresses(libvirt.DOMAIN_INTERFACE_ADDRESSES_SRC_LEASE)
if err != nil {
return nil, fmt.Errorf("failed listing network interface addresses of domain %s(source=lease): %w", domain, err)
}
}
return ifs, nil