It is sometimes surprising what extra features libvirt all has - I
haven't touched this for all the time working with it - Feature of 2009
it seems :-)

First of all yes, I also can't see anything on 18.04 boxes (not that on
16.04 I'd have got a lot, only "lo" actually).

There is nothing of the common issues:
- no appamor denie
- no error in a full-debug libvirtd log

Internally this goes through virshInterfaceListCollect ->
virConnectListAllInterfaces ->
conn->interfaceDriver->connectListAllInterfaces

That call to the libvirt daemon succeeds but returns:
(gdb) p *(virshInterfaceListPtr)ifaces
$15 = {ifaces = 0x55555580f370, nifaces = 0}

So that is an empty list from the daemon, check what happens over there.
The backend uses netcf through ncf_list_interfaces and gets a count of zero.

The implementation of this is in ncf.
It does a few checks and then goes to drv_list_interfaces which for us is is 
implemented in drv_debian.c.
This then calls list_interface_ids with arguments to fill the list (one can set 
arg 2/3 to 0 to just get a number).

This then uses list_interfaces to generate a list via uniq_device_names
and checks against some filters.

But uniq_device_names already gets an argument with "how many"
interfaces are to be expected and that is zero.

This number  comes from:
  aug_fmt_match(ncf, &devs, "%s/iface", network_interfaces_path);

This implementation is based on ENI as network_interfaces_path is essentially 
  static const char *const network_interfaces_path = 
"/files/etc/network/interfaces"

So I think we found a case of ENI -> (pure) networkd transition causing some 
issues.
That also explains why on my 16.04 I don't see all interfaces, I have not all 
(none but lo) configured via ENI in /etc/network/interfaces.

This is not so much a lbivirt, but much more a netcf issue.
IMHO this was all forgotten in the netplan change :-/ and needs implementation.
Maybe it needs more since it seems to just hang around for quite a while.

A testcase for now looks like that:
$ apt source netcf
$ sudo apt build-dep netcf
$ cd netcf-0.2.8
$ ./configure --with-driver=debian
$ make -j12
$ make check
$ cd tests
$ make test-debian
$ make check


That actually should have tested the function we found breaking - odd.
Instead one can for now use a very simplified netcfConnectListInterfacesImpl:

$ sudo apt install libnetcf1

$ cat >> test.c << EOF
#include <netcf.h>
#include <stdio.h>

int main()
{
   int count = 0;
   int status = NETCF_IFACE_ACTIVE | NETCF_IFACE_INACTIVE;
   struct netcf *netcf = NULL;

   if (ncf_init(&netcf, NULL) != 0) {
       printf("Init failed\n");
       return -1;
   }

   count = ncf_num_of_interfaces(netcf, status);
   printf("Count is %d\n", count);
   return 0;
}
EOF

$ gcc -Wall -o test test.c -lnetcf; ./test

That should return a number matching your /et/network/interfaces on
16.04, but due to lacking it nothing on 18.04

Only good thing for now, it seems only libvirt uses netcf and while iface list 
and such fail they are not strictly required (as we can see it only now shows 
up for virt-manager centric usage).
Never the less a big issue :-/

There is a udev backend, maybe we should consider switchign instead of
implementing so much in netcf - both ways need a in -depth analysis.

** Changed in: libvirt (Ubuntu)
   Importance: Undecided => High

** Also affects: netcf (Ubuntu)
   Importance: Undecided
       Status: New

** Changed in: netcf (Ubuntu)
       Status: New => Triaged

** Changed in: netcf (Ubuntu)
   Importance: Undecided => High

** Changed in: libvirt (Ubuntu)
   Importance: High => Medium

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/1764314

Title:
  libvirt doesn't show all interfaces

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/libvirt/+bug/1764314/+subscriptions

-- 
ubuntu-bugs mailing list
ubuntu-bugs@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to