From cc616cf5b00e460e39a1ea570a8a347542a064e0 Mon Sep 17 00:00:00 2001 From: balaji Date: Fri, 17 Jul 2026 09:22:23 -0700 Subject: [PATCH 1/5] fix(nvca): make ModelCache envtest job completion version-adaptive TestReconcile_ModelCache drives the writer Job to completion by faking its status against the real envtest apiserver. The apiserver's Job-status validation differs by version: k8s 1.30-1.33 reject a SuccessCriteriaMet condition on this NonIndexed Job (it has no SuccessPolicy), while k8s 1.34+ require SuccessCriteriaMet before Complete and reject CompletionTime without Complete. No single static condition shape satisfies both, and the Job spec is reconciler-owned and immutable on update. The reconciler detects completion via CompletionTime + Succeeded, not the conditions. Extract a completeJob helper that applies the modern (>= 1.34) condition shape and falls back to the pre-1.34 shape only if the apiserver rejects it, so the test passes on both. Verified against envtest 1.30.3 and 1.34.1 (nvca pins 1.34). Closes NVIDIA/nvcf#238 Co-authored-by: Balaji Ganesan Co-Authored-By: Claude Opus 4.8 (1M context) --- .../nvca/pkg/storage/modelcache_test.go | 60 ++++++++++++++----- 1 file changed, 46 insertions(+), 14 deletions(-) diff --git a/src/compute-plane-services/nvca/pkg/storage/modelcache_test.go b/src/compute-plane-services/nvca/pkg/storage/modelcache_test.go index e0eca183b..e26b4ce7b 100644 --- a/src/compute-plane-services/nvca/pkg/storage/modelcache_test.go +++ b/src/compute-plane-services/nvca/pkg/storage/modelcache_test.go @@ -270,20 +270,15 @@ func TestReconcile_ModelCache(t *testing.T) { }, 5*time.Second, 50*time.Millisecond) } - initJob.Status.Succeeded++ - initJob.Status.CompletionTime = &metav1.Time{Time: time.Now()} - initJob.Status.Conditions = append(initJob.Status.Conditions, - batchv1.JobCondition{ - Type: batchv1.JobSuccessCriteriaMet, - Status: corev1.ConditionTrue, - }, - batchv1.JobCondition{ - Type: batchv1.JobComplete, - Status: corev1.ConditionTrue, - }, - ) - err = c.Status().Update(ctx, initJob) - require.NoError(t, err) + // Drive the writer Job to completion. The reconciler keys off + // CompletionTime + Succeeded (see modelcache.go), not the conditions, but + // the apiserver validates the condition shape and its rules differ by + // version: k8s >= 1.34 requires SuccessCriteriaMet before Complete, while + // k8s 1.30-1.33 reject SuccessCriteriaMet on this NonIndexed Job (it has no + // SuccessPolicy). The Job's spec is reconciler-owned and immutable here, so + // apply the modern shape and fall back to the pre-1.34 shape if the running + // apiserver rejects it. + completeJob(ctx, t, c, initJob) for _, st := range sts { assert.EventuallyWithT(t, func(ct *assert.CollectT) { @@ -732,3 +727,40 @@ func TestMapPodIssuesToFailureReason(t *testing.T) { }) } } + +// completeJob marks a writer Job as succeeded in a way the running apiserver +// accepts. The reconciler detects completion via CompletionTime + Succeeded +// (see modelcache.go), not the Job conditions, but the apiserver still +// validates the condition shape and its rules changed across versions: +// - k8s >= 1.34 requires a SuccessCriteriaMet condition before Complete, and +// rejects CompletionTime without Complete. +// - k8s 1.30-1.33 reject SuccessCriteriaMet on a NonIndexed Job that has no +// SuccessPolicy, which is exactly this writer Job's shape. +// +// The Job's spec is reconciler-owned and immutable on update, so the test +// cannot reshape it to satisfy both. Apply the modern (>= 1.34) condition shape +// and fall back to the pre-1.34 shape only if the apiserver rejects it. +func completeJob(ctx context.Context, t *testing.T, c client.Client, job *batchv1.Job) { + t.Helper() + + job.Status.Succeeded = 1 + job.Status.CompletionTime = &metav1.Time{Time: time.Now()} + job.Status.Conditions = append(job.Status.Conditions, + batchv1.JobCondition{Type: batchv1.JobSuccessCriteriaMet, Status: corev1.ConditionTrue}, + batchv1.JobCondition{Type: batchv1.JobComplete, Status: corev1.ConditionTrue}, + ) + if err := c.Status().Update(ctx, job); err == nil { + return + } + + // Pre-1.34 apiserver rejected SuccessCriteriaMet. Re-fetch to reset the + // stale in-memory status and apply only Complete, which those versions + // accept alongside CompletionTime. + require.NoError(t, c.Get(ctx, client.ObjectKeyFromObject(job), job)) + job.Status.Succeeded = 1 + job.Status.CompletionTime = &metav1.Time{Time: time.Now()} + job.Status.Conditions = append(job.Status.Conditions, + batchv1.JobCondition{Type: batchv1.JobComplete, Status: corev1.ConditionTrue}, + ) + require.NoError(t, c.Status().Update(ctx, job)) +} From 57223095e8bff48f924cce5071bdcd53159adec8 Mon Sep 17 00:00:00 2001 From: balaji Date: Fri, 17 Jul 2026 10:20:30 -0700 Subject: [PATCH 2/5] ci(nvca): enable nvca test row and gate ModelCache retry on invalid errors Flip the nvca Bazel matrix row from tests_skip to tests-run now that TestReconcile_ModelCache is version-adaptive. The row's comment already said "tests run" but the field still skipped them; this makes the two agree. Also address review feedback on completeJob: only fall back to the pre-1.34 Job condition shape when the apiserver returns an Invalid (validation) error. Any other error (conflict, network, RBAC) now surfaces immediately instead of being masked by the second Status().Update. Verified pkg/storage against envtest 1.30.3 and 1.34.1. Co-authored-by: Balaji Ganesan Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/bazel.yml | 10 ++++++---- .../nvca/pkg/storage/modelcache_test.go | 7 ++++++- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/.github/workflows/bazel.yml b/.github/workflows/bazel.yml index bfe24ca70..08985be5b 100644 --- a/.github/workflows/bazel.yml +++ b/.github/workflows/bazel.yml @@ -83,9 +83,11 @@ jobs: # umbrella-phase1: //src/libraries/go/lib test issues (NVCF-10337; # icms-translate env-flaky, core_test goroutine leak) -- nvcf-go # team owns the test-layer cleanup. - # nvca: tests run. TestReconcile_ModelCache (NVCF-10347) now - # passes under the bazel-ci envtest, verified locally against - # envtest 1.34.1 (5/5). The only flaky test, + # nvca: tests run. TestReconcile_ModelCache (NVCF-10347) drives the + # writer Job to completion and is version-adaptive: it applies the + # k8s >= 1.34 Job condition shape and falls back to the pre-1.34 + # shape if the apiserver rejects it, so it passes on the bazel-ci + # envtest (verified against 1.30.3 and 1.34.1). The only flaky test, # TestBackendK8sCacheQueryAPIs, is t.Skip'd at the source with a # reference (informer/lister sync race, nvca-team fix). # nvsnap (src/compute-plane-services/nvsnap): intentionally NOT a @@ -100,7 +102,7 @@ jobs: http-invocation|src/invocation-plane-services/http-invocation|false llm-api-gateway|src/invocation-plane-services/llm-api-gateway|false vanity-gateway|src/invocation-plane-services/vanity-gateway|false - nvca|src/compute-plane-services/nvca|true + nvca|src/compute-plane-services/nvca|false ess-agent|src/compute-plane-services/ess-agent|false image-credential-helper|src/compute-plane-services/image-credential-helper|false function-autoscaler|src/control-plane-services/function-autoscaler|false diff --git a/src/compute-plane-services/nvca/pkg/storage/modelcache_test.go b/src/compute-plane-services/nvca/pkg/storage/modelcache_test.go index e26b4ce7b..c0088fe87 100644 --- a/src/compute-plane-services/nvca/pkg/storage/modelcache_test.go +++ b/src/compute-plane-services/nvca/pkg/storage/modelcache_test.go @@ -749,9 +749,14 @@ func completeJob(ctx context.Context, t *testing.T, c client.Client, job *batchv batchv1.JobCondition{Type: batchv1.JobSuccessCriteriaMet, Status: corev1.ConditionTrue}, batchv1.JobCondition{Type: batchv1.JobComplete, Status: corev1.ConditionTrue}, ) - if err := c.Status().Update(ctx, job); err == nil { + err := c.Status().Update(ctx, job) + if err == nil { return } + // Only a validation rejection means the modern condition shape is wrong for + // this apiserver version. Any other error (conflict, network, RBAC) is a + // real failure and must surface, not be masked by the fallback write. + require.True(t, apierrors.IsInvalid(err), "unexpected error updating Job status: %v", err) // Pre-1.34 apiserver rejected SuccessCriteriaMet. Re-fetch to reset the // stale in-memory status and apply only Complete, which those versions From 95545e0b5dcac713432b961d4770edbffd258d02 Mon Sep 17 00:00:00 2001 From: balaji Date: Fri, 17 Jul 2026 10:23:08 -0700 Subject: [PATCH 3/5] docs(ci): drop internal tracker IDs from bazel.yml comments The bazel matrix comments referenced internal issue IDs, which should not appear in the public mirror. Describe the test-skip reasons without them. Co-authored-by: Balaji Ganesan Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/bazel.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/bazel.yml b/.github/workflows/bazel.yml index 08985be5b..356c46af4 100644 --- a/.github/workflows/bazel.yml +++ b/.github/workflows/bazel.yml @@ -80,10 +80,10 @@ jobs: run: | set -euo pipefail # id|path|tests_skip. tests_skip notes: - # umbrella-phase1: //src/libraries/go/lib test issues (NVCF-10337; - # icms-translate env-flaky, core_test goroutine leak) -- nvcf-go + # umbrella-phase1: //src/libraries/go/lib test issues + # (icms-translate env-flaky, core_test goroutine leak) -- nvcf-go # team owns the test-layer cleanup. - # nvca: tests run. TestReconcile_ModelCache (NVCF-10347) drives the + # nvca: tests run. TestReconcile_ModelCache drives the # writer Job to completion and is version-adaptive: it applies the # k8s >= 1.34 Job condition shape and falls back to the pre-1.34 # shape if the apiserver rejects it, so it passes on the bazel-ci From afd38ec4e83503f8b0d0e24c4add1711c80c89d1 Mon Sep 17 00:00:00 2001 From: balaji Date: Fri, 17 Jul 2026 12:21:39 -0700 Subject: [PATCH 4/5] ci(nvca): keep nvca build-only; suite has other envtest failures Enabling `bazel test //...` for nvca surfaced failures beyond the ModelCache test this PR fixes: TestGetMiniServiceRBACCmData and TestGetNetworkPoliciesData* in //pkg/operator/reconcile, and the TestCreateMiniService_* (GVK/412) and Test_applyContainerTaskCreationMessage tests in //pkg/nvca. Those are separate test-layer issues for the nvca team. Revert the row to build-only so this PR stays a clean ModelCache fix. The full enablement backlog is tracked in NVIDIA/nvcf#238. Co-authored-by: Balaji Ganesan Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/bazel.yml | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/.github/workflows/bazel.yml b/.github/workflows/bazel.yml index 356c46af4..982ef6868 100644 --- a/.github/workflows/bazel.yml +++ b/.github/workflows/bazel.yml @@ -83,13 +83,18 @@ jobs: # umbrella-phase1: //src/libraries/go/lib test issues # (icms-translate env-flaky, core_test goroutine leak) -- nvcf-go # team owns the test-layer cleanup. - # nvca: tests run. TestReconcile_ModelCache drives the - # writer Job to completion and is version-adaptive: it applies the - # k8s >= 1.34 Job condition shape and falls back to the pre-1.34 - # shape if the apiserver rejects it, so it passes on the bazel-ci - # envtest (verified against 1.30.3 and 1.34.1). The only flaky test, - # TestBackendK8sCacheQueryAPIs, is t.Skip'd at the source with a - # reference (informer/lister sync race, nvca-team fix). + # nvca: build-only. TestReconcile_ModelCache (pkg/storage) is now + # version-adaptive and passes, but enabling `bazel test //...` + # surfaces other failures under the bazel-ci envtest that are the + # nvca team's to fix at the test layer (do not change reconciler + # logic to satisfy them): + # //pkg/operator/reconcile: TestGetMiniServiceRBACCmData, + # TestGetNetworkPoliciesDataEmptyDDCSIPList, + # TestGetNetworkPoliciesDataWithDDCSIPList (pass under `go test`, + # differ under Bazel envtest). + # //pkg/nvca: TestCreateMiniService_Function/_Task/_TaskDelayedAck + # (412 "Need to add GVK to test"), Test_applyContainerTaskCreationMessage. + # Tracked in NVIDIA/nvcf#238. Flip to run once those are green. # nvsnap (src/compute-plane-services/nvsnap): intentionally NOT a # matrix row. It is a self-contained Bazel module whose OCI base is # its own private agent image (not publicly pullable), so it is not @@ -102,7 +107,7 @@ jobs: http-invocation|src/invocation-plane-services/http-invocation|false llm-api-gateway|src/invocation-plane-services/llm-api-gateway|false vanity-gateway|src/invocation-plane-services/vanity-gateway|false - nvca|src/compute-plane-services/nvca|false + nvca|src/compute-plane-services/nvca|true ess-agent|src/compute-plane-services/ess-agent|false image-credential-helper|src/compute-plane-services/image-credential-helper|false function-autoscaler|src/control-plane-services/function-autoscaler|false From 31bf6e766f7bb0b6e598b96310918714a622fb4a Mon Sep 17 00:00:00 2001 From: Balaji Ganesan Date: Sun, 19 Jul 2026 16:23:57 -0700 Subject: [PATCH 5/5] fix(nvca): fix the envtest suite at the test layer and re-enable matrix tests Fix every failure that kept the nvca bazel matrix row build-only, all at the test layer (no reconciler or production changes), and flip the row to run tests: - Vendored dra-driver init panic: featuregates init() panics unless a real version is stamped over internal/info's "unknown" default. The module's own Makefile stamps it with go build -ldflags -X; mirror that in Bazel with x_defs on the vendored info go_library (relative key so rules_go qualifies it against importmap). Unblocks internal/miniservice, pkg/dra, pkg/nvca, and pkg/webhook, whose test binaries died before running a single test. - SPDX license stamping fallout: the header comment block before the first YAML doc separator made decodeInferenceManifests fail on an empty GVK (skip contentless docs in decodeYAMLFile), and headers stamped once per source file appear a different number of times in rendered operator assets vs testdata goldens (normalize both sides with stripSPDXHeaders; Kubernetes ignores YAML comments). Fixes TestCreateMiniService_*, TestGetMiniServiceRBACCmData, and TestGetNetworkPoliciesData*. - Hermetic kubeconfig test: the empty-KUBECONFIG subtest fell back to the machine's real ~/.kube/config and built a client where an error was expected; point it at a nonexistent path instead. Verified: the full nvca suite passes under go test (66 packages, envtest 1.34.1), the three ModelCache envtests also pass against envtest 1.30.3 (the completeJob fallback path), and the previously panicking pkg/dra and pkg/webhook targets pass under bazel test with the x_defs stamp. Co-authored-by: Balaji Ganesan Co-authored-by: Claude Fable 5 --- .github/workflows/bazel.yml | 21 ++++++--------- .../nvca/cmd/internal/util_test.go | 7 ++++- .../k8scomputebackend_miniservice_test.go | 6 +++++ .../miniservice_restrictions_test.go | 2 +- .../reconcile/nvcaagent_reconcile_test.go | 27 +++++++++++++++++-- .../internal/info/BUILD.bazel | 6 +++++ 6 files changed, 52 insertions(+), 17 deletions(-) diff --git a/.github/workflows/bazel.yml b/.github/workflows/bazel.yml index 982ef6868..f0e77c427 100644 --- a/.github/workflows/bazel.yml +++ b/.github/workflows/bazel.yml @@ -83,18 +83,13 @@ jobs: # umbrella-phase1: //src/libraries/go/lib test issues # (icms-translate env-flaky, core_test goroutine leak) -- nvcf-go # team owns the test-layer cleanup. - # nvca: build-only. TestReconcile_ModelCache (pkg/storage) is now - # version-adaptive and passes, but enabling `bazel test //...` - # surfaces other failures under the bazel-ci envtest that are the - # nvca team's to fix at the test layer (do not change reconciler - # logic to satisfy them): - # //pkg/operator/reconcile: TestGetMiniServiceRBACCmData, - # TestGetNetworkPoliciesDataEmptyDDCSIPList, - # TestGetNetworkPoliciesDataWithDDCSIPList (pass under `go test`, - # differ under Bazel envtest). - # //pkg/nvca: TestCreateMiniService_Function/_Task/_TaskDelayedAck - # (412 "Need to add GVK to test"), Test_applyContainerTaskCreationMessage. - # Tracked in NVIDIA/nvcf#238. Flip to run once those are green. + # nvca: tests run. The failures tracked in NVIDIA/nvcf#238 were all + # test-layer and are fixed: the vendored dra-driver version stamp + # (x_defs on vendor/.../internal/info, mirroring the module + # Makefile's -ldflags -X), SPDX license headers in testdata and + # rendered template assets (empty-YAML-doc skip + stripSPDXHeaders + # in golden comparisons), and the version-adaptive completeJob for + # envtest Job completion. # nvsnap (src/compute-plane-services/nvsnap): intentionally NOT a # matrix row. It is a self-contained Bazel module whose OCI base is # its own private agent image (not publicly pullable), so it is not @@ -107,7 +102,7 @@ jobs: http-invocation|src/invocation-plane-services/http-invocation|false llm-api-gateway|src/invocation-plane-services/llm-api-gateway|false vanity-gateway|src/invocation-plane-services/vanity-gateway|false - nvca|src/compute-plane-services/nvca|true + nvca|src/compute-plane-services/nvca|false ess-agent|src/compute-plane-services/ess-agent|false image-credential-helper|src/compute-plane-services/image-credential-helper|false function-autoscaler|src/control-plane-services/function-autoscaler|false diff --git a/src/compute-plane-services/nvca/cmd/internal/util_test.go b/src/compute-plane-services/nvca/cmd/internal/util_test.go index 615440008..f8f4f7247 100644 --- a/src/compute-plane-services/nvca/cmd/internal/util_test.go +++ b/src/compute-plane-services/nvca/cmd/internal/util_test.go @@ -50,7 +50,12 @@ func TestNewK8sClient(t *testing.T) { kcPath: "", currContext: "", setupEnv: func() { - os.Setenv(clientcmd.RecommendedConfigPathEnvVar, "") + // Point at a path that cannot exist rather than "": an empty + // KUBECONFIG makes client-go fall back to ~/.kube/config, so on + // a machine with a real kubeconfig the client unexpectedly + // builds and the test fails. A nonexistent path keeps the + // intent (no usable kubeconfig) hermetic everywhere. + os.Setenv(clientcmd.RecommendedConfigPathEnvVar, "/nonexistent/kubeconfig") }, cleanupEnv: func() { os.Unsetenv(clientcmd.RecommendedConfigPathEnvVar) diff --git a/src/compute-plane-services/nvca/pkg/nvca/k8scomputebackend_miniservice_test.go b/src/compute-plane-services/nvca/pkg/nvca/k8scomputebackend_miniservice_test.go index 7090d14dc..febf11bd4 100644 --- a/src/compute-plane-services/nvca/pkg/nvca/k8scomputebackend_miniservice_test.go +++ b/src/compute-plane-services/nvca/pkg/nvca/k8scomputebackend_miniservice_test.go @@ -908,6 +908,12 @@ func decodeYAMLFile(t *testing.T, fp string) []*unstructured.Unstructured { err = sigsyaml.Unmarshal(doc, &obj.Object) require.NoError(t, err) + // Skip documents with no content, e.g. the license header comment + // block before the first separator or a trailing separator. + if len(obj.Object) == 0 { + continue + } + objs = append(objs, obj) } diff --git a/src/compute-plane-services/nvca/pkg/operator/reconcile/miniservice_restrictions_test.go b/src/compute-plane-services/nvca/pkg/operator/reconcile/miniservice_restrictions_test.go index 239ca32d2..d43783805 100644 --- a/src/compute-plane-services/nvca/pkg/operator/reconcile/miniservice_restrictions_test.go +++ b/src/compute-plane-services/nvca/pkg/operator/reconcile/miniservice_restrictions_test.go @@ -329,7 +329,7 @@ rules: } else if assert.NoError(t, err) { assert.NotNil(t, data) assert.Contains(t, data, MiniServicesPermissionsRoleName) - assert.Equal(t, tt.expRole, data[MiniServicesPermissionsRoleName]) + assert.Equal(t, tt.expRole, stripSPDXHeaders(data[MiniServicesPermissionsRoleName])) } }) } diff --git a/src/compute-plane-services/nvca/pkg/operator/reconcile/nvcaagent_reconcile_test.go b/src/compute-plane-services/nvca/pkg/operator/reconcile/nvcaagent_reconcile_test.go index 504d97df2..ce3f68ea7 100644 --- a/src/compute-plane-services/nvca/pkg/operator/reconcile/nvcaagent_reconcile_test.go +++ b/src/compute-plane-services/nvca/pkg/operator/reconcile/nvcaagent_reconcile_test.go @@ -24,6 +24,7 @@ import ( "fmt" "io" "path/filepath" + "strings" "testing" "time" @@ -59,6 +60,28 @@ func readTestdataFile(t *testing.T, fileName string) string { return string(b) } +// stripSPDXHeaders removes the SPDX license header comment blocks that repo +// license stamping adds to rendered template assets and testdata goldens. The +// headers carry no semantic content (Kubernetes ignores YAML comments), appear +// a different number of times on each side of a golden comparison (once per +// stamped source file), and would otherwise churn every golden assertion each +// time stamping changes. +func stripSPDXHeaders(s string) string { + lines := strings.Split(s, "\n") + out := make([]string, 0, len(lines)) + for i := 0; i < len(lines); i++ { + if strings.HasPrefix(lines[i], "# SPDX-") { + // Swallow the blank line that closes a header block. + if i+1 < len(lines) && strings.TrimSpace(lines[i+1]) == "" { + i++ + } + continue + } + out = append(out, lines[i]) + } + return strings.Join(out, "\n") +} + func TestValidateNVCFBackendParams(t *testing.T) { tests := []struct { name string @@ -2460,7 +2483,7 @@ func TestGetNetworkPoliciesDataEmptyDDCSIPList(t *testing.T) { io.WriteString(b, "---\n") io.WriteString(b, got[k]) } - assert.Equal(t, readTestdataFile(t, filepath.Join("testdata", "netpols.yaml")), b.String()) + assert.Equal(t, stripSPDXHeaders(readTestdataFile(t, filepath.Join("testdata", "netpols.yaml"))), stripSPDXHeaders(b.String())) } func TestGetNetworkPoliciesDataWithDDCSIPList(t *testing.T) { @@ -2493,7 +2516,7 @@ func TestGetNetworkPoliciesDataWithDDCSIPList(t *testing.T) { io.WriteString(b, "---\n") io.WriteString(b, got[k]) } - assert.Equal(t, readTestdataFile(t, filepath.Join("testdata", "netpols_with_ddcs.yaml")), b.String()) + assert.Equal(t, stripSPDXHeaders(readTestdataFile(t, filepath.Join("testdata", "netpols_with_ddcs.yaml"))), stripSPDXHeaders(b.String())) } func assertNetworkPolicyAllowsTCPPort(t *testing.T, policyYAML, policyName string, port int32) { diff --git a/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/k8s-dra-driver-gpu/internal/info/BUILD.bazel b/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/k8s-dra-driver-gpu/internal/info/BUILD.bazel index 5001e0f0a..df2f9579c 100644 --- a/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/k8s-dra-driver-gpu/internal/info/BUILD.bazel +++ b/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/k8s-dra-driver-gpu/internal/info/BUILD.bazel @@ -6,6 +6,12 @@ go_library( importmap = "github.com/NVIDIA/nvcf/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/k8s-dra-driver-gpu/internal/info", importpath = "github.com/NVIDIA/k8s-dra-driver-gpu/internal/info", visibility = ["//vendor/github.com/NVIDIA/k8s-dra-driver-gpu:__subpackages__"], + # The dra-driver's featuregates init() panics unless a real version is + # stamped over the "unknown" default. Upstream sets this with go build + # -ldflags -X (see this module's Makefile); mirror it here so every test + # and binary that transitively links this package starts. The relative key + # lets rules_go qualify it against importmap for vendored builds. + x_defs = {"version": "v25.8.0"}, ) alias(