os-vif 4.1.0__tar.gz → 4.2.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of os-vif might be problematic. Click here for more details.
- {os_vif-4.1.0 → os_vif-4.2.1}/.zuul.yaml +0 -1
- {os_vif-4.1.0 → os_vif-4.2.1}/AUTHORS +2 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/ChangeLog +13 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/PKG-INFO +1 -1
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/unit/internal/ip/linux/test_impl_pyroute2.py +26 -17
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif.egg-info/PKG-INFO +1 -1
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif.egg-info/SOURCES.txt +2 -0
- os_vif-4.2.1/os_vif.egg-info/pbr.json +1 -0
- os_vif-4.2.1/pyproject.toml +3 -0
- os_vif-4.2.1/releasenotes/source/2025.1.rst +6 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/index.rst +1 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/ovs.py +6 -5
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/ovsdb/ovsdb_lib.py +16 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/tests/functional/test_plugin.py +62 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/tests/unit/ovsdb/test_ovsdb_lib.py +12 -2
- os_vif-4.1.0/os_vif.egg-info/pbr.json +0 -1
- {os_vif-4.1.0 → os_vif-4.2.1}/.coveragerc +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/.mailmap +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/.pre-commit-config.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/.stestr.conf +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/CONTRIBUTING.rst +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/HACKING.rst +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/LICENSE +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/README.rst +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/bindep.txt +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/doc/requirements.txt +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/doc/source/conf.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/doc/source/contributor/contributing.rst +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/doc/source/index.rst +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/doc/source/reference/glossary.rst +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/doc/source/user/host-info.rst +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/doc/source/user/plugins/linux-bridge.rst +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/doc/source/user/plugins/noop.rst +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/doc/source/user/plugins/ovs.rst +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/doc/source/user/usage.rst +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/doc/source/user/vif-types.rst +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/__init__.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/exception.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/i18n.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/internal/__init__.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/internal/ip/__init__.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/internal/ip/api.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/internal/ip/ip_command.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/internal/ip/linux/__init__.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/internal/ip/linux/impl_pyroute2.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/objects/__init__.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/objects/base.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/objects/fields.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/objects/fixed_ip.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/objects/host_info.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/objects/instance_info.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/objects/network.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/objects/route.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/objects/subnet.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/objects/vif.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/opts.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/plugin.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/__init__.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/functional/__init__.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/functional/base.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/functional/internal/__init__.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/functional/internal/command/__init__.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/functional/internal/command/ip/__init__.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/functional/internal/command/ip/test_impl_pyroute2.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/functional/privsep.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/unit/__init__.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/unit/base.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/unit/internal/__init__.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/unit/internal/ip/__init__.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/unit/internal/ip/linux/__init__.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/unit/internal/ip/test_api.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/unit/test_base.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/unit/test_exception.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/unit/test_host_info.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/unit/test_objects.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/unit/test_os_vif.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/unit/test_vif.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/utils.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/version.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif.egg-info/dependency_links.txt +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif.egg-info/entry_points.txt +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif.egg-info/not-zip-safe +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif.egg-info/requires.txt +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/os_vif.egg-info/top_level.txt +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/playbooks/openstack-tox-functional-ovs-with-sudo/Debian.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/playbooks/openstack-tox-functional-ovs-with-sudo/Gentoo.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/playbooks/openstack-tox-functional-ovs-with-sudo/RedHat.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/playbooks/openstack-tox-functional-ovs-with-sudo/Suse.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/playbooks/openstack-tox-functional-ovs-with-sudo/pre.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/OVSVif-hybrid-unplug-f37bf57bc8e913de.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/add-abstract-ovsdb-api-8f04df58d4ed5b73.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/add-fast-path-vhostuser-support-fe87e558326909b6.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/add-no-op-plugin-763a6703e7328a24.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/add-ovs-representor-portprofile-5f8290e5a40bf0a4.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/add-ovs-vhostuser-support-2ba8de51c1f3a244.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/add-ovsdb-native-322fffb49c91503d.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/always-plug-vifs-for-ovs-1d033fc49a9c6c4e.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/brctl-removal-a5b0e69b865afa57.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/bug-1892132-812e6d5ce0588ebb.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/contextlib-and-nested-with-statements-2747a9ebb9a5bfd7.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/default-qos-policy-for-ovs-26f8806046a59c82.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/default-to-native-ovsdb-driver-112fb5adf6e19a30.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/deprecate-linuxbridge-support-d278d4bbdff8e8bc.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/deprecate-windows-support-49f5ca1b1a1f4d66.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/do-not-force-mac-ageing-c6e8d750130c5740.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/drop-py36-support-0e9b07073f6ad73f.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/drop-python2-support-7a4bc7d31253c1e5.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/ensure-ovs-bridge-a0c1b51f469c92d0.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/extend-vhostuser-object-fada14a1457d4e56.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/fix-broken-dataplane-on-nova-restart-with-isolate_vif-71617a41741b33e8.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/fix-ovs-plugin-describe-049750609559f1ba.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/fix-stevedore-entrypoints-8002ec7a5166c977.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/fix-vif-openvswitch-fa0d19be9dd668e1.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/generic-datapath-offloads-41cabb6842b41533.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/initial-release-2c71d6bbf55f763b.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/oslo-config-opts-entrypoints-e83f907b686d774a.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/per-port-bridge-c6a50179a0256de3.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/port-profile-info-linux-bridge-4800f5a0b7328615.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/port-profile-info-ovs-63b46a3eafc11de2.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/prevent-lb-reply-arp-6459133bfb056069.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/remove-py38-e0701b3363079bbf.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/remove-windows-23df1c587d505d72.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/remove_iptools_implementation-2eb866573a680e61.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/revert-always-plug-port-for-ovs-hybrid-plug-false-dc015985cbc5443b.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/vhost-user-mtu-support-cbc7d02a6665fab1.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/vhost-user-reconnect-fa4cbb731b787f71.yaml +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/2023.1.rst +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/2023.2.rst +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/2024.1.rst +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/2024.2.rst +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/_static/.placeholder +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/_templates/.placeholder +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/conf.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/newton.rst +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/ocata.rst +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/pike.rst +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/queens.rst +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/rocky.rst +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/stein.rst +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/train.rst +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/unreleased.rst +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/ussuri.rst +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/victoria.rst +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/wallaby.rst +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/xena.rst +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/yoga.rst +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/zed.rst +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/requirements.txt +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/setup.cfg +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/setup.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/test-requirements.txt +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/tox.ini +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_linux_bridge/__init__.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_linux_bridge/constants.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_linux_bridge/iptables.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_linux_bridge/linux_bridge.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_linux_bridge/linux_net.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_linux_bridge/privsep.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_linux_bridge/tests/__init__.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_linux_bridge/tests/unit/__init__.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_linux_bridge/tests/unit/test_linux_net.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_linux_bridge/tests/unit/test_plugin.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_noop/__init__.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_noop/noop.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_noop/tests/__init__.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_noop/tests/unit/__init__.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_noop/tests/unit/test_plugin.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/__init__.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/constants.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/exception.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/linux_net.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/ovsdb/__init__.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/ovsdb/api.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/ovsdb/impl_idl.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/ovsdb/impl_vsctl.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/privsep.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/tests/__init__.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/tests/functional/__init__.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/tests/functional/base.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/tests/functional/ovsdb/__init__.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/tests/functional/ovsdb/test_ovsdb_lib.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/tests/unit/__init__.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/tests/unit/ovsdb/__init__.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/tests/unit/test_linux_net.py +0 -0
- {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/tests/unit/test_plugin.py +0 -0
|
@@ -10,6 +10,7 @@ ChangBo Guo(gcb) <eric.guo@easystack.cn>
|
|
|
10
10
|
Charles Short <chucks@redhat.com>
|
|
11
11
|
Claudiu Belu <cbelu@cloudbasesolutions.com>
|
|
12
12
|
Corey Bryant <corey.bryant@canonical.com>
|
|
13
|
+
Cyril Roelandt <cyril@redhat.com>
|
|
13
14
|
Daniel P. Berrange <berrange@redhat.com>
|
|
14
15
|
Davanum Srinivas <davanum@gmail.com>
|
|
15
16
|
David Vallee Delisle <dvd@redhat.com>
|
|
@@ -69,6 +70,7 @@ YAMAMOTO Takashi <yamamoto@midokura.com>
|
|
|
69
70
|
ZhijunWei <wzj334965317@outlook.com>
|
|
70
71
|
blue55 <yllan@fiberhome.com>
|
|
71
72
|
caoyuan <cao.yuan@99cloud.net>
|
|
73
|
+
elajkat <lajos.katona@est.tech>
|
|
72
74
|
ericxiett <eric_xiett@163.com>
|
|
73
75
|
gecong1973 <ge.cong@zte.com.cn>
|
|
74
76
|
jacky06 <zhang.min@99cloud.net>
|
|
@@ -1,6 +1,19 @@
|
|
|
1
1
|
CHANGES
|
|
2
2
|
=======
|
|
3
3
|
|
|
4
|
+
4.2.1
|
|
5
|
+
-----
|
|
6
|
+
|
|
7
|
+
* Zuul: do not use USE\_PYTHON3
|
|
8
|
+
|
|
9
|
+
4.2.0
|
|
10
|
+
-----
|
|
11
|
+
|
|
12
|
+
* OVS Trunk: Add bridge\_name to external\_ids
|
|
13
|
+
* add pyproject.toml to support pip 23.1
|
|
14
|
+
* Adapt unit tests to pyroute2 0.9.1
|
|
15
|
+
* Update master for stable/2025.1
|
|
16
|
+
|
|
4
17
|
4.1.0
|
|
5
18
|
-----
|
|
6
19
|
|
|
@@ -38,12 +38,14 @@ class TestIpCommand(base.TestCase):
|
|
|
38
38
|
def setUp(self):
|
|
39
39
|
super(TestIpCommand, self).setUp()
|
|
40
40
|
self.ip = impl_pyroute2.PyRoute2()
|
|
41
|
-
self.ip_link_p = mock.patch.object(iproute.IPRoute, 'link'
|
|
41
|
+
self.ip_link_p = mock.patch.object(iproute.IPRoute, 'link',
|
|
42
|
+
create=True)
|
|
42
43
|
self.ip_link = self.ip_link_p.start()
|
|
43
44
|
|
|
44
45
|
def test_set(self):
|
|
45
|
-
with mock.patch.object(
|
|
46
|
-
|
|
46
|
+
with mock.patch.object(
|
|
47
|
+
iproute.IPRoute, 'link_lookup', return_value=[1],
|
|
48
|
+
create=True) as mock_link_lookup:
|
|
47
49
|
self.ip_link.return_value = [{'flags': 0x4000}]
|
|
48
50
|
self.ip.set(self.DEVICE, state=self.UP, mtu=self.MTU,
|
|
49
51
|
address=self.MAC, promisc=True)
|
|
@@ -57,8 +59,9 @@ class TestIpCommand(base.TestCase):
|
|
|
57
59
|
self.ip_link.assert_has_calls(calls)
|
|
58
60
|
|
|
59
61
|
def test_set_exit_code(self):
|
|
60
|
-
with mock.patch.object(
|
|
61
|
-
|
|
62
|
+
with mock.patch.object(
|
|
63
|
+
iproute.IPRoute, 'link_lookup', return_value=[1],
|
|
64
|
+
create=True) as mock_link_lookup:
|
|
62
65
|
self.ip_link.side_effect = ipexc.NetlinkError(self.ERROR_CODE,
|
|
63
66
|
msg="Error message")
|
|
64
67
|
|
|
@@ -70,8 +73,9 @@ class TestIpCommand(base.TestCase):
|
|
|
70
73
|
check_exit_code=[self.OTHER_ERROR_CODE])
|
|
71
74
|
|
|
72
75
|
def test_set_no_interface_found(self):
|
|
73
|
-
with mock.patch.object(
|
|
74
|
-
|
|
76
|
+
with mock.patch.object(
|
|
77
|
+
iproute.IPRoute, 'link_lookup', return_value=[],
|
|
78
|
+
create=True) as mock_link_lookup:
|
|
75
79
|
self.assertRaises(exception.NetworkInterfaceNotFound, self.ip.set,
|
|
76
80
|
self.DEVICE)
|
|
77
81
|
mock_link_lookup.assert_called_once_with(ifname=self.DEVICE)
|
|
@@ -83,8 +87,9 @@ class TestIpCommand(base.TestCase):
|
|
|
83
87
|
'add', ifname=self.DEVICE, kind=self.TYPE_VETH, peer='peer')
|
|
84
88
|
|
|
85
89
|
def test_add_vlan(self):
|
|
86
|
-
with mock.patch.object(
|
|
87
|
-
|
|
90
|
+
with mock.patch.object(
|
|
91
|
+
iproute.IPRoute, 'link_lookup', return_value=[1],
|
|
92
|
+
create=True) as mock_link_lookup:
|
|
88
93
|
self.ip.add(self.DEVICE, self.TYPE_VLAN, link=self.LINK,
|
|
89
94
|
vlan_id=self.VLAN_ID)
|
|
90
95
|
mock_link_lookup.assert_called_once_with(ifname=self.LINK)
|
|
@@ -114,8 +119,9 @@ class TestIpCommand(base.TestCase):
|
|
|
114
119
|
self.ip_link.assert_called_once_with('add', **args)
|
|
115
120
|
|
|
116
121
|
def test_add_vlan_no_interface_found(self):
|
|
117
|
-
with mock.patch.object(
|
|
118
|
-
|
|
122
|
+
with mock.patch.object(
|
|
123
|
+
iproute.IPRoute, 'link_lookup', return_value=[],
|
|
124
|
+
create=True) as mock_link_lookup:
|
|
119
125
|
self.assertRaises(exception.NetworkInterfaceNotFound, self.ip.add,
|
|
120
126
|
self.DEVICE, self.TYPE_VLAN, link=self.LINK)
|
|
121
127
|
mock_link_lookup.assert_called_once_with(ifname=self.LINK)
|
|
@@ -141,22 +147,25 @@ class TestIpCommand(base.TestCase):
|
|
|
141
147
|
check_exit_code=[self.OTHER_ERROR_CODE])
|
|
142
148
|
|
|
143
149
|
def test_delete(self):
|
|
144
|
-
with mock.patch.object(
|
|
145
|
-
|
|
150
|
+
with mock.patch.object(
|
|
151
|
+
iproute.IPRoute, 'link_lookup', return_value=[1],
|
|
152
|
+
create=True) as mock_link_lookup:
|
|
146
153
|
self.ip.delete(self.DEVICE)
|
|
147
154
|
mock_link_lookup.assert_called_once_with(ifname=self.DEVICE)
|
|
148
155
|
self.ip_link.assert_called_once_with('del', index=1)
|
|
149
156
|
|
|
150
157
|
def test_delete_no_interface_found(self):
|
|
151
|
-
with mock.patch.object(
|
|
152
|
-
|
|
158
|
+
with mock.patch.object(
|
|
159
|
+
iproute.IPRoute, 'link_lookup', return_value=[],
|
|
160
|
+
create=True) as mock_link_lookup:
|
|
153
161
|
self.assertRaises(exception.NetworkInterfaceNotFound,
|
|
154
162
|
self.ip.delete, self.DEVICE)
|
|
155
163
|
mock_link_lookup.assert_called_once_with(ifname=self.DEVICE)
|
|
156
164
|
|
|
157
165
|
def test_delete_exit_code(self):
|
|
158
|
-
with mock.patch.object(
|
|
159
|
-
|
|
166
|
+
with mock.patch.object(
|
|
167
|
+
iproute.IPRoute, 'link_lookup', return_value=[1],
|
|
168
|
+
create=True) as mock_link_lookup:
|
|
160
169
|
self.ip_link.side_effect = ipexc.NetlinkError(self.ERROR_CODE,
|
|
161
170
|
msg="Error message")
|
|
162
171
|
|
|
@@ -10,6 +10,7 @@ HACKING.rst
|
|
|
10
10
|
LICENSE
|
|
11
11
|
README.rst
|
|
12
12
|
bindep.txt
|
|
13
|
+
pyproject.toml
|
|
13
14
|
requirements.txt
|
|
14
15
|
setup.cfg
|
|
15
16
|
setup.py
|
|
@@ -124,6 +125,7 @@ releasenotes/source/2023.1.rst
|
|
|
124
125
|
releasenotes/source/2023.2.rst
|
|
125
126
|
releasenotes/source/2024.1.rst
|
|
126
127
|
releasenotes/source/2024.2.rst
|
|
128
|
+
releasenotes/source/2025.1.rst
|
|
127
129
|
releasenotes/source/conf.py
|
|
128
130
|
releasenotes/source/index.rst
|
|
129
131
|
releasenotes/source/newton.rst
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"git_version": "b33415b", "is_release": true}
|
|
@@ -34,6 +34,10 @@ from vif_plug_ovs.ovsdb import ovsdb_lib
|
|
|
34
34
|
LOG = logging.getLogger(__name__)
|
|
35
35
|
|
|
36
36
|
|
|
37
|
+
def is_trunk_bridge(bridge_name):
|
|
38
|
+
return bridge_name.startswith(constants.TRUNK_BR_PREFIX)
|
|
39
|
+
|
|
40
|
+
|
|
37
41
|
class OvsPlugin(plugin.PluginBase):
|
|
38
42
|
"""An OVS plugin that can setup VIFs in many ways
|
|
39
43
|
|
|
@@ -204,7 +208,7 @@ class OvsPlugin(plugin.PluginBase):
|
|
|
204
208
|
bridge = kwargs.pop('bridge', vif.network.bridge)
|
|
205
209
|
# See bug #2069543.
|
|
206
210
|
if (self._isolate_vif(vif_name, bridge) and
|
|
207
|
-
not
|
|
211
|
+
not is_trunk_bridge(bridge)):
|
|
208
212
|
kwargs['tag'] = constants.DEAD_VLAN
|
|
209
213
|
kwargs['vlan_mode'] = 'trunk'
|
|
210
214
|
kwargs['trunks'] = constants.DEAD_VLAN
|
|
@@ -388,11 +392,8 @@ class OvsPlugin(plugin.PluginBase):
|
|
|
388
392
|
vif=vif,
|
|
389
393
|
err="This vif type is not supported by this plugin")
|
|
390
394
|
|
|
391
|
-
def _is_trunk_bridge(self, bridge_name):
|
|
392
|
-
return bridge_name.startswith(constants.TRUNK_BR_PREFIX)
|
|
393
|
-
|
|
394
395
|
def _delete_bridge_if_trunk(self, vif):
|
|
395
|
-
if
|
|
396
|
+
if is_trunk_bridge(vif.network.bridge):
|
|
396
397
|
self.ovsdb.delete_ovs_bridge(vif.network.bridge)
|
|
397
398
|
|
|
398
399
|
def _unplug_vhostuser(self, vif, instance_info):
|
|
@@ -16,6 +16,7 @@ from oslo_log import log as logging
|
|
|
16
16
|
|
|
17
17
|
from vif_plug_ovs import constants
|
|
18
18
|
from vif_plug_ovs import linux_net
|
|
19
|
+
from vif_plug_ovs import ovs
|
|
19
20
|
from vif_plug_ovs.ovsdb import api as ovsdb_api
|
|
20
21
|
|
|
21
22
|
|
|
@@ -167,6 +168,21 @@ class BaseOVS(object):
|
|
|
167
168
|
'iface-status': 'active',
|
|
168
169
|
'attached-mac': mac,
|
|
169
170
|
'vm-uuid': instance_id}
|
|
171
|
+
|
|
172
|
+
# Note(lajoskatona): Neutron fills external_ids for trunk, see:
|
|
173
|
+
# https://opendev.org/openstack/neutron/src/commit/
|
|
174
|
+
# 1bc4b526e9c743423069ab4cf6ef3883d5e48217/neutron/services/trunk/
|
|
175
|
+
# drivers/openvswitch/agent/ovsdb_handler.py#L418
|
|
176
|
+
# The following keys are added there: bridge_name, trunk_id and
|
|
177
|
+
# subport_ids. These values are used during the cleanup after the
|
|
178
|
+
# deletion of the trunk. It can happen that Neutron can't fill these
|
|
179
|
+
# fields.
|
|
180
|
+
# In os-vif when the plug happens we can use the same transaction to
|
|
181
|
+
# add bridge_name to external_ids in case of it is a trunk.
|
|
182
|
+
# By this Neutron can do the cleanup of trunk related interfaces.
|
|
183
|
+
if ovs.is_trunk_bridge(bridge):
|
|
184
|
+
external_ids['bridge_name'] = bridge
|
|
185
|
+
|
|
170
186
|
col_values = [('external_ids', external_ids)] if set_ids else []
|
|
171
187
|
if interface_type:
|
|
172
188
|
col_values.append(('type', interface_type))
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
import testscenarios
|
|
14
14
|
import time
|
|
15
15
|
from unittest import mock
|
|
16
|
+
import uuid
|
|
16
17
|
|
|
17
18
|
from oslo_concurrency import processutils
|
|
18
19
|
from oslo_config import cfg
|
|
@@ -218,3 +219,64 @@ class TestOVSPlugin(testscenarios.WithScenarios,
|
|
|
218
219
|
self.plugin.plug(vif, self.instance)
|
|
219
220
|
self.addCleanup(self._del_bridge, 'tbr-ef98b384')
|
|
220
221
|
self._check_parameter('Port', vif.vif_name, 'tag', [])
|
|
222
|
+
|
|
223
|
+
def test_plug_trunk_bridge_fills_bridge_name(self):
|
|
224
|
+
mac = 'ca:fe:de:ad:be:ef'
|
|
225
|
+
iface_id = str(uuid.uuid4())
|
|
226
|
+
vif_name = 'port-%s' % iface_id[:8]
|
|
227
|
+
trunk_id = str(uuid.uuid4())
|
|
228
|
+
bridge_name = 'tbr-%s' % trunk_id[:8]
|
|
229
|
+
|
|
230
|
+
network = objects.network.Network(
|
|
231
|
+
id=trunk_id,
|
|
232
|
+
bridge=bridge_name,
|
|
233
|
+
subnets=self.subnets,
|
|
234
|
+
vlan=99)
|
|
235
|
+
vif = objects.vif.VIFOpenVSwitch(
|
|
236
|
+
id=iface_id,
|
|
237
|
+
address=mac,
|
|
238
|
+
network=network,
|
|
239
|
+
port_profile=self.profile_ovs_system,
|
|
240
|
+
vif_name=vif_name)
|
|
241
|
+
self.plugin.plug(vif, self.instance)
|
|
242
|
+
self.addCleanup(self._del_bridge, bridge_name)
|
|
243
|
+
expected_external_ids = {
|
|
244
|
+
'attached-mac': mac,
|
|
245
|
+
'bridge_name': bridge_name,
|
|
246
|
+
'iface-id': self.profile_ovs.interface_id,
|
|
247
|
+
'iface-status': 'active',
|
|
248
|
+
'vm-uuid': self.instance.uuid,
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
self._check_parameter('Interface', vif.vif_name,
|
|
252
|
+
'external_ids', expected_external_ids)
|
|
253
|
+
|
|
254
|
+
def test_plug_non_trunk_leave_bridge_name_empty(self):
|
|
255
|
+
mac = 'ca:fe:de:ad:be:ef'
|
|
256
|
+
iface_id = str(uuid.uuid4())
|
|
257
|
+
vif_name = 'port-%s' % iface_id[:8]
|
|
258
|
+
bridge_name = 'br-something'
|
|
259
|
+
|
|
260
|
+
network = objects.network.Network(
|
|
261
|
+
id=str(uuid.uuid4()),
|
|
262
|
+
bridge=bridge_name,
|
|
263
|
+
subnets=self.subnets,
|
|
264
|
+
vlan=99)
|
|
265
|
+
vif = objects.vif.VIFOpenVSwitch(
|
|
266
|
+
id=iface_id,
|
|
267
|
+
address=mac,
|
|
268
|
+
network=network,
|
|
269
|
+
port_profile=self.profile_ovs_system,
|
|
270
|
+
vif_name=vif_name)
|
|
271
|
+
self.plugin.plug(vif, self.instance)
|
|
272
|
+
self.addCleanup(self._del_bridge, bridge_name)
|
|
273
|
+
# bridge_name is filled only in case of trunk plug
|
|
274
|
+
expected_external_ids = {
|
|
275
|
+
'attached-mac': mac,
|
|
276
|
+
'iface-id': self.profile_ovs.interface_id,
|
|
277
|
+
'iface-status': 'active',
|
|
278
|
+
'vm-uuid': self.instance.uuid,
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
self._check_parameter('Interface', vif.vif_name,
|
|
282
|
+
'external_ids', expected_external_ids)
|
|
@@ -89,19 +89,22 @@ class BaseOVSTest(testtools.TestCase):
|
|
|
89
89
|
)
|
|
90
90
|
mock_set_mtu_request.assert_not_called()
|
|
91
91
|
|
|
92
|
-
def
|
|
92
|
+
def _test_create_ovs_vif_port(self, bridge_name='bridge',
|
|
93
|
+
check_br_name=False):
|
|
93
94
|
iface_id = 'iface_id'
|
|
94
95
|
mac = 'ca:fe:ca:fe:ca:fe'
|
|
95
96
|
instance_id = uuidutils.generate_uuid()
|
|
96
97
|
interface_type = constants.OVS_VHOSTUSER_INTERFACE_TYPE
|
|
97
98
|
vhost_server_path = '/fake/path'
|
|
98
99
|
device = 'device'
|
|
99
|
-
bridge =
|
|
100
|
+
bridge = bridge_name
|
|
100
101
|
mtu = 1500
|
|
101
102
|
external_ids = {'iface-id': iface_id,
|
|
102
103
|
'iface-status': 'active',
|
|
103
104
|
'attached-mac': mac,
|
|
104
105
|
'vm-uuid': instance_id}
|
|
106
|
+
if check_br_name:
|
|
107
|
+
external_ids['bridge_name'] = bridge_name
|
|
105
108
|
values = [('external_ids', external_ids),
|
|
106
109
|
('type', interface_type),
|
|
107
110
|
('options', {'vhost-server-path': vhost_server_path})
|
|
@@ -128,6 +131,13 @@ class BaseOVSTest(testtools.TestCase):
|
|
|
128
131
|
]
|
|
129
132
|
)
|
|
130
133
|
|
|
134
|
+
def test_create_ovs_vif_port(self):
|
|
135
|
+
self._test_create_ovs_vif_port()
|
|
136
|
+
|
|
137
|
+
def test_create_ovs_vif_port_for_trunk(self):
|
|
138
|
+
self._test_create_ovs_vif_port(bridge_name='tbr-12345',
|
|
139
|
+
check_br_name=True)
|
|
140
|
+
|
|
131
141
|
def test_create_ovs_vif_port_type_dpdk(self):
|
|
132
142
|
iface_id = 'iface_id'
|
|
133
143
|
mac = 'ca:fe:ca:fe:ca:fe'
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"git_version": "acdd974", "is_release": true}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/functional/internal/command/ip/test_impl_pyroute2.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/add-abstract-ovsdb-api-8f04df58d4ed5b73.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/add-ovs-vhostuser-support-2ba8de51c1f3a244.yaml
RENAMED
|
File without changes
|
|
File without changes
|
{os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/always-plug-vifs-for-ovs-1d033fc49a9c6c4e.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/default-qos-policy-for-ovs-26f8806046a59c82.yaml
RENAMED
|
File without changes
|
|
File without changes
|
{os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/deprecate-linuxbridge-support-d278d4bbdff8e8bc.yaml
RENAMED
|
File without changes
|
{os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/deprecate-windows-support-49f5ca1b1a1f4d66.yaml
RENAMED
|
File without changes
|
{os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/do-not-force-mac-ageing-c6e8d750130c5740.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/extend-vhostuser-object-fada14a1457d4e56.yaml
RENAMED
|
File without changes
|
|
File without changes
|
{os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/fix-ovs-plugin-describe-049750609559f1ba.yaml
RENAMED
|
File without changes
|
{os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/fix-stevedore-entrypoints-8002ec7a5166c977.yaml
RENAMED
|
File without changes
|
|
File without changes
|
{os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/generic-datapath-offloads-41cabb6842b41533.yaml
RENAMED
|
File without changes
|
|
File without changes
|
{os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/oslo-config-opts-entrypoints-e83f907b686d774a.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/port-profile-info-ovs-63b46a3eafc11de2.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/remove_iptools_implementation-2eb866573a680e61.yaml
RENAMED
|
File without changes
|
|
File without changes
|
{os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/vhost-user-mtu-support-cbc7d02a6665fab1.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|