Skip to content

Commit 79367c2

Browse files
authored
Merge branch 'main' into docs/aibom-post-repin-record-drift
2 parents 3e14e55 + 76a8024 commit 79367c2

29 files changed

Lines changed: 1762 additions & 142 deletions

.github/RENOVATE.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ Self-hosted Renovate keeps the project's dependencies up to date across `go.mod`
99

1010
- Configuration: [`.github/renovate.json5`](renovate.json5)
1111
- Workflow: [`.github/workflows/renovate.yaml`](workflows/renovate.yaml)
12-
- Companion script: [`tools/update-chainsaw-checksums`](../tools/update-chainsaw-checksums)
12+
- Companion scripts: [`tools/update-chainsaw-checksums`](../tools/update-chainsaw-checksums), [`tools/update-helmfile-checksums`](../tools/update-helmfile-checksums), [`tools/update-helm-diff-checksums`](../tools/update-helm-diff-checksums)
1313

1414
Policy choices (schedule, cooldown, auto-merge scope, group consolidation) are documented inline in `renovate.json5`. This doc covers what's covered, how to extend coverage, and the known gotchas.
1515

@@ -25,6 +25,8 @@ Policy choices (schedule, cooldown, auto-merge scope, group consolidation) are d
2525
| `.settings.yaml` (28 tool entries) | custom regex manager (`# renovate:` annotations) |
2626
| `.settings.yaml` `nvkind` SHA | dedicated git-refs digest customManager (`# renovate-digest:`) |
2727
| `.settings.yaml` `chainsaw_checksums` | `postUpgradeTasks``tools/update-chainsaw-checksums` |
28+
| `.settings.yaml` `helmfile_checksums` | `postUpgradeTasks``tools/update-helmfile-checksums` |
29+
| `.settings.yaml` `helm_diff_checksums` | `postUpgradeTasks``tools/update-helm-diff-checksums` |
2830
| `.go-version` (Go toolchain) | dedicated `golang-version` customManager (`go-toolchain` group) |
2931

3032
The `go` directive in `go.mod` is intentionally not bumped — the Go toolchain version is owned by `.go-version`. Makefile (`GOTOOLCHAIN`), the `load-versions` composite action, `install-karpenter-kwok`, and validator Dockerfiles (`--build-arg GO_VERSION`) all read from that single file.

.github/renovate.json5

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,16 @@
319319
},
320320
},
321321

322+
// ---- helm-diff bumps refresh per-arch SHA256 checksums via post-upgrade script ----
323+
{
324+
matchDepNames: ["databus23/helm-diff"],
325+
postUpgradeTasks: {
326+
commands: ["./tools/update-helm-diff-checksums {{{newVersion}}}"],
327+
fileFilters: [".settings.yaml"],
328+
executionMode: "update",
329+
},
330+
},
331+
322332
// ---- aiperf-bench base image is capped below python 3.14 ----
323333
// PR #1906 auto-bumped this to 3.14 and broke the UAT validator image
324334
// build (aiperf's pyzmq/uvloop had no cp314 wheels, and the single-stage

.github/workflows/codeql.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ jobs:
3939
- uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0
4040
with:
4141
go-version: ${{ steps.versions.outputs.go }}
42-
cache: false # vendor/ provides deps; disable to save disk on constrained runners
42+
cache: true
4343
- uses: github/codeql-action/init@ff2f1c621b7f889edc0d3c761ac2e6a3f8cdb0dd # v4.37.7
4444
with:
4545
languages: go

.github/workflows/merge-gate.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ jobs:
296296
- uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0
297297
with:
298298
go-version: ${{ steps.versions.outputs.go }}
299-
cache: false
299+
cache: true
300300
- uses: github/codeql-action/init@ff2f1c621b7f889edc0d3c761ac2e6a3f8cdb0dd # v4.37.7
301301
with:
302302
languages: go
@@ -528,7 +528,7 @@ jobs:
528528
- uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0
529529
with:
530530
go-version: ${{ steps.versions.outputs.go }}
531-
cache: false
531+
cache: true
532532
- name: Verify committed BOM versions and variants match the recipes
533533
env:
534534
GOFLAGS: -mod=vendor
@@ -579,7 +579,7 @@ jobs:
579579
- uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0
580580
with:
581581
go-version: ${{ steps.versions.outputs.go }}
582-
cache: false
582+
cache: true
583583
- name: Verify committed tuning-status table is up to date
584584
env:
585585
GOFLAGS: -mod=vendor
@@ -661,7 +661,7 @@ jobs:
661661
- uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0
662662
with:
663663
go-version: ${{ steps.versions.outputs.go }}
664-
cache: false
664+
cache: true
665665
- name: Verify committed coverage matrix is up to date
666666
env:
667667
GOFLAGS: -mod=vendor

