[libvirt PATCH 0/6] rpm: enable modular daemons by default in Fedora 35 / RHEL 9

Daniel P. Berrangé (6): rpm: macroize logic for restarting daemons post-transaction rpm: restart virtnwfilter/virnetworkd if configs change rpm: restart modular daemons on upgrade rpm: macroize logic for enabling/disabling daemons post/postun-install rpm: handle enabling/disabling modular daemons post/postun-install rpm: use direct remote connection for Fedora >= 35 / RHEL >= 9 libvirt.spec.in | 225 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 190 insertions(+), 35 deletions(-) -- 2.31.1

The patterns for restarting daemons post-transaction has a bit of duplication across the different part of the spec. This is going to get much worse with the need to restart modular daemons, so benefits from macroization. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- libvirt.spec.in | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/libvirt.spec.in b/libvirt.spec.in index 5c6494eefd..1d657aec35 100644 --- a/libvirt.spec.in +++ b/libvirt.spec.in @@ -1248,6 +1248,21 @@ mv $RPM_BUILD_ROOT%{_datadir}/systemtap/tapset/libvirt_qemu_probes.stp \ # raising the test timeout VIR_TEST_DEBUG=1 %meson_test --no-suite syntax-check --timeout-multiplier 10 +%global libvirt_daemon_schedule_restart() mkdir -p %{_localstatedir}/lib/rpm-state/libvirt || : \ +/bin/systemctl is-active %1.service 1>/dev/null 2>&1 && \ + touch %{_localstatedir}/lib/rpm-state/libvirt/restart-%1 || : + +%global libvirt_daemon_finish_restart() rm -f %{_localstatedir}/lib/rpm-state/libvirt/restart-%1 \ +rmdir %{_localstatedir}/lib/rpm-state/libvirt 2>/dev/null || : + +%global libvirt_daemon_needs_restart() -f %{_localstatedir}/lib/rpm-state/libvirt/restart-%1 + +%global libvirt_daemon_perform_restart() if test %libvirt_daemon_needs_restart %1 \ +then \ + /bin/systemctl try-restart %1.service >/dev/null 2>&1 || : \ +fi \ +%libvirt_daemon_finish_restart %1 + %pre daemon # 'libvirt' group is just to allow password-less polkit access to # libvirtd. The uid number is irrelevant, so we use dynamic allocation @@ -1267,9 +1282,7 @@ exit 0 %systemd_post %post_units -# request daemon restart in posttrans -mkdir -p %{_localstatedir}/lib/rpm-state/libvirt || : -touch %{_localstatedir}/lib/rpm-state/libvirt/restart || : +%libvirt_daemon_schedule_restart libvirtd %preun daemon %global preun_units \\\ @@ -1302,7 +1315,8 @@ if [ $1 -ge 1 ] ; then fi %posttrans daemon -if [ -f %{_localstatedir}/lib/rpm-state/libvirt/restart ]; then +if test %libvirt_daemon_needs_restart libvirtd +then # See if user has previously modified their install to # tell libvirtd to use --listen grep -E '^LIBVIRTD_ARGS=.*--listen' /etc/sysconfig/libvirtd 1>/dev/null 2>&1 @@ -1338,7 +1352,8 @@ if [ -f %{_localstatedir}/lib/rpm-state/libvirt/restart ]; then fi fi fi -rm -rf %{_localstatedir}/lib/rpm-state/libvirt || : + +%libvirt_daemon_finish_restart libvirtd %post daemon-driver-network %if %{with_firewalld_zone} @@ -1388,15 +1403,11 @@ if test $1 -eq 1 && test ! -f %{_sysconfdir}/libvirt/qemu/networks/default.xml ; chmod 0600 %{_sysconfdir}/libvirt/qemu/networks/default.xml # Make sure libvirt picks up the new network defininiton - mkdir -p %{_localstatedir}/lib/rpm-state/libvirt || : - touch %{_localstatedir}/lib/rpm-state/libvirt/restart || : + %libvirt_daemon_schedule_restart libvirtd fi %posttrans daemon-config-network -if [ -f %{_localstatedir}/lib/rpm-state/libvirt/restart ]; then - /bin/systemctl try-restart libvirtd.service >/dev/null 2>&1 || : -fi -rm -rf %{_localstatedir}/lib/rpm-state/libvirt || : +%libvirt_daemon_perform_restart libvirtd %post daemon-config-nwfilter for datadir_file in %{_datadir}/libvirt/nwfilter/*.xml; do @@ -1407,15 +1418,10 @@ for datadir_file in %{_datadir}/libvirt/nwfilter/*.xml; do fi done # Make sure libvirt picks up the new nwfilter defininitons -mkdir -p %{_localstatedir}/lib/rpm-state/libvirt || : -touch %{_localstatedir}/lib/rpm-state/libvirt/restart || : +%libvirt_daemon_schedule_restart libvirtd %posttrans daemon-config-nwfilter -if [ -f %{_localstatedir}/lib/rpm-state/libvirt/restart ]; then - /bin/systemctl try-restart libvirtd.service >/dev/null 2>&1 || : -fi -rm -rf %{_localstatedir}/lib/rpm-state/libvirt || : - +%libvirt_daemon_perform_restart libvirtd %if %{with_qemu} %pre daemon-driver-qemu -- 2.31.1

