On Fri, Jun 16, 2023 at 03:57:37PM -0600, Jim Fehlig wrote:
> On 6/16/23 02:12, Martin Kletzander wrote:
> > On Wed, Jun 14, 2023 at 04:45:06PM -0600, Jim Fehlig wrote:
> > > On 6/9/23 03:05, Andrea Bolognani wrote:
> > > > Can we somehow enforce that libvirt-daemon is fully configured before
> > > > libvirt-daemon-proxy? If so, we could create a witness file based on
> > > > the information we need in libvirt-daemon's %post, look at it in
> > > > libvirt-daemon-proxy's %post and base our decision on that.
> > >
> > > What would the witness file indicate? As I understand, it would 
> > > essentially have
> > > to indicate whether libvirtd sockets/service are enabled. If so, couldn't 
> > > that
> > > be done directly in virtproxy post script? Something like the below hack?

The current logic in all packages' %post scriptlet basically
translates to: if installing the package from scratch, apply the
systemd presets; if upgrading, leave things well alone.

What I would want the witness file to indicate would be:
libvirt-daemon is being upgraded, so when running the %post for
libvirt-daemon-proxy behave as in the upgrade scenario as opposed to
the install-from-scratch scenario.

Detecting whether the monolithic libvirtd and its sockets are enabled
could also work, but feels more fragile. Specifically, it would not
cover the scenario described by Martin, where the deployment is a
split daemon one but with some units that are disabled by default
based on presets have been manually enabled by the admin.

The problem is that I'm not sure we can create and process such a
witness file reliably. Figuring that out requires research and
real-life testing :)

> In an attempt to reproduce Andrea's report, I added the following presets to
> /usr/lib/systemd/system-preset/90-default-openSUSE.preset
>
> enable virtqemud.socket
> enable virtlogd.socket
> enable virtnetworkd.socket
> enable virtnodedevd.socket
> enable virtstoraged.socket
> enable virtsecretd.socket
> enable virtproxyd.socket
>
> As before, installed packages without commit b1da03b5b3. I then disabled all
> the virt* presets (with exception of virtlogd) and enabled libvirtd.socket.

I'm not sure this is entirely relevant, but just for completeness'
sake: in a monolithic daemon deployment, you want libvirtd.service in
addition to its sockets to be enabled. This is needed to make sure
domain autostart works as intended.

Basically, starting from a split daemon deployment, you want to
follow the steps outlined here[1] but in reverse.

> After updating to packages containing commit b1da03b5b3, virtproxyd.socket
> was still disabled and libvirt.socket was enabled. No problem connecting to
> libvirtd, even after the service timeout.

I'll try to reproduce this myself later this week, but what you're
describing doesn't match my expectations: virtproxyd.socket should
have been enabled during installation.

Are the packages you're using for testing a direct rebuild of the
spec file shipped upstream? Or have you integrated the changes into
the openSUSE spec file somehow?

Note that the scriptlets in the upstream spec file call out to some
standard macros, and it's also possible that the implementation of
said macros is not the same across Fedora and openSUSE.

> Any tips on reproducing the issue? I must be missing something. What are the
> libvirt-related presets in Fedora? I couldn't easily find them. FYI, the
> Tumbleweed ones are here
>
> https://build.opensuse.org/package/show/Base:System/systemd-presets-common-SUSE
> https://build.opensuse.org/package/show/Base:System/systemd-presets-branding-openSUSE

They're part of the fedora-release package[2].

Specifically, we have

  # Virtualization driver specific daemons. Start by default at boot for VM
  # autostart, but shutdown after 2 mins and socket activated thereafter
  enable virtqemud.service
  enable virtxend.service
  enable virtlxcd.service

  # Compatibility with libvirtd sockets for old clients and expose TCP sockets
  enable virtproxyd.socket

  # Secondary drivers providing supporting functionality to main virtualization
  # drivers, socket activated only when required
  enable virtinterfaced.socket
  enable virtnetworkd.socket
  enable virtnodedevd.socket
  enable virtnwfilterd.socket
  enable virtsecretd.socket
  enable virtstoraged.socket

> In the past I've never added libvirt services/sockets to the openSUSE
> presets since users could easily enable libvirtd and virtlogd and be done
> with it. (Note the SLES presets do enable libvirtd and virtlogd.) But it
> becomes more burdensome with modular daemons, so I plan to add the above
> presets (excluding virtproxyd) to the openSUSE defaults.

Are you okay with old(ish) clients not being able to connect to the
host? Because that's why the virtproxyd.socket is enabled by default
in Fedora: if the client predates the introduction of split daemons
it will try to connect to the old libvirtd socket, and in a split
daemons deployment they only way to make that work is by having
virtproxyd listening on it.


[1] https://libvirt.org/daemons.html#switching-to-modular-daemons
[2] 
https://src.fedoraproject.org/rpms/fedora-release/blob/rawhide/f/90-default.preset
-- 
Andrea Bolognani / Red Hat / Virtualization

Reply via email to