test(e2e): four container clients, and the 37 catalog rows they cover

What this adds

Four container-format clients and the 37 catalog rows they cover, taking the oci and docker catalogs from 5 covered rows to 42. e2e-catalog check reports 0 disagreements, covered 42, patterned 42.

Client Added here Rows it unlocks
crane (pinned 0.22.0) Login, ListTags, Digest, PlatformDigest, Delete, Tag, Append, Pull tag listing and deletion, retag, image delete, re-push, multi-arch reads
cosign (pinned 3.1.3) GenerateKeyPair, Sign, Verify signing, both formats
docker Login/Logout, Build, BuildxPush, Push, Pull, Tag, Remove, Digest, LayerCount the docker catalog's auth, publish, consume and lifecycle groups
oras (existing) Login, Descriptor, Attach, Discover, ManifestPush, WithoutAuthorizationHeader oci auth, consume, attestations, referrers, error framing

registry.Client grows the management and /v2/ reads the API rows need: DeleteRepository, DeleteRepositoryRawQuery, DeleteManifest, ListImages, DeleteImage, Referrers, IndexManifest and ManifestFraming.

Every row was run against a caproni bootstrap rig on this branch. Full suite: 96 tests, exit 0.

Three findings this surfaced

A filed defect. oci.lifecycle.delete-artifact is deliberately left not started: the referrers index still lists a hard-deleted subject's referrers, where S12 says the query returns the empty set at lines 1340, 1406 and 1680. Filed as #1005 under the new epic &21, with a raw-HTTP reproduction. Its regression test is written and held back rather than committed red.

The docker CLI cannot use the rig's ingress hostname. It probes https first and will not fall back when Traefik answers 443, and its token client then refuses the certificate. The docker rows address Traefik's plain-HTTP loopback entrypoint instead, which needs no daemon configuration in either environment. e2e/README.md's "Upstream limitations this harness patches around" records the measurements, including the three routes that do not work: insecure-registries alone, /etc/docker/certs.d in either form, and rewriting the Bearer realm for every client — the last of which breaks crane and cosign, which refuse an http realm on a connection they made over TLS.

The rig OOMs under this suite at default parallelism. Measured on the chart's 512Mi limit: idle 22Mi, peak 424Mi, back to 161Mi after, so transient rather than retained. Runs pass at -p 2 -parallel 4. No limit or parallelism change is made here; the sizing question belongs with whoever owns the rig's values.

Reviewable size

4722 insertions. Split by group:

Group LOC Files
Scenario tests and fixtures 2750 23
Client capability 1255 11
Pattern registry and registry client 607 3
Catalog rows, docs, tooling 110 9

Well past the 500-LOC line in development-model.md, and a split was offered and declined in favour of one review. The sixteen commits are atomic and ordered capability-then-rows, so the diff reads commit by commit: each client lands with its unit tests, and each row batch lands with the pattern entries and catalog edits it justifies. Splitting remains available on request — it is a branch re-point, not a rewrite.

Notes for the reviewer

  • Rebased onto this target after !2070 (merged) merged. That MR was squash-merged, so the three commits it carried are in the base as 3ddc04e3 and are no longer on this branch. One conflict was resolved by hand: install-tools.sh now names all four format clients, keeping the nodejs the base had gained.
  • e2e/README.md's directory tree had described a smaller suite than the one on disk for three batches; it now names all six surfaces and five clients.
  • The docker client is deliberately not fully confined. Its credential store is, but images live in the daemon every test on the host shares, so each reference is derived from its test's own name and every local image is removed at test end. Without that a later pull is served by the daemon rather than the registry.
Edited by Suleimi Ahmed

Merge request reports

Loading
Loading