Currently we restart libvirtd if the nwfilter/network configs have changed. We need to take account of possibility that the modular daemons are in use instead though. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- libvirt.spec.in | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libvirt.spec.in b/libvirt.spec.in index 1d657aec35..c00d4c73da 100644 --- a/libvirt.spec.in +++ b/libvirt.spec.in @@ -1404,10 +1404,12 @@ if test $1 -eq 1 && test ! -f %{_sysconfdir}/libvirt/qemu/networks/default.xml ; # Make sure libvirt picks up the new network defininiton %libvirt_daemon_schedule_restart libvirtd + %libvirt_daemon_schedule_restart virtnetworkd fi %posttrans daemon-config-network %libvirt_daemon_perform_restart libvirtd +%libvirt_daemon_perform_restart virtnetworkd %post daemon-config-nwfilter for datadir_file in %{_datadir}/libvirt/nwfilter/*.xml; do @@ -1419,9 +1421,11 @@ for datadir_file in %{_datadir}/libvirt/nwfilter/*.xml; do done # Make sure libvirt picks up the new nwfilter defininitons %libvirt_daemon_schedule_restart libvirtd +%libvirt_daemon_schedule_restart virtnwfilterd %posttrans daemon-config-nwfilter %libvirt_daemon_perform_restart libvirtd +%libvirt_daemon_perform_restart virtnwfilterd %if %{with_qemu} %pre daemon-driver-qemu -- 2.31.1

The daemons all need restarting to ensure they pick up the newly installed code. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- libvirt.spec.in | 69 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/libvirt.spec.in b/libvirt.spec.in index c00d4c73da..3999afad8b 100644 --- a/libvirt.spec.in +++ b/libvirt.spec.in @@ -1360,11 +1360,80 @@ fi %firewalld_reload %endif +%libvirt_daemon_schedule_restart virtnetworkd + %postun daemon-driver-network %if %{with_firewalld_zone} %firewalld_reload %endif +%posttrans daemon-driver-network +%libvirt_daemon_perform_restart virtnetwork + + +%post daemon-driver-nwfilter +%libvirt_daemon_schedule_restart virtnwfilterd + +%posttrans daemon-driver-nwfilter +%libvirt_daemon_perform_restart virtnwfilterd + + +%post daemon-driver-nodedev +%libvirt_daemon_schedule_restart virtnodedevd + +%posttrans daemon-driver-nodedev +%libvirt_daemon_perform_restart virtnodedevd + + +%post daemon-driver-interface +%libvirt_daemon_schedule_restart virtinterfaced + +%posttrans daemon-driver-interface +%libvirt_daemon_perform_restart virtinterfaced + + +%post daemon-driver-secret +%libvirt_daemon_schedule_restart virtsecretd + +%posttranstrans daemon-driver-secret +%libvirt_daemon_perform_restart virtsecretd + + +%post daemon-driver-storage +%libvirt_daemon_schedule_restart virtstoraged + +%posttrans daemon-driver-storage +%libvirt_daemon_perform_restart virtstoraged + + +%post daemon-driver-qemu +%libvirt_daemon_schedule_restart virtqemud + +%posttrans daemon-driver-qemu +%libvirt_daemon_perform_restart virtqemud + + +%post daemon-driver-lxc +%libvirt_daemon_schedule_restart virtlxcd + +%posttrans daemon-driver-lxc +%libvirt_daemon_perform_restart virtlxcd + + +%post daemon-driver-vbox +%libvirt_daemon_schedule_restart virtvboxd + +%posttrans daemon-driver-vbox +%libvirt_daemon_perform_restart virtvboxd + + +%post daemon-driver-libxl +%libvirt_daemon_schedule_restart virtxend + +%posttrans daemon-driver-libxl +%libvirt_daemon_perform_restart virtxend + + %post daemon-config-network if test $1 -eq 1 && test ! -f %{_sysconfdir}/libvirt/qemu/networks/default.xml ; then # see if the network used by default network creates a conflict, -- 2.31.1

