# Copyright (C) 2009, 2010, 2013, 2014 Nicira Networks, Inc. # # Copying and distribution of this file, with or without modification, # are permitted in any medium without royalty provided the copyright # notice and this notice are preserved. This file is offered as-is, # without warranty of any kind. # # If tests have to be skipped while building, specify the '--without check' # option. For example: # rpmbuild -bb --without check rhel/openvswitch-fedora.spec # This defines the base package name's version. %define pkgname openvswitch2.16 %if 0%{?commit:1} %global shortcommit %(c=%{commit}; echo ${c:0:7}) %endif # Enable PIE, bz#955181 %global _hardened_build 1 # RHEL-7 doesn't define _rundir macro yet # Fedora 15 onwards uses /run as _rundir %if 0%{!?_rundir:1} %define _rundir /run %endif # FIXME Test "STP - flush the fdb and mdb when topology changed" fails on s390x # FIXME 2 tests fails on ppc64le. They will be hopefully fixed before official 2.11 %ifarch %{ix86} x86_64 aarch64 %bcond_without check %else %bcond_with check %endif # option to run kernel datapath tests, requires building as root! %bcond_with check_datapath_kernel # option to build with libcap-ng, needed for running OVS as regular user %bcond_without libcapng # option to build with ipsec support %bcond_without ipsec # Build python2 (that provides python) and python3 subpackages on Fedora # Build only python3 (that provides python) subpackage on RHEL8 # Build only python subpackage on RHEL7 %if 0%{?rhel} > 7 || 0%{?fedora} # On RHEL8 Sphinx is included in buildroot %global external_sphinx 1 %else # Don't use external sphinx (RHV doesn't have optional repositories enabled) %global external_sphinx 0 %endif Name: %{pkgname} Summary: Open vSwitch Group: System Environment/Daemons daemon/database/utilities URL: http://www.openvswitch.org/ Version: 2.16.0 Release: 8%{?dist} # Nearly all of openvswitch is ASL 2.0. The bugtool is LGPLv2+, and the # lib/sflow*.[ch] files are SISSL # datapath/ is GPLv2 (although not built into any of the binary packages) License: ASL 2.0 and LGPLv2+ and SISSL %define dpdkver 20.11.1 %define dpdkdir dpdk %define dpdksver %(echo %{dpdkver} | cut -d. -f-2) # NOTE: DPDK does not currently build for s390x # DPDK on aarch64 is not stable enough to be enabled in FDP %if 0%{?rhel} > 7 || 0%{?fedora} %define dpdkarches x86_64 ppc64le %else %define dpdkarches %endif %if 0%{?commit:1} Source: https://github.com/openvswitch/ovs/archive/%{commit}.tar.gz#/openvswitch-%{commit}.tar.gz %else Source: https://github.com/openvswitch/ovs/archive/v%{version}.tar.gz#/openvswitch-%{version}.tar.gz %endif Source10: https://fast.dpdk.org/rel/dpdk-%{dpdkver}.tar.xz %define docutilsver 0.12 %define pygmentsver 1.4 %define sphinxver 1.2.3 Source100: https://pypi.io/packages/source/d/docutils/docutils-%{docutilsver}.tar.gz Source101: https://pypi.io/packages/source/P/Pygments/Pygments-%{pygmentsver}.tar.gz Source102: https://pypi.io/packages/source/S/Sphinx/Sphinx-%{sphinxver}.tar.gz Patch: openvswitch-%{version}.patch # The DPDK is designed to optimize througput of network traffic using, among # other techniques, carefully crafted assembly instructions. As such it # needs extensive work to port it to other architectures. ExclusiveArch: x86_64 aarch64 ppc64le s390x # Do not enable this otherwise YUM will break on any upgrade. # Provides: openvswitch Conflicts: openvswitch < 2.16 Conflicts: openvswitch-dpdk < 2.16 Conflicts: openvswitch2.10 Conflicts: openvswitch2.11 Conflicts: openvswitch2.12 Conflicts: openvswitch2.13 Conflicts: openvswitch2.14 Conflicts: openvswitch2.15 # FIXME Sphinx is used to generate some manpages, unfortunately, on RHEL, it's # in the -optional repository and so we can't require it directly since RHV # doesn't have the -optional repository enabled and so TPS fails %if %{external_sphinx} BuildRequires: python3-sphinx %else # Sphinx dependencies BuildRequires: python-devel BuildRequires: python-setuptools #BuildRequires: python2-docutils BuildRequires: python-jinja2 BuildRequires: python-nose #BuildRequires: python2-pygments # docutils dependencies BuildRequires: python-imaging # pygments dependencies BuildRequires: python-nose %endif BuildRequires: gcc gcc-c++ make BuildRequires: autoconf automake libtool BuildRequires: systemd-units openssl openssl-devel BuildRequires: python3-devel python3-setuptools BuildRequires: desktop-file-utils BuildRequires: groff-base graphviz BuildRequires: unbound-devel # make check dependencies BuildRequires: procps-ng %if 0%{?rhel} > 7 || 0%{?fedora} BuildRequires: python3-pyOpenSSL %endif %if %{with check_datapath_kernel} BuildRequires: nmap-ncat # would be useful but not available in RHEL or EPEL #BuildRequires: pyftpdlib %endif %if %{with libcapng} BuildRequires: libcap-ng libcap-ng-devel %endif %ifarch %{dpdkarches} BuildRequires: meson # DPDK driver dependencies BuildRequires: zlib-devel numactl-devel %ifarch x86_64 BuildRequires: rdma-core-devel >= 15 libmnl-devel %endif # Required by packaging policy for the bundled DPDK Provides: bundled(dpdk) = %{dpdkver} %endif Requires: openssl iproute module-init-tools #Upstream kernel commit 4f647e0a3c37b8d5086214128614a136064110c3 #Requires: kernel >= 3.15.0-0 Requires: openvswitch-selinux-extra-policy Requires(pre): shadow-utils Requires(post): /bin/sed Requires(post): /usr/sbin/usermod Requires(post): /usr/sbin/groupadd Requires(post): systemd-units Requires(preun): systemd-units Requires(postun): systemd-units Obsoletes: openvswitch-controller <= 0:2.1.0-1 %description Open vSwitch provides standard network bridging functions and support for the OpenFlow protocol for remote per-flow control of traffic. %package -n python3-%{pkgname} Summary: Open vSwitch python3 bindings License: ASL 2.0 Requires: %{pkgname} = %{?epoch:%{epoch}:}%{version}-%{release} Provides: python-%{pkgname} = %{?epoch:%{epoch}:}%{version}-%{release} %description -n python3-%{pkgname} Python bindings for the Open vSwitch database %package test Summary: Open vSwitch testing utilities License: ASL 2.0 BuildArch: noarch Requires: python3-%{pkgname} = %{?epoch:%{epoch}:}%{version}-%{release} Requires: tcpdump %description test Utilities that are useful to diagnose performance and connectivity issues in Open vSwitch setup. %package devel Summary: Open vSwitch OpenFlow development package (library, headers) License: ASL 2.0 Requires: %{pkgname} = %{?epoch:%{epoch}:}%{version}-%{release} %description devel This provides shared library, libopenswitch.so and the openvswitch header files needed to build an external application. %if 0%{?rhel} > 7 || 0%{?fedora} > 28 %package -n network-scripts-%{name} Summary: Open vSwitch legacy network service support License: ASL 2.0 Requires: network-scripts Supplements: (%{name} and network-scripts) %description -n network-scripts-%{name} This provides the ifup and ifdown scripts for use with the legacy network service. %endif %if %{with ipsec} %package ipsec Summary: Open vSwitch IPsec tunneling support License: ASL 2.0 Requires: python3-%{pkgname} = %{?epoch:%{epoch}:}%{version}-%{release} Requires: libreswan %description ipsec This package provides IPsec tunneling support for OVS tunnels. %endif %prep %if 0%{?commit:1} %setup -q -n ovs-%{commit} -a 10 %else %setup -q -n ovs-%{version} -a 10 %endif %if ! %{external_sphinx} %if 0%{?commit:1} %setup -n ovs-%{commit} -q -D -T -a 100 -a 101 -a 102 %else %setup -n ovs-%{version} -q -D -T -a 100 -a 101 -a 102 %endif %endif mv dpdk-*/ %{dpdkdir}/ # FIXME should we propose a way to do that upstream? sed -ri "/^subdir\('(usertools|app)'\)/d" %{dpdkdir}/meson.build %patch -p1 %build # Build Sphinx on RHEL %if ! %{external_sphinx} export PYTHONPATH="${PYTHONPATH:+$PYTHONPATH:}%{_builddir}/pytmp/lib/python" for x in docutils-%{docutilsver} Pygments-%{pygmentsver} Sphinx-%{sphinxver}; do pushd "$x" python2 setup.py install --home %{_builddir}/pytmp popd done export PATH="$PATH:%{_builddir}/pytmp/bin" %endif ./boot.sh %ifarch %{dpdkarches} # build dpdk # Lets build DPDK first cd %{dpdkdir} ENABLED_DRIVERS=( bus/pci bus/vdev mempool/ring net/failsafe net/i40e net/ring net/vhost net/virtio net/tap ) %ifarch x86_64 ENABLED_DRIVERS+=( bus/vmbus common/iavf common/mlx5 net/bnxt net/enic net/iavf net/ice net/mlx4 net/mlx5 net/netvsc net/nfp net/qede net/vdev_netvsc ) %endif %ifarch aarch64 x86_64 ENABLED_DRIVERS+=( net/e1000 net/ixgbe ) %endif # Since upstream doesn't have a way for driver in drivers/*/*/; do driver=${driver#drivers/} driver=${driver%/} [[ " ${ENABLED_DRIVERS[@]} " == *" $driver "* ]] || \ disable_drivers="${disable_drivers:+$disable_drivers,}"$driver done #CFLAGS="$(echo %{optflags} | sed -e 's:-Wall::g' -e 's:-march=[[:alnum:]]* ::g') -Wformat -fPIC %{_hardening_ldflags}" \ %set_build_flags %__meson --prefix=%{_builddir}/dpdk-build \ --buildtype=plain \ -Ddisable_drivers="$disable_drivers" \ -Dmachine=default \ -Dmax_ethports=128 \ -Dmax_numa_nodes=8 \ -Dtests=false \ %{_vpath_builddir} %meson_build %__meson install -C %{_vpath_builddir} --no-rebuild # FIXME currently with LTO enabled OVS tries to link with both static and shared libraries rm -v %{_builddir}/dpdk-build/%{_lib}/*.so* # Generate a list of supported drivers, its hard to tell otherwise. cat << EOF > README.DPDK-PMDS DPDK drivers included in this package: EOF for f in %{_builddir}/dpdk-build/%{_lib}/librte_net_*.a; do basename ${f} | cut -c12- | cut -d. -f1 | tr [:lower:] [:upper:] done >> README.DPDK-PMDS cat << EOF >> README.DPDK-PMDS For further information about the drivers, see http://dpdk.org/doc/guides-%{dpdksver}/nics/index.html EOF cd - %endif # build dpdk # And now for OVS... mkdir build-shared build-static pushd build-shared ln -s ../configure %configure \ %if %{with libcapng} --enable-libcapng \ %else --disable-libcapng \ %endif --disable-static \ --enable-shared \ --enable-ssl \ --with-pkidir=%{_sharedstatedir}/openvswitch/pki make %{?_smp_mflags} popd pushd build-static ln -s ../configure %ifarch %{dpdkarches} PKG_CONFIG_PATH=%{_builddir}/dpdk-build/%{_lib}/pkgconfig \ %endif %configure \ %if %{with libcapng} --enable-libcapng \ %else --disable-libcapng \ %endif --enable-ssl \ %ifarch %{dpdkarches} --with-dpdk=static \ %endif --with-pkidir=%{_sharedstatedir}/openvswitch/pki make %{?_smp_mflags} popd /usr/bin/python3 build-aux/dpdkstrip.py \ --dpdk \ < rhel/usr_lib_systemd_system_ovs-vswitchd.service.in \ > rhel/usr_lib_systemd_system_ovs-vswitchd.service %install rm -rf $RPM_BUILD_ROOT make -C build-shared install-libLTLIBRARIES DESTDIR=$RPM_BUILD_ROOT make -C build-static install DESTDIR=$RPM_BUILD_ROOT install -d -m 0755 $RPM_BUILD_ROOT%{_rundir}/openvswitch install -d -m 0750 $RPM_BUILD_ROOT%{_localstatedir}/log/openvswitch install -d -m 0755 $RPM_BUILD_ROOT%{_sysconfdir}/openvswitch install -p -D -m 0644 rhel/usr_lib_udev_rules.d_91-vfio.rules \ $RPM_BUILD_ROOT%{_udevrulesdir}/91-vfio.rules install -p -D -m 0644 \ rhel/usr_share_openvswitch_scripts_systemd_sysconfig.template \ $RPM_BUILD_ROOT/%{_sysconfdir}/sysconfig/openvswitch for service in openvswitch ovsdb-server ovs-vswitchd \ ovs-delete-transient-ports; do install -p -D -m 0644 \ rhel/usr_lib_systemd_system_${service}.service \ $RPM_BUILD_ROOT%{_unitdir}/${service}.service done %if %{with ipsec} install -p -D -m 0644 rhel/usr_lib_systemd_system_openvswitch-ipsec.service \ $RPM_BUILD_ROOT%{_unitdir}/openvswitch-ipsec.service %endif install -m 0755 rhel/etc_init.d_openvswitch \ $RPM_BUILD_ROOT%{_datadir}/openvswitch/scripts/openvswitch.init install -p -D -m 0644 rhel/etc_openvswitch_default.conf \ $RPM_BUILD_ROOT/%{_sysconfdir}/openvswitch/default.conf install -p -D -m 0644 rhel/etc_logrotate.d_openvswitch \ $RPM_BUILD_ROOT/%{_sysconfdir}/logrotate.d/openvswitch install -m 0644 vswitchd/vswitch.ovsschema \ $RPM_BUILD_ROOT/%{_datadir}/openvswitch/vswitch.ovsschema install -d -m 0755 $RPM_BUILD_ROOT/%{_sysconfdir}/sysconfig/network-scripts/ install -p -m 0755 rhel/etc_sysconfig_network-scripts_ifdown-ovs \ $RPM_BUILD_ROOT/%{_sysconfdir}/sysconfig/network-scripts/ifdown-ovs install -p -m 0755 rhel/etc_sysconfig_network-scripts_ifup-ovs \ $RPM_BUILD_ROOT/%{_sysconfdir}/sysconfig/network-scripts/ifup-ovs install -d -m 0755 $RPM_BUILD_ROOT%{python3_sitelib} cp -a $RPM_BUILD_ROOT/%{_datadir}/openvswitch/python/ovstest \ $RPM_BUILD_ROOT%{python3_sitelib} # Build the JSON C extension for the Python lib (#1417738) pushd python ( export CPPFLAGS="-I ../include -I ../build-shared/include" export LDFLAGS="%{__global_ldflags} -L $RPM_BUILD_ROOT%{_libdir}" %py3_build %py3_install [ -f "$RPM_BUILD_ROOT/%{python3_sitearch}/ovs/_json$(python3-config --extension-suffix)" ] ) popd rm -rf $RPM_BUILD_ROOT/%{_datadir}/openvswitch/python/ install -d -m 0755 $RPM_BUILD_ROOT/%{_sharedstatedir}/openvswitch install -d -m 0755 $RPM_BUILD_ROOT%{_prefix}/lib/firewalld/services/ install -p -D -m 0755 \ rhel/usr_share_openvswitch_scripts_ovs-systemd-reload \ $RPM_BUILD_ROOT%{_datadir}/openvswitch/scripts/ovs-systemd-reload touch $RPM_BUILD_ROOT%{_sysconfdir}/openvswitch/conf.db # The db needs special permission as IPsec Pre-shared keys are stored in it. chmod 0640 $RPM_BUILD_ROOT%{_sysconfdir}/openvswitch/conf.db touch $RPM_BUILD_ROOT%{_sysconfdir}/openvswitch/system-id.conf # remove unpackaged files rm -f $RPM_BUILD_ROOT/%{_bindir}/ovs-benchmark \ $RPM_BUILD_ROOT/%{_bindir}/ovs-docker \ $RPM_BUILD_ROOT/%{_bindir}/ovs-parse-backtrace \ $RPM_BUILD_ROOT/%{_bindir}/ovs-testcontroller \ $RPM_BUILD_ROOT/%{_sbindir}/ovs-vlan-bug-workaround \ $RPM_BUILD_ROOT/%{_mandir}/man1/ovs-benchmark.1* \ $RPM_BUILD_ROOT/%{_mandir}/man8/ovs-testcontroller.* \ $RPM_BUILD_ROOT/%{_mandir}/man8/ovs-vlan-bug-workaround.8* %if ! %{with ipsec} rm -f $RPM_BUILD_ROOT/%{_datadir}/openvswitch/scripts/ovs-monitor-ipsec %endif # remove ovn unpackages files rm -f $RPM_BUILD_ROOT%{_bindir}/ovn* rm -f $RPM_BUILD_ROOT%{_mandir}/man1/ovn* rm -f $RPM_BUILD_ROOT%{_mandir}/man5/ovn* rm -f $RPM_BUILD_ROOT%{_mandir}/man7/ovn* rm -f $RPM_BUILD_ROOT%{_mandir}/man8/ovn* rm -f $RPM_BUILD_ROOT%{_datadir}/openvswitch/ovn* rm -f $RPM_BUILD_ROOT%{_datadir}/openvswitch/scripts/ovn* rm -f $RPM_BUILD_ROOT%{_includedir}/ovn/* %check %if %{with check} pushd build-static touch resolv.conf export OVS_RESOLV_CONF=$(pwd)/resolv.conf if make check TESTSUITEFLAGS='%{_smp_mflags}' || make check TESTSUITEFLAGS='--recheck'; then :; else cat tests/testsuite.log exit 1 fi popd %endif %if %{with check_datapath_kernel} pushd build-static if make check-kernel RECHECK=yes; then :; else cat tests/system-kmod-testsuite.log exit 1 fi popd %endif %clean rm -rf $RPM_BUILD_ROOT %preun %if 0%{?systemd_preun:1} %systemd_preun openvswitch.service %else if [ $1 -eq 0 ] ; then # Package removal, not upgrade /bin/systemctl --no-reload disable openvswitch.service >/dev/null 2>&1 || : /bin/systemctl stop openvswitch.service >/dev/null 2>&1 || : fi %endif %pre getent group openvswitch >/dev/null || groupadd -r openvswitch getent passwd openvswitch >/dev/null || \ useradd -r -g openvswitch -d / -s /sbin/nologin \ -c "Open vSwitch Daemons" openvswitch %ifarch %{dpdkarches} getent group hugetlbfs >/dev/null || groupadd hugetlbfs usermod -a -G hugetlbfs openvswitch %endif exit 0 %post if [ $1 -eq 1 ]; then sed -i 's:^#OVS_USER_ID=:OVS_USER_ID=:' /etc/sysconfig/openvswitch %ifarch %{dpdkarches} sed -i \ 's@OVS_USER_ID="openvswitch:openvswitch"@OVS_USER_ID="openvswitch:hugetlbfs"@'\ /etc/sysconfig/openvswitch %endif fi chown -R openvswitch:openvswitch /etc/openvswitch %if 0%{?systemd_post:1} %systemd_post openvswitch.service %else # Package install, not upgrade if [ $1 -eq 1 ]; then /bin/systemctl daemon-reload >dev/null || : fi %endif %postun %if 0%{?systemd_postun:1} %systemd_postun openvswitch.service %else /bin/systemctl daemon-reload >/dev/null 2>&1 || : %endif %triggerun -- openvswitch < 2.5.0-22.git20160727%{?dist} # old rpm versions restart the service in postun, but # due to systemd some preparation is needed. if systemctl is-active openvswitch >/dev/null 2>&1 ; then /usr/share/openvswitch/scripts/ovs-ctl stop >/dev/null 2>&1 || : systemctl daemon-reload >/dev/null 2>&1 || : systemctl stop openvswitch ovsdb-server ovs-vswitchd >/dev/null 2>&1 || : systemctl start openvswitch >/dev/null 2>&1 || : fi exit 0 %files -n python3-%{pkgname} %{python3_sitearch}/ovs %{python3_sitearch}/ovs-*.egg-info %doc LICENSE %files test %{_bindir}/ovs-pcap %{_bindir}/ovs-tcpdump %{_bindir}/ovs-tcpundump %{_mandir}/man1/ovs-pcap.1* %{_mandir}/man8/ovs-tcpdump.8* %{_mandir}/man1/ovs-tcpundump.1* %{_bindir}/ovs-test %{_bindir}/ovs-vlan-test %{_bindir}/ovs-l3ping %{_mandir}/man8/ovs-test.8* %{_mandir}/man8/ovs-vlan-test.8* %{_mandir}/man8/ovs-l3ping.8* %{python3_sitelib}/ovstest %files devel %{_libdir}/*.so %{_libdir}/pkgconfig/*.pc %{_includedir}/openvswitch/* %{_includedir}/openflow/* %exclude %{_libdir}/*.a %exclude %{_libdir}/*.la %if 0%{?rhel} > 7 || 0%{?fedora} > 28 %files -n network-scripts-%{name} %{_sysconfdir}/sysconfig/network-scripts/ifup-ovs %{_sysconfdir}/sysconfig/network-scripts/ifdown-ovs %endif %files %defattr(-,openvswitch,openvswitch) %dir %{_sysconfdir}/openvswitch %{_sysconfdir}/openvswitch/default.conf %config %ghost %verify(not owner group md5 size mtime) %{_sysconfdir}/openvswitch/conf.db %ghost %attr(0600,-,-) %verify(not owner group md5 size mtime) %{_sysconfdir}/openvswitch/.conf.db.~lock~ %config %ghost %{_sysconfdir}/openvswitch/system-id.conf %defattr(-,root,root) %config(noreplace) %verify(not md5 size mtime) %{_sysconfdir}/sysconfig/openvswitch %{_sysconfdir}/bash_completion.d/ovs-appctl-bashcomp.bash %{_sysconfdir}/bash_completion.d/ovs-vsctl-bashcomp.bash %config(noreplace) %{_sysconfdir}/logrotate.d/openvswitch %{_unitdir}/openvswitch.service %{_unitdir}/ovsdb-server.service %{_unitdir}/ovs-vswitchd.service %{_unitdir}/ovs-delete-transient-ports.service %{_datadir}/openvswitch/scripts/openvswitch.init %{_datadir}/openvswitch/scripts/ovs-check-dead-ifs %{_datadir}/openvswitch/scripts/ovs-lib %{_datadir}/openvswitch/scripts/ovs-save %{_datadir}/openvswitch/scripts/ovs-vtep %{_datadir}/openvswitch/scripts/ovs-ctl %{_datadir}/openvswitch/scripts/ovs-kmod-ctl %{_datadir}/openvswitch/scripts/ovs-systemd-reload %config %{_datadir}/openvswitch/vswitch.ovsschema %config %{_datadir}/openvswitch/vtep.ovsschema %{_bindir}/ovs-appctl %{_bindir}/ovs-dpctl %{_bindir}/ovs-ofctl %{_bindir}/ovs-vsctl %{_bindir}/ovsdb-client %{_bindir}/ovsdb-tool %{_bindir}/ovs-pki %{_bindir}/vtep-ctl %{_libdir}/*.so.* %{_sbindir}/ovs-vswitchd %{_sbindir}/ovsdb-server %{_mandir}/man1/ovsdb-client.1* %{_mandir}/man1/ovsdb-server.1* %{_mandir}/man1/ovsdb-tool.1* %{_mandir}/man5/ovsdb.5* %{_mandir}/man5/ovsdb-server.5.* %{_mandir}/man5/ovs-vswitchd.conf.db.5* %{_mandir}/man5/vtep.5* %{_mandir}/man7/ovsdb-server.7* %{_mandir}/man7/ovsdb.7* %{_mandir}/man7/ovs-actions.7* %{_mandir}/man7/ovs-fields.7* %{_mandir}/man8/vtep-ctl.8* %{_mandir}/man8/ovs-appctl.8* %{_mandir}/man8/ovs-ctl.8* %{_mandir}/man8/ovs-dpctl.8* %{_mandir}/man8/ovs-kmod-ctl.8.* %{_mandir}/man8/ovs-ofctl.8* %{_mandir}/man8/ovs-pki.8* %{_mandir}/man8/ovs-vsctl.8* %{_mandir}/man8/ovs-vswitchd.8* %{_mandir}/man8/ovs-parse-backtrace.8* %{_udevrulesdir}/91-vfio.rules %doc LICENSE NOTICE README.rst NEWS rhel/README.RHEL.rst %ifarch %{dpdkarches} %doc %{dpdkdir}/README.DPDK-PMDS %endif /var/lib/openvswitch %attr(750,openvswitch,openvswitch) %verify(not owner group) /var/log/openvswitch %ghost %attr(755,root,root) %verify(not owner group) %{_rundir}/openvswitch %{_datadir}/openvswitch/bugtool-plugins/ %{_datadir}/openvswitch/scripts/ovs-bugtool-* %{_bindir}/ovs-dpctl-top %{_sbindir}/ovs-bugtool %{_mandir}/man8/ovs-dpctl-top.8* %{_mandir}/man8/ovs-bugtool.8* %if (0%{?rhel} && 0%{?rhel} <= 7) || (0%{?fedora} && 0%{?fedora} < 29) %{_sysconfdir}/sysconfig/network-scripts/ifup-ovs %{_sysconfdir}/sysconfig/network-scripts/ifdown-ovs %endif %if %{with ipsec} %files ipsec %{_datadir}/openvswitch/scripts/ovs-monitor-ipsec %{_unitdir}/openvswitch-ipsec.service %endif %changelog * Thu Sep 16 2021 Open vSwitch CI - 2.16.0-8 - Merging upstream branch-2.16 [RH git: 7332b410fc] Commit list: facaf5bc71 netdev-linux: Fix a null pointer dereference in netdev_linux_notify_sock(). 6e203d4873 pcap-file: Fix memory leak in ovs_pcap_open(). f50da0b267 odp-util: Fix a null pointer dereference in odp_flow_format(). 7da752e43f odp-util: Fix a null pointer dereference in odp_nsh_key_from_attr__(). bc22b01459 netdev-dpdk: Fix RSS configuration for virtio. 81706c5d43 ipf: Fix only nat the first fragment in the reass process. * Wed Sep 08 2021 Open vSwitch CI - 2.16.0-7 - Merging upstream branch-2.16 [RH git: e71f31dfd6] Commit list: 242c280f0e dpif-netdev: Fix crash when PACKET_OUT is metered. * Tue Aug 31 2021 Ilya Maximets - 2.16.0-6 - ovsdb: monitor: Store serialized json in a json cache. [RH git: bc20330c85] (#1996152) commit 43e66fc27659af2a5c976bdd27fe747b442b5554 Author: Ilya Maximets Date: Tue Aug 24 21:00:39 2021 +0200 Same json from a json cache is typically sent to all the clients, e.g., in case of OVN deployment with ovn-monitor-all=true. There could be hundreds or thousands connected clients and ovsdb will serialize the same json object for each of them before sending. Serializing it once before storing into json cache to speed up processing. This change allows to save a lot of CPU cycles and a bit of memory since we need to store in memory only a string and not the full json object. Testing with ovn-heater on 120 nodes using density-heavy scenario shows reduction of the total CPU time used by Southbound DB processes from 256 minutes to 147. Duration of unreasonably long poll intervals also reduced dramatically from 7 to 2 seconds: Count Min Max Median Mean 95 percentile ------------------------------------------------------------- Before 1934 1012 7480 4302.5 4875.3 7034.3 After 1909 1004 2730 1453.0 1532.5 2053.6 Acked-by: Dumitru Ceara Acked-by: Han Zhou Signed-off-by: Ilya Maximets Reported-at: https://bugzilla.redhat.com/show_bug.cgi?id=1996152 Signed-off-by: Ilya Maximets * Tue Aug 31 2021 Ilya Maximets - 2.16.0-5 - raft: Don't keep full json objects in memory if no longer needed. [RH git: 4606423e8b] (#1990058) commit 0de882954032aa37dc943bafd72c33324aa0c95a Author: Ilya Maximets Date: Tue Aug 24 21:00:38 2021 +0200 raft: Don't keep full json objects in memory if no longer needed. Raft log entries (and raft database snapshot) contains json objects of the data. Follower receives append requests with data that gets parsed and added to the raft log. Leader receives execution requests, parses data out of them and adds to the log. In both cases, later ovsdb-server reads the log with ovsdb_storage_read(), constructs transaction and updates the database. On followers these json objects in common case are never used again. Leader may use them to send append requests or snapshot installation requests to followers. However, all these operations (except for ovsdb_storage_read()) are just serializing the json in order to send it over the network. Json objects are significantly larger than their serialized string representation. For example, the snapshot of the database from one of the ovn-heater scale tests takes 270 MB as a string, but 1.6 GB as a json object from the total 3.8 GB consumed by ovsdb-server process. ovsdb_storage_read() for a given raft entry happens only once in a lifetime, so after this call, we can serialize the json object, store the string representation and free the actual json object that ovsdb will never need again. This can save a lot of memory and can also save serialization time, because each raft entry for append requests and snapshot installation requests serialized only once instead of doing that every time such request needs to be sent. JSON_SERIALIZED_OBJECT can be used in order to seamlessly integrate pre-serialized data into raft_header and similar json objects. One major special case is creation of a database snapshot. Snapshot installation request received over the network will be parsed and read by ovsdb-server just like any other raft log entry. However, snapshots created locally with raft_store_snapshot() will never be read back, because they reflect the current state of the database, hence already applied. For this case we can free the json object right after writing snapshot on disk. Tests performed with ovn-heater on 60 node density-light scenario, where on-disk database goes up to 97 MB, shows average memory consumption of ovsdb-server Southbound DB processes decreased by 58% (from 602 MB to 256 MB per process) and peak memory consumption decreased by 40% (from 1288 MB to 771 MB). Test with 120 nodes on density-heavy scenario with 270 MB on-disk database shows 1.5 GB memory consumption decrease as expected. Also, total CPU time consumed by the Southbound DB process reduced from 296 to 256 minutes. Number of unreasonably long poll intervals reduced from 2896 down to 1934. Deserialization is also implemented just in case. I didn't see this function being invoked in practice. Acked-by: Dumitru Ceara Acked-by: Han Zhou Signed-off-by: Ilya Maximets Reported-at: https://bugzilla.redhat.com/show_bug.cgi?id=1990058 Signed-off-by: Ilya Maximets * Tue Aug 31 2021 Ilya Maximets - 2.16.0-4 - json: Add support for partially serialized json objects. [RH git: 885e5ce1b5] (#1990058) commit b0bca6f27aae845c3ca8b48d66a7dbd3d978162a Author: Ilya Maximets Date: Tue Aug 24 21:00:37 2021 +0200 json: Add support for partially serialized json objects. Introducing a new json type JSON_SERIALIZED_OBJECT. It's not an actual type that can be seen in a json message on a wire, but internal type that is intended to hold a serialized version of some other json object. For this reason it's defined after the JSON_N_TYPES to not confuse parsers and other parts of the code that relies on compliance with RFC 4627. With this JSON type internal users may construct large JSON objects, parts of which are already serialized. This way, while serializing the larger object, data from JSON_SERIALIZED_OBJECT can be added directly to the result, without additional processing. This will be used by next commits to add pre-serialized JSON data to the raft_header structure, that can be converted to a JSON before writing the file transaction on disk or sending to other servers. Same technique can also be used to pre-serialize json_cache for ovsdb monitors, this should allow to not perform serialization for every client and will save some more memory. Since serialized JSON is just a string, reusing the 'json->string' pointer for it. Acked-by: Dumitru Ceara Acked-by: Han Zhou Signed-off-by: Ilya Maximets Reported-at: https://bugzilla.redhat.com/show_bug.cgi?id=1990058 Signed-off-by: Ilya Maximets * Tue Aug 31 2021 Ilya Maximets - 2.16.0-3 - json: Optimize string serialization. [RH git: bb1654da63] (#1990069) commit 748010ff304b7cd2c43f4eb98a554433f0df07f9 Author: Ilya Maximets Date: Tue Aug 24 23:07:22 2021 +0200 json: Optimize string serialization. Current string serialization code puts all characters one by one. This is slow because dynamic string needs to perform length checks on every ds_put_char() and it's also doesn't allow compiler to use better memory copy operations, i.e. doesn't allow copying few bytes at once. Special symbols are rare in a typical database. Quotes are frequent, but not too frequent. In databases created by ovn-kubernetes, for example, usually there are at least 10 to 50 chars between quotes. So, it's better to count characters that doesn't require escaping and use fast data copy for the whole sequential block. Testing with a synthetic benchmark (included) on my laptop shows following performance improvement: Size Q S Before After Diff ----------------------------------------------------- 100000 0 0 : 0.227 ms 0.142 ms -37.4 % 100000 2 1 : 0.277 ms 0.186 ms -32.8 % 100000 10 1 : 0.361 ms 0.309 ms -14.4 % 10000000 0 0 : 22.720 ms 12.160 ms -46.4 % 10000000 2 1 : 27.470 ms 19.300 ms -29.7 % 10000000 10 1 : 37.950 ms 31.250 ms -17.6 % 100000000 0 0 : 239.600 ms 126.700 ms -47.1 % 100000000 2 1 : 292.400 ms 188.600 ms -35.4 % 100000000 10 1 : 387.700 ms 321.200 ms -17.1 % Here Q - probability (%) for a character to be a '\"' and S - probability (%) to be a special character ( < 32). Testing with a closer to real world scenario shows overall decrease of the time needed for database compaction by ~5-10 %. And this change also decreases CPU consumption in general, because string serialization is used in many different places including ovsdb monitors and raft. Signed-off-by: Ilya Maximets Acked-by: Numan Siddique Acked-by: Dumitru Ceara Reported-at: https://bugzilla.redhat.com/show_bug.cgi?id=1990069 Signed-off-by: Ilya Maximets * Fri Aug 20 2021 Open vSwitch CI - 2.16.0-2 - Merging upstream branch-2.16 [RH git: 7d7567e339] Commit list: 0991ea8d19 Prepare for 2.16.1. * Wed Aug 18 2021 Flavio Leitner - 2.16.0-1 - redhat: First 2.16.0 release. [RH git: 0a1c4276cc]