.github/workflows/renovate.yaml

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,5 +122,18 @@ jobs:
122122
# checksums getting committed alongside a version bump (the version
123123
# changes but the helmfile_checksums/chainsaw_checksums block does
124124
# not), which then breaks E2E/CLI E2E at the sha256 verify step.
125-
RENOVATE_ALLOWED_POST_UPGRADE_COMMANDS: '["^\\./tools/update-[a-z]+-checksums "]'
125+
# `[a-z-]+` (not `[a-z]+`) so hyphenated tool names match too, e.g.
126+
# tools/update-helm-diff-checksums.
127+
#
128+
# The stale-checksum symptom above is not uniform across the three
129+
# tools. A hook that runs but *fails* (renamed asset, egress blip)
130+
# leaves the new version pinned against the old checksums, and only
131+
# helmfile/chainsaw fail a PR-gating job for it — qualification.yaml
132+
# feeds their sha256 into setup-build-tools, which verifies it.
133+
# helm_diff_checksums is read solely by tests/uat/lib/phases.sh, so a
134+
# stale helm-diff pin stays green on every PR check and first surfaces
135+
# in nightly UAT, across all clouds. Renovate's "Artifact update
136+
# problem" warning in the PR body is the signal to heed; helm-diff is
137+
# deliberately not auto-merged, so a human sees it.
138+
RENOVATE_ALLOWED_POST_UPGRADE_COMMANDS: '["^\\./tools/update-[a-z-]+-checksums "]'
126139
LOG_LEVEL: ${{ inputs.logLevel || 'info' }}

.settings.yaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,15 @@ testing_tools:
8484
helm: 'v4.2.4'
8585
# renovate: datasource=github-releases depName=databus23/helm-diff depType=testing_tools
8686
helm_diff: 'v3.15.11'
87+
# helm_diff_checksums are refreshed automatically by tools/update-helm-diff-checksums
88+
# via Renovate postUpgradeTasks whenever the helm-diff version above is bumped.
89+
# The darwin_* keys name GOOS (matching the sibling blocks); upstream labels
90+
# those release assets "macos".
91+
helm_diff_checksums:
92+
linux_amd64: 'ed54aa5a14a51a6e44cf8ab6020aaa9e56779b4d33bc2adf07abea6b240a5e7c'
93+
linux_arm64: '1c38c487ec348fe5ef2b10c61deddff79f0fa5bfbab762b302874578e6dc2d2c'
94+
darwin_amd64: '833e1054d0cfe28bbd6f2edc4c1d5b786968b7732f8df6fe99b67c3bf12bf7bb'
95+
darwin_arm64: 'ba489cc4a5998ad259fbc18c454f2319da26ba4c8f469e7acb587a07e61072cd'
8796
# renovate: datasource=github-releases depName=helmfile/helmfile depType=testing_tools
8897
helmfile: 'v1.7.4'
8998
# helmfile_checksums are refreshed automatically by tools/update-helmfile-checksums

Makefile

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,13 @@ CTLPTL_CONFIG_FILE = .ctlptl.yaml
3434
REGISTRY_PORT = 5001
3535
REGISTRY_NAME = ctlptl-registry
3636

37+
# Kind node image (single source of truth: .settings.yaml testing.kind_node_image).
38+
# .ctlptl.yaml intentionally does not hardcode this — cluster-create injects it so
39+
# local dev and CI can never pin a second, drifting copy of the version. No
40+
# hardcoded fallback here: cluster-create fails closed on an empty read
41+
# instead of silently degrading to a stale image (see its yq-missing check).
42+
KIND_NODE_IMAGE ?= $(shell yq -r '.testing.kind_node_image' .settings.yaml 2>/dev/null)
43+
3744
# Default target
3845
all: help
3946