The patterns for enabling/disabling daemons post/postun-install has a bit of duplication across the different part of the spec, due to the number of socket units involved. This is going to get much worse with the need to enable/disalbe modular daemons, so benefits from macroization. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- libvirt.spec.in | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/libvirt.spec.in b/libvirt.spec.in index 3999afad8b..1494a18684 100644 --- a/libvirt.spec.in +++ b/libvirt.spec.in @@ -1263,6 +1263,14 @@ then \ fi \ %libvirt_daemon_finish_restart %1 +%global libvirt_daemon_systemd_post() %systemd_post %1.socket %1-ro.socket %1-admin.socket %1.service + +%global libvirt_daemon_systemd_post_inet() %systemd_post %1.socket %1-ro.socket %1-admin.socket %1-tls.socket %1-tcp.socket %1.service + +%global libvirt_daemon_systemd_preun() %systemd_preun %1.service %1-ro.socket %1-admin.socket %1.socket + +%global libvirt_daemon_systemd_preun_inet() %systemd_preun %1.service %1-ro.socket %1-admin.socket %1-tls.socket %1-tcp.socket %1.socket + %pre daemon # 'libvirt' group is just to allow password-less polkit access to # libvirtd. The uid number is irrelevant, so we use dynamic allocation @@ -1272,28 +1280,20 @@ getent group libvirt >/dev/null || groupadd -r libvirt exit 0 %post daemon -%global post_units \\\ - virtlockd.socket virtlockd-admin.socket \\\ - virtlogd.socket virtlogd-admin.socket \\\ - libvirtd.socket libvirtd-ro.socket libvirtd-admin.socket \\\ - libvirtd-tcp.socket libvirtd-tls.socket \\\ - libvirtd.service \\\ - libvirt-guests.service +%libvirt_daemon_systemd_post virtlogd +%libvirt_daemon_systemd_post virtlockdd +%libvirt_daemon_systemd_post_inet libvirtd -%systemd_post %post_units +%systemd_post libvirt-guests.service %libvirt_daemon_schedule_restart libvirtd %preun daemon -%global preun_units \\\ - libvirtd.service \\\ - libvirtd-tcp.socket libvirtd-tls.socket \\\ - libvirtd.socket libvirtd-ro.socket libvirtd-admin.socket \\\ - virtlogd.socket virtlogd-admin.socket virtlogd.service \\\ - virtlockd.socket virtlockd-admin.socket virtlockd.service \\\ - libvirt-guests.service - -%systemd_preun %preun_units +%systemd_preun libvirt-guests.service + +%libvirt_daemon_systemd_preun_inet libvirtd +%libvirt_daemon_systemd_preun virtlogd +%libvirt_daemon_systemd_preun virtlockdd %postun daemon /bin/systemctl daemon-reload >/dev/null 2>&1 || : -- 2.31.1

We need to enable or disable the modular daemons with systemd after the RPM install/uninstall. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- libvirt.spec.in | 70 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/libvirt.spec.in b/libvirt.spec.in index 1494a18684..44d1e7a3c3 100644 --- a/libvirt.spec.in +++ b/libvirt.spec.in @@ -181,6 +181,11 @@ %define with_dmidecode 0%{!?_without_dmidecode:1} %endif +%define with_modular_daemons 0 +%if 0%{?fedora} >= 35 || 0%{?rhel} >= 9 +%define with_modular_daemons 1 +%endif + # Force QEMU to run as non-root %define qemu_user qemu %define qemu_group qemu @@ -1282,7 +1287,11 @@ exit 0 %post daemon %libvirt_daemon_systemd_post virtlogd %libvirt_daemon_systemd_post virtlockdd +%if %{with_modular_daemons} +%libvirt_daemon_systemd_post_inet virtproxyd +%else %libvirt_daemon_systemd_post_inet libvirtd +%endif %systemd_post libvirt-guests.service @@ -1292,6 +1301,7 @@ exit 0 %systemd_preun libvirt-guests.service %libvirt_daemon_systemd_preun_inet libvirtd +%libvirt_daemon_systemd_preun_inet virtproxyd %libvirt_daemon_systemd_preun virtlogd %libvirt_daemon_systemd_preun virtlockdd @@ -1360,8 +1370,14 @@ fi %firewalld_reload %endif +%if %{with_modular_daemons} +%libvirt_daemon_systemd_post virtnetworkd +%endif %libvirt_daemon_schedule_restart virtnetworkd +%preun +%libvirt_daemon_systemd_preun virtnetworkd + %postun daemon-driver-network %if %{with_firewalld_zone} %firewalld_reload @@ -1372,64 +1388,118 @@ fi %post daemon-driver-nwfilter +%if %{with_modular_daemons} +%libvirt_daemon_systemd_post virtnwfilterd +%endif %libvirt_daemon_schedule_restart virtnwfilterd +%preun daemon-driver-nwfilter +%libvirt_daemon_systemd_preun virtnwfilterd + %posttrans daemon-driver-nwfilter %libvirt_daemon_perform_restart virtnwfilterd %post daemon-driver-nodedev +%if %{with_modular_daemons} +%libvirt_daemon_systemd_post virtnodedevd +%endif %libvirt_daemon_schedule_restart virtnodedevd +%preun daemon-driver-nodedev +%libvirt_daemon_systemd_preun virtnodedevd + %posttrans daemon-driver-nodedev %libvirt_daemon_perform_restart virtnodedevd %post daemon-driver-interface +%if %{with_modular_daemons} +%libvirt_daemon_systemd_post virtinterfaced +%endif %libvirt_daemon_schedule_restart virtinterfaced +%preun daemon-driver-interface +%libvirt_daemon_systemd_preun virtinterfaced + %posttrans daemon-driver-interface %libvirt_daemon_perform_restart virtinterfaced %post daemon-driver-secret +%if %{with_modular_daemons} +%libvirt_daemon_systemd_post virtsecretd +%endif %libvirt_daemon_schedule_restart virtsecretd +%preun daemon-driver-secret +%libvirt_daemon_systemd_preun virtsecretd + %posttranstrans daemon-driver-secret %libvirt_daemon_perform_restart virtsecretd %post daemon-driver-storage +%if %{with_modular_daemons} +%libvirt_daemon_systemd_post virtstoraged +%endif %libvirt_daemon_schedule_restart virtstoraged +%preun daemon-driver-storage +%libvirt_daemon_systemd_preun virtstoraged + %posttrans daemon-driver-storage %libvirt_daemon_perform_restart virtstoraged %post daemon-driver-qemu +%if %{with_modular_daemons} +%libvirt_daemon_systemd_post virtqemud +%endif %libvirt_daemon_schedule_restart virtqemud +%preun daemon-driver-qemu +%libvirt_daemon_systemd_preun virtqemud + %posttrans daemon-driver-qemu %libvirt_daemon_perform_restart virtqemud %post daemon-driver-lxc +%if %{with_modular_daemons} +%libvirt_daemon_systemd_post virtlxcd +%endif %libvirt_daemon_schedule_restart virtlxcd +%preun daemon-driver-lxc +%libvirt_daemon_systemd_preun virtlxcd + %posttrans daemon-driver-lxc %libvirt_daemon_perform_restart virtlxcd %post daemon-driver-vbox +%if %{with_modular_daemons} +%libvirt_daemon_systemd_post virtvboxd +%endif %libvirt_daemon_schedule_restart virtvboxd +%preun daemon-driver-vbox +%libvirt_daemon_systemd_preun virtvboxd + %posttrans daemon-driver-vbox %libvirt_daemon_perform_restart virtvboxd %post daemon-driver-libxl +%if %{with_modular_daemons} +%libvirt_daemon_systemd_post virtxend +%endif %libvirt_daemon_schedule_restart virtxend +%preun daemon-driver-libxl +%libvirt_daemon_systemd_preun virtxend + %posttrans daemon-driver-libxl %libvirt_daemon_perform_restart virtxend -- 2.31.1

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- libvirt.spec.in | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/libvirt.spec.in b/libvirt.spec.in index 44d1e7a3c3..af884f6126 100644 --- a/libvirt.spec.in +++ b/libvirt.spec.in @@ -1081,6 +1081,12 @@ exit 1 %define arg_libssh2 -Dlibssh2=disabled %endif +%if %{with_modular_daemons} + %define arg_remote_mode -Dremote_default_mode=direct +%else + %define arg_remote_mode -Dremote_default_mode=legacy +%endif + %define when %(date +"%%F-%%T") %define where %(hostname) %define who %{?packager}%{!?packager:Unknown} @@ -1111,7 +1117,7 @@ export SOURCE_DATE_EPOCH=$(stat --printf='%Y' %{_specdir}/%{name}.spec) -Ddriver_vz=disabled \ -Ddriver_bhyve=disabled \ -Ddriver_ch=disabled \ - -Dremote_default_mode=legacy \ + %{?arg_remote_mode} \ -Ddriver_interface=enabled \ -Ddriver_network=enabled \ -Dstorage_fs=enabled \ -- 2.31.1

On 8/3/21 6:07 PM, Daniel P. Berrangé wrote:
Daniel P. Berrangé (6): rpm: macroize logic for restarting daemons post-transaction rpm: restart virtnwfilter/virnetworkd if configs change rpm: restart modular daemons on upgrade rpm: macroize logic for enabling/disabling daemons post/postun-install rpm: handle enabling/disabling modular daemons post/postun-install rpm: use direct remote connection for Fedora >= 35 / RHEL >= 9
libvirt.spec.in | 225 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 190 insertions(+), 35 deletions(-)
Reviewed-by: Michal Privoznik <mprivozn@redhat.com> Michal
participants (2)
-
Daniel P. Berrangé
-
Michal Prívozník