feat(custodian): add the Cloud Custodian exemplar image - #149
Conversation
Image #1 of the catalog (#123, chosen in #117), wired by hand through all eight sites so Wave 3 has a concrete diff to templatise. Upstream ships c7n on ubuntu:24.04 with apt and a named user, which Kubernetes runAsNonRoot rejects; this rides the existing python lane instead. The substantive problem this solves is offline Python packaging, and the answer generalises to every future Python rider: pyproject (community plugin) builds PyPI sdists with --no-isolation against declared build-depends, which is what FSDK's own python3-* components do. Reusing that pattern rather than inventing one is the whole point. zip source for c7n itself, because cloud-custodian publishes a wheel and no sdist. cargo2 for rpds-py, jsonschema's compiled Rust dependency, vendoring crates from Cargo.lock. Without it the dependency tree cannot be built offline at all, since the grid has no network during the build phase. Sixteen dependency elements are declared explicitly rather than resolved at build time; that is the cost of no-network builds and it is exactly the cost Wave 3's generator exists to stop paying per image. NOT YET BUILT. The dependency chain builds green as far as botocore (8m19s), boto3, s3transfer and dateutil, then rpds-py stalls: the action uploads its input root and sits in the scheduler queue while both workers idle at ~7-14m CPU. Neither node carries the lab.projectbluefin.io/usb4-link=up label that lab's cluster-tooling skill documents as a hard BuildStream admission requirement, so this is an infrastructure gate, not an element defect. Commit the work rather than lose it; verification follows once the grid admits builds. Refs #123, #113 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
Code review of this branch (main...HEAD), verified against the pinned sources: Critical — elements/custodian/c7n.bst: Critical — elements/oci/custodian.bst: the prune of High — python3-rpds-py.bst: Medium: c7n 0.9.51 pins Medium — Justfile: the 192 MiB verify ceiling is ~3x under the real size: botocore alone unpacks to 116 MiB before boto3/jsonschema/cryptography/c7n. Set from the first measured build. Also: elements/custodian/*.bst and project.conf reference |
|
Code review (batch review pass 2026-08-24): REQUEST-CHANGES — not merging.
Design-wise the non-root /etc/passwd approach and the compose-time passwd write were reviewed and are sound — the work is good, it just needs to land on the new model with green CI. |
Refs #123, #113. Draft — the image is wired but not yet built. See Blocked on below.
Image #1 of the catalog, chosen in #117 because upstream ships c7n on
ubuntu:24.04withaptand a named user (which KubernetesrunAsNonRootrejects), it is a Python app so it rides this repo's existingpythonlane, and it is five images from one upstream generator — so it can demonstrate the marginal-cost collapse directly.The reusable output: offline Python packaging
This is the part worth reviewing, because every future Python rider inherits it. The grid has no network during the build phase, so
pip installis not available:pyproject(community plugin) builds PyPI sdists with--no-isolationagainst declaredbuild-depends. This is the pattern FSDK's ownpython3-*components already use — reused deliberately rather than invented.zipsource for c7n itself, because cloud-custodian publishes a wheel and no sdist.cargo2forrpds-py,jsonschema's compiled Rust dependency, vendoring crates fromCargo.lock. Without it the tree cannot be built offline at all.The 8-site diff (this is what Wave 3 templatises)
elements/custodian/custodian-stack.bstelements/custodian/custodian-runtime.bstelements/custodian/c7n.bst+ 16python3-*dependency elementselements/oci/custodian.bstelements/targets.jsonJustfile(DESC, size, smoke) +.github/workflows/oci-images.yml(smoke)Plus
project.conf(+13: three plugin registrations) andinclude/aliases.yml(+1:crates).The 16 hand-declared dependency elements are the headline cost — that is what no-network builds cost per Python image today, and precisely what Wave 3's generator exists to stop paying repeatedly.
Blocked on: grid admission
The chain builds green through botocore (8m19s), boto3, s3transfer, dateutil. Then
rpds-pyuploads its input root and sits in the scheduler queue while both workers idle at ~7–14m CPU — nothing is compiling.Neither node carries the
lab.projectbluefin.io/usb4-link=uplabel thatprojectbluefin/labdocs/skills/cluster-tooling/buildstream.mddocuments as a hard BuildStream admission requirement:So this is an infrastructure gate, not an element defect. Worth noting the failure mode is a silent indefinite queue rather than a clear rejection.
Not done yet
just verifygreen, and proof the existing 7 images are unaffectedreadelf -dlinkage checkpodman run --passwd=falseDeliberately not hand-writing the other four c7n images: #113 is explicit that five hand-written trees is a failed exemplar.