@@ -819,7 +826,19 @@ cluster-create: ## Creates local Kind cluster with registry
819826
echo " or: go install sigs.k8s.io/kind@latest"; \
820827
exit 1; \
821828
fi
822-
ctlptl apply -f $(CTLPTL_CONFIG_FILE)
829+
@if ! command -v yq >/dev/null 2>&1; then \
830+
echo "Error: yq is not installed."; \
831+
echo "Install: brew install yq"; \
832+
echo " or: go install github.com/mikefarah/yq/v4@latest"; \
833+
exit 1; \
834+
fi
835+
@if [ -z "$(KIND_NODE_IMAGE)" ]; then \
836+
echo "Error: could not resolve testing.kind_node_image from .settings.yaml."; \
837+
echo "Check the key exists and .settings.yaml is valid YAML."; \
838+
exit 1; \
839+
fi
840+
@echo "Pinning Kind node image: $(KIND_NODE_IMAGE) (from .settings.yaml)"
841+
img="$(KIND_NODE_IMAGE)" yq eval-all '(select(.kind == "Cluster") | .kindV1Alpha4Cluster.nodes[]).image = strenv(img)' $(CTLPTL_CONFIG_FILE) | ctlptl apply -f -
823842
@echo "Waiting for nodes to be ready..."
824843
@kubectl wait --for=condition=ready nodes --all --timeout=300s
825844
@echo "Cluster created. Registry at localhost:$(REGISTRY_PORT)"
@@ -854,10 +873,6 @@ KWOK_VERSION ?= $(shell yq -r '.testing_tools.kwok' .settings.yaml 2>/dev/null)
854873
ifeq ($(KWOK_VERSION),)
855874
KWOK_VERSION := v0.7.0
856875
endif
857-
KIND_NODE_IMAGE ?= $(shell yq -r '.testing.kind_node_image' .settings.yaml 2>/dev/null)
858-
ifeq ($(KIND_NODE_IMAGE),)
859-
KIND_NODE_IMAGE := kindest/node:v1.32.0
860-
endif
861876
CTLPTL_KWOK_CONFIG_FILE := .ctlptl-kwok.yaml
862877

863878
.PHONY: kwok-cluster

docs/contributor/recipe.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,22 @@ spec:
345345
value: ">= v25.10.0"
346346
```
347347

348+
Host-managed driver floors (GKE COS / A4X Max and similar platforms where
349+
`driver.enabled: false`) use a separate deployment constraint,
350+
`Deployment.gpu-driver.version` (e.g. `">= 580.95.05"`).
351+
`check-nvidia-smi` evaluates it against the nvidia-smi banner on each
352+
verified node; when the constraint is absent the check keeps its
353+
banner-presence behavior and does not invent a floor (#1995).
354+
When the constraint is set but the host driver cannot be measured —
355+
unreadable nvidia-smi banner, no GPU nodes, all GPU nodes cordoned, or
356+
GPU nodes busy with workloads — the check fails closed rather than
357+
Skip. Skip on those paths is preserved only when no floor is
358+
configured. The value must carry a comparison operator (`>=`, `>`,
359+
`<=`, `<`) to behave as a floor; a bare version is exact string match,
360+
so a newer driver would fail. The constraint name is an exact match;
361+
a typo silently disables the floor (shared with
362+
`Deployment.gpu-operator.version`).
363+
348364
For a query `{service: eks, accelerator: gb200, intent: training}`,
349365
the resolver returns three independent maximal leaves —
350366
`gb200-eks-training` (matched by explicit criteria), `gb200-any`

docs/contributor/validator.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -611,6 +611,11 @@ tagged with its cordon state, and:
611611
schedulable count: it is `0` on the all-cordoned and busy-skip
612612
paths (nothing was attempted yet) and the successful-node count on
613613
the failure path (a partial pass is not conflated with a full one).
614+
Exception: when the recipe declares `Deployment.gpu-driver.version`,
615+
those same all-cordoned and busy paths (and the no-GPU-nodes path)
616+
fail closed instead of Skip — a declared host-driver floor that
617+
cannot be measured must not PASS (#1995). Skip remains only when
618+
the floor constraint is absent.
614619
The `RESULT:` prefix is `pkg/validator/validator.go`'s
615620
`resultSummaryPrefix` convention: the validator runtime echoes the
616621
trailing text of any such stdout line into live CLI output via

docs/integrator/go-library.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,10 @@ and extraction are bounded, content digests are checked while streaming, and
375375
archive traversal, links, devices, oversized content, and malformed catalogs
376376
fail closed before the provider is activated.
377377

378+
OCI sources use credentials from the standard Docker configuration
379+
(`~/.docker/config.json` or `$DOCKER_CONFIG`) and may invoke the configured
380+
credential helper for the selected registry host.
381+
378382
Use `NewClientContext` so caller cancellation and tighter deadlines
379383
propagate through registry authentication, download, extraction, and catalog
380384
validation:
@@ -443,7 +447,9 @@ client, err := aicr.NewClient(
443447
to `WithAllowLists`.
444448
- **`WithOCISourceTempDir(parent string)`** selects an existing writable
445449
parent for an OCI-backed Client's private workspace. It is rejected for
446-
embedded and filesystem sources.
450+
embedded and filesystem sources. Budget capacity for up to a 64 MiB staged
451+
compressed layer plus a 128 MiB extracted tree, along with filesystem and
452+
manifest overhead.
447453

448454
`AllowLists` is a facade-owned struct whose `Accelerators`, `Services`,
449455
`Intents`, and `OSTypes` fields are plain `[]string` slices, so callers

0 commit comments

Comments
 (0)