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.

Files changed (185) hide show
  1. {os_vif-4.1.0 → os_vif-4.2.1}/.zuul.yaml +0 -1
  2. {os_vif-4.1.0 → os_vif-4.2.1}/AUTHORS +2 -0
  3. {os_vif-4.1.0 → os_vif-4.2.1}/ChangeLog +13 -0
  4. {os_vif-4.1.0 → os_vif-4.2.1}/PKG-INFO +1 -1
  5. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/unit/internal/ip/linux/test_impl_pyroute2.py +26 -17
  6. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif.egg-info/PKG-INFO +1 -1
  7. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif.egg-info/SOURCES.txt +2 -0
  8. os_vif-4.2.1/os_vif.egg-info/pbr.json +1 -0
  9. os_vif-4.2.1/pyproject.toml +3 -0
  10. os_vif-4.2.1/releasenotes/source/2025.1.rst +6 -0
  11. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/index.rst +1 -0
  12. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/ovs.py +6 -5
  13. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/ovsdb/ovsdb_lib.py +16 -0
  14. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/tests/functional/test_plugin.py +62 -0
  15. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/tests/unit/ovsdb/test_ovsdb_lib.py +12 -2
  16. os_vif-4.1.0/os_vif.egg-info/pbr.json +0 -1
  17. {os_vif-4.1.0 → os_vif-4.2.1}/.coveragerc +0 -0
  18. {os_vif-4.1.0 → os_vif-4.2.1}/.mailmap +0 -0
  19. {os_vif-4.1.0 → os_vif-4.2.1}/.pre-commit-config.yaml +0 -0
  20. {os_vif-4.1.0 → os_vif-4.2.1}/.stestr.conf +0 -0
  21. {os_vif-4.1.0 → os_vif-4.2.1}/CONTRIBUTING.rst +0 -0
  22. {os_vif-4.1.0 → os_vif-4.2.1}/HACKING.rst +0 -0
  23. {os_vif-4.1.0 → os_vif-4.2.1}/LICENSE +0 -0
  24. {os_vif-4.1.0 → os_vif-4.2.1}/README.rst +0 -0
  25. {os_vif-4.1.0 → os_vif-4.2.1}/bindep.txt +0 -0
  26. {os_vif-4.1.0 → os_vif-4.2.1}/doc/requirements.txt +0 -0
  27. {os_vif-4.1.0 → os_vif-4.2.1}/doc/source/conf.py +0 -0
  28. {os_vif-4.1.0 → os_vif-4.2.1}/doc/source/contributor/contributing.rst +0 -0
  29. {os_vif-4.1.0 → os_vif-4.2.1}/doc/source/index.rst +0 -0
  30. {os_vif-4.1.0 → os_vif-4.2.1}/doc/source/reference/glossary.rst +0 -0
  31. {os_vif-4.1.0 → os_vif-4.2.1}/doc/source/user/host-info.rst +0 -0
  32. {os_vif-4.1.0 → os_vif-4.2.1}/doc/source/user/plugins/linux-bridge.rst +0 -0
  33. {os_vif-4.1.0 → os_vif-4.2.1}/doc/source/user/plugins/noop.rst +0 -0
  34. {os_vif-4.1.0 → os_vif-4.2.1}/doc/source/user/plugins/ovs.rst +0 -0
  35. {os_vif-4.1.0 → os_vif-4.2.1}/doc/source/user/usage.rst +0 -0
  36. {os_vif-4.1.0 → os_vif-4.2.1}/doc/source/user/vif-types.rst +0 -0
  37. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/__init__.py +0 -0
  38. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/exception.py +0 -0
  39. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/i18n.py +0 -0
  40. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/internal/__init__.py +0 -0
  41. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/internal/ip/__init__.py +0 -0
  42. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/internal/ip/api.py +0 -0
  43. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/internal/ip/ip_command.py +0 -0
  44. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/internal/ip/linux/__init__.py +0 -0
  45. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/internal/ip/linux/impl_pyroute2.py +0 -0
  46. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/objects/__init__.py +0 -0
  47. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/objects/base.py +0 -0
  48. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/objects/fields.py +0 -0
  49. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/objects/fixed_ip.py +0 -0
  50. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/objects/host_info.py +0 -0
  51. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/objects/instance_info.py +0 -0
  52. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/objects/network.py +0 -0
  53. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/objects/route.py +0 -0
  54. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/objects/subnet.py +0 -0
  55. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/objects/vif.py +0 -0
  56. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/opts.py +0 -0
  57. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/plugin.py +0 -0
  58. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/__init__.py +0 -0
  59. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/functional/__init__.py +0 -0
  60. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/functional/base.py +0 -0
  61. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/functional/internal/__init__.py +0 -0
  62. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/functional/internal/command/__init__.py +0 -0
  63. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/functional/internal/command/ip/__init__.py +0 -0
  64. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/functional/internal/command/ip/test_impl_pyroute2.py +0 -0
  65. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/functional/privsep.py +0 -0
  66. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/unit/__init__.py +0 -0
  67. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/unit/base.py +0 -0
  68. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/unit/internal/__init__.py +0 -0
  69. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/unit/internal/ip/__init__.py +0 -0
  70. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/unit/internal/ip/linux/__init__.py +0 -0
  71. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/unit/internal/ip/test_api.py +0 -0
  72. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/unit/test_base.py +0 -0
  73. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/unit/test_exception.py +0 -0
  74. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/unit/test_host_info.py +0 -0
  75. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/unit/test_objects.py +0 -0
  76. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/unit/test_os_vif.py +0 -0
  77. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/tests/unit/test_vif.py +0 -0
  78. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/utils.py +0 -0
  79. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif/version.py +0 -0
  80. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif.egg-info/dependency_links.txt +0 -0
  81. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif.egg-info/entry_points.txt +0 -0
  82. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif.egg-info/not-zip-safe +0 -0
  83. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif.egg-info/requires.txt +0 -0
  84. {os_vif-4.1.0 → os_vif-4.2.1}/os_vif.egg-info/top_level.txt +0 -0
  85. {os_vif-4.1.0 → os_vif-4.2.1}/playbooks/openstack-tox-functional-ovs-with-sudo/Debian.yaml +0 -0
  86. {os_vif-4.1.0 → os_vif-4.2.1}/playbooks/openstack-tox-functional-ovs-with-sudo/Gentoo.yaml +0 -0
  87. {os_vif-4.1.0 → os_vif-4.2.1}/playbooks/openstack-tox-functional-ovs-with-sudo/RedHat.yaml +0 -0
  88. {os_vif-4.1.0 → os_vif-4.2.1}/playbooks/openstack-tox-functional-ovs-with-sudo/Suse.yaml +0 -0
  89. {os_vif-4.1.0 → os_vif-4.2.1}/playbooks/openstack-tox-functional-ovs-with-sudo/pre.yaml +0 -0
  90. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/OVSVif-hybrid-unplug-f37bf57bc8e913de.yaml +0 -0
  91. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/add-abstract-ovsdb-api-8f04df58d4ed5b73.yaml +0 -0
  92. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/add-fast-path-vhostuser-support-fe87e558326909b6.yaml +0 -0
  93. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/add-no-op-plugin-763a6703e7328a24.yaml +0 -0
  94. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/add-ovs-representor-portprofile-5f8290e5a40bf0a4.yaml +0 -0
  95. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/add-ovs-vhostuser-support-2ba8de51c1f3a244.yaml +0 -0
  96. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/add-ovsdb-native-322fffb49c91503d.yaml +0 -0
  97. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/always-plug-vifs-for-ovs-1d033fc49a9c6c4e.yaml +0 -0
  98. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/brctl-removal-a5b0e69b865afa57.yaml +0 -0
  99. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/bug-1892132-812e6d5ce0588ebb.yaml +0 -0
  100. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/contextlib-and-nested-with-statements-2747a9ebb9a5bfd7.yaml +0 -0
  101. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/default-qos-policy-for-ovs-26f8806046a59c82.yaml +0 -0
  102. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/default-to-native-ovsdb-driver-112fb5adf6e19a30.yaml +0 -0
  103. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/deprecate-linuxbridge-support-d278d4bbdff8e8bc.yaml +0 -0
  104. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/deprecate-windows-support-49f5ca1b1a1f4d66.yaml +0 -0
  105. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/do-not-force-mac-ageing-c6e8d750130c5740.yaml +0 -0
  106. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/drop-py36-support-0e9b07073f6ad73f.yaml +0 -0
  107. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/drop-python2-support-7a4bc7d31253c1e5.yaml +0 -0
  108. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/ensure-ovs-bridge-a0c1b51f469c92d0.yaml +0 -0
  109. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/extend-vhostuser-object-fada14a1457d4e56.yaml +0 -0
  110. {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
  111. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/fix-ovs-plugin-describe-049750609559f1ba.yaml +0 -0
  112. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/fix-stevedore-entrypoints-8002ec7a5166c977.yaml +0 -0
  113. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/fix-vif-openvswitch-fa0d19be9dd668e1.yaml +0 -0
  114. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/generic-datapath-offloads-41cabb6842b41533.yaml +0 -0
  115. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/initial-release-2c71d6bbf55f763b.yaml +0 -0
  116. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/oslo-config-opts-entrypoints-e83f907b686d774a.yaml +0 -0
  117. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/per-port-bridge-c6a50179a0256de3.yaml +0 -0
  118. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/port-profile-info-linux-bridge-4800f5a0b7328615.yaml +0 -0
  119. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/port-profile-info-ovs-63b46a3eafc11de2.yaml +0 -0
  120. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/prevent-lb-reply-arp-6459133bfb056069.yaml +0 -0
  121. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/remove-py38-e0701b3363079bbf.yaml +0 -0
  122. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/remove-windows-23df1c587d505d72.yaml +0 -0
  123. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/remove_iptools_implementation-2eb866573a680e61.yaml +0 -0
  124. {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
  125. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/vhost-user-mtu-support-cbc7d02a6665fab1.yaml +0 -0
  126. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/notes/vhost-user-reconnect-fa4cbb731b787f71.yaml +0 -0
  127. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/2023.1.rst +0 -0
  128. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/2023.2.rst +0 -0
  129. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/2024.1.rst +0 -0
  130. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/2024.2.rst +0 -0
  131. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/_static/.placeholder +0 -0
  132. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/_templates/.placeholder +0 -0
  133. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/conf.py +0 -0
  134. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/newton.rst +0 -0
  135. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/ocata.rst +0 -0
  136. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/pike.rst +0 -0
  137. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/queens.rst +0 -0
  138. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/rocky.rst +0 -0
  139. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/stein.rst +0 -0
  140. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/train.rst +0 -0
  141. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/unreleased.rst +0 -0
  142. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/ussuri.rst +0 -0
  143. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/victoria.rst +0 -0
  144. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/wallaby.rst +0 -0
  145. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/xena.rst +0 -0
  146. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/yoga.rst +0 -0
  147. {os_vif-4.1.0 → os_vif-4.2.1}/releasenotes/source/zed.rst +0 -0
  148. {os_vif-4.1.0 → os_vif-4.2.1}/requirements.txt +0 -0
  149. {os_vif-4.1.0 → os_vif-4.2.1}/setup.cfg +0 -0
  150. {os_vif-4.1.0 → os_vif-4.2.1}/setup.py +0 -0
  151. {os_vif-4.1.0 → os_vif-4.2.1}/test-requirements.txt +0 -0
  152. {os_vif-4.1.0 → os_vif-4.2.1}/tox.ini +0 -0
  153. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_linux_bridge/__init__.py +0 -0
  154. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_linux_bridge/constants.py +0 -0
  155. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_linux_bridge/iptables.py +0 -0
  156. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_linux_bridge/linux_bridge.py +0 -0
  157. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_linux_bridge/linux_net.py +0 -0
  158. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_linux_bridge/privsep.py +0 -0
  159. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_linux_bridge/tests/__init__.py +0 -0
  160. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_linux_bridge/tests/unit/__init__.py +0 -0
  161. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_linux_bridge/tests/unit/test_linux_net.py +0 -0
  162. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_linux_bridge/tests/unit/test_plugin.py +0 -0
  163. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_noop/__init__.py +0 -0
  164. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_noop/noop.py +0 -0
  165. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_noop/tests/__init__.py +0 -0
  166. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_noop/tests/unit/__init__.py +0 -0
  167. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_noop/tests/unit/test_plugin.py +0 -0
  168. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/__init__.py +0 -0
  169. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/constants.py +0 -0
  170. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/exception.py +0 -0
  171. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/linux_net.py +0 -0
  172. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/ovsdb/__init__.py +0 -0
  173. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/ovsdb/api.py +0 -0
  174. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/ovsdb/impl_idl.py +0 -0
  175. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/ovsdb/impl_vsctl.py +0 -0
  176. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/privsep.py +0 -0
  177. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/tests/__init__.py +0 -0
  178. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/tests/functional/__init__.py +0 -0
  179. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/tests/functional/base.py +0 -0
  180. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/tests/functional/ovsdb/__init__.py +0 -0
  181. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/tests/functional/ovsdb/test_ovsdb_lib.py +0 -0
  182. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/tests/unit/__init__.py +0 -0
  183. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/tests/unit/ovsdb/__init__.py +0 -0
  184. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/tests/unit/test_linux_net.py +0 -0
  185. {os_vif-4.1.0 → os_vif-4.2.1}/vif_plug_ovs/tests/unit/test_plugin.py +0 -0
@@ -26,7 +26,6 @@
26
26
  devstack_plugins:
27
27
  neutron: https://opendev.org/openstack/neutron.git
28
28
  devstack_localrc:
29
- USE_PYTHON3: true
30
29
  FORCE_CONFIG_DRIVE: true
31
30
  ENABLE_VOLUME_MULTIATTACH: true
32
31
  # NOTE(sean-k-mooney) we do not have to set
@@ -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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: os_vif
3
- Version: 4.1.0
3
+ Version: 4.2.1
4
4
  Summary: A library for plugging and unplugging virtual interfaces in OpenStack.
5
5
  Home-page: https://docs.openstack.org/os-vif/latest/
6
6
  Author: OpenStack
@@ -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(iproute.IPRoute, 'link_lookup',
46
- return_value=[1]) as mock_link_lookup:
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(iproute.IPRoute, 'link_lookup',
61
- return_value=[1]) as mock_link_lookup:
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(iproute.IPRoute, 'link_lookup',
74
- return_value=[]) as mock_link_lookup:
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(iproute.IPRoute, 'link_lookup',
87
- return_value=[1]) as mock_link_lookup:
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(iproute.IPRoute, 'link_lookup',
118
- return_value=[]) as mock_link_lookup:
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(iproute.IPRoute, 'link_lookup',
145
- return_value=[1]) as mock_link_lookup:
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(iproute.IPRoute, 'link_lookup',
152
- return_value=[]) as mock_link_lookup:
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(iproute.IPRoute, 'link_lookup',
159
- return_value=[1]) as mock_link_lookup:
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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: os_vif
3
- Version: 4.1.0
3
+ Version: 4.2.1
4
4
  Summary: A library for plugging and unplugging virtual interfaces in OpenStack.
5
5
  Home-page: https://docs.openstack.org/os-vif/latest/
6
6
  Author: OpenStack
@@ -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}
@@ -0,0 +1,3 @@
1
+ [build-system]
2
+ requires = ["pbr>=5.7.0", "setuptools>=64.0.0", "wheel"]
3
+ build-backend = "pbr.build"
@@ -0,0 +1,6 @@
1
+ ===========================
2
+ 2025.1 Series Release Notes
3
+ ===========================
4
+
5
+ .. release-notes::
6
+ :branch: stable/2025.1
@@ -6,6 +6,7 @@ Release Notes
6
6
  :maxdepth: 1
7
7
 
8
8
  unreleased
9
+ 2025.1
9
10
  2024.2
10
11
  2024.1
11
12
  2023.2
@@ -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 self._is_trunk_bridge(bridge)):
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 self._is_trunk_bridge(vif.network.bridge):
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 test_create_ovs_vif_port(self):
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 = '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