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
3ddc04e3and are no longer on this branch. One conflict was resolved by hand:install-tools.shnow names all four format clients, keeping thenodejsthe 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.