Re: [PATCH 5/7] network: NetworkManager script to monitor/resolve conflicts with new interfaces

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Aug 07, 2024 at 04:00:09PM -0400, Laine Stump wrote:
> On 8/7/24 1:32 PM, Daniel P. Berrangé wrote:
> > On Wed, Aug 07, 2024 at 01:16:01PM -0400, Laine Stump wrote:
> > > +
> > > +import libvirt
> > > +import sys
> > > +import os
> > > +import libxml2
> > > +from ipaddress import ip_network
> > > +
> > > +# This script should be installed in
> > > +# /usr/lib/NetworkManager/dispatcher.d/50-libvirt-check-nets. It will be
> > > +# called by NetworkManager every time a network interface is taken up
> > > +# or down. When a new network comes up, it checks the libvirt virtual
> > > +# networks to see if their IP address(es) (including any static
> > > +# routes) are in conflict with the IP address(es) (or static routes)
> > > +# of the newly added interface.  If so, the libvirt network is
> > > +# disabled. It is assumed that the user will notice that their guests
> > > +# no longer have network connectvity (and/or the message logged by
> > > +# this script), see that the network has been disabled, and then
> > > +# realize the conflict when they try to restart it.
> > > +#
> > > +# set checkDefaultOnly=False to check *all* active libvirt networks
> > > +# for conflicts with the new interface. Set to True to check only the
> > > +# libvirt default network (since most networks other than the default
> > > +# network are added post-install at a time when all of the hosts other
> > > +# networks are already active, it may be overkill to check all of the
> > > +# libvirt networks for conflict here (and instead just add more
> > > +# needless overheard to bringing up a new host interface).
> > > +#
> > > +checkDefaultOnly = False
> > > +
> > > +# NB: since this file is installed in /usr/lib, it really shouldn't be
> > > +# modified by the user, but instead should be copied to
> > > +# /etc/NetworkManager/dispatcher.d, where it will override the copy in
> > > +# /usr/lib. Even that isn't a proper solution though - if we're going
> > > +# to actually have this config knob, perhaps we should check for it in
> > > +# the environment, and if someone wants to modify it they can put a
> > > +# short script in /etc that exports and environment variable and then
> > > +# calls this script? Just thinking out loud here.
> > > +
> > > +
> > > +def checkconflict(conn, netname, hostnets, hostif):
> > 
> > ...snip complex code...
> > 
> > It occurrs to me that this python code is entirely duplicating
> > logic that already exists in virtnetworkd that checks for
> > conflicts.
> 
> Possibly not *exactly* what's in virtnetworkd, since I'm not certain if NM
> includes all static routes in the list it puts in the environment variables
> (while they *would* show up in the system routing table that our network
> driver uses). Of course that sounds like another reason to prefer re-using
> the existing code!

Oh definitely a strong reason to reuse the code. We don't want a situation
where users file bugs because we don't detect clashes in one scenario, but
do in the other.

> > This makes me want to figure out a way to just re-use the existing
> > code rather than having to write it again.
> > 
> > Could we just send a SIGUSR2 to virtnetworkd as a way to trigger it
> > to re-validate all running networks ? That would be easy to trigger
> > from non-network manager setups too.
> 
> That sounds simpler (and probably quicker), and if we could do it that I
> would prefer it ("only works with NetworkManager" is #1 on my list of
> 'issues' above after all :-)), but what would we do in the case that
> virtnetworkd (or libvirtd) wasn't currently running? Run some virsh command
> to trigger virtnetworkd to start, and then send the SIGUSR2?

As long as there are networks running, libvirtd/virnetworkd should not
shut down due to the auto shutdown timer.

They might temporarily shutdown due to a restart on package upgrades.

If our startup code runs the "check for clashes" logic, then we'll
do the right thing.

The only problem will be if a user manually stops the daemon and
leaves it stopped, while still having a network present. I'm happy
to call that user error and not worry about solving clashes in
that case, as no normal system should get in that state.

> (this does
> > But then how about ignoring network manager entirely and going right
> > to the source, ie the kernel. Does it send out either udev or netlink
> > events (probably the latter), when NICs have their link status set
> > online/offline ? If so, virtnetworkd could just listen to the kernel
> > events and "do the right thing",  regardless of what tool is managing
> > the NICs.
> 
> I imagine *something* is sent out, and it's definitely worth me
> investigating. But wouldn't virtnetworkd have to be running all of the time
> in order to use something like that?



With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux