diff --git a/recipes/checks/agentgateway-crds/health-check.yaml b/recipes/checks/agentgateway-crds/health-check.yaml index 0c4fe0ead..07ca7e9d6 100644 --- a/recipes/checks/agentgateway-crds/health-check.yaml +++ b/recipes/checks/agentgateway-crds/health-check.yaml @@ -150,6 +150,8 @@ spec: status: (conditions[?type == 'Established']): - status: "True" + # Deprecated v1alpha2 InferencePool, retained for a transition window + # (see the manifest header). Still installed, so still asserted. - assert: resource: apiVersion: apiextensions.k8s.io/v1 diff --git a/recipes/components/agentgateway-crds/manifests/inference-extension-crds.yaml b/recipes/components/agentgateway-crds/manifests/inference-extension-crds.yaml index b03890aa4..8e5ec2e1e 100644 --- a/recipes/components/agentgateway-crds/manifests/inference-extension-crds.yaml +++ b/recipes/components/agentgateway-crds/manifests/inference-extension-crds.yaml @@ -12,10 +12,24 @@ # See the License for the specific language governing permissions and # limitations under the License. -# Gateway API Inference Extension CRDs (v1.3.0) -# Source: https://github.com/kubernetes-sigs/gateway-api-inference-extension/releases/download/v1.3.0/manifests.yaml +# Gateway API Inference Extension CRDs (v1.5.0) +# Source: https://github.com/kubernetes-sigs/gateway-api-inference-extension/tree/v1.5.0/config/crd/bases # Required by agentgateway for InferencePool and InferenceObjective resources. # +# DIVERGENCE FROM UPSTREAM v1.5.0: this bundle also retains +# inferencepools.inference.networking.x-k8s.io (v1alpha2), which upstream +# removed. Deleting it garbage-collects every v1alpha2 InferencePool +# cluster-wide, and the stable v1 CRD is a different API group with an +# incompatible schema, so the API server cannot convert those objects. +# +# The stanza is deprecated (see deprecationWarning below) and carries Helm and +# Argo CD retention guards. Do NOT remove it without shipping, in the same +# release, a preflight that fails closed when any v1alpha2 InferencePool still +# exists: the guards are read off the LIVE cluster object, so a cluster that +# skipped the deprecation window never received them and would still be pruned. +# +# Deprecation window, removal gates, and migration steps: see #2214. +# # These CRDs are not included in the agentgateway-crds Helm chart and must # be installed separately. Vendored here for fully automated deployment. # @@ -24,7 +38,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - inference.networking.k8s.io/bundle-version: v1.3.0 + inference.networking.k8s.io/bundle-version: v1.5.0 name: inferencemodelrewrites.inference.networking.x-k8s.io spec: group: inference.networking.x-k8s.io @@ -260,7 +274,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - inference.networking.k8s.io/bundle-version: v1.3.0 + inference.networking.k8s.io/bundle-version: v1.5.0 name: inferenceobjectives.inference.networking.x-k8s.io spec: group: inference.networking.x-k8s.io @@ -353,7 +367,7 @@ spec: Fairness is only enforced and tracked between requests of the same priority. Example: requests with Priority 10 will always be served before - requests with Priority of 0 (the value used if Priority is unset or no InfereneceObjective is specified). + requests with Priority of 0 (the value used if Priority is unset or no InferenceObjective is specified). Similarly requests with a Priority of -10 will always be served after requests with Priority of 0. type: integer required: @@ -451,7 +465,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - inference.networking.k8s.io/bundle-version: v1.3.0 + inference.networking.k8s.io/bundle-version: v1.5.0 name: inferencepoolimports.inference.networking.x-k8s.io spec: group: inference.networking.x-k8s.io @@ -783,7 +797,7 @@ kind: CustomResourceDefinition metadata: annotations: api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api-inference-extension/pull/1173 - inference.networking.k8s.io/bundle-version: v1.3.0 + inference.networking.k8s.io/bundle-version: v1.5.0 name: inferencepools.inference.networking.k8s.io spec: group: inference.networking.k8s.io @@ -822,6 +836,20 @@ spec: spec: description: Spec defines the desired state of the InferencePool. properties: + appProtocol: + default: http + description: |- + AppProtocol describes the application protocol for all the target ports. + + If unspecified, the protocol defaults to HTTP/1.1. + + Supported values include: + * "http": HTTP/1.1. This is the default. + * "kubernetes.io/h2c": HTTP/2 over cleartext. + enum: + - http + - kubernetes.io/h2c + type: string endpointPickerRef: description: |- EndpointPickerRef is a reference to the Endpoint Picker extension and its @@ -1144,6 +1172,10 @@ metadata: annotations: api-approved.kubernetes.io: unapproved, experimental-only inference.networking.k8s.io/bundle-version: v1.3.0 + # Retention guards. Must be applied while the CRD is still in the bundle: + # both are read off the live object at prune time (see header). + helm.sh/resource-policy: "keep" + argocd.argoproj.io/sync-options: "Delete=false,Prune=false" name: inferencepools.inference.networking.x-k8s.io spec: group: inference.networking.x-k8s.io @@ -1156,7 +1188,11 @@ spec: singular: inferencepool scope: Namespaced versions: - - name: v1alpha2 + - deprecated: true + deprecationWarning: inference.networking.x-k8s.io/v1alpha2 InferencePool is deprecated; + migrate to inference.networking.k8s.io/v1 InferencePool. Retained for a transition + window and removed in a future AICR release. See NVIDIA/aicr#2214. + name: v1alpha2 schema: openAPIV3Schema: description: InferencePool is the Schema for the InferencePools API. diff --git a/tests/chainsaw/ai-conformance/cluster/assert-crds.yaml b/tests/chainsaw/ai-conformance/cluster/assert-crds.yaml index e2cc501b8..eb41467bf 100644 --- a/tests/chainsaw/ai-conformance/cluster/assert-crds.yaml +++ b/tests/chainsaw/ai-conformance/cluster/assert-crds.yaml @@ -52,7 +52,7 @@ metadata: apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: - name: inferencepools.inference.networking.x-k8s.io + name: inferencepools.inference.networking.k8s.io --- # ── dynamo-platform (bundled CRDs) ──────────────────────────────────── apiVersion: apiextensions.k8s.io/v1 diff --git a/tests/chainsaw/ai-conformance/kind-inference-dynamo/assert-crds.yaml b/tests/chainsaw/ai-conformance/kind-inference-dynamo/assert-crds.yaml index 7791b3711..b28ea4d0c 100644 --- a/tests/chainsaw/ai-conformance/kind-inference-dynamo/assert-crds.yaml +++ b/tests/chainsaw/ai-conformance/kind-inference-dynamo/assert-crds.yaml @@ -50,7 +50,7 @@ metadata: apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: - name: inferencepools.inference.networking.x-k8s.io + name: inferencepools.inference.networking.k8s.io --- # dynamo-platform (bundled CRDs) apiVersion: apiextensions.k8s.io/v1 diff --git a/validators/conformance/inference_gateway_check.go b/validators/conformance/inference_gateway_check.go index 2551a9045..ad804ae90 100644 --- a/validators/conformance/inference_gateway_check.go +++ b/validators/conformance/inference_gateway_check.go @@ -125,7 +125,7 @@ func CheckInferenceGateway(ctx *validators.Context) error { requiredCRDs := []string{ "gateways.gateway.networking.k8s.io", "httproutes.gateway.networking.k8s.io", - "inferencepools.inference.networking.x-k8s.io", + "inferencepools.inference.networking.k8s.io", } var crdSummary strings.Builder for _, crdName := range requiredCRDs {