Skip to content

Project status & Python 3.12 readiness — proposing atomic PRs and/or a soft handoff pointer #211

@olibrius

Description

@olibrius

Project status & Python 3.12 readiness

Observation

Looking at the repository state in 2026:

  • last merged PR: Add project status. #170 in June 2022 (almost 4 years ago)
  • last commit on master: d6cda4f (also June 2022)
  • 60+ open issues, ~10 open PRs untouched
  • the official "project status" PR (Add project status. #170) acknowledges limited maintenance bandwidth

Meanwhile, downstream:

  • Python 3.10 removed distutils.spawn
  • Python 3.11 removed imp
  • Python 3.12 removed distutils entirely and deprecated asyncore
  • nose (the configured test runner) no longer installs cleanly on Py3.10+
  • eventlet < 0.33 fails to import under Py3.12
  • six is dead since Py2 EOL (2020)

The pip install ryu story on a fresh Python 3.12 system is currently broken end-to-end.

What I did

I have been running a fork — olibrius/ryu4312 — that:

  1. Restores pip install on Python 3.11 / 3.12 (distutils/imp/asyncore replacements).
  2. Bumps eventlet to a Py3.12-compatible release with dnspython>=2.0.
  3. Migrates the test suite from nose to pytest (121,868 unit tests passing).
  4. Removes the six dependency entirely (87 files, native Py3 idioms).
  5. Fixes a real Py2→Py3 regression in SCTP CRC32C computation (proposed independently in Fix SCTP CRC32C computation under Python 3 #210).
  6. Ships GitHub Actions CI (Python 3.11 + 3.12 matrix) and a tag-driven release workflow.
  7. Has been validated end-to-end on Python 3.12 against OVS 3.1.0 with the in-tree ryu/tests/switch/tester.py (OF1.0/1.3/1.4) and simple_switch_15 (OF1.5).

The fork is published as ryu4312 on GitHub Releases (the Python import name remains ryu for full source compatibility):

  • v4.35.0 — first packaging cut
  • v4.35.1 — includes the SCTP CRC fix

What I am proposing

Two complementary tracks, take whichever (or none) fits:

Track 1 — atomic upstream PRs. I am happy to split the work above into independent PRs against faucetsdn/ryu so each one stays digestible:

  • Fix SCTP CRC32C computation under Python 3 #210 — SCTP CRC32C Py3 fix (already opened)
  • distutils / imp / asyncore replacements (Py3.10+ minimum)
  • six removal (Py2 long EOL)
  • nosepytest migration
  • eventlet bump + GHA CI matrix on Py3.11/3.12
  • packaging modernization

If a maintainer is willing to review and merge incrementally, I will keep submitting. I have all of these already in production-tested branches.

Track 2 — soft handoff. If maintenance bandwidth is genuinely zero, I would like to ask whether you would be open to adding a short pointer in README.rst along the lines of:

⚠️ This repository is in maintenance mode. For Python 3.11/3.12 support, see the actively maintained fork at https://github.com/olibrius/ryu4312.

That keeps the upstream history authoritative while letting downstream users discover a working install path on modern Python.

I am not asking for commit rights — only for a way to help users not silently hit ModuleNotFoundError: No module named 'distutils' on pip install ryu in 2026. Whichever track works for you (including "neither, please don't") is fine; I just wanted to surface this transparently rather than fragment the ecosystem in silence.

Thanks for everything you have done on Ryu over the years.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions