Package: release.debian.org Severity: normal Tags: trixie X-Debbugs-Cc: [email protected] Control: affects -1 + src:python-os-ken User: [email protected] Usertags: pu
Dear release team, [ Reason ] During production, we found out that in some cases, OpenStack Neutron's openvswitch agent could crash. My colleague wrote the details here: https://bugs.launchpad.net/neutron/+bug/2133487 This was then fixed upstream, and backported by upstream: https://review.opendev.org/q/I9069337270cc261974c524a5ab284b055177ab3e (note: the version in Trixie is 2025.1) The impact may be very bad in production, with compute nodes not reacting at all to network port creation / deletion / updates as neutron-ovs-agent is in fact dead. [ Impact ] Without fixing os-ken, it's possible that neutron-openvswitch-agent main thread just crashes, while the service still reports itself as running (as it reports in another thread). [ Tests ] Extensive unit and functional test are done in upstream CI. [ Risks ] The patch is minimal and well tested, with a new test case. So risk is minimal. [ Checklist ] [x] *all* changes are documented in the d/changelog [x] I reviewed all changes and I approve them [x] attach debdiff against the package in (old)stable [x] the issue is verified as fixed in unstable [ Changes ] The function in os-ken that wasn't accepting None as value, now does, and there is a new unit test for that. Please allow me to upload python-os-ken_3.0.1-2+deb13u1 to Trixie p-u. Cheers, Thomas Goirand (zigo)
diff -Nru python-os-ken-3.0.1/debian/changelog python-os-ken-3.0.1/debian/changelog --- python-os-ken-3.0.1/debian/changelog 2025-03-28 09:34:42.000000000 +0100 +++ python-os-ken-3.0.1/debian/changelog 2026-01-06 14:20:12.000000000 +0100 @@ -1,3 +1,9 @@ +python-os-ken (3.0.1-2+deb13u1) trixie; urgency=medium + + * Add Accept_empty_OXM_fields.patch. + + -- Thomas Goirand <[email protected]> Tue, 06 Jan 2026 14:20:12 +0100 + python-os-ken (3.0.1-2) unstable; urgency=medium * Uploading to unstable. diff -Nru python-os-ken-3.0.1/debian/patches/Accept_empty_OXM_fields.patch python-os-ken-3.0.1/debian/patches/Accept_empty_OXM_fields.patch --- python-os-ken-3.0.1/debian/patches/Accept_empty_OXM_fields.patch 1970-01-01 01:00:00.000000000 +0100 +++ python-os-ken-3.0.1/debian/patches/Accept_empty_OXM_fields.patch 2026-01-06 14:20:12.000000000 +0100 @@ -0,0 +1,68 @@ +Description: Accept empty "OXM" fields (tuple, list) + When decoding an "OXM" field, now it is possible to accept + and empty tuple or list. The value and the mask are considered as + "None". +Author: lajoskatona <[email protected]> +Date: Wed, 10 Dec 2025 10:23:17 +0100 +Bug: https://launchpad.net/bugs/2133487 +Signed-off-by: lajoskatona <[email protected]> +Co-Authored-By: Rodolfo Alonso Hernandez <[email protected]> +Change-Id: I9069337270cc261974c524a5ab284b055177ab3e +Origin: upstream, https://review.opendev.org/c/openstack/os-ken/+/972086 +Last-Update: 2026-01-06 + +diff --git a/os_ken/ofproto/oxx_fields.py b/os_ken/ofproto/oxx_fields.py +index c37557f..84facd5 100644 +--- a/os_ken/ofproto/oxx_fields.py ++++ b/os_ken/ofproto/oxx_fields.py +@@ -59,7 +59,10 @@ + # the 'list' case below is a bit hack; json.dumps silently maps + # python tuples into json lists. + if oxx == 'oxm' and isinstance(user_value, (tuple, list)): +- (value, mask) = user_value ++ if not user_value: ++ value, mask = None, None ++ else: ++ (value, mask) = user_value + else: + value = user_value + mask = None +diff --git a/os_ken/tests/unit/ofproto/test_oxm.py b/os_ken/tests/unit/ofproto/test_oxm.py +index 3a58ac9..1b00142 100644 +--- a/os_ken/tests/unit/ofproto/test_oxm.py ++++ b/os_ken/tests/unit/ofproto/test_oxm.py +@@ -24,6 +24,8 @@ + (f, uv) = user + (n, v, m) = ofp.oxm_from_user(f, uv) + buf = bytearray() ++ m = b'' if m is None else m ++ v = b'' if v is None else v + ofp.oxm_serialize(n, v, m, buf, 0) + self.assertEqual(on_wire, buf) + +@@ -46,9 +48,10 @@ + f = ofp.oxm_to_user_header(n) + self.assertEqual(user, f) + +- def _test(self, user, on_wire, header_bytes): ++ def _test(self, user, on_wire, header_bytes, test_decode=True): + self._test_encode(user, on_wire) +- self._test_decode(user, on_wire) ++ if test_decode: ++ self._test_decode(user, on_wire) + if isinstance(user[1], tuple): # has mask? + return + user_header = user[0] +@@ -186,3 +189,12 @@ + b'fugafuga' + ) + self._test(user, on_wire, 4) ++ ++ def test_empty_values(self): ++ # This test is a corner case that rarely happens. The decoded ++ # information is empty. ++ user = ('ipv4_src', ()) ++ on_wire = ( ++ b'\x80\x00\x16\x00' ++ ) ++ self._test(user, on_wire, 4, test_decode=False) diff -Nru python-os-ken-3.0.1/debian/patches/series python-os-ken-3.0.1/debian/patches/series --- python-os-ken-3.0.1/debian/patches/series 1970-01-01 01:00:00.000000000 +0100 +++ python-os-ken-3.0.1/debian/patches/series 2026-01-06 14:20:12.000000000 +0100 @@ -0,0 +1 @@ +Accept_empty_OXM_fields.patch

