Conversation
|
The job runs This is why catalogue changes normally merge before the mirror runs, and why The ordering is a genuine pinch —
Alternatives considered and rejected: landing Every other job passes: |
Cirros is the only image definition without a mirror_url, so no mirrored copy of it exists in the object store and there is no way to serve it from a local mirror. An air-gapped site therefore has no route to the image most commonly used to check that a cloud works at all. Three things block mirroring it, and they have to land together before any upload, because contrib/mirror.py: - skips an image that has no shortname, - skips a version that has no mirror_url, and - derives the upload destination *from* mirror_url. The definition is thus the input to mirroring rather than its output: the destination has to be declared before the tool can place anything there. Add shortname: cirros, a mirror_url for each pinned version, and "cirros" to the shortname allow-list. The two destinations were derived with the tool's own mirror_paths() instead of composed by hand, so the declared and computed paths cannot disagree. Both are flat, with no version directory: mirror_paths() adds one only for flatcar, or when the source extension is compressed, and Cirros publishes an uncompressed .img. url is deliberately left untouched. It is what sets the image_source property, so upstream provenance stays recorded even when the bytes are fetched from a mirror. This change only makes the upload possible; performing it is a separate credentialed step (tox -e mirror). Assisted-by: Claude:claude-opus-5 Signed-off-by: Roger Luethi <luethi@osism.tech>
57901b3 to
332c4e9
Compare
Cirros is the only image definition without a
mirror_url, so no mirrored copyof it exists in the object store and there is no way to serve it from a local
mirror. An air-gapped site therefore has no route to the image most commonly
used to check that a cloud works at all.
Why three changes in one commit
They cannot land separately, because
contrib/mirror.py:shortname(:380-381),mirror_url(:399-400), andmirror_url(:60).The definition is thus the input to mirroring rather than its output: the
destination has to be declared before the tool can place anything there. So this
adds
shortname: cirros, amirror_urlper pinned version, andcirrosto theshortname allow-list.
Destinations
Derived by calling the tool's own
mirror_paths()rather than composed by hand,so the declared and computed paths cannot disagree:
Both are flat, with no version directory.
mirror_paths()adds one only forflatcar, or when the source extension is.bz2/.zip/.xz/.gz; Cirrospublishes an uncompressed
.img.urlis deliberately left untouched — it is what sets theimage_sourceproperty, so upstream provenance stays recorded even when the bytes are fetched
from a mirror.
Follow-up
This change only makes the upload possible. Performing it is a separate
credentialed step (
tox -e mirror), and until that runs the newmirror_urlspoint at objects that do not exist yet. Worth landing before the next mirror
pass so Cirros rides it.
Precedent for the allow-list entry, which also states the general rule that
registering a handler is not sufficient on its own:
Testing
tox -- --check-onlypasses (schema).tox -e test -- test/unitpasses, 74 tests.yamllint,python-black,flake8,mypyclean over the changed files.🤖 Generated with Claude Code