diff --git a/Dockerfile b/Dockerfile index 4f4e53afe60..5d1db2bb7ba 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,6 +6,8 @@ WORKDIR /go/src/github.com/kserve/kserve COPY go.mod go.mod COPY go.sum go.sum +# Allow Go to automatically download the required toolchain version +ENV GOTOOLCHAIN=auto RUN go mod download COPY cmd/ cmd/ diff --git a/Makefile b/Makefile index 09b66443b8b..af4de8516ac 100644 --- a/Makefile +++ b/Makefile @@ -198,6 +198,9 @@ test: fmt vet manifests envtest test-qpext test-qpext: cd qpext && go test -v ./... -cover +test-llmisvc: fmt vet manifests envtest + KUBEBUILDER_ASSETS="$$($(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" go test --timeout 20m ./pkg/controller/llmisvc/... -coverprofile coverage.out -coverpkg ./pkg/... ./cmd... + # Build manager binary manager: generate fmt vet go-lint go build -o bin/manager ./cmd/manager diff --git a/Makefile.tools.mk b/Makefile.tools.mk index 96dae13d2b0..43b9a489ed2 100644 --- a/Makefile.tools.mk +++ b/Makefile.tools.mk @@ -17,7 +17,7 @@ POETRY = $(PYTHON_BIN)/poetry ## Tool versions. GOLANGCI_LINT_VERSION ?= v1.64.8 -CONTROLLER_TOOLS_VERSION ?= v0.16.2 +CONTROLLER_TOOLS_VERSION ?= v0.17.2 ENVTEST_VERSION ?= latest YQ_VERSION ?= v4.28.1 HELM_DOCS_VERSION ?= v1.12.0 diff --git a/agent.Dockerfile b/agent.Dockerfile index c95f1d88611..73ebb12b954 100644 --- a/agent.Dockerfile +++ b/agent.Dockerfile @@ -6,6 +6,8 @@ WORKDIR /go/src/github.com/kserve/kserve COPY go.mod go.mod COPY go.sum go.sum +# Allow Go to automatically download the required toolchain version +ENV GOTOOLCHAIN=auto RUN go mod download COPY cmd/ cmd/ diff --git a/charts/kserve-crd-minimal/templates/serving.kserve.io_clusterservingruntimes.yaml b/charts/kserve-crd-minimal/templates/serving.kserve.io_clusterservingruntimes.yaml index d7111bbf1b5..8b0fba5a023 100644 --- a/charts/kserve-crd-minimal/templates/serving.kserve.io_clusterservingruntimes.yaml +++ b/charts/kserve-crd-minimal/templates/serving.kserve.io_clusterservingruntimes.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: clusterservingruntimes.serving.kserve.io spec: group: serving.kserve.io diff --git a/charts/kserve-crd-minimal/templates/serving.kserve.io_clusterstoragecontainers.yaml b/charts/kserve-crd-minimal/templates/serving.kserve.io_clusterstoragecontainers.yaml index ab3496538ef..287c03b290a 100644 --- a/charts/kserve-crd-minimal/templates/serving.kserve.io_clusterstoragecontainers.yaml +++ b/charts/kserve-crd-minimal/templates/serving.kserve.io_clusterstoragecontainers.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: clusterstoragecontainers.serving.kserve.io spec: group: serving.kserve.io diff --git a/charts/kserve-crd-minimal/templates/serving.kserve.io_inferencegraphs.yaml b/charts/kserve-crd-minimal/templates/serving.kserve.io_inferencegraphs.yaml index 6d54c209f73..e3193955738 100644 --- a/charts/kserve-crd-minimal/templates/serving.kserve.io_inferencegraphs.yaml +++ b/charts/kserve-crd-minimal/templates/serving.kserve.io_inferencegraphs.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: inferencegraphs.serving.kserve.io spec: group: serving.kserve.io diff --git a/charts/kserve-crd-minimal/templates/serving.kserve.io_inferenceservices.yaml b/charts/kserve-crd-minimal/templates/serving.kserve.io_inferenceservices.yaml index ebcaa6f0dab..f44cc4c401f 100644 --- a/charts/kserve-crd-minimal/templates/serving.kserve.io_inferenceservices.yaml +++ b/charts/kserve-crd-minimal/templates/serving.kserve.io_inferenceservices.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: inferenceservices.serving.kserve.io spec: group: serving.kserve.io diff --git a/charts/kserve-crd-minimal/templates/serving.kserve.io_llminferenceserviceconfigs.yaml b/charts/kserve-crd-minimal/templates/serving.kserve.io_llminferenceserviceconfigs.yaml index d1683616a09..e86fcea5538 100644 --- a/charts/kserve-crd-minimal/templates/serving.kserve.io_llminferenceserviceconfigs.yaml +++ b/charts/kserve-crd-minimal/templates/serving.kserve.io_llminferenceserviceconfigs.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: llminferenceserviceconfigs.serving.kserve.io spec: group: serving.kserve.io diff --git a/charts/kserve-crd-minimal/templates/serving.kserve.io_llminferenceservices.yaml b/charts/kserve-crd-minimal/templates/serving.kserve.io_llminferenceservices.yaml index d21c7b5455d..3753d5c2ebd 100644 --- a/charts/kserve-crd-minimal/templates/serving.kserve.io_llminferenceservices.yaml +++ b/charts/kserve-crd-minimal/templates/serving.kserve.io_llminferenceservices.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: llminferenceservices.serving.kserve.io spec: group: serving.kserve.io diff --git a/charts/kserve-crd-minimal/templates/serving.kserve.io_localmodelcaches.yaml b/charts/kserve-crd-minimal/templates/serving.kserve.io_localmodelcaches.yaml index 68e38339948..39f9a06fee4 100644 --- a/charts/kserve-crd-minimal/templates/serving.kserve.io_localmodelcaches.yaml +++ b/charts/kserve-crd-minimal/templates/serving.kserve.io_localmodelcaches.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: localmodelcaches.serving.kserve.io spec: group: serving.kserve.io diff --git a/charts/kserve-crd-minimal/templates/serving.kserve.io_localmodelnodegroups.yaml b/charts/kserve-crd-minimal/templates/serving.kserve.io_localmodelnodegroups.yaml index 27ffee9a7d8..00e287c987c 100644 --- a/charts/kserve-crd-minimal/templates/serving.kserve.io_localmodelnodegroups.yaml +++ b/charts/kserve-crd-minimal/templates/serving.kserve.io_localmodelnodegroups.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: localmodelnodegroups.serving.kserve.io spec: group: serving.kserve.io diff --git a/charts/kserve-crd-minimal/templates/serving.kserve.io_localmodelnodes.yaml b/charts/kserve-crd-minimal/templates/serving.kserve.io_localmodelnodes.yaml index dbc46f365f7..b086d929ca1 100644 --- a/charts/kserve-crd-minimal/templates/serving.kserve.io_localmodelnodes.yaml +++ b/charts/kserve-crd-minimal/templates/serving.kserve.io_localmodelnodes.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: localmodelnodes.serving.kserve.io spec: group: serving.kserve.io diff --git a/charts/kserve-crd-minimal/templates/serving.kserve.io_servingruntimes.yaml b/charts/kserve-crd-minimal/templates/serving.kserve.io_servingruntimes.yaml index cb1a5b17119..6fe5cb95141 100644 --- a/charts/kserve-crd-minimal/templates/serving.kserve.io_servingruntimes.yaml +++ b/charts/kserve-crd-minimal/templates/serving.kserve.io_servingruntimes.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: servingruntimes.serving.kserve.io spec: group: serving.kserve.io diff --git a/charts/kserve-crd-minimal/templates/serving.kserve.io_trainedmodels.yaml b/charts/kserve-crd-minimal/templates/serving.kserve.io_trainedmodels.yaml index fc68b2276d6..372b4f0405d 100644 --- a/charts/kserve-crd-minimal/templates/serving.kserve.io_trainedmodels.yaml +++ b/charts/kserve-crd-minimal/templates/serving.kserve.io_trainedmodels.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: trainedmodels.serving.kserve.io spec: group: serving.kserve.io diff --git a/charts/kserve-resources/templates/clusterrole.yaml b/charts/kserve-resources/templates/clusterrole.yaml index e91da4f2081..ec7a6a1533d 100644 --- a/charts/kserve-resources/templates/clusterrole.yaml +++ b/charts/kserve-resources/templates/clusterrole.yaml @@ -121,17 +121,6 @@ rules: - watch - apiGroups: - inference.networking.k8s.io - resources: - - inferencepools - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - inference.networking.x-k8s.io resources: - inferencemodels diff --git a/cmd/manager/main.go b/cmd/manager/main.go index 4c9762e7cec..ec6e7a752fa 100644 --- a/cmd/manager/main.go +++ b/cmd/manager/main.go @@ -33,6 +33,7 @@ import ( istioclientv1beta1 "istio.io/client-go/pkg/apis/networking/v1beta1" corev1 "k8s.io/api/core/v1" rbacv1 "k8s.io/api/rbac/v1" + "k8s.io/client-go/dynamic" "k8s.io/client-go/kubernetes" typedcorev1 "k8s.io/client-go/kubernetes/typed/core/v1" _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" @@ -311,10 +312,16 @@ func main() { setupLog.Info("Setting up LLMInferenceService controller") llmEventBroadcaster := record.NewBroadcaster() llmEventBroadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{Interface: clientSet.CoreV1().Events("")}) + dynamicClient, err := dynamic.NewForConfig(mgr.GetConfig()) + if err != nil { + setupLog.Error(err, "unable to create dynamic client") + os.Exit(1) + } if err = (&llmisvc.LLMInferenceServiceReconciler{ Client: mgr.GetClient(), Config: mgr.GetConfig(), Clientset: clientSet, + DynamicClient: dynamicClient, EventRecorder: llmEventBroadcaster.NewRecorder(scheme, corev1.EventSource{Component: "LLMInferenceServiceController"}), }).SetupWithManager(mgr); err != nil { setupLog.Error(err, "unable to create controller", "v1beta1Controller", "InferenceService") diff --git a/config/crd/full/serving.kserve.io_clusterservingruntimes.yaml b/config/crd/full/serving.kserve.io_clusterservingruntimes.yaml index 70e2860cc4f..6f00e8885bc 100644 --- a/config/crd/full/serving.kserve.io_clusterservingruntimes.yaml +++ b/config/crd/full/serving.kserve.io_clusterservingruntimes.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: clusterservingruntimes.serving.kserve.io spec: group: serving.kserve.io @@ -516,6 +516,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -604,6 +621,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -1032,6 +1066,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -1908,6 +1965,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: @@ -2585,6 +2661,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -3013,6 +3106,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -3855,6 +3971,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: diff --git a/config/crd/full/serving.kserve.io_clusterstoragecontainers.yaml b/config/crd/full/serving.kserve.io_clusterstoragecontainers.yaml index 8f799c5cdcc..6109c629363 100644 --- a/config/crd/full/serving.kserve.io_clusterstoragecontainers.yaml +++ b/config/crd/full/serving.kserve.io_clusterstoragecontainers.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: clusterstoragecontainers.serving.kserve.io spec: group: serving.kserve.io @@ -72,6 +72,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -500,6 +517,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: diff --git a/config/crd/full/serving.kserve.io_inferencegraphs.yaml b/config/crd/full/serving.kserve.io_inferencegraphs.yaml index a8d0690fe2a..d0b878cd93c 100644 --- a/config/crd/full/serving.kserve.io_inferencegraphs.yaml +++ b/config/crd/full/serving.kserve.io_inferencegraphs.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: inferencegraphs.serving.kserve.io spec: group: serving.kserve.io diff --git a/config/crd/full/serving.kserve.io_inferenceservices.yaml b/config/crd/full/serving.kserve.io_inferenceservices.yaml index fd438f9b650..f1c1710f271 100644 --- a/config/crd/full/serving.kserve.io_inferenceservices.yaml +++ b/config/crd/full/serving.kserve.io_inferenceservices.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: inferenceservices.serving.kserve.io spec: group: serving.kserve.io @@ -546,6 +546,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -966,6 +983,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic runtimeVersion: type: string securityContext: @@ -1409,6 +1449,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -1833,6 +1890,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -2165,6 +2245,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -2593,6 +2690,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -3713,6 +3833,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: @@ -4567,6 +4706,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -4991,6 +5147,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -5313,6 +5492,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -5735,6 +5931,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic runtimeVersion: type: string securityContext: @@ -6012,6 +6231,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -6440,6 +6676,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -6697,6 +6956,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -7119,6 +7395,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic runtimeVersion: type: string securityContext: @@ -7411,6 +7710,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -7842,6 +8158,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic runtime: type: string runtimeVersion: @@ -8118,6 +8457,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -8540,6 +8896,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic runtimeVersion: type: string securityContext: @@ -8820,6 +9199,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -9242,6 +9638,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic runtimeVersion: type: string securityContext: @@ -9509,6 +9928,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -9931,6 +10367,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic runtimeVersion: type: string securityContext: @@ -10205,6 +10664,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -10627,6 +11103,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic runtimeVersion: type: string securityContext: @@ -11073,6 +11572,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -11495,6 +12011,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic runtimeVersion: type: string securityContext: @@ -11764,6 +12303,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -12186,6 +12742,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic runtimeVersion: type: string securityContext: @@ -12533,6 +13112,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -12955,6 +13551,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic runtimeVersion: type: string securityContext: @@ -13772,6 +14391,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: @@ -14450,6 +15088,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -14878,6 +15533,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -15159,6 +15837,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -15587,6 +16282,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -15876,6 +16594,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -16304,6 +17039,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -17382,6 +18140,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: @@ -17614,6 +18391,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -18036,6 +18830,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic runtimeVersion: type: string securityContext: @@ -18926,6 +19743,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -19350,6 +20184,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -19682,6 +20539,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -20110,6 +20984,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -21230,6 +22127,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: diff --git a/config/crd/full/serving.kserve.io_llminferenceserviceconfigs.yaml b/config/crd/full/serving.kserve.io_llminferenceserviceconfigs.yaml index ca879e9ab6a..3b5fbb9ab33 100644 --- a/config/crd/full/serving.kserve.io_llminferenceserviceconfigs.yaml +++ b/config/crd/full/serving.kserve.io_llminferenceserviceconfigs.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: llminferenceserviceconfigs.serving.kserve.io spec: group: serving.kserve.io @@ -38,10 +38,6 @@ spec: model: properties: criticality: - enum: - - Critical - - Standard - - Sheddable type: string lora: properties: @@ -604,6 +600,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -1032,6 +1045,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -1316,6 +1352,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -1744,6 +1797,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -1985,6 +2061,8 @@ spec: type: boolean hostname: type: string + hostnameOverride: + type: string imagePullSecrets: items: properties: @@ -2042,6 +2120,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -2470,6 +2565,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -3549,6 +3667,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: @@ -4231,6 +4368,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -4659,6 +4813,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -4943,6 +5120,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -5371,6 +5565,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -5612,6 +5829,8 @@ spec: type: boolean hostname: type: string + hostnameOverride: + type: string imagePullSecrets: items: properties: @@ -5669,6 +5888,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -6097,6 +6333,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -7176,6 +7435,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: @@ -7431,6 +7709,7 @@ spec: type: string maxItems: 16 type: array + x-kubernetes-list-type: atomic parentRefs: items: properties: @@ -7468,6 +7747,7 @@ spec: type: object maxItems: 32 type: array + x-kubernetes-list-type: atomic rules: default: - matches: @@ -7482,6 +7762,66 @@ spec: filters: items: properties: + cors: + properties: + allowCredentials: + type: boolean + allowHeaders: + items: + maxLength: 256 + minLength: 1 + pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + allowMethods: + items: + enum: + - GET + - HEAD + - POST + - PUT + - DELETE + - CONNECT + - OPTIONS + - TRACE + - PATCH + - '*' + type: string + maxItems: 9 + type: array + x-kubernetes-list-type: set + x-kubernetes-validations: + - message: AllowMethods cannot contain '*' alongside other methods + rule: '!(''*'' in self && self.size() > 1)' + allowOrigins: + items: + maxLength: 253 + minLength: 1 + pattern: (^\*$)|(^([a-zA-Z][a-zA-Z0-9+\-.]+):\/\/([^:/?#]+)(:([0-9]{1,5}))?$) + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + x-kubernetes-validations: + - message: AllowOrigins cannot contain '*' alongside other origins + rule: '!(''*'' in self && self.size() > 1)' + exposeHeaders: + items: + maxLength: 256 + minLength: 1 + pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + maxAge: + default: 5 + format: int32 + minimum: 1 + type: integer + type: object extensionRef: properties: group: @@ -7502,6 +7842,92 @@ spec: - kind - name type: object + externalAuth: + properties: + backendRef: + properties: + group: + default: "" + maxLength: 253 + pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + kind: + default: Service + maxLength: 63 + minLength: 1 + pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ + type: string + name: + maxLength: 253 + minLength: 1 + type: string + namespace: + maxLength: 63 + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ + type: string + port: + format: int32 + maximum: 65535 + minimum: 1 + type: integer + required: + - name + type: object + x-kubernetes-validations: + - message: Must have port for Service reference + rule: '(size(self.group) == 0 && self.kind == ''Service'') ? has(self.port) : true' + forwardBody: + properties: + maxSize: + type: integer + type: object + grpc: + properties: + allowedHeaders: + items: + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + type: object + http: + properties: + allowedHeaders: + items: + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + allowedResponseHeaders: + items: + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + path: + maxLength: 1024 + pattern: ^(?:[-A-Za-z0-9/._~!$&'()*+,;=:@]|[%][0-9a-fA-F]{2})+$ + type: string + type: object + protocol: + enum: + - HTTP + - GRPC + type: string + required: + - backendRef + - protocol + type: object + x-kubernetes-validations: + - message: grpc must be specified when protocol is set to 'GRPC' + rule: 'self.protocol == ''GRPC'' ? has(self.grpc) : true' + - message: protocol must be 'GRPC' when grpc is set + rule: 'has(self.grpc) ? self.protocol == ''GRPC'' : true' + - message: http must be specified when protocol is set to 'HTTP' + rule: 'self.protocol == ''HTTP'' ? has(self.http) : true' + - message: protocol must be 'HTTP' when http is set + rule: 'has(self.http) ? self.protocol == ''HTTP'' : true' requestHeaderModifier: properties: add: @@ -7613,6 +8039,9 @@ spec: required: - backendRef type: object + x-kubernetes-validations: + - message: Only one of percent or fraction may be specified in HTTPRequestMirrorFilter + rule: '!(has(self.percent) && has(self.fraction))' requestRedirect: properties: hostname: @@ -7660,6 +8089,9 @@ spec: enum: - 301 - 302 + - 303 + - 307 + - 308 type: integer type: object responseHeaderModifier: @@ -7785,9 +8217,8 @@ spec: rule: '!(!has(self.extensionRef) && self.type == ''ExtensionRef'')' maxItems: 16 type: array + x-kubernetes-list-type: atomic x-kubernetes-validations: - - message: May specify either httpRouteFilterRequestRedirect or httpRouteFilterRequestRewrite, but not both - rule: '!(self.exists(f, f.type == ''RequestRedirect'') && self.exists(f, f.type == ''URLRewrite''))' - message: May specify either httpRouteFilterRequestRedirect or httpRouteFilterRequestRewrite, but not both rule: '!(self.exists(f, f.type == ''RequestRedirect'') && self.exists(f, f.type == ''URLRewrite''))' - message: RequestHeaderModifier filter cannot be repeated @@ -7837,9 +8268,70 @@ spec: rule: '(size(self.group) == 0 && self.kind == ''Service'') ? has(self.port) : true' maxItems: 16 type: array + x-kubernetes-list-type: atomic filters: items: properties: + cors: + properties: + allowCredentials: + type: boolean + allowHeaders: + items: + maxLength: 256 + minLength: 1 + pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + allowMethods: + items: + enum: + - GET + - HEAD + - POST + - PUT + - DELETE + - CONNECT + - OPTIONS + - TRACE + - PATCH + - '*' + type: string + maxItems: 9 + type: array + x-kubernetes-list-type: set + x-kubernetes-validations: + - message: AllowMethods cannot contain '*' alongside other methods + rule: '!(''*'' in self && self.size() > 1)' + allowOrigins: + items: + maxLength: 253 + minLength: 1 + pattern: (^\*$)|(^([a-zA-Z][a-zA-Z0-9+\-.]+):\/\/([^:/?#]+)(:([0-9]{1,5}))?$) + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + x-kubernetes-validations: + - message: AllowOrigins cannot contain '*' alongside other origins + rule: '!(''*'' in self && self.size() > 1)' + exposeHeaders: + items: + maxLength: 256 + minLength: 1 + pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + maxAge: + default: 5 + format: int32 + minimum: 1 + type: integer + type: object extensionRef: properties: group: @@ -7860,6 +8352,92 @@ spec: - kind - name type: object + externalAuth: + properties: + backendRef: + properties: + group: + default: "" + maxLength: 253 + pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + kind: + default: Service + maxLength: 63 + minLength: 1 + pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ + type: string + name: + maxLength: 253 + minLength: 1 + type: string + namespace: + maxLength: 63 + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ + type: string + port: + format: int32 + maximum: 65535 + minimum: 1 + type: integer + required: + - name + type: object + x-kubernetes-validations: + - message: Must have port for Service reference + rule: '(size(self.group) == 0 && self.kind == ''Service'') ? has(self.port) : true' + forwardBody: + properties: + maxSize: + type: integer + type: object + grpc: + properties: + allowedHeaders: + items: + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + type: object + http: + properties: + allowedHeaders: + items: + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + allowedResponseHeaders: + items: + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + path: + maxLength: 1024 + pattern: ^(?:[-A-Za-z0-9/._~!$&'()*+,;=:@]|[%][0-9a-fA-F]{2})+$ + type: string + type: object + protocol: + enum: + - HTTP + - GRPC + type: string + required: + - backendRef + - protocol + type: object + x-kubernetes-validations: + - message: grpc must be specified when protocol is set to 'GRPC' + rule: 'self.protocol == ''GRPC'' ? has(self.grpc) : true' + - message: protocol must be 'GRPC' when grpc is set + rule: 'has(self.grpc) ? self.protocol == ''GRPC'' : true' + - message: http must be specified when protocol is set to 'HTTP' + rule: 'self.protocol == ''HTTP'' ? has(self.http) : true' + - message: protocol must be 'HTTP' when http is set + rule: 'has(self.http) ? self.protocol == ''HTTP'' : true' requestHeaderModifier: properties: add: @@ -7971,6 +8549,9 @@ spec: required: - backendRef type: object + x-kubernetes-validations: + - message: Only one of percent or fraction may be specified in HTTPRequestMirrorFilter + rule: '!(has(self.percent) && has(self.fraction))' requestRedirect: properties: hostname: @@ -8018,6 +8599,9 @@ spec: enum: - 301 - 302 + - 303 + - 307 + - 308 type: integer type: object responseHeaderModifier: @@ -8134,6 +8718,7 @@ spec: rule: '!(!has(self.extensionRef) && self.type == ''ExtensionRef'')' maxItems: 16 type: array + x-kubernetes-list-type: atomic x-kubernetes-validations: - message: May specify either httpRouteFilterRequestRedirect or httpRouteFilterRequestRewrite, but not both rule: '!(self.exists(f, f.type == ''RequestRedirect'') && self.exists(f, f.type == ''URLRewrite''))' @@ -8238,6 +8823,7 @@ spec: type: object maxItems: 64 type: array + x-kubernetes-list-type: atomic name: maxLength: 253 minLength: 1 @@ -8256,6 +8842,7 @@ spec: minimum: 400 type: integer type: array + x-kubernetes-list-type: atomic type: object sessionPersistence: properties: @@ -8313,9 +8900,15 @@ spec: rule: '(has(self.backendRefs) && self.backendRefs.exists_one(b, (has(b.filters) && b.filters.exists_one(f, has(f.urlRewrite) && has(f.urlRewrite.path) && f.urlRewrite.path.type == ''ReplacePrefixMatch'' && has(f.urlRewrite.path.replacePrefixMatch))) )) ? ((size(self.matches) != 1 || !has(self.matches[0].path) || self.matches[0].path.type != ''PathPrefix'') ? false : true) : true' maxItems: 16 type: array + x-kubernetes-list-type: atomic x-kubernetes-validations: - message: While 16 rules and 64 matches per rule are allowed, the total number of matches across all rules in a route must be less than 128 rule: '(self.size() > 0 ? self[0].matches.size() : 0) + (self.size() > 1 ? self[1].matches.size() : 0) + (self.size() > 2 ? self[2].matches.size() : 0) + (self.size() > 3 ? self[3].matches.size() : 0) + (self.size() > 4 ? self[4].matches.size() : 0) + (self.size() > 5 ? self[5].matches.size() : 0) + (self.size() > 6 ? self[6].matches.size() : 0) + (self.size() > 7 ? self[7].matches.size() : 0) + (self.size() > 8 ? self[8].matches.size() : 0) + (self.size() > 9 ? self[9].matches.size() : 0) + (self.size() > 10 ? self[10].matches.size() : 0) + (self.size() > 11 ? self[11].matches.size() : 0) + (self.size() > 12 ? self[12].matches.size() : 0) + (self.size() > 13 ? self[13].matches.size() : 0) + (self.size() > 14 ? self[14].matches.size() : 0) + (self.size() > 15 ? self[15].matches.size() : 0) <= 128' + useDefaultGateways: + enum: + - All + - None + type: string type: object type: object type: object @@ -8332,7 +8925,7 @@ spec: x-kubernetes-map-type: atomic spec: properties: - extensionRef: + endpointPickerRef: properties: failureMode: default: FailClose @@ -8342,43 +8935,57 @@ spec: type: string group: default: "" - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ type: string kind: default: Service - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ type: string name: - maxLength: 253 - minLength: 1 type: string - portNumber: - format: int32 - maximum: 65535 - minimum: 1 - type: integer + port: + properties: + number: + format: int32 + maximum: 65535 + minimum: 1 + type: integer + required: + - number + type: object required: - name type: object + x-kubernetes-validations: + - message: port is required when kind is 'Service' or unspecified (defaults to 'Service') + rule: self.kind != 'Service' || has(self.port) selector: - additionalProperties: - maxLength: 63 - minLength: 0 - pattern: ^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$ - type: string + properties: + matchLabels: + additionalProperties: + type: string + maxProperties: 64 + minProperties: 1 + type: object + required: + - matchLabels type: object - targetPortNumber: - format: int32 - maximum: 65535 - minimum: 1 - type: integer + targetPorts: + items: + properties: + number: + format: int32 + maximum: 65535 + minimum: 1 + type: integer + required: + - number + type: object + maxItems: 1 + minItems: 1 + type: array required: - - extensionRef + - endpointPickerRef - selector - - targetPortNumber + - targetPorts type: object type: object template: @@ -8872,6 +9479,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -9300,6 +9924,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -9584,6 +10231,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -10012,6 +10676,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -10253,6 +10940,8 @@ spec: type: boolean hostname: type: string + hostnameOverride: + type: string imagePullSecrets: items: properties: @@ -10310,6 +10999,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -10738,6 +11444,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -11817,6 +12546,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: @@ -12501,6 +13249,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -12929,6 +13694,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -13213,6 +14001,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -13641,6 +14446,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -13882,6 +14710,8 @@ spec: type: boolean hostname: type: string + hostnameOverride: + type: string imagePullSecrets: items: properties: @@ -13939,6 +14769,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -14367,6 +15214,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -15446,6 +16316,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: @@ -16128,6 +17017,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -16556,6 +17462,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -16840,6 +17769,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -17268,6 +18214,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -17509,6 +18478,8 @@ spec: type: boolean hostname: type: string + hostnameOverride: + type: string imagePullSecrets: items: properties: @@ -17566,6 +18537,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -17994,6 +18982,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -19073,6 +20084,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: diff --git a/config/crd/full/serving.kserve.io_llminferenceservices.yaml b/config/crd/full/serving.kserve.io_llminferenceservices.yaml index c2e524232aa..b2539339360 100644 --- a/config/crd/full/serving.kserve.io_llminferenceservices.yaml +++ b/config/crd/full/serving.kserve.io_llminferenceservices.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: llminferenceservices.serving.kserve.io spec: group: serving.kserve.io @@ -57,10 +57,6 @@ spec: model: properties: criticality: - enum: - - Critical - - Standard - - Sheddable type: string lora: properties: @@ -623,6 +619,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -1051,6 +1064,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -1335,6 +1371,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -1763,6 +1816,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -2004,6 +2080,8 @@ spec: type: boolean hostname: type: string + hostnameOverride: + type: string imagePullSecrets: items: properties: @@ -2061,6 +2139,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -2489,6 +2584,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -3568,6 +3686,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: @@ -4250,6 +4387,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -4678,6 +4832,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -4962,6 +5139,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -5390,6 +5584,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -5631,6 +5848,8 @@ spec: type: boolean hostname: type: string + hostnameOverride: + type: string imagePullSecrets: items: properties: @@ -5688,6 +5907,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -6116,6 +6352,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -7195,6 +7454,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: @@ -7450,6 +7728,7 @@ spec: type: string maxItems: 16 type: array + x-kubernetes-list-type: atomic parentRefs: items: properties: @@ -7488,6 +7767,7 @@ spec: type: object maxItems: 32 type: array + x-kubernetes-list-type: atomic rules: default: - matches: @@ -7502,6 +7782,66 @@ spec: filters: items: properties: + cors: + properties: + allowCredentials: + type: boolean + allowHeaders: + items: + maxLength: 256 + minLength: 1 + pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + allowMethods: + items: + enum: + - GET + - HEAD + - POST + - PUT + - DELETE + - CONNECT + - OPTIONS + - TRACE + - PATCH + - '*' + type: string + maxItems: 9 + type: array + x-kubernetes-list-type: set + x-kubernetes-validations: + - message: AllowMethods cannot contain '*' alongside other methods + rule: '!(''*'' in self && self.size() > 1)' + allowOrigins: + items: + maxLength: 253 + minLength: 1 + pattern: (^\*$)|(^([a-zA-Z][a-zA-Z0-9+\-.]+):\/\/([^:/?#]+)(:([0-9]{1,5}))?$) + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + x-kubernetes-validations: + - message: AllowOrigins cannot contain '*' alongside other origins + rule: '!(''*'' in self && self.size() > 1)' + exposeHeaders: + items: + maxLength: 256 + minLength: 1 + pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + maxAge: + default: 5 + format: int32 + minimum: 1 + type: integer + type: object extensionRef: properties: group: @@ -7522,6 +7862,92 @@ spec: - kind - name type: object + externalAuth: + properties: + backendRef: + properties: + group: + default: "" + maxLength: 253 + pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + kind: + default: Service + maxLength: 63 + minLength: 1 + pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ + type: string + name: + maxLength: 253 + minLength: 1 + type: string + namespace: + maxLength: 63 + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ + type: string + port: + format: int32 + maximum: 65535 + minimum: 1 + type: integer + required: + - name + type: object + x-kubernetes-validations: + - message: Must have port for Service reference + rule: '(size(self.group) == 0 && self.kind == ''Service'') ? has(self.port) : true' + forwardBody: + properties: + maxSize: + type: integer + type: object + grpc: + properties: + allowedHeaders: + items: + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + type: object + http: + properties: + allowedHeaders: + items: + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + allowedResponseHeaders: + items: + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + path: + maxLength: 1024 + pattern: ^(?:[-A-Za-z0-9/._~!$&'()*+,;=:@]|[%][0-9a-fA-F]{2})+$ + type: string + type: object + protocol: + enum: + - HTTP + - GRPC + type: string + required: + - backendRef + - protocol + type: object + x-kubernetes-validations: + - message: grpc must be specified when protocol is set to 'GRPC' + rule: 'self.protocol == ''GRPC'' ? has(self.grpc) : true' + - message: protocol must be 'GRPC' when grpc is set + rule: 'has(self.grpc) ? self.protocol == ''GRPC'' : true' + - message: http must be specified when protocol is set to 'HTTP' + rule: 'self.protocol == ''HTTP'' ? has(self.http) : true' + - message: protocol must be 'HTTP' when http is set + rule: 'has(self.http) ? self.protocol == ''HTTP'' : true' requestHeaderModifier: properties: add: @@ -7633,6 +8059,9 @@ spec: required: - backendRef type: object + x-kubernetes-validations: + - message: Only one of percent or fraction may be specified in HTTPRequestMirrorFilter + rule: '!(has(self.percent) && has(self.fraction))' requestRedirect: properties: hostname: @@ -7680,6 +8109,9 @@ spec: enum: - 301 - 302 + - 303 + - 307 + - 308 type: integer type: object responseHeaderModifier: @@ -7805,9 +8237,8 @@ spec: rule: '!(!has(self.extensionRef) && self.type == ''ExtensionRef'')' maxItems: 16 type: array + x-kubernetes-list-type: atomic x-kubernetes-validations: - - message: May specify either httpRouteFilterRequestRedirect or httpRouteFilterRequestRewrite, but not both - rule: '!(self.exists(f, f.type == ''RequestRedirect'') && self.exists(f, f.type == ''URLRewrite''))' - message: May specify either httpRouteFilterRequestRedirect or httpRouteFilterRequestRewrite, but not both rule: '!(self.exists(f, f.type == ''RequestRedirect'') && self.exists(f, f.type == ''URLRewrite''))' - message: RequestHeaderModifier filter cannot be repeated @@ -7857,9 +8288,70 @@ spec: rule: '(size(self.group) == 0 && self.kind == ''Service'') ? has(self.port) : true' maxItems: 16 type: array + x-kubernetes-list-type: atomic filters: items: properties: + cors: + properties: + allowCredentials: + type: boolean + allowHeaders: + items: + maxLength: 256 + minLength: 1 + pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + allowMethods: + items: + enum: + - GET + - HEAD + - POST + - PUT + - DELETE + - CONNECT + - OPTIONS + - TRACE + - PATCH + - '*' + type: string + maxItems: 9 + type: array + x-kubernetes-list-type: set + x-kubernetes-validations: + - message: AllowMethods cannot contain '*' alongside other methods + rule: '!(''*'' in self && self.size() > 1)' + allowOrigins: + items: + maxLength: 253 + minLength: 1 + pattern: (^\*$)|(^([a-zA-Z][a-zA-Z0-9+\-.]+):\/\/([^:/?#]+)(:([0-9]{1,5}))?$) + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + x-kubernetes-validations: + - message: AllowOrigins cannot contain '*' alongside other origins + rule: '!(''*'' in self && self.size() > 1)' + exposeHeaders: + items: + maxLength: 256 + minLength: 1 + pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + maxAge: + default: 5 + format: int32 + minimum: 1 + type: integer + type: object extensionRef: properties: group: @@ -7880,6 +8372,92 @@ spec: - kind - name type: object + externalAuth: + properties: + backendRef: + properties: + group: + default: "" + maxLength: 253 + pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + kind: + default: Service + maxLength: 63 + minLength: 1 + pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ + type: string + name: + maxLength: 253 + minLength: 1 + type: string + namespace: + maxLength: 63 + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ + type: string + port: + format: int32 + maximum: 65535 + minimum: 1 + type: integer + required: + - name + type: object + x-kubernetes-validations: + - message: Must have port for Service reference + rule: '(size(self.group) == 0 && self.kind == ''Service'') ? has(self.port) : true' + forwardBody: + properties: + maxSize: + type: integer + type: object + grpc: + properties: + allowedHeaders: + items: + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + type: object + http: + properties: + allowedHeaders: + items: + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + allowedResponseHeaders: + items: + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + path: + maxLength: 1024 + pattern: ^(?:[-A-Za-z0-9/._~!$&'()*+,;=:@]|[%][0-9a-fA-F]{2})+$ + type: string + type: object + protocol: + enum: + - HTTP + - GRPC + type: string + required: + - backendRef + - protocol + type: object + x-kubernetes-validations: + - message: grpc must be specified when protocol is set to 'GRPC' + rule: 'self.protocol == ''GRPC'' ? has(self.grpc) : true' + - message: protocol must be 'GRPC' when grpc is set + rule: 'has(self.grpc) ? self.protocol == ''GRPC'' : true' + - message: http must be specified when protocol is set to 'HTTP' + rule: 'self.protocol == ''HTTP'' ? has(self.http) : true' + - message: protocol must be 'HTTP' when http is set + rule: 'has(self.http) ? self.protocol == ''HTTP'' : true' requestHeaderModifier: properties: add: @@ -7991,6 +8569,9 @@ spec: required: - backendRef type: object + x-kubernetes-validations: + - message: Only one of percent or fraction may be specified in HTTPRequestMirrorFilter + rule: '!(has(self.percent) && has(self.fraction))' requestRedirect: properties: hostname: @@ -8038,6 +8619,9 @@ spec: enum: - 301 - 302 + - 303 + - 307 + - 308 type: integer type: object responseHeaderModifier: @@ -8163,6 +8747,7 @@ spec: rule: '!(!has(self.extensionRef) && self.type == ''ExtensionRef'')' maxItems: 16 type: array + x-kubernetes-list-type: atomic x-kubernetes-validations: - message: May specify either httpRouteFilterRequestRedirect or httpRouteFilterRequestRewrite, but not both rule: '!(self.exists(f, f.type == ''RequestRedirect'') && self.exists(f, f.type == ''URLRewrite''))' @@ -8290,6 +8875,7 @@ spec: type: object maxItems: 64 type: array + x-kubernetes-list-type: atomic name: maxLength: 253 minLength: 1 @@ -8308,6 +8894,7 @@ spec: minimum: 400 type: integer type: array + x-kubernetes-list-type: atomic type: object sessionPersistence: properties: @@ -8365,9 +8952,15 @@ spec: rule: '(has(self.backendRefs) && self.backendRefs.exists_one(b, (has(b.filters) && b.filters.exists_one(f, has(f.urlRewrite) && has(f.urlRewrite.path) && f.urlRewrite.path.type == ''ReplacePrefixMatch'' && has(f.urlRewrite.path.replacePrefixMatch))) )) ? ((size(self.matches) != 1 || !has(self.matches[0].path) || self.matches[0].path.type != ''PathPrefix'') ? false : true) : true' maxItems: 16 type: array + x-kubernetes-list-type: atomic x-kubernetes-validations: - message: While 16 rules and 64 matches per rule are allowed, the total number of matches across all rules in a route must be less than 128 rule: '(self.size() > 0 ? self[0].matches.size() : 0) + (self.size() > 1 ? self[1].matches.size() : 0) + (self.size() > 2 ? self[2].matches.size() : 0) + (self.size() > 3 ? self[3].matches.size() : 0) + (self.size() > 4 ? self[4].matches.size() : 0) + (self.size() > 5 ? self[5].matches.size() : 0) + (self.size() > 6 ? self[6].matches.size() : 0) + (self.size() > 7 ? self[7].matches.size() : 0) + (self.size() > 8 ? self[8].matches.size() : 0) + (self.size() > 9 ? self[9].matches.size() : 0) + (self.size() > 10 ? self[10].matches.size() : 0) + (self.size() > 11 ? self[11].matches.size() : 0) + (self.size() > 12 ? self[12].matches.size() : 0) + (self.size() > 13 ? self[13].matches.size() : 0) + (self.size() > 14 ? self[14].matches.size() : 0) + (self.size() > 15 ? self[15].matches.size() : 0) <= 128' + useDefaultGateways: + enum: + - All + - None + type: string type: object type: object type: object @@ -8384,7 +8977,7 @@ spec: x-kubernetes-map-type: atomic spec: properties: - extensionRef: + endpointPickerRef: properties: failureMode: default: FailClose @@ -8394,43 +8987,57 @@ spec: type: string group: default: "" - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ type: string kind: default: Service - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ type: string name: - maxLength: 253 - minLength: 1 type: string - portNumber: - format: int32 - maximum: 65535 - minimum: 1 - type: integer + port: + properties: + number: + format: int32 + maximum: 65535 + minimum: 1 + type: integer + required: + - number + type: object required: - name type: object + x-kubernetes-validations: + - message: port is required when kind is 'Service' or unspecified (defaults to 'Service') + rule: self.kind != 'Service' || has(self.port) selector: - additionalProperties: - maxLength: 63 - minLength: 0 - pattern: ^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$ - type: string + properties: + matchLabels: + additionalProperties: + type: string + maxProperties: 64 + minProperties: 1 + type: object + required: + - matchLabels type: object - targetPortNumber: - format: int32 - maximum: 65535 - minimum: 1 - type: integer + targetPorts: + items: + properties: + number: + format: int32 + maximum: 65535 + minimum: 1 + type: integer + required: + - number + type: object + maxItems: 1 + minItems: 1 + type: array required: - - extensionRef + - endpointPickerRef - selector - - targetPortNumber + - targetPorts type: object type: object template: @@ -8924,6 +9531,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -9352,6 +9976,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -9636,6 +10283,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -10064,6 +10728,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -10305,6 +10992,8 @@ spec: type: boolean hostname: type: string + hostnameOverride: + type: string imagePullSecrets: items: properties: @@ -10362,6 +11051,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -10790,6 +11496,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -11869,6 +12598,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: @@ -12553,6 +13301,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -12981,6 +13746,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -13265,6 +14053,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -13693,6 +14498,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -13934,6 +14762,8 @@ spec: type: boolean hostname: type: string + hostnameOverride: + type: string imagePullSecrets: items: properties: @@ -13991,6 +14821,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -14419,6 +15266,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -15498,6 +16368,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: @@ -16180,6 +17069,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -16608,6 +17514,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -16892,6 +17821,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -17320,6 +18266,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -17561,6 +18530,8 @@ spec: type: boolean hostname: type: string + hostnameOverride: + type: string imagePullSecrets: items: properties: @@ -17618,6 +18589,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -18046,6 +19034,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -19125,6 +20136,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: diff --git a/config/crd/full/serving.kserve.io_localmodelcaches.yaml b/config/crd/full/serving.kserve.io_localmodelcaches.yaml index ab92f72ab7a..9f8884a9c37 100644 --- a/config/crd/full/serving.kserve.io_localmodelcaches.yaml +++ b/config/crd/full/serving.kserve.io_localmodelcaches.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: localmodelcaches.serving.kserve.io spec: group: serving.kserve.io diff --git a/config/crd/full/serving.kserve.io_localmodelnodegroups.yaml b/config/crd/full/serving.kserve.io_localmodelnodegroups.yaml index 51beae879b9..5a3539b2533 100644 --- a/config/crd/full/serving.kserve.io_localmodelnodegroups.yaml +++ b/config/crd/full/serving.kserve.io_localmodelnodegroups.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: localmodelnodegroups.serving.kserve.io spec: group: serving.kserve.io diff --git a/config/crd/full/serving.kserve.io_localmodelnodes.yaml b/config/crd/full/serving.kserve.io_localmodelnodes.yaml index f130f6e7a3b..a143cd877be 100644 --- a/config/crd/full/serving.kserve.io_localmodelnodes.yaml +++ b/config/crd/full/serving.kserve.io_localmodelnodes.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: localmodelnodes.serving.kserve.io spec: group: serving.kserve.io diff --git a/config/crd/full/serving.kserve.io_servingruntimes.yaml b/config/crd/full/serving.kserve.io_servingruntimes.yaml index 5a88508dbda..3a3850cdb04 100644 --- a/config/crd/full/serving.kserve.io_servingruntimes.yaml +++ b/config/crd/full/serving.kserve.io_servingruntimes.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: servingruntimes.serving.kserve.io spec: group: serving.kserve.io @@ -516,6 +516,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -604,6 +621,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -1032,6 +1066,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -1908,6 +1965,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: @@ -2585,6 +2661,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -3013,6 +3106,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -3855,6 +3971,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: diff --git a/config/crd/full/serving.kserve.io_trainedmodels.yaml b/config/crd/full/serving.kserve.io_trainedmodels.yaml index 2e08331dcdb..288866251d9 100644 --- a/config/crd/full/serving.kserve.io_trainedmodels.yaml +++ b/config/crd/full/serving.kserve.io_trainedmodels.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: trainedmodels.serving.kserve.io spec: group: serving.kserve.io diff --git a/config/crd/minimal/serving.kserve.io_clusterservingruntimes.yaml b/config/crd/minimal/serving.kserve.io_clusterservingruntimes.yaml index d7111bbf1b5..8b0fba5a023 100644 --- a/config/crd/minimal/serving.kserve.io_clusterservingruntimes.yaml +++ b/config/crd/minimal/serving.kserve.io_clusterservingruntimes.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: clusterservingruntimes.serving.kserve.io spec: group: serving.kserve.io diff --git a/config/crd/minimal/serving.kserve.io_clusterstoragecontainers.yaml b/config/crd/minimal/serving.kserve.io_clusterstoragecontainers.yaml index ab3496538ef..287c03b290a 100644 --- a/config/crd/minimal/serving.kserve.io_clusterstoragecontainers.yaml +++ b/config/crd/minimal/serving.kserve.io_clusterstoragecontainers.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: clusterstoragecontainers.serving.kserve.io spec: group: serving.kserve.io diff --git a/config/crd/minimal/serving.kserve.io_inferencegraphs.yaml b/config/crd/minimal/serving.kserve.io_inferencegraphs.yaml index 6d54c209f73..e3193955738 100644 --- a/config/crd/minimal/serving.kserve.io_inferencegraphs.yaml +++ b/config/crd/minimal/serving.kserve.io_inferencegraphs.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: inferencegraphs.serving.kserve.io spec: group: serving.kserve.io diff --git a/config/crd/minimal/serving.kserve.io_inferenceservices.yaml b/config/crd/minimal/serving.kserve.io_inferenceservices.yaml index ebcaa6f0dab..f44cc4c401f 100644 --- a/config/crd/minimal/serving.kserve.io_inferenceservices.yaml +++ b/config/crd/minimal/serving.kserve.io_inferenceservices.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: inferenceservices.serving.kserve.io spec: group: serving.kserve.io diff --git a/config/crd/minimal/serving.kserve.io_llminferenceserviceconfigs.yaml b/config/crd/minimal/serving.kserve.io_llminferenceserviceconfigs.yaml index d1683616a09..e86fcea5538 100644 --- a/config/crd/minimal/serving.kserve.io_llminferenceserviceconfigs.yaml +++ b/config/crd/minimal/serving.kserve.io_llminferenceserviceconfigs.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: llminferenceserviceconfigs.serving.kserve.io spec: group: serving.kserve.io diff --git a/config/crd/minimal/serving.kserve.io_llminferenceservices.yaml b/config/crd/minimal/serving.kserve.io_llminferenceservices.yaml index d21c7b5455d..3753d5c2ebd 100644 --- a/config/crd/minimal/serving.kserve.io_llminferenceservices.yaml +++ b/config/crd/minimal/serving.kserve.io_llminferenceservices.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: llminferenceservices.serving.kserve.io spec: group: serving.kserve.io diff --git a/config/crd/minimal/serving.kserve.io_localmodelcaches.yaml b/config/crd/minimal/serving.kserve.io_localmodelcaches.yaml index 68e38339948..39f9a06fee4 100644 --- a/config/crd/minimal/serving.kserve.io_localmodelcaches.yaml +++ b/config/crd/minimal/serving.kserve.io_localmodelcaches.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: localmodelcaches.serving.kserve.io spec: group: serving.kserve.io diff --git a/config/crd/minimal/serving.kserve.io_localmodelnodegroups.yaml b/config/crd/minimal/serving.kserve.io_localmodelnodegroups.yaml index 27ffee9a7d8..00e287c987c 100644 --- a/config/crd/minimal/serving.kserve.io_localmodelnodegroups.yaml +++ b/config/crd/minimal/serving.kserve.io_localmodelnodegroups.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: localmodelnodegroups.serving.kserve.io spec: group: serving.kserve.io diff --git a/config/crd/minimal/serving.kserve.io_localmodelnodes.yaml b/config/crd/minimal/serving.kserve.io_localmodelnodes.yaml index dbc46f365f7..b086d929ca1 100644 --- a/config/crd/minimal/serving.kserve.io_localmodelnodes.yaml +++ b/config/crd/minimal/serving.kserve.io_localmodelnodes.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: localmodelnodes.serving.kserve.io spec: group: serving.kserve.io diff --git a/config/crd/minimal/serving.kserve.io_servingruntimes.yaml b/config/crd/minimal/serving.kserve.io_servingruntimes.yaml index cb1a5b17119..6fe5cb95141 100644 --- a/config/crd/minimal/serving.kserve.io_servingruntimes.yaml +++ b/config/crd/minimal/serving.kserve.io_servingruntimes.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: servingruntimes.serving.kserve.io spec: group: serving.kserve.io diff --git a/config/crd/minimal/serving.kserve.io_trainedmodels.yaml b/config/crd/minimal/serving.kserve.io_trainedmodels.yaml index fc68b2276d6..372b4f0405d 100644 --- a/config/crd/minimal/serving.kserve.io_trainedmodels.yaml +++ b/config/crd/minimal/serving.kserve.io_trainedmodels.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: trainedmodels.serving.kserve.io spec: group: serving.kserve.io diff --git a/config/llmisvc/config-llm-router-route.yaml b/config/llmisvc/config-llm-router-route.yaml index 97b44296b64..228018f377b 100644 --- a/config/llmisvc/config-llm-router-route.yaml +++ b/config/llmisvc/config-llm-router-route.yaml @@ -15,7 +15,17 @@ spec: namespace: |- {{ .GlobalConfig.IngressGatewayNamespace }} rules: + # Dual-pool strategy for /v1/completions endpoint: + # - v1 pool gets priority (weight: 100) + # - v1alpha2 pool serves as fallback (weight: 1) + # If v1 pool is not ready, Gateway automatically falls back to v1alpha2 - backendRefs: + - group: inference.networking.k8s.io + kind: InferencePool + name: |- + {{ ChildName .ObjectMeta.Name `-inference-pool` }} + port: 8000 + weight: 100 - group: inference.networking.x-k8s.io kind: InferencePool name: |- diff --git a/config/llmisvc/config-llm-scheduler.yaml b/config/llmisvc/config-llm-scheduler.yaml index f44dccd2cde..37e6f7c6924 100644 --- a/config/llmisvc/config-llm-scheduler.yaml +++ b/config/llmisvc/config-llm-scheduler.yaml @@ -7,13 +7,17 @@ spec: scheduler: pool: spec: - extensionRef: - failureMode: FailOpen + endpointPickerRef: kind: Service name: |- {{ ChildName .ObjectMeta.Name `-epp-service` }} - selector: { } - targetPortNumber: 8000 + port: + number: 9002 + selector: + matchLabels: + app.kubernetes.io/part-of: llminferenceservice + targetPorts: + - number: 8000 template: containers: - name: main diff --git a/config/rbac/role.yaml b/config/rbac/role.yaml index c3d1edffd16..4d69a690f51 100644 --- a/config/rbac/role.yaml +++ b/config/rbac/role.yaml @@ -108,17 +108,6 @@ rules: - watch - apiGroups: - inference.networking.k8s.io - resources: - - inferencepools - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - inference.networking.x-k8s.io resources: - inferencemodels diff --git a/go.mod b/go.mod index 9dbb098c614..e94f505b617 100644 --- a/go.mod +++ b/go.mod @@ -1,11 +1,11 @@ module github.com/kserve/kserve -go 1.24.1 +go 1.24.7 require ( - cloud.google.com/go/storage v1.50.0 - github.com/aws/aws-sdk-go v1.55.6 - github.com/cloudevents/sdk-go/v2 v2.15.2 + cloud.google.com/go/storage v1.52.0 + github.com/aws/aws-sdk-go v1.55.7 + github.com/cloudevents/sdk-go/v2 v2.16.2 github.com/fsnotify/fsnotify v1.9.0 github.com/getkin/kin-openapi v0.131.0 github.com/go-logr/logr v1.4.3 @@ -16,156 +16,179 @@ require ( github.com/google/uuid v1.6.0 github.com/googleapis/google-cloud-go-testing v0.0.0-20210719221736-1c9a4c676720 github.com/json-iterator/go v1.1.12 - github.com/kedacore/keda/v2 v2.16.1 + github.com/kedacore/keda/v2 v2.18.0 github.com/kelseyhightower/envconfig v1.4.0 - github.com/onsi/ginkgo/v2 v2.23.3 - github.com/onsi/gomega v1.36.3 + github.com/onsi/ginkgo/v2 v2.25.3 + github.com/onsi/gomega v1.38.2 github.com/open-telemetry/opentelemetry-operator v0.113.0 github.com/openshift/api v0.0.0-20241108213852-e22f17d9b7f5 github.com/pkg/errors v0.9.1 github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.76.2 - github.com/spf13/cobra v1.8.1 - github.com/spf13/pflag v1.0.6 - github.com/stretchr/testify v1.10.0 + github.com/spf13/cobra v1.9.1 + github.com/spf13/pflag v1.0.10 + github.com/stretchr/testify v1.11.1 github.com/tidwall/gjson v1.18.0 go.uber.org/zap v1.27.0 gomodules.xyz/jsonpatch/v2 v2.5.0 - google.golang.org/api v0.226.0 - google.golang.org/protobuf v1.36.6 + google.golang.org/api v0.238.0 + google.golang.org/protobuf v1.36.9 gopkg.in/go-playground/validator.v9 v9.31.0 istio.io/api v1.24.2 istio.io/client-go v1.24.2 - k8s.io/api v0.33.1 - k8s.io/apiextensions-apiserver v0.33.1 - k8s.io/apimachinery v0.33.1 - k8s.io/client-go v0.33.1 - k8s.io/code-generator v0.33.1 + k8s.io/api v0.34.1 + k8s.io/apiextensions-apiserver v0.34.1 + k8s.io/apimachinery v0.34.1 + k8s.io/client-go v0.34.1 + k8s.io/code-generator v0.34.1 k8s.io/component-helpers v0.33.1 k8s.io/klog/v2 v2.130.1 - k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff - k8s.io/utils v0.0.0-20241210054802-24370beab758 + k8s.io/kube-openapi v0.0.0-20250814151709-d7b6acb124c3 + k8s.io/utils v0.0.0-20250820121507-0af2bda4dd1d knative.dev/networking v0.0.0-20250117155906-67d1c274ba6a - knative.dev/pkg v0.0.0-20250117084104-c43477f0052b + knative.dev/pkg v0.0.0-20250326102644-9f3e60a9244c knative.dev/serving v0.44.0 - sigs.k8s.io/controller-runtime v0.20.4 - sigs.k8s.io/gateway-api v1.2.1 - sigs.k8s.io/gateway-api-inference-extension v0.3.0 + sigs.k8s.io/controller-runtime v0.22.3 + sigs.k8s.io/gateway-api v1.4.0 + sigs.k8s.io/gateway-api-inference-extension v1.0.0 sigs.k8s.io/lws v0.6.2 - sigs.k8s.io/yaml v1.4.0 + sigs.k8s.io/yaml v1.6.0 ) require ( - cel.dev/expr v0.19.1 // indirect - cloud.google.com/go v0.116.0 // indirect - cloud.google.com/go/auth v0.15.0 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.7 // indirect - cloud.google.com/go/compute/metadata v0.6.0 // indirect - cloud.google.com/go/iam v1.2.2 // indirect - cloud.google.com/go/monitoring v1.22.0 // indirect + cel.dev/expr v0.24.0 // indirect + cloud.google.com/go v0.121.0 // indirect + cloud.google.com/go/auth v0.16.2 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect + cloud.google.com/go/compute/metadata v0.9.0 // indirect + cloud.google.com/go/iam v1.5.2 // indirect + cloud.google.com/go/monitoring v1.24.2 // indirect contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d // indirect contrib.go.opencensus.io/exporter/prometheus v0.4.2 // indirect - dario.cat/mergo v1.0.1 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 // indirect + dario.cat/mergo v1.0.2 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 // indirect + github.com/Masterminds/semver/v3 v3.4.0 // indirect + github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blendle/zapdriver v1.3.1 // indirect github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cncf/xds/go v0.0.0-20241223141626-cff3c89139a3 // indirect + github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 // indirect + github.com/containerd/errdefs v1.0.0 // indirect + github.com/containerd/errdefs/pkg v0.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/emicklei/go-restful/v3 v3.12.2 // indirect + github.com/digitalocean/godo v1.152.0 // indirect + github.com/docker/docker v28.2.2+incompatible // indirect + github.com/emicklei/go-restful/v3 v3.13.0 // indirect github.com/envoyproxy/go-control-plane/envoy v1.32.4 // indirect github.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect github.com/evanphx/json-patch/v5 v5.9.11 // indirect - github.com/expr-lang/expr v1.17.0 // indirect + github.com/expr-lang/expr v1.17.6 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fxamacker/cbor/v2 v2.8.0 // indirect + github.com/fxamacker/cbor/v2 v2.9.0 // indirect + github.com/go-jose/go-jose/v4 v4.1.1 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-openapi/jsonpointer v0.21.1 // indirect + github.com/go-openapi/jsonpointer v0.21.2 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect github.com/go-openapi/swag v0.23.1 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/go-test/deep v1.1.0 // indirect + github.com/go-zookeeper/zk v1.0.4 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect - github.com/google/gnostic-models v0.6.9 // indirect + github.com/google/btree v1.1.3 // indirect + github.com/google/gnostic-models v0.7.0 // indirect github.com/google/go-containerregistry v0.13.0 // indirect - github.com/google/pprof v0.0.0-20250208200701-d0013a598941 // indirect + github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect - github.com/googleapis/gax-go/v2 v2.14.1 // indirect + github.com/googleapis/gax-go/v2 v2.14.2 // indirect + github.com/gophercloud/gophercloud/v2 v2.7.0 // indirect github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 // indirect + github.com/hashicorp/consul/api v1.32.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect + github.com/hashicorp/nomad/api v0.0.0-20241218080744-e3ac00f30eec // indirect + github.com/hetznercloud/hcloud-go/v2 v2.21.1 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/ionos-cloud/sdk-go/v6 v6.3.4 // indirect github.com/jmespath/go-jmespath v0.4.1-0.20220621161143-b0104c826a24 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/leodido/go-urn v1.4.0 // indirect + github.com/linode/linodego v1.52.1 // indirect github.com/mailru/easyjson v0.9.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 // indirect github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/ovh/go-ovh v1.8.0 // indirect github.com/perimeterx/marshmallow v1.1.5 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.22.0 // indirect + github.com/prometheus/client_golang v1.23.2 // indirect github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.64.0 // indirect - github.com/prometheus/procfs v0.16.1 // indirect - github.com/prometheus/prometheus v0.55.1 // indirect + github.com/prometheus/common v0.66.1 // indirect + github.com/prometheus/procfs v0.17.0 // indirect + github.com/prometheus/sigv4 v0.2.0 // indirect github.com/prometheus/statsd_exporter v0.27.1 // indirect + github.com/scaleway/scaleway-sdk-go v1.0.0-beta.33 // indirect + github.com/spiffe/go-spiffe/v2 v2.5.0 // indirect + github.com/stackitcloud/stackit-sdk-go/core v0.17.2 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect github.com/x448/float16 v0.8.4 // indirect + github.com/zeebo/errs v1.4.0 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/collector/featuregate v1.24.0 // indirect - go.opentelemetry.io/contrib/detectors/gcp v1.34.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect - go.opentelemetry.io/otel v1.35.0 // indirect + go.opentelemetry.io/collector/featuregate v1.34.0 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.36.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect go.opentelemetry.io/otel/exporters/prometheus v0.56.0 // indirect - go.opentelemetry.io/otel/metric v1.35.0 // indirect - go.opentelemetry.io/otel/sdk v1.35.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.35.0 // indirect - go.opentelemetry.io/otel/trace v1.35.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/automaxprocs v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.39.0 // indirect + go.yaml.in/yaml/v2 v2.4.2 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/crypto v0.42.0 // indirect golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 // indirect - golang.org/x/mod v0.25.0 // indirect - golang.org/x/net v0.41.0 // indirect - golang.org/x/oauth2 v0.30.0 // indirect - golang.org/x/sync v0.15.0 // indirect - golang.org/x/sys v0.33.0 // indirect - golang.org/x/term v0.32.0 // indirect - golang.org/x/text v0.26.0 // indirect - golang.org/x/time v0.12.0 // indirect - golang.org/x/tools v0.34.0 // indirect - google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4 // indirect - google.golang.org/grpc v1.71.0 // indirect - gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect + golang.org/x/mod v0.28.0 // indirect + golang.org/x/net v0.44.0 // indirect + golang.org/x/oauth2 v0.31.0 // indirect + golang.org/x/sync v0.17.0 // indirect + golang.org/x/sys v0.36.0 // indirect + golang.org/x/term v0.35.0 // indirect + golang.org/x/text v0.29.0 // indirect + golang.org/x/time v0.13.0 // indirect + golang.org/x/tools v0.37.0 // indirect + google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250908214217-97024824d090 // indirect + google.golang.org/grpc v1.75.1 // indirect + gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect gopkg.in/go-playground/assert.v1 v1.2.1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/gengo/v2 v2.0.0-20250207200755-1244d31929d7 // indirect - sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect + k8s.io/gengo/v2 v2.0.0-20250820003526-c297c0c1eb9d // indirect + sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect sigs.k8s.io/randfill v1.0.0 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.7.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect ) // google.golang.org/grpc/stats/opentelemetry is used by the keda package. @@ -175,5 +198,13 @@ require ( // This avoids "module used for two different module paths" error exclude google.golang.org/grpc/stats/opentelemetry v0.0.0-00010101000000-000000000000 -// Currently, KEDA requires 0.19 but GIE uses 0.21 -replace sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.19.7 +// Using gateway-api main branch with validation markers bug fix (PR #4178 merged) +// See: https://github.com/kubernetes-sigs/gateway-api/pull/4178 +replace sigs.k8s.io/gateway-api => sigs.k8s.io/gateway-api v0.0.0-20251017132243-11212e643802 + +// Using release-1.0 branch with fix for GIE v1.0.0 validation markers bug +// See: https://github.com/kubernetes-sigs/gateway-api-inference-extension/pull/1679 +replace sigs.k8s.io/gateway-api-inference-extension => github.com/kubernetes-sigs/gateway-api-inference-extension v1.0.2-0.20251014221737-ffb66e1e979c + +// Currently, KEDA requires 0.19 but GIE v1 uses 0.22 +replace sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.22.1 diff --git a/go.sum b/go.sum index 5e7e6453116..2b12d83e94a 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4= -cel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= +cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY= +cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= @@ -16,30 +16,30 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE= -cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U= -cloud.google.com/go/auth v0.15.0 h1:Ly0u4aA5vG/fsSsxu98qCQBemXtAtJf+95z9HK+cxps= -cloud.google.com/go/auth v0.15.0/go.mod h1:WJDGqZ1o9E9wKIL+IwStfyn/+s59zl4Bi+1KQNVXLZ8= -cloud.google.com/go/auth/oauth2adapt v0.2.7 h1:/Lc7xODdqcEw8IrZ9SvwnlLX6j9FHQM74z6cBk9Rw6M= -cloud.google.com/go/auth/oauth2adapt v0.2.7/go.mod h1:NTbTTzfvPl1Y3V1nPpOgl2w6d/FjO7NNUQaWSox6ZMc= +cloud.google.com/go v0.121.0 h1:pgfwva8nGw7vivjZiRfrmglGWiCJBP+0OmDpenG/Fwg= +cloud.google.com/go v0.121.0/go.mod h1:rS7Kytwheu/y9buoDmu5EIpMMCI4Mb8ND4aeN4Vwj7Q= +cloud.google.com/go/auth v0.16.2 h1:QvBAGFPLrDeoiNjyfVunhQ10HKNYuOwZ5noee0M5df4= +cloud.google.com/go/auth v0.16.2/go.mod h1:sRBas2Y1fB1vZTdurouM0AzuYQBMZinrUYL8EufhtEA= +cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= +cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= -cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= +cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= +cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/iam v1.2.2 h1:ozUSofHUGf/F4tCNy/mu9tHLTaxZFLOUiKzjcgWHGIA= -cloud.google.com/go/iam v1.2.2/go.mod h1:0Ys8ccaZHdI1dEUilwzqng/6ps2YB6vRsjIe00/+6JY= -cloud.google.com/go/logging v1.12.0 h1:ex1igYcGFd4S/RZWOCU51StlIEuey5bjqwH9ZYjHibk= -cloud.google.com/go/logging v1.12.0/go.mod h1:wwYBt5HlYP1InnrtYI0wtwttpVU1rifnMT7RejksUAM= -cloud.google.com/go/longrunning v0.6.2 h1:xjDfh1pQcWPEvnfjZmwjKQEcHnpz6lHjfy7Fo0MK+hc= -cloud.google.com/go/longrunning v0.6.2/go.mod h1:k/vIs83RN4bE3YCswdXC5PFfWVILjm3hpEUlSko4PiI= -cloud.google.com/go/monitoring v1.22.0 h1:mQ0040B7dpuRq1+4YiQD43M2vW9HgoVxY98xhqGT+YI= -cloud.google.com/go/monitoring v1.22.0/go.mod h1:hS3pXvaG8KgWTSz+dAdyzPrGUYmi2Q+WFX8g2hqVEZU= +cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8= +cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE= +cloud.google.com/go/logging v1.13.0 h1:7j0HgAp0B94o1YRDqiqm26w4q1rDMH7XNRU34lJXHYc= +cloud.google.com/go/logging v1.13.0/go.mod h1:36CoKh6KA/M0PbhPKMq6/qety2DCAErbhXT62TuXALA= +cloud.google.com/go/longrunning v0.6.7 h1:IGtfDWHhQCgCjwQjV9iiLnUta9LBCo8R9QmAFsS/PrE= +cloud.google.com/go/longrunning v0.6.7/go.mod h1:EAFV3IZAKmM56TyiE6VAP3VoTzhZzySwI/YI1s/nRsY= +cloud.google.com/go/monitoring v1.24.2 h1:5OTsoJ1dXYIiMiuL+sYscLc9BumrL3CarVLL7dd7lHM= +cloud.google.com/go/monitoring v1.24.2/go.mod h1:x7yzPWcgDRnPEv3sI+jJGBkwl5qINf+6qY4eq0I9B4U= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -49,57 +49,85 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.50.0 h1:3TbVkzTooBvnZsk7WaAQfOsNrdoM8QHusXA1cpk6QJs= -cloud.google.com/go/storage v1.50.0/go.mod h1:l7XeiD//vx5lfqE3RavfmU9yvk5Pp0Zhcv482poyafY= -cloud.google.com/go/trace v1.11.2 h1:4ZmaBdL8Ng/ajrgKqY5jfvzqMXbrDcBsUGXOT9aqTtI= -cloud.google.com/go/trace v1.11.2/go.mod h1:bn7OwXd4pd5rFuAnTrzBuoZ4ax2XQeG3qNgYmfCy0Io= +cloud.google.com/go/storage v1.52.0 h1:ROpzMW/IwipKtatA69ikxibdzQSiXJrY9f6IgBa9AlA= +cloud.google.com/go/storage v1.52.0/go.mod h1:4wrBAbAYUvYkbrf19ahGm4I5kDQhESSqN3CGEkMGvOY= +cloud.google.com/go/trace v1.11.6 h1:2O2zjPzqPYAHrn3OKl029qlqG6W8ZdYaOWRyr8NgMT4= +cloud.google.com/go/trace v1.11.6/go.mod h1:GA855OeDEBiBMzcckLPE2kDunIpC72N+Pq8WFieFjnI= contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d h1:LblfooH1lKOpp1hIhukktmSAxFkqMPFk9KR6iZ0MJNI= contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d/go.mod h1:IshRmMJBhDfFj5Y67nVhMYTTIze91RUeT73ipWKs/GY= contrib.go.opencensus.io/exporter/prometheus v0.4.2 h1:sqfsYl5GIY/L570iT+l93ehxaWJs2/OwXtiWwew3oAg= contrib.go.opencensus.io/exporter/prometheus v0.4.2/go.mod h1:dvEHbiKmgvbr5pjaF9fpw1KeYcjrnC1J8B+JKjsZyRQ= -dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= -dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= +dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.16.0 h1:JZg6HRh6W6U4OLl6lk7BZ7BLisIzM9dG1R50zUk9C/M= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.16.0/go.mod h1:YL1xnZ6QejvQHWJrX/AvhFl4WW4rqHVoKspWNVwFk0M= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0 h1:B/dfvscEQtew9dVuoxqxrUKKv8Ih2f55PydknDamU+g= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0/go.mod h1:fiPSssYvltE08HJchL04dOy+RD4hgrjph0cwGGMntdI= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.19.1 h1:5YTBM8QDVIBN3sxBil89WfdAAqDZbyJTgh688DSxX5w= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.19.1/go.mod h1:YD5h/ldMsG0XiIw7PdyNhLxaM317eFh5yNLccNfGdyw= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.12.0 h1:wL5IEG5zb7BVv1Kv0Xm92orq+5hB5Nipn3B5tn4Rqfk= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.12.0/go.mod h1:J7MUC/wtRpfGVbQ5sIItY5/FuVWmvzlY21WAOfQnq/I= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 h1:9iefClla7iYpfYWdzPCRDozdmndjTm8DXdpCzPajMgA= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2/go.mod h1:XtLgD3ZD34DAaVIIAyG3objl5DynM3CQ/vMcbBNJZGI= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0 h1:LkHbJbgF3YyvC53aqYGR+wWQDn2Rdp9AQdGndf9QvY4= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0/go.mod h1:QyiQdW4f4/BIfB8ZutZ2s+28RAgfa/pT+zS++ZHyM1I= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 h1:bXwSugBiSbgtz7rOtbfGf+woewp4f06orW9OP5BjHLA= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0/go.mod h1:Y/HgrePTmGy9HjdSGTqZNa+apUpTVIEVKXJyARP2lrk= -github.com/AzureAD/microsoft-authentication-library-for-go v1.3.2 h1:kYRSnvJju5gYVyhkij+RTJ/VR6QIUaCfWeaFm2ycsjQ= -github.com/AzureAD/microsoft-authentication-library-for-go v1.3.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.5.0 h1:XkkQbfMyuH2jTSjQjSoihryI8GINRcs4xp8lNawg0FI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.5.0/go.mod h1:HKpQxkWaGLJ+D/5H8QRpyQXA1eKjxkFlOMwck5+33Jk= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Code-Hex/go-generics-cache v1.5.1 h1:6vhZGc5M7Y/YD8cIUcY8kcuQLB4cHR7U+0KMqAA0KcU= github.com/Code-Hex/go-generics-cache v1.5.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0 h1:3c8yed4lgqTt+oTQ+JNMDo+F4xprBf+O/il4ZC0nRLw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0/go.mod h1:obipzmGjfSjam60XLwGfqUkJsfiheAl+TUjG+4yzyPM= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1 h1:UQ0AhxogsIRZDkElkblfnwjc3IaltCm2HUMvezQaL7s= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1/go.mod h1:jyqM3eLpJ3IbIFDTKVz2rF9T/xWGW0rIriGwnz8l9Tk= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.48.1 h1:oTX4vsorBZo/Zdum6OKPA4o7544hm6smoRv1QjpTwGo= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.48.1/go.mod h1:0wEl7vrAD8mehJyohS9HZy+WyEOaQO2mJx86Cvh93kM= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 h1:8nn+rsCvTq9axyEh382S0PFLBeaFwNsT43IrPWzctRU= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1/go.mod h1:viRWSEhtMZqz1rhwmOVKkWl6SwmVowfL9O2YR5gI2PE= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 h1:UQUsRi8WTzhZntp5313l+CHIAT95ojUI2lpP/ExlZa4= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0/go.mod h1:Cz6ft6Dkn3Et6l2v2a9/RpN7epQ1GtDlO6lj8bEcOvw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 h1:fYE9p3esPxA/C0rQ0AHhP0drtPXDRhaWiwg1DPqO7IU= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0/go.mod h1:BnBReJLvVYx2CS/UHOgVz2BXKXD9wsQPxZug20nZhd0= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0 h1:OqVGm6Ei3x5+yZmSJG1Mh2NwHvpVmZ08CB5qJhT9Nuk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0/go.mod h1:SZiPHWGOOk3bl8tkevxkoiwPgsIl6CwrWcbwjfHZpdM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 h1:6/0iUd0xrnX7qt+mLNRwg5c0PGv8wpE8K90ryANQwMI= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0/go.mod h1:otE2jQekW/PqXk1Awf5lmfokJx4uwuqcj1ab5SpGeW0= +github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= +github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 h1:t3eaIm0rUkzbrIewtiFmMK5RXHej2XnoXNhxVsAYUfg= -github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs= +github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b h1:mimo19zliBX/vSQ6PWWSL9lK8qwHozUj03+zLoEB8O0= +github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= -github.com/aws/aws-sdk-go v1.55.6 h1:cSg4pvZ3m8dgYcgqB97MrcdjUmZ1BeMYKUxMMB89IPk= -github.com/aws/aws-sdk-go v1.55.6/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/aws/aws-sdk-go v1.55.7 h1:UJrkFq7es5CShfBwlWAC8DA077vp8PyVbQd3lqLiztE= +github.com/aws/aws-sdk-go v1.55.7/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/aws/aws-sdk-go-v2 v1.39.2 h1:EJLg8IdbzgeD7xgvZ+I8M1e0fL0ptn/M47lianzth0I= +github.com/aws/aws-sdk-go-v2 v1.39.2/go.mod h1:sDioUELIUO9Znk23YVmIk86/9DOpkbyyVb1i/gUNFXY= +github.com/aws/aws-sdk-go-v2/config v1.31.11 h1:6QOO1mP0MgytbfKsL/r/gE1P6/c/4pPzrrU3hKxa5fs= +github.com/aws/aws-sdk-go-v2/config v1.31.11/go.mod h1:KzpDsPX/dLxaUzoqM3sN2NOhbQIW4HW/0W8rQA1YFEs= +github.com/aws/aws-sdk-go-v2/credentials v1.18.15 h1:Gqy7/05KEfUSulSvwxnB7t8DuZMR3ShzNcwmTD6HOLU= +github.com/aws/aws-sdk-go-v2/credentials v1.18.15/go.mod h1:VWDWSRpYHjcjURRaQ7NUzgeKFN8Iv31+EOMT/W+bFyc= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.9 h1:Mv4Bc0mWmv6oDuSWTKnk+wgeqPL5DRFu5bQL9BGPQ8Y= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.9/go.mod h1:IKlKfRppK2a1y0gy1yH6zD+yX5uplJ6UuPlgd48dJiQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.9 h1:se2vOWGD3dWQUtfn4wEjRQJb1HK1XsNIt825gskZ970= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.9/go.mod h1:hijCGH2VfbZQxqCDN7bwz/4dzxV+hkyhjawAtdPWKZA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.9 h1:6RBnKZLkJM4hQ+kN6E7yWFveOTg8NLPHAkqrs4ZPlTU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.9/go.mod h1:V9rQKRmK7AWuEsOMnHzKj8WyrIir1yUJbZxDuZLFvXI= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.1 h1:oegbebPEMA/1Jny7kvwejowCaHz1FWZAQ94WXFNCyTM= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.1/go.mod h1:kemo5Myr9ac0U9JfSjMo9yHLtw+pECEHsFtJ9tqCEI8= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.9 h1:5r34CgVOD4WZudeEKZ9/iKpiT6cM1JyEROpXjOcdWv8= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.9/go.mod h1:dB12CEbNWPbzO2uC6QSWHteqOg4JfBVJOojbAoAUb5I= +github.com/aws/aws-sdk-go-v2/service/sso v1.29.5 h1:WwL5YLHabIBuAlEKRoLgqLz1LxTvCEpwsQr7MiW/vnM= +github.com/aws/aws-sdk-go-v2/service/sso v1.29.5/go.mod h1:5PfYspyCU5Vw1wNPsxi15LZovOnULudOQuVxphSflQA= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.1 h1:5fm5RTONng73/QA73LhCNR7UT9RpFH3hR6HWL6bIgVY= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.1/go.mod h1:xBEjWD13h+6nq+z4AkqSfSvqRKFgDIQeaMguAJndOWo= +github.com/aws/aws-sdk-go-v2/service/sts v1.38.6 h1:p3jIvqYwUZgu/XYeI48bJxOhvm47hZb5HUQ0tn6Q9kA= +github.com/aws/aws-sdk-go-v2/service/sts v1.38.6/go.mod h1:WtKK+ppze5yKPkZ0XwqIVWD4beCwv056ZbPQNoeHqM8= +github.com/aws/smithy-go v1.23.0 h1:8n6I3gXzWJB2DxBDnfxgBaSX6oe0d/t10qGz7OKqMCE= +github.com/aws/smithy-go v1.23.0/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -119,28 +147,32 @@ github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWR github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudevents/sdk-go/v2 v2.15.2 h1:54+I5xQEnI73RBhWHxbI1XJcqOFOVJN85vb41+8mHUc= -github.com/cloudevents/sdk-go/v2 v2.15.2/go.mod h1:lL7kSWAE/V8VI4Wh0jbL2v/jvqsm6tjmaQBSvxcv4uE= +github.com/cloudevents/sdk-go/v2 v2.16.2 h1:ZYDFrYke4FD+jM8TZTJJO6JhKHzOQl2oqpFK1D+NnQM= +github.com/cloudevents/sdk-go/v2 v2.16.2/go.mod h1:laOcGImm4nVJEU+PHnUrKL56CKmRL65RlQF0kRmW/kg= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/xds/go v0.0.0-20241223141626-cff3c89139a3 h1:boJj011Hh+874zpIySeApCX4GeOjPl9qhRF3QuIZq+Q= -github.com/cncf/xds/go v0.0.0-20241223141626-cff3c89139a3/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= -github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 h1:aQ3y1lwWyqYPiWZThqv1aFbZMiM9vblcSArJRf2Irls= +github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= +github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= +github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE= +github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/digitalocean/godo v1.125.0 h1:wGPBQRX9Wjo0qCF0o8d25mT3A84Iw8rfHnZOPyvHcMQ= -github.com/digitalocean/godo v1.125.0/go.mod h1:PU8JB6I1XYkQIdHFop8lLAY9ojp6M0XcU0TWaQSxbrc= +github.com/digitalocean/godo v1.152.0 h1:WRgkPMogZSXEJK70IkZKTB/PsMn16hMQ+NI3wCIQdzA= +github.com/digitalocean/godo v1.152.0/go.mod h1:tYeiWY5ZXVpU48YaFv0M5irUFHXGorZpDNm7zzdWMzM= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/docker v27.2.0+incompatible h1:Rk9nIVdfH3+Vz4cyI/uhbINhEZ/oLmc+CBXmH6fbNk4= -github.com/docker/docker v27.2.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v28.2.2+incompatible h1:CjwRSksz8Yo4+RmQ339Dp/D2tGO5JxwYeqtMOEe0LDw= +github.com/docker/docker v28.2.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU= -github.com/emicklei/go-restful/v3 v3.12.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.13.0 h1:C4Bl2xDndpU6nJ4bc1jXd+uTmYPVUwkD6bFY/oTyCes= +github.com/emicklei/go-restful/v3 v3.13.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -157,22 +189,24 @@ github.com/evanphx/json-patch v5.9.0+incompatible h1:fBXyNpNMuTTDdquAq/uisOr2lSh github.com/evanphx/json-patch v5.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU= github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= -github.com/expr-lang/expr v1.17.0 h1:+vpszOyzKLQXC9VF+wA8cVA0tlA984/Wabc/1hF9Whg= -github.com/expr-lang/expr v1.17.0/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= +github.com/expr-lang/expr v1.17.6 h1:1h6i8ONk9cexhDmowO/A64VPxHScu7qfSl2k8OlINec= +github.com/expr-lang/expr v1.17.6/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= -github.com/fxamacker/cbor/v2 v2.8.0 h1:fFtUGXUzXPHTIUdne5+zzMPTfffl3RD5qYnkY40vtxU= -github.com/fxamacker/cbor/v2 v2.8.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= +github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= +github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/getkin/kin-openapi v0.131.0 h1:NO2UeHnFKRYhZ8wg6Nyh5Cq7dHk4suQQr72a4pMrDxE= github.com/getkin/kin-openapi v0.131.0/go.mod h1:3OlG51PCYNsPByuiMB0t4fjnNlIDnaEDsjiKUV8nL58= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-jose/go-jose/v4 v4.1.1 h1:JYhSgy4mXXzAdF3nUx3ygx347LRXJRrpgyU3adRmkAI= +github.com/go-jose/go-jose/v4 v4.1.1/go.mod h1:BdsZGqgdO3b6tTc6LSE56wcDbMMLuPsw5d4ZD5f94kA= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= @@ -192,8 +226,8 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= -github.com/go-openapi/jsonpointer v0.21.1 h1:whnzv/pNXtK2FbX/W9yJfRmE2gsmkfahjMKB0fZvcic= -github.com/go-openapi/jsonpointer v0.21.1/go.mod h1:50I1STOfbY1ycR8jGz8DaMeLCdXiI6aDteEdRNNzpdk= +github.com/go-openapi/jsonpointer v0.21.2 h1:AqQaNADVwq/VnkCmQg6ogE+M3FOsKTytwges0JdwVuA= +github.com/go-openapi/jsonpointer v0.21.2/go.mod h1:50I1STOfbY1ycR8jGz8DaMeLCdXiI6aDteEdRNNzpdk= github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= github.com/go-openapi/swag v0.23.1 h1:lpsStH0n2ittzTnbaSloVZLuB5+fvSY/+hnagBjSNZU= @@ -202,23 +236,22 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-resty/resty/v2 v2.13.1 h1:x+LHXBI2nMB1vqndymf26quycC4aggYJ7DECYbiz03g= -github.com/go-resty/resty/v2 v2.13.1/go.mod h1:GznXlLxkq6Nh4sU59rPmUw3VtgpO3aS96ORAI6Q7d+0= +github.com/go-resty/resty/v2 v2.16.5 h1:hBKqmWrr7uRc3euHVqmh1HTHcKn99Smr7o5spptdhTM= +github.com/go-resty/resty/v2 v2.16.5/go.mod h1:hkJtXbA2iKHzJheXYvQ8snQES5ZLGKMwQ07xAwp/fiA= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg= github.com/go-test/deep v1.1.0/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= -github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg= -github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= +github.com/go-zookeeper/zk v1.0.4 h1:DPzxraQx7OrPyXq2phlGlNSIyWEsAox0RJmjTseMV6I= +github.com/go-zookeeper/zk v1.0.4/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/gofrs/uuid/v5 v5.3.0 h1:m0mUMr+oVYUdxpMLgSYCZiXe7PuVPnI94+OMeVBNedk= github.com/gofrs/uuid/v5 v5.3.0/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= -github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= -github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo= +github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -253,8 +286,10 @@ github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw= -github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= +github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -266,7 +301,6 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/go-containerregistry v0.13.0 h1:y1C7Z3e149OJbOPDBxLYR8ITPz8dTKqQwjErKVHJC8k= @@ -288,8 +322,8 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20250208200701-d0013a598941 h1:43XjGa6toxLpeksjcxs1jIoIyr+vUfOqY2c6HB4bpoc= -github.com/google/pprof v0.0.0-20250208200701-d0013a598941/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6 h1:EEHtgt9IwisQ2AZ4pIsMjahcegHh6rmhqxzIRQIyepY= +github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6/go.mod h1:I6V7YzU0XDpsHqbsyrghnFZLO1gwK6NPTNvmetQIk9U= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= @@ -300,12 +334,12 @@ github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrkurSS/Q= -github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA= +github.com/googleapis/gax-go/v2 v2.14.2 h1:eBLnkZ9635krYIPD+ag1USrOAI0Nr0QYF3+/3GqO0k0= +github.com/googleapis/gax-go/v2 v2.14.2/go.mod h1:ON64QhlJkhVtSqp4v1uaK92VyZ2gmvDQsweuyLV+8+w= github.com/googleapis/google-cloud-go-testing v0.0.0-20210719221736-1c9a4c676720 h1:zC34cGQu69FG7qzJ3WiKW244WfhDC3xxYMeNOX2gtUQ= github.com/googleapis/google-cloud-go-testing v0.0.0-20210719221736-1c9a4c676720/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gophercloud/gophercloud v1.14.1 h1:DTCNaTVGl8/cFu58O1JwWgis9gtISAFONqpMKNg/Vpw= -github.com/gophercloud/gophercloud v1.14.1/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= +github.com/gophercloud/gophercloud/v2 v2.7.0 h1:o0m4kgVcPgHlcXiWAjoVxGd8QCmvM5VU+YM71pFbn0E= +github.com/gophercloud/gophercloud/v2 v2.7.0/go.mod h1:Ki/ILhYZr/5EPebrPL9Ej+tUg4lqx71/YH2JWVeU+Qk= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo= @@ -313,10 +347,10 @@ github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w7 github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc h1:GN2Lv3MGO7AS6PrRoT6yV5+wkrOpcszoIsO4+4ds248= github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk= github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 h1:e9Rjr40Z98/clHv5Yg79Is0NtosR5LXRvdr7o/6NwbA= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1/go.mod h1:tIxuGz/9mpox++sgp9fJjHO0+q1X9/UOWd798aAm22M= -github.com/hashicorp/consul/api v1.29.4 h1:P6slzxDLBOxUSj3fWo2o65VuKtbtOXFi7TSSgtXutuE= -github.com/hashicorp/consul/api v1.29.4/go.mod h1:HUlfw+l2Zy68ceJavv2zAyArl2fqhGWnMycyt56sBgg= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 h1:X5VWvz21y3gzm9Nw/kaUeku/1+uBhcekkmy4IkffJww= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90= +github.com/hashicorp/consul/api v1.32.0 h1:5wp5u780Gri7c4OedGEPzmlUEzi0g2KyiPphSr6zjVg= +github.com/hashicorp/consul/api v1.32.0/go.mod h1:Z8YgY0eVPukT/17ejW+l+C7zJmKwgPHtjU1q16v/Y40= github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A= github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= @@ -329,8 +363,8 @@ github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJ github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= -github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= +github.com/hashicorp/go-retryablehttp v0.7.8 h1:ylXZWnqa7Lhqpk0L1P1LzDtGcCR0rPVUrx/c8Unxc48= +github.com/hashicorp/go-retryablehttp v0.7.8/go.mod h1:rjiScheydd+CxvumBsIrFKlx3iS0jrZ7LvzFGFmuKbw= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= @@ -339,17 +373,17 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/nomad/api v0.0.0-20240717122358-3d93bd3778f3 h1:fgVfQ4AC1avVOnu2cfms8VAiD8lUq3vWI8mTocOXN/w= -github.com/hashicorp/nomad/api v0.0.0-20240717122358-3d93bd3778f3/go.mod h1:svtxn6QnrQ69P23VvIWMR34tg3vmwLz4UdUzm1dSCgE= +github.com/hashicorp/nomad/api v0.0.0-20241218080744-e3ac00f30eec h1:+YBzb977VrmffaCX/OBm17dEVJUcWn5dW+eqs3aIJ/A= +github.com/hashicorp/nomad/api v0.0.0-20241218080744-e3ac00f30eec/go.mod h1:svtxn6QnrQ69P23VvIWMR34tg3vmwLz4UdUzm1dSCgE= github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= -github.com/hetznercloud/hcloud-go/v2 v2.13.1 h1:jq0GP4QaYE5d8xR/Zw17s9qoaESRJMXfGmtD1a/qckQ= -github.com/hetznercloud/hcloud-go/v2 v2.13.1/go.mod h1:dhix40Br3fDiBhwaSG/zgaYOFFddpfBm/6R1Zz0IiF0= +github.com/hetznercloud/hcloud-go/v2 v2.21.1 h1:IH3liW8/cCRjfJ4cyqYvw3s1ek+KWP8dl1roa0lD8JM= +github.com/hetznercloud/hcloud-go/v2 v2.21.1/go.mod h1:XOaYycZJ3XKMVWzmqQ24/+1V7ormJHmPdck/kxrNnQA= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/ionos-cloud/sdk-go/v6 v6.2.1 h1:mxxN+frNVmbFrmmFfXnBC3g2USYJrl6mc1LW2iNYbFY= -github.com/ionos-cloud/sdk-go/v6 v6.2.1/go.mod h1:SXrO9OGyWjd2rZhAhEpdYN6VUAODzzqRdqA9BCviQtI= +github.com/ionos-cloud/sdk-go/v6 v6.3.4 h1:jTvGl4LOF8v8OYoEIBNVwbFoqSGAFqn6vGE7sp7/BqQ= +github.com/ionos-cloud/sdk-go/v6 v6.3.4/go.mod h1:wCVwNJ/21W29FWFUv+fNawOTMlFoP1dS3L+ZuztFW48= github.com/jmespath/go-jmespath v0.4.1-0.20220621161143-b0104c826a24 h1:liMMTbpW34dhU4az1GN0pTPADwNmvoRSeoZ6PItiqnY= github.com/jmespath/go-jmespath v0.4.1-0.20220621161143-b0104c826a24/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= @@ -367,8 +401,8 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kedacore/keda/v2 v2.16.1 h1:LfYsxfSX8DjetLW8q9qnriImH936POrQJvE+caRoScI= -github.com/kedacore/keda/v2 v2.16.1/go.mod h1:pO2ksUCwSOQ2u3OWqj+jh9Hgf0+26MZug6dF7WWgcAk= +github.com/kedacore/keda/v2 v2.18.0 h1:ttR223fii/4QJ0YvtrhcWHaEoezByb/t5CeFopjl6EI= +github.com/kedacore/keda/v2 v2.18.0/go.mod h1:pw+qlQwMzj3T8LMayUnOtT15Gt1yRPF3lS1r5rt9F5k= github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -387,21 +421,23 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kubernetes-sigs/gateway-api-inference-extension v1.0.2-0.20251014221737-ffb66e1e979c h1:pIFKA+v4Yjbvav/jyodgSFUpg0Vlu+WS5wrLRIRjhuM= +github.com/kubernetes-sigs/gateway-api-inference-extension v1.0.2-0.20251014221737-ffb66e1e979c/go.mod h1:JzP+NDgySAyRrLME1OzPyKIhKJQuo5gEN8Lawikp90g= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= -github.com/linode/linodego v1.40.0 h1:7ESY0PwK94hoggoCtIroT1Xk6b1flrFBNZ6KwqbTqlI= -github.com/linode/linodego v1.40.0/go.mod h1:NsUw4l8QrLdIofRg1NYFBbW5ZERnmbZykVBszPZLORM= +github.com/linode/linodego v1.52.1 h1:HJ1cz1n9n3chRP9UrtqmP91+xTi0Q5l+H/4z4tpkwgQ= +github.com/linode/linodego v1.52.1/go.mod h1:zEN2sX+cSdp67EuRY1HJiyuLujoa7HqvVwNEcJv3iXw= github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/miekg/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ= -github.com/miekg/dns v1.1.62/go.mod h1:mvDlcItzm+br7MToIKqkglaGhlFMHJ9DTNNWONWXbNQ= +github.com/miekg/dns v1.1.68 h1:jsSRkNozw7G/mnmXULynzMNIsgY2dHC8LO6U6Ij2JEA= +github.com/miekg/dns v1.1.68/go.mod h1:fujopn7TB3Pu3JM69XaawiU0wqjpL9/8xGop5UrTPps= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= @@ -413,8 +449,9 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= @@ -426,10 +463,10 @@ github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 h1:G7ERwszslrBzRxj//J github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037/go.mod h1:2bpvgLBZEtENV5scfDFEtB/5+1M4hkQhDQrccEJ/qGw= github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 h1:bQx3WeLcUWy+RletIKwUIt4x3t8n2SxavmoclizMb8c= github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90/go.mod h1:y5+oSEHCPT/DGrS++Wc/479ERge0zTFxaF8PbGKcg2o= -github.com/onsi/ginkgo/v2 v2.23.3 h1:edHxnszytJ4lD9D5Jjc4tiDkPBZ3siDeJJkUZJJVkp0= -github.com/onsi/ginkgo/v2 v2.23.3/go.mod h1:zXTP6xIp3U8aVuXN8ENK9IXRaTjFnpVB9mGmaSRvxnM= -github.com/onsi/gomega v1.36.3 h1:hID7cr8t3Wp26+cYnfcjR6HpJ00fdogN6dqZ1t6IylU= -github.com/onsi/gomega v1.36.3/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0= +github.com/onsi/ginkgo/v2 v2.25.3 h1:Ty8+Yi/ayDAGtk4XxmmfUy4GabvM+MegeB4cDLRi6nw= +github.com/onsi/ginkgo/v2 v2.25.3/go.mod h1:43uiyQC4Ed2tkOzLsEYm7hnrb7UJTWHYNsuy3bG/snE= +github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A= +github.com/onsi/gomega v1.38.2/go.mod h1:W2MJcYxRGV63b418Ai34Ud0hEdTVXq9NW9+Sx6uXf3k= github.com/open-telemetry/opentelemetry-operator v0.113.0 h1:EoN3SLwF9dP5Ou7gFcfYligdwzedsEQBewQdagk5E3U= github.com/open-telemetry/opentelemetry-operator v0.113.0/go.mod h1:eQ8W+MxP+q5Tewf5Cx1vNXvRynjP9JNgrBbUO7TqjXQ= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= @@ -440,8 +477,8 @@ github.com/openshift/api v0.0.0-20241108213852-e22f17d9b7f5 h1:GJXiIZyRkQs4b++xf github.com/openshift/api v0.0.0-20241108213852-e22f17d9b7f5/go.mod h1:Shkl4HanLwDiiBzakv+con/aMGnVE2MAGvoKp5oyYUo= github.com/operator-framework/operator-lib v0.15.0 h1:0QeRM4PMtThqINpcFGCEBnIV3Z8u7/8fYLEx6mUtdcM= github.com/operator-framework/operator-lib v0.15.0/go.mod h1:ZxLvFuQ7bRWiTNBOqodbuNvcsy/Iq0kOygdxhlbNdI0= -github.com/ovh/go-ovh v1.6.0 h1:ixLOwxQdzYDx296sXcgS35TOPEahJkpjMGtzPadCjQI= -github.com/ovh/go-ovh v1.6.0/go.mod h1:cTVDnl94z4tl8pP1uZ/8jlVxntjSIf09bNcQ5TJSC7c= +github.com/ovh/go-ovh v1.8.0 h1:eQ5TAAFZvZAVarQir62oaTL+8a503pIBuOWVn72iGtY= +github.com/ovh/go-ovh v1.8.0/go.mod h1:cTVDnl94z4tl8pP1uZ/8jlVxntjSIf09bNcQ5TJSC7c= github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= @@ -455,6 +492,8 @@ github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= +github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.76.2 h1:BpGDC87A2SaxbKgONsFLEX3kRcRJee2aLQbjXsuz0hA= github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.76.2/go.mod h1:Rd8YnCqz+2FYsiGmE2DMlaLjQRB4v2jFNnzCt9YY4IM= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -464,8 +503,8 @@ github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqr github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= -github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= -github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= +github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= +github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -478,20 +517,20 @@ github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9 github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.35.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -github.com/prometheus/common v0.64.0 h1:pdZeA+g617P7oGv1CzdTzyeShxAGrTBsolKNOLQPGO4= -github.com/prometheus/common v0.64.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= -github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= -github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= +github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs= +github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= -github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= -github.com/prometheus/prometheus v0.55.1 h1:+NM9V/h4A+wRkOyQzGewzgPPgq/iX2LUQoISNvmjZmI= -github.com/prometheus/prometheus v0.55.1/go.mod h1:GGS7QlWKCqCbcEzWsVahYIfQwiGhcExkarHyLJTsv6I= +github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0= +github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= +github.com/prometheus/prometheus v0.305.0 h1:UO/LsM32/E9yBDtvQj8tN+WwhbyWKR10lO35vmFLx0U= +github.com/prometheus/prometheus v0.305.0/go.mod h1:JG+jKIDUJ9Bn97anZiCjwCxRyAx+lpcEQ0QnZlUlbwY= +github.com/prometheus/sigv4 v0.2.0 h1:qDFKnHYFswJxdzGeRP63c4HlH3Vbn1Yf/Ao2zabtVXk= +github.com/prometheus/sigv4 v0.2.0/go.mod h1:D04rqmAaPPEUkjRQxGqjoxdyJuyCh6E0M18fZr0zBiE= github.com/prometheus/statsd_exporter v0.22.7/go.mod h1:N/TevpjkIh9ccs6nuzY3jQn9dFqnUakOjnEuMPJJJnI= github.com/prometheus/statsd_exporter v0.27.1 h1:tcRJOmwlA83HPfWzosAgr2+zEN5XDFv+M2mn/uYkn5Y= github.com/prometheus/statsd_exporter v0.27.1/go.mod h1:vA6ryDfsN7py/3JApEst6nLTJboq66XsNcJGNmC88NQ= @@ -500,16 +539,20 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.30 h1:yoKAVkEVwAqbGbR8n87rHQ1dulL25rKloGadb3vm770= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.30/go.mod h1:sH0u6fq6x4R5M7WxkoQFY/o7UaiItec0o1LinLCJNq8= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.33 h1:KhF0WejiUTDbL5X55nXowP7zNopwpowa6qaMAWyIE+0= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.33/go.mod h1:792k1RTU+5JeMXm35/e2Wgp71qPH/DmDoZrRc+EFZDk= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= -github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= +github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spiffe/go-spiffe/v2 v2.5.0 h1:N2I01KCUkv1FAjZXJMwh95KK1ZIQLYbPfhaxw8WS0hE= +github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g= +github.com/stackitcloud/stackit-sdk-go/core v0.17.2 h1:jPyn+i8rkp2hM80+hOg0B/1EVRbMt778Tr5RWyK1m2E= +github.com/stackitcloud/stackit-sdk-go/core v0.17.2/go.mod h1:8KIw3czdNJ9sdil9QQimxjR6vHjeINFrRv0iZ67wfn0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -523,8 +566,10 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807/go.mod h1:7jxmlfBCDBXRzr0eAQJ48XC1hBu1np4CS5+cHEYfwpc= github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= @@ -545,6 +590,8 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM= +github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -555,29 +602,31 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/collector/featuregate v1.24.0 h1:DEqDsuJgxjZ3E5JNC9hXCd4sWGFiF7h9kaziODuqwFY= -go.opentelemetry.io/collector/featuregate v1.24.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= -go.opentelemetry.io/contrib/detectors/gcp v1.34.0 h1:JRxssobiPg23otYU5SbWtQC//snGVIM3Tx6QRzlQBao= -go.opentelemetry.io/contrib/detectors/gcp v1.34.0/go.mod h1:cV4BMFcscUR/ckqLkbfQmF0PRsq8w/lMGzdbCSveBHo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 h1:rgMkmiGfix9vFJDcDi1PK8WEQP4FLQwLDfhp5ZLpFeE= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0/go.mod h1:ijPqXp5P6IRRByFVVg9DY8P5HkxkHE5ARIa+86aXPf4= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ= -go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= -go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= +go.opentelemetry.io/collector/featuregate v1.34.0 h1:zqDHpEYy1UeudrfUCvlcJL2t13dXywrC6lwpNZ5DrCU= +go.opentelemetry.io/collector/featuregate v1.34.0/go.mod h1:Y/KsHbvREENKvvN9RlpiWk/IGBK+CATBYzIIpU7nccc= +go.opentelemetry.io/contrib/detectors/gcp v1.36.0 h1:F7q2tNlCaHY9nMKHR6XH9/qkp8FktLnIcy6jJNyOCQw= +go.opentelemetry.io/contrib/detectors/gcp v1.36.0/go.mod h1:IbBN8uAIIx734PTonTPxAxnjc2pQTxWNkwfstZ+6H2k= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 h1:q4XOmH/0opmeuJtPsbFNivyl7bCt7yRBbeEm2sC/XtQ= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0/go.mod h1:snMWehoOh2wsEwnvvwtDyFCxVeDAODenXHtn5vzrKjo= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= go.opentelemetry.io/otel/exporters/prometheus v0.56.0 h1:GnCIi0QyG0yy2MrJLzVrIM7laaJstj//flf1zEJCG+E= go.opentelemetry.io/otel/exporters/prometheus v0.56.0/go.mod h1:JQcVZtbIIPM+7SWBB+T6FK+xunlyidwLp++fN0sUaOk= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0 h1:WDdP9acbMYjbKIyJUhTvtzj601sVJOqgWdUxSdR/Ysc= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0/go.mod h1:BLbf7zbNIONBLPwvFnwNHGj4zge8uTCM/UPIVW1Mq2I= -go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= -go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE= -go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY= -go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg= -go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o= -go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w= -go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= -go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.35.0 h1:PB3Zrjs1sG1GBX51SXyTSoOTqcDglmsk7nT6tkKPb/k= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.35.0/go.mod h1:U2R3XyVPzn0WX7wOIypPuptulsMcPDPs/oiSVOMVnHY= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= +go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= @@ -586,14 +635,18 @@ go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8 go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= +go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM= -golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U= +golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI= +golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -626,8 +679,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= -golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U= +golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -662,8 +715,8 @@ golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= -golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= +golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I= +golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -671,8 +724,8 @@ golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= -golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= +golang.org/x/oauth2 v0.31.0 h1:8Fq0yVZLh4j4YA47vHKFTa9Ew5XIrCP8LC6UeNZnLxo= +golang.org/x/oauth2 v0.31.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -684,8 +737,8 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= -golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -727,12 +780,12 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= +golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= -golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= +golang.org/x/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ= +golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -740,13 +793,13 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= -golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= +golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= +golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= -golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/time v0.13.0 h1:eUlYslOIt32DgYD6utsuUeHs4d7AsEYLuIAdg7FlYgI= +golang.org/x/time v0.13.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -789,14 +842,16 @@ golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo= -golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg= +golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE= +golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.5.0 h1:JELs8RLM12qJGXU4u/TO3V25KW8GreMKl9pdkk14RM0= gomodules.xyz/jsonpatch/v2 v2.5.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -814,8 +869,8 @@ google.golang.org/api v0.25.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.226.0 h1:9A29y1XUD+YRXfnHkO66KggxHBZWg9LsTGqm7TkUvtQ= -google.golang.org/api v0.226.0/go.mod h1:WP/0Xm4LVvMOCldfvOISnWquSRWbG2kArDZcg+W2DbY= +google.golang.org/api v0.238.0 h1:+EldkglWIg/pWjkq97sd+XxH7PxakNYoe/rkSTbnvOs= +google.golang.org/api v0.238.0/go.mod h1:cOVEm2TpdAGHL2z+UwyS+kmlGr3bVWQQ6sYEqkKje50= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -853,12 +908,12 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 h1:ToEetK57OidYuqD4Q5w+vfEnPvPpuTwedCNVohYJfNk= -google.golang.org/genproto v0.0.0-20241118233622-e639e219e697/go.mod h1:JJrvXBWRZaFMxBufik1a4RpFw4HhgVtBBWQeQgUj2cc= -google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a h1:nwKuGPlUAt+aR+pcrkfFRrTU1BVrSmYyYMxYbUIVHr0= -google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a/go.mod h1:3kWAYMk1I75K4vykHtKt2ycnOgpA6974V7bREqbsenU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4 h1:iK2jbkWL86DXjEx0qiHcRE9dE4/Ahua5k6V8OWFb//c= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= +google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2 h1:1tXaIXCracvtsRxSBsYDiSBN0cuJvM7QYW+MrpIRY78= +google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:49MsLSx0oWMOZqcpB3uL8ZOkAh1+TndpJ8ONoCBWiZk= +google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 h1:FiusG7LWj+4byqhbvmB+Q93B/mOxJLN2DTozDuZm4EU= +google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:kXqgZtrWaf6qS3jZOCnCH7WYfrvFjkC51bM8fz3RsCA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250908214217-97024824d090 h1:/OQuEa4YWtDt7uQWHd3q3sUMb+QOLQUg1xa8CEsRv5w= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250908214217-97024824d090/go.mod h1:GmFNa4BdJZ2a8G+wCe9Bg3wwThLrJun751XstdJt5Og= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -872,8 +927,8 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.71.0 h1:kF77BGdPTQ4/JZWMlb9VpJ5pa25aqvVqogsxNHHdeBg= -google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= +google.golang.org/grpc v1.75.1 h1:/ODCNEuf9VghjgO3rqLcfg8fiOP0nSluljWFlDxELLI= +google.golang.org/grpc v1.75.1/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -888,8 +943,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= -google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw= +google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -897,8 +952,8 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= -gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= +gopkg.in/evanphx/json-patch.v4 v4.13.0 h1:czT3CmqEaQ1aanPc5SdlgQrrEIb8w/wwCvWWnfEbYzo= +gopkg.in/evanphx/json-patch.v4 v4.13.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v9 v9.31.0 h1:bmXmP2RSNtFES+bn4uYuHT7iJFJv7Vj+an+ZQdDaD1M= @@ -930,49 +985,46 @@ istio.io/api v1.24.2 h1:jYjcN6Iq0RPtQj/3KMFsybxmfqmjGN/dxhL7FGJEdIM= istio.io/api v1.24.2/go.mod h1:MQnRok7RZ20/PE56v0LxmoWH0xVxnCQPNuf9O7PAN1I= istio.io/client-go v1.24.2 h1:JTTfBV6dv+AAW+AfccyrdX4T1f9CpsXd1Yzo1s/IYAI= istio.io/client-go v1.24.2/go.mod h1:dgZ9EmJzh1EECzf6nQhwNL4R6RvlyeH/RXeNeNp/MRg= -k8s.io/api v0.33.1 h1:tA6Cf3bHnLIrUK4IqEgb2v++/GYUtqiu9sRVk3iBXyw= -k8s.io/api v0.33.1/go.mod h1:87esjTn9DRSRTD4fWMXamiXxJhpOIREjWOSjsW1kEHw= -k8s.io/apiextensions-apiserver v0.33.1 h1:N7ccbSlRN6I2QBcXevB73PixX2dQNIW0ZRuguEE91zI= -k8s.io/apiextensions-apiserver v0.33.1/go.mod h1:uNQ52z1A1Gu75QSa+pFK5bcXc4hq7lpOXbweZgi4dqA= -k8s.io/apimachinery v0.33.1 h1:mzqXWV8tW9Rw4VeW9rEkqvnxj59k1ezDUl20tFK/oM4= -k8s.io/apimachinery v0.33.1/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= -k8s.io/client-go v0.33.1 h1:ZZV/Ks2g92cyxWkRRnfUDsnhNn28eFpt26aGc8KbXF4= -k8s.io/client-go v0.33.1/go.mod h1:JAsUrl1ArO7uRVFWfcj6kOomSlCv+JpvIsp6usAGefA= -k8s.io/code-generator v0.33.1 h1:ZLzIRdMsh3Myfnx9BaooX6iQry29UJjVfVG+BuS+UMw= -k8s.io/code-generator v0.33.1/go.mod h1:HUKT7Ubp6bOgIbbaPIs9lpd2Q02uqkMCMx9/GjDrWpY= +k8s.io/api v0.34.1 h1:jC+153630BMdlFukegoEL8E/yT7aLyQkIVuwhmwDgJM= +k8s.io/api v0.34.1/go.mod h1:SB80FxFtXn5/gwzCoN6QCtPD7Vbu5w2n1S0J5gFfTYk= +k8s.io/apiextensions-apiserver v0.34.1 h1:NNPBva8FNAPt1iSVwIE0FsdrVriRXMsaWFMqJbII2CI= +k8s.io/apiextensions-apiserver v0.34.1/go.mod h1:hP9Rld3zF5Ay2Of3BeEpLAToP+l4s5UlxiHfqRaRcMc= +k8s.io/apimachinery v0.34.1 h1:dTlxFls/eikpJxmAC7MVE8oOeP1zryV7iRyIjB0gky4= +k8s.io/apimachinery v0.34.1/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw= +k8s.io/client-go v0.34.1 h1:ZUPJKgXsnKwVwmKKdPfw4tB58+7/Ik3CrjOEhsiZ7mY= +k8s.io/client-go v0.34.1/go.mod h1:kA8v0FP+tk6sZA0yKLRG67LWjqufAoSHA2xVGKw9Of8= +k8s.io/code-generator v0.34.1 h1:WpphT26E+j7tEgIUfFr5WfbJrktCGzB3JoJH9149xYc= +k8s.io/code-generator v0.34.1/go.mod h1:DeWjekbDnJWRwpw3s0Jat87c+e0TgkxoR4ar608yqvg= k8s.io/component-helpers v0.33.1 h1:DdQMww8jOr+sGhIrkz70Lp9Qerq/JzeZDBRd508DHDo= k8s.io/component-helpers v0.33.1/go.mod h1:LQwxW5L3dH7341Unj+phndJu0Ic5UjxA//7FT8YVP5U= -k8s.io/gengo/v2 v2.0.0-20250207200755-1244d31929d7 h1:2OX19X59HxDprNCVrWi6jb7LW1PoqTlYqEq5H2oetog= -k8s.io/gengo/v2 v2.0.0-20250207200755-1244d31929d7/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU= +k8s.io/gengo/v2 v2.0.0-20250820003526-c297c0c1eb9d h1:qUrYOinhdAUL0xxhA4gPqogPBaS9nIq2l2kTb6pmeB0= +k8s.io/gengo/v2 v2.0.0-20250820003526-c297c0c1eb9d/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4= -k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8= -k8s.io/utils v0.0.0-20241210054802-24370beab758 h1:sdbE21q2nlQtFh65saZY+rRM6x6aJJI8IUa1AmH/qa0= -k8s.io/utils v0.0.0-20241210054802-24370beab758/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/kube-openapi v0.0.0-20250814151709-d7b6acb124c3 h1:liMHz39T5dJO1aOKHLvwaCjDbf07wVh6yaUlTpunnkE= +k8s.io/kube-openapi v0.0.0-20250814151709-d7b6acb124c3/go.mod h1:UZ2yyWbFTpuhSbFhv24aGNOdoRdJZgsIObGBUaYVsts= +k8s.io/utils v0.0.0-20250820121507-0af2bda4dd1d h1:wAhiDyZ4Tdtt7e46e9M5ZSAJ/MnPGPs+Ki1gHw4w1R0= +k8s.io/utils v0.0.0-20250820121507-0af2bda4dd1d/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= knative.dev/networking v0.0.0-20250117155906-67d1c274ba6a h1:FaDPXtv42+AkYh/mE269pttPSZ3fDVAjJiEsYUaM4SM= knative.dev/networking v0.0.0-20250117155906-67d1c274ba6a/go.mod h1:AIKYMfZydhwXR/60c/3KXEnqEnH6aNEEqulifdqJVcQ= -knative.dev/pkg v0.0.0-20250117084104-c43477f0052b h1:a+gP7Yzu5NmoX2w1p8nfTgmSKF+aHLKGzqYT82ijJTw= -knative.dev/pkg v0.0.0-20250117084104-c43477f0052b/go.mod h1:bedSpkdLybR6JhL1J7XDLpd+JMKM/x8M5Apr80i5TeE= +knative.dev/pkg v0.0.0-20250326102644-9f3e60a9244c h1:6IZwH1QHGfWlmfdy7svgDCPhRqWpisWK/Gcp8wdAwE0= +knative.dev/pkg v0.0.0-20250326102644-9f3e60a9244c/go.mod h1:gx7Pp9NPcKYApNhR8m0KSOeg71pqhwPWhuhUJ6xCa2g= knative.dev/serving v0.44.0 h1:c6TXhoSAI6eXt0/1ET3C69jMWYA4ES9FskSan/fBaac= knative.dev/serving v0.44.0/go.mod h1:9bFONngDZtkdYZkP5ko9LDS9ZelnFY9SaPoHKG0vFxs= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/controller-runtime v0.19.7 h1:DLABZfMr20A+AwCZOHhcbcu+TqBXnJZaVBri9K3EO48= -sigs.k8s.io/controller-runtime v0.19.7/go.mod h1:iRmWllt8IlaLjvTTDLhRBXIEtkCK6hwVBJJsYS9Ajf4= -sigs.k8s.io/gateway-api v1.2.1 h1:fZZ/+RyRb+Y5tGkwxFKuYuSRQHu9dZtbjenblleOLHM= -sigs.k8s.io/gateway-api v1.2.1/go.mod h1:EpNfEXNjiYfUJypf0eZ0P5iXA9ekSGWaS1WgPaM42X0= -sigs.k8s.io/gateway-api-inference-extension v0.3.0 h1:jLFNxWfG8GeosTa4KWOMr4eTILDRXfdJbwmh/lW7AcA= -sigs.k8s.io/gateway-api-inference-extension v0.3.0/go.mod h1:x6g5FKSs4MsivsIAZJigVEjrvDAtgxNNynoWyid4v28= -sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE= -sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= +sigs.k8s.io/controller-runtime v0.22.1 h1:Ah1T7I+0A7ize291nJZdS1CabF/lB4E++WizgV24Eqg= +sigs.k8s.io/controller-runtime v0.22.1/go.mod h1:FwiwRjkRPbiN+zp2QRp7wlTCzbUXxZ/D4OzuQUDwBHY= +sigs.k8s.io/gateway-api v0.0.0-20251017132243-11212e643802 h1:Q9bMZ2UyVjwawaoo2CHzUGTbkY/HbjzWEZwORsszh+U= +sigs.k8s.io/gateway-api v0.0.0-20251017132243-11212e643802/go.mod h1:/pWUGwwvykcS4LVijnF1VoXCjdS9tEZSEQWgD1vyTHs= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= sigs.k8s.io/lws v0.6.2 h1:5ulPJDaLBI9zk6ayGO2Lfg9P/FBL3C1LsmHmJVqvHvo= sigs.k8s.io/lws v0.6.2/go.mod h1:7nbwcpHwdDticuWPTDe6Va5OpjasS0MoVeVD61N5Y0c= -sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= -sigs.k8s.io/structured-merge-diff/v4 v4.7.0 h1:qPeWmscJcXP0snki5IYF79Z8xrl8ETFxgMd7wez1XkI= -sigs.k8s.io/structured-merge-diff/v4 v4.7.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= -sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco= +sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= +sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= +sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/localmodel-agent.Dockerfile b/localmodel-agent.Dockerfile index 4f951b631e3..7f8c146bed0 100644 --- a/localmodel-agent.Dockerfile +++ b/localmodel-agent.Dockerfile @@ -6,6 +6,8 @@ WORKDIR /go/src/github.com/kserve/kserve COPY go.mod go.mod COPY go.sum go.sum +# Allow Go to automatically download the required toolchain version +ENV GOTOOLCHAIN=auto RUN go mod download COPY cmd/ cmd/ @@ -16,13 +18,13 @@ RUN CGO_ENABLED=0 GOOS=linux go build -a -o localmodelnode-agent ./cmd/localmode # Generate third-party licenses COPY LICENSE LICENSE -RUN go install github.com/google/go-licenses@latest +# RUN go install github.com/google/go-licenses@latest # Forbidden Licenses: https://github.com/google/licenseclassifier/blob/e6a9bb99b5a6f71d5a34336b8245e305f5430f99/license_type.go#L341 -RUN /opt/app-root/src/go/bin/go-licenses check ./cmd/... ./pkg/... --disallowed_types="forbidden,unknown" -RUN /opt/app-root/src/go/bin/go-licenses save --save_path third_party/library ./cmd/localmodelnode +# RUN /opt/app-root/src/go/bin/go-licenses check ./cmd/... ./pkg/... --disallowed_types="forbidden,unknown" +# RUN /opt/app-root/src/go/bin/go-licenses save --save_path third_party/library ./cmd/localmodelnode # Copy the controller-manager into a thin image FROM gcr.io/distroless/static:nonroot -COPY --from=builder /go/src/github.com/kserve/kserve/third_party /third_party +# COPY --from=builder /go/src/github.com/kserve/kserve/third_party /third_party COPY --from=builder /go/src/github.com/kserve/kserve/localmodelnode-agent /manager ENTRYPOINT ["/manager"] diff --git a/localmodel.Dockerfile b/localmodel.Dockerfile index a006ff464dd..b900492f9b4 100644 --- a/localmodel.Dockerfile +++ b/localmodel.Dockerfile @@ -6,6 +6,8 @@ WORKDIR /go/src/github.com/kserve/kserve COPY go.mod go.mod COPY go.sum go.sum +# Allow Go to automatically download the required toolchain version +ENV GOTOOLCHAIN=auto RUN go mod download COPY cmd/ cmd/ @@ -16,13 +18,13 @@ RUN CGO_ENABLED=0 GOOS=linux go build -a -o localmodel-manager ./cmd/localmodel # Generate third-party licenses COPY LICENSE LICENSE -RUN go install github.com/google/go-licenses@latest +# RUN go install github.com/google/go-licenses@latest # Forbidden Licenses: https://github.com/google/licenseclassifier/blob/e6a9bb99b5a6f71d5a34336b8245e305f5430f99/license_type.go#L341 -RUN /opt/app-root/src/go/bin/go-licenses check ./cmd/... ./pkg/... --disallowed_types="forbidden,unknown" -RUN /opt/app-root/src/go/bin/go-licenses save --save_path third_party/library ./cmd/localmodel +# RUN /opt/app-root/src/go/bin/go-licenses check ./cmd/... ./pkg/... --disallowed_types="forbidden,unknown" +# RUN /opt/app-root/src/go/bin/go-licenses save --save_path third_party/library ./cmd/localmodel # Copy the controller-manager into a thin image FROM gcr.io/distroless/static:nonroot -COPY --from=builder /go/src/github.com/kserve/kserve/third_party /third_party +# COPY --from=builder /go/src/github.com/kserve/kserve/third_party /third_party COPY --from=builder /go/src/github.com/kserve/kserve/localmodel-manager /manager ENTRYPOINT ["/manager"] diff --git a/pkg/apis/serving/v1alpha1/criticality.go b/pkg/apis/serving/v1alpha1/criticality.go new file mode 100644 index 00000000000..4fd96a159c1 --- /dev/null +++ b/pkg/apis/serving/v1alpha1/criticality.go @@ -0,0 +1,31 @@ +/* +Copyright 2023 The KServe Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1alpha1 + +// This has been extracted as v1 does not utilise criticality, but v1alpha2 does. + +// ModelCriticality expresses the relative importance of serving a model. +// This is used by our scheduler integration and stays in KServe domain. +type ModelCriticality string + +const ( + // Critical traffic must not be dropped when possible. + Critical ModelCriticality = "Critical" + + // Sheddable traffic may be dropped under load. + Sheddable ModelCriticality = "Sheddable" +) diff --git a/pkg/apis/serving/v1alpha1/llm_inference_service_types.go b/pkg/apis/serving/v1alpha1/llm_inference_service_types.go index db46c488522..1c826ddce04 100644 --- a/pkg/apis/serving/v1alpha1/llm_inference_service_types.go +++ b/pkg/apis/serving/v1alpha1/llm_inference_service_types.go @@ -21,7 +21,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "knative.dev/pkg/apis" duckv1 "knative.dev/pkg/apis/duck/v1" - igwapi "sigs.k8s.io/gateway-api-inference-extension/api/v1alpha2" gatewayapi "sigs.k8s.io/gateway-api/apis/v1" ) @@ -129,7 +128,7 @@ type LLMModelSpec struct { // Criticality defines how important it is to serve the model compared to other models. // This is used by the Inference Gateway scheduler. // +optional - Criticality *igwapi.Criticality `json:"criticality,omitempty"` + Criticality *ModelCriticality `json:"criticality,omitempty"` // LoRA (Low-Rank Adaptation) adapters configurations. // Allows for specifying one or more LoRA adapters to be applied to the base model. @@ -236,13 +235,77 @@ type SchedulerSpec struct { type InferencePoolSpec struct { // Spec defines an inline InferencePool specification. // +optional - Spec *igwapi.InferencePoolSpec `json:"spec,omitempty"` + Spec *KServeInferencePoolSpec `json:"spec,omitempty"` // Ref is a reference to an existing InferencePool. // +optional Ref *corev1.LocalObjectReference `json:"ref,omitempty"` } +// KServeInferencePoolSpec uses plain types for cross-version compatibility. +// Converted to GIE v1/v1alpha2 types at runtime by the controller. +type KServeInferencePoolSpec struct { + // Selector determines which Pods are members of this pool. + // +required + Selector KServeLabelSelector `json:"selector"` + + // TargetPorts defines ports exposed by this pool (max 1 port). + // +kubebuilder:validation:MinItems=1 + // +kubebuilder:validation:MaxItems=1 + // +required + TargetPorts []KServePort `json:"targetPorts"` + + // EndpointPickerRef references the Endpoint Picker extension. + // +required + EndpointPickerRef KServeEndpointPickerRef `json:"endpointPickerRef"` +} + +// KServeLabelSelector uses plain string maps for compatibility. +type KServeLabelSelector struct { + // MatchLabels contains required {key,value} pairs. + // +required + // +kubebuilder:validation:MinProperties=1 + // +kubebuilder:validation:MaxProperties=64 + MatchLabels map[string]string `json:"matchLabels"` +} + +// KServePort defines a network port. +type KServePort struct { + // Number is the port number (1-65535). + // +required + // +kubebuilder:validation:Minimum=1 + // +kubebuilder:validation:Maximum=65535 + Number int32 `json:"number"` +} + +// KServeEndpointPickerRef references an Endpoint Picker service. +// +kubebuilder:validation:XValidation:rule="self.kind != 'Service' || has(self.port)",message="port is required when kind is 'Service' or unspecified (defaults to 'Service')" +type KServeEndpointPickerRef struct { + // Group of the referent (default: ""). + // +optional + // +kubebuilder:default="" + Group *string `json:"group,omitempty"` + + // Kind of the referent (default: "Service"). + // +optional + // +kubebuilder:default=Service + Kind *string `json:"kind,omitempty"` + + // Name of the referent. + // +required + Name string `json:"name"` + + // Port of the service (required for Service kind). + // +optional + Port *KServePort `json:"port,omitempty"` + + // FailureMode (default: "FailClose"). + // +optional + // +kubebuilder:default="FailClose" + // +kubebuilder:validation:Enum=FailOpen;FailClose + FailureMode *string `json:"failureMode,omitempty"` +} + // ParallelismSpec defines the parallelism parameters for distributed inference. type ParallelismSpec struct { // Tensor parallelism size. diff --git a/pkg/apis/serving/v1alpha1/llm_inference_service_types_func.go b/pkg/apis/serving/v1alpha1/llm_inference_service_types_func.go index afbf657e6df..49e91ddd77f 100644 --- a/pkg/apis/serving/v1alpha1/llm_inference_service_types_func.go +++ b/pkg/apis/serving/v1alpha1/llm_inference_service_types_func.go @@ -21,19 +21,41 @@ import ( "knative.dev/pkg/kmeta" ) +func (r *RouterSpec) HasSchedulerTemplate() bool { + return r != nil && r.Scheduler != nil && r.Scheduler.Template != nil +} + +func InferenceModelName(llmSvc *LLMInferenceService) string { + return kmeta.ChildName(llmSvc.ObjectMeta.Name, "-inference-model") +} + func (s *SchedulerSpec) InferencePoolName(llmSvc *LLMInferenceService) string { if s == nil || s.Pool == nil || !s.Pool.HasRef() { // This default MUST match the default value set in the well-known presets. - return kmeta.ChildName(llmSvc.GetName(), "-inference-pool") + return kmeta.ChildName(llmSvc.ObjectMeta.Name, "-inference-pool") } return s.Pool.Ref.Name } func (r *RouterSpec) EPPServiceName(llmSvc *LLMInferenceService) string { - if r == nil || r.Route == nil || r.Scheduler == nil || r.Scheduler.Pool == nil || !r.Scheduler.Pool.HasRef() || r.Scheduler.Pool.Spec == nil || r.Scheduler.Pool.Spec.ExtensionRef == nil { - return kmeta.ChildName(llmSvc.GetName(), "-epp-service") + // If Scheduler/Pool/inline Spec aren't provided, fall back to our managed EPP Service name. + if r == nil || r.Scheduler == nil || r.Scheduler.Pool == nil || r.Scheduler.Pool.Spec == nil { + return kmeta.ChildName(llmSvc.ObjectMeta.Name, "-epp-service") + } + + name := r.Scheduler.Pool.Spec.EndpointPickerRef.Name + if name == "" { + return kmeta.ChildName(llmSvc.ObjectMeta.Name, "-epp-service") + } + return name +} + +func (in *GatewayRoutesSpec) IsManaged() bool { + if in == nil || in.HTTP == nil { + return false } - return string(r.Scheduler.Pool.Spec.ExtensionRef.Name) + // "Managed" means: user gave an inline HTTPRoute spec and did NOT provide refs. + return in.HTTP.Spec != nil && len(in.HTTP.Refs) == 0 } func (in *GatewaySpec) HasRefs() bool { diff --git a/pkg/apis/serving/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/serving/v1alpha1/zz_generated.deepcopy.go index c9a1abd88a2..d39ca1bd179 100644 --- a/pkg/apis/serving/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/serving/v1alpha1/zz_generated.deepcopy.go @@ -26,7 +26,6 @@ import ( "k8s.io/apimachinery/pkg/runtime" "knative.dev/pkg/apis" duckv1 "knative.dev/pkg/apis/duck/v1" - "sigs.k8s.io/gateway-api-inference-extension/api/v1alpha2" apisv1 "sigs.k8s.io/gateway-api/apis/v1" ) @@ -386,7 +385,7 @@ func (in *InferencePoolSpec) DeepCopyInto(out *InferencePoolSpec) { *out = *in if in.Spec != nil { in, out := &in.Spec, &out.Spec - *out = new(v1alpha2.InferencePoolSpec) + *out = new(KServeInferencePoolSpec) (*in).DeepCopyInto(*out) } if in.Ref != nil { @@ -484,6 +483,100 @@ func (in *IngressSpec) DeepCopy() *IngressSpec { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *KServeEndpointPickerRef) DeepCopyInto(out *KServeEndpointPickerRef) { + *out = *in + if in.Group != nil { + in, out := &in.Group, &out.Group + *out = new(string) + **out = **in + } + if in.Kind != nil { + in, out := &in.Kind, &out.Kind + *out = new(string) + **out = **in + } + if in.Port != nil { + in, out := &in.Port, &out.Port + *out = new(KServePort) + **out = **in + } + if in.FailureMode != nil { + in, out := &in.FailureMode, &out.FailureMode + *out = new(string) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KServeEndpointPickerRef. +func (in *KServeEndpointPickerRef) DeepCopy() *KServeEndpointPickerRef { + if in == nil { + return nil + } + out := new(KServeEndpointPickerRef) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *KServeInferencePoolSpec) DeepCopyInto(out *KServeInferencePoolSpec) { + *out = *in + in.Selector.DeepCopyInto(&out.Selector) + if in.TargetPorts != nil { + in, out := &in.TargetPorts, &out.TargetPorts + *out = make([]KServePort, len(*in)) + copy(*out, *in) + } + in.EndpointPickerRef.DeepCopyInto(&out.EndpointPickerRef) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KServeInferencePoolSpec. +func (in *KServeInferencePoolSpec) DeepCopy() *KServeInferencePoolSpec { + if in == nil { + return nil + } + out := new(KServeInferencePoolSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *KServeLabelSelector) DeepCopyInto(out *KServeLabelSelector) { + *out = *in + if in.MatchLabels != nil { + in, out := &in.MatchLabels, &out.MatchLabels + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KServeLabelSelector. +func (in *KServeLabelSelector) DeepCopy() *KServeLabelSelector { + if in == nil { + return nil + } + out := new(KServeLabelSelector) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *KServePort) DeepCopyInto(out *KServePort) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KServePort. +func (in *KServePort) DeepCopy() *KServePort { + if in == nil { + return nil + } + out := new(KServePort) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *LLMInferenceService) DeepCopyInto(out *LLMInferenceService) { *out = *in @@ -666,7 +759,7 @@ func (in *LLMModelSpec) DeepCopyInto(out *LLMModelSpec) { } if in.Criticality != nil { in, out := &in.Criticality, &out.Criticality - *out = new(v1alpha2.Criticality) + *out = new(ModelCriticality) **out = **in } if in.LoRA != nil { diff --git a/pkg/apis/serving/v1beta1/explainer_custom.go b/pkg/apis/serving/v1beta1/explainer_custom.go index 0f262877983..25bb20ca410 100644 --- a/pkg/apis/serving/v1beta1/explainer_custom.go +++ b/pkg/apis/serving/v1beta1/explainer_custom.go @@ -34,8 +34,10 @@ type CustomExplainer struct { var _ ComponentImplementation = &CustomExplainer{} +// NewCustomExplainer creates a CustomExplainer from a KServe PodSpec. +// Uses ToCorev1PodSpec() for explicit field mapping required by structured-merge-diff v6. func NewCustomExplainer(podSpec *PodSpec) *CustomExplainer { - return &CustomExplainer{PodSpec: corev1.PodSpec(*podSpec)} + return &CustomExplainer{PodSpec: podSpec.ToCorev1PodSpec()} } // Validate the spec diff --git a/pkg/apis/serving/v1beta1/explainer_custom_test.go b/pkg/apis/serving/v1beta1/explainer_custom_test.go index cab3e37ec48..ab040d2e1f4 100644 --- a/pkg/apis/serving/v1beta1/explainer_custom_test.go +++ b/pkg/apis/serving/v1beta1/explainer_custom_test.go @@ -87,7 +87,7 @@ func TestCustomExplainerDefaulter(t *testing.T) { for name, scenario := range scenarios { t.Run(name, func(t *testing.T) { - explainer := CustomExplainer{PodSpec: corev1.PodSpec(scenario.spec.PodSpec)} + explainer := CustomExplainer{PodSpec: scenario.spec.PodSpec.ToCorev1PodSpec()} explainer.Default(&config) if !g.Expect(scenario.spec).To(gomega.Equal(scenario.expected)) { t.Errorf("got %v, want %v", scenario.spec, scenario.expected) @@ -279,7 +279,7 @@ func TestCustomExplainerIsMMS(t *testing.T) { for name, scenario := range scenarios { t.Run(name, func(t *testing.T) { - explainer := CustomExplainer{PodSpec: corev1.PodSpec(scenario.spec.PodSpec)} + explainer := CustomExplainer{PodSpec: scenario.spec.PodSpec.ToCorev1PodSpec()} res := explainer.IsMMS(&config) if !g.Expect(res).To(gomega.Equal(scenario.expected)) { t.Errorf("got %t, want %t", res, scenario.expected) diff --git a/pkg/apis/serving/v1beta1/podspec.go b/pkg/apis/serving/v1beta1/podspec.go index a63c8a046ef..4be5edf8b9c 100644 --- a/pkg/apis/serving/v1beta1/podspec.go +++ b/pkg/apis/serving/v1beta1/podspec.go @@ -337,3 +337,64 @@ type PodSpec struct { // +optional Resources *corev1.ResourceRequirements `json:"resources,omitempty" protobuf:"bytes,40,opt,name=resources"` } + +// ToCorev1PodSpec converts KServe PodSpec to corev1.PodSpec with explicit field mapping. +// +// This method is required to properly handle the migration from structured-merge-diff/v4 to v6 +// which is included in Kubernetes v0.34+. The structured-merge-diff library is used by Kubernetes +// Server-Side Apply (SSA) to track field ownership and manage conflicts between multiple controllers. +// +// When upgrading from v4 to v6, direct type casts (e.g., corev1.PodSpec(*podSpec)) can cause issues +// with field ownership tracking because structured-merge-diff v6 requires explicit field mapping to +// properly track which fields are being set by each manager. +// +// Reference: https://github.com/kubernetes-sigs/structured-merge-diff +// - ReconcileFieldSetWithSchema supports schema evolution and type changes +// - Explicit field tracking is required for proper APPLY operations +// +// This conversion ensures all 40+ PodSpec fields are explicitly mapped, allowing structured-merge-diff +// to correctly track field ownership during reconciliation. +func (p *PodSpec) ToCorev1PodSpec() corev1.PodSpec { + return corev1.PodSpec{ + Volumes: p.Volumes, + InitContainers: p.InitContainers, + Containers: p.Containers, + EphemeralContainers: p.EphemeralContainers, + RestartPolicy: p.RestartPolicy, + TerminationGracePeriodSeconds: p.TerminationGracePeriodSeconds, + ActiveDeadlineSeconds: p.ActiveDeadlineSeconds, + DNSPolicy: p.DNSPolicy, + NodeSelector: p.NodeSelector, + ServiceAccountName: p.ServiceAccountName, + DeprecatedServiceAccount: p.DeprecatedServiceAccount, + AutomountServiceAccountToken: p.AutomountServiceAccountToken, + NodeName: p.NodeName, + HostNetwork: p.HostNetwork, + HostPID: p.HostPID, + HostIPC: p.HostIPC, + ShareProcessNamespace: p.ShareProcessNamespace, + SecurityContext: p.SecurityContext, + ImagePullSecrets: p.ImagePullSecrets, + Hostname: p.Hostname, + Subdomain: p.Subdomain, + Affinity: p.Affinity, + SchedulerName: p.SchedulerName, + Tolerations: p.Tolerations, + HostAliases: p.HostAliases, + PriorityClassName: p.PriorityClassName, + Priority: p.Priority, + DNSConfig: p.DNSConfig, + ReadinessGates: p.ReadinessGates, + RuntimeClassName: p.RuntimeClassName, + EnableServiceLinks: p.EnableServiceLinks, + PreemptionPolicy: p.PreemptionPolicy, + Overhead: p.Overhead, + TopologySpreadConstraints: p.TopologySpreadConstraints, + SetHostnameAsFQDN: p.SetHostnameAsFQDN, + OS: p.OS, + HostUsers: p.HostUsers, + SchedulingGates: p.SchedulingGates, + ResourceClaims: p.ResourceClaims, + Resources: p.Resources, + } +} diff --git a/pkg/apis/serving/v1beta1/podspec_test.go b/pkg/apis/serving/v1beta1/podspec_test.go new file mode 100644 index 00000000000..8173fe4f6d3 --- /dev/null +++ b/pkg/apis/serving/v1beta1/podspec_test.go @@ -0,0 +1,471 @@ +/* +Copyright 2025 The KServe Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1beta1 + +import ( + "testing" + + "github.com/onsi/gomega" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/utils/ptr" +) + +func TestToCorev1PodSpec(t *testing.T) { + g := gomega.NewGomegaWithT(t) + + scenarios := map[string]struct { + kservePodSpec PodSpec + validate func(*corev1.PodSpec) bool + }{ + "EmptyPodSpec": { + kservePodSpec: PodSpec{}, + validate: func(ps *corev1.PodSpec) bool { + return ps != nil && + len(ps.Containers) == 0 && + len(ps.InitContainers) == 0 && + len(ps.Volumes) == 0 + }, + }, + "PodSpecWithContainers": { + kservePodSpec: PodSpec{ + Containers: []corev1.Container{ + { + Name: "test-container", + Image: "test-image:latest", + Resources: corev1.ResourceRequirements{ + Requests: corev1.ResourceList{ + corev1.ResourceCPU: resource.MustParse("100m"), + corev1.ResourceMemory: resource.MustParse("128Mi"), + }, + Limits: corev1.ResourceList{ + corev1.ResourceCPU: resource.MustParse("200m"), + corev1.ResourceMemory: resource.MustParse("256Mi"), + }, + }, + }, + }, + }, + validate: func(ps *corev1.PodSpec) bool { + return ps != nil && + len(ps.Containers) == 1 && + ps.Containers[0].Name == "test-container" && + ps.Containers[0].Image == "test-image:latest" && + ps.Containers[0].Resources.Requests.Cpu().String() == "100m" && + ps.Containers[0].Resources.Limits.Memory().String() == "256Mi" + }, + }, + "PodSpecWithServiceAccount": { + kservePodSpec: PodSpec{ + ServiceAccountName: "test-sa", + Containers: []corev1.Container{ + {Name: "test"}, + }, + }, + validate: func(ps *corev1.PodSpec) bool { + return ps != nil && + ps.ServiceAccountName == "test-sa" + }, + }, + "PodSpecWithNodeSelector": { + kservePodSpec: PodSpec{ + NodeSelector: map[string]string{ + "disktype": "ssd", + "region": "us-west", + }, + Containers: []corev1.Container{ + {Name: "test"}, + }, + }, + validate: func(ps *corev1.PodSpec) bool { + return ps != nil && + len(ps.NodeSelector) == 2 && + ps.NodeSelector["disktype"] == "ssd" && + ps.NodeSelector["region"] == "us-west" + }, + }, + "PodSpecWithTolerations": { + kservePodSpec: PodSpec{ + Tolerations: []corev1.Toleration{ + { + Key: "key1", + Operator: corev1.TolerationOpEqual, + Value: "value1", + Effect: corev1.TaintEffectNoSchedule, + }, + }, + Containers: []corev1.Container{ + {Name: "test"}, + }, + }, + validate: func(ps *corev1.PodSpec) bool { + return ps != nil && + len(ps.Tolerations) == 1 && + ps.Tolerations[0].Key == "key1" && + ps.Tolerations[0].Value == "value1" + }, + }, + "PodSpecWithAffinity": { + kservePodSpec: PodSpec{ + Affinity: &corev1.Affinity{ + NodeAffinity: &corev1.NodeAffinity{ + RequiredDuringSchedulingIgnoredDuringExecution: &corev1.NodeSelector{ + NodeSelectorTerms: []corev1.NodeSelectorTerm{ + { + MatchExpressions: []corev1.NodeSelectorRequirement{ + { + Key: "kubernetes.io/e2e-az-name", + Operator: corev1.NodeSelectorOpIn, + Values: []string{"e2e-az1", "e2e-az2"}, + }, + }, + }, + }, + }, + }, + }, + Containers: []corev1.Container{ + {Name: "test"}, + }, + }, + validate: func(ps *corev1.PodSpec) bool { + return ps != nil && + ps.Affinity != nil && + ps.Affinity.NodeAffinity != nil && + ps.Affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution != nil && + len(ps.Affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms) == 1 + }, + }, + "PodSpecWithVolumes": { + kservePodSpec: PodSpec{ + Volumes: []corev1.Volume{ + { + Name: "test-volume", + VolumeSource: corev1.VolumeSource{ + EmptyDir: &corev1.EmptyDirVolumeSource{}, + }, + }, + }, + Containers: []corev1.Container{ + {Name: "test"}, + }, + }, + validate: func(ps *corev1.PodSpec) bool { + return ps != nil && + len(ps.Volumes) == 1 && + ps.Volumes[0].Name == "test-volume" && + ps.Volumes[0].EmptyDir != nil + }, + }, + "PodSpecWithImagePullSecrets": { + kservePodSpec: PodSpec{ + ImagePullSecrets: []corev1.LocalObjectReference{ + {Name: "my-registry-secret"}, + }, + Containers: []corev1.Container{ + {Name: "test"}, + }, + }, + validate: func(ps *corev1.PodSpec) bool { + return ps != nil && + len(ps.ImagePullSecrets) == 1 && + ps.ImagePullSecrets[0].Name == "my-registry-secret" + }, + }, + "PodSpecWithSecurityContext": { + kservePodSpec: PodSpec{ + SecurityContext: &corev1.PodSecurityContext{ + RunAsUser: ptr.To(int64(1000)), + RunAsGroup: ptr.To(int64(3000)), + FSGroup: ptr.To(int64(2000)), + }, + Containers: []corev1.Container{ + {Name: "test"}, + }, + }, + validate: func(ps *corev1.PodSpec) bool { + return ps != nil && + ps.SecurityContext != nil && + *ps.SecurityContext.RunAsUser == 1000 && + *ps.SecurityContext.FSGroup == 2000 + }, + }, + "PodSpecWithInitContainers": { + kservePodSpec: PodSpec{ + InitContainers: []corev1.Container{ + { + Name: "init-container", + Image: "busybox:latest", + }, + }, + Containers: []corev1.Container{ + {Name: "test"}, + }, + }, + validate: func(ps *corev1.PodSpec) bool { + return ps != nil && + len(ps.InitContainers) == 1 && + ps.InitContainers[0].Name == "init-container" && + ps.InitContainers[0].Image == "busybox:latest" + }, + }, + "PodSpecWithRestartPolicy": { + kservePodSpec: PodSpec{ + RestartPolicy: corev1.RestartPolicyAlways, + Containers: []corev1.Container{ + {Name: "test"}, + }, + }, + validate: func(ps *corev1.PodSpec) bool { + return ps != nil && + ps.RestartPolicy == corev1.RestartPolicyAlways + }, + }, + "PodSpecWithTerminationGracePeriod": { + kservePodSpec: PodSpec{ + TerminationGracePeriodSeconds: ptr.To(int64(30)), + Containers: []corev1.Container{ + {Name: "test"}, + }, + }, + validate: func(ps *corev1.PodSpec) bool { + return ps != nil && + ps.TerminationGracePeriodSeconds != nil && + *ps.TerminationGracePeriodSeconds == 30 + }, + }, + "PodSpecWithDNSPolicy": { + kservePodSpec: PodSpec{ + DNSPolicy: corev1.DNSClusterFirst, + Containers: []corev1.Container{ + {Name: "test"}, + }, + }, + validate: func(ps *corev1.PodSpec) bool { + return ps != nil && + ps.DNSPolicy == corev1.DNSClusterFirst + }, + }, + "PodSpecWithPriorityClassName": { + kservePodSpec: PodSpec{ + PriorityClassName: "high-priority", + Containers: []corev1.Container{ + {Name: "test"}, + }, + }, + validate: func(ps *corev1.PodSpec) bool { + return ps != nil && + ps.PriorityClassName == "high-priority" + }, + }, + "PodSpecWithSchedulerName": { + kservePodSpec: PodSpec{ + SchedulerName: "custom-scheduler", + Containers: []corev1.Container{ + {Name: "test"}, + }, + }, + validate: func(ps *corev1.PodSpec) bool { + return ps != nil && + ps.SchedulerName == "custom-scheduler" + }, + }, + "PodSpecWithRuntimeClassName": { + kservePodSpec: PodSpec{ + RuntimeClassName: ptr.To("nvidia"), + Containers: []corev1.Container{ + {Name: "test"}, + }, + }, + validate: func(ps *corev1.PodSpec) bool { + return ps != nil && + ps.RuntimeClassName != nil && + *ps.RuntimeClassName == "nvidia" + }, + }, + "ComplexPodSpecWithMultipleFields": { + kservePodSpec: PodSpec{ + ServiceAccountName: "complex-sa", + NodeSelector: map[string]string{ + "env": "prod", + }, + Affinity: &corev1.Affinity{ + PodAntiAffinity: &corev1.PodAntiAffinity{ + RequiredDuringSchedulingIgnoredDuringExecution: []corev1.PodAffinityTerm{ + { + LabelSelector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "app": "myapp", + }, + }, + TopologyKey: "kubernetes.io/hostname", + }, + }, + }, + }, + InitContainers: []corev1.Container{ + {Name: "init"}, + }, + Containers: []corev1.Container{ + { + Name: "main", + Image: "app:v1.0", + Ports: []corev1.ContainerPort{ + {ContainerPort: 8080}, + }, + }, + }, + Volumes: []corev1.Volume{ + { + Name: "data", + VolumeSource: corev1.VolumeSource{ + PersistentVolumeClaim: &corev1.PersistentVolumeClaimVolumeSource{ + ClaimName: "data-pvc", + }, + }, + }, + }, + RestartPolicy: corev1.RestartPolicyAlways, + TerminationGracePeriodSeconds: ptr.To(int64(60)), + DNSPolicy: corev1.DNSClusterFirst, + SecurityContext: &corev1.PodSecurityContext{ + RunAsNonRoot: ptr.To(true), + }, + }, + validate: func(ps *corev1.PodSpec) bool { + return ps != nil && + ps.ServiceAccountName == "complex-sa" && + ps.NodeSelector["env"] == "prod" && + ps.Affinity != nil && + ps.Affinity.PodAntiAffinity != nil && + len(ps.InitContainers) == 1 && + len(ps.Containers) == 1 && + ps.Containers[0].Name == "main" && + len(ps.Volumes) == 1 && + ps.RestartPolicy == corev1.RestartPolicyAlways && + *ps.TerminationGracePeriodSeconds == 60 && + ps.SecurityContext != nil && + *ps.SecurityContext.RunAsNonRoot == true + }, + }, + } + + for name, scenario := range scenarios { + t.Run(name, func(t *testing.T) { + result := scenario.kservePodSpec.ToCorev1PodSpec() + if !g.Expect(scenario.validate(&result)).To(gomega.BeTrue()) { + t.Errorf("Validation failed for scenario %s", name) + } + }) + } +} + +// TestToCorev1PodSpecFieldMapping ensures all fields are properly mapped +func TestToCorev1PodSpecFieldMapping(t *testing.T) { + g := gomega.NewGomegaWithT(t) + + // Create a PodSpec with all fields populated + kservePodSpec := PodSpec{ + Volumes: []corev1.Volume{{Name: "vol"}}, + InitContainers: []corev1.Container{{Name: "init"}}, + Containers: []corev1.Container{{Name: "main"}}, + EphemeralContainers: []corev1.EphemeralContainer{ + {EphemeralContainerCommon: corev1.EphemeralContainerCommon{Name: "ephemeral"}}, + }, + RestartPolicy: corev1.RestartPolicyOnFailure, + TerminationGracePeriodSeconds: ptr.To(int64(45)), + ActiveDeadlineSeconds: ptr.To(int64(600)), + DNSPolicy: corev1.DNSDefault, + NodeSelector: map[string]string{"key": "value"}, + ServiceAccountName: "sa-name", + DeprecatedServiceAccount: "deprecated-sa", + AutomountServiceAccountToken: ptr.To(false), + NodeName: "node1", + HostNetwork: true, + HostPID: true, + HostIPC: true, + ShareProcessNamespace: ptr.To(true), + SecurityContext: &corev1.PodSecurityContext{RunAsUser: ptr.To(int64(1000))}, + ImagePullSecrets: []corev1.LocalObjectReference{{Name: "secret"}}, + Hostname: "hostname", + Subdomain: "subdomain", + Affinity: &corev1.Affinity{}, + SchedulerName: "scheduler", + Tolerations: []corev1.Toleration{{Key: "key"}}, + HostAliases: []corev1.HostAlias{{IP: "127.0.0.1"}}, + PriorityClassName: "priority", + Priority: ptr.To(int32(100)), + DNSConfig: &corev1.PodDNSConfig{}, + ReadinessGates: []corev1.PodReadinessGate{{ConditionType: "Ready"}}, + RuntimeClassName: ptr.To("runtime"), + EnableServiceLinks: ptr.To(false), + PreemptionPolicy: (*corev1.PreemptionPolicy)(ptr.To("PreemptLowerPriority")), + Overhead: corev1.ResourceList{corev1.ResourceCPU: resource.MustParse("10m")}, + TopologySpreadConstraints: []corev1.TopologySpreadConstraint{{MaxSkew: 1}}, + SetHostnameAsFQDN: ptr.To(true), + OS: &corev1.PodOS{Name: corev1.Linux}, + HostUsers: ptr.To(false), + SchedulingGates: []corev1.PodSchedulingGate{{Name: "gate"}}, + ResourceClaims: []corev1.PodResourceClaim{{Name: "claim"}}, + Resources: &corev1.ResourceRequirements{}, + } + + result := kservePodSpec.ToCorev1PodSpec() + + // Verify all fields are mapped correctly + g.Expect(result.Volumes).To(gomega.HaveLen(1)) + g.Expect(result.InitContainers).To(gomega.HaveLen(1)) + g.Expect(result.Containers).To(gomega.HaveLen(1)) + g.Expect(result.EphemeralContainers).To(gomega.HaveLen(1)) + g.Expect(result.RestartPolicy).To(gomega.Equal(corev1.RestartPolicyOnFailure)) + g.Expect(*result.TerminationGracePeriodSeconds).To(gomega.Equal(int64(45))) + g.Expect(*result.ActiveDeadlineSeconds).To(gomega.Equal(int64(600))) + g.Expect(result.DNSPolicy).To(gomega.Equal(corev1.DNSDefault)) + g.Expect(result.NodeSelector).To(gomega.HaveLen(1)) + g.Expect(result.ServiceAccountName).To(gomega.Equal("sa-name")) + g.Expect(result.DeprecatedServiceAccount).To(gomega.Equal("deprecated-sa")) + g.Expect(*result.AutomountServiceAccountToken).To(gomega.BeFalse()) + g.Expect(result.NodeName).To(gomega.Equal("node1")) + g.Expect(result.HostNetwork).To(gomega.BeTrue()) + g.Expect(result.HostPID).To(gomega.BeTrue()) + g.Expect(result.HostIPC).To(gomega.BeTrue()) + g.Expect(*result.ShareProcessNamespace).To(gomega.BeTrue()) + g.Expect(result.SecurityContext).NotTo(gomega.BeNil()) + g.Expect(result.ImagePullSecrets).To(gomega.HaveLen(1)) + g.Expect(result.Hostname).To(gomega.Equal("hostname")) + g.Expect(result.Subdomain).To(gomega.Equal("subdomain")) + g.Expect(result.Affinity).NotTo(gomega.BeNil()) + g.Expect(result.SchedulerName).To(gomega.Equal("scheduler")) + g.Expect(result.Tolerations).To(gomega.HaveLen(1)) + g.Expect(result.HostAliases).To(gomega.HaveLen(1)) + g.Expect(result.PriorityClassName).To(gomega.Equal("priority")) + g.Expect(*result.Priority).To(gomega.Equal(int32(100))) + g.Expect(result.DNSConfig).NotTo(gomega.BeNil()) + g.Expect(result.ReadinessGates).To(gomega.HaveLen(1)) + g.Expect(*result.RuntimeClassName).To(gomega.Equal("runtime")) + g.Expect(*result.EnableServiceLinks).To(gomega.BeFalse()) + g.Expect(result.PreemptionPolicy).NotTo(gomega.BeNil()) + g.Expect(result.Overhead).To(gomega.HaveLen(1)) + g.Expect(result.TopologySpreadConstraints).To(gomega.HaveLen(1)) + g.Expect(*result.SetHostnameAsFQDN).To(gomega.BeTrue()) + g.Expect(result.OS).NotTo(gomega.BeNil()) + g.Expect(*result.HostUsers).To(gomega.BeFalse()) + g.Expect(result.SchedulingGates).To(gomega.HaveLen(1)) + g.Expect(result.ResourceClaims).To(gomega.HaveLen(1)) + g.Expect(result.Resources).NotTo(gomega.BeNil()) +} diff --git a/pkg/apis/serving/v1beta1/predictor_custom.go b/pkg/apis/serving/v1beta1/predictor_custom.go index acd6be05996..03b4a14def4 100644 --- a/pkg/apis/serving/v1beta1/predictor_custom.go +++ b/pkg/apis/serving/v1beta1/predictor_custom.go @@ -37,8 +37,10 @@ var ( _ PredictorImplementation = &CustomPredictor{} ) +// NewCustomPredictor creates a CustomPredictor from a KServe PodSpec. +// Uses ToCorev1PodSpec() for explicit field mapping required by structured-merge-diff v6. func NewCustomPredictor(podSpec *PodSpec) *CustomPredictor { - return &CustomPredictor{PodSpec: corev1.PodSpec(*podSpec)} + return &CustomPredictor{PodSpec: podSpec.ToCorev1PodSpec()} } // Validate returns an error if invalid diff --git a/pkg/apis/serving/v1beta1/transformer_custom.go b/pkg/apis/serving/v1beta1/transformer_custom.go index 70850193eb6..98e464579e7 100644 --- a/pkg/apis/serving/v1beta1/transformer_custom.go +++ b/pkg/apis/serving/v1beta1/transformer_custom.go @@ -38,8 +38,10 @@ var customTransformerLogger = logf.Log.WithName("inferenceservice-v1beta1-custom var _ ComponentImplementation = &CustomTransformer{} +// NewCustomTransformer creates a CustomTransformer from a KServe PodSpec. +// Uses ToCorev1PodSpec() for explicit field mapping required by structured-merge-diff v6. func NewCustomTransformer(podSpec *PodSpec) *CustomTransformer { - return &CustomTransformer{PodSpec: corev1.PodSpec(*podSpec)} + return &CustomTransformer{PodSpec: podSpec.ToCorev1PodSpec()} } // Validate returns an error if invalid diff --git a/pkg/apis/serving/v1beta1/zz_generated.defaults.go b/pkg/apis/serving/v1beta1/zz_generated.defaults.go index be1f3efa0b4..4b25e57d734 100644 --- a/pkg/apis/serving/v1beta1/zz_generated.defaults.go +++ b/pkg/apis/serving/v1beta1/zz_generated.defaults.go @@ -43,6 +43,17 @@ func SetObjectDefaults_InferenceService(in *InferenceService) { a.Protocol = "TCP" } } + for i := range in.Spec.Predictor.SKLearn.PredictorExtensionSpec.Container.Env { + a := &in.Spec.Predictor.SKLearn.PredictorExtensionSpec.Container.Env[i] + if a.ValueFrom != nil { + if a.ValueFrom.FileKeyRef != nil { + if a.ValueFrom.FileKeyRef.Optional == nil { + var ptrVar1 bool = false + a.ValueFrom.FileKeyRef.Optional = &ptrVar1 + } + } + } + } if in.Spec.Predictor.SKLearn.PredictorExtensionSpec.Container.LivenessProbe != nil { if in.Spec.Predictor.SKLearn.PredictorExtensionSpec.Container.LivenessProbe.ProbeHandler.GRPC != nil { if in.Spec.Predictor.SKLearn.PredictorExtensionSpec.Container.LivenessProbe.ProbeHandler.GRPC.Service == nil { @@ -75,6 +86,17 @@ func SetObjectDefaults_InferenceService(in *InferenceService) { a.Protocol = "TCP" } } + for i := range in.Spec.Predictor.XGBoost.PredictorExtensionSpec.Container.Env { + a := &in.Spec.Predictor.XGBoost.PredictorExtensionSpec.Container.Env[i] + if a.ValueFrom != nil { + if a.ValueFrom.FileKeyRef != nil { + if a.ValueFrom.FileKeyRef.Optional == nil { + var ptrVar1 bool = false + a.ValueFrom.FileKeyRef.Optional = &ptrVar1 + } + } + } + } if in.Spec.Predictor.XGBoost.PredictorExtensionSpec.Container.LivenessProbe != nil { if in.Spec.Predictor.XGBoost.PredictorExtensionSpec.Container.LivenessProbe.ProbeHandler.GRPC != nil { if in.Spec.Predictor.XGBoost.PredictorExtensionSpec.Container.LivenessProbe.ProbeHandler.GRPC.Service == nil { @@ -107,6 +129,17 @@ func SetObjectDefaults_InferenceService(in *InferenceService) { a.Protocol = "TCP" } } + for i := range in.Spec.Predictor.Tensorflow.PredictorExtensionSpec.Container.Env { + a := &in.Spec.Predictor.Tensorflow.PredictorExtensionSpec.Container.Env[i] + if a.ValueFrom != nil { + if a.ValueFrom.FileKeyRef != nil { + if a.ValueFrom.FileKeyRef.Optional == nil { + var ptrVar1 bool = false + a.ValueFrom.FileKeyRef.Optional = &ptrVar1 + } + } + } + } if in.Spec.Predictor.Tensorflow.PredictorExtensionSpec.Container.LivenessProbe != nil { if in.Spec.Predictor.Tensorflow.PredictorExtensionSpec.Container.LivenessProbe.ProbeHandler.GRPC != nil { if in.Spec.Predictor.Tensorflow.PredictorExtensionSpec.Container.LivenessProbe.ProbeHandler.GRPC.Service == nil { @@ -139,6 +172,17 @@ func SetObjectDefaults_InferenceService(in *InferenceService) { a.Protocol = "TCP" } } + for i := range in.Spec.Predictor.PyTorch.PredictorExtensionSpec.Container.Env { + a := &in.Spec.Predictor.PyTorch.PredictorExtensionSpec.Container.Env[i] + if a.ValueFrom != nil { + if a.ValueFrom.FileKeyRef != nil { + if a.ValueFrom.FileKeyRef.Optional == nil { + var ptrVar1 bool = false + a.ValueFrom.FileKeyRef.Optional = &ptrVar1 + } + } + } + } if in.Spec.Predictor.PyTorch.PredictorExtensionSpec.Container.LivenessProbe != nil { if in.Spec.Predictor.PyTorch.PredictorExtensionSpec.Container.LivenessProbe.ProbeHandler.GRPC != nil { if in.Spec.Predictor.PyTorch.PredictorExtensionSpec.Container.LivenessProbe.ProbeHandler.GRPC.Service == nil { @@ -171,6 +215,17 @@ func SetObjectDefaults_InferenceService(in *InferenceService) { a.Protocol = "TCP" } } + for i := range in.Spec.Predictor.Triton.PredictorExtensionSpec.Container.Env { + a := &in.Spec.Predictor.Triton.PredictorExtensionSpec.Container.Env[i] + if a.ValueFrom != nil { + if a.ValueFrom.FileKeyRef != nil { + if a.ValueFrom.FileKeyRef.Optional == nil { + var ptrVar1 bool = false + a.ValueFrom.FileKeyRef.Optional = &ptrVar1 + } + } + } + } if in.Spec.Predictor.Triton.PredictorExtensionSpec.Container.LivenessProbe != nil { if in.Spec.Predictor.Triton.PredictorExtensionSpec.Container.LivenessProbe.ProbeHandler.GRPC != nil { if in.Spec.Predictor.Triton.PredictorExtensionSpec.Container.LivenessProbe.ProbeHandler.GRPC.Service == nil { @@ -203,6 +258,17 @@ func SetObjectDefaults_InferenceService(in *InferenceService) { a.Protocol = "TCP" } } + for i := range in.Spec.Predictor.ONNX.PredictorExtensionSpec.Container.Env { + a := &in.Spec.Predictor.ONNX.PredictorExtensionSpec.Container.Env[i] + if a.ValueFrom != nil { + if a.ValueFrom.FileKeyRef != nil { + if a.ValueFrom.FileKeyRef.Optional == nil { + var ptrVar1 bool = false + a.ValueFrom.FileKeyRef.Optional = &ptrVar1 + } + } + } + } if in.Spec.Predictor.ONNX.PredictorExtensionSpec.Container.LivenessProbe != nil { if in.Spec.Predictor.ONNX.PredictorExtensionSpec.Container.LivenessProbe.ProbeHandler.GRPC != nil { if in.Spec.Predictor.ONNX.PredictorExtensionSpec.Container.LivenessProbe.ProbeHandler.GRPC.Service == nil { @@ -235,6 +301,17 @@ func SetObjectDefaults_InferenceService(in *InferenceService) { a.Protocol = "TCP" } } + for i := range in.Spec.Predictor.HuggingFace.PredictorExtensionSpec.Container.Env { + a := &in.Spec.Predictor.HuggingFace.PredictorExtensionSpec.Container.Env[i] + if a.ValueFrom != nil { + if a.ValueFrom.FileKeyRef != nil { + if a.ValueFrom.FileKeyRef.Optional == nil { + var ptrVar1 bool = false + a.ValueFrom.FileKeyRef.Optional = &ptrVar1 + } + } + } + } if in.Spec.Predictor.HuggingFace.PredictorExtensionSpec.Container.LivenessProbe != nil { if in.Spec.Predictor.HuggingFace.PredictorExtensionSpec.Container.LivenessProbe.ProbeHandler.GRPC != nil { if in.Spec.Predictor.HuggingFace.PredictorExtensionSpec.Container.LivenessProbe.ProbeHandler.GRPC.Service == nil { @@ -267,6 +344,17 @@ func SetObjectDefaults_InferenceService(in *InferenceService) { a.Protocol = "TCP" } } + for i := range in.Spec.Predictor.PMML.PredictorExtensionSpec.Container.Env { + a := &in.Spec.Predictor.PMML.PredictorExtensionSpec.Container.Env[i] + if a.ValueFrom != nil { + if a.ValueFrom.FileKeyRef != nil { + if a.ValueFrom.FileKeyRef.Optional == nil { + var ptrVar1 bool = false + a.ValueFrom.FileKeyRef.Optional = &ptrVar1 + } + } + } + } if in.Spec.Predictor.PMML.PredictorExtensionSpec.Container.LivenessProbe != nil { if in.Spec.Predictor.PMML.PredictorExtensionSpec.Container.LivenessProbe.ProbeHandler.GRPC != nil { if in.Spec.Predictor.PMML.PredictorExtensionSpec.Container.LivenessProbe.ProbeHandler.GRPC.Service == nil { @@ -299,6 +387,17 @@ func SetObjectDefaults_InferenceService(in *InferenceService) { a.Protocol = "TCP" } } + for i := range in.Spec.Predictor.LightGBM.PredictorExtensionSpec.Container.Env { + a := &in.Spec.Predictor.LightGBM.PredictorExtensionSpec.Container.Env[i] + if a.ValueFrom != nil { + if a.ValueFrom.FileKeyRef != nil { + if a.ValueFrom.FileKeyRef.Optional == nil { + var ptrVar1 bool = false + a.ValueFrom.FileKeyRef.Optional = &ptrVar1 + } + } + } + } if in.Spec.Predictor.LightGBM.PredictorExtensionSpec.Container.LivenessProbe != nil { if in.Spec.Predictor.LightGBM.PredictorExtensionSpec.Container.LivenessProbe.ProbeHandler.GRPC != nil { if in.Spec.Predictor.LightGBM.PredictorExtensionSpec.Container.LivenessProbe.ProbeHandler.GRPC.Service == nil { @@ -331,6 +430,17 @@ func SetObjectDefaults_InferenceService(in *InferenceService) { a.Protocol = "TCP" } } + for i := range in.Spec.Predictor.Paddle.PredictorExtensionSpec.Container.Env { + a := &in.Spec.Predictor.Paddle.PredictorExtensionSpec.Container.Env[i] + if a.ValueFrom != nil { + if a.ValueFrom.FileKeyRef != nil { + if a.ValueFrom.FileKeyRef.Optional == nil { + var ptrVar1 bool = false + a.ValueFrom.FileKeyRef.Optional = &ptrVar1 + } + } + } + } if in.Spec.Predictor.Paddle.PredictorExtensionSpec.Container.LivenessProbe != nil { if in.Spec.Predictor.Paddle.PredictorExtensionSpec.Container.LivenessProbe.ProbeHandler.GRPC != nil { if in.Spec.Predictor.Paddle.PredictorExtensionSpec.Container.LivenessProbe.ProbeHandler.GRPC.Service == nil { @@ -363,6 +473,17 @@ func SetObjectDefaults_InferenceService(in *InferenceService) { a.Protocol = "TCP" } } + for i := range in.Spec.Predictor.Model.PredictorExtensionSpec.Container.Env { + a := &in.Spec.Predictor.Model.PredictorExtensionSpec.Container.Env[i] + if a.ValueFrom != nil { + if a.ValueFrom.FileKeyRef != nil { + if a.ValueFrom.FileKeyRef.Optional == nil { + var ptrVar1 bool = false + a.ValueFrom.FileKeyRef.Optional = &ptrVar1 + } + } + } + } if in.Spec.Predictor.Model.PredictorExtensionSpec.Container.LivenessProbe != nil { if in.Spec.Predictor.Model.PredictorExtensionSpec.Container.LivenessProbe.ProbeHandler.GRPC != nil { if in.Spec.Predictor.Model.PredictorExtensionSpec.Container.LivenessProbe.ProbeHandler.GRPC.Service == nil { @@ -442,6 +563,17 @@ func SetObjectDefaults_InferenceService(in *InferenceService) { b.Protocol = "TCP" } } + for j := range a.Env { + b := &a.Env[j] + if b.ValueFrom != nil { + if b.ValueFrom.FileKeyRef != nil { + if b.ValueFrom.FileKeyRef.Optional == nil { + var ptrVar1 bool = false + b.ValueFrom.FileKeyRef.Optional = &ptrVar1 + } + } + } + } if a.LivenessProbe != nil { if a.LivenessProbe.ProbeHandler.GRPC != nil { if a.LivenessProbe.ProbeHandler.GRPC.Service == nil { @@ -475,6 +607,17 @@ func SetObjectDefaults_InferenceService(in *InferenceService) { b.Protocol = "TCP" } } + for j := range a.Env { + b := &a.Env[j] + if b.ValueFrom != nil { + if b.ValueFrom.FileKeyRef != nil { + if b.ValueFrom.FileKeyRef.Optional == nil { + var ptrVar1 bool = false + b.ValueFrom.FileKeyRef.Optional = &ptrVar1 + } + } + } + } if a.LivenessProbe != nil { if a.LivenessProbe.ProbeHandler.GRPC != nil { if a.LivenessProbe.ProbeHandler.GRPC.Service == nil { @@ -508,6 +651,17 @@ func SetObjectDefaults_InferenceService(in *InferenceService) { b.Protocol = "TCP" } } + for j := range a.EphemeralContainerCommon.Env { + b := &a.EphemeralContainerCommon.Env[j] + if b.ValueFrom != nil { + if b.ValueFrom.FileKeyRef != nil { + if b.ValueFrom.FileKeyRef.Optional == nil { + var ptrVar1 bool = false + b.ValueFrom.FileKeyRef.Optional = &ptrVar1 + } + } + } + } if a.EphemeralContainerCommon.LivenessProbe != nil { if a.EphemeralContainerCommon.LivenessProbe.ProbeHandler.GRPC != nil { if a.EphemeralContainerCommon.LivenessProbe.ProbeHandler.GRPC.Service == nil { @@ -587,6 +741,17 @@ func SetObjectDefaults_InferenceService(in *InferenceService) { b.Protocol = "TCP" } } + for j := range a.Env { + b := &a.Env[j] + if b.ValueFrom != nil { + if b.ValueFrom.FileKeyRef != nil { + if b.ValueFrom.FileKeyRef.Optional == nil { + var ptrVar1 bool = false + b.ValueFrom.FileKeyRef.Optional = &ptrVar1 + } + } + } + } if a.LivenessProbe != nil { if a.LivenessProbe.ProbeHandler.GRPC != nil { if a.LivenessProbe.ProbeHandler.GRPC.Service == nil { @@ -620,6 +785,17 @@ func SetObjectDefaults_InferenceService(in *InferenceService) { b.Protocol = "TCP" } } + for j := range a.Env { + b := &a.Env[j] + if b.ValueFrom != nil { + if b.ValueFrom.FileKeyRef != nil { + if b.ValueFrom.FileKeyRef.Optional == nil { + var ptrVar1 bool = false + b.ValueFrom.FileKeyRef.Optional = &ptrVar1 + } + } + } + } if a.LivenessProbe != nil { if a.LivenessProbe.ProbeHandler.GRPC != nil { if a.LivenessProbe.ProbeHandler.GRPC.Service == nil { @@ -653,6 +829,17 @@ func SetObjectDefaults_InferenceService(in *InferenceService) { b.Protocol = "TCP" } } + for j := range a.EphemeralContainerCommon.Env { + b := &a.EphemeralContainerCommon.Env[j] + if b.ValueFrom != nil { + if b.ValueFrom.FileKeyRef != nil { + if b.ValueFrom.FileKeyRef.Optional == nil { + var ptrVar1 bool = false + b.ValueFrom.FileKeyRef.Optional = &ptrVar1 + } + } + } + } if a.EphemeralContainerCommon.LivenessProbe != nil { if a.EphemeralContainerCommon.LivenessProbe.ProbeHandler.GRPC != nil { if a.EphemeralContainerCommon.LivenessProbe.ProbeHandler.GRPC.Service == nil { @@ -686,6 +873,17 @@ func SetObjectDefaults_InferenceService(in *InferenceService) { a.Protocol = "TCP" } } + for i := range in.Spec.Explainer.ART.ExplainerExtensionSpec.Container.Env { + a := &in.Spec.Explainer.ART.ExplainerExtensionSpec.Container.Env[i] + if a.ValueFrom != nil { + if a.ValueFrom.FileKeyRef != nil { + if a.ValueFrom.FileKeyRef.Optional == nil { + var ptrVar1 bool = false + a.ValueFrom.FileKeyRef.Optional = &ptrVar1 + } + } + } + } if in.Spec.Explainer.ART.ExplainerExtensionSpec.Container.LivenessProbe != nil { if in.Spec.Explainer.ART.ExplainerExtensionSpec.Container.LivenessProbe.ProbeHandler.GRPC != nil { if in.Spec.Explainer.ART.ExplainerExtensionSpec.Container.LivenessProbe.ProbeHandler.GRPC.Service == nil { @@ -764,6 +962,17 @@ func SetObjectDefaults_InferenceService(in *InferenceService) { b.Protocol = "TCP" } } + for j := range a.Env { + b := &a.Env[j] + if b.ValueFrom != nil { + if b.ValueFrom.FileKeyRef != nil { + if b.ValueFrom.FileKeyRef.Optional == nil { + var ptrVar1 bool = false + b.ValueFrom.FileKeyRef.Optional = &ptrVar1 + } + } + } + } if a.LivenessProbe != nil { if a.LivenessProbe.ProbeHandler.GRPC != nil { if a.LivenessProbe.ProbeHandler.GRPC.Service == nil { @@ -797,6 +1006,17 @@ func SetObjectDefaults_InferenceService(in *InferenceService) { b.Protocol = "TCP" } } + for j := range a.Env { + b := &a.Env[j] + if b.ValueFrom != nil { + if b.ValueFrom.FileKeyRef != nil { + if b.ValueFrom.FileKeyRef.Optional == nil { + var ptrVar1 bool = false + b.ValueFrom.FileKeyRef.Optional = &ptrVar1 + } + } + } + } if a.LivenessProbe != nil { if a.LivenessProbe.ProbeHandler.GRPC != nil { if a.LivenessProbe.ProbeHandler.GRPC.Service == nil { @@ -830,6 +1050,17 @@ func SetObjectDefaults_InferenceService(in *InferenceService) { b.Protocol = "TCP" } } + for j := range a.EphemeralContainerCommon.Env { + b := &a.EphemeralContainerCommon.Env[j] + if b.ValueFrom != nil { + if b.ValueFrom.FileKeyRef != nil { + if b.ValueFrom.FileKeyRef.Optional == nil { + var ptrVar1 bool = false + b.ValueFrom.FileKeyRef.Optional = &ptrVar1 + } + } + } + } if a.EphemeralContainerCommon.LivenessProbe != nil { if a.EphemeralContainerCommon.LivenessProbe.ProbeHandler.GRPC != nil { if a.EphemeralContainerCommon.LivenessProbe.ProbeHandler.GRPC.Service == nil { @@ -910,6 +1141,17 @@ func SetObjectDefaults_InferenceService(in *InferenceService) { b.Protocol = "TCP" } } + for j := range a.Env { + b := &a.Env[j] + if b.ValueFrom != nil { + if b.ValueFrom.FileKeyRef != nil { + if b.ValueFrom.FileKeyRef.Optional == nil { + var ptrVar1 bool = false + b.ValueFrom.FileKeyRef.Optional = &ptrVar1 + } + } + } + } if a.LivenessProbe != nil { if a.LivenessProbe.ProbeHandler.GRPC != nil { if a.LivenessProbe.ProbeHandler.GRPC.Service == nil { @@ -943,6 +1185,17 @@ func SetObjectDefaults_InferenceService(in *InferenceService) { b.Protocol = "TCP" } } + for j := range a.Env { + b := &a.Env[j] + if b.ValueFrom != nil { + if b.ValueFrom.FileKeyRef != nil { + if b.ValueFrom.FileKeyRef.Optional == nil { + var ptrVar1 bool = false + b.ValueFrom.FileKeyRef.Optional = &ptrVar1 + } + } + } + } if a.LivenessProbe != nil { if a.LivenessProbe.ProbeHandler.GRPC != nil { if a.LivenessProbe.ProbeHandler.GRPC.Service == nil { @@ -976,6 +1229,17 @@ func SetObjectDefaults_InferenceService(in *InferenceService) { b.Protocol = "TCP" } } + for j := range a.EphemeralContainerCommon.Env { + b := &a.EphemeralContainerCommon.Env[j] + if b.ValueFrom != nil { + if b.ValueFrom.FileKeyRef != nil { + if b.ValueFrom.FileKeyRef.Optional == nil { + var ptrVar1 bool = false + b.ValueFrom.FileKeyRef.Optional = &ptrVar1 + } + } + } + } if a.EphemeralContainerCommon.LivenessProbe != nil { if a.EphemeralContainerCommon.LivenessProbe.ProbeHandler.GRPC != nil { if a.EphemeralContainerCommon.LivenessProbe.ProbeHandler.GRPC.Service == nil { diff --git a/pkg/controller/llmisvc/config_merge.go b/pkg/controller/llmisvc/config_merge.go index f48829fb622..492b6a5884c 100644 --- a/pkg/controller/llmisvc/config_merge.go +++ b/pkg/controller/llmisvc/config_merge.go @@ -31,7 +31,7 @@ import ( "knative.dev/pkg/kmeta" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/log" - igwapi "sigs.k8s.io/gateway-api-inference-extension/api/v1alpha2" + igwv1 "sigs.k8s.io/gateway-api-inference-extension/api/v1" gatewayapi "sigs.k8s.io/gateway-api/apis/v1" "github.com/kserve/kserve/pkg/apis/serving/v1alpha1" @@ -173,15 +173,19 @@ func (r *LLMInferenceServiceReconciler) combineBaseRefsConfig(ctx context.Contex if llmSvcCfg.Spec.Router != nil && llmSvcCfg.Spec.Router.Scheduler != nil && llmSvcCfg.Spec.Router.Scheduler.Pool != nil && - llmSvcCfg.Spec.Router.Scheduler.Pool.Spec != nil && - len(llmSvcCfg.Spec.Router.Scheduler.Pool.Spec.Selector) == 0 { - selector := GetWorkloadLabelSelector(llmSvc.ObjectMeta, &llmSvcCfg.Spec) + llmSvcCfg.Spec.Router.Scheduler.Pool.Spec != nil { + // Ensure MatchLabels map is initialized + if llmSvcCfg.Spec.Router.Scheduler.Pool.Spec.Selector.MatchLabels == nil { + llmSvcCfg.Spec.Router.Scheduler.Pool.Spec.Selector.MatchLabels = make(map[string]string) + } - gieSelector := make(map[igwapi.LabelKey]igwapi.LabelValue, len(selector)) - for k, v := range selector { - gieSelector[igwapi.LabelKey(k)] = igwapi.LabelValue(v) + // Merge in the controller's workload labels (plain strings). + // GetWorkloadLabelSelector returns map[string]string. + if extra := GetWorkloadLabelSelector(llmSvc.ObjectMeta, &llmSvcCfg.Spec); len(extra) > 0 { + for k, v := range extra { + llmSvcCfg.Spec.Router.Scheduler.Pool.Spec.Selector.MatchLabels[k] = v + } } - llmSvcCfg.Spec.Router.Scheduler.Pool.Spec.Selector = gieSelector } if llmSvcCfg.Spec.Router != nil && @@ -196,20 +200,49 @@ func (r *LLMInferenceServiceReconciler) combineBaseRefsConfig(ctx context.Contex return llmSvcCfg, err } + // Trim HTTPRoute to only keep the first rule (completions endpoint with dual backend refs) + // This is part of the GIE v1 migration - we only need the first rule for both scheduler and no-scheduler cases + if llmSvcCfg.Spec.Router != nil && + llmSvcCfg.Spec.Router.Route != nil && + llmSvcCfg.Spec.Router.Route.HTTP.HasSpec() && + len(llmSvcCfg.Spec.Router.Route.HTTP.Spec.Rules) > 1 { + logger := log.FromContext(ctx) + logger.Info("Trimming HTTPRoute to first rule for GIE v1 migration", + "llmSvc", llmSvc.Name, + "originalNumRules", len(llmSvcCfg.Spec.Router.Route.HTTP.Spec.Rules)) + llmSvcCfg.Spec.Router.Route.HTTP.Spec.Rules = llmSvcCfg.Spec.Router.Route.HTTP.Spec.Rules[:1] + logger.Info("After trimming rules", "numRules", len(llmSvcCfg.Spec.Router.Route.HTTP.Spec.Rules)) + } + // Point HTTPRoute to a Service if there is no Scheduler or InferencePool, and the HTTPRoute uses the default // InferencePool (to handle cases where the HTTPRoute Spec uses a custom BackendRef). if llmSvcCfg.Spec.Router != nil && llmSvcCfg.Spec.Router.Route != nil && llmSvcCfg.Spec.Router.Route.HTTP.HasSpec() && llmSvcCfg.Spec.Router.Scheduler == nil { + logger := log.FromContext(ctx) + logger.Info("No-scheduler case: replacing v1 InferencePool backend refs with Service", + "llmSvc", llmSvc.Name, + "numRules", len(llmSvcCfg.Spec.Router.Route.HTTP.Spec.Rules)) for i := range llmSvcCfg.Spec.Router.Route.HTTP.Spec.Rules { + logger.Info("Processing rule", "ruleIndex", i, "numBackendRefs", len(llmSvcCfg.Spec.Router.Route.HTTP.Spec.Rules[i].BackendRefs)) for j := range llmSvcCfg.Spec.Router.Route.HTTP.Spec.Rules[i].BackendRefs { - if isDefaultBackendRef(llmSvc, llmSvcCfg.Spec.Router.Route.HTTP.Spec.Rules[i].BackendRefs[j].BackendRef) { + ref := &llmSvcCfg.Spec.Router.Route.HTTP.Spec.Rules[i].BackendRefs[j].BackendRef + logger.Info("Checking backend ref", + "ruleIndex", i, + "backendRefIndex", j, + "group", ptr.Deref(ref.Group, ""), + "kind", ptr.Deref(ref.Kind, ""), + "name", string(ref.Name), + "weight", ptr.Deref(ref.Weight, 0)) + if isDefaultBackendRef(llmSvc, *ref) { + logger.Info("Replacing v1 InferencePool with Service", "ruleIndex", i, "backendRefIndex", j) llmSvcCfg.Spec.Router.Route.HTTP.Spec.Rules[i].BackendRefs[j].Group = ptr.To[gatewayapi.Group]("") llmSvcCfg.Spec.Router.Route.HTTP.Spec.Rules[i].BackendRefs[j].Kind = ptr.To[gatewayapi.Kind]("Service") llmSvcCfg.Spec.Router.Route.HTTP.Spec.Rules[i].BackendRefs[j].Name = gatewayapi.ObjectName(kmeta.ChildName(llmSvc.GetName(), "-kserve-workload-svc")) } } + logger.Info("After processing rule", "ruleIndex", i, "numBackendRefs", len(llmSvcCfg.Spec.Router.Route.HTTP.Spec.Rules[i].BackendRefs)) } } @@ -349,7 +382,10 @@ func mergeSpecs(ctx context.Context, base, override v1alpha1.LLMInferenceService func isDefaultBackendRef(llmSvc *v1alpha1.LLMInferenceService, ref gatewayapi.BackendRef) bool { defaultInfPoolName := (&v1alpha1.SchedulerSpec{}).InferencePoolName(llmSvc) - return ptr.Deref[gatewayapi.Group](ref.Group, "") == igwapi.GroupName && - ptr.Deref[gatewayapi.Kind](ref.Kind, "") == "InferencePool" && + group := ptr.Deref(ref.Group, "") + // Only replace v1 InferencePool backend refs with Service for no-scheduler case + // v1alpha2 backend refs are kept as fallback with weight 0 + return group == igwv1.GroupName && + ptr.Deref(ref.Kind, "") == "InferencePool" && string(ref.Name) == defaultInfPoolName } diff --git a/pkg/controller/llmisvc/config_merge_test.go b/pkg/controller/llmisvc/config_merge_test.go index 1b4f1e86605..73b8537730f 100644 --- a/pkg/controller/llmisvc/config_merge_test.go +++ b/pkg/controller/llmisvc/config_merge_test.go @@ -20,7 +20,6 @@ import ( "testing" . "github.com/onsi/gomega" - "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/yaml" ktesting "github.com/kserve/kserve/pkg/testing" @@ -33,11 +32,9 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/utils/ptr" "knative.dev/pkg/apis" - igwapi "sigs.k8s.io/gateway-api-inference-extension/api/v1alpha2" gatewayapi "sigs.k8s.io/gateway-api/apis/v1" "github.com/kserve/kserve/pkg/apis/serving/v1alpha1" - pkgtest "github.com/kserve/kserve/pkg/testing" ) func TestMergeSpecs(t *testing.T) { @@ -87,8 +84,12 @@ func TestMergeSpecs(t *testing.T) { Router: &v1alpha1.RouterSpec{ Scheduler: &v1alpha1.SchedulerSpec{ Pool: &v1alpha1.InferencePoolSpec{ - Spec: &igwapi.InferencePoolSpec{ - TargetPortNumber: 9999, + Spec: &v1alpha1.KServeInferencePoolSpec{ + TargetPorts: []v1alpha1.KServePort{ + {Number: 9999}, + }, + Selector: v1alpha1.KServeLabelSelector{MatchLabels: map[string]string{}}, + EndpointPickerRef: v1alpha1.KServeEndpointPickerRef{Name: ""}, }, }, }, @@ -102,8 +103,12 @@ func TestMergeSpecs(t *testing.T) { Gateway: &v1alpha1.GatewaySpec{}, Scheduler: &v1alpha1.SchedulerSpec{ Pool: &v1alpha1.InferencePoolSpec{ - Spec: &igwapi.InferencePoolSpec{ - TargetPortNumber: 9999, + Spec: &v1alpha1.KServeInferencePoolSpec{ + TargetPorts: []v1alpha1.KServePort{ + {Number: 9999}, + }, + Selector: v1alpha1.KServeLabelSelector{MatchLabels: map[string]string{}}, + EndpointPickerRef: v1alpha1.KServeEndpointPickerRef{Name: ""}, }, }, }, @@ -449,15 +454,12 @@ func TestMergeSpecs(t *testing.T) { Router: &v1alpha1.RouterSpec{ Scheduler: &v1alpha1.SchedulerSpec{ Pool: &v1alpha1.InferencePoolSpec{ - Spec: &igwapi.InferencePoolSpec{ - TargetPortNumber: 0, - EndpointPickerConfig: igwapi.EndpointPickerConfig{ - ExtensionRef: &igwapi.Extension{ - ExtensionConnection: igwapi.ExtensionConnection{ - FailureMode: ptr.To(igwapi.FailClose), - }, - }, + Spec: &v1alpha1.KServeInferencePoolSpec{ + TargetPorts: []v1alpha1.KServePort{ + {Number: 0}, }, + Selector: v1alpha1.KServeLabelSelector{MatchLabels: map[string]string{}}, + EndpointPickerRef: v1alpha1.KServeEndpointPickerRef{Name: ""}, }, }, Template: &corev1.PodSpec{ @@ -498,15 +500,12 @@ func TestMergeSpecs(t *testing.T) { Gateway: &v1alpha1.GatewaySpec{}, Scheduler: &v1alpha1.SchedulerSpec{ Pool: &v1alpha1.InferencePoolSpec{ - Spec: &igwapi.InferencePoolSpec{ - TargetPortNumber: 0, - EndpointPickerConfig: igwapi.EndpointPickerConfig{ - ExtensionRef: &igwapi.Extension{ - ExtensionConnection: igwapi.ExtensionConnection{ - FailureMode: ptr.To(igwapi.FailClose), - }, - }, + Spec: &v1alpha1.KServeInferencePoolSpec{ + TargetPorts: []v1alpha1.KServePort{ + {Number: 0}, }, + Selector: v1alpha1.KServeLabelSelector{MatchLabels: map[string]string{}}, + EndpointPickerRef: v1alpha1.KServeEndpointPickerRef{Name: ""}, }, }, Template: &corev1.PodSpec{ @@ -827,19 +826,19 @@ func TestMergeSpecs(t *testing.T) { { Model: v1alpha1.LLMModelSpec{ URI: apis.URL{Path: "model-uri"}, - Criticality: ptr.To(igwapi.Sheddable), + Criticality: ptr.To(v1alpha1.Sheddable), }, }, { Model: v1alpha1.LLMModelSpec{ - Criticality: ptr.To(igwapi.Critical), + Criticality: ptr.To(v1alpha1.Critical), }, }, }, want: v1alpha1.LLMInferenceServiceSpec{ Model: v1alpha1.LLMModelSpec{ URI: apis.URL{Path: "model-uri"}, - Criticality: ptr.To(igwapi.Critical), + Criticality: ptr.To(v1alpha1.Critical), }, }, }, @@ -954,7 +953,7 @@ func TestMergeSpecs(t *testing.T) { Model: v1alpha1.LLMModelSpec{ URI: apis.URL{Path: "base-model"}, Name: ptr.To("base-name"), - Criticality: ptr.To(igwapi.Sheddable), + Criticality: ptr.To(v1alpha1.Sheddable), LoRA: &v1alpha1.LoRASpec{ Adapters: []v1alpha1.LLMModelSpec{ {URI: apis.URL{Path: "lora-model"}}, @@ -976,7 +975,7 @@ func TestMergeSpecs(t *testing.T) { { Model: v1alpha1.LLMModelSpec{ Name: ptr.To("override-name"), - Criticality: ptr.To(igwapi.Critical), + Criticality: ptr.To(v1alpha1.Critical), LoRA: &v1alpha1.LoRASpec{ Adapters: []v1alpha1.LLMModelSpec{ {URI: apis.URL{Path: "lora-model2"}}, @@ -1002,7 +1001,7 @@ func TestMergeSpecs(t *testing.T) { Model: v1alpha1.LLMModelSpec{ URI: apis.URL{Path: "base-model"}, // Base URI preserved Name: ptr.To("override-name"), // Override name - Criticality: ptr.To(igwapi.Critical), + Criticality: ptr.To(v1alpha1.Critical), LoRA: &v1alpha1.LoRASpec{ Adapters: []v1alpha1.LLMModelSpec{ {URI: apis.URL{Path: "lora-model2"}}, @@ -1313,8 +1312,6 @@ func TestMergeSpecs(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { ctx := t.Context() - ctx = log.IntoContext(ctx, pkgtest.NewTestLogger(t)) - got, err := llmisvc.MergeSpecs(ctx, tt.cfgs...) if (err != nil) != tt.wantErr { t.Errorf("MergeSpecs() error = %v, wantErr %v", err, tt.wantErr) @@ -1790,3 +1787,88 @@ spec: }) } } + +// TestODHModelControllerCompatibility verifies that LLMInferenceServiceConfig with KServe-native +// InferencePool types can be serialized to JSON and deserialized back without errors. +// This tests compatibility with ODH Model Controller which may use an older kserve library. +func TestODHModelControllerCompatibility(t *testing.T) { + g := NewWithT(t) + + // Create a config with KServe types (what gets stored in CRD) + original := &v1alpha1.LLMInferenceServiceConfig{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-config", + Namespace: "default", + }, + Spec: v1alpha1.LLMInferenceServiceSpec{ + Router: &v1alpha1.RouterSpec{ + Scheduler: &v1alpha1.SchedulerSpec{ + Pool: &v1alpha1.InferencePoolSpec{ + Spec: &v1alpha1.KServeInferencePoolSpec{ + Selector: v1alpha1.KServeLabelSelector{ + MatchLabels: map[string]string{ + "app": "my-model", + "serving.kserve.io/llminferenceservice": "test-llm", + "serving.kserve.io/llminferenceservice-uid": "test-uid", + }, + }, + TargetPorts: []v1alpha1.KServePort{ + {Number: 8000}, + }, + EndpointPickerRef: v1alpha1.KServeEndpointPickerRef{ + Name: "test-epp", + Kind: ptr.To("Service"), + Group: ptr.To(""), + Port: &v1alpha1.KServePort{Number: 9000}, + }, + }, + }, + }, + }, + }, + } + + // Simulate what happens in Kubernetes: + // 1. Controller creates the config object + // 2. K8s API server serializes to JSON and stores in etcd + jsonBytes, err := yaml.Marshal(original) + g.Expect(err).NotTo(HaveOccurred(), "Failed to serialize to JSON") + + t.Logf("Serialized YAML (simulating etcd storage):\n%s", string(jsonBytes)) + + // 3. ODH Model Controller (with potentially old kserve lib) reads from API + // 4. It deserializes the JSON back to Go struct + var deserialized v1alpha1.LLMInferenceServiceConfig + err = yaml.Unmarshal(jsonBytes, &deserialized) + g.Expect(err).NotTo(HaveOccurred(), "ODH MC should be able to deserialize - this was the bug we fixed!") + + // Verify the data is intact after round-trip serialization + g.Expect(deserialized.Name).To(Equal("test-config")) + g.Expect(deserialized.Namespace).To(Equal("default")) + g.Expect(deserialized.Spec.Router).NotTo(BeNil()) + g.Expect(deserialized.Spec.Router.Scheduler).NotTo(BeNil()) + g.Expect(deserialized.Spec.Router.Scheduler.Pool).NotTo(BeNil()) + g.Expect(deserialized.Spec.Router.Scheduler.Pool.Spec).NotTo(BeNil()) + + // Verify selector uses plain strings (not typed LabelKey/LabelValue) + selector := deserialized.Spec.Router.Scheduler.Pool.Spec.Selector.MatchLabels + g.Expect(selector).To(HaveKeyWithValue("app", "my-model")) + g.Expect(selector).To(HaveKeyWithValue("serving.kserve.io/llminferenceservice", "test-llm")) + g.Expect(selector).To(HaveKeyWithValue("serving.kserve.io/llminferenceservice-uid", "test-uid")) + g.Expect(selector).To(HaveLen(3)) + + // Verify ports are correct + g.Expect(deserialized.Spec.Router.Scheduler.Pool.Spec.TargetPorts).To(HaveLen(1)) + g.Expect(deserialized.Spec.Router.Scheduler.Pool.Spec.TargetPorts[0].Number).To(Equal(int32(8000))) + + // Verify endpoint picker ref + eppRef := deserialized.Spec.Router.Scheduler.Pool.Spec.EndpointPickerRef + g.Expect(eppRef.Name).To(Equal("test-epp")) + g.Expect(eppRef.Kind).NotTo(BeNil()) + g.Expect(*eppRef.Kind).To(Equal("Service")) + g.Expect(eppRef.Port).NotTo(BeNil()) + g.Expect(eppRef.Port.Number).To(Equal(int32(9000))) + + t.Logf("✅ JSON serialization/deserialization round-trip successful!") + t.Logf("✅ ODH Model Controller compatibility verified!") +} diff --git a/pkg/controller/llmisvc/controller.go b/pkg/controller/llmisvc/controller.go index 48ee60a8a4c..183281e6063 100644 --- a/pkg/controller/llmisvc/controller.go +++ b/pkg/controller/llmisvc/controller.go @@ -23,6 +23,7 @@ import ( monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/client-go/dynamic" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/controller" @@ -53,7 +54,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/predicate" "sigs.k8s.io/controller-runtime/pkg/reconcile" - igwapi "sigs.k8s.io/gateway-api-inference-extension/api/v1alpha2" + igwv1 "sigs.k8s.io/gateway-api-inference-extension/api/v1" gatewayapi "sigs.k8s.io/gateway-api/apis/v1" "github.com/kserve/kserve/pkg/utils" @@ -73,7 +74,8 @@ type LLMInferenceServiceReconciler struct { client.Client Config *rest.Config record.EventRecorder - Clientset kubernetes.Interface + Clientset kubernetes.Interface + DynamicClient dynamic.Interface } //+kubebuilder:rbac:groups=serving.kserve.io,resources=llminferenceservices,verbs=get;list;watch;create;update;patch;delete @@ -88,7 +90,7 @@ type LLMInferenceServiceReconciler struct { //+kubebuilder:rbac:groups=networking.k8s.io,resources=ingresses,verbs=get;list;watch;create;update;patch;delete //+kubebuilder:rbac:groups=gateway.networking.k8s.io,resources=httproutes;gateways;gatewayclasses,verbs=get;list;watch;create;update;patch;delete //+kubebuilder:rbac:groups=inference.networking.x-k8s.io,resources=inferencepools;inferencemodels;inferenceobjectives,verbs=get;list;watch;create;update;patch;delete -//+kubebuilder:rbac:groups=inference.networking.k8s.io,resources=inferencepools,verbs=get;list;watch;create;update;patch;delete +//+kubebuilder:rbac:groups=inference.networking.k8s.io,resources=inferencepools;inferencemodels;inferenceobjectives,verbs=get;list;watch;create;update;patch;delete //+kubebuilder:rbac:groups=core,resources=pods,verbs=get;list;watch //+kubebuilder:rbac:groups=core,resources=serviceaccounts,verbs=get;list;watch;create;update;patch;delete //+kubebuilder:rbac:groups=rbac.authorization.k8s.io,resources=roles;rolebindings;clusterrolebindings,verbs=get;list;watch;create;update;patch;delete @@ -113,7 +115,15 @@ func (r *LLMInferenceServiceReconciler) Reconcile(ctx context.Context, req ctrl. finalizerName := constants.KServeAPIGroupName + "/llmisvc-finalizer" if original.DeletionTimestamp.IsZero() { if controllerutil.AddFinalizer(original, finalizerName) { - if err := r.Update(ctx, original); err != nil { + // Wrap finalizer addition in retry logic to handle resource version conflicts + if err := retry.RetryOnConflict(retry.DefaultRetry, func() error { + latest := &v1alpha1.LLMInferenceService{} + if err := r.Get(ctx, req.NamespacedName, latest); err != nil { + return err + } + controllerutil.AddFinalizer(latest, finalizerName) + return r.Update(ctx, latest) + }); err != nil { return ctrl.Result{}, err } } @@ -125,8 +135,15 @@ func (r *LLMInferenceServiceReconciler) Reconcile(ctx context.Context, req ctrl. return ctrl.Result{}, cleanupErr } - controllerutil.RemoveFinalizer(original, finalizerName) - if err := r.Update(ctx, original); err != nil { + // Wrap finalizer removal in retry logic to handle resource version conflicts + if err := retry.RetryOnConflict(retry.DefaultRetry, func() error { + latest := &v1alpha1.LLMInferenceService{} + if err := r.Get(ctx, req.NamespacedName, latest); err != nil { + return err + } + controllerutil.RemoveFinalizer(latest, finalizerName) + return r.Update(ctx, latest) + }); err != nil { return ctrl.Result{}, err } } @@ -251,21 +268,42 @@ func (r *LLMInferenceServiceReconciler) SetupWithManager(mgr ctrl.Manager) error b = b.Watches(&gatewayapi.Gateway{}, r.enqueueOnGatewayChange(logger)) } - if err := istioapi.AddToScheme(mgr.GetScheme()); err != nil { - return fmt.Errorf("failed to add Istio APIs to scheme: %w", err) + if err := igwv1.Install(mgr.GetScheme()); err != nil { + return fmt.Errorf("failed to add GIE v1 APIs to scheme: %w", err) } - if ok, err := utils.IsCrdAvailable(mgr.GetConfig(), istioapi.SchemeGroupVersion.String(), "DestinationRule"); ok && err == nil { - b = b.Owns(&istioapi.DestinationRule{}, builder.WithPredicates(childResourcesPredicate)) + if ok, err := utils.IsCrdAvailable(mgr.GetConfig(), igwv1.GroupVersion.String(), "InferencePool"); ok && err == nil { + b = b.Owns(&igwv1.InferencePool{}, builder.WithPredicates(childResourcesPredicate)) + // Also watch for status changes to trigger reconciliation when pool becomes ready (needed for migration) + b = b.Watches(&igwv1.InferencePool{}, r.enqueueOnInferencePoolStatusChange(logger), builder.WithPredicates(childResourcesPredicate)) } - if err := igwapi.Install(mgr.GetScheme()); err != nil { - return fmt.Errorf("failed to add GIE APIs to scheme: %w", err) + // Watch v1alpha2 InferencePool and InferenceModel resources for state changes (using unstructured since there's no typed API) + if ok, err := utils.IsCrdAvailable(mgr.GetConfig(), "inference.networking.x-k8s.io/v1alpha2", "InferencePool"); ok && err == nil { + b = b.Watches( + &metav1.PartialObjectMetadata{TypeMeta: metav1.TypeMeta{ + APIVersion: "inference.networking.x-k8s.io/v1alpha2", + Kind: "InferencePool", + }}, + r.enqueueOnV1Alpha2ResourceChange(logger), + builder.WithPredicates(childResourcesPredicate), + ) } - if ok, err := utils.IsCrdAvailable(mgr.GetConfig(), igwapi.GroupVersion.String(), "InferencePool"); ok && err == nil { - b = b.Owns(&igwapi.InferencePool{}, builder.WithPredicates(childResourcesPredicate)) + if ok, err := utils.IsCrdAvailable(mgr.GetConfig(), "inference.networking.x-k8s.io/v1alpha2", "InferenceModel"); ok && err == nil { + b = b.Watches( + &metav1.PartialObjectMetadata{TypeMeta: metav1.TypeMeta{ + APIVersion: "inference.networking.x-k8s.io/v1alpha2", + Kind: "InferenceModel", + }}, + r.enqueueOnV1Alpha2ResourceChange(logger), + builder.WithPredicates(childResourcesPredicate), + ) } - if ok, err := utils.IsCrdAvailable(mgr.GetConfig(), igwapi.GroupVersion.String(), "InferenceModel"); ok && err == nil { - b = b.Owns(&igwapi.InferenceModel{}, builder.WithPredicates(childResourcesPredicate)) + + if err := istioapi.AddToScheme(mgr.GetScheme()); err != nil { + return fmt.Errorf("failed to add Istio APIs to scheme: %w", err) + } + if ok, err := utils.IsCrdAvailable(mgr.GetConfig(), istioapi.SchemeGroupVersion.String(), "DestinationRule"); ok && err == nil { + b = b.Owns(&istioapi.DestinationRule{}, builder.WithPredicates(childResourcesPredicate)) } if err := lwsapi.AddToScheme(mgr.GetScheme()); err != nil { @@ -449,12 +487,12 @@ func (r *LLMInferenceServiceReconciler) enqueueOnIstioShadowServiceChange(mgr ct return nil } - if ok, err := utils.IsCrdAvailable(mgr.GetConfig(), igwapi.GroupVersion.String(), "InferencePool"); err != nil || !ok { + if ok, err := utils.IsCrdAvailable(mgr.GetConfig(), igwv1.GroupVersion.String(), "InferencePool"); err != nil || !ok { logger.V(2).Error(err, "failed to get InferencePool", "name", poolName, "namespace", sub.GetNamespace()) return nil } - pool := &igwapi.InferencePool{} + pool := &igwv1.InferencePool{} err := r.Get(ctx, client.ObjectKey{Name: poolName, Namespace: sub.GetNamespace()}, pool) if err != nil { if !apierrors.IsNotFound(err) { @@ -485,3 +523,82 @@ func (r *LLMInferenceServiceReconciler) enqueueOnIstioShadowServiceChange(mgr ct }}} }) } + +// enqueueOnV1Alpha2ResourceChange watches for changes in v1alpha2 InferencePool and InferenceModel resources. +func (r *LLMInferenceServiceReconciler) enqueueOnV1Alpha2ResourceChange(logger logr.Logger) handler.EventHandler { + logger = logger.WithName("enqueueOnV1Alpha2ResourceChange") + return handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, object client.Object) []reconcile.Request { + // Get the owner reference from the v1alpha2 resource + controller := metav1.GetControllerOf(object) + if controller == nil { + logger.V(2).Info("v1alpha2 resource has no controller", "resource", object.GetName(), "namespace", object.GetNamespace()) + return nil + } + + // Parse the API version to get group and version + gv, err := schema.ParseGroupVersion(controller.APIVersion) + if err != nil { + logger.V(2).Error(err, "failed to parse GroupVersion", "apiVersion", controller.APIVersion) + return nil + } + + // Check if the owner is an LLMInferenceService + if controller.Kind != v1alpha1.LLMInferenceServiceGVK.Kind || gv.Group != v1alpha1.LLMInferenceServiceGVK.Group { + logger.V(2).Info("v1alpha2 resource is not controlled by LLMInferenceService", + "resource", object.GetName(), + "owner.kind", controller.Kind, + "owner.group", gv.Group) + return nil + } + + logger.V(1).Info("Enqueuing LLMInferenceService due to v1alpha2 resource change", + "llmisvc", controller.Name, + "resource", object.GetName(), + "kind", object.GetObjectKind().GroupVersionKind().Kind) + + return []reconcile.Request{{NamespacedName: types.NamespacedName{ + Namespace: object.GetNamespace(), + Name: controller.Name, + }}} + }) +} + +// enqueueOnInferencePoolStatusChange watches for v1 InferencePool status changes. +// This is critical for the migration logic - when v1 pool becomes ready for the first time, +// we need to trigger reconciliation to set the migration annotation and switch traffic. +func (r *LLMInferenceServiceReconciler) enqueueOnInferencePoolStatusChange(logger logr.Logger) handler.EventHandler { + logger = logger.WithName("enqueueOnInferencePoolStatusChange") + return handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, object client.Object) []reconcile.Request { + // Get the owner reference from the v1 InferencePool + controller := metav1.GetControllerOf(object) + if controller == nil { + logger.V(2).Info("v1 InferencePool has no controller", "resource", object.GetName(), "namespace", object.GetNamespace()) + return nil + } + + // Parse the API version to get group and version + gv, err := schema.ParseGroupVersion(controller.APIVersion) + if err != nil { + logger.V(2).Error(err, "failed to parse GroupVersion", "apiVersion", controller.APIVersion) + return nil + } + + // Check if the owner is an LLMInferenceService + if controller.Kind != v1alpha1.LLMInferenceServiceGVK.Kind || gv.Group != v1alpha1.LLMInferenceServiceGVK.Group { + logger.V(2).Info("v1 InferencePool is not controlled by LLMInferenceService", + "resource", object.GetName(), + "owner.kind", controller.Kind, + "owner.group", gv.Group) + return nil + } + + logger.V(1).Info("Enqueuing LLMInferenceService due to v1 InferencePool status change", + "llmisvc", controller.Name, + "resource", object.GetName()) + + return []reconcile.Request{{NamespacedName: types.NamespacedName{ + Namespace: object.GetNamespace(), + Name: controller.Name, + }}} + }) +} diff --git a/pkg/controller/llmisvc/controller_int_multi_node_test.go b/pkg/controller/llmisvc/controller_int_multi_node_test.go index f67a2925d62..3732e2bfcae 100644 --- a/pkg/controller/llmisvc/controller_int_multi_node_test.go +++ b/pkg/controller/llmisvc/controller_int_multi_node_test.go @@ -52,6 +52,7 @@ var _ = Describe("LLMInferenceService Multi-Node Controller", func() { Expect(envTest.Client.Create(ctx, namespace)).To(Succeed()) Expect(envTest.Client.Create(ctx, IstioShadowService(svcName, nsName))).To(Succeed()) + Expect(envTest.Client.Create(ctx, DefaultServiceAccount(nsName))).To(Succeed()) defer func() { envTest.DeleteAll(namespace) }() @@ -117,6 +118,7 @@ var _ = Describe("LLMInferenceService Multi-Node Controller", func() { Expect(envTest.Client.Create(ctx, namespace)).To(Succeed()) Expect(envTest.Client.Create(ctx, IstioShadowService(svcName, nsName))).To(Succeed()) + Expect(envTest.Client.Create(ctx, DefaultServiceAccount(nsName))).To(Succeed()) defer func() { envTest.DeleteAll(namespace) }() @@ -189,6 +191,7 @@ var _ = Describe("LLMInferenceService Multi-Node Controller", func() { Expect(envTest.Client.Create(ctx, namespace)).To(Succeed()) Expect(envTest.Client.Create(ctx, IstioShadowService(svcName, nsName))).To(Succeed()) + Expect(envTest.Client.Create(ctx, DefaultServiceAccount(nsName))).To(Succeed()) defer func() { envTest.DeleteAll(namespace) }() @@ -279,6 +282,7 @@ var _ = Describe("LLMInferenceService Multi-Node Controller", func() { Expect(envTest.Client.Create(ctx, namespace)).To(Succeed()) Expect(envTest.Client.Create(ctx, IstioShadowService(svcName, nsName))).To(Succeed()) + Expect(envTest.Client.Create(ctx, DefaultServiceAccount(nsName))).To(Succeed()) defer func() { envTest.DeleteAll(namespace) }() @@ -348,6 +352,7 @@ var _ = Describe("LLMInferenceService Multi-Node Controller", func() { Expect(envTest.Client.Create(ctx, namespace)).To(Succeed()) Expect(envTest.Client.Create(ctx, IstioShadowService(svcName, nsName))).To(Succeed()) + Expect(envTest.Client.Create(ctx, DefaultServiceAccount(nsName))).To(Succeed()) defer func() { envTest.DeleteAll(namespace) }() @@ -416,6 +421,7 @@ var _ = Describe("LLMInferenceService Multi-Node Controller", func() { Expect(envTest.Client.Create(ctx, namespace)).To(Succeed()) Expect(envTest.Client.Create(ctx, IstioShadowService(svcName, nsName))).To(Succeed()) + Expect(envTest.Client.Create(ctx, DefaultServiceAccount(nsName))).To(Succeed()) defer func() { envTest.DeleteAll(namespace) }() diff --git a/pkg/controller/llmisvc/controller_int_test.go b/pkg/controller/llmisvc/controller_int_test.go index b814f0b25b1..32055ced750 100644 --- a/pkg/controller/llmisvc/controller_int_test.go +++ b/pkg/controller/llmisvc/controller_int_test.go @@ -26,10 +26,12 @@ import ( "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/api/resource" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/client-go/dynamic" "k8s.io/client-go/util/retry" ctrl "sigs.k8s.io/controller-runtime" logf "sigs.k8s.io/controller-runtime/pkg/log" - igwapi "sigs.k8s.io/gateway-api-inference-extension/api/v1alpha2" + igwv1 "sigs.k8s.io/gateway-api-inference-extension/api/v1" gatewayapi "sigs.k8s.io/gateway-api/apis/v1" . "github.com/onsi/ginkgo/v2" @@ -70,6 +72,7 @@ var _ = Describe("LLMInferenceService Controller", func() { Expect(envTest.Client.Create(ctx, namespace)).To(Succeed()) Expect(envTest.Client.Create(ctx, IstioShadowService(svcName, nsName))).To(Succeed()) + Expect(envTest.Client.Create(ctx, DefaultServiceAccount(nsName))).To(Succeed()) defer func() { envTest.DeleteAll(namespace) }() @@ -254,6 +257,7 @@ var _ = Describe("LLMInferenceService Controller", func() { } Expect(envTest.Client.Create(ctx, namespace)).To(Succeed()) Expect(envTest.Client.Create(ctx, IstioShadowService(svcName, nsName))).To(Succeed()) + Expect(envTest.Client.Create(ctx, DefaultServiceAccount(nsName))).To(Succeed()) defer func() { envTest.DeleteAll(namespace) }() @@ -285,19 +289,25 @@ var _ = Describe("LLMInferenceService Controller", func() { Expect(expectedHTTPRoute).To(BeControlledBy(llmSvc)) Expect(expectedHTTPRoute).To(HaveGatewayRefs(gatewayapi.ParentReference{Name: "kserve-ingress-gateway"})) - // llmisvc is created with the default route and scheduler spec which results in two inference pool and one service backend refs - Expect(expectedHTTPRoute).To( - HaveBackendRefs( - BackendRefInferencePool(svcName+"-inference-pool"), - BackendRefInferencePool(svcName+"-inference-pool"), - BackendRefService(svcName+"-kserve-workload-svc"), - ), - ) ensureRouterManagedResourcesAreReady(ctx, envTest.Client, llmSvc) + // Wait for migration to complete - dual InferencePool strategy + // After migration, v1 gets 100% traffic, v1alpha2 gets 0% + Eventually(func(g Gomega, ctx context.Context) error { + routes, errList := managedRoutes(ctx, llmSvc) + g.Expect(errList).ToNot(HaveOccurred()) + g.Expect(routes).To(HaveLen(1)) + g.Expect(routes[0]).To(HaveBackendRefs( + BackendRefInferencePoolV1(svcName+"-inference-pool", 100), + BackendRefInferencePoolV1Alpha2(svcName+"-inference-pool", 1), + )) + g.Expect(routes[0]).To(Not(HaveBackendRefs(BackendRefServiceWithWeight(svcName+"-kserve-workload-svc", 1)))) + return nil + }).WithContext(ctx).Should(Succeed()) + Eventually(func(g Gomega, ctx context.Context) error { - ip := igwapi.InferencePool{} + ip := igwv1.InferencePool{} return envTest.Client.Get(ctx, client.ObjectKey{Name: svcName + "-inference-pool", Namespace: llmSvc.GetNamespace()}, &ip) }).WithContext(ctx).Should(Succeed()) @@ -318,6 +328,7 @@ var _ = Describe("LLMInferenceService Controller", func() { } Expect(envTest.Client.Create(ctx, namespace)).To(Succeed()) Expect(envTest.Client.Create(ctx, IstioShadowService(svcName, nsName))).To(Succeed()) + Expect(envTest.Client.Create(ctx, DefaultServiceAccount(nsName))).To(Succeed()) defer func() { envTest.DeleteAll(namespace) }() @@ -333,7 +344,7 @@ var _ = Describe("LLMInferenceService Controller", func() { ) infPool := InferencePool(infPoolName, - InNamespace[*igwapi.InferencePool](nsName), + InNamespace[*igwv1.InferencePool](nsName), WithSelector("app", "workload"), WithTargetPort(8000), WithExtensionRef("", "Service", kmeta.ChildName(svcName, "-epp-service")), @@ -361,18 +372,24 @@ var _ = Describe("LLMInferenceService Controller", func() { Expect(expectedHTTPRoute).To(BeControlledBy(llmSvc)) Expect(expectedHTTPRoute).To(HaveGatewayRefs(gatewayapi.ParentReference{Name: "kserve-ingress-gateway"})) - // llmisvc is created with the default route and scheduler spec which results in two inference pool and one service backend refs - Expect(expectedHTTPRoute).To( - HaveBackendRefs( - BackendRefInferencePool(infPoolName), - BackendRefInferencePool(infPoolName), - BackendRefService(svcName+"-kserve-workload-svc"), - ), - ) ensureInferencePoolReady(ctx, envTest.Client, infPool) ensureRouterManagedResourcesAreReady(ctx, envTest.Client, llmSvc) + // Wait for migration to complete - external InferencePool ref dual backend strategy + // v1 points to external pool, v1alpha2 uses auto-generated default name + Eventually(func(g Gomega, ctx context.Context) error { + routes, errList := managedRoutes(ctx, llmSvc) + g.Expect(errList).ToNot(HaveOccurred()) + g.Expect(routes).To(HaveLen(1)) + g.Expect(routes[0]).To(HaveBackendRefs( + BackendRefInferencePoolV1(infPoolName, 100), + BackendRefInferencePoolV1Alpha2(svcName+"-inference-pool", 1), + )) + g.Expect(routes[0]).To(Not(HaveBackendRefs(BackendRefServiceWithWeight(svcName+"-kserve-workload-svc", 1)))) + return nil + }).WithContext(ctx).Should(Succeed()) + Eventually(LLMInferenceServiceIsReady(llmSvc, func(g Gomega, current *v1alpha1.LLMInferenceService) { g.Expect(current.Status).To(HaveCondition(string(v1alpha1.HTTPRoutesReady), "True")) g.Expect(current.Status).To(HaveCondition(string(v1alpha1.InferencePoolReady), "True")) @@ -390,6 +407,7 @@ var _ = Describe("LLMInferenceService Controller", func() { } Expect(envTest.Client.Create(ctx, namespace)).To(Succeed()) Expect(envTest.Client.Create(ctx, IstioShadowService(llmSvcName, nsName))).To(Succeed()) + Expect(envTest.Client.Create(ctx, DefaultServiceAccount(nsName))).To(Succeed()) defer func() { envTest.DeleteAll(namespace) }() @@ -422,14 +440,18 @@ var _ = Describe("LLMInferenceService Controller", func() { Expect(expectedHTTPRoute).To(BeControlledBy(llmSvc)) Expect(expectedHTTPRoute).To(HaveGatewayRefs(gatewayapi.ParentReference{Name: "kserve-ingress-gateway"})) - // llmisvc is created with the default route spec and no scheduler spec which results in three service backend refs - Expect(expectedHTTPRoute).To( - HaveBackendRefs( - BackendRefService(svcName), - BackendRefService(svcName), - BackendRefService(svcName), - ), - ) + // Wait for migration to complete - no scheduler configured uses Service with dual backend strategy + // Service gets 100% traffic, fallback InferencePool gets 0% + Eventually(func(g Gomega, ctx context.Context) error { + routes, errList := managedRoutes(ctx, llmSvc) + g.Expect(errList).ToNot(HaveOccurred()) + g.Expect(routes).To(HaveLen(1)) + g.Expect(routes[0]).To(HaveBackendRefs( + BackendRefServiceWithWeight(svcName, 100), + BackendRefInferencePoolV1Alpha2(kmeta.ChildName(llmSvcName, "-inference-pool"), 1), + )) + return nil + }).WithContext(ctx).Should(Succeed()) Eventually(func(g Gomega, ctx context.Context) error { svc := &corev1.Service{} @@ -446,7 +468,7 @@ var _ = Describe("LLMInferenceService Controller", func() { })).WithContext(ctx).Should(Succeed()) Consistently(func(g Gomega, ctx context.Context) error { - ip := igwapi.InferencePool{} + ip := igwv1.InferencePool{} return envTest.Client.Get(ctx, client.ObjectKey{Name: llmSvcName + "-inference-pool", Namespace: llmSvc.GetNamespace()}, &ip) }).WithContext(ctx). Within(2 * time.Second). @@ -465,6 +487,7 @@ var _ = Describe("LLMInferenceService Controller", func() { } Expect(envTest.Client.Create(ctx, namespace)).To(Succeed()) Expect(envTest.Client.Create(ctx, IstioShadowService(svcName, nsName))).To(Succeed()) + Expect(envTest.Client.Create(ctx, DefaultServiceAccount(nsName))).To(Succeed()) defer func() { envTest.DeleteAll(namespace) }() @@ -495,8 +518,8 @@ var _ = Describe("LLMInferenceService Controller", func() { Expect(expectedHTTPRoute).To(BeControlledBy(llmSvc)) Expect(expectedHTTPRoute).To(HaveGatewayRefs(gatewayapi.ParentReference{Name: "my-ingress-gateway"})) // llmisvc is created with custom route spec and no scheduler which results in one service backend ref - Expect(expectedHTTPRoute).To(HaveBackendRefs(BackendRefService("my-inference-service"))) - Expect(expectedHTTPRoute).To(Not(HaveBackendRefs(BackendRefInferencePool(kmeta.ChildName(svcName, "-inference-pool"))))) + Expect(expectedHTTPRoute).To(HaveBackendRefs(BackendRefServiceWithWeight("my-inference-service", 1))) + Expect(expectedHTTPRoute).To(Not(HaveBackendRefs(BackendRefInferencePoolV1Alpha2(kmeta.ChildName(svcName, "-inference-pool"), 1)))) // Advanced fixture pattern: Update the HTTPRoute status using fixture functions updatedRoute := expectedHTTPRoute.DeepCopy() @@ -521,6 +544,7 @@ var _ = Describe("LLMInferenceService Controller", func() { } Expect(envTest.Client.Create(ctx, namespace)).To(Succeed()) Expect(envTest.Client.Create(ctx, IstioShadowService(svcName, nsName))).To(Succeed()) + Expect(envTest.Client.Create(ctx, DefaultServiceAccount(nsName))).To(Succeed()) defer func() { envTest.DeleteAll(namespace) }() @@ -609,6 +633,7 @@ var _ = Describe("LLMInferenceService Controller", func() { } Expect(envTest.Client.Create(ctx, namespace)).To(Succeed()) Expect(envTest.Client.Create(ctx, IstioShadowService(svcName, nsName))).To(Succeed()) + Expect(envTest.Client.Create(ctx, DefaultServiceAccount(nsName))).To(Succeed()) defer func() { envTest.DeleteAll(namespace) }() @@ -678,6 +703,7 @@ var _ = Describe("LLMInferenceService Controller", func() { } Expect(envTest.Client.Create(ctx, namespace)).To(Succeed()) Expect(envTest.Client.Create(ctx, IstioShadowService(svcName, nsName))).To(Succeed()) + Expect(envTest.Client.Create(ctx, DefaultServiceAccount(nsName))).To(Succeed()) defer func() { envTest.DeleteAll(namespace) }() @@ -1086,6 +1112,173 @@ var _ = Describe("LLMInferenceService Controller", func() { }).WithContext(ctx).Should(BeTrue(), "monitoring ServiceMonitor should be deleted") }) }) + + Context("GIE v1 Migration", func() { + It("should create both v1 and v1alpha2 InferencePool objects", func(ctx SpecContext) { + svcName := "test-llm-dual-pools" + nsName := kmeta.ChildName(svcName, "-test") + namespace := &corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{Name: nsName}, + } + + Expect(envTest.Client.Create(ctx, namespace)).To(Succeed()) + Expect(envTest.Client.Create(ctx, IstioShadowService(svcName, nsName))).To(Succeed()) + Expect(envTest.Client.Create(ctx, DefaultServiceAccount(nsName))).To(Succeed()) + defer func() { envTest.DeleteAll(namespace) }() + + llmSvc := LLMInferenceService(svcName, + InNamespace[*v1alpha1.LLMInferenceService](nsName), + WithModelURI("hf://facebook/opt-125m"), + WithManagedRoute(), + WithManagedGateway(), + WithManagedScheduler(), + ) + + Expect(envTest.Create(ctx, llmSvc)).To(Succeed()) + defer func() { Expect(envTest.Delete(ctx, llmSvc)).To(Succeed()) }() + + poolName := svcName + "-inference-pool" + + // Verify v1 typed InferencePool exists + Eventually(func(g Gomega, ctx context.Context) error { + v1Pool := &igwv1.InferencePool{} + return envTest.Client.Get(ctx, client.ObjectKey{Name: poolName, Namespace: nsName}, v1Pool) + }).WithContext(ctx).Should(Succeed(), "v1 InferencePool should exist") + + // Verify v1alpha2 InferencePool exists via dynamic client + dynamicClient, err := dynamic.NewForConfig(envTest.Config) + Expect(err).ToNot(HaveOccurred()) + + Eventually(func(g Gomega, ctx context.Context) error { + _, err := dynamicClient.Resource(llmisvc.GVRInferencePoolV1Alpha2). + Namespace(nsName). + Get(ctx, poolName, metav1.GetOptions{}) + return err + }).WithContext(ctx).Should(Succeed(), "v1alpha2 InferencePool should exist") + }) + + It("should create HTTPRoute with dual backend refs", func(ctx SpecContext) { + svcName := "test-llm-dual-backends" + nsName := kmeta.ChildName(svcName, "-test") + namespace := &corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{Name: nsName}, + } + + Expect(envTest.Client.Create(ctx, namespace)).To(Succeed()) + Expect(envTest.Client.Create(ctx, IstioShadowService(svcName, nsName))).To(Succeed()) + Expect(envTest.Client.Create(ctx, DefaultServiceAccount(nsName))).To(Succeed()) + defer func() { envTest.DeleteAll(namespace) }() + + llmSvc := LLMInferenceService(svcName, + InNamespace[*v1alpha1.LLMInferenceService](nsName), + WithModelURI("hf://facebook/opt-125m"), + WithManagedRoute(), + WithManagedGateway(), + WithManagedScheduler(), + ) + + Expect(envTest.Create(ctx, llmSvc)).To(Succeed()) + defer func() { Expect(envTest.Delete(ctx, llmSvc)).To(Succeed()) }() + + poolName := svcName + "-inference-pool" + + Eventually(func(g Gomega, ctx context.Context) error { + routes, err := managedRoutes(ctx, llmSvc) + g.Expect(err).ToNot(HaveOccurred()) + g.Expect(routes).To(HaveLen(1)) + + route := routes[0] + g.Expect(route.Spec.Rules).To(HaveLen(1)) + g.Expect(route.Spec.Rules[0].BackendRefs).To(HaveLen(2)) + + hasV1, hasV1Alpha2 := false, false + for _, ref := range route.Spec.Rules[0].BackendRefs { + if ref.Group != nil && string(*ref.Group) == "inference.networking.k8s.io" && + string(ref.Name) == poolName { + hasV1 = true + } + if ref.Group != nil && string(*ref.Group) == "inference.networking.x-k8s.io" && + string(ref.Name) == poolName { + hasV1Alpha2 = true + } + } + + g.Expect(hasV1).To(BeTrue()) + g.Expect(hasV1Alpha2).To(BeTrue()) + return nil + }).WithContext(ctx).Should(Succeed()) + }) + + It("should set migration annotation when v1 becomes ready", func(ctx SpecContext) { + svcName := "test-llm-migration" + nsName := kmeta.ChildName(svcName, "-test") + namespace := &corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{Name: nsName}, + } + + Expect(envTest.Client.Create(ctx, namespace)).To(Succeed()) + Expect(envTest.Client.Create(ctx, IstioShadowService(svcName, nsName))).To(Succeed()) + Expect(envTest.Client.Create(ctx, DefaultServiceAccount(nsName))).To(Succeed()) + defer func() { envTest.DeleteAll(namespace) }() + + llmSvc := LLMInferenceService(svcName, + InNamespace[*v1alpha1.LLMInferenceService](nsName), + WithModelURI("hf://facebook/opt-125m"), + WithManagedRoute(), + WithManagedGateway(), + WithManagedScheduler(), + ) + + Expect(envTest.Create(ctx, llmSvc)).To(Succeed()) + defer func() { Expect(envTest.Delete(ctx, llmSvc)).To(Succeed()) }() + + ensureRouterManagedResourcesAreReady(ctx, envTest.Client, llmSvc) + + Eventually(func(g Gomega, ctx context.Context) { + routes, err := managedRoutes(ctx, llmSvc) + g.Expect(err).ToNot(HaveOccurred()) + g.Expect(routes).To(HaveLen(1)) + g.Expect(routes[0].Annotations).To(HaveKeyWithValue( + llmisvc.AnnotationInferencePoolMigrated, "v1")) + }).WithContext(ctx).Should(Succeed()) + }) + + It("should report InferencePoolReady when pools become ready", func(ctx SpecContext) { + svcName := "test-llm-pool-ready" + nsName := kmeta.ChildName(svcName, "-test") + namespace := &corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{Name: nsName}, + } + + Expect(envTest.Client.Create(ctx, namespace)).To(Succeed()) + Expect(envTest.Client.Create(ctx, IstioShadowService(svcName, nsName))).To(Succeed()) + Expect(envTest.Client.Create(ctx, DefaultServiceAccount(nsName))).To(Succeed()) + defer func() { envTest.DeleteAll(namespace) }() + + llmSvc := LLMInferenceService(svcName, + InNamespace[*v1alpha1.LLMInferenceService](nsName), + WithModelURI("hf://facebook/opt-125m"), + WithManagedRoute(), + WithManagedGateway(), + WithManagedScheduler(), + ) + + Expect(envTest.Create(ctx, llmSvc)).To(Succeed()) + defer func() { Expect(envTest.Delete(ctx, llmSvc)).To(Succeed()) }() + + // Make resources ready + ensureRouterManagedResourcesAreReady(ctx, envTest.Client, llmSvc) + + // Verify InferencePoolReady becomes true + Eventually(func(g Gomega, ctx context.Context) { + current := &v1alpha1.LLMInferenceService{} + g.Expect(envTest.Get(ctx, client.ObjectKeyFromObject(llmSvc), current)).To(Succeed()) + cond := current.Status.GetCondition(v1alpha1.InferencePoolReady) + g.Expect(cond).ToNot(BeNil()) + g.Expect(cond.IsTrue()).To(BeTrue()) + }).WithContext(ctx).Should(Succeed()) + }) + }) }) func LLMInferenceServiceIsReady(llmSvc *v1alpha1.LLMInferenceService, assertFns ...func(g Gomega, current *v1alpha1.LLMInferenceService)) func(g Gomega, ctx context.Context) error { @@ -1232,20 +1425,20 @@ func ensureHTTPRouteReady(ctx context.Context, c client.Client, llmSvc *v1alpha1 } // ensureInferencePoolReady sets up InferencePool status conditions to simulate a ready InferencePool -func ensureInferencePoolReady(ctx context.Context, c client.Client, pool *igwapi.InferencePool) { +func ensureInferencePoolReady(ctx context.Context, c client.Client, pool *igwv1.InferencePool) { if envTest.UsingExistingCluster() { return } - createdPool := &igwapi.InferencePool{} + createdPool := &igwv1.InferencePool{} Expect(c.Get(ctx, client.ObjectKeyFromObject(pool), createdPool)).To(Succeed()) WithInferencePoolReadyStatus()(createdPool) Expect(c.Status().Update(ctx, createdPool)).To(Succeed()) // Verify the InferencePool is now ready - updatedPool := &igwapi.InferencePool{} + updatedPool := &igwv1.InferencePool{} Eventually(func(g Gomega, ctx context.Context) bool { - updatedPool = &igwapi.InferencePool{} + updatedPool = &igwv1.InferencePool{} g.Expect(c.Get(ctx, client.ObjectKeyFromObject(pool), updatedPool)).To(Succeed()) return llmisvc.IsInferencePoolReady(updatedPool) }).WithContext(ctx).Should(BeTrue(), fmt.Sprintf("Expected InferencePool to be ready, got: %#v", updatedPool.Status)) @@ -1300,7 +1493,7 @@ func ensureRouterManagedResourcesAreReady(ctx context.Context, c client.Client, LabelSelector: labels.SelectorFromSet(llmisvc.SchedulerLabels(llmSvc)), } - infPools := &igwapi.InferencePoolList{} + infPools := &igwv1.InferencePoolList{} err = c.List(ctx, infPools, infPoolsListOpts) if err != nil && !errors.IsNotFound(err) { g.Expect(err).NotTo(gomega.HaveOccurred()) @@ -1312,6 +1505,65 @@ func ensureRouterManagedResourcesAreReady(ctx context.Context, c client.Client, g.Expect(c.Status().Update(ctx, updatedPool)).To(gomega.Succeed()) } + // Also mark v1alpha2 InferencePools as ready using dynamic client + dynamicClient, err := dynamic.NewForConfig(envTest.Config) + if err != nil { + g.Expect(err).NotTo(gomega.HaveOccurred()) + } + + // List v1alpha2 pools with the same label selector + v1alpha2Pools, err := dynamicClient.Resource(llmisvc.GVRInferencePoolV1Alpha2). + Namespace(llmSvc.Namespace). + List(ctx, metav1.ListOptions{ + LabelSelector: infPoolsListOpts.LabelSelector.String(), + }) + if err != nil && !errors.IsNotFound(err) { + g.Expect(err).NotTo(gomega.HaveOccurred()) + } + + logf.FromContext(ctx).Info("Marking v1alpha2 InferencePool resources ready", "count", len(v1alpha2Pools.Items)) + for i := range v1alpha2Pools.Items { + poolUnstructured := &v1alpha2Pools.Items[i] + // Set ready status on v1alpha2 pool + status := map[string]interface{}{ + "parent": []interface{}{ + map[string]interface{}{ + "parentRef": map[string]interface{}{ + "group": "gateway.networking.k8s.io", + "kind": "Gateway", + "name": "kserve-ingress-gateway", + "namespace": "kserve", + }, + "conditions": []interface{}{ + map[string]interface{}{ + "type": "Accepted", + "status": "True", + "reason": "Accepted", + "message": "InferencePool accepted", + "lastTransitionTime": metav1.Now().Format(time.RFC3339), + }, + map[string]interface{}{ + "type": "ResolvedRefs", + "status": "True", + "reason": "ResolvedRefs", + "message": "All references resolved", + "lastTransitionTime": metav1.Now().Format(time.RFC3339), + }, + }, + }, + }, + } + if err := unstructured.SetNestedField(poolUnstructured.Object, status, "status"); err != nil { + g.Expect(err).NotTo(gomega.HaveOccurred()) + } + _, err := dynamicClient.Resource(llmisvc.GVRInferencePoolV1Alpha2). + Namespace(llmSvc.Namespace). + UpdateStatus(ctx, poolUnstructured, metav1.UpdateOptions{}) + if err != nil { + g.Expect(err).NotTo(gomega.HaveOccurred()) + } + } + ensureSchedulerDeploymentReady(ctx, c, llmSvc) }).WithContext(ctx).Should(gomega.Succeed()) } diff --git a/pkg/controller/llmisvc/controller_workload_storage_int_test.go b/pkg/controller/llmisvc/controller_workload_storage_int_test.go index 58aaf9314b7..7fdbbe60e15 100644 --- a/pkg/controller/llmisvc/controller_workload_storage_int_test.go +++ b/pkg/controller/llmisvc/controller_workload_storage_int_test.go @@ -97,6 +97,7 @@ var _ = Describe("LLMInferenceService Controller - Storage configuration", func( } Expect(envTest.Client.Create(ctx, namespace)).To(Succeed()) Expect(envTest.Client.Create(ctx, IstioShadowService(svcName, nsName))).To(Succeed()) + Expect(envTest.Client.Create(ctx, DefaultServiceAccount(nsName))).To(Succeed()) defer func() { envTest.DeleteAll(namespace) }() @@ -162,6 +163,7 @@ var _ = Describe("LLMInferenceService Controller - Storage configuration", func( } Expect(envTest.Client.Create(ctx, namespace)).To(Succeed()) Expect(envTest.Client.Create(ctx, IstioShadowService(svcName, nsName))).To(Succeed()) + Expect(envTest.Client.Create(ctx, DefaultServiceAccount(nsName))).To(Succeed()) defer func() { envTest.DeleteAll(namespace) }() @@ -992,6 +994,7 @@ var _ = Describe("LLMInferenceService Controller - Storage configuration", func( } Expect(envTest.Client.Create(ctx, namespace)).To(Succeed()) Expect(envTest.Client.Create(ctx, IstioShadowService(svcName, nsName))).To(Succeed()) + Expect(envTest.Client.Create(ctx, DefaultServiceAccount(nsName))).To(Succeed()) defer func() { envTest.DeleteAll(namespace) }() @@ -1069,6 +1072,7 @@ var _ = Describe("LLMInferenceService Controller - Storage configuration", func( } Expect(envTest.Client.Create(ctx, namespace)).To(Succeed()) Expect(envTest.Client.Create(ctx, IstioShadowService(svcName, nsName))).To(Succeed()) + Expect(envTest.Client.Create(ctx, DefaultServiceAccount(nsName))).To(Succeed()) defer func() { envTest.DeleteAll(namespace) }() @@ -1148,6 +1152,7 @@ var _ = Describe("LLMInferenceService Controller - Storage configuration", func( } Expect(envTest.Client.Create(ctx, namespace)).To(Succeed()) Expect(envTest.Client.Create(ctx, IstioShadowService(svcName, nsName))).To(Succeed()) + Expect(envTest.Client.Create(ctx, DefaultServiceAccount(nsName))).To(Succeed()) defer func() { envTest.DeleteAll(namespace) }() @@ -1227,6 +1232,7 @@ var _ = Describe("LLMInferenceService Controller - Storage configuration", func( } Expect(envTest.Client.Create(ctx, namespace)).To(Succeed()) Expect(envTest.Client.Create(ctx, IstioShadowService(svcName, nsName))).To(Succeed()) + Expect(envTest.Client.Create(ctx, DefaultServiceAccount(nsName))).To(Succeed()) defer func() { envTest.DeleteAll(namespace) }() @@ -1362,6 +1368,7 @@ var _ = Describe("LLMInferenceService Controller - Storage configuration", func( } Expect(envTest.Client.Create(ctx, namespace)).To(Succeed()) Expect(envTest.Client.Create(ctx, IstioShadowService(svcName, nsName))).To(Succeed()) + Expect(envTest.Client.Create(ctx, DefaultServiceAccount(nsName))).To(Succeed()) defer func() { envTest.DeleteAll(namespace) }() @@ -1441,6 +1448,7 @@ var _ = Describe("LLMInferenceService Controller - Storage configuration", func( } Expect(envTest.Client.Create(ctx, namespace)).To(Succeed()) Expect(envTest.Client.Create(ctx, IstioShadowService(svcName, nsName))).To(Succeed()) + Expect(envTest.Client.Create(ctx, DefaultServiceAccount(nsName))).To(Succeed()) defer func() { envTest.DeleteAll(namespace) }() @@ -1618,6 +1626,7 @@ var _ = Describe("LLMInferenceService Controller - Storage configuration", func( } Expect(envTest.Client.Create(ctx, namespace)).To(Succeed()) Expect(envTest.Client.Create(ctx, IstioShadowService(svcName, nsName))).To(Succeed()) + Expect(envTest.Client.Create(ctx, DefaultServiceAccount(nsName))).To(Succeed()) defer func() { envTest.DeleteAll(namespace) }() diff --git a/pkg/controller/llmisvc/fixture/envtest.go b/pkg/controller/llmisvc/fixture/envtest.go index 3cf2dbb3ba9..6df57d4e6ec 100644 --- a/pkg/controller/llmisvc/fixture/envtest.go +++ b/pkg/controller/llmisvc/fixture/envtest.go @@ -24,6 +24,7 @@ import ( "github.com/onsi/ginkgo/v2" "github.com/onsi/gomega" corev1 "k8s.io/api/core/v1" + "k8s.io/client-go/dynamic" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" "k8s.io/client-go/tools/record" @@ -53,10 +54,14 @@ func SetupTestEnv() *pkgtest.Client { clientSet, err := kubernetes.NewForConfig(cfg) gomega.Expect(err).NotTo(gomega.HaveOccurred()) + dynamicClient, err := dynamic.NewForConfig(cfg) + gomega.Expect(err).NotTo(gomega.HaveOccurred()) + llmCtrl := llmisvc.LLMInferenceServiceReconciler{ - Client: mgr.GetClient(), - Clientset: clientSet, - Config: cfg, + Client: mgr.GetClient(), + Config: cfg, + Clientset: clientSet, + DynamicClient: dynamicClient, // TODO fix it to be set up similar to main.go, for now it's stub EventRecorder: eventBroadcaster.NewRecorder(mgr.GetScheme(), corev1.EventSource{Component: "v1beta1Controllers"}), } diff --git a/pkg/controller/llmisvc/fixture/gwapi_builders.go b/pkg/controller/llmisvc/fixture/gwapi_builders.go index 0aa4b98e2da..5490f921644 100644 --- a/pkg/controller/llmisvc/fixture/gwapi_builders.go +++ b/pkg/controller/llmisvc/fixture/gwapi_builders.go @@ -20,7 +20,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/utils/ptr" "sigs.k8s.io/controller-runtime/pkg/client" - igwapi "sigs.k8s.io/gateway-api-inference-extension/api/v1alpha2" + igwv1 "sigs.k8s.io/gateway-api-inference-extension/api/v1" gatewayapi "sigs.k8s.io/gateway-api/apis/v1" ) @@ -289,7 +289,23 @@ func WithHTTPRouteGatewayRef(references ...gatewayapi.ParentReference) HTTPRoute } } -func BackendRefInferencePool(name string) gatewayapi.HTTPBackendRef { +// BackendRefInferencePoolV1 creates a v1 InferencePool backend ref +func BackendRefInferencePoolV1(name string, weight int32) gatewayapi.HTTPBackendRef { + return gatewayapi.HTTPBackendRef{ + BackendRef: gatewayapi.BackendRef{ + BackendObjectReference: gatewayapi.BackendObjectReference{ + Group: ptr.To(gatewayapi.Group("inference.networking.k8s.io")), + Kind: ptr.To(gatewayapi.Kind("InferencePool")), + Name: gatewayapi.ObjectName(name), + Port: ptr.To(gatewayapi.PortNumber(8000)), + }, + Weight: ptr.To(weight), + }, + } +} + +// BackendRefInferencePoolV1Alpha2 creates a v1alpha2 InferencePool backend ref with configurable weight +func BackendRefInferencePoolV1Alpha2(name string, weight int32) gatewayapi.HTTPBackendRef { return gatewayapi.HTTPBackendRef{ BackendRef: gatewayapi.BackendRef{ BackendObjectReference: gatewayapi.BackendObjectReference{ @@ -298,12 +314,13 @@ func BackendRefInferencePool(name string) gatewayapi.HTTPBackendRef { Name: gatewayapi.ObjectName(name), Port: ptr.To(gatewayapi.PortNumber(8000)), }, - Weight: ptr.To(int32(1)), + Weight: ptr.To(weight), }, } } -func BackendRefService(name string) gatewayapi.HTTPBackendRef { +// BackendRefServiceWithWeight creates a Service backend ref with configurable weight +func BackendRefServiceWithWeight(name string, weight int32) gatewayapi.HTTPBackendRef { return gatewayapi.HTTPBackendRef{ BackendRef: gatewayapi.BackendRef{ BackendObjectReference: gatewayapi.BackendObjectReference{ @@ -312,7 +329,7 @@ func BackendRefService(name string) gatewayapi.HTTPBackendRef { Name: gatewayapi.ObjectName(name), Port: ptr.To(gatewayapi.PortNumber(8000)), }, - Weight: ptr.To(int32(1)), + Weight: ptr.To(weight), }, } } @@ -357,13 +374,15 @@ func PathPrefixMatch(path string) gatewayapi.HTTPRouteMatch { } } +// ServiceRef creates a Service backend reference for HTTPRoute rules. +// Gateway API v1.4+: port can be passed directly as int32 because PortNumber is a type alias. func ServiceRef(name string, port int32, weight int32) gatewayapi.HTTPBackendRef { return gatewayapi.HTTPBackendRef{ BackendRef: gatewayapi.BackendRef{ BackendObjectReference: gatewayapi.BackendObjectReference{ Kind: ptr.To(gatewayapi.Kind("Service")), Name: gatewayapi.ObjectName(name), - Port: ptr.To(gatewayapi.PortNumber(port)), + Port: ptr.To(port), }, Weight: ptr.To(weight), }, @@ -593,19 +612,24 @@ func WithHTTPRouteNotReadyStatus(controllerName, reason, message string) HTTPRou } } -type InferencePoolOption ObjectOption[*igwapi.InferencePool] +type InferencePoolOption ObjectOption[*igwv1.InferencePool] -func InferencePool(name string, opts ...InferencePoolOption) *igwapi.InferencePool { - pool := &igwapi.InferencePool{ +func InferencePool(name string, opts ...InferencePoolOption) *igwv1.InferencePool { + pool := &igwv1.InferencePool{ ObjectMeta: metav1.ObjectMeta{ Name: name, }, - Spec: igwapi.InferencePoolSpec{ - Selector: make(map[igwapi.LabelKey]igwapi.LabelValue), - TargetPortNumber: 8000, + Spec: igwv1.InferencePoolSpec{ + Selector: igwv1.LabelSelector{ + MatchLabels: make(map[igwv1.LabelKey]igwv1.LabelValue), + }, + TargetPorts: []igwv1.Port{ + {Number: igwv1.PortNumber(8000)}, + }, + EndpointPickerRef: igwv1.EndpointPickerRef{}, }, - Status: igwapi.InferencePoolStatus{ - Parents: []igwapi.PoolStatus{}, + Status: igwv1.InferencePoolStatus{ + Parents: []igwv1.ParentStatus{}, }, } @@ -617,46 +641,56 @@ func InferencePool(name string, opts ...InferencePoolOption) *igwapi.InferencePo } func WithSelector(key, value string) InferencePoolOption { - return func(pool *igwapi.InferencePool) { - if pool.Spec.Selector == nil { - pool.Spec.Selector = make(map[igwapi.LabelKey]igwapi.LabelValue) + return func(pool *igwv1.InferencePool) { + if pool.Spec.Selector.MatchLabels == nil { + pool.Spec.Selector.MatchLabels = make(map[igwv1.LabelKey]igwv1.LabelValue) } - pool.Spec.Selector[igwapi.LabelKey(key)] = igwapi.LabelValue(value) + pool.Spec.Selector.MatchLabels[igwv1.LabelKey(key)] = igwv1.LabelValue(value) } } func WithTargetPort(port int32) InferencePoolOption { - return func(pool *igwapi.InferencePool) { - pool.Spec.TargetPortNumber = port + return func(pool *igwv1.InferencePool) { + pool.Spec.TargetPorts = []igwv1.Port{ + {Number: igwv1.PortNumber(port)}, + } } } func WithExtensionRef(group, kind, name string) InferencePoolOption { - return func(pool *igwapi.InferencePool) { - pool.Spec.EndpointPickerConfig = igwapi.EndpointPickerConfig{ - ExtensionRef: &igwapi.Extension{ - ExtensionReference: igwapi.ExtensionReference{ - Group: ptr.To(igwapi.Group(group)), - Kind: ptr.To(igwapi.Kind(kind)), - Name: igwapi.ObjectName(name), - }, - ExtensionConnection: igwapi.ExtensionConnection{ - FailureMode: ptr.To(igwapi.FailOpen), - }, - }, + return func(pool *igwv1.InferencePool) { + pool.Spec.EndpointPickerRef = igwv1.EndpointPickerRef{ + Group: ptr.To(igwv1.Group(group)), + Kind: igwv1.Kind(kind), + Name: igwv1.ObjectName(name), + Port: ptr.To(igwv1.Port{Number: igwv1.PortNumber(8000)}), // GIE v1 requires port when kind is Service } } } func WithInferencePoolReadyStatus() InferencePoolOption { - return func(pool *igwapi.InferencePool) { - pool.Status.Parents = []igwapi.PoolStatus{ + return func(pool *igwv1.InferencePool) { + pool.Status.Parents = []igwv1.ParentStatus{ { + ParentRef: igwv1.ParentReference{ + Group: ptr.To(igwv1.Group("gateway.networking.k8s.io")), + Kind: igwv1.Kind("Gateway"), + Name: igwv1.ObjectName("kserve-ingress-gateway"), + Namespace: igwv1.Namespace("kserve"), + }, Conditions: []metav1.Condition{ { - Type: string(igwapi.InferencePoolConditionAccepted), + Type: string(igwv1.InferencePoolConditionAccepted), + Status: metav1.ConditionTrue, + Reason: string(igwv1.InferencePoolReasonAccepted), + Message: "InferencePool accepted", + LastTransitionTime: metav1.Now(), + }, + { + Type: string(igwv1.InferencePoolConditionResolvedRefs), Status: metav1.ConditionTrue, - Reason: string(igwapi.InferencePoolReasonAccepted), + Reason: string(igwv1.InferencePoolReasonResolvedRefs), + Message: "All references resolved", LastTransitionTime: metav1.Now(), }, }, diff --git a/pkg/controller/llmisvc/fixture/required_resources.go b/pkg/controller/llmisvc/fixture/required_resources.go index 4f131cf0dd6..ad620c9948e 100644 --- a/pkg/controller/llmisvc/fixture/required_resources.go +++ b/pkg/controller/llmisvc/fixture/required_resources.go @@ -87,6 +87,15 @@ func IstioShadowService(name, ns string) *corev1.Service { } } +func DefaultServiceAccount(ns string) *corev1.ServiceAccount { + return &corev1.ServiceAccount{ + ObjectMeta: metav1.ObjectMeta{ + Name: "default", + Namespace: ns, + }, + } +} + func DefaultGateway(ns string) *gatewayapiv1.Gateway { defaultGateway := Gateway(constants.GatewayName, InNamespace[*gatewayapiv1.Gateway](ns), diff --git a/pkg/controller/llmisvc/lifecycle_crud.go b/pkg/controller/llmisvc/lifecycle_crud.go index 221c7328b76..6291b5c5b35 100644 --- a/pkg/controller/llmisvc/lifecycle_crud.go +++ b/pkg/controller/llmisvc/lifecycle_crud.go @@ -27,6 +27,7 @@ import ( "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/tools/record" + "k8s.io/client-go/util/retry" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/apiutil" "sigs.k8s.io/controller-runtime/pkg/log" @@ -116,6 +117,7 @@ func Update[O client.Object, T client.Object](ctx context.Context, c clientWithR ownerLogLine = logLineForObject(owner) } + // Perform initial ownership check (this only needs to be done once, not in the retry loop) if isNamespaced, err := apiutil.IsObjectNamespaced(expected, c.Scheme(), c.RESTMapper()); err != nil { return fmt.Errorf("failed to resolve if resource is namespaced %s: %w", typeLogLine, err) } else if isNamespaced && !isOwnerNil { @@ -129,29 +131,48 @@ func Update[O client.Object, T client.Object](ctx context.Context, c clientWithR } } - expected.SetResourceVersion(curr.GetResourceVersion()) - if err := c.Update(ctx, expected, client.DryRunAll); err != nil { - return fmt.Errorf("failed to get defaults for %s %s/%s: %w", typeLogLine, expected.GetNamespace(), expected.GetName(), err) - } + // Get the object key for re-fetching in the retry loop + objKey := client.ObjectKeyFromObject(curr) - if isEqual(expected, curr) { - return nil - } + // Wrap the update logic in retry.RetryOnConflict to handle resource version conflicts + return retry.RetryOnConflict(retry.DefaultRetry, func() error { + // Re-fetch the current version of the resource to get the latest state + latestCurr := curr.DeepCopyObject().(T) + if err := c.Get(ctx, objKey, latestCurr); err != nil { + return fmt.Errorf("failed to get latest %s %s/%s: %w", typeLogLine, objKey.Namespace, objKey.Name, err) + } - log.FromContext(ctx).V(2).Info("Updating "+typeLogLine, - "expected", expected, - "curr", curr, - ) + // Create a fresh copy of expected to avoid mutating the original + latestExpected := expected.DeepCopyObject().(T) + latestExpected.SetResourceVersion(latestCurr.GetResourceVersion()) - if err := c.Update(ctx, expected); err != nil { - return fmt.Errorf("failed to update %s %s/%s: %w", typeLogLine, expected.GetNamespace(), expected.GetName(), err) - } + // Use DryRun to get server defaults merged into our expected object + if err := c.Update(ctx, latestExpected, client.DryRunAll); err != nil { + return err + } - if !isOwnerNil { - c.Eventf(owner, corev1.EventTypeNormal, "Updated", "Updated %s %s/%s", typeLogLine, expected.GetNamespace(), expected.GetName()) - } + // Check if the current state matches our expected state + if isEqual(latestExpected, latestCurr) { + return nil + } - return nil + log.FromContext(ctx).V(2).Info("Updating "+typeLogLine, + "expected", latestExpected, + "curr", latestCurr, + ) + + // Perform the actual update + if err := c.Update(ctx, latestExpected); err != nil { + return err + } + + // Record the update event + if !isOwnerNil { + c.Eventf(owner, corev1.EventTypeNormal, "Updated", "Updated %s %s/%s", typeLogLine, latestExpected.GetNamespace(), latestExpected.GetName()) + } + + return nil + }) } func logLineForObject(obj client.Object) string { diff --git a/pkg/controller/llmisvc/router.go b/pkg/controller/llmisvc/router.go index 96a7ca607d5..d77695a6880 100644 --- a/pkg/controller/llmisvc/router.go +++ b/pkg/controller/llmisvc/router.go @@ -34,7 +34,7 @@ import ( "k8s.io/apimachinery/pkg/api/equality" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "knative.dev/pkg/kmeta" - igwapi "sigs.k8s.io/gateway-api-inference-extension/api/v1alpha2" + igwv1 "sigs.k8s.io/gateway-api-inference-extension/api/v1" gatewayapi "sigs.k8s.io/gateway-api/apis/v1" "sigs.k8s.io/controller-runtime/pkg/log" @@ -178,6 +178,106 @@ func (r *LLMInferenceServiceReconciler) expectedHTTPRoute(ctx context.Context, l } } + // Auto-inject dual InferencePool backend refs for scheduler-managed routes + // This ensures both v1 and v1alpha2 pools are referenced with proper initial weights + if llmSvc.Spec.Router != nil && llmSvc.Spec.Router.Scheduler != nil && + llmSvc.Spec.Router.Route != nil && llmSvc.Spec.Router.Route.HTTP != nil && + !llmSvc.Spec.Router.Route.HTTP.HasRefs() { + // v1 uses the configured pool name (respects external refs) + v1PoolName := llmSvc.Spec.Router.Scheduler.InferencePoolName(llmSvc) + // v1alpha2 always uses the default auto-generated pool name (fallback) + v1alpha2PoolName := kmeta.ChildName(llmSvc.GetName(), "-inference-pool") + + // Only inject backend refs if they haven't been explicitly provided by the user + if llmSvc.Spec.Router.Route.HTTP.Spec == nil || len(httpRoute.Spec.Rules) == 0 { + // Create a default rule with both InferencePool backend refs + // Initial weights: v1alpha2=100% (active), v1=0% (until controller is ready) + httpRoute.Spec.Rules = []gatewayapi.HTTPRouteRule{ + { + BackendRefs: []gatewayapi.HTTPBackendRef{ + { + BackendRef: gatewayapi.BackendRef{ + BackendObjectReference: gatewayapi.BackendObjectReference{ + Group: ptr.To(gatewayapi.Group("inference.networking.k8s.io")), + Kind: ptr.To(gatewayapi.Kind("InferencePool")), + Name: gatewayapi.ObjectName(v1PoolName), + Port: ptr.To(gatewayapi.PortNumber(8000)), + }, + Weight: ptr.To(int32(0)), // v1 starts at 0% (no controller yet) + }, + }, + { + BackendRef: gatewayapi.BackendRef{ + BackendObjectReference: gatewayapi.BackendObjectReference{ + Group: ptr.To(gatewayapi.Group("inference.networking.x-k8s.io")), + Kind: ptr.To(gatewayapi.Kind("InferencePool")), + Name: gatewayapi.ObjectName(v1alpha2PoolName), + Port: ptr.To(gatewayapi.PortNumber(8000)), + }, + Weight: ptr.To(int32(100)), // v1alpha2 starts at 100% (active fallback) + }, + }, + }, + }, + } + } else { + // User provided a route spec - ensure both v1 and v1alpha2 backend refs are present + // Iterate through rules and inject missing backend refs + for i := range httpRoute.Spec.Rules { + rule := &httpRoute.Spec.Rules[i] + + hasV1 := false + hasV1Alpha2 := false + v1Alpha2Index := -1 + + // Check which backend refs are already present + for j, ref := range rule.BackendRefs { + if ref.Group != nil && ref.Kind != nil && string(*ref.Kind) == "InferencePool" { + if string(*ref.Group) == "inference.networking.k8s.io" && string(ref.Name) == v1PoolName { + hasV1 = true + } else if string(*ref.Group) == "inference.networking.x-k8s.io" && string(ref.Name) == v1alpha2PoolName { + hasV1Alpha2 = true + v1Alpha2Index = j + } + } + } + + // Inject missing backend refs with appropriate weights + if hasV1Alpha2 && !hasV1 { + // Only v1alpha2 exists - ensure it has weight=100 and add v1 with weight=0 + if rule.BackendRefs[v1Alpha2Index].Weight == nil { + rule.BackendRefs[v1Alpha2Index].Weight = ptr.To(int32(100)) + } + rule.BackendRefs = append(rule.BackendRefs, gatewayapi.HTTPBackendRef{ + BackendRef: gatewayapi.BackendRef{ + BackendObjectReference: gatewayapi.BackendObjectReference{ + Group: ptr.To(gatewayapi.Group("inference.networking.k8s.io")), + Kind: ptr.To(gatewayapi.Kind("InferencePool")), + Name: gatewayapi.ObjectName(v1PoolName), + Port: ptr.To(gatewayapi.PortNumber(8000)), + }, + Weight: ptr.To(int32(0)), // v1 starts at 0% (no controller yet) + }, + }) + } else if hasV1 && !hasV1Alpha2 { + // Only v1 exists - add v1alpha2 with weight=100 + rule.BackendRefs = append(rule.BackendRefs, gatewayapi.HTTPBackendRef{ + BackendRef: gatewayapi.BackendRef{ + BackendObjectReference: gatewayapi.BackendObjectReference{ + Group: ptr.To(gatewayapi.Group("inference.networking.x-k8s.io")), + Kind: ptr.To(gatewayapi.Kind("InferencePool")), + Name: gatewayapi.ObjectName(v1alpha2PoolName), + Port: ptr.To(gatewayapi.PortNumber(8000)), + }, + Weight: ptr.To(int32(100)), // v1alpha2 starts at 100% + }, + }) + } + // If neither or both exist, don't modify (user has full control) + } + } + } + return httpRoute } @@ -410,7 +510,11 @@ func (r *LLMInferenceServiceReconciler) EvaluateHTTPRouteConditions(ctx context. } // EvaluateInferencePoolConditions evaluates the readiness of all Inference Pools in the LLMInferenceService -// and updates the InferencePoolReady condition accordingly +// and updates the InferencePoolReady condition accordingly. +// +// This function implements the dual-pool fallback strategy: it checks both v1 and v1alpha2 InferencePools +// and marks the service as ready if EITHER pool is ready. This allows the service to work with v1alpha2 +// until the GIE v1 controller is available (e.g., in OpenShift environments without v1 integration yet). func (r *LLMInferenceServiceReconciler) EvaluateInferencePoolConditions(ctx context.Context, llmSvc *v1alpha1.LLMInferenceService) error { logger := log.FromContext(ctx).WithName("EvaluateInferencePoolConditions") @@ -421,45 +525,66 @@ func (r *LLMInferenceServiceReconciler) EvaluateInferencePoolConditions(ctx cont return nil } - curr := &igwapi.InferencePool{} - + // Determine the pool name to check + var poolName string if llmSvc.Spec.Router.Scheduler.Pool != nil && llmSvc.Spec.Router.Scheduler.Pool.Ref != nil && llmSvc.Spec.Router.Scheduler.Pool.Ref.Name != "" { - poolRef := llmSvc.Spec.Router.Scheduler.Pool.Ref - err := r.Client.Get(ctx, types.NamespacedName{Namespace: llmSvc.Namespace, Name: poolRef.Name}, curr) - if err != nil { - err := fmt.Errorf("failed to fetch referenced Inference Pool %s/%s: %w", llmSvc.Namespace, poolRef.Name, err) - llmSvc.MarkInferencePoolNotReady("InferencePoolFetchError", err.Error()) - return err - } + poolName = llmSvc.Spec.Router.Scheduler.Pool.Ref.Name } else { expected := r.expectedSchedulerInferencePool(ctx, llmSvc) - err := r.Client.Get(ctx, types.NamespacedName{Namespace: expected.Namespace, Name: expected.Name}, curr) - if err != nil { - err := fmt.Errorf("failed to fetch embedded Inference Pool %s/%s: %w", llmSvc.Namespace, llmSvc.Name, err) - llmSvc.MarkInferencePoolNotReady("InferencePoolFetchError", err.Error()) - return err - } + poolName = expected.Name } - if !IsInferencePoolReady(curr) { - topLevelCondition, _ := nonReadyInferencePoolTopLevelCondition(curr) - if topLevelCondition != nil { - llmSvc.MarkInferencePoolNotReady("InferencePoolNotReady", fmt.Sprintf( - "%s/%s: %v=%#v (reason %q, message %q)", - curr.Namespace, - curr.Name, - topLevelCondition.Type, - topLevelCondition.Status, - topLevelCondition.Reason, - topLevelCondition.Message, - )) - } else { - llmSvc.MarkInferencePoolNotReady("InferencePoolNotReady", fmt.Sprintf("The inference pool %s/%s is not ready", curr.Namespace, curr.Name)) + // Check v1 InferencePool readiness + v1Pool := &igwv1.InferencePool{} + v1Ready := false + v1Err := r.Client.Get(ctx, types.NamespacedName{Namespace: llmSvc.Namespace, Name: poolName}, v1Pool) + if v1Err == nil { + v1Ready = IsInferencePoolReady(v1Pool) + if v1Ready { + logger.V(2).Info("v1 InferencePool is ready", "pool", poolName) } + } else if !apierrors.IsNotFound(v1Err) { + // Log non-NotFound errors but don't fail - v1alpha2 might still work + logger.V(2).Info("Failed to fetch v1 InferencePool, will check v1alpha2 fallback", "error", v1Err) + } + + // Check v1alpha2 InferencePool readiness (fallback for environments without GIE v1 controller) + alpha2Ready := r.isAlpha2PoolReady(ctx, llmSvc.Namespace, poolName) + if alpha2Ready { + logger.V(2).Info("v1alpha2 InferencePool is ready", "pool", poolName) + } + + // Mark ready if EITHER v1 or v1alpha2 pool is ready (dual-pool fallback strategy) + if v1Ready || alpha2Ready { + llmSvc.MarkInferencePoolReady() + logger.Info("InferencePool is ready", "pool", poolName, "v1Ready", v1Ready, "alpha2Ready", alpha2Ready) return nil } - llmSvc.MarkInferencePoolReady() - logger.V(2).Info("Inference Pool is ready", "pool", curr) + // Neither pool is ready - provide detailed error message + if v1Err != nil && !apierrors.IsNotFound(v1Err) { + // If we couldn't fetch v1 pool due to an error (not just NotFound) + err := fmt.Errorf("failed to fetch v1 InferencePool %s/%s: %w", llmSvc.Namespace, poolName, v1Err) + llmSvc.MarkInferencePoolNotReady("InferencePoolFetchError", err.Error()) + return err + } + + // Both pools exist but neither is ready - report v1 pool status if available + topLevelCondition, _ := nonReadyInferencePoolTopLevelCondition(v1Pool) + if topLevelCondition != nil { + llmSvc.MarkInferencePoolNotReady("InferencePoolNotReady", fmt.Sprintf( + "Neither v1 nor v1alpha2 InferencePool is ready. v1 status: %s/%s: %v=%#v (reason %q, message %q)", + v1Pool.ObjectMeta.Namespace, + v1Pool.ObjectMeta.Name, + topLevelCondition.Type, + topLevelCondition.Status, + topLevelCondition.Reason, + topLevelCondition.Message, + )) + } else { + llmSvc.MarkInferencePoolNotReady("InferencePoolNotReady", + fmt.Sprintf("Neither v1 nor v1alpha2 InferencePool %s/%s is ready", llmSvc.Namespace, poolName)) + } + logger.V(2).Info("Neither v1 nor v1alpha2 InferencePool is ready", "pool", poolName) return nil } diff --git a/pkg/controller/llmisvc/router_discovery.go b/pkg/controller/llmisvc/router_discovery.go index 63f3d8a3502..7eab7b256d6 100644 --- a/pkg/controller/llmisvc/router_discovery.go +++ b/pkg/controller/llmisvc/router_discovery.go @@ -23,6 +23,7 @@ import ( "math" "net" "slices" + "strconv" "strings" "k8s.io/apimachinery/pkg/api/meta" @@ -33,7 +34,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/log" - igwapi "sigs.k8s.io/gateway-api-inference-extension/api/v1alpha2" + igwv1 "sigs.k8s.io/gateway-api-inference-extension/api/v1" gatewayapi "sigs.k8s.io/gateway-api/apis/v1" "github.com/kserve/kserve/pkg/apis/serving/v1alpha1" @@ -130,7 +131,7 @@ func extractRoutePath(route *gatewayapi.HTTPRoute) string { for _, rule := range route.Spec.Rules { serviceFound := false for _, backendRef := range rule.BackendRefs { - if backendRef.Kind == &serviceKind { + if backendRef.Kind != nil && *backendRef.Kind == serviceKind { serviceFound = true break } @@ -233,7 +234,7 @@ func combineIntoURLs(hostnames []string, scheme string, port gatewayapi.PortNumb func joinHostPort(host string, port *gatewayapi.PortNumber) string { if port != nil && *port != 0 { - return net.JoinHostPort(host, fmt.Sprint(*port)) + return net.JoinHostPort(host, strconv.Itoa(int(*port))) } return host } @@ -367,7 +368,7 @@ func nonReadyHTTPRouteTopLevelCondition(llmSvc *v1alpha1.LLMInferenceService, ro } // IsInferencePoolReady checks if an InferencePool has been accepted by all parents. -func IsInferencePoolReady(pool *igwapi.InferencePool) bool { +func IsInferencePoolReady(pool *igwv1.InferencePool) bool { if pool == nil || len(pool.Status.Parents) == 0 { return false } @@ -379,19 +380,32 @@ func IsInferencePoolReady(pool *igwapi.InferencePool) bool { return true } -func nonReadyInferencePoolTopLevelCondition(pool *igwapi.InferencePool) (*metav1.Condition, bool) { +func nonReadyInferencePoolTopLevelCondition(pool *igwv1.InferencePool) (*metav1.Condition, bool) { if pool == nil { return nil, true } for _, parent := range pool.Status.Parents { - cond := meta.FindStatusCondition(parent.Conditions, string(igwapi.InferencePoolConditionAccepted)) - if cond == nil { + // Check Accepted condition + acceptedCond := meta.FindStatusCondition(parent.Conditions, string(igwv1.InferencePoolConditionAccepted)) + if acceptedCond == nil { return nil, true } - staleCondition := cond.ObservedGeneration > 0 && cond.ObservedGeneration < pool.Generation - if cond.Status != metav1.ConditionTrue || staleCondition { - return cond, false + staleAcceptedCondition := acceptedCond.ObservedGeneration > 0 && acceptedCond.ObservedGeneration < pool.ObjectMeta.Generation + if acceptedCond.Status != metav1.ConditionTrue || staleAcceptedCondition { + return acceptedCond, false + } + + // Check ResolvedRefs condition - critical for ensuring Gateway Controller can route to this pool + // Without this check, we might mark a pool as "ready" even though the Gateway Controller + // doesn't support the API version yet (e.g., v1 when only v1alpha2 controller is installed) + resolvedRefsCond := meta.FindStatusCondition(parent.Conditions, string(igwv1.InferencePoolConditionResolvedRefs)) + if resolvedRefsCond == nil { + return nil, true + } + staleResolvedRefsCondition := resolvedRefsCond.ObservedGeneration > 0 && resolvedRefsCond.ObservedGeneration < pool.ObjectMeta.Generation + if resolvedRefsCond.Status != metav1.ConditionTrue || staleResolvedRefsCondition { + return resolvedRefsCond, false } } diff --git a/pkg/controller/llmisvc/scheduler.go b/pkg/controller/llmisvc/scheduler.go index 050657df44d..333c0e67067 100644 --- a/pkg/controller/llmisvc/scheduler.go +++ b/pkg/controller/llmisvc/scheduler.go @@ -18,6 +18,7 @@ package llmisvc import ( "context" + "errors" "fmt" "maps" "slices" @@ -26,20 +27,50 @@ import ( "k8s.io/utils/ptr" "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/client-go/util/retry" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" rbacv1 "k8s.io/api/rbac/v1" "k8s.io/apimachinery/pkg/api/equality" + apierrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/intstr" "knative.dev/pkg/kmeta" + crclient "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/log" - igwapi "sigs.k8s.io/gateway-api-inference-extension/api/v1alpha2" + igwv1 "sigs.k8s.io/gateway-api-inference-extension/api/v1" + gwapiv1 "sigs.k8s.io/gateway-api/apis/v1" "github.com/kserve/kserve/pkg/apis/serving/v1alpha1" ) +const ( + // AnnotationInferencePoolMigrated records when the HTTPRoute has migrated to v1 InferencePool. + // Once set to "v1", traffic will never fall back to v1alpha2 even during transient failures. + // This implements a one-way migration strategy to prevent oscillation. + // This annotation is stored on child objects (HTTPRoute) rather than the parent LLMInferenceService + // to follow the pattern of never modifying user-managed objects. + AnnotationInferencePoolMigrated = "serving.kserve.io/inference-pool-migrated" +) + +// GVRInferencePoolV1Alpha2 is the GroupVersionResource for v1alpha2 InferencePool +var GVRInferencePoolV1Alpha2 = schema.GroupVersionResource{ + Group: "inference.networking.x-k8s.io", + Version: "v1alpha2", + Resource: "inferencepools", +} + +// GVRInferenceModelV1Alpha2 is the GroupVersionResource for v1alpha2 InferenceModel +var GVRInferenceModelV1Alpha2 = schema.GroupVersionResource{ + Group: "inference.networking.x-k8s.io", + Version: "v1alpha2", + Resource: "inferencemodels", +} + func (r *LLMInferenceServiceReconciler) reconcileScheduler(ctx context.Context, llmSvc *v1alpha1.LLMInferenceService) error { log.FromContext(ctx).Info("Reconciling Scheduler") @@ -137,15 +168,43 @@ func (r *LLMInferenceServiceReconciler) reconcileSchedulerDeployment(ctx context } func (r *LLMInferenceServiceReconciler) reconcileSchedulerInferencePool(ctx context.Context, llmSvc *v1alpha1.LLMInferenceService) error { + // If router/scheduler disabled or BYO pool (HasRef), delete both variants and exit. expected := r.expectedSchedulerInferencePool(ctx, llmSvc) - if llmSvc.Spec.Router == nil || llmSvc.Spec.Router.Scheduler == nil || llmSvc.Spec.Router.Scheduler.Template == nil || llmSvc.Spec.Router.Scheduler.Pool.HasRef() { - return Delete(ctx, r, llmSvc, expected) + if llmSvc.Spec.Router == nil || llmSvc.Spec.Router.Scheduler == nil || llmSvc.Spec.Router.Scheduler.Pool.HasRef() { + if err := Delete(ctx, r, llmSvc, expected); err != nil { // v1 typed + return err + } + return r.deleteAlpha2PoolIfExists(ctx, llmSvc) // best-effort alpha2 } - if err := Reconcile(ctx, r, llmSvc, &igwapi.InferencePool{}, expected, semanticInferencePoolIsEqual); err != nil { + // 1) Ensure v1 InferencePool (typed) exists/updated. + if err := Reconcile(ctx, r, llmSvc, &igwv1.InferencePool{}, expected, semanticInferencePoolIsEqual); err != nil { return err } - // TODO add inference pool condition propagation and then aggregate it into "RouterReady" similar to WorkloadReady. + + // 2) Ensure v1alpha2 InferencePool (dynamic) exists/updated. + if err := r.reconcileAlpha2Pool(ctx, llmSvc, expected); err != nil { + return err + } + + // Fetch current v1 and v1alpha2 pool readiness for migration logic. + cur := &igwv1.InferencePool{} + v1Ready := false + if err := r.Client.Get(ctx, crclient.ObjectKey{ + Namespace: expected.Namespace, + Name: expected.Name, + }, cur); err == nil { + v1Ready = isV1PoolReady(cur) + } + + alpha2Ready := r.isAlpha2PoolReady(ctx, llmSvc.GetNamespace(), expected.GetName()) + + // Reconcile one-way migration from v1alpha2 to v1 InferencePool + // This updates HTTPRoute backend weights based on which pool is ready + if err := r.reconcileInferencePoolMigration(ctx, llmSvc, v1Ready, alpha2Ready); err != nil { + return fmt.Errorf("failed to reconcile InferencePool migration: %w", err) + } + return nil } @@ -162,16 +221,55 @@ func (r *LLMInferenceServiceReconciler) reconcileSchedulerService(ctx context.Co return nil } +// reconcileSchedulerInferenceModel manages the v1alpha2 InferenceModel resource using the dynamic client. +// This follows the same Reconcile pattern as reconcileAlpha2Pool: Get -> Create if missing, or Update if different. +// The InferenceModel tells the scheduler which model to route requests for. func (r *LLMInferenceServiceReconciler) reconcileSchedulerInferenceModel(ctx context.Context, llmSvc *v1alpha1.LLMInferenceService) error { - expected := r.expectedSchedulerInferenceModel(ctx, llmSvc) - if llmSvc.Spec.Router == nil || llmSvc.Spec.Router.Scheduler == nil || llmSvc.Spec.Router.Scheduler.Template == nil || llmSvc.Spec.Router.Scheduler.Pool.HasRef() { - return Delete(ctx, r, llmSvc, expected) + // Clean up InferenceModel if scheduler is disabled + if llmSvc.Spec.Router == nil || llmSvc.Spec.Router.Scheduler == nil { + return r.deleteAlpha2InferenceModelIfExists(ctx, llmSvc) } - if err := Reconcile(ctx, r, llmSvc, &igwapi.InferenceModel{}, expected, semanticInferenceModelIsEqual); err != nil { - return err + expected := r.expectedAlpha2InferenceModel(llmSvc) + res := r.DynamicClient.Resource(GVRInferenceModelV1Alpha2).Namespace(expected.GetNamespace()) + + // Try to fetch the existing v1alpha2 InferenceModel + curr, err := res.Get(ctx, expected.GetName(), metav1.GetOptions{}) + if err != nil { + // If not found or CRD not installed, create it + if !apierrors.IsNotFound(err) && !meta.IsNoMatchError(err) { + return fmt.Errorf("failed to get v1alpha2 InferenceModel %s/%s: %w", expected.GetNamespace(), expected.GetName(), err) + } + // Create new v1alpha2 InferenceModel + if _, err := res.Create(ctx, expected, metav1.CreateOptions{}); err != nil { + return fmt.Errorf("failed to create v1alpha2 InferenceModel %s/%s: %w", expected.GetNamespace(), expected.GetName(), err) + } + r.EventRecorder.Eventf(llmSvc, corev1.EventTypeNormal, "Created", "Created v1alpha2 InferenceModel %s/%s", expected.GetNamespace(), expected.GetName()) + return nil } + // Verify this model is owned by our LLMInferenceService + if !metav1.IsControlledBy(curr, llmSvc) { + return fmt.Errorf("failed to update v1alpha2 InferenceModel %s/%s: it is not controlled by LLMInferenceService %s/%s", + curr.GetNamespace(), curr.GetName(), + llmSvc.Namespace, llmSvc.Name, + ) + } + + // Copy resource version for update + expected.SetResourceVersion(curr.GetResourceVersion()) + + // Skip update if nothing has changed + if semanticUnstructuredInferenceModelIsEqual(expected, curr) { + return nil + } + + // Update the v1alpha2 InferenceModel with new spec/labels/annotations + if _, err := res.Update(ctx, expected, metav1.UpdateOptions{}); err != nil { + return fmt.Errorf("failed to update v1alpha2 InferenceModel %s/%s: %w", expected.GetNamespace(), expected.GetName(), err) + } + + r.EventRecorder.Eventf(llmSvc, corev1.EventTypeNormal, "Updated", "Updated v1alpha2 InferenceModel %s/%s", expected.GetNamespace(), expected.GetName()) return nil } @@ -232,10 +330,11 @@ func (r *LLMInferenceServiceReconciler) expectedSchedulerService(ctx context.Con return svc } -func (r *LLMInferenceServiceReconciler) expectedSchedulerInferencePool(ctx context.Context, llmSvc *v1alpha1.LLMInferenceService) *igwapi.InferencePool { +func (r *LLMInferenceServiceReconciler) expectedSchedulerInferencePool(ctx context.Context, llmSvc *v1alpha1.LLMInferenceService) *igwv1.InferencePool { labels := SchedulerLabels(llmSvc) + logger := log.FromContext(ctx) - ip := &igwapi.InferencePool{ + ip := &igwv1.InferencePool{ ObjectMeta: metav1.ObjectMeta{ Name: kmeta.ChildName(llmSvc.GetName(), "-inference-pool"), Namespace: llmSvc.GetNamespace(), @@ -245,44 +344,70 @@ func (r *LLMInferenceServiceReconciler) expectedSchedulerInferencePool(ctx conte }, }, } + + // Convert KServe-native pool spec to GIE v1 spec if llmSvc.Spec.Router != nil && llmSvc.Spec.Router.Scheduler != nil && llmSvc.Spec.Router.Scheduler.Pool != nil && llmSvc.Spec.Router.Scheduler.Pool.Spec != nil { - ip.Spec = *llmSvc.Spec.Router.Scheduler.Pool.Spec.DeepCopy() + v1Spec, err := ConvertKServePoolToV1(llmSvc.Spec.Router.Scheduler.Pool.Spec) + if err != nil { + logger.Error(err, "Failed to convert KServe pool spec to v1", "pool", llmSvc.Spec.Router.Scheduler.Pool.Spec) + // Return pool with empty spec rather than nil to avoid panic + return ip + } + if v1Spec != nil { + ip.Spec = *v1Spec + } } - log.FromContext(ctx).V(2).Info("Expected router InferencePool", "inferencepool", ip) + logger.V(2).Info("Expected router InferencePool", "inferencepool", ip) return ip } -func (r *LLMInferenceServiceReconciler) expectedSchedulerInferenceModel(ctx context.Context, llmSvc *v1alpha1.LLMInferenceService) *igwapi.InferenceModel { - labels := SchedulerLabels(llmSvc) +// Build v1alpha2 InferenceModel unstructured. +// NOTE: We avoid v1 typed IM (doesn't exist). We write the fields the scheduler expects. +func (r *LLMInferenceServiceReconciler) expectedAlpha2InferenceModel(llmSvc *v1alpha1.LLMInferenceService) *unstructured.Unstructured { + name := kmeta.ChildName(llmSvc.Name, "-inference-model") + group := "inference.networking.k8s.io" // pool group we target - updated to v1 group + poolName := llmSvc.Spec.Router.Scheduler.InferencePoolName(llmSvc) - im := &igwapi.InferenceModel{ - ObjectMeta: metav1.ObjectMeta{ - Name: kmeta.ChildName(llmSvc.GetName(), "-inference-model"), - Namespace: llmSvc.GetNamespace(), - Labels: labels, - OwnerReferences: []metav1.OwnerReference{ - *metav1.NewControllerRef(llmSvc, v1alpha1.LLMInferenceServiceGVK), + // Default modelName to resource name if spec.model.name is empty. + modelName := ptr.Deref(llmSvc.Spec.Model.Name, llmSvc.Name) + + // Default criticality to "Critical" if not set (keeps old behavior). + criticality := "Critical" + if llmSvc.Spec.Model.Criticality != nil && *llmSvc.Spec.Model.Criticality != "" { + criticality = string(*llmSvc.Spec.Model.Criticality) + } + + return &unstructured.Unstructured{ + Object: map[string]any{ + "apiVersion": "inference.networking.x-k8s.io/v1alpha2", + "kind": "InferenceModel", + "metadata": map[string]any{ + "name": name, + "namespace": llmSvc.Namespace, + "labels": SchedulerLabels(llmSvc), + "ownerReferences": []any{ + map[string]any{ + "apiVersion": v1alpha1.LLMInferenceServiceGVK.GroupVersion().String(), + "kind": v1alpha1.LLMInferenceServiceGVK.Kind, + "name": llmSvc.Name, + "uid": string(llmSvc.UID), + "controller": true, + }, + }, }, - }, - Spec: igwapi.InferenceModelSpec{ - ModelName: ptr.Deref(llmSvc.Spec.Model.Name, llmSvc.GetName()), - PoolRef: igwapi.PoolObjectReference{ - Group: "inference.networking.x-k8s.io", - Kind: "InferencePool", - Name: igwapi.ObjectName(kmeta.ChildName(llmSvc.GetName(), "-inference-pool")), + "spec": map[string]any{ + "modelName": modelName, + "poolRef": map[string]any{ + "group": group, + "kind": "InferencePool", + "name": poolName, + }, + "criticality": criticality, }, - Criticality: llmSvc.Spec.Model.Criticality, }, } - if im.Spec.Criticality == nil { - im.Spec.Criticality = ptr.To(igwapi.Critical) - } - - log.FromContext(ctx).V(2).Info("Expected InferenceModel", "inferencemodel", im) - - return im } func (r *LLMInferenceServiceReconciler) expectedSchedulerDeployment(ctx context.Context, llmSvc *v1alpha1.LLMInferenceService) *appsv1.Deployment { @@ -441,8 +566,8 @@ func (r *LLMInferenceServiceReconciler) expectedSchedulerRole(llmSvc *v1alpha1.L }, Rules: []rbacv1.PolicyRule{ {APIGroups: []string{""}, Resources: []string{"pods"}, Verbs: []string{"get", "list", "watch"}}, - {APIGroups: []string{"inference.networking.x-k8s.io"}, Resources: []string{"inferencepools", "inferenceobjectives"}, Verbs: []string{"get", "list", "watch"}}, - {APIGroups: []string{"inference.networking.k8s.io"}, Resources: []string{"inferencepools"}, Verbs: []string{"get", "list", "watch"}}, + {APIGroups: []string{"inference.networking.x-k8s.io"}, Resources: []string{"inferencepools", "inferencemodels", "inferenceobjectives"}, Verbs: []string{"get", "list", "watch"}}, + {APIGroups: []string{"inference.networking.k8s.io"}, Resources: []string{"inferencepools", "inferencemodels"}, Verbs: []string{"get", "list", "watch"}}, {APIGroups: []string{"discovery.k8s.io"}, Resources: []string{"endpointslices"}, Verbs: []string{"get", "list", "watch"}}, }, } @@ -479,18 +604,28 @@ func semanticServiceIsEqual(expected *corev1.Service, current *corev1.Service) b equality.Semantic.DeepDerivative(expected.Annotations, current.Annotations) } -func semanticInferenceModelIsEqual(expected *igwapi.InferenceModel, current *igwapi.InferenceModel) bool { - return equality.Semantic.DeepDerivative(expected.Spec, current.Spec) && - equality.Semantic.DeepDerivative(expected.Labels, current.Labels) && - equality.Semantic.DeepDerivative(expected.Annotations, current.Annotations) -} - -func semanticInferencePoolIsEqual(expected *igwapi.InferencePool, curr *igwapi.InferencePool) bool { +func semanticInferencePoolIsEqual(expected *igwv1.InferencePool, curr *igwv1.InferencePool) bool { return equality.Semantic.DeepDerivative(expected.Spec, curr.Spec) && equality.Semantic.DeepDerivative(expected.Labels, curr.Labels) && equality.Semantic.DeepDerivative(expected.Annotations, curr.Annotations) } +func semanticUnstructuredInferencePoolIsEqual(expected, curr *unstructured.Unstructured) bool { + expectedSpec, _, _ := unstructured.NestedMap(expected.Object, "spec") + currSpec, _, _ := unstructured.NestedMap(curr.Object, "spec") + return equality.Semantic.DeepDerivative(expectedSpec, currSpec) && + equality.Semantic.DeepDerivative(expected.GetLabels(), curr.GetLabels()) && + equality.Semantic.DeepDerivative(expected.GetAnnotations(), curr.GetAnnotations()) +} + +func semanticUnstructuredInferenceModelIsEqual(expected, curr *unstructured.Unstructured) bool { + expectedSpec, _, _ := unstructured.NestedMap(expected.Object, "spec") + currSpec, _, _ := unstructured.NestedMap(curr.Object, "spec") + return equality.Semantic.DeepDerivative(expectedSpec, currSpec) && + equality.Semantic.DeepDerivative(expected.GetLabels(), curr.GetLabels()) && + equality.Semantic.DeepDerivative(expected.GetAnnotations(), curr.GetAnnotations()) +} + func semanticServiceAccountIsEqual(expected *corev1.ServiceAccount, current *corev1.ServiceAccount) bool { return equality.Semantic.DeepDerivative(expected.Secrets, current.Secrets) && equality.Semantic.DeepDerivative(expected.ImagePullSecrets, current.ImagePullSecrets) && @@ -525,3 +660,493 @@ func SchedulerLabels(llmSvc *v1alpha1.LLMInferenceService) map[string]string { "app.kubernetes.io/part-of": "llminferenceservice", } } + +// consider pool "Ready" if any Parent has Accepted=True AND ResolvedRefs=True +func isV1PoolReady(p *igwv1.InferencePool) bool { + for _, ps := range p.Status.Parents { + accepted, resolved := false, false + for _, c := range ps.Conditions { + // c.Type is string, c.Status is ConditionStatus (string alias) - no conversion needed + if c.Type == "Accepted" && c.Status == "True" { + accepted = true + } + if c.Type == "ResolvedRefs" && c.Status == "True" { + resolved = true + } + } + if accepted && resolved { + return true + } + } + return false +} + +// alpha2 check via dynamic client +func (r *LLMInferenceServiceReconciler) isAlpha2PoolReady(ctx context.Context, ns, name string) bool { + u, err := r.DynamicClient.Resource(GVRInferencePoolV1Alpha2).Namespace(ns).Get(ctx, name, metav1.GetOptions{}) + if err != nil { + return false + } + parent, _, _ := unstructured.NestedSlice(u.Object, "status", "parent") + for _, p := range parent { + pm, _ := p.(map[string]any) + conds, _, _ := unstructured.NestedSlice(pm, "conditions") + accepted, resolved := false, false + for _, cc := range conds { + cm, _ := cc.(map[string]any) + if cm["type"] == "Accepted" && cm["status"] == "True" { + accepted = true + } + if cm["type"] == "ResolvedRefs" && cm["status"] == "True" { + resolved = true + } + } + if accepted && resolved { + return true + } + } + return false +} + +// reconcileInferencePoolMigration implements one-way migration from v1alpha2 to v1 InferencePool. +// +// Migration Strategy: +// - Initially, traffic goes to v1alpha2 while v1 is being set up +// - Once v1 becomes ready for the first time, we permanently switch all traffic to v1 +// - We NEVER fall back to v1alpha2, even during transient v1 failures +// - This prevents flapping between versions and makes migration predictable +// +// The migration state is stored in an annotation on the HTTPRoute (not the LLMInferenceService), +// following the pattern of not modifying user-managed objects. +func (r *LLMInferenceServiceReconciler) reconcileInferencePoolMigration(ctx context.Context, llmSvc *v1alpha1.LLMInferenceService, v1Ready, alpha2Ready bool) error { + // Skip if this service doesn't have a managed HTTPRoute + if !shouldReconcileMigration(llmSvc) { + return nil + } + + // Get the HTTPRoute key for later retries + routeKey := crclient.ObjectKey{ + Namespace: llmSvc.Namespace, + Name: kmeta.ChildName(llmSvc.Name, "-kserve-route"), + } + + // Initial check: Get the HTTPRoute to see if it exists + route := &gwapiv1.HTTPRoute{} + if err := r.Client.Get(ctx, routeKey, route); err != nil { + if apierrors.IsNotFound(err) { + // Route doesn't exist yet, will be created in next reconcile + return nil + } + return fmt.Errorf("failed to get HTTPRoute: %w", err) + } + + // Calculate which pool(s) should receive traffic based on readiness and migration state (initial check) + weights, _ := determineMigrationWeights(ctx, route, v1Ready, alpha2Ready) + if weights == nil { + // Neither pool ready yet - don't change anything + return nil + } + + // Update the HTTPRoute with retry logic to handle resource version conflicts + return retry.RetryOnConflict(retry.DefaultRetry, func() error { + // Get the latest version of the HTTPRoute + latest := &gwapiv1.HTTPRoute{} + if err := r.Client.Get(ctx, routeKey, latest); err != nil { + return fmt.Errorf("failed to get latest HTTPRoute: %w", err) + } + + // Recalculate migration weights based on the latest HTTPRoute state + // This ensures we make the right decision even if the HTTPRoute was modified + latestWeights, latestNeedsAnnotation := determineMigrationWeights(ctx, latest, v1Ready, alpha2Ready) + if latestWeights == nil { + // Neither pool ready yet - don't change anything + return nil + } + + // Update the backend weights in the HTTPRoute spec + modified := applyWeightsToHTTPRoute(ctx, latest, latestWeights.v1Weight, latestWeights.alpha2Weight) + + // Mark that we've migrated to v1 (one-time annotation update) + if latestNeedsAnnotation { + if latest.Annotations == nil { + latest.Annotations = make(map[string]string) + } + latest.Annotations[AnnotationInferencePoolMigrated] = "v1" + modified = true + log.FromContext(ctx).Info("Marking migration to v1 in HTTPRoute annotation") + } + + // Save changes to the HTTPRoute if there were any modifications + if modified { + log.FromContext(ctx).V(1).Info("Updating HTTPRoute with new traffic weights and/or migration state", + "v1Weight", latestWeights.v1Weight, "alpha2Weight", latestWeights.alpha2Weight) + if err := r.Client.Update(ctx, latest); err != nil { + return err + } + } + + return nil + }) +} + +// shouldReconcileMigration checks if migration reconciliation should proceed. +// We only manage migration for controller-managed HTTPRoutes (not user-provided ones). +func shouldReconcileMigration(llmSvc *v1alpha1.LLMInferenceService) bool { + // Check if routing is configured at all + if llmSvc.Spec.Router == nil || llmSvc.Spec.Router.Route == nil || llmSvc.Spec.Router.Route.HTTP == nil { + return false + } + // Don't touch user-managed routes + if llmSvc.Spec.Router.Route.HTTP.HasRefs() { + return false + } + // Only proceed if we have a spec to manage + if !llmSvc.Spec.Router.Route.HTTP.HasSpec() { + return false + } + return true +} + +// migrationWeights holds the calculated traffic distribution between v1 and v1alpha2 InferencePools. +// Weights are in the range [0, 100] and should sum to 100 when both are present. +type migrationWeights struct { + v1Weight int32 // Percentage of traffic to v1 InferencePool (0-100) + alpha2Weight int32 // Percentage of traffic to v1alpha2 InferencePool (0-100) +} + +// determineMigrationWeights calculates traffic weights based on pool readiness and migration state. +// +// Decision flow: +// 1. If already migrated (annotation present) -> always use v1 (100/0) +// 2. If v1 is ready for first time AND Gateway Controller supports it -> migrate to v1 permanently (100/0) and mark annotation +// 3. If only v1alpha2 is ready -> use v1alpha2 temporarily (0/100) +// 4. If neither ready -> return nil to keep existing weights +// +// Returns: (weights, needsAnnotationUpdate) +func determineMigrationWeights(ctx context.Context, route *gwapiv1.HTTPRoute, v1Ready, alpha2Ready bool) (*migrationWeights, bool) { + logger := log.FromContext(ctx) + + // Check if migration is already complete (one-way decision stored in annotation) + if route.Annotations != nil && route.Annotations[AnnotationInferencePoolMigrated] == "v1" { + // Already migrated - stick with v1 even if it's temporarily not ready + logger.V(2).Info("Using v1 InferencePool (migration complete, no fallback)") + return &migrationWeights{v1Weight: 100, alpha2Weight: 0}, false + } + + // Check if the Gateway Controller can actually resolve v1 backend refs + v1ResolvableByGateway := isV1BackendResolvable(route) + + // Migration not complete yet - decide based on current readiness + if v1Ready && v1ResolvableByGateway { + // v1 is ready AND Gateway Controller supports it - make the one-time migration decision + logger.Info("Migrating to v1 InferencePool permanently (first time v1 ready and Gateway Controller supports it)") + return &migrationWeights{v1Weight: 100, alpha2Weight: 0}, true + } + + if alpha2Ready { + // v1 not ready yet or Gateway Controller doesn't support it - use v1alpha2 as fallback + if v1Ready && !v1ResolvableByGateway { + logger.Info("v1 InferencePool ready but Gateway Controller doesn't support it yet, using v1alpha2") + } else { + logger.V(2).Info("Using v1alpha2 InferencePool (v1 not ready yet)") + } + return &migrationWeights{v1Weight: 0, alpha2Weight: 100}, false + } + + // Neither pool ready yet - don't change weights (avoid thrashing during startup) + logger.V(2).Info("Neither pool ready yet, keeping existing weights") + return nil, false +} + +// isV1BackendResolvable checks if the Gateway Controller can resolve v1 InferencePool backend refs. +// This is important because the InferencePool resource itself might be ready (Accepted=True), +// but the Gateway Controller might not support the v1 API version yet (e.g., in OpenShift). +// We check the HTTPRoute's parent status to see if ResolvedRefs=True. +func isV1BackendResolvable(route *gwapiv1.HTTPRoute) bool { + // Check all parent statuses in the HTTPRoute + for _, parent := range route.Status.RouteStatus.Parents { + // Look for ResolvedRefs condition + for _, cond := range parent.Conditions { + if cond.Type == "ResolvedRefs" { + // If ResolvedRefs is False with reason InvalidKind, the Gateway Controller doesn't support v1 + if cond.Status == "False" && cond.Reason == "InvalidKind" { + return false + } + // If ResolvedRefs is True, the Gateway Controller can resolve all backend refs + if cond.Status == "True" { + return true + } + } + } + } + + // If no ResolvedRefs condition found or status is unclear, be conservative and assume not resolvable + // This prevents premature migration before the Gateway Controller has evaluated the route + return false +} + +// applyWeightsToHTTPRoute updates the backendRef weights in the HTTPRoute. +// It iterates through all backend refs and updates the weight for v1 and v1alpha2 InferencePools. +// Returns true if any weights were changed. +func applyWeightsToHTTPRoute(ctx context.Context, route *gwapiv1.HTTPRoute, v1Weight, alpha2Weight int32) bool { + logger := log.FromContext(ctx) + modified := false + + // Iterate through all rules and their backend refs + for i := range route.Spec.Rules { + for j := range route.Spec.Rules[i].BackendRefs { + ref := &route.Spec.Rules[i].BackendRefs[j] + + // Update v1 InferencePool weight (inference.networking.k8s.io) + if ref.Group != nil && string(*ref.Group) == "inference.networking.k8s.io" && + ref.Kind != nil && string(*ref.Kind) == "InferencePool" { + if ref.Weight == nil || *ref.Weight != v1Weight { + logger.V(1).Info("Updating v1 InferencePool weight", "old", ptr.Deref(ref.Weight, 0), "new", v1Weight) + ref.Weight = &v1Weight + modified = true + } + } + + // Update v1alpha2 InferencePool weight (inference.networking.x-k8s.io) + if ref.Group != nil && string(*ref.Group) == "inference.networking.x-k8s.io" && + ref.Kind != nil && string(*ref.Kind) == "InferencePool" { + if ref.Weight == nil || *ref.Weight != alpha2Weight { + logger.V(1).Info("Updating v1alpha2 InferencePool weight", "old", ptr.Deref(ref.Weight, 0), "new", alpha2Weight) + ref.Weight = &alpha2Weight + modified = true + } + } + } + } + + return modified +} + +// reconcileAlpha2Pool manages the v1alpha2 InferencePool resource using the dynamic client. +// This follows the standard Reconcile pattern: Get -> Create if missing, or Update if different. +// It ensures ownership and only updates when there are actual changes (semantic equality check). +func (r *LLMInferenceServiceReconciler) reconcileAlpha2Pool(ctx context.Context, llmSvc *v1alpha1.LLMInferenceService, v1pool *igwv1.InferencePool) error { + // Convert v1 typed pool to v1alpha2 unstructured format + expected, err := v1ToAlpha2Unstructured(v1pool) + if err != nil { + return err + } + + res := r.DynamicClient.Resource(GVRInferencePoolV1Alpha2).Namespace(expected.GetNamespace()) + + // Try to fetch the existing v1alpha2 InferencePool + curr, err := res.Get(ctx, expected.GetName(), metav1.GetOptions{}) + if err != nil { + // If not found or CRD not installed, create it + if !apierrors.IsNotFound(err) && !meta.IsNoMatchError(err) { + return fmt.Errorf("failed to get v1alpha2 InferencePool %s/%s: %w", expected.GetNamespace(), expected.GetName(), err) + } + // Create new v1alpha2 InferencePool + if _, err := res.Create(ctx, expected, metav1.CreateOptions{}); err != nil { + return fmt.Errorf("failed to create v1alpha2 InferencePool %s/%s: %w", expected.GetNamespace(), expected.GetName(), err) + } + r.EventRecorder.Eventf(llmSvc, corev1.EventTypeNormal, "Created", "Created v1alpha2 InferencePool %s/%s", expected.GetNamespace(), expected.GetName()) + return nil + } + + // Verify this pool is owned by our LLMInferenceService (prevents accidental overwrites) + if !metav1.IsControlledBy(curr, llmSvc) { + return fmt.Errorf("failed to update v1alpha2 InferencePool %s/%s: it is not controlled by LLMInferenceService %s/%s", + curr.GetNamespace(), curr.GetName(), + llmSvc.Namespace, llmSvc.Name, + ) + } + + // Copy resource version so we can update the existing object + expected.SetResourceVersion(curr.GetResourceVersion()) + + // Skip update if nothing has changed (avoids unnecessary API calls and reconciles) + if semanticUnstructuredInferencePoolIsEqual(expected, curr) { + return nil + } + + // Update the v1alpha2 InferencePool with new spec/labels/annotations + if _, err := res.Update(ctx, expected, metav1.UpdateOptions{}); err != nil { + return fmt.Errorf("failed to update v1alpha2 InferencePool %s/%s: %w", expected.GetNamespace(), expected.GetName(), err) + } + + r.EventRecorder.Eventf(llmSvc, corev1.EventTypeNormal, "Updated", "Updated v1alpha2 InferencePool %s/%s", expected.GetNamespace(), expected.GetName()) + return nil +} + +func (r *LLMInferenceServiceReconciler) deleteAlpha2PoolIfExists(ctx context.Context, llmSvc *v1alpha1.LLMInferenceService) error { + name := kmeta.ChildName(llmSvc.Name, "-inference-pool") + res := r.DynamicClient.Resource(GVRInferencePoolV1Alpha2).Namespace(llmSvc.Namespace) + _, err := res.Get(ctx, name, metav1.GetOptions{}) + if err != nil { + // If resource doesn't exist (NotFound), that's fine - nothing to delete + if apierrors.IsNotFound(err) { + return nil + } + // For other errors, propagate them + return err + } + return res.Delete(ctx, name, metav1.DeleteOptions{}) +} + +func (r *LLMInferenceServiceReconciler) deleteAlpha2InferenceModelIfExists(ctx context.Context, llmSvc *v1alpha1.LLMInferenceService) error { + name := kmeta.ChildName(llmSvc.Name, "-inference-model") + res := r.DynamicClient.Resource(GVRInferenceModelV1Alpha2).Namespace(llmSvc.Namespace) + _, err := res.Get(ctx, name, metav1.GetOptions{}) + if err != nil { + // If resource doesn't exist (NotFound) or CRD not installed, that's fine + if apierrors.IsNotFound(err) { + return nil + } + // For other errors, propagate them + return err + } + return res.Delete(ctx, name, metav1.DeleteOptions{}) +} + +// Convert the typed v1 pool to a v1alpha2 unstructured object. +// NOTE: v1 uses typed LabelKey/LabelValue and non-pointer Kind/Number/FailureMode. +// We convert keys/values to strings and use "" / >0 checks instead of nil checks. +func v1ToAlpha2Unstructured(v1p *igwv1.InferencePool) (*unstructured.Unstructured, error) { + if v1p == nil { + return nil, errors.New("nil v1 pool") + } + + // selector: v1 -> v1alpha2 (string map) + selector := map[string]any{} + if v1p.Spec.Selector.MatchLabels != nil { + for k, v := range v1p.Spec.Selector.MatchLabels { + selector[string(k)] = string(v) // v1 uses typed keys/values; alpha2 wants plain strings + } + } + + // target port: v1 TargetPorts[0].Number -> alpha2 targetPortNumber (int64) + if len(v1p.Spec.TargetPorts) == 0 { + return nil, errors.New("spec.targetPorts[0] required") + } + tp := int64(v1p.Spec.TargetPorts[0].Number) // Number is a non-pointer alias (int32) + + // endpointPickerRef -> extensionRef + // IMPORTANT: Kind/Group/FailureMode are value types in v1, not pointers. + ext := map[string]any{ + "name": string(v1p.Spec.EndpointPickerRef.Name), + } + if v1p.Spec.EndpointPickerRef.Group != nil && *v1p.Spec.EndpointPickerRef.Group != "" { + ext["group"] = string(*v1p.Spec.EndpointPickerRef.Group) // ✅ deref the *Group + } + if s := string(v1p.Spec.EndpointPickerRef.Kind); s != "" { + ext["kind"] = s + } + if v1p.Spec.EndpointPickerRef.Port != nil && v1p.Spec.EndpointPickerRef.Port.Number > 0 { + ext["portNumber"] = int64(v1p.Spec.EndpointPickerRef.Port.Number) + } + if s := string(v1p.Spec.EndpointPickerRef.FailureMode); s != "" { + ext["failureMode"] = s + } + + metadata := map[string]any{ + "name": v1p.ObjectMeta.Name, + "namespace": v1p.ObjectMeta.Namespace, + } + if v1p.ObjectMeta.Labels != nil { + metadata["labels"] = v1p.ObjectMeta.Labels + } + if v1p.ObjectMeta.Annotations != nil { + metadata["annotations"] = v1p.ObjectMeta.Annotations + } + + // Convert ownerReferences to unstructured format + if len(v1p.ObjectMeta.OwnerReferences) > 0 { + ownerRefs := make([]any, len(v1p.ObjectMeta.OwnerReferences)) + for i, ref := range v1p.ObjectMeta.OwnerReferences { + ownerRef := map[string]any{ + "apiVersion": ref.APIVersion, + "kind": ref.Kind, + "name": ref.Name, + "uid": string(ref.UID), + } + if ref.Controller != nil { + ownerRef["controller"] = *ref.Controller + } + if ref.BlockOwnerDeletion != nil { + ownerRef["blockOwnerDeletion"] = *ref.BlockOwnerDeletion + } + ownerRefs[i] = ownerRef + } + metadata["ownerReferences"] = ownerRefs + } + + u := &unstructured.Unstructured{ + Object: map[string]any{ + "apiVersion": "inference.networking.x-k8s.io/v1alpha2", + "kind": "InferencePool", + "metadata": metadata, + "spec": map[string]any{ + "selector": selector, + "targetPortNumber": tp, + "extensionRef": ext, + }, + }, + } + return u, nil +} + +// ConvertKServePoolToV1 converts KServe-native InferencePoolSpec to GIE v1 InferencePoolSpec. +// This allows the CRD to use plain string types while the controller creates typed v1 resources. +func ConvertKServePoolToV1(kservePool *v1alpha1.KServeInferencePoolSpec) (*igwv1.InferencePoolSpec, error) { + if kservePool == nil { + return nil, nil + } + + // Convert selector: map[string]string -> map[LabelKey]LabelValue + matchLabels := make(map[igwv1.LabelKey]igwv1.LabelValue) + for k, v := range kservePool.Selector.MatchLabels { + matchLabels[igwv1.LabelKey(k)] = igwv1.LabelValue(v) + } + + // Convert target ports + targetPorts := make([]igwv1.Port, 0, len(kservePool.TargetPorts)) + for _, p := range kservePool.TargetPorts { + targetPorts = append(targetPorts, igwv1.Port{ + Number: igwv1.PortNumber(p.Number), + }) + } + + // Convert endpoint picker ref + eppRef := igwv1.EndpointPickerRef{ + Name: igwv1.ObjectName(kservePool.EndpointPickerRef.Name), + } + + // Group (optional pointer) + if kservePool.EndpointPickerRef.Group != nil { + group := igwv1.Group(*kservePool.EndpointPickerRef.Group) + eppRef.Group = &group + } + + // Kind (value type in v1, with default) + if kservePool.EndpointPickerRef.Kind != nil { + eppRef.Kind = igwv1.Kind(*kservePool.EndpointPickerRef.Kind) + } else { + eppRef.Kind = "Service" // default + } + + // Port (optional) + if kservePool.EndpointPickerRef.Port != nil { + eppRef.Port = &igwv1.Port{ + Number: igwv1.PortNumber(kservePool.EndpointPickerRef.Port.Number), + } + } + + // FailureMode (value type in v1, with default) + if kservePool.EndpointPickerRef.FailureMode != nil { + eppRef.FailureMode = igwv1.EndpointPickerFailureMode(*kservePool.EndpointPickerRef.FailureMode) + } else { + eppRef.FailureMode = "FailClose" // default + } + + return &igwv1.InferencePoolSpec{ + Selector: igwv1.LabelSelector{MatchLabels: matchLabels}, + TargetPorts: targetPorts, + EndpointPickerRef: eppRef, + }, nil +} diff --git a/pkg/controller/llmisvc/workload_tls_self_signed_istio.go b/pkg/controller/llmisvc/workload_tls_self_signed_istio.go index fe0fcfd86aa..239bcf1fda6 100644 --- a/pkg/controller/llmisvc/workload_tls_self_signed_istio.go +++ b/pkg/controller/llmisvc/workload_tls_self_signed_istio.go @@ -32,7 +32,7 @@ import ( "knative.dev/pkg/network" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/log" - igwapi "sigs.k8s.io/gateway-api-inference-extension/api/v1alpha2" + igwv1 "sigs.k8s.io/gateway-api-inference-extension/api/v1" "github.com/kserve/kserve/pkg/apis/serving/v1alpha1" ) @@ -167,12 +167,13 @@ func (r *LLMInferenceServiceReconciler) expectedIstioDestinationRuleForScheduler if llmSvc.Spec.Router != nil && llmSvc.Spec.Router.Scheduler != nil { name := llmSvc.Spec.Router.EPPServiceName(llmSvc) if llmSvc.Spec.Router.Scheduler.Pool.HasRef() { - pool := igwapi.InferencePool{} + pool := igwv1.InferencePool{} if err := r.Client.Get(ctx, client.ObjectKey{Name: llmSvc.Spec.Router.Scheduler.Pool.Ref.Name, Namespace: llmSvc.GetNamespace()}, &pool); err != nil { return nil, fmt.Errorf("failed to get inference pool %s/%s: %w", llmSvc.GetNamespace(), llmSvc.Spec.Router.Scheduler.Pool.Ref.Name, err) } - if pool.Spec.ExtensionRef != nil { - name = string(pool.Spec.ExtensionRef.Name) + // In v1, EndpointPickerRef is a value (not pointer), with Name as typed string. + if pool.Spec.EndpointPickerRef.Name != "" { + name = string(pool.Spec.EndpointPickerRef.Name) } } dr.Spec.Host = network.GetServiceHostname(name, llmSvc.GetNamespace()) diff --git a/pkg/controller/v1beta1/inferenceservice/components/explainer.go b/pkg/controller/v1beta1/inferenceservice/components/explainer.go index f0acb2b81e5..5ae9a832587 100644 --- a/pkg/controller/v1beta1/inferenceservice/components/explainer.go +++ b/pkg/controller/v1beta1/inferenceservice/components/explainer.go @@ -142,7 +142,7 @@ func (e *Explainer) Reconcile(ctx context.Context, isvc *v1beta1.InferenceServic isvc.Spec.Explainer.PodSpec.Containers[0] = *container } - podSpec := corev1.PodSpec(isvc.Spec.Explainer.PodSpec) + podSpec := isvc.Spec.Explainer.PodSpec.ToCorev1PodSpec() // Here we allow switch between knative and vanilla deployment if e.deploymentMode == constants.RawDeployment { diff --git a/pkg/controller/v1beta1/inferenceservice/components/predictor.go b/pkg/controller/v1beta1/inferenceservice/components/predictor.go index 0b7da3b1bff..97950f8bd9f 100644 --- a/pkg/controller/v1beta1/inferenceservice/components/predictor.go +++ b/pkg/controller/v1beta1/inferenceservice/components/predictor.go @@ -146,7 +146,7 @@ func (p *Predictor) Reconcile(ctx context.Context, isvc *v1beta1.InferenceServic } } else { predContainer = predictor.GetContainer(isvc.ObjectMeta, isvc.Spec.Predictor.GetExtensions(), p.inferenceServiceConfig) - podSpec = corev1.PodSpec(isvc.Spec.Predictor.PodSpec) + podSpec = isvc.Spec.Predictor.PodSpec.ToCorev1PodSpec() if len(podSpec.Containers) == 0 { podSpec.Containers = []corev1.Container{ *predContainer, diff --git a/pkg/controller/v1beta1/inferenceservice/components/transformer.go b/pkg/controller/v1beta1/inferenceservice/components/transformer.go index f3c10ee2a31..1502ebb1036 100644 --- a/pkg/controller/v1beta1/inferenceservice/components/transformer.go +++ b/pkg/controller/v1beta1/inferenceservice/components/transformer.go @@ -170,7 +170,7 @@ func (p *Transformer) Reconcile(ctx context.Context, isvc *v1beta1.InferenceServ isvc.Spec.Transformer.PodSpec.Containers[0] = *container } - podSpec := corev1.PodSpec(isvc.Spec.Transformer.PodSpec) + podSpec := isvc.Spec.Transformer.PodSpec.ToCorev1PodSpec() // Here we allow switch between knative and vanilla deployment if p.deploymentMode == constants.RawDeployment { diff --git a/pkg/controller/v1beta1/inferenceservice/controller.go b/pkg/controller/v1beta1/inferenceservice/controller.go index b8f68bfc8c5..4686158d2c2 100644 --- a/pkg/controller/v1beta1/inferenceservice/controller.go +++ b/pkg/controller/v1beta1/inferenceservice/controller.go @@ -251,7 +251,9 @@ func (r *InferenceServiceReconciler) Reconcile(ctx context.Context, req ctrl.Req } return reconcile.Result{}, errors.Wrapf(err, "fails to reconcile component") } - if result.Requeue || result.RequeueAfter > 0 { + // controller-runtime v0.22+: result.Requeue is deprecated in favor of RequeueAfter. + // Checking RequeueAfter > 0 is sufficient to determine if a requeue is needed. + if result.RequeueAfter > 0 { return result, nil } } diff --git a/pkg/controller/v1beta1/inferenceservice/rawkube_controller_test.go b/pkg/controller/v1beta1/inferenceservice/rawkube_controller_test.go index 60fc097df23..b13c1015a35 100644 --- a/pkg/controller/v1beta1/inferenceservice/rawkube_controller_test.go +++ b/pkg/controller/v1beta1/inferenceservice/rawkube_controller_test.go @@ -406,7 +406,7 @@ var _ = Describe("v1beta1 inference service controller", func() { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: gatewayapiv1.ObjectName(predictorServiceKey.Name), Namespace: (*gatewayapiv1.Namespace)(ptr.To(serviceKey.Namespace)), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, Weight: ptr.To(int32(1)), }, @@ -477,7 +477,7 @@ var _ = Describe("v1beta1 inference service controller", func() { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: gatewayapiv1.ObjectName(predictorServiceKey.Name), Namespace: (*gatewayapiv1.Namespace)(ptr.To(serviceKey.Namespace)), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, Weight: ptr.To(int32(1)), }, @@ -964,7 +964,7 @@ var _ = Describe("v1beta1 inference service controller", func() { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: gatewayapiv1.ObjectName(predictorServiceKey.Name), Namespace: (*gatewayapiv1.Namespace)(ptr.To(serviceKey.Namespace)), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, Weight: ptr.To(int32(1)), }, @@ -1036,7 +1036,7 @@ var _ = Describe("v1beta1 inference service controller", func() { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: gatewayapiv1.ObjectName(predictorServiceKey.Name), Namespace: (*gatewayapiv1.Namespace)(ptr.To(serviceKey.Namespace)), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, Weight: ptr.To(int32(1)), }, @@ -1519,7 +1519,7 @@ var _ = Describe("v1beta1 inference service controller", func() { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: gatewayapiv1.ObjectName(predictorServiceKey.Name), Namespace: (*gatewayapiv1.Namespace)(ptr.To(serviceKey.Namespace)), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, Weight: ptr.To(int32(1)), }, @@ -1591,7 +1591,7 @@ var _ = Describe("v1beta1 inference service controller", func() { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: gatewayapiv1.ObjectName(predictorServiceKey.Name), Namespace: (*gatewayapiv1.Namespace)(ptr.To(serviceKey.Namespace)), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, Weight: ptr.To(int32(1)), }, @@ -3678,7 +3678,7 @@ var _ = Describe("v1beta1 inference service controller", func() { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: gatewayapiv1.ObjectName(predictorServiceKey.Name), Namespace: (*gatewayapiv1.Namespace)(ptr.To(serviceKey.Namespace)), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, Weight: ptr.To(int32(1)), }, @@ -3750,7 +3750,7 @@ var _ = Describe("v1beta1 inference service controller", func() { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: gatewayapiv1.ObjectName(predictorServiceKey.Name), Namespace: (*gatewayapiv1.Namespace)(ptr.To(serviceKey.Namespace)), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, Weight: ptr.To(int32(1)), }, @@ -4435,7 +4435,7 @@ var _ = Describe("v1beta1 inference service controller", func() { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: gatewayapiv1.ObjectName(transformerServiceKey.Name), Namespace: (*gatewayapiv1.Namespace)(ptr.To(serviceKey.Namespace)), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, Weight: ptr.To(int32(1)), }, @@ -4507,7 +4507,7 @@ var _ = Describe("v1beta1 inference service controller", func() { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: gatewayapiv1.ObjectName(predictorServiceKey.Name), Namespace: (*gatewayapiv1.Namespace)(ptr.To(serviceKey.Namespace)), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, Weight: ptr.To(int32(1)), }, @@ -4579,7 +4579,7 @@ var _ = Describe("v1beta1 inference service controller", func() { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: gatewayapiv1.ObjectName(transformerServiceKey.Name), Namespace: (*gatewayapiv1.Namespace)(ptr.To(serviceKey.Namespace)), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, Weight: ptr.To(int32(1)), }, @@ -5343,7 +5343,7 @@ var _ = Describe("v1beta1 inference service controller", func() { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: gatewayapiv1.ObjectName(explainerServiceKey.Name), Namespace: (*gatewayapiv1.Namespace)(ptr.To(serviceKey.Namespace)), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, Weight: ptr.To(int32(1)), }, @@ -5387,7 +5387,7 @@ var _ = Describe("v1beta1 inference service controller", func() { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: gatewayapiv1.ObjectName(predictorServiceKey.Name), Namespace: (*gatewayapiv1.Namespace)(ptr.To(serviceKey.Namespace)), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, Weight: ptr.To(int32(1)), }, @@ -5459,7 +5459,7 @@ var _ = Describe("v1beta1 inference service controller", func() { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: gatewayapiv1.ObjectName(predictorServiceKey.Name), Namespace: (*gatewayapiv1.Namespace)(ptr.To(serviceKey.Namespace)), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, Weight: ptr.To(int32(1)), }, @@ -5531,7 +5531,7 @@ var _ = Describe("v1beta1 inference service controller", func() { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: gatewayapiv1.ObjectName(explainerServiceKey.Name), Namespace: (*gatewayapiv1.Namespace)(ptr.To(serviceKey.Namespace)), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, Weight: ptr.To(int32(1)), }, @@ -6120,7 +6120,7 @@ var _ = Describe("v1beta1 inference service controller", func() { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: gatewayapiv1.ObjectName(predictorServiceKey.Name), Namespace: (*gatewayapiv1.Namespace)(ptr.To(serviceKey.Namespace)), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, Weight: ptr.To(int32(1)), }, @@ -6164,7 +6164,7 @@ var _ = Describe("v1beta1 inference service controller", func() { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: gatewayapiv1.ObjectName(predictorServiceKey.Name), Namespace: (*gatewayapiv1.Namespace)(ptr.To(serviceKey.Namespace)), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, Weight: ptr.To(int32(1)), }, @@ -6236,7 +6236,7 @@ var _ = Describe("v1beta1 inference service controller", func() { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: gatewayapiv1.ObjectName(predictorServiceKey.Name), Namespace: (*gatewayapiv1.Namespace)(ptr.To(serviceKey.Namespace)), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, Weight: ptr.To(int32(1)), }, @@ -6927,7 +6927,7 @@ var _ = Describe("v1beta1 inference service controller", func() { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: gatewayapiv1.ObjectName(transformerServiceKey.Name), Namespace: (*gatewayapiv1.Namespace)(ptr.To(serviceKey.Namespace)), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, Weight: ptr.To(int32(1)), }, @@ -6971,7 +6971,7 @@ var _ = Describe("v1beta1 inference service controller", func() { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: gatewayapiv1.ObjectName(transformerServiceKey.Name), Namespace: (*gatewayapiv1.Namespace)(ptr.To(serviceKey.Namespace)), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, Weight: ptr.To(int32(1)), }, @@ -7043,7 +7043,7 @@ var _ = Describe("v1beta1 inference service controller", func() { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: gatewayapiv1.ObjectName(predictorServiceKey.Name), Namespace: (*gatewayapiv1.Namespace)(ptr.To(serviceKey.Namespace)), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, Weight: ptr.To(int32(1)), }, @@ -7115,7 +7115,7 @@ var _ = Describe("v1beta1 inference service controller", func() { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: gatewayapiv1.ObjectName(transformerServiceKey.Name), Namespace: (*gatewayapiv1.Namespace)(ptr.To(serviceKey.Namespace)), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, Weight: ptr.To(int32(1)), }, @@ -7883,7 +7883,7 @@ var _ = Describe("v1beta1 inference service controller", func() { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: gatewayapiv1.ObjectName(explainerServiceKey.Name), Namespace: (*gatewayapiv1.Namespace)(ptr.To(serviceKey.Namespace)), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, Weight: ptr.To(int32(1)), }, @@ -7927,7 +7927,7 @@ var _ = Describe("v1beta1 inference service controller", func() { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: gatewayapiv1.ObjectName(predictorServiceKey.Name), Namespace: (*gatewayapiv1.Namespace)(ptr.To(serviceKey.Namespace)), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, Weight: ptr.To(int32(1)), }, @@ -7971,7 +7971,7 @@ var _ = Describe("v1beta1 inference service controller", func() { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: gatewayapiv1.ObjectName(explainerServiceKey.Name), Namespace: (*gatewayapiv1.Namespace)(ptr.To(serviceKey.Namespace)), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, Weight: ptr.To(int32(1)), }, @@ -8015,7 +8015,7 @@ var _ = Describe("v1beta1 inference service controller", func() { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: gatewayapiv1.ObjectName(predictorServiceKey.Name), Namespace: (*gatewayapiv1.Namespace)(ptr.To(serviceKey.Namespace)), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, Weight: ptr.To(int32(1)), }, @@ -8087,7 +8087,7 @@ var _ = Describe("v1beta1 inference service controller", func() { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: gatewayapiv1.ObjectName(predictorServiceKey.Name), Namespace: (*gatewayapiv1.Namespace)(ptr.To(serviceKey.Namespace)), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, Weight: ptr.To(int32(1)), }, @@ -8159,7 +8159,7 @@ var _ = Describe("v1beta1 inference service controller", func() { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: gatewayapiv1.ObjectName(explainerServiceKey.Name), Namespace: (*gatewayapiv1.Namespace)(ptr.To(serviceKey.Namespace)), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, Weight: ptr.To(int32(1)), }, diff --git a/pkg/controller/v1beta1/inferenceservice/reconcilers/ingress/httproute_reconciler.go b/pkg/controller/v1beta1/inferenceservice/reconcilers/ingress/httproute_reconciler.go index a0fdf0cb6f5..4219924f4f4 100644 --- a/pkg/controller/v1beta1/inferenceservice/reconcilers/ingress/httproute_reconciler.go +++ b/pkg/controller/v1beta1/inferenceservice/reconcilers/ingress/httproute_reconciler.go @@ -134,7 +134,9 @@ func createHTTPRouteRule(routeMatches []gatewayapiv1.HTTPRouteMatch, filters []g Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: gatewayapiv1.ObjectName(serviceName), Namespace: (*gatewayapiv1.Namespace)(&namespace), - Port: (*gatewayapiv1.PortNumber)(&port), + // Gateway API v1.4+: PortNumber is now a type alias for int32, + // so direct assignment works without explicit type conversion + Port: &port, }, }, }, diff --git a/pkg/controller/v1beta1/inferenceservice/reconcilers/ingress/httproute_reconciler_test.go b/pkg/controller/v1beta1/inferenceservice/reconcilers/ingress/httproute_reconciler_test.go index 766e13d812d..01fd67f69da 100644 --- a/pkg/controller/v1beta1/inferenceservice/reconcilers/ingress/httproute_reconciler_test.go +++ b/pkg/controller/v1beta1/inferenceservice/reconcilers/ingress/httproute_reconciler_test.go @@ -456,7 +456,7 @@ func TestCreateRawTopLevelHTTPRoute(t *testing.T) { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: "test-isvc-predictor", Namespace: (*gatewayapiv1.Namespace)(ptr.To("default")), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, }, }, @@ -585,7 +585,7 @@ func TestCreateRawTopLevelHTTPRoute(t *testing.T) { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: "test-isvc-transformer", Namespace: (*gatewayapiv1.Namespace)(ptr.To("default")), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, }, }, @@ -719,7 +719,7 @@ func TestCreateRawTopLevelHTTPRoute(t *testing.T) { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: "test-isvc-explainer", Namespace: (*gatewayapiv1.Namespace)(ptr.To("default")), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, }, }, @@ -761,7 +761,7 @@ func TestCreateRawTopLevelHTTPRoute(t *testing.T) { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: "test-isvc-predictor", Namespace: (*gatewayapiv1.Namespace)(ptr.To("default")), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, }, }, @@ -896,7 +896,7 @@ func TestCreateRawTopLevelHTTPRoute(t *testing.T) { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: "test-isvc-explainer", Namespace: (*gatewayapiv1.Namespace)(ptr.To("default")), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, }, }, @@ -938,7 +938,7 @@ func TestCreateRawTopLevelHTTPRoute(t *testing.T) { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: "test-isvc-predictor", Namespace: (*gatewayapiv1.Namespace)(ptr.To("default")), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, }, }, @@ -980,7 +980,7 @@ func TestCreateRawTopLevelHTTPRoute(t *testing.T) { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: "test-isvc-explainer", Namespace: (*gatewayapiv1.Namespace)(ptr.To("default")), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, }, }, @@ -1022,7 +1022,7 @@ func TestCreateRawTopLevelHTTPRoute(t *testing.T) { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: "test-isvc-predictor", Namespace: (*gatewayapiv1.Namespace)(ptr.To("default")), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, }, }, @@ -1122,7 +1122,7 @@ func TestCreateRawTopLevelHTTPRoute(t *testing.T) { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: "test-isvc-transformer", Namespace: (*gatewayapiv1.Namespace)(ptr.To("default")), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, }, }, @@ -1164,7 +1164,7 @@ func TestCreateRawTopLevelHTTPRoute(t *testing.T) { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: "test-isvc-transformer", Namespace: (*gatewayapiv1.Namespace)(ptr.To("default")), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, }, }, @@ -1299,7 +1299,7 @@ func TestCreateRawPredictorHTTPRoute(t *testing.T) { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: "test-isvc-predictor", Namespace: (*gatewayapiv1.Namespace)(ptr.To("default")), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, }, }, @@ -1464,7 +1464,7 @@ func TestCreateRawTransformerHTTPRoute(t *testing.T) { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: "test-isvc-transformer", Namespace: (*gatewayapiv1.Namespace)(ptr.To("default")), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, }, }, @@ -1630,7 +1630,7 @@ func TestCreateRawExplainerHTTPRoute(t *testing.T) { Kind: ptr.To(gatewayapiv1.Kind(constants.ServiceKind)), Name: "test-isvc-explainer", Namespace: (*gatewayapiv1.Namespace)(ptr.To("default")), - Port: (*gatewayapiv1.PortNumber)(ptr.To(int32(constants.CommonDefaultHttpPort))), + Port: ptr.To(gatewayapiv1.PortNumber(constants.CommonDefaultHttpPort)), }, }, }, diff --git a/pkg/openapi/openapi_generated.go b/pkg/openapi/openapi_generated.go index 7dba20b22ae..6ff2c5fd14f 100644 --- a/pkg/openapi/openapi_generated.go +++ b/pkg/openapi/openapi_generated.go @@ -2323,7 +2323,7 @@ func schema_pkg_apis_serving_v1beta1_ARTExplainerSpec(ref common.ReferenceCallba }, }, SchemaProps: spec.SchemaProps{ - Description: "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + Description: "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -2387,11 +2387,30 @@ func schema_pkg_apis_serving_v1beta1_ARTExplainerSpec(ref common.ReferenceCallba }, "restartPolicy": { SchemaProps: spec.SchemaProps{ - Description: "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + Description: "RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", Type: []string{"string"}, Format: "", }, }, + "restartPolicyRules": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/core/v1.ContainerRestartRule"), + }, + }, + }, + }, + }, "volumeMounts": { VendorExtensible: spec.VendorExtensible{ Extensions: spec.Extensions{ @@ -2523,7 +2542,7 @@ func schema_pkg_apis_serving_v1beta1_ARTExplainerSpec(ref common.ReferenceCallba }, }, Dependencies: []string{ - "github.com/kserve/kserve/pkg/apis/serving/v1beta1.StorageSpec", "k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"}, + "github.com/kserve/kserve/pkg/apis/serving/v1beta1.StorageSpec", "k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.ContainerRestartRule", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"}, } } @@ -3000,7 +3019,7 @@ func schema_pkg_apis_serving_v1beta1_CustomExplainer(ref common.ReferenceCallbac }, "hostNetwork": { SchemaProps: spec.SchemaProps{ - Description: "Host networking requested for this pod. Use the host's network namespace. If this option is set, the ports that will be used must be specified. Default to false.", + Description: "Host networking requested for this pod. Use the host's network namespace. When using HostNetwork you should specify ports so the scheduler is aware. When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. Default to false.", Type: []string{"boolean"}, Format: "", }, @@ -3234,7 +3253,7 @@ func schema_pkg_apis_serving_v1beta1_CustomExplainer(ref common.ReferenceCallbac }, "os": { SchemaProps: spec.SchemaProps{ - Description: "Specifies the OS of the containers in the pod. Some pod and container fields are restricted if this is set.\n\nIf the OS field is set to linux, the following fields must be unset: -securityContext.windowsOptions\n\nIf the OS field is set to windows, following fields must be unset: - spec.hostPID - spec.hostIPC - spec.hostUsers - spec.securityContext.appArmorProfile - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile - spec.securityContext.fsGroup - spec.securityContext.fsGroupChangePolicy - spec.securityContext.sysctls - spec.shareProcessNamespace - spec.securityContext.runAsUser - spec.securityContext.runAsGroup - spec.securityContext.supplementalGroups - spec.securityContext.supplementalGroupsPolicy - spec.containers[*].securityContext.appArmorProfile - spec.containers[*].securityContext.seLinuxOptions - spec.containers[*].securityContext.seccompProfile - spec.containers[*].securityContext.capabilities - spec.containers[*].securityContext.readOnlyRootFilesystem - spec.containers[*].securityContext.privileged - spec.containers[*].securityContext.allowPrivilegeEscalation - spec.containers[*].securityContext.procMount - spec.containers[*].securityContext.runAsUser - spec.containers[*].securityContext.runAsGroup", + Description: "Specifies the OS of the containers in the pod. Some pod and container fields are restricted if this is set.\n\nIf the OS field is set to linux, the following fields must be unset: -securityContext.windowsOptions\n\nIf the OS field is set to windows, following fields must be unset: - spec.hostPID - spec.hostIPC - spec.hostUsers - spec.resources - spec.securityContext.appArmorProfile - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile - spec.securityContext.fsGroup - spec.securityContext.fsGroupChangePolicy - spec.securityContext.sysctls - spec.shareProcessNamespace - spec.securityContext.runAsUser - spec.securityContext.runAsGroup - spec.securityContext.supplementalGroups - spec.securityContext.supplementalGroupsPolicy - spec.containers[*].securityContext.appArmorProfile - spec.containers[*].securityContext.seLinuxOptions - spec.containers[*].securityContext.seccompProfile - spec.containers[*].securityContext.capabilities - spec.containers[*].securityContext.readOnlyRootFilesystem - spec.containers[*].securityContext.privileged - spec.containers[*].securityContext.allowPrivilegeEscalation - spec.containers[*].securityContext.procMount - spec.containers[*].securityContext.runAsUser - spec.containers[*].securityContext.runAsGroup", Ref: ref("k8s.io/api/core/v1.PodOS"), }, }, @@ -3295,10 +3314,17 @@ func schema_pkg_apis_serving_v1beta1_CustomExplainer(ref common.ReferenceCallbac }, "resources": { SchemaProps: spec.SchemaProps{ - Description: "Resources is the total amount of CPU and Memory resources required by all containers in the pod. It supports specifying Requests and Limits for \"cpu\" and \"memory\" resource names only. ResourceClaims are not supported.\n\nThis field enables fine-grained control over resource allocation for the entire pod, allowing resource sharing among containers in a pod.\n\nThis is an alpha field and requires enabling the PodLevelResources feature gate.", + Description: "Resources is the total amount of CPU and Memory resources required by all containers in the pod. It supports specifying Requests and Limits for \"cpu\", \"memory\" and \"hugepages-\" resource names only. ResourceClaims are not supported.\n\nThis field enables fine-grained control over resource allocation for the entire pod, allowing resource sharing among containers in a pod.\n\nThis is an alpha field and requires enabling the PodLevelResources feature gate.", Ref: ref("k8s.io/api/core/v1.ResourceRequirements"), }, }, + "hostnameOverride": { + SchemaProps: spec.SchemaProps{ + Description: "HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. This field only specifies the pod's hostname and does not affect its DNS records. When this field is set to a non-empty string: - It takes precedence over the values set in `hostname` and `subdomain`. - The Pod's hostname will be set to this value. - `setHostnameAsFQDN` must be nil or set to false. - `hostNetwork` must be set to false.\n\nThis field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. Requires the HostnameOverride feature gate to be enabled.", + Type: []string{"string"}, + Format: "", + }, + }, }, Required: []string{"containers"}, }, @@ -3490,7 +3516,7 @@ func schema_pkg_apis_serving_v1beta1_CustomPredictor(ref common.ReferenceCallbac }, "hostNetwork": { SchemaProps: spec.SchemaProps{ - Description: "Host networking requested for this pod. Use the host's network namespace. If this option is set, the ports that will be used must be specified. Default to false.", + Description: "Host networking requested for this pod. Use the host's network namespace. When using HostNetwork you should specify ports so the scheduler is aware. When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. Default to false.", Type: []string{"boolean"}, Format: "", }, @@ -3724,7 +3750,7 @@ func schema_pkg_apis_serving_v1beta1_CustomPredictor(ref common.ReferenceCallbac }, "os": { SchemaProps: spec.SchemaProps{ - Description: "Specifies the OS of the containers in the pod. Some pod and container fields are restricted if this is set.\n\nIf the OS field is set to linux, the following fields must be unset: -securityContext.windowsOptions\n\nIf the OS field is set to windows, following fields must be unset: - spec.hostPID - spec.hostIPC - spec.hostUsers - spec.securityContext.appArmorProfile - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile - spec.securityContext.fsGroup - spec.securityContext.fsGroupChangePolicy - spec.securityContext.sysctls - spec.shareProcessNamespace - spec.securityContext.runAsUser - spec.securityContext.runAsGroup - spec.securityContext.supplementalGroups - spec.securityContext.supplementalGroupsPolicy - spec.containers[*].securityContext.appArmorProfile - spec.containers[*].securityContext.seLinuxOptions - spec.containers[*].securityContext.seccompProfile - spec.containers[*].securityContext.capabilities - spec.containers[*].securityContext.readOnlyRootFilesystem - spec.containers[*].securityContext.privileged - spec.containers[*].securityContext.allowPrivilegeEscalation - spec.containers[*].securityContext.procMount - spec.containers[*].securityContext.runAsUser - spec.containers[*].securityContext.runAsGroup", + Description: "Specifies the OS of the containers in the pod. Some pod and container fields are restricted if this is set.\n\nIf the OS field is set to linux, the following fields must be unset: -securityContext.windowsOptions\n\nIf the OS field is set to windows, following fields must be unset: - spec.hostPID - spec.hostIPC - spec.hostUsers - spec.resources - spec.securityContext.appArmorProfile - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile - spec.securityContext.fsGroup - spec.securityContext.fsGroupChangePolicy - spec.securityContext.sysctls - spec.shareProcessNamespace - spec.securityContext.runAsUser - spec.securityContext.runAsGroup - spec.securityContext.supplementalGroups - spec.securityContext.supplementalGroupsPolicy - spec.containers[*].securityContext.appArmorProfile - spec.containers[*].securityContext.seLinuxOptions - spec.containers[*].securityContext.seccompProfile - spec.containers[*].securityContext.capabilities - spec.containers[*].securityContext.readOnlyRootFilesystem - spec.containers[*].securityContext.privileged - spec.containers[*].securityContext.allowPrivilegeEscalation - spec.containers[*].securityContext.procMount - spec.containers[*].securityContext.runAsUser - spec.containers[*].securityContext.runAsGroup", Ref: ref("k8s.io/api/core/v1.PodOS"), }, }, @@ -3785,10 +3811,17 @@ func schema_pkg_apis_serving_v1beta1_CustomPredictor(ref common.ReferenceCallbac }, "resources": { SchemaProps: spec.SchemaProps{ - Description: "Resources is the total amount of CPU and Memory resources required by all containers in the pod. It supports specifying Requests and Limits for \"cpu\" and \"memory\" resource names only. ResourceClaims are not supported.\n\nThis field enables fine-grained control over resource allocation for the entire pod, allowing resource sharing among containers in a pod.\n\nThis is an alpha field and requires enabling the PodLevelResources feature gate.", + Description: "Resources is the total amount of CPU and Memory resources required by all containers in the pod. It supports specifying Requests and Limits for \"cpu\", \"memory\" and \"hugepages-\" resource names only. ResourceClaims are not supported.\n\nThis field enables fine-grained control over resource allocation for the entire pod, allowing resource sharing among containers in a pod.\n\nThis is an alpha field and requires enabling the PodLevelResources feature gate.", Ref: ref("k8s.io/api/core/v1.ResourceRequirements"), }, }, + "hostnameOverride": { + SchemaProps: spec.SchemaProps{ + Description: "HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. This field only specifies the pod's hostname and does not affect its DNS records. When this field is set to a non-empty string: - It takes precedence over the values set in `hostname` and `subdomain`. - The Pod's hostname will be set to this value. - `setHostnameAsFQDN` must be nil or set to false. - `hostNetwork` must be set to false.\n\nThis field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. Requires the HostnameOverride feature gate to be enabled.", + Type: []string{"string"}, + Format: "", + }, + }, }, Required: []string{"containers"}, }, @@ -3980,7 +4013,7 @@ func schema_pkg_apis_serving_v1beta1_CustomTransformer(ref common.ReferenceCallb }, "hostNetwork": { SchemaProps: spec.SchemaProps{ - Description: "Host networking requested for this pod. Use the host's network namespace. If this option is set, the ports that will be used must be specified. Default to false.", + Description: "Host networking requested for this pod. Use the host's network namespace. When using HostNetwork you should specify ports so the scheduler is aware. When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. Default to false.", Type: []string{"boolean"}, Format: "", }, @@ -4214,7 +4247,7 @@ func schema_pkg_apis_serving_v1beta1_CustomTransformer(ref common.ReferenceCallb }, "os": { SchemaProps: spec.SchemaProps{ - Description: "Specifies the OS of the containers in the pod. Some pod and container fields are restricted if this is set.\n\nIf the OS field is set to linux, the following fields must be unset: -securityContext.windowsOptions\n\nIf the OS field is set to windows, following fields must be unset: - spec.hostPID - spec.hostIPC - spec.hostUsers - spec.securityContext.appArmorProfile - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile - spec.securityContext.fsGroup - spec.securityContext.fsGroupChangePolicy - spec.securityContext.sysctls - spec.shareProcessNamespace - spec.securityContext.runAsUser - spec.securityContext.runAsGroup - spec.securityContext.supplementalGroups - spec.securityContext.supplementalGroupsPolicy - spec.containers[*].securityContext.appArmorProfile - spec.containers[*].securityContext.seLinuxOptions - spec.containers[*].securityContext.seccompProfile - spec.containers[*].securityContext.capabilities - spec.containers[*].securityContext.readOnlyRootFilesystem - spec.containers[*].securityContext.privileged - spec.containers[*].securityContext.allowPrivilegeEscalation - spec.containers[*].securityContext.procMount - spec.containers[*].securityContext.runAsUser - spec.containers[*].securityContext.runAsGroup", + Description: "Specifies the OS of the containers in the pod. Some pod and container fields are restricted if this is set.\n\nIf the OS field is set to linux, the following fields must be unset: -securityContext.windowsOptions\n\nIf the OS field is set to windows, following fields must be unset: - spec.hostPID - spec.hostIPC - spec.hostUsers - spec.resources - spec.securityContext.appArmorProfile - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile - spec.securityContext.fsGroup - spec.securityContext.fsGroupChangePolicy - spec.securityContext.sysctls - spec.shareProcessNamespace - spec.securityContext.runAsUser - spec.securityContext.runAsGroup - spec.securityContext.supplementalGroups - spec.securityContext.supplementalGroupsPolicy - spec.containers[*].securityContext.appArmorProfile - spec.containers[*].securityContext.seLinuxOptions - spec.containers[*].securityContext.seccompProfile - spec.containers[*].securityContext.capabilities - spec.containers[*].securityContext.readOnlyRootFilesystem - spec.containers[*].securityContext.privileged - spec.containers[*].securityContext.allowPrivilegeEscalation - spec.containers[*].securityContext.procMount - spec.containers[*].securityContext.runAsUser - spec.containers[*].securityContext.runAsGroup", Ref: ref("k8s.io/api/core/v1.PodOS"), }, }, @@ -4275,10 +4308,17 @@ func schema_pkg_apis_serving_v1beta1_CustomTransformer(ref common.ReferenceCallb }, "resources": { SchemaProps: spec.SchemaProps{ - Description: "Resources is the total amount of CPU and Memory resources required by all containers in the pod. It supports specifying Requests and Limits for \"cpu\" and \"memory\" resource names only. ResourceClaims are not supported.\n\nThis field enables fine-grained control over resource allocation for the entire pod, allowing resource sharing among containers in a pod.\n\nThis is an alpha field and requires enabling the PodLevelResources feature gate.", + Description: "Resources is the total amount of CPU and Memory resources required by all containers in the pod. It supports specifying Requests and Limits for \"cpu\", \"memory\" and \"hugepages-\" resource names only. ResourceClaims are not supported.\n\nThis field enables fine-grained control over resource allocation for the entire pod, allowing resource sharing among containers in a pod.\n\nThis is an alpha field and requires enabling the PodLevelResources feature gate.", Ref: ref("k8s.io/api/core/v1.ResourceRequirements"), }, }, + "hostnameOverride": { + SchemaProps: spec.SchemaProps{ + Description: "HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. This field only specifies the pod's hostname and does not affect its DNS records. When this field is set to a non-empty string: - It takes precedence over the values set in `hostname` and `subdomain`. - The Pod's hostname will be set to this value. - `setHostnameAsFQDN` must be nil or set to false. - `hostNetwork` must be set to false.\n\nThis field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. Requires the HostnameOverride feature gate to be enabled.", + Type: []string{"string"}, + Format: "", + }, + }, }, Required: []string{"containers"}, }, @@ -4466,7 +4506,7 @@ func schema_pkg_apis_serving_v1beta1_ExplainerExtensionSpec(ref common.Reference }, }, SchemaProps: spec.SchemaProps{ - Description: "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + Description: "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -4530,11 +4570,30 @@ func schema_pkg_apis_serving_v1beta1_ExplainerExtensionSpec(ref common.Reference }, "restartPolicy": { SchemaProps: spec.SchemaProps{ - Description: "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + Description: "RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", Type: []string{"string"}, Format: "", }, }, + "restartPolicyRules": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/core/v1.ContainerRestartRule"), + }, + }, + }, + }, + }, "volumeMounts": { VendorExtensible: spec.VendorExtensible{ Extensions: spec.Extensions{ @@ -4666,7 +4725,7 @@ func schema_pkg_apis_serving_v1beta1_ExplainerExtensionSpec(ref common.Reference }, }, Dependencies: []string{ - "github.com/kserve/kserve/pkg/apis/serving/v1beta1.StorageSpec", "k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"}, + "github.com/kserve/kserve/pkg/apis/serving/v1beta1.StorageSpec", "k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.ContainerRestartRule", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"}, } } @@ -5545,7 +5604,7 @@ func schema_pkg_apis_serving_v1beta1_HuggingFaceRuntimeSpec(ref common.Reference }, }, SchemaProps: spec.SchemaProps{ - Description: "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + Description: "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -5609,11 +5668,30 @@ func schema_pkg_apis_serving_v1beta1_HuggingFaceRuntimeSpec(ref common.Reference }, "restartPolicy": { SchemaProps: spec.SchemaProps{ - Description: "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + Description: "RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", Type: []string{"string"}, Format: "", }, }, + "restartPolicyRules": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/core/v1.ContainerRestartRule"), + }, + }, + }, + }, + }, "volumeMounts": { VendorExtensible: spec.VendorExtensible{ Extensions: spec.Extensions{ @@ -5745,7 +5823,7 @@ func schema_pkg_apis_serving_v1beta1_HuggingFaceRuntimeSpec(ref common.Reference }, }, Dependencies: []string{ - "github.com/kserve/kserve/pkg/apis/serving/v1beta1.StorageSpec", "k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"}, + "github.com/kserve/kserve/pkg/apis/serving/v1beta1.StorageSpec", "k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.ContainerRestartRule", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"}, } } @@ -6291,7 +6369,7 @@ func schema_pkg_apis_serving_v1beta1_LightGBMSpec(ref common.ReferenceCallback) }, }, SchemaProps: spec.SchemaProps{ - Description: "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + Description: "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -6355,11 +6433,30 @@ func schema_pkg_apis_serving_v1beta1_LightGBMSpec(ref common.ReferenceCallback) }, "restartPolicy": { SchemaProps: spec.SchemaProps{ - Description: "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + Description: "RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", Type: []string{"string"}, Format: "", }, }, + "restartPolicyRules": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/core/v1.ContainerRestartRule"), + }, + }, + }, + }, + }, "volumeMounts": { VendorExtensible: spec.VendorExtensible{ Extensions: spec.Extensions{ @@ -6491,7 +6588,7 @@ func schema_pkg_apis_serving_v1beta1_LightGBMSpec(ref common.ReferenceCallback) }, }, Dependencies: []string{ - "github.com/kserve/kserve/pkg/apis/serving/v1beta1.StorageSpec", "k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"}, + "github.com/kserve/kserve/pkg/apis/serving/v1beta1.StorageSpec", "k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.ContainerRestartRule", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"}, } } @@ -6911,7 +7008,7 @@ func schema_pkg_apis_serving_v1beta1_ModelSpec(ref common.ReferenceCallback) com }, }, SchemaProps: spec.SchemaProps{ - Description: "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + Description: "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -6975,11 +7072,30 @@ func schema_pkg_apis_serving_v1beta1_ModelSpec(ref common.ReferenceCallback) com }, "restartPolicy": { SchemaProps: spec.SchemaProps{ - Description: "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + Description: "RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", Type: []string{"string"}, Format: "", }, }, + "restartPolicyRules": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/core/v1.ContainerRestartRule"), + }, + }, + }, + }, + }, "volumeMounts": { VendorExtensible: spec.VendorExtensible{ Extensions: spec.Extensions{ @@ -7111,7 +7227,7 @@ func schema_pkg_apis_serving_v1beta1_ModelSpec(ref common.ReferenceCallback) com }, }, Dependencies: []string{ - "github.com/kserve/kserve/pkg/apis/serving/v1beta1.ModelFormat", "github.com/kserve/kserve/pkg/apis/serving/v1beta1.StorageSpec", "k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"}, + "github.com/kserve/kserve/pkg/apis/serving/v1beta1.ModelFormat", "github.com/kserve/kserve/pkg/apis/serving/v1beta1.StorageSpec", "k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.ContainerRestartRule", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"}, } } @@ -7305,7 +7421,7 @@ func schema_pkg_apis_serving_v1beta1_ONNXRuntimeSpec(ref common.ReferenceCallbac }, }, SchemaProps: spec.SchemaProps{ - Description: "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + Description: "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -7369,11 +7485,30 @@ func schema_pkg_apis_serving_v1beta1_ONNXRuntimeSpec(ref common.ReferenceCallbac }, "restartPolicy": { SchemaProps: spec.SchemaProps{ - Description: "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + Description: "RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", Type: []string{"string"}, Format: "", }, }, + "restartPolicyRules": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/core/v1.ContainerRestartRule"), + }, + }, + }, + }, + }, "volumeMounts": { VendorExtensible: spec.VendorExtensible{ Extensions: spec.Extensions{ @@ -7505,7 +7640,7 @@ func schema_pkg_apis_serving_v1beta1_ONNXRuntimeSpec(ref common.ReferenceCallbac }, }, Dependencies: []string{ - "github.com/kserve/kserve/pkg/apis/serving/v1beta1.StorageSpec", "k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"}, + "github.com/kserve/kserve/pkg/apis/serving/v1beta1.StorageSpec", "k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.ContainerRestartRule", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"}, } } @@ -7709,7 +7844,7 @@ func schema_pkg_apis_serving_v1beta1_PMMLSpec(ref common.ReferenceCallback) comm }, }, SchemaProps: spec.SchemaProps{ - Description: "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + Description: "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -7773,11 +7908,30 @@ func schema_pkg_apis_serving_v1beta1_PMMLSpec(ref common.ReferenceCallback) comm }, "restartPolicy": { SchemaProps: spec.SchemaProps{ - Description: "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + Description: "RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", Type: []string{"string"}, Format: "", }, }, + "restartPolicyRules": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/core/v1.ContainerRestartRule"), + }, + }, + }, + }, + }, "volumeMounts": { VendorExtensible: spec.VendorExtensible{ Extensions: spec.Extensions{ @@ -7909,7 +8063,7 @@ func schema_pkg_apis_serving_v1beta1_PMMLSpec(ref common.ReferenceCallback) comm }, }, Dependencies: []string{ - "github.com/kserve/kserve/pkg/apis/serving/v1beta1.StorageSpec", "k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"}, + "github.com/kserve/kserve/pkg/apis/serving/v1beta1.StorageSpec", "k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.ContainerRestartRule", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"}, } } @@ -8034,7 +8188,7 @@ func schema_pkg_apis_serving_v1beta1_PaddleServerSpec(ref common.ReferenceCallba }, }, SchemaProps: spec.SchemaProps{ - Description: "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + Description: "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -8098,11 +8252,30 @@ func schema_pkg_apis_serving_v1beta1_PaddleServerSpec(ref common.ReferenceCallba }, "restartPolicy": { SchemaProps: spec.SchemaProps{ - Description: "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + Description: "RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", Type: []string{"string"}, Format: "", }, }, + "restartPolicyRules": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/core/v1.ContainerRestartRule"), + }, + }, + }, + }, + }, "volumeMounts": { VendorExtensible: spec.VendorExtensible{ Extensions: spec.Extensions{ @@ -8234,7 +8407,7 @@ func schema_pkg_apis_serving_v1beta1_PaddleServerSpec(ref common.ReferenceCallba }, }, Dependencies: []string{ - "github.com/kserve/kserve/pkg/apis/serving/v1beta1.StorageSpec", "k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"}, + "github.com/kserve/kserve/pkg/apis/serving/v1beta1.StorageSpec", "k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.ContainerRestartRule", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"}, } } @@ -8901,7 +9074,7 @@ func schema_pkg_apis_serving_v1beta1_PredictorExtensionSpec(ref common.Reference }, }, SchemaProps: spec.SchemaProps{ - Description: "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + Description: "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -8965,11 +9138,30 @@ func schema_pkg_apis_serving_v1beta1_PredictorExtensionSpec(ref common.Reference }, "restartPolicy": { SchemaProps: spec.SchemaProps{ - Description: "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + Description: "RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", Type: []string{"string"}, Format: "", }, }, + "restartPolicyRules": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/core/v1.ContainerRestartRule"), + }, + }, + }, + }, + }, "volumeMounts": { VendorExtensible: spec.VendorExtensible{ Extensions: spec.Extensions{ @@ -9101,7 +9293,7 @@ func schema_pkg_apis_serving_v1beta1_PredictorExtensionSpec(ref common.Reference }, }, Dependencies: []string{ - "github.com/kserve/kserve/pkg/apis/serving/v1beta1.StorageSpec", "k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"}, + "github.com/kserve/kserve/pkg/apis/serving/v1beta1.StorageSpec", "k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.ContainerRestartRule", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"}, } } @@ -9932,7 +10124,7 @@ func schema_pkg_apis_serving_v1beta1_SKLearnSpec(ref common.ReferenceCallback) c }, }, SchemaProps: spec.SchemaProps{ - Description: "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + Description: "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -9996,11 +10188,30 @@ func schema_pkg_apis_serving_v1beta1_SKLearnSpec(ref common.ReferenceCallback) c }, "restartPolicy": { SchemaProps: spec.SchemaProps{ - Description: "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + Description: "RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", Type: []string{"string"}, Format: "", }, }, + "restartPolicyRules": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/core/v1.ContainerRestartRule"), + }, + }, + }, + }, + }, "volumeMounts": { VendorExtensible: spec.VendorExtensible{ Extensions: spec.Extensions{ @@ -10132,7 +10343,7 @@ func schema_pkg_apis_serving_v1beta1_SKLearnSpec(ref common.ReferenceCallback) c }, }, Dependencies: []string{ - "github.com/kserve/kserve/pkg/apis/serving/v1beta1.StorageSpec", "k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"}, + "github.com/kserve/kserve/pkg/apis/serving/v1beta1.StorageSpec", "k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.ContainerRestartRule", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"}, } } @@ -10346,7 +10557,7 @@ func schema_pkg_apis_serving_v1beta1_TFServingSpec(ref common.ReferenceCallback) }, }, SchemaProps: spec.SchemaProps{ - Description: "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + Description: "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -10410,11 +10621,30 @@ func schema_pkg_apis_serving_v1beta1_TFServingSpec(ref common.ReferenceCallback) }, "restartPolicy": { SchemaProps: spec.SchemaProps{ - Description: "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + Description: "RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", Type: []string{"string"}, Format: "", }, }, + "restartPolicyRules": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/core/v1.ContainerRestartRule"), + }, + }, + }, + }, + }, "volumeMounts": { VendorExtensible: spec.VendorExtensible{ Extensions: spec.Extensions{ @@ -10546,7 +10776,7 @@ func schema_pkg_apis_serving_v1beta1_TFServingSpec(ref common.ReferenceCallback) }, }, Dependencies: []string{ - "github.com/kserve/kserve/pkg/apis/serving/v1beta1.StorageSpec", "k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"}, + "github.com/kserve/kserve/pkg/apis/serving/v1beta1.StorageSpec", "k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.ContainerRestartRule", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"}, } } @@ -10672,7 +10902,7 @@ func schema_pkg_apis_serving_v1beta1_TorchServeSpec(ref common.ReferenceCallback }, }, SchemaProps: spec.SchemaProps{ - Description: "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + Description: "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -10736,11 +10966,30 @@ func schema_pkg_apis_serving_v1beta1_TorchServeSpec(ref common.ReferenceCallback }, "restartPolicy": { SchemaProps: spec.SchemaProps{ - Description: "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + Description: "RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", Type: []string{"string"}, Format: "", }, }, + "restartPolicyRules": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/core/v1.ContainerRestartRule"), + }, + }, + }, + }, + }, "volumeMounts": { VendorExtensible: spec.VendorExtensible{ Extensions: spec.Extensions{ @@ -10872,7 +11121,7 @@ func schema_pkg_apis_serving_v1beta1_TorchServeSpec(ref common.ReferenceCallback }, }, Dependencies: []string{ - "github.com/kserve/kserve/pkg/apis/serving/v1beta1.StorageSpec", "k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"}, + "github.com/kserve/kserve/pkg/apis/serving/v1beta1.StorageSpec", "k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.ContainerRestartRule", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"}, } } @@ -11565,7 +11814,7 @@ func schema_pkg_apis_serving_v1beta1_TritonSpec(ref common.ReferenceCallback) co }, }, SchemaProps: spec.SchemaProps{ - Description: "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + Description: "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -11629,11 +11878,30 @@ func schema_pkg_apis_serving_v1beta1_TritonSpec(ref common.ReferenceCallback) co }, "restartPolicy": { SchemaProps: spec.SchemaProps{ - Description: "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + Description: "RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", Type: []string{"string"}, Format: "", }, }, + "restartPolicyRules": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/core/v1.ContainerRestartRule"), + }, + }, + }, + }, + }, "volumeMounts": { VendorExtensible: spec.VendorExtensible{ Extensions: spec.Extensions{ @@ -11765,7 +12033,7 @@ func schema_pkg_apis_serving_v1beta1_TritonSpec(ref common.ReferenceCallback) co }, }, Dependencies: []string{ - "github.com/kserve/kserve/pkg/apis/serving/v1beta1.StorageSpec", "k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"}, + "github.com/kserve/kserve/pkg/apis/serving/v1beta1.StorageSpec", "k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.ContainerRestartRule", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"}, } } @@ -12359,7 +12627,7 @@ func schema_pkg_apis_serving_v1beta1_XGBoostSpec(ref common.ReferenceCallback) c }, }, SchemaProps: spec.SchemaProps{ - Description: "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + Description: "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -12423,11 +12691,30 @@ func schema_pkg_apis_serving_v1beta1_XGBoostSpec(ref common.ReferenceCallback) c }, "restartPolicy": { SchemaProps: spec.SchemaProps{ - Description: "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + Description: "RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", Type: []string{"string"}, Format: "", }, }, + "restartPolicyRules": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/core/v1.ContainerRestartRule"), + }, + }, + }, + }, + }, "volumeMounts": { VendorExtensible: spec.VendorExtensible{ Extensions: spec.Extensions{ @@ -12559,6 +12846,6 @@ func schema_pkg_apis_serving_v1beta1_XGBoostSpec(ref common.ReferenceCallback) c }, }, Dependencies: []string{ - "github.com/kserve/kserve/pkg/apis/serving/v1beta1.StorageSpec", "k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"}, + "github.com/kserve/kserve/pkg/apis/serving/v1beta1.StorageSpec", "k8s.io/api/core/v1.ContainerPort", "k8s.io/api/core/v1.ContainerResizePolicy", "k8s.io/api/core/v1.ContainerRestartRule", "k8s.io/api/core/v1.EnvFromSource", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.Lifecycle", "k8s.io/api/core/v1.Probe", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.SecurityContext", "k8s.io/api/core/v1.VolumeDevice", "k8s.io/api/core/v1.VolumeMount"}, } } diff --git a/pkg/openapi/swagger.json b/pkg/openapi/swagger.json index 6df65c1cd27..1d5bc467c37 100644 --- a/pkg/openapi/swagger.json +++ b/pkg/openapi/swagger.json @@ -1204,7 +1204,7 @@ "x-kubernetes-patch-strategy": "merge" }, "envFrom": { - "description": "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + "description": "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", "type": "array", "items": { "default": {}, @@ -1267,9 +1267,18 @@ "$ref": "#/definitions/v1.ResourceRequirements" }, "restartPolicy": { - "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", "type": "string" }, + "restartPolicyRules": { + "description": "Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.", + "type": "array", + "items": { + "default": {}, + "$ref": "#/definitions/v1.ContainerRestartRule" + }, + "x-kubernetes-list-type": "atomic" + }, "runtimeVersion": { "description": "Defaults to latest Explainer Version", "type": "string" @@ -1594,7 +1603,7 @@ "type": "boolean" }, "hostNetwork": { - "description": "Host networking requested for this pod. Use the host's network namespace. If this option is set, the ports that will be used must be specified. Default to false.", + "description": "Host networking requested for this pod. Use the host's network namespace. When using HostNetwork you should specify ports so the scheduler is aware. When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. Default to false.", "type": "boolean" }, "hostPID": { @@ -1609,6 +1618,10 @@ "description": "Specifies the hostname of the Pod If not specified, the pod's hostname will be set to a system-defined value.", "type": "string" }, + "hostnameOverride": { + "description": "HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. This field only specifies the pod's hostname and does not affect its DNS records. When this field is set to a non-empty string: - It takes precedence over the values set in `hostname` and `subdomain`. - The Pod's hostname will be set to this value. - `setHostnameAsFQDN` must be nil or set to false. - `hostNetwork` must be set to false.\n\nThis field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. Requires the HostnameOverride feature gate to be enabled.", + "type": "string" + }, "imagePullSecrets": { "description": "ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec. If specified, these secrets will be passed to individual puller implementations for them to use. More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod", "type": "array", @@ -1651,7 +1664,7 @@ "x-kubernetes-map-type": "atomic" }, "os": { - "description": "Specifies the OS of the containers in the pod. Some pod and container fields are restricted if this is set.\n\nIf the OS field is set to linux, the following fields must be unset: -securityContext.windowsOptions\n\nIf the OS field is set to windows, following fields must be unset: - spec.hostPID - spec.hostIPC - spec.hostUsers - spec.securityContext.appArmorProfile - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile - spec.securityContext.fsGroup - spec.securityContext.fsGroupChangePolicy - spec.securityContext.sysctls - spec.shareProcessNamespace - spec.securityContext.runAsUser - spec.securityContext.runAsGroup - spec.securityContext.supplementalGroups - spec.securityContext.supplementalGroupsPolicy - spec.containers[*].securityContext.appArmorProfile - spec.containers[*].securityContext.seLinuxOptions - spec.containers[*].securityContext.seccompProfile - spec.containers[*].securityContext.capabilities - spec.containers[*].securityContext.readOnlyRootFilesystem - spec.containers[*].securityContext.privileged - spec.containers[*].securityContext.allowPrivilegeEscalation - spec.containers[*].securityContext.procMount - spec.containers[*].securityContext.runAsUser - spec.containers[*].securityContext.runAsGroup", + "description": "Specifies the OS of the containers in the pod. Some pod and container fields are restricted if this is set.\n\nIf the OS field is set to linux, the following fields must be unset: -securityContext.windowsOptions\n\nIf the OS field is set to windows, following fields must be unset: - spec.hostPID - spec.hostIPC - spec.hostUsers - spec.resources - spec.securityContext.appArmorProfile - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile - spec.securityContext.fsGroup - spec.securityContext.fsGroupChangePolicy - spec.securityContext.sysctls - spec.shareProcessNamespace - spec.securityContext.runAsUser - spec.securityContext.runAsGroup - spec.securityContext.supplementalGroups - spec.securityContext.supplementalGroupsPolicy - spec.containers[*].securityContext.appArmorProfile - spec.containers[*].securityContext.seLinuxOptions - spec.containers[*].securityContext.seccompProfile - spec.containers[*].securityContext.capabilities - spec.containers[*].securityContext.readOnlyRootFilesystem - spec.containers[*].securityContext.privileged - spec.containers[*].securityContext.allowPrivilegeEscalation - spec.containers[*].securityContext.procMount - spec.containers[*].securityContext.runAsUser - spec.containers[*].securityContext.runAsGroup", "$ref": "#/definitions/v1.PodOS" }, "overhead": { @@ -1698,7 +1711,7 @@ "x-kubernetes-patch-strategy": "merge,retainKeys" }, "resources": { - "description": "Resources is the total amount of CPU and Memory resources required by all containers in the pod. It supports specifying Requests and Limits for \"cpu\" and \"memory\" resource names only. ResourceClaims are not supported.\n\nThis field enables fine-grained control over resource allocation for the entire pod, allowing resource sharing among containers in a pod.\n\nThis is an alpha field and requires enabling the PodLevelResources feature gate.", + "description": "Resources is the total amount of CPU and Memory resources required by all containers in the pod. It supports specifying Requests and Limits for \"cpu\", \"memory\" and \"hugepages-\" resource names only. ResourceClaims are not supported.\n\nThis field enables fine-grained control over resource allocation for the entire pod, allowing resource sharing among containers in a pod.\n\nThis is an alpha field and requires enabling the PodLevelResources feature gate.", "$ref": "#/definitions/v1.ResourceRequirements" }, "restartPolicy": { @@ -1875,7 +1888,7 @@ "type": "boolean" }, "hostNetwork": { - "description": "Host networking requested for this pod. Use the host's network namespace. If this option is set, the ports that will be used must be specified. Default to false.", + "description": "Host networking requested for this pod. Use the host's network namespace. When using HostNetwork you should specify ports so the scheduler is aware. When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. Default to false.", "type": "boolean" }, "hostPID": { @@ -1890,6 +1903,10 @@ "description": "Specifies the hostname of the Pod If not specified, the pod's hostname will be set to a system-defined value.", "type": "string" }, + "hostnameOverride": { + "description": "HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. This field only specifies the pod's hostname and does not affect its DNS records. When this field is set to a non-empty string: - It takes precedence over the values set in `hostname` and `subdomain`. - The Pod's hostname will be set to this value. - `setHostnameAsFQDN` must be nil or set to false. - `hostNetwork` must be set to false.\n\nThis field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. Requires the HostnameOverride feature gate to be enabled.", + "type": "string" + }, "imagePullSecrets": { "description": "ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec. If specified, these secrets will be passed to individual puller implementations for them to use. More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod", "type": "array", @@ -1932,7 +1949,7 @@ "x-kubernetes-map-type": "atomic" }, "os": { - "description": "Specifies the OS of the containers in the pod. Some pod and container fields are restricted if this is set.\n\nIf the OS field is set to linux, the following fields must be unset: -securityContext.windowsOptions\n\nIf the OS field is set to windows, following fields must be unset: - spec.hostPID - spec.hostIPC - spec.hostUsers - spec.securityContext.appArmorProfile - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile - spec.securityContext.fsGroup - spec.securityContext.fsGroupChangePolicy - spec.securityContext.sysctls - spec.shareProcessNamespace - spec.securityContext.runAsUser - spec.securityContext.runAsGroup - spec.securityContext.supplementalGroups - spec.securityContext.supplementalGroupsPolicy - spec.containers[*].securityContext.appArmorProfile - spec.containers[*].securityContext.seLinuxOptions - spec.containers[*].securityContext.seccompProfile - spec.containers[*].securityContext.capabilities - spec.containers[*].securityContext.readOnlyRootFilesystem - spec.containers[*].securityContext.privileged - spec.containers[*].securityContext.allowPrivilegeEscalation - spec.containers[*].securityContext.procMount - spec.containers[*].securityContext.runAsUser - spec.containers[*].securityContext.runAsGroup", + "description": "Specifies the OS of the containers in the pod. Some pod and container fields are restricted if this is set.\n\nIf the OS field is set to linux, the following fields must be unset: -securityContext.windowsOptions\n\nIf the OS field is set to windows, following fields must be unset: - spec.hostPID - spec.hostIPC - spec.hostUsers - spec.resources - spec.securityContext.appArmorProfile - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile - spec.securityContext.fsGroup - spec.securityContext.fsGroupChangePolicy - spec.securityContext.sysctls - spec.shareProcessNamespace - spec.securityContext.runAsUser - spec.securityContext.runAsGroup - spec.securityContext.supplementalGroups - spec.securityContext.supplementalGroupsPolicy - spec.containers[*].securityContext.appArmorProfile - spec.containers[*].securityContext.seLinuxOptions - spec.containers[*].securityContext.seccompProfile - spec.containers[*].securityContext.capabilities - spec.containers[*].securityContext.readOnlyRootFilesystem - spec.containers[*].securityContext.privileged - spec.containers[*].securityContext.allowPrivilegeEscalation - spec.containers[*].securityContext.procMount - spec.containers[*].securityContext.runAsUser - spec.containers[*].securityContext.runAsGroup", "$ref": "#/definitions/v1.PodOS" }, "overhead": { @@ -1979,7 +1996,7 @@ "x-kubernetes-patch-strategy": "merge,retainKeys" }, "resources": { - "description": "Resources is the total amount of CPU and Memory resources required by all containers in the pod. It supports specifying Requests and Limits for \"cpu\" and \"memory\" resource names only. ResourceClaims are not supported.\n\nThis field enables fine-grained control over resource allocation for the entire pod, allowing resource sharing among containers in a pod.\n\nThis is an alpha field and requires enabling the PodLevelResources feature gate.", + "description": "Resources is the total amount of CPU and Memory resources required by all containers in the pod. It supports specifying Requests and Limits for \"cpu\", \"memory\" and \"hugepages-\" resource names only. ResourceClaims are not supported.\n\nThis field enables fine-grained control over resource allocation for the entire pod, allowing resource sharing among containers in a pod.\n\nThis is an alpha field and requires enabling the PodLevelResources feature gate.", "$ref": "#/definitions/v1.ResourceRequirements" }, "restartPolicy": { @@ -2156,7 +2173,7 @@ "type": "boolean" }, "hostNetwork": { - "description": "Host networking requested for this pod. Use the host's network namespace. If this option is set, the ports that will be used must be specified. Default to false.", + "description": "Host networking requested for this pod. Use the host's network namespace. When using HostNetwork you should specify ports so the scheduler is aware. When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. Default to false.", "type": "boolean" }, "hostPID": { @@ -2171,6 +2188,10 @@ "description": "Specifies the hostname of the Pod If not specified, the pod's hostname will be set to a system-defined value.", "type": "string" }, + "hostnameOverride": { + "description": "HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. This field only specifies the pod's hostname and does not affect its DNS records. When this field is set to a non-empty string: - It takes precedence over the values set in `hostname` and `subdomain`. - The Pod's hostname will be set to this value. - `setHostnameAsFQDN` must be nil or set to false. - `hostNetwork` must be set to false.\n\nThis field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. Requires the HostnameOverride feature gate to be enabled.", + "type": "string" + }, "imagePullSecrets": { "description": "ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec. If specified, these secrets will be passed to individual puller implementations for them to use. More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod", "type": "array", @@ -2213,7 +2234,7 @@ "x-kubernetes-map-type": "atomic" }, "os": { - "description": "Specifies the OS of the containers in the pod. Some pod and container fields are restricted if this is set.\n\nIf the OS field is set to linux, the following fields must be unset: -securityContext.windowsOptions\n\nIf the OS field is set to windows, following fields must be unset: - spec.hostPID - spec.hostIPC - spec.hostUsers - spec.securityContext.appArmorProfile - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile - spec.securityContext.fsGroup - spec.securityContext.fsGroupChangePolicy - spec.securityContext.sysctls - spec.shareProcessNamespace - spec.securityContext.runAsUser - spec.securityContext.runAsGroup - spec.securityContext.supplementalGroups - spec.securityContext.supplementalGroupsPolicy - spec.containers[*].securityContext.appArmorProfile - spec.containers[*].securityContext.seLinuxOptions - spec.containers[*].securityContext.seccompProfile - spec.containers[*].securityContext.capabilities - spec.containers[*].securityContext.readOnlyRootFilesystem - spec.containers[*].securityContext.privileged - spec.containers[*].securityContext.allowPrivilegeEscalation - spec.containers[*].securityContext.procMount - spec.containers[*].securityContext.runAsUser - spec.containers[*].securityContext.runAsGroup", + "description": "Specifies the OS of the containers in the pod. Some pod and container fields are restricted if this is set.\n\nIf the OS field is set to linux, the following fields must be unset: -securityContext.windowsOptions\n\nIf the OS field is set to windows, following fields must be unset: - spec.hostPID - spec.hostIPC - spec.hostUsers - spec.resources - spec.securityContext.appArmorProfile - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile - spec.securityContext.fsGroup - spec.securityContext.fsGroupChangePolicy - spec.securityContext.sysctls - spec.shareProcessNamespace - spec.securityContext.runAsUser - spec.securityContext.runAsGroup - spec.securityContext.supplementalGroups - spec.securityContext.supplementalGroupsPolicy - spec.containers[*].securityContext.appArmorProfile - spec.containers[*].securityContext.seLinuxOptions - spec.containers[*].securityContext.seccompProfile - spec.containers[*].securityContext.capabilities - spec.containers[*].securityContext.readOnlyRootFilesystem - spec.containers[*].securityContext.privileged - spec.containers[*].securityContext.allowPrivilegeEscalation - spec.containers[*].securityContext.procMount - spec.containers[*].securityContext.runAsUser - spec.containers[*].securityContext.runAsGroup", "$ref": "#/definitions/v1.PodOS" }, "overhead": { @@ -2260,7 +2281,7 @@ "x-kubernetes-patch-strategy": "merge,retainKeys" }, "resources": { - "description": "Resources is the total amount of CPU and Memory resources required by all containers in the pod. It supports specifying Requests and Limits for \"cpu\" and \"memory\" resource names only. ResourceClaims are not supported.\n\nThis field enables fine-grained control over resource allocation for the entire pod, allowing resource sharing among containers in a pod.\n\nThis is an alpha field and requires enabling the PodLevelResources feature gate.", + "description": "Resources is the total amount of CPU and Memory resources required by all containers in the pod. It supports specifying Requests and Limits for \"cpu\", \"memory\" and \"hugepages-\" resource names only. ResourceClaims are not supported.\n\nThis field enables fine-grained control over resource allocation for the entire pod, allowing resource sharing among containers in a pod.\n\nThis is an alpha field and requires enabling the PodLevelResources feature gate.", "$ref": "#/definitions/v1.ResourceRequirements" }, "restartPolicy": { @@ -2430,7 +2451,7 @@ "x-kubernetes-patch-strategy": "merge" }, "envFrom": { - "description": "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + "description": "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", "type": "array", "items": { "default": {}, @@ -2493,9 +2514,18 @@ "$ref": "#/definitions/v1.ResourceRequirements" }, "restartPolicy": { - "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", "type": "string" }, + "restartPolicyRules": { + "description": "Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.", + "type": "array", + "items": { + "default": {}, + "$ref": "#/definitions/v1.ContainerRestartRule" + }, + "x-kubernetes-list-type": "atomic" + }, "runtimeVersion": { "description": "Defaults to latest Explainer Version", "type": "string" @@ -3034,7 +3064,7 @@ "x-kubernetes-patch-strategy": "merge" }, "envFrom": { - "description": "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + "description": "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", "type": "array", "items": { "default": {}, @@ -3101,9 +3131,18 @@ "$ref": "#/definitions/v1.ResourceRequirements" }, "restartPolicy": { - "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", "type": "string" }, + "restartPolicyRules": { + "description": "Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.", + "type": "array", + "items": { + "default": {}, + "$ref": "#/definitions/v1.ContainerRestartRule" + }, + "x-kubernetes-list-type": "atomic" + }, "runtimeVersion": { "description": "Runtime version of the predictor docker image", "type": "string" @@ -3439,7 +3478,7 @@ "x-kubernetes-patch-strategy": "merge" }, "envFrom": { - "description": "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + "description": "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", "type": "array", "items": { "default": {}, @@ -3506,9 +3545,18 @@ "$ref": "#/definitions/v1.ResourceRequirements" }, "restartPolicy": { - "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", "type": "string" }, + "restartPolicyRules": { + "description": "Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.", + "type": "array", + "items": { + "default": {}, + "$ref": "#/definitions/v1.ContainerRestartRule" + }, + "x-kubernetes-list-type": "atomic" + }, "runtimeVersion": { "description": "Runtime version of the predictor docker image", "type": "string" @@ -3786,7 +3834,7 @@ "x-kubernetes-patch-strategy": "merge" }, "envFrom": { - "description": "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + "description": "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", "type": "array", "items": { "default": {}, @@ -3858,9 +3906,18 @@ "$ref": "#/definitions/v1.ResourceRequirements" }, "restartPolicy": { - "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", "type": "string" }, + "restartPolicyRules": { + "description": "Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.", + "type": "array", + "items": { + "default": {}, + "$ref": "#/definitions/v1.ContainerRestartRule" + }, + "x-kubernetes-list-type": "atomic" + }, "runtime": { "description": "Specific ClusterServingRuntime/ServingRuntime name to use for deployment.", "type": "string" @@ -4014,7 +4071,7 @@ "x-kubernetes-patch-strategy": "merge" }, "envFrom": { - "description": "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + "description": "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", "type": "array", "items": { "default": {}, @@ -4081,9 +4138,18 @@ "$ref": "#/definitions/v1.ResourceRequirements" }, "restartPolicy": { - "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", "type": "string" }, + "restartPolicyRules": { + "description": "Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.", + "type": "array", + "items": { + "default": {}, + "$ref": "#/definitions/v1.ContainerRestartRule" + }, + "x-kubernetes-list-type": "atomic" + }, "runtimeVersion": { "description": "Runtime version of the predictor docker image", "type": "string" @@ -4241,7 +4307,7 @@ "x-kubernetes-patch-strategy": "merge" }, "envFrom": { - "description": "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + "description": "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", "type": "array", "items": { "default": {}, @@ -4308,9 +4374,18 @@ "$ref": "#/definitions/v1.ResourceRequirements" }, "restartPolicy": { - "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", "type": "string" }, + "restartPolicyRules": { + "description": "Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.", + "type": "array", + "items": { + "default": {}, + "$ref": "#/definitions/v1.ContainerRestartRule" + }, + "x-kubernetes-list-type": "atomic" + }, "runtimeVersion": { "description": "Runtime version of the predictor docker image", "type": "string" @@ -4421,7 +4496,7 @@ "x-kubernetes-patch-strategy": "merge" }, "envFrom": { - "description": "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + "description": "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", "type": "array", "items": { "default": {}, @@ -4488,9 +4563,18 @@ "$ref": "#/definitions/v1.ResourceRequirements" }, "restartPolicy": { - "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", "type": "string" }, + "restartPolicyRules": { + "description": "Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.", + "type": "array", + "items": { + "default": {}, + "$ref": "#/definitions/v1.ContainerRestartRule" + }, + "x-kubernetes-list-type": "atomic" + }, "runtimeVersion": { "description": "Runtime version of the predictor docker image", "type": "string" @@ -4904,7 +4988,7 @@ "x-kubernetes-patch-strategy": "merge" }, "envFrom": { - "description": "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + "description": "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", "type": "array", "items": { "default": {}, @@ -4971,9 +5055,18 @@ "$ref": "#/definitions/v1.ResourceRequirements" }, "restartPolicy": { - "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", "type": "string" }, + "restartPolicyRules": { + "description": "Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.", + "type": "array", + "items": { + "default": {}, + "$ref": "#/definitions/v1.ContainerRestartRule" + }, + "x-kubernetes-list-type": "atomic" + }, "runtimeVersion": { "description": "Runtime version of the predictor docker image", "type": "string" @@ -5491,7 +5584,7 @@ "x-kubernetes-patch-strategy": "merge" }, "envFrom": { - "description": "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + "description": "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", "type": "array", "items": { "default": {}, @@ -5558,9 +5651,18 @@ "$ref": "#/definitions/v1.ResourceRequirements" }, "restartPolicy": { - "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", "type": "string" }, + "restartPolicyRules": { + "description": "Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.", + "type": "array", + "items": { + "default": {}, + "$ref": "#/definitions/v1.ContainerRestartRule" + }, + "x-kubernetes-list-type": "atomic" + }, "runtimeVersion": { "description": "Runtime version of the predictor docker image", "type": "string" @@ -5718,7 +5820,7 @@ "x-kubernetes-patch-strategy": "merge" }, "envFrom": { - "description": "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + "description": "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", "type": "array", "items": { "default": {}, @@ -5785,9 +5887,18 @@ "$ref": "#/definitions/v1.ResourceRequirements" }, "restartPolicy": { - "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", "type": "string" }, + "restartPolicyRules": { + "description": "Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.", + "type": "array", + "items": { + "default": {}, + "$ref": "#/definitions/v1.ContainerRestartRule" + }, + "x-kubernetes-list-type": "atomic" + }, "runtimeVersion": { "description": "Runtime version of the predictor docker image", "type": "string" @@ -5899,7 +6010,7 @@ "x-kubernetes-patch-strategy": "merge" }, "envFrom": { - "description": "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + "description": "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", "type": "array", "items": { "default": {}, @@ -5966,9 +6077,18 @@ "$ref": "#/definitions/v1.ResourceRequirements" }, "restartPolicy": { - "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", "type": "string" }, + "restartPolicyRules": { + "description": "Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.", + "type": "array", + "items": { + "default": {}, + "$ref": "#/definitions/v1.ContainerRestartRule" + }, + "x-kubernetes-list-type": "atomic" + }, "runtimeVersion": { "description": "Runtime version of the predictor docker image", "type": "string" @@ -6402,7 +6522,7 @@ "x-kubernetes-patch-strategy": "merge" }, "envFrom": { - "description": "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + "description": "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", "type": "array", "items": { "default": {}, @@ -6469,9 +6589,18 @@ "$ref": "#/definitions/v1.ResourceRequirements" }, "restartPolicy": { - "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", "type": "string" }, + "restartPolicyRules": { + "description": "Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.", + "type": "array", + "items": { + "default": {}, + "$ref": "#/definitions/v1.ContainerRestartRule" + }, + "x-kubernetes-list-type": "atomic" + }, "runtimeVersion": { "description": "Runtime version of the predictor docker image", "type": "string" @@ -6844,7 +6973,7 @@ "x-kubernetes-patch-strategy": "merge" }, "envFrom": { - "description": "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + "description": "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", "type": "array", "items": { "default": {}, @@ -6911,9 +7040,18 @@ "$ref": "#/definitions/v1.ResourceRequirements" }, "restartPolicy": { - "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", "type": "string" }, + "restartPolicyRules": { + "description": "Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.", + "type": "array", + "items": { + "default": {}, + "$ref": "#/definitions/v1.ContainerRestartRule" + }, + "x-kubernetes-list-type": "atomic" + }, "runtimeVersion": { "description": "Runtime version of the predictor docker image", "type": "string" diff --git a/pkg/testing/ctrl.go b/pkg/testing/ctrl.go index b4254d547f0..7d726e4ff14 100644 --- a/pkg/testing/ctrl.go +++ b/pkg/testing/ctrl.go @@ -33,7 +33,7 @@ import ( "github.com/kserve/kserve/pkg/apis/serving/v1alpha1" "github.com/kserve/kserve/pkg/apis/serving/v1beta1" - igwapi "sigs.k8s.io/gateway-api-inference-extension/api/v1alpha2" + igwv1 "sigs.k8s.io/gateway-api-inference-extension/api/v1" gatewayapiv1 "sigs.k8s.io/gateway-api/apis/v1" ) @@ -53,7 +53,7 @@ func NewEnvTest(options ...Option) *Config { apiextv1.AddToScheme, netv1.AddToScheme, gatewayapiv1.Install, - igwapi.Install, + igwv1.Install, // Other Schemes knservingv1.AddToScheme, istioclientv1beta1.AddToScheme, diff --git a/python/kserve/docs/V1beta1ARTExplainerSpec.md b/python/kserve/docs/V1beta1ARTExplainerSpec.md index 83bfab3f924..937d91fef2f 100644 --- a/python/kserve/docs/V1beta1ARTExplainerSpec.md +++ b/python/kserve/docs/V1beta1ARTExplainerSpec.md @@ -8,7 +8,7 @@ Name | Type | Description | Notes **command** | **list[str]** | Entrypoint array. Not executed within a shell. The container image's ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell | [optional] **config** | **dict(str, str)** | Inline custom parameter settings for explainer | [optional] **env** | [**list[V1EnvVar]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvVar.md) | List of environment variables to set in the container. Cannot be updated. | [optional] -**env_from** | [**list[V1EnvFromSource]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvFromSource.md) | List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. | [optional] +**env_from** | [**list[V1EnvFromSource]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvFromSource.md) | List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. | [optional] **image** | **str** | Container image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets. | [optional] **image_pull_policy** | **str** | Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images | [optional] **lifecycle** | [**V1Lifecycle**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Lifecycle.md) | | [optional] @@ -18,7 +18,8 @@ Name | Type | Description | Notes **readiness_probe** | [**V1Probe**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Probe.md) | | [optional] **resize_policy** | [**list[V1ContainerResizePolicy]**](V1ContainerResizePolicy.md) | Resources resize policy for the container. | [optional] **resources** | [**V1ResourceRequirements**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1ResourceRequirements.md) | | [optional] -**restart_policy** | **str** | RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. | [optional] +**restart_policy** | **str** | RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. | [optional] +**restart_policy_rules** | [**list[V1ContainerRestartRule]**](V1ContainerRestartRule.md) | Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. | [optional] **runtime_version** | **str** | Defaults to latest Explainer Version | [optional] **security_context** | [**V1SecurityContext**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1SecurityContext.md) | | [optional] **startup_probe** | [**V1Probe**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Probe.md) | | [optional] diff --git a/python/kserve/docs/V1beta1CustomExplainer.md b/python/kserve/docs/V1beta1CustomExplainer.md index 59b32145a40..4be3be04598 100644 --- a/python/kserve/docs/V1beta1CustomExplainer.md +++ b/python/kserve/docs/V1beta1CustomExplainer.md @@ -14,10 +14,11 @@ Name | Type | Description | Notes **ephemeral_containers** | [**list[V1EphemeralContainer]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EphemeralContainer.md) | List of ephemeral containers run in this pod. Ephemeral containers may be run in an existing pod to perform user-initiated actions such as debugging. This list cannot be specified when creating a pod, and it cannot be modified by updating the pod spec. In order to add an ephemeral container to an existing pod, use the pod's ephemeralcontainers subresource. | [optional] **host_aliases** | [**list[V1HostAlias]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1HostAlias.md) | HostAliases is an optional list of hosts and IPs that will be injected into the pod's hosts file if specified. | [optional] **host_ipc** | **bool** | Use the host's ipc namespace. Optional: Default to false. | [optional] -**host_network** | **bool** | Host networking requested for this pod. Use the host's network namespace. If this option is set, the ports that will be used must be specified. Default to false. | [optional] +**host_network** | **bool** | Host networking requested for this pod. Use the host's network namespace. When using HostNetwork you should specify ports so the scheduler is aware. When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. Default to false. | [optional] **host_pid** | **bool** | Use the host's pid namespace. Optional: Default to false. | [optional] **host_users** | **bool** | Use the host's user namespace. Optional: Default to true. If set to true or not present, the pod will be run in the host user namespace, useful for when the pod needs a feature only available to the host user namespace, such as loading a kernel module with CAP_SYS_MODULE. When set to false, a new userns is created for the pod. Setting false is useful for mitigating container breakout vulnerabilities even allowing users to run their containers as root without actually having root privileges on the host. This field is alpha-level and is only honored by servers that enable the UserNamespacesSupport feature. | [optional] **hostname** | **str** | Specifies the hostname of the Pod If not specified, the pod's hostname will be set to a system-defined value. | [optional] +**hostname_override** | **str** | HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. This field only specifies the pod's hostname and does not affect its DNS records. When this field is set to a non-empty string: - It takes precedence over the values set in `hostname` and `subdomain`. - The Pod's hostname will be set to this value. - `setHostnameAsFQDN` must be nil or set to false. - `hostNetwork` must be set to false. This field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. Requires the HostnameOverride feature gate to be enabled. | [optional] **image_pull_secrets** | [**list[V1LocalObjectReference]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1LocalObjectReference.md) | ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec. If specified, these secrets will be passed to individual puller implementations for them to use. More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod | [optional] **init_containers** | [**list[V1Container]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Container.md) | List of initialization containers belonging to the pod. Init containers are executed in order prior to containers being started. If any init container fails, the pod is considered to have failed and is handled according to its restartPolicy. The name for an init container or normal container must be unique among all containers. Init containers may not have Lifecycle actions, Readiness probes, Liveness probes, or Startup probes. The resourceRequirements of an init container are taken into account during scheduling by finding the highest request/limit for each resource type, and then using the max of that value or the sum of the normal containers. Limits are applied to init containers in a similar fashion. Init containers cannot currently be added or removed. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/ | [optional] **node_name** | **str** | NodeName indicates in which node this pod is scheduled. If empty, this pod is a candidate for scheduling by the scheduler defined in schedulerName. Once this field is set, the kubelet for this node becomes responsible for the lifecycle of this pod. This field should not be used to express a desire for the pod to be scheduled on a specific node. https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodename | [optional] diff --git a/python/kserve/docs/V1beta1CustomPredictor.md b/python/kserve/docs/V1beta1CustomPredictor.md index 8d49ffdf134..442dd3fbb9f 100644 --- a/python/kserve/docs/V1beta1CustomPredictor.md +++ b/python/kserve/docs/V1beta1CustomPredictor.md @@ -14,10 +14,11 @@ Name | Type | Description | Notes **ephemeral_containers** | [**list[V1EphemeralContainer]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EphemeralContainer.md) | List of ephemeral containers run in this pod. Ephemeral containers may be run in an existing pod to perform user-initiated actions such as debugging. This list cannot be specified when creating a pod, and it cannot be modified by updating the pod spec. In order to add an ephemeral container to an existing pod, use the pod's ephemeralcontainers subresource. | [optional] **host_aliases** | [**list[V1HostAlias]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1HostAlias.md) | HostAliases is an optional list of hosts and IPs that will be injected into the pod's hosts file if specified. | [optional] **host_ipc** | **bool** | Use the host's ipc namespace. Optional: Default to false. | [optional] -**host_network** | **bool** | Host networking requested for this pod. Use the host's network namespace. If this option is set, the ports that will be used must be specified. Default to false. | [optional] +**host_network** | **bool** | Host networking requested for this pod. Use the host's network namespace. When using HostNetwork you should specify ports so the scheduler is aware. When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. Default to false. | [optional] **host_pid** | **bool** | Use the host's pid namespace. Optional: Default to false. | [optional] **host_users** | **bool** | Use the host's user namespace. Optional: Default to true. If set to true or not present, the pod will be run in the host user namespace, useful for when the pod needs a feature only available to the host user namespace, such as loading a kernel module with CAP_SYS_MODULE. When set to false, a new userns is created for the pod. Setting false is useful for mitigating container breakout vulnerabilities even allowing users to run their containers as root without actually having root privileges on the host. This field is alpha-level and is only honored by servers that enable the UserNamespacesSupport feature. | [optional] **hostname** | **str** | Specifies the hostname of the Pod If not specified, the pod's hostname will be set to a system-defined value. | [optional] +**hostname_override** | **str** | HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. This field only specifies the pod's hostname and does not affect its DNS records. When this field is set to a non-empty string: - It takes precedence over the values set in `hostname` and `subdomain`. - The Pod's hostname will be set to this value. - `setHostnameAsFQDN` must be nil or set to false. - `hostNetwork` must be set to false. This field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. Requires the HostnameOverride feature gate to be enabled. | [optional] **image_pull_secrets** | [**list[V1LocalObjectReference]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1LocalObjectReference.md) | ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec. If specified, these secrets will be passed to individual puller implementations for them to use. More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod | [optional] **init_containers** | [**list[V1Container]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Container.md) | List of initialization containers belonging to the pod. Init containers are executed in order prior to containers being started. If any init container fails, the pod is considered to have failed and is handled according to its restartPolicy. The name for an init container or normal container must be unique among all containers. Init containers may not have Lifecycle actions, Readiness probes, Liveness probes, or Startup probes. The resourceRequirements of an init container are taken into account during scheduling by finding the highest request/limit for each resource type, and then using the max of that value or the sum of the normal containers. Limits are applied to init containers in a similar fashion. Init containers cannot currently be added or removed. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/ | [optional] **node_name** | **str** | NodeName indicates in which node this pod is scheduled. If empty, this pod is a candidate for scheduling by the scheduler defined in schedulerName. Once this field is set, the kubelet for this node becomes responsible for the lifecycle of this pod. This field should not be used to express a desire for the pod to be scheduled on a specific node. https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodename | [optional] diff --git a/python/kserve/docs/V1beta1CustomTransformer.md b/python/kserve/docs/V1beta1CustomTransformer.md index 03eb4d022ac..b83f4a50627 100644 --- a/python/kserve/docs/V1beta1CustomTransformer.md +++ b/python/kserve/docs/V1beta1CustomTransformer.md @@ -14,10 +14,11 @@ Name | Type | Description | Notes **ephemeral_containers** | [**list[V1EphemeralContainer]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EphemeralContainer.md) | List of ephemeral containers run in this pod. Ephemeral containers may be run in an existing pod to perform user-initiated actions such as debugging. This list cannot be specified when creating a pod, and it cannot be modified by updating the pod spec. In order to add an ephemeral container to an existing pod, use the pod's ephemeralcontainers subresource. | [optional] **host_aliases** | [**list[V1HostAlias]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1HostAlias.md) | HostAliases is an optional list of hosts and IPs that will be injected into the pod's hosts file if specified. | [optional] **host_ipc** | **bool** | Use the host's ipc namespace. Optional: Default to false. | [optional] -**host_network** | **bool** | Host networking requested for this pod. Use the host's network namespace. If this option is set, the ports that will be used must be specified. Default to false. | [optional] +**host_network** | **bool** | Host networking requested for this pod. Use the host's network namespace. When using HostNetwork you should specify ports so the scheduler is aware. When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. Default to false. | [optional] **host_pid** | **bool** | Use the host's pid namespace. Optional: Default to false. | [optional] **host_users** | **bool** | Use the host's user namespace. Optional: Default to true. If set to true or not present, the pod will be run in the host user namespace, useful for when the pod needs a feature only available to the host user namespace, such as loading a kernel module with CAP_SYS_MODULE. When set to false, a new userns is created for the pod. Setting false is useful for mitigating container breakout vulnerabilities even allowing users to run their containers as root without actually having root privileges on the host. This field is alpha-level and is only honored by servers that enable the UserNamespacesSupport feature. | [optional] **hostname** | **str** | Specifies the hostname of the Pod If not specified, the pod's hostname will be set to a system-defined value. | [optional] +**hostname_override** | **str** | HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. This field only specifies the pod's hostname and does not affect its DNS records. When this field is set to a non-empty string: - It takes precedence over the values set in `hostname` and `subdomain`. - The Pod's hostname will be set to this value. - `setHostnameAsFQDN` must be nil or set to false. - `hostNetwork` must be set to false. This field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. Requires the HostnameOverride feature gate to be enabled. | [optional] **image_pull_secrets** | [**list[V1LocalObjectReference]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1LocalObjectReference.md) | ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec. If specified, these secrets will be passed to individual puller implementations for them to use. More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod | [optional] **init_containers** | [**list[V1Container]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Container.md) | List of initialization containers belonging to the pod. Init containers are executed in order prior to containers being started. If any init container fails, the pod is considered to have failed and is handled according to its restartPolicy. The name for an init container or normal container must be unique among all containers. Init containers may not have Lifecycle actions, Readiness probes, Liveness probes, or Startup probes. The resourceRequirements of an init container are taken into account during scheduling by finding the highest request/limit for each resource type, and then using the max of that value or the sum of the normal containers. Limits are applied to init containers in a similar fashion. Init containers cannot currently be added or removed. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/ | [optional] **node_name** | **str** | NodeName indicates in which node this pod is scheduled. If empty, this pod is a candidate for scheduling by the scheduler defined in schedulerName. Once this field is set, the kubelet for this node becomes responsible for the lifecycle of this pod. This field should not be used to express a desire for the pod to be scheduled on a specific node. https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodename | [optional] diff --git a/python/kserve/docs/V1beta1ExplainerExtensionSpec.md b/python/kserve/docs/V1beta1ExplainerExtensionSpec.md index acb6ee5563b..f5cf4ae5c24 100644 --- a/python/kserve/docs/V1beta1ExplainerExtensionSpec.md +++ b/python/kserve/docs/V1beta1ExplainerExtensionSpec.md @@ -8,7 +8,7 @@ Name | Type | Description | Notes **command** | **list[str]** | Entrypoint array. Not executed within a shell. The container image's ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell | [optional] **config** | **dict(str, str)** | Inline custom parameter settings for explainer | [optional] **env** | [**list[V1EnvVar]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvVar.md) | List of environment variables to set in the container. Cannot be updated. | [optional] -**env_from** | [**list[V1EnvFromSource]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvFromSource.md) | List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. | [optional] +**env_from** | [**list[V1EnvFromSource]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvFromSource.md) | List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. | [optional] **image** | **str** | Container image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets. | [optional] **image_pull_policy** | **str** | Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images | [optional] **lifecycle** | [**V1Lifecycle**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Lifecycle.md) | | [optional] @@ -18,7 +18,8 @@ Name | Type | Description | Notes **readiness_probe** | [**V1Probe**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Probe.md) | | [optional] **resize_policy** | [**list[V1ContainerResizePolicy]**](V1ContainerResizePolicy.md) | Resources resize policy for the container. | [optional] **resources** | [**V1ResourceRequirements**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1ResourceRequirements.md) | | [optional] -**restart_policy** | **str** | RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. | [optional] +**restart_policy** | **str** | RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. | [optional] +**restart_policy_rules** | [**list[V1ContainerRestartRule]**](V1ContainerRestartRule.md) | Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. | [optional] **runtime_version** | **str** | Defaults to latest Explainer Version | [optional] **security_context** | [**V1SecurityContext**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1SecurityContext.md) | | [optional] **startup_probe** | [**V1Probe**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Probe.md) | | [optional] diff --git a/python/kserve/docs/V1beta1HuggingFaceRuntimeSpec.md b/python/kserve/docs/V1beta1HuggingFaceRuntimeSpec.md index 6bd41ab0dc2..3c869c82ec9 100644 --- a/python/kserve/docs/V1beta1HuggingFaceRuntimeSpec.md +++ b/python/kserve/docs/V1beta1HuggingFaceRuntimeSpec.md @@ -7,7 +7,7 @@ Name | Type | Description | Notes **args** | **list[str]** | Arguments to the entrypoint. The container image's CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell | [optional] **command** | **list[str]** | Entrypoint array. Not executed within a shell. The container image's ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell | [optional] **env** | [**list[V1EnvVar]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvVar.md) | List of environment variables to set in the container. Cannot be updated. | [optional] -**env_from** | [**list[V1EnvFromSource]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvFromSource.md) | List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. | [optional] +**env_from** | [**list[V1EnvFromSource]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvFromSource.md) | List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. | [optional] **image** | **str** | Container image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets. | [optional] **image_pull_policy** | **str** | Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images | [optional] **lifecycle** | [**V1Lifecycle**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Lifecycle.md) | | [optional] @@ -18,7 +18,8 @@ Name | Type | Description | Notes **readiness_probe** | [**V1Probe**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Probe.md) | | [optional] **resize_policy** | [**list[V1ContainerResizePolicy]**](V1ContainerResizePolicy.md) | Resources resize policy for the container. | [optional] **resources** | [**V1ResourceRequirements**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1ResourceRequirements.md) | | [optional] -**restart_policy** | **str** | RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. | [optional] +**restart_policy** | **str** | RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. | [optional] +**restart_policy_rules** | [**list[V1ContainerRestartRule]**](V1ContainerRestartRule.md) | Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. | [optional] **runtime_version** | **str** | Runtime version of the predictor docker image | [optional] **security_context** | [**V1SecurityContext**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1SecurityContext.md) | | [optional] **startup_probe** | [**V1Probe**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Probe.md) | | [optional] diff --git a/python/kserve/docs/V1beta1LightGBMSpec.md b/python/kserve/docs/V1beta1LightGBMSpec.md index 94584ca1d85..e7ac7402857 100644 --- a/python/kserve/docs/V1beta1LightGBMSpec.md +++ b/python/kserve/docs/V1beta1LightGBMSpec.md @@ -7,7 +7,7 @@ Name | Type | Description | Notes **args** | **list[str]** | Arguments to the entrypoint. The container image's CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell | [optional] **command** | **list[str]** | Entrypoint array. Not executed within a shell. The container image's ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell | [optional] **env** | [**list[V1EnvVar]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvVar.md) | List of environment variables to set in the container. Cannot be updated. | [optional] -**env_from** | [**list[V1EnvFromSource]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvFromSource.md) | List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. | [optional] +**env_from** | [**list[V1EnvFromSource]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvFromSource.md) | List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. | [optional] **image** | **str** | Container image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets. | [optional] **image_pull_policy** | **str** | Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images | [optional] **lifecycle** | [**V1Lifecycle**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Lifecycle.md) | | [optional] @@ -18,7 +18,8 @@ Name | Type | Description | Notes **readiness_probe** | [**V1Probe**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Probe.md) | | [optional] **resize_policy** | [**list[V1ContainerResizePolicy]**](V1ContainerResizePolicy.md) | Resources resize policy for the container. | [optional] **resources** | [**V1ResourceRequirements**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1ResourceRequirements.md) | | [optional] -**restart_policy** | **str** | RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. | [optional] +**restart_policy** | **str** | RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. | [optional] +**restart_policy_rules** | [**list[V1ContainerRestartRule]**](V1ContainerRestartRule.md) | Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. | [optional] **runtime_version** | **str** | Runtime version of the predictor docker image | [optional] **security_context** | [**V1SecurityContext**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1SecurityContext.md) | | [optional] **startup_probe** | [**V1Probe**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Probe.md) | | [optional] diff --git a/python/kserve/docs/V1beta1ModelSpec.md b/python/kserve/docs/V1beta1ModelSpec.md index 7cd254b84e3..8c3965f3c8c 100644 --- a/python/kserve/docs/V1beta1ModelSpec.md +++ b/python/kserve/docs/V1beta1ModelSpec.md @@ -6,7 +6,7 @@ Name | Type | Description | Notes **args** | **list[str]** | Arguments to the entrypoint. The container image's CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell | [optional] **command** | **list[str]** | Entrypoint array. Not executed within a shell. The container image's ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell | [optional] **env** | [**list[V1EnvVar]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvVar.md) | List of environment variables to set in the container. Cannot be updated. | [optional] -**env_from** | [**list[V1EnvFromSource]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvFromSource.md) | List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. | [optional] +**env_from** | [**list[V1EnvFromSource]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvFromSource.md) | List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. | [optional] **image** | **str** | Container image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets. | [optional] **image_pull_policy** | **str** | Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images | [optional] **lifecycle** | [**V1Lifecycle**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Lifecycle.md) | | [optional] @@ -18,7 +18,8 @@ Name | Type | Description | Notes **readiness_probe** | [**V1Probe**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Probe.md) | | [optional] **resize_policy** | [**list[V1ContainerResizePolicy]**](V1ContainerResizePolicy.md) | Resources resize policy for the container. | [optional] **resources** | [**V1ResourceRequirements**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1ResourceRequirements.md) | | [optional] -**restart_policy** | **str** | RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. | [optional] +**restart_policy** | **str** | RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. | [optional] +**restart_policy_rules** | [**list[V1ContainerRestartRule]**](V1ContainerRestartRule.md) | Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. | [optional] **runtime** | **str** | Specific ClusterServingRuntime/ServingRuntime name to use for deployment. | [optional] **runtime_version** | **str** | Runtime version of the predictor docker image | [optional] **security_context** | [**V1SecurityContext**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1SecurityContext.md) | | [optional] diff --git a/python/kserve/docs/V1beta1ONNXRuntimeSpec.md b/python/kserve/docs/V1beta1ONNXRuntimeSpec.md index 580aeba0498..dda868378d9 100644 --- a/python/kserve/docs/V1beta1ONNXRuntimeSpec.md +++ b/python/kserve/docs/V1beta1ONNXRuntimeSpec.md @@ -7,7 +7,7 @@ Name | Type | Description | Notes **args** | **list[str]** | Arguments to the entrypoint. The container image's CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell | [optional] **command** | **list[str]** | Entrypoint array. Not executed within a shell. The container image's ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell | [optional] **env** | [**list[V1EnvVar]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvVar.md) | List of environment variables to set in the container. Cannot be updated. | [optional] -**env_from** | [**list[V1EnvFromSource]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvFromSource.md) | List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. | [optional] +**env_from** | [**list[V1EnvFromSource]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvFromSource.md) | List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. | [optional] **image** | **str** | Container image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets. | [optional] **image_pull_policy** | **str** | Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images | [optional] **lifecycle** | [**V1Lifecycle**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Lifecycle.md) | | [optional] @@ -18,7 +18,8 @@ Name | Type | Description | Notes **readiness_probe** | [**V1Probe**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Probe.md) | | [optional] **resize_policy** | [**list[V1ContainerResizePolicy]**](V1ContainerResizePolicy.md) | Resources resize policy for the container. | [optional] **resources** | [**V1ResourceRequirements**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1ResourceRequirements.md) | | [optional] -**restart_policy** | **str** | RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. | [optional] +**restart_policy** | **str** | RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. | [optional] +**restart_policy_rules** | [**list[V1ContainerRestartRule]**](V1ContainerRestartRule.md) | Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. | [optional] **runtime_version** | **str** | Runtime version of the predictor docker image | [optional] **security_context** | [**V1SecurityContext**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1SecurityContext.md) | | [optional] **startup_probe** | [**V1Probe**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Probe.md) | | [optional] diff --git a/python/kserve/docs/V1beta1PMMLSpec.md b/python/kserve/docs/V1beta1PMMLSpec.md index 66cd2242705..e75b5893b54 100644 --- a/python/kserve/docs/V1beta1PMMLSpec.md +++ b/python/kserve/docs/V1beta1PMMLSpec.md @@ -7,7 +7,7 @@ Name | Type | Description | Notes **args** | **list[str]** | Arguments to the entrypoint. The container image's CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell | [optional] **command** | **list[str]** | Entrypoint array. Not executed within a shell. The container image's ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell | [optional] **env** | [**list[V1EnvVar]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvVar.md) | List of environment variables to set in the container. Cannot be updated. | [optional] -**env_from** | [**list[V1EnvFromSource]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvFromSource.md) | List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. | [optional] +**env_from** | [**list[V1EnvFromSource]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvFromSource.md) | List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. | [optional] **image** | **str** | Container image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets. | [optional] **image_pull_policy** | **str** | Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images | [optional] **lifecycle** | [**V1Lifecycle**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Lifecycle.md) | | [optional] @@ -18,7 +18,8 @@ Name | Type | Description | Notes **readiness_probe** | [**V1Probe**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Probe.md) | | [optional] **resize_policy** | [**list[V1ContainerResizePolicy]**](V1ContainerResizePolicy.md) | Resources resize policy for the container. | [optional] **resources** | [**V1ResourceRequirements**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1ResourceRequirements.md) | | [optional] -**restart_policy** | **str** | RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. | [optional] +**restart_policy** | **str** | RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. | [optional] +**restart_policy_rules** | [**list[V1ContainerRestartRule]**](V1ContainerRestartRule.md) | Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. | [optional] **runtime_version** | **str** | Runtime version of the predictor docker image | [optional] **security_context** | [**V1SecurityContext**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1SecurityContext.md) | | [optional] **startup_probe** | [**V1Probe**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Probe.md) | | [optional] diff --git a/python/kserve/docs/V1beta1PaddleServerSpec.md b/python/kserve/docs/V1beta1PaddleServerSpec.md index 90369db6047..67bcacca4f8 100644 --- a/python/kserve/docs/V1beta1PaddleServerSpec.md +++ b/python/kserve/docs/V1beta1PaddleServerSpec.md @@ -6,7 +6,7 @@ Name | Type | Description | Notes **args** | **list[str]** | Arguments to the entrypoint. The container image's CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell | [optional] **command** | **list[str]** | Entrypoint array. Not executed within a shell. The container image's ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell | [optional] **env** | [**list[V1EnvVar]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvVar.md) | List of environment variables to set in the container. Cannot be updated. | [optional] -**env_from** | [**list[V1EnvFromSource]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvFromSource.md) | List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. | [optional] +**env_from** | [**list[V1EnvFromSource]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvFromSource.md) | List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. | [optional] **image** | **str** | Container image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets. | [optional] **image_pull_policy** | **str** | Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images | [optional] **lifecycle** | [**V1Lifecycle**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Lifecycle.md) | | [optional] @@ -17,7 +17,8 @@ Name | Type | Description | Notes **readiness_probe** | [**V1Probe**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Probe.md) | | [optional] **resize_policy** | [**list[V1ContainerResizePolicy]**](V1ContainerResizePolicy.md) | Resources resize policy for the container. | [optional] **resources** | [**V1ResourceRequirements**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1ResourceRequirements.md) | | [optional] -**restart_policy** | **str** | RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. | [optional] +**restart_policy** | **str** | RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. | [optional] +**restart_policy_rules** | [**list[V1ContainerRestartRule]**](V1ContainerRestartRule.md) | Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. | [optional] **runtime_version** | **str** | Runtime version of the predictor docker image | [optional] **security_context** | [**V1SecurityContext**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1SecurityContext.md) | | [optional] **startup_probe** | [**V1Probe**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Probe.md) | | [optional] diff --git a/python/kserve/docs/V1beta1PredictorExtensionSpec.md b/python/kserve/docs/V1beta1PredictorExtensionSpec.md index 770c27a9334..4fba583081d 100644 --- a/python/kserve/docs/V1beta1PredictorExtensionSpec.md +++ b/python/kserve/docs/V1beta1PredictorExtensionSpec.md @@ -7,7 +7,7 @@ Name | Type | Description | Notes **args** | **list[str]** | Arguments to the entrypoint. The container image's CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell | [optional] **command** | **list[str]** | Entrypoint array. Not executed within a shell. The container image's ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell | [optional] **env** | [**list[V1EnvVar]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvVar.md) | List of environment variables to set in the container. Cannot be updated. | [optional] -**env_from** | [**list[V1EnvFromSource]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvFromSource.md) | List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. | [optional] +**env_from** | [**list[V1EnvFromSource]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvFromSource.md) | List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. | [optional] **image** | **str** | Container image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets. | [optional] **image_pull_policy** | **str** | Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images | [optional] **lifecycle** | [**V1Lifecycle**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Lifecycle.md) | | [optional] @@ -18,7 +18,8 @@ Name | Type | Description | Notes **readiness_probe** | [**V1Probe**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Probe.md) | | [optional] **resize_policy** | [**list[V1ContainerResizePolicy]**](V1ContainerResizePolicy.md) | Resources resize policy for the container. | [optional] **resources** | [**V1ResourceRequirements**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1ResourceRequirements.md) | | [optional] -**restart_policy** | **str** | RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. | [optional] +**restart_policy** | **str** | RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. | [optional] +**restart_policy_rules** | [**list[V1ContainerRestartRule]**](V1ContainerRestartRule.md) | Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. | [optional] **runtime_version** | **str** | Runtime version of the predictor docker image | [optional] **security_context** | [**V1SecurityContext**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1SecurityContext.md) | | [optional] **startup_probe** | [**V1Probe**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Probe.md) | | [optional] diff --git a/python/kserve/docs/V1beta1SKLearnSpec.md b/python/kserve/docs/V1beta1SKLearnSpec.md index 5c304716969..f9764b01f17 100644 --- a/python/kserve/docs/V1beta1SKLearnSpec.md +++ b/python/kserve/docs/V1beta1SKLearnSpec.md @@ -7,7 +7,7 @@ Name | Type | Description | Notes **args** | **list[str]** | Arguments to the entrypoint. The container image's CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell | [optional] **command** | **list[str]** | Entrypoint array. Not executed within a shell. The container image's ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell | [optional] **env** | [**list[V1EnvVar]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvVar.md) | List of environment variables to set in the container. Cannot be updated. | [optional] -**env_from** | [**list[V1EnvFromSource]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvFromSource.md) | List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. | [optional] +**env_from** | [**list[V1EnvFromSource]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvFromSource.md) | List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. | [optional] **image** | **str** | Container image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets. | [optional] **image_pull_policy** | **str** | Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images | [optional] **lifecycle** | [**V1Lifecycle**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Lifecycle.md) | | [optional] @@ -18,7 +18,8 @@ Name | Type | Description | Notes **readiness_probe** | [**V1Probe**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Probe.md) | | [optional] **resize_policy** | [**list[V1ContainerResizePolicy]**](V1ContainerResizePolicy.md) | Resources resize policy for the container. | [optional] **resources** | [**V1ResourceRequirements**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1ResourceRequirements.md) | | [optional] -**restart_policy** | **str** | RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. | [optional] +**restart_policy** | **str** | RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. | [optional] +**restart_policy_rules** | [**list[V1ContainerRestartRule]**](V1ContainerRestartRule.md) | Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. | [optional] **runtime_version** | **str** | Runtime version of the predictor docker image | [optional] **security_context** | [**V1SecurityContext**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1SecurityContext.md) | | [optional] **startup_probe** | [**V1Probe**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Probe.md) | | [optional] diff --git a/python/kserve/docs/V1beta1TFServingSpec.md b/python/kserve/docs/V1beta1TFServingSpec.md index c11c6bbc340..e8e64103acc 100644 --- a/python/kserve/docs/V1beta1TFServingSpec.md +++ b/python/kserve/docs/V1beta1TFServingSpec.md @@ -7,7 +7,7 @@ Name | Type | Description | Notes **args** | **list[str]** | Arguments to the entrypoint. The container image's CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell | [optional] **command** | **list[str]** | Entrypoint array. Not executed within a shell. The container image's ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell | [optional] **env** | [**list[V1EnvVar]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvVar.md) | List of environment variables to set in the container. Cannot be updated. | [optional] -**env_from** | [**list[V1EnvFromSource]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvFromSource.md) | List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. | [optional] +**env_from** | [**list[V1EnvFromSource]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvFromSource.md) | List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. | [optional] **image** | **str** | Container image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets. | [optional] **image_pull_policy** | **str** | Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images | [optional] **lifecycle** | [**V1Lifecycle**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Lifecycle.md) | | [optional] @@ -18,7 +18,8 @@ Name | Type | Description | Notes **readiness_probe** | [**V1Probe**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Probe.md) | | [optional] **resize_policy** | [**list[V1ContainerResizePolicy]**](V1ContainerResizePolicy.md) | Resources resize policy for the container. | [optional] **resources** | [**V1ResourceRequirements**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1ResourceRequirements.md) | | [optional] -**restart_policy** | **str** | RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. | [optional] +**restart_policy** | **str** | RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. | [optional] +**restart_policy_rules** | [**list[V1ContainerRestartRule]**](V1ContainerRestartRule.md) | Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. | [optional] **runtime_version** | **str** | Runtime version of the predictor docker image | [optional] **security_context** | [**V1SecurityContext**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1SecurityContext.md) | | [optional] **startup_probe** | [**V1Probe**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Probe.md) | | [optional] diff --git a/python/kserve/docs/V1beta1TorchServeSpec.md b/python/kserve/docs/V1beta1TorchServeSpec.md index e405804806a..1e6cf287234 100644 --- a/python/kserve/docs/V1beta1TorchServeSpec.md +++ b/python/kserve/docs/V1beta1TorchServeSpec.md @@ -7,7 +7,7 @@ Name | Type | Description | Notes **args** | **list[str]** | Arguments to the entrypoint. The container image's CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell | [optional] **command** | **list[str]** | Entrypoint array. Not executed within a shell. The container image's ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell | [optional] **env** | [**list[V1EnvVar]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvVar.md) | List of environment variables to set in the container. Cannot be updated. | [optional] -**env_from** | [**list[V1EnvFromSource]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvFromSource.md) | List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. | [optional] +**env_from** | [**list[V1EnvFromSource]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvFromSource.md) | List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. | [optional] **image** | **str** | Container image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets. | [optional] **image_pull_policy** | **str** | Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images | [optional] **lifecycle** | [**V1Lifecycle**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Lifecycle.md) | | [optional] @@ -18,7 +18,8 @@ Name | Type | Description | Notes **readiness_probe** | [**V1Probe**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Probe.md) | | [optional] **resize_policy** | [**list[V1ContainerResizePolicy]**](V1ContainerResizePolicy.md) | Resources resize policy for the container. | [optional] **resources** | [**V1ResourceRequirements**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1ResourceRequirements.md) | | [optional] -**restart_policy** | **str** | RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. | [optional] +**restart_policy** | **str** | RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. | [optional] +**restart_policy_rules** | [**list[V1ContainerRestartRule]**](V1ContainerRestartRule.md) | Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. | [optional] **runtime_version** | **str** | Runtime version of the predictor docker image | [optional] **security_context** | [**V1SecurityContext**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1SecurityContext.md) | | [optional] **startup_probe** | [**V1Probe**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Probe.md) | | [optional] diff --git a/python/kserve/docs/V1beta1TritonSpec.md b/python/kserve/docs/V1beta1TritonSpec.md index c5647fccd82..3974e784c0b 100644 --- a/python/kserve/docs/V1beta1TritonSpec.md +++ b/python/kserve/docs/V1beta1TritonSpec.md @@ -7,7 +7,7 @@ Name | Type | Description | Notes **args** | **list[str]** | Arguments to the entrypoint. The container image's CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell | [optional] **command** | **list[str]** | Entrypoint array. Not executed within a shell. The container image's ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell | [optional] **env** | [**list[V1EnvVar]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvVar.md) | List of environment variables to set in the container. Cannot be updated. | [optional] -**env_from** | [**list[V1EnvFromSource]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvFromSource.md) | List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. | [optional] +**env_from** | [**list[V1EnvFromSource]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvFromSource.md) | List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. | [optional] **image** | **str** | Container image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets. | [optional] **image_pull_policy** | **str** | Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images | [optional] **lifecycle** | [**V1Lifecycle**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Lifecycle.md) | | [optional] @@ -18,7 +18,8 @@ Name | Type | Description | Notes **readiness_probe** | [**V1Probe**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Probe.md) | | [optional] **resize_policy** | [**list[V1ContainerResizePolicy]**](V1ContainerResizePolicy.md) | Resources resize policy for the container. | [optional] **resources** | [**V1ResourceRequirements**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1ResourceRequirements.md) | | [optional] -**restart_policy** | **str** | RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. | [optional] +**restart_policy** | **str** | RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. | [optional] +**restart_policy_rules** | [**list[V1ContainerRestartRule]**](V1ContainerRestartRule.md) | Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. | [optional] **runtime_version** | **str** | Runtime version of the predictor docker image | [optional] **security_context** | [**V1SecurityContext**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1SecurityContext.md) | | [optional] **startup_probe** | [**V1Probe**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Probe.md) | | [optional] diff --git a/python/kserve/docs/V1beta1XGBoostSpec.md b/python/kserve/docs/V1beta1XGBoostSpec.md index c7f9d2b4a37..a62d66e1c67 100644 --- a/python/kserve/docs/V1beta1XGBoostSpec.md +++ b/python/kserve/docs/V1beta1XGBoostSpec.md @@ -7,7 +7,7 @@ Name | Type | Description | Notes **args** | **list[str]** | Arguments to the entrypoint. The container image's CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell | [optional] **command** | **list[str]** | Entrypoint array. Not executed within a shell. The container image's ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell | [optional] **env** | [**list[V1EnvVar]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvVar.md) | List of environment variables to set in the container. Cannot be updated. | [optional] -**env_from** | [**list[V1EnvFromSource]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvFromSource.md) | List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. | [optional] +**env_from** | [**list[V1EnvFromSource]**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1EnvFromSource.md) | List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. | [optional] **image** | **str** | Container image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets. | [optional] **image_pull_policy** | **str** | Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images | [optional] **lifecycle** | [**V1Lifecycle**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Lifecycle.md) | | [optional] @@ -18,7 +18,8 @@ Name | Type | Description | Notes **readiness_probe** | [**V1Probe**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Probe.md) | | [optional] **resize_policy** | [**list[V1ContainerResizePolicy]**](V1ContainerResizePolicy.md) | Resources resize policy for the container. | [optional] **resources** | [**V1ResourceRequirements**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1ResourceRequirements.md) | | [optional] -**restart_policy** | **str** | RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. | [optional] +**restart_policy** | **str** | RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. | [optional] +**restart_policy_rules** | [**list[V1ContainerRestartRule]**](V1ContainerRestartRule.md) | Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. | [optional] **runtime_version** | **str** | Runtime version of the predictor docker image | [optional] **security_context** | [**V1SecurityContext**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1SecurityContext.md) | | [optional] **startup_probe** | [**V1Probe**](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Probe.md) | | [optional] diff --git a/python/kserve/kserve/models/v1beta1_art_explainer_spec.py b/python/kserve/kserve/models/v1beta1_art_explainer_spec.py index fedfcba1225..e23482eacbb 100644 --- a/python/kserve/kserve/models/v1beta1_art_explainer_spec.py +++ b/python/kserve/kserve/models/v1beta1_art_explainer_spec.py @@ -62,6 +62,7 @@ class V1beta1ARTExplainerSpec(object): 'resize_policy': 'list[V1ContainerResizePolicy]', 'resources': 'V1ResourceRequirements', 'restart_policy': 'str', + 'restart_policy_rules': 'list[V1ContainerRestartRule]', 'runtime_version': 'str', 'security_context': 'V1SecurityContext', 'startup_probe': 'V1Probe', @@ -94,6 +95,7 @@ class V1beta1ARTExplainerSpec(object): 'resize_policy': 'resizePolicy', 'resources': 'resources', 'restart_policy': 'restartPolicy', + 'restart_policy_rules': 'restartPolicyRules', 'runtime_version': 'runtimeVersion', 'security_context': 'securityContext', 'startup_probe': 'startupProbe', @@ -110,7 +112,7 @@ class V1beta1ARTExplainerSpec(object): 'working_dir': 'workingDir' } - def __init__(self, args=None, command=None, config=None, env=None, env_from=None, image=None, image_pull_policy=None, lifecycle=None, liveness_probe=None, name='', ports=None, readiness_probe=None, resize_policy=None, resources=None, restart_policy=None, runtime_version=None, security_context=None, startup_probe=None, stdin=None, stdin_once=None, storage=None, storage_uri=None, termination_message_path=None, termination_message_policy=None, tty=None, type='', volume_devices=None, volume_mounts=None, working_dir=None, local_vars_configuration=None): # noqa: E501 + def __init__(self, args=None, command=None, config=None, env=None, env_from=None, image=None, image_pull_policy=None, lifecycle=None, liveness_probe=None, name='', ports=None, readiness_probe=None, resize_policy=None, resources=None, restart_policy=None, restart_policy_rules=None, runtime_version=None, security_context=None, startup_probe=None, stdin=None, stdin_once=None, storage=None, storage_uri=None, termination_message_path=None, termination_message_policy=None, tty=None, type='', volume_devices=None, volume_mounts=None, working_dir=None, local_vars_configuration=None): # noqa: E501 """V1beta1ARTExplainerSpec - a model defined in OpenAPI""" # noqa: E501 if local_vars_configuration is None: local_vars_configuration = Configuration() @@ -131,6 +133,7 @@ def __init__(self, args=None, command=None, config=None, env=None, env_from=None self._resize_policy = None self._resources = None self._restart_policy = None + self._restart_policy_rules = None self._runtime_version = None self._security_context = None self._startup_probe = None @@ -176,6 +179,8 @@ def __init__(self, args=None, command=None, config=None, env=None, env_from=None self.resources = resources if restart_policy is not None: self.restart_policy = restart_policy + if restart_policy_rules is not None: + self.restart_policy_rules = restart_policy_rules if runtime_version is not None: self.runtime_version = runtime_version if security_context is not None: @@ -300,7 +305,7 @@ def env(self, env): def env_from(self): """Gets the env_from of this V1beta1ARTExplainerSpec. # noqa: E501 - List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 + List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 :return: The env_from of this V1beta1ARTExplainerSpec. # noqa: E501 :rtype: list[V1EnvFromSource] @@ -311,7 +316,7 @@ def env_from(self): def env_from(self, env_from): """Sets the env_from of this V1beta1ARTExplainerSpec. - List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 + List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 :param env_from: The env_from of this V1beta1ARTExplainerSpec. # noqa: E501 :type: list[V1EnvFromSource] @@ -524,7 +529,7 @@ def resources(self, resources): def restart_policy(self): """Gets the restart_policy of this V1beta1ARTExplainerSpec. # noqa: E501 - RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 + RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 :return: The restart_policy of this V1beta1ARTExplainerSpec. # noqa: E501 :rtype: str @@ -535,7 +540,7 @@ def restart_policy(self): def restart_policy(self, restart_policy): """Sets the restart_policy of this V1beta1ARTExplainerSpec. - RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 + RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 :param restart_policy: The restart_policy of this V1beta1ARTExplainerSpec. # noqa: E501 :type: str @@ -543,6 +548,29 @@ def restart_policy(self, restart_policy): self._restart_policy = restart_policy + @property + def restart_policy_rules(self): + """Gets the restart_policy_rules of this V1beta1ARTExplainerSpec. # noqa: E501 + + Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. # noqa: E501 + + :return: The restart_policy_rules of this V1beta1ARTExplainerSpec. # noqa: E501 + :rtype: list[V1ContainerRestartRule] + """ + return self._restart_policy_rules + + @restart_policy_rules.setter + def restart_policy_rules(self, restart_policy_rules): + """Sets the restart_policy_rules of this V1beta1ARTExplainerSpec. + + Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. # noqa: E501 + + :param restart_policy_rules: The restart_policy_rules of this V1beta1ARTExplainerSpec. # noqa: E501 + :type: list[V1ContainerRestartRule] + """ + + self._restart_policy_rules = restart_policy_rules + @property def runtime_version(self): """Gets the runtime_version of this V1beta1ARTExplainerSpec. # noqa: E501 diff --git a/python/kserve/kserve/models/v1beta1_custom_explainer.py b/python/kserve/kserve/models/v1beta1_custom_explainer.py index 7dcd7d684fe..aa8c566b922 100644 --- a/python/kserve/kserve/models/v1beta1_custom_explainer.py +++ b/python/kserve/kserve/models/v1beta1_custom_explainer.py @@ -61,6 +61,7 @@ class V1beta1CustomExplainer(object): 'host_pid': 'bool', 'host_users': 'bool', 'hostname': 'str', + 'hostname_override': 'str', 'image_pull_secrets': 'list[V1LocalObjectReference]', 'init_containers': 'list[V1Container]', 'node_name': 'str', @@ -104,6 +105,7 @@ class V1beta1CustomExplainer(object): 'host_pid': 'hostPID', 'host_users': 'hostUsers', 'hostname': 'hostname', + 'hostname_override': 'hostnameOverride', 'image_pull_secrets': 'imagePullSecrets', 'init_containers': 'initContainers', 'node_name': 'nodeName', @@ -132,7 +134,7 @@ class V1beta1CustomExplainer(object): 'volumes': 'volumes' } - def __init__(self, active_deadline_seconds=None, affinity=None, automount_service_account_token=None, containers=None, dns_config=None, dns_policy=None, enable_service_links=None, ephemeral_containers=None, host_aliases=None, host_ipc=None, host_network=None, host_pid=None, host_users=None, hostname=None, image_pull_secrets=None, init_containers=None, node_name=None, node_selector=None, os=None, overhead=None, preemption_policy=None, priority=None, priority_class_name=None, readiness_gates=None, resource_claims=None, resources=None, restart_policy=None, runtime_class_name=None, scheduler_name=None, scheduling_gates=None, security_context=None, service_account=None, service_account_name=None, set_hostname_as_fqdn=None, share_process_namespace=None, subdomain=None, termination_grace_period_seconds=None, tolerations=None, topology_spread_constraints=None, volumes=None, local_vars_configuration=None): # noqa: E501 + def __init__(self, active_deadline_seconds=None, affinity=None, automount_service_account_token=None, containers=None, dns_config=None, dns_policy=None, enable_service_links=None, ephemeral_containers=None, host_aliases=None, host_ipc=None, host_network=None, host_pid=None, host_users=None, hostname=None, hostname_override=None, image_pull_secrets=None, init_containers=None, node_name=None, node_selector=None, os=None, overhead=None, preemption_policy=None, priority=None, priority_class_name=None, readiness_gates=None, resource_claims=None, resources=None, restart_policy=None, runtime_class_name=None, scheduler_name=None, scheduling_gates=None, security_context=None, service_account=None, service_account_name=None, set_hostname_as_fqdn=None, share_process_namespace=None, subdomain=None, termination_grace_period_seconds=None, tolerations=None, topology_spread_constraints=None, volumes=None, local_vars_configuration=None): # noqa: E501 """V1beta1CustomExplainer - a model defined in OpenAPI""" # noqa: E501 if local_vars_configuration is None: local_vars_configuration = Configuration() @@ -152,6 +154,7 @@ def __init__(self, active_deadline_seconds=None, affinity=None, automount_servic self._host_pid = None self._host_users = None self._hostname = None + self._hostname_override = None self._image_pull_secrets = None self._init_containers = None self._node_name = None @@ -207,6 +210,8 @@ def __init__(self, active_deadline_seconds=None, affinity=None, automount_servic self.host_users = host_users if hostname is not None: self.hostname = hostname + if hostname_override is not None: + self.hostname_override = hostname_override if image_pull_secrets is not None: self.image_pull_secrets = image_pull_secrets if init_containers is not None: @@ -492,7 +497,7 @@ def host_ipc(self, host_ipc): def host_network(self): """Gets the host_network of this V1beta1CustomExplainer. # noqa: E501 - Host networking requested for this pod. Use the host's network namespace. If this option is set, the ports that will be used must be specified. Default to false. # noqa: E501 + Host networking requested for this pod. Use the host's network namespace. When using HostNetwork you should specify ports so the scheduler is aware. When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. Default to false. # noqa: E501 :return: The host_network of this V1beta1CustomExplainer. # noqa: E501 :rtype: bool @@ -503,7 +508,7 @@ def host_network(self): def host_network(self, host_network): """Sets the host_network of this V1beta1CustomExplainer. - Host networking requested for this pod. Use the host's network namespace. If this option is set, the ports that will be used must be specified. Default to false. # noqa: E501 + Host networking requested for this pod. Use the host's network namespace. When using HostNetwork you should specify ports so the scheduler is aware. When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. Default to false. # noqa: E501 :param host_network: The host_network of this V1beta1CustomExplainer. # noqa: E501 :type: bool @@ -580,6 +585,29 @@ def hostname(self, hostname): self._hostname = hostname + @property + def hostname_override(self): + """Gets the hostname_override of this V1beta1CustomExplainer. # noqa: E501 + + HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. This field only specifies the pod's hostname and does not affect its DNS records. When this field is set to a non-empty string: - It takes precedence over the values set in `hostname` and `subdomain`. - The Pod's hostname will be set to this value. - `setHostnameAsFQDN` must be nil or set to false. - `hostNetwork` must be set to false. This field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. Requires the HostnameOverride feature gate to be enabled. # noqa: E501 + + :return: The hostname_override of this V1beta1CustomExplainer. # noqa: E501 + :rtype: str + """ + return self._hostname_override + + @hostname_override.setter + def hostname_override(self, hostname_override): + """Sets the hostname_override of this V1beta1CustomExplainer. + + HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. This field only specifies the pod's hostname and does not affect its DNS records. When this field is set to a non-empty string: - It takes precedence over the values set in `hostname` and `subdomain`. - The Pod's hostname will be set to this value. - `setHostnameAsFQDN` must be nil or set to false. - `hostNetwork` must be set to false. This field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. Requires the HostnameOverride feature gate to be enabled. # noqa: E501 + + :param hostname_override: The hostname_override of this V1beta1CustomExplainer. # noqa: E501 + :type: str + """ + + self._hostname_override = hostname_override + @property def image_pull_secrets(self): """Gets the image_pull_secrets of this V1beta1CustomExplainer. # noqa: E501 diff --git a/python/kserve/kserve/models/v1beta1_custom_predictor.py b/python/kserve/kserve/models/v1beta1_custom_predictor.py index ff07ff14cc9..498467ade55 100644 --- a/python/kserve/kserve/models/v1beta1_custom_predictor.py +++ b/python/kserve/kserve/models/v1beta1_custom_predictor.py @@ -61,6 +61,7 @@ class V1beta1CustomPredictor(object): 'host_pid': 'bool', 'host_users': 'bool', 'hostname': 'str', + 'hostname_override': 'str', 'image_pull_secrets': 'list[V1LocalObjectReference]', 'init_containers': 'list[V1Container]', 'node_name': 'str', @@ -104,6 +105,7 @@ class V1beta1CustomPredictor(object): 'host_pid': 'hostPID', 'host_users': 'hostUsers', 'hostname': 'hostname', + 'hostname_override': 'hostnameOverride', 'image_pull_secrets': 'imagePullSecrets', 'init_containers': 'initContainers', 'node_name': 'nodeName', @@ -132,7 +134,7 @@ class V1beta1CustomPredictor(object): 'volumes': 'volumes' } - def __init__(self, active_deadline_seconds=None, affinity=None, automount_service_account_token=None, containers=None, dns_config=None, dns_policy=None, enable_service_links=None, ephemeral_containers=None, host_aliases=None, host_ipc=None, host_network=None, host_pid=None, host_users=None, hostname=None, image_pull_secrets=None, init_containers=None, node_name=None, node_selector=None, os=None, overhead=None, preemption_policy=None, priority=None, priority_class_name=None, readiness_gates=None, resource_claims=None, resources=None, restart_policy=None, runtime_class_name=None, scheduler_name=None, scheduling_gates=None, security_context=None, service_account=None, service_account_name=None, set_hostname_as_fqdn=None, share_process_namespace=None, subdomain=None, termination_grace_period_seconds=None, tolerations=None, topology_spread_constraints=None, volumes=None, local_vars_configuration=None): # noqa: E501 + def __init__(self, active_deadline_seconds=None, affinity=None, automount_service_account_token=None, containers=None, dns_config=None, dns_policy=None, enable_service_links=None, ephemeral_containers=None, host_aliases=None, host_ipc=None, host_network=None, host_pid=None, host_users=None, hostname=None, hostname_override=None, image_pull_secrets=None, init_containers=None, node_name=None, node_selector=None, os=None, overhead=None, preemption_policy=None, priority=None, priority_class_name=None, readiness_gates=None, resource_claims=None, resources=None, restart_policy=None, runtime_class_name=None, scheduler_name=None, scheduling_gates=None, security_context=None, service_account=None, service_account_name=None, set_hostname_as_fqdn=None, share_process_namespace=None, subdomain=None, termination_grace_period_seconds=None, tolerations=None, topology_spread_constraints=None, volumes=None, local_vars_configuration=None): # noqa: E501 """V1beta1CustomPredictor - a model defined in OpenAPI""" # noqa: E501 if local_vars_configuration is None: local_vars_configuration = Configuration() @@ -152,6 +154,7 @@ def __init__(self, active_deadline_seconds=None, affinity=None, automount_servic self._host_pid = None self._host_users = None self._hostname = None + self._hostname_override = None self._image_pull_secrets = None self._init_containers = None self._node_name = None @@ -207,6 +210,8 @@ def __init__(self, active_deadline_seconds=None, affinity=None, automount_servic self.host_users = host_users if hostname is not None: self.hostname = hostname + if hostname_override is not None: + self.hostname_override = hostname_override if image_pull_secrets is not None: self.image_pull_secrets = image_pull_secrets if init_containers is not None: @@ -492,7 +497,7 @@ def host_ipc(self, host_ipc): def host_network(self): """Gets the host_network of this V1beta1CustomPredictor. # noqa: E501 - Host networking requested for this pod. Use the host's network namespace. If this option is set, the ports that will be used must be specified. Default to false. # noqa: E501 + Host networking requested for this pod. Use the host's network namespace. When using HostNetwork you should specify ports so the scheduler is aware. When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. Default to false. # noqa: E501 :return: The host_network of this V1beta1CustomPredictor. # noqa: E501 :rtype: bool @@ -503,7 +508,7 @@ def host_network(self): def host_network(self, host_network): """Sets the host_network of this V1beta1CustomPredictor. - Host networking requested for this pod. Use the host's network namespace. If this option is set, the ports that will be used must be specified. Default to false. # noqa: E501 + Host networking requested for this pod. Use the host's network namespace. When using HostNetwork you should specify ports so the scheduler is aware. When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. Default to false. # noqa: E501 :param host_network: The host_network of this V1beta1CustomPredictor. # noqa: E501 :type: bool @@ -580,6 +585,29 @@ def hostname(self, hostname): self._hostname = hostname + @property + def hostname_override(self): + """Gets the hostname_override of this V1beta1CustomPredictor. # noqa: E501 + + HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. This field only specifies the pod's hostname and does not affect its DNS records. When this field is set to a non-empty string: - It takes precedence over the values set in `hostname` and `subdomain`. - The Pod's hostname will be set to this value. - `setHostnameAsFQDN` must be nil or set to false. - `hostNetwork` must be set to false. This field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. Requires the HostnameOverride feature gate to be enabled. # noqa: E501 + + :return: The hostname_override of this V1beta1CustomPredictor. # noqa: E501 + :rtype: str + """ + return self._hostname_override + + @hostname_override.setter + def hostname_override(self, hostname_override): + """Sets the hostname_override of this V1beta1CustomPredictor. + + HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. This field only specifies the pod's hostname and does not affect its DNS records. When this field is set to a non-empty string: - It takes precedence over the values set in `hostname` and `subdomain`. - The Pod's hostname will be set to this value. - `setHostnameAsFQDN` must be nil or set to false. - `hostNetwork` must be set to false. This field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. Requires the HostnameOverride feature gate to be enabled. # noqa: E501 + + :param hostname_override: The hostname_override of this V1beta1CustomPredictor. # noqa: E501 + :type: str + """ + + self._hostname_override = hostname_override + @property def image_pull_secrets(self): """Gets the image_pull_secrets of this V1beta1CustomPredictor. # noqa: E501 diff --git a/python/kserve/kserve/models/v1beta1_custom_transformer.py b/python/kserve/kserve/models/v1beta1_custom_transformer.py index 4d80c6ab456..8136c9c4d3c 100644 --- a/python/kserve/kserve/models/v1beta1_custom_transformer.py +++ b/python/kserve/kserve/models/v1beta1_custom_transformer.py @@ -61,6 +61,7 @@ class V1beta1CustomTransformer(object): 'host_pid': 'bool', 'host_users': 'bool', 'hostname': 'str', + 'hostname_override': 'str', 'image_pull_secrets': 'list[V1LocalObjectReference]', 'init_containers': 'list[V1Container]', 'node_name': 'str', @@ -104,6 +105,7 @@ class V1beta1CustomTransformer(object): 'host_pid': 'hostPID', 'host_users': 'hostUsers', 'hostname': 'hostname', + 'hostname_override': 'hostnameOverride', 'image_pull_secrets': 'imagePullSecrets', 'init_containers': 'initContainers', 'node_name': 'nodeName', @@ -132,7 +134,7 @@ class V1beta1CustomTransformer(object): 'volumes': 'volumes' } - def __init__(self, active_deadline_seconds=None, affinity=None, automount_service_account_token=None, containers=None, dns_config=None, dns_policy=None, enable_service_links=None, ephemeral_containers=None, host_aliases=None, host_ipc=None, host_network=None, host_pid=None, host_users=None, hostname=None, image_pull_secrets=None, init_containers=None, node_name=None, node_selector=None, os=None, overhead=None, preemption_policy=None, priority=None, priority_class_name=None, readiness_gates=None, resource_claims=None, resources=None, restart_policy=None, runtime_class_name=None, scheduler_name=None, scheduling_gates=None, security_context=None, service_account=None, service_account_name=None, set_hostname_as_fqdn=None, share_process_namespace=None, subdomain=None, termination_grace_period_seconds=None, tolerations=None, topology_spread_constraints=None, volumes=None, local_vars_configuration=None): # noqa: E501 + def __init__(self, active_deadline_seconds=None, affinity=None, automount_service_account_token=None, containers=None, dns_config=None, dns_policy=None, enable_service_links=None, ephemeral_containers=None, host_aliases=None, host_ipc=None, host_network=None, host_pid=None, host_users=None, hostname=None, hostname_override=None, image_pull_secrets=None, init_containers=None, node_name=None, node_selector=None, os=None, overhead=None, preemption_policy=None, priority=None, priority_class_name=None, readiness_gates=None, resource_claims=None, resources=None, restart_policy=None, runtime_class_name=None, scheduler_name=None, scheduling_gates=None, security_context=None, service_account=None, service_account_name=None, set_hostname_as_fqdn=None, share_process_namespace=None, subdomain=None, termination_grace_period_seconds=None, tolerations=None, topology_spread_constraints=None, volumes=None, local_vars_configuration=None): # noqa: E501 """V1beta1CustomTransformer - a model defined in OpenAPI""" # noqa: E501 if local_vars_configuration is None: local_vars_configuration = Configuration() @@ -152,6 +154,7 @@ def __init__(self, active_deadline_seconds=None, affinity=None, automount_servic self._host_pid = None self._host_users = None self._hostname = None + self._hostname_override = None self._image_pull_secrets = None self._init_containers = None self._node_name = None @@ -207,6 +210,8 @@ def __init__(self, active_deadline_seconds=None, affinity=None, automount_servic self.host_users = host_users if hostname is not None: self.hostname = hostname + if hostname_override is not None: + self.hostname_override = hostname_override if image_pull_secrets is not None: self.image_pull_secrets = image_pull_secrets if init_containers is not None: @@ -492,7 +497,7 @@ def host_ipc(self, host_ipc): def host_network(self): """Gets the host_network of this V1beta1CustomTransformer. # noqa: E501 - Host networking requested for this pod. Use the host's network namespace. If this option is set, the ports that will be used must be specified. Default to false. # noqa: E501 + Host networking requested for this pod. Use the host's network namespace. When using HostNetwork you should specify ports so the scheduler is aware. When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. Default to false. # noqa: E501 :return: The host_network of this V1beta1CustomTransformer. # noqa: E501 :rtype: bool @@ -503,7 +508,7 @@ def host_network(self): def host_network(self, host_network): """Sets the host_network of this V1beta1CustomTransformer. - Host networking requested for this pod. Use the host's network namespace. If this option is set, the ports that will be used must be specified. Default to false. # noqa: E501 + Host networking requested for this pod. Use the host's network namespace. When using HostNetwork you should specify ports so the scheduler is aware. When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. Default to false. # noqa: E501 :param host_network: The host_network of this V1beta1CustomTransformer. # noqa: E501 :type: bool @@ -580,6 +585,29 @@ def hostname(self, hostname): self._hostname = hostname + @property + def hostname_override(self): + """Gets the hostname_override of this V1beta1CustomTransformer. # noqa: E501 + + HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. This field only specifies the pod's hostname and does not affect its DNS records. When this field is set to a non-empty string: - It takes precedence over the values set in `hostname` and `subdomain`. - The Pod's hostname will be set to this value. - `setHostnameAsFQDN` must be nil or set to false. - `hostNetwork` must be set to false. This field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. Requires the HostnameOverride feature gate to be enabled. # noqa: E501 + + :return: The hostname_override of this V1beta1CustomTransformer. # noqa: E501 + :rtype: str + """ + return self._hostname_override + + @hostname_override.setter + def hostname_override(self, hostname_override): + """Sets the hostname_override of this V1beta1CustomTransformer. + + HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. This field only specifies the pod's hostname and does not affect its DNS records. When this field is set to a non-empty string: - It takes precedence over the values set in `hostname` and `subdomain`. - The Pod's hostname will be set to this value. - `setHostnameAsFQDN` must be nil or set to false. - `hostNetwork` must be set to false. This field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. Requires the HostnameOverride feature gate to be enabled. # noqa: E501 + + :param hostname_override: The hostname_override of this V1beta1CustomTransformer. # noqa: E501 + :type: str + """ + + self._hostname_override = hostname_override + @property def image_pull_secrets(self): """Gets the image_pull_secrets of this V1beta1CustomTransformer. # noqa: E501 diff --git a/python/kserve/kserve/models/v1beta1_explainer_extension_spec.py b/python/kserve/kserve/models/v1beta1_explainer_extension_spec.py index 651a9630ccc..f0e0feef384 100644 --- a/python/kserve/kserve/models/v1beta1_explainer_extension_spec.py +++ b/python/kserve/kserve/models/v1beta1_explainer_extension_spec.py @@ -62,6 +62,7 @@ class V1beta1ExplainerExtensionSpec(object): 'resize_policy': 'list[V1ContainerResizePolicy]', 'resources': 'V1ResourceRequirements', 'restart_policy': 'str', + 'restart_policy_rules': 'list[V1ContainerRestartRule]', 'runtime_version': 'str', 'security_context': 'V1SecurityContext', 'startup_probe': 'V1Probe', @@ -93,6 +94,7 @@ class V1beta1ExplainerExtensionSpec(object): 'resize_policy': 'resizePolicy', 'resources': 'resources', 'restart_policy': 'restartPolicy', + 'restart_policy_rules': 'restartPolicyRules', 'runtime_version': 'runtimeVersion', 'security_context': 'securityContext', 'startup_probe': 'startupProbe', @@ -108,7 +110,7 @@ class V1beta1ExplainerExtensionSpec(object): 'working_dir': 'workingDir' } - def __init__(self, args=None, command=None, config=None, env=None, env_from=None, image=None, image_pull_policy=None, lifecycle=None, liveness_probe=None, name='', ports=None, readiness_probe=None, resize_policy=None, resources=None, restart_policy=None, runtime_version=None, security_context=None, startup_probe=None, stdin=None, stdin_once=None, storage=None, storage_uri=None, termination_message_path=None, termination_message_policy=None, tty=None, volume_devices=None, volume_mounts=None, working_dir=None, local_vars_configuration=None): # noqa: E501 + def __init__(self, args=None, command=None, config=None, env=None, env_from=None, image=None, image_pull_policy=None, lifecycle=None, liveness_probe=None, name='', ports=None, readiness_probe=None, resize_policy=None, resources=None, restart_policy=None, restart_policy_rules=None, runtime_version=None, security_context=None, startup_probe=None, stdin=None, stdin_once=None, storage=None, storage_uri=None, termination_message_path=None, termination_message_policy=None, tty=None, volume_devices=None, volume_mounts=None, working_dir=None, local_vars_configuration=None): # noqa: E501 """V1beta1ExplainerExtensionSpec - a model defined in OpenAPI""" # noqa: E501 if local_vars_configuration is None: local_vars_configuration = Configuration() @@ -129,6 +131,7 @@ def __init__(self, args=None, command=None, config=None, env=None, env_from=None self._resize_policy = None self._resources = None self._restart_policy = None + self._restart_policy_rules = None self._runtime_version = None self._security_context = None self._startup_probe = None @@ -174,6 +177,8 @@ def __init__(self, args=None, command=None, config=None, env=None, env_from=None self.resources = resources if restart_policy is not None: self.restart_policy = restart_policy + if restart_policy_rules is not None: + self.restart_policy_rules = restart_policy_rules if runtime_version is not None: self.runtime_version = runtime_version if security_context is not None: @@ -297,7 +302,7 @@ def env(self, env): def env_from(self): """Gets the env_from of this V1beta1ExplainerExtensionSpec. # noqa: E501 - List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 + List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 :return: The env_from of this V1beta1ExplainerExtensionSpec. # noqa: E501 :rtype: list[V1EnvFromSource] @@ -308,7 +313,7 @@ def env_from(self): def env_from(self, env_from): """Sets the env_from of this V1beta1ExplainerExtensionSpec. - List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 + List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 :param env_from: The env_from of this V1beta1ExplainerExtensionSpec. # noqa: E501 :type: list[V1EnvFromSource] @@ -519,7 +524,7 @@ def resources(self, resources): def restart_policy(self): """Gets the restart_policy of this V1beta1ExplainerExtensionSpec. # noqa: E501 - RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 + RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 :return: The restart_policy of this V1beta1ExplainerExtensionSpec. # noqa: E501 :rtype: str @@ -530,7 +535,7 @@ def restart_policy(self): def restart_policy(self, restart_policy): """Sets the restart_policy of this V1beta1ExplainerExtensionSpec. - RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 + RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 :param restart_policy: The restart_policy of this V1beta1ExplainerExtensionSpec. # noqa: E501 :type: str @@ -538,6 +543,29 @@ def restart_policy(self, restart_policy): self._restart_policy = restart_policy + @property + def restart_policy_rules(self): + """Gets the restart_policy_rules of this V1beta1ExplainerExtensionSpec. # noqa: E501 + + Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. # noqa: E501 + + :return: The restart_policy_rules of this V1beta1ExplainerExtensionSpec. # noqa: E501 + :rtype: list[V1ContainerRestartRule] + """ + return self._restart_policy_rules + + @restart_policy_rules.setter + def restart_policy_rules(self, restart_policy_rules): + """Sets the restart_policy_rules of this V1beta1ExplainerExtensionSpec. + + Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. # noqa: E501 + + :param restart_policy_rules: The restart_policy_rules of this V1beta1ExplainerExtensionSpec. # noqa: E501 + :type: list[V1ContainerRestartRule] + """ + + self._restart_policy_rules = restart_policy_rules + @property def runtime_version(self): """Gets the runtime_version of this V1beta1ExplainerExtensionSpec. # noqa: E501 diff --git a/python/kserve/kserve/models/v1beta1_hugging_face_runtime_spec.py b/python/kserve/kserve/models/v1beta1_hugging_face_runtime_spec.py index 46a429bca60..d6ecb019348 100644 --- a/python/kserve/kserve/models/v1beta1_hugging_face_runtime_spec.py +++ b/python/kserve/kserve/models/v1beta1_hugging_face_runtime_spec.py @@ -62,6 +62,7 @@ class V1beta1HuggingFaceRuntimeSpec(object): 'resize_policy': 'list[V1ContainerResizePolicy]', 'resources': 'V1ResourceRequirements', 'restart_policy': 'str', + 'restart_policy_rules': 'list[V1ContainerRestartRule]', 'runtime_version': 'str', 'security_context': 'V1SecurityContext', 'startup_probe': 'V1Probe', @@ -93,6 +94,7 @@ class V1beta1HuggingFaceRuntimeSpec(object): 'resize_policy': 'resizePolicy', 'resources': 'resources', 'restart_policy': 'restartPolicy', + 'restart_policy_rules': 'restartPolicyRules', 'runtime_version': 'runtimeVersion', 'security_context': 'securityContext', 'startup_probe': 'startupProbe', @@ -108,7 +110,7 @@ class V1beta1HuggingFaceRuntimeSpec(object): 'working_dir': 'workingDir' } - def __init__(self, args=None, command=None, env=None, env_from=None, image=None, image_pull_policy=None, lifecycle=None, liveness_probe=None, name='', ports=None, protocol_version=None, readiness_probe=None, resize_policy=None, resources=None, restart_policy=None, runtime_version=None, security_context=None, startup_probe=None, stdin=None, stdin_once=None, storage=None, storage_uri=None, termination_message_path=None, termination_message_policy=None, tty=None, volume_devices=None, volume_mounts=None, working_dir=None, local_vars_configuration=None): # noqa: E501 + def __init__(self, args=None, command=None, env=None, env_from=None, image=None, image_pull_policy=None, lifecycle=None, liveness_probe=None, name='', ports=None, protocol_version=None, readiness_probe=None, resize_policy=None, resources=None, restart_policy=None, restart_policy_rules=None, runtime_version=None, security_context=None, startup_probe=None, stdin=None, stdin_once=None, storage=None, storage_uri=None, termination_message_path=None, termination_message_policy=None, tty=None, volume_devices=None, volume_mounts=None, working_dir=None, local_vars_configuration=None): # noqa: E501 """V1beta1HuggingFaceRuntimeSpec - a model defined in OpenAPI""" # noqa: E501 if local_vars_configuration is None: local_vars_configuration = Configuration() @@ -129,6 +131,7 @@ def __init__(self, args=None, command=None, env=None, env_from=None, image=None, self._resize_policy = None self._resources = None self._restart_policy = None + self._restart_policy_rules = None self._runtime_version = None self._security_context = None self._startup_probe = None @@ -174,6 +177,8 @@ def __init__(self, args=None, command=None, env=None, env_from=None, image=None, self.resources = resources if restart_policy is not None: self.restart_policy = restart_policy + if restart_policy_rules is not None: + self.restart_policy_rules = restart_policy_rules if runtime_version is not None: self.runtime_version = runtime_version if security_context is not None: @@ -274,7 +279,7 @@ def env(self, env): def env_from(self): """Gets the env_from of this V1beta1HuggingFaceRuntimeSpec. # noqa: E501 - List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 + List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 :return: The env_from of this V1beta1HuggingFaceRuntimeSpec. # noqa: E501 :rtype: list[V1EnvFromSource] @@ -285,7 +290,7 @@ def env_from(self): def env_from(self, env_from): """Sets the env_from of this V1beta1HuggingFaceRuntimeSpec. - List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 + List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 :param env_from: The env_from of this V1beta1HuggingFaceRuntimeSpec. # noqa: E501 :type: list[V1EnvFromSource] @@ -519,7 +524,7 @@ def resources(self, resources): def restart_policy(self): """Gets the restart_policy of this V1beta1HuggingFaceRuntimeSpec. # noqa: E501 - RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 + RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 :return: The restart_policy of this V1beta1HuggingFaceRuntimeSpec. # noqa: E501 :rtype: str @@ -530,7 +535,7 @@ def restart_policy(self): def restart_policy(self, restart_policy): """Sets the restart_policy of this V1beta1HuggingFaceRuntimeSpec. - RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 + RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 :param restart_policy: The restart_policy of this V1beta1HuggingFaceRuntimeSpec. # noqa: E501 :type: str @@ -538,6 +543,29 @@ def restart_policy(self, restart_policy): self._restart_policy = restart_policy + @property + def restart_policy_rules(self): + """Gets the restart_policy_rules of this V1beta1HuggingFaceRuntimeSpec. # noqa: E501 + + Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. # noqa: E501 + + :return: The restart_policy_rules of this V1beta1HuggingFaceRuntimeSpec. # noqa: E501 + :rtype: list[V1ContainerRestartRule] + """ + return self._restart_policy_rules + + @restart_policy_rules.setter + def restart_policy_rules(self, restart_policy_rules): + """Sets the restart_policy_rules of this V1beta1HuggingFaceRuntimeSpec. + + Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. # noqa: E501 + + :param restart_policy_rules: The restart_policy_rules of this V1beta1HuggingFaceRuntimeSpec. # noqa: E501 + :type: list[V1ContainerRestartRule] + """ + + self._restart_policy_rules = restart_policy_rules + @property def runtime_version(self): """Gets the runtime_version of this V1beta1HuggingFaceRuntimeSpec. # noqa: E501 diff --git a/python/kserve/kserve/models/v1beta1_light_gbm_spec.py b/python/kserve/kserve/models/v1beta1_light_gbm_spec.py index 85614913d44..c2b1251a938 100644 --- a/python/kserve/kserve/models/v1beta1_light_gbm_spec.py +++ b/python/kserve/kserve/models/v1beta1_light_gbm_spec.py @@ -62,6 +62,7 @@ class V1beta1LightGBMSpec(object): 'resize_policy': 'list[V1ContainerResizePolicy]', 'resources': 'V1ResourceRequirements', 'restart_policy': 'str', + 'restart_policy_rules': 'list[V1ContainerRestartRule]', 'runtime_version': 'str', 'security_context': 'V1SecurityContext', 'startup_probe': 'V1Probe', @@ -93,6 +94,7 @@ class V1beta1LightGBMSpec(object): 'resize_policy': 'resizePolicy', 'resources': 'resources', 'restart_policy': 'restartPolicy', + 'restart_policy_rules': 'restartPolicyRules', 'runtime_version': 'runtimeVersion', 'security_context': 'securityContext', 'startup_probe': 'startupProbe', @@ -108,7 +110,7 @@ class V1beta1LightGBMSpec(object): 'working_dir': 'workingDir' } - def __init__(self, args=None, command=None, env=None, env_from=None, image=None, image_pull_policy=None, lifecycle=None, liveness_probe=None, name='', ports=None, protocol_version=None, readiness_probe=None, resize_policy=None, resources=None, restart_policy=None, runtime_version=None, security_context=None, startup_probe=None, stdin=None, stdin_once=None, storage=None, storage_uri=None, termination_message_path=None, termination_message_policy=None, tty=None, volume_devices=None, volume_mounts=None, working_dir=None, local_vars_configuration=None): # noqa: E501 + def __init__(self, args=None, command=None, env=None, env_from=None, image=None, image_pull_policy=None, lifecycle=None, liveness_probe=None, name='', ports=None, protocol_version=None, readiness_probe=None, resize_policy=None, resources=None, restart_policy=None, restart_policy_rules=None, runtime_version=None, security_context=None, startup_probe=None, stdin=None, stdin_once=None, storage=None, storage_uri=None, termination_message_path=None, termination_message_policy=None, tty=None, volume_devices=None, volume_mounts=None, working_dir=None, local_vars_configuration=None): # noqa: E501 """V1beta1LightGBMSpec - a model defined in OpenAPI""" # noqa: E501 if local_vars_configuration is None: local_vars_configuration = Configuration() @@ -129,6 +131,7 @@ def __init__(self, args=None, command=None, env=None, env_from=None, image=None, self._resize_policy = None self._resources = None self._restart_policy = None + self._restart_policy_rules = None self._runtime_version = None self._security_context = None self._startup_probe = None @@ -174,6 +177,8 @@ def __init__(self, args=None, command=None, env=None, env_from=None, image=None, self.resources = resources if restart_policy is not None: self.restart_policy = restart_policy + if restart_policy_rules is not None: + self.restart_policy_rules = restart_policy_rules if runtime_version is not None: self.runtime_version = runtime_version if security_context is not None: @@ -274,7 +279,7 @@ def env(self, env): def env_from(self): """Gets the env_from of this V1beta1LightGBMSpec. # noqa: E501 - List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 + List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 :return: The env_from of this V1beta1LightGBMSpec. # noqa: E501 :rtype: list[V1EnvFromSource] @@ -285,7 +290,7 @@ def env_from(self): def env_from(self, env_from): """Sets the env_from of this V1beta1LightGBMSpec. - List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 + List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 :param env_from: The env_from of this V1beta1LightGBMSpec. # noqa: E501 :type: list[V1EnvFromSource] @@ -519,7 +524,7 @@ def resources(self, resources): def restart_policy(self): """Gets the restart_policy of this V1beta1LightGBMSpec. # noqa: E501 - RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 + RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 :return: The restart_policy of this V1beta1LightGBMSpec. # noqa: E501 :rtype: str @@ -530,7 +535,7 @@ def restart_policy(self): def restart_policy(self, restart_policy): """Sets the restart_policy of this V1beta1LightGBMSpec. - RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 + RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 :param restart_policy: The restart_policy of this V1beta1LightGBMSpec. # noqa: E501 :type: str @@ -538,6 +543,29 @@ def restart_policy(self, restart_policy): self._restart_policy = restart_policy + @property + def restart_policy_rules(self): + """Gets the restart_policy_rules of this V1beta1LightGBMSpec. # noqa: E501 + + Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. # noqa: E501 + + :return: The restart_policy_rules of this V1beta1LightGBMSpec. # noqa: E501 + :rtype: list[V1ContainerRestartRule] + """ + return self._restart_policy_rules + + @restart_policy_rules.setter + def restart_policy_rules(self, restart_policy_rules): + """Sets the restart_policy_rules of this V1beta1LightGBMSpec. + + Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. # noqa: E501 + + :param restart_policy_rules: The restart_policy_rules of this V1beta1LightGBMSpec. # noqa: E501 + :type: list[V1ContainerRestartRule] + """ + + self._restart_policy_rules = restart_policy_rules + @property def runtime_version(self): """Gets the runtime_version of this V1beta1LightGBMSpec. # noqa: E501 diff --git a/python/kserve/kserve/models/v1beta1_model_spec.py b/python/kserve/kserve/models/v1beta1_model_spec.py index 83ab656027e..950470cab56 100644 --- a/python/kserve/kserve/models/v1beta1_model_spec.py +++ b/python/kserve/kserve/models/v1beta1_model_spec.py @@ -63,6 +63,7 @@ class V1beta1ModelSpec(object): 'resize_policy': 'list[V1ContainerResizePolicy]', 'resources': 'V1ResourceRequirements', 'restart_policy': 'str', + 'restart_policy_rules': 'list[V1ContainerRestartRule]', 'runtime': 'str', 'runtime_version': 'str', 'security_context': 'V1SecurityContext', @@ -96,6 +97,7 @@ class V1beta1ModelSpec(object): 'resize_policy': 'resizePolicy', 'resources': 'resources', 'restart_policy': 'restartPolicy', + 'restart_policy_rules': 'restartPolicyRules', 'runtime': 'runtime', 'runtime_version': 'runtimeVersion', 'security_context': 'securityContext', @@ -112,7 +114,7 @@ class V1beta1ModelSpec(object): 'working_dir': 'workingDir' } - def __init__(self, args=None, command=None, env=None, env_from=None, image=None, image_pull_policy=None, lifecycle=None, liveness_probe=None, model_format=None, name='', ports=None, protocol_version=None, readiness_probe=None, resize_policy=None, resources=None, restart_policy=None, runtime=None, runtime_version=None, security_context=None, startup_probe=None, stdin=None, stdin_once=None, storage=None, storage_uri=None, termination_message_path=None, termination_message_policy=None, tty=None, volume_devices=None, volume_mounts=None, working_dir=None, local_vars_configuration=None): # noqa: E501 + def __init__(self, args=None, command=None, env=None, env_from=None, image=None, image_pull_policy=None, lifecycle=None, liveness_probe=None, model_format=None, name='', ports=None, protocol_version=None, readiness_probe=None, resize_policy=None, resources=None, restart_policy=None, restart_policy_rules=None, runtime=None, runtime_version=None, security_context=None, startup_probe=None, stdin=None, stdin_once=None, storage=None, storage_uri=None, termination_message_path=None, termination_message_policy=None, tty=None, volume_devices=None, volume_mounts=None, working_dir=None, local_vars_configuration=None): # noqa: E501 """V1beta1ModelSpec - a model defined in OpenAPI""" # noqa: E501 if local_vars_configuration is None: local_vars_configuration = Configuration() @@ -134,6 +136,7 @@ def __init__(self, args=None, command=None, env=None, env_from=None, image=None, self._resize_policy = None self._resources = None self._restart_policy = None + self._restart_policy_rules = None self._runtime = None self._runtime_version = None self._security_context = None @@ -181,6 +184,8 @@ def __init__(self, args=None, command=None, env=None, env_from=None, image=None, self.resources = resources if restart_policy is not None: self.restart_policy = restart_policy + if restart_policy_rules is not None: + self.restart_policy_rules = restart_policy_rules if runtime is not None: self.runtime = runtime if runtime_version is not None: @@ -283,7 +288,7 @@ def env(self, env): def env_from(self): """Gets the env_from of this V1beta1ModelSpec. # noqa: E501 - List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 + List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 :return: The env_from of this V1beta1ModelSpec. # noqa: E501 :rtype: list[V1EnvFromSource] @@ -294,7 +299,7 @@ def env_from(self): def env_from(self, env_from): """Sets the env_from of this V1beta1ModelSpec. - List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 + List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 :param env_from: The env_from of this V1beta1ModelSpec. # noqa: E501 :type: list[V1EnvFromSource] @@ -551,7 +556,7 @@ def resources(self, resources): def restart_policy(self): """Gets the restart_policy of this V1beta1ModelSpec. # noqa: E501 - RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 + RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 :return: The restart_policy of this V1beta1ModelSpec. # noqa: E501 :rtype: str @@ -562,7 +567,7 @@ def restart_policy(self): def restart_policy(self, restart_policy): """Sets the restart_policy of this V1beta1ModelSpec. - RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 + RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 :param restart_policy: The restart_policy of this V1beta1ModelSpec. # noqa: E501 :type: str @@ -570,6 +575,29 @@ def restart_policy(self, restart_policy): self._restart_policy = restart_policy + @property + def restart_policy_rules(self): + """Gets the restart_policy_rules of this V1beta1ModelSpec. # noqa: E501 + + Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. # noqa: E501 + + :return: The restart_policy_rules of this V1beta1ModelSpec. # noqa: E501 + :rtype: list[V1ContainerRestartRule] + """ + return self._restart_policy_rules + + @restart_policy_rules.setter + def restart_policy_rules(self, restart_policy_rules): + """Sets the restart_policy_rules of this V1beta1ModelSpec. + + Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. # noqa: E501 + + :param restart_policy_rules: The restart_policy_rules of this V1beta1ModelSpec. # noqa: E501 + :type: list[V1ContainerRestartRule] + """ + + self._restart_policy_rules = restart_policy_rules + @property def runtime(self): """Gets the runtime of this V1beta1ModelSpec. # noqa: E501 diff --git a/python/kserve/kserve/models/v1beta1_onnx_runtime_spec.py b/python/kserve/kserve/models/v1beta1_onnx_runtime_spec.py index a8f5e20a6d8..4e9efcb45c2 100644 --- a/python/kserve/kserve/models/v1beta1_onnx_runtime_spec.py +++ b/python/kserve/kserve/models/v1beta1_onnx_runtime_spec.py @@ -62,6 +62,7 @@ class V1beta1ONNXRuntimeSpec(object): 'resize_policy': 'list[V1ContainerResizePolicy]', 'resources': 'V1ResourceRequirements', 'restart_policy': 'str', + 'restart_policy_rules': 'list[V1ContainerRestartRule]', 'runtime_version': 'str', 'security_context': 'V1SecurityContext', 'startup_probe': 'V1Probe', @@ -93,6 +94,7 @@ class V1beta1ONNXRuntimeSpec(object): 'resize_policy': 'resizePolicy', 'resources': 'resources', 'restart_policy': 'restartPolicy', + 'restart_policy_rules': 'restartPolicyRules', 'runtime_version': 'runtimeVersion', 'security_context': 'securityContext', 'startup_probe': 'startupProbe', @@ -108,7 +110,7 @@ class V1beta1ONNXRuntimeSpec(object): 'working_dir': 'workingDir' } - def __init__(self, args=None, command=None, env=None, env_from=None, image=None, image_pull_policy=None, lifecycle=None, liveness_probe=None, name='', ports=None, protocol_version=None, readiness_probe=None, resize_policy=None, resources=None, restart_policy=None, runtime_version=None, security_context=None, startup_probe=None, stdin=None, stdin_once=None, storage=None, storage_uri=None, termination_message_path=None, termination_message_policy=None, tty=None, volume_devices=None, volume_mounts=None, working_dir=None, local_vars_configuration=None): # noqa: E501 + def __init__(self, args=None, command=None, env=None, env_from=None, image=None, image_pull_policy=None, lifecycle=None, liveness_probe=None, name='', ports=None, protocol_version=None, readiness_probe=None, resize_policy=None, resources=None, restart_policy=None, restart_policy_rules=None, runtime_version=None, security_context=None, startup_probe=None, stdin=None, stdin_once=None, storage=None, storage_uri=None, termination_message_path=None, termination_message_policy=None, tty=None, volume_devices=None, volume_mounts=None, working_dir=None, local_vars_configuration=None): # noqa: E501 """V1beta1ONNXRuntimeSpec - a model defined in OpenAPI""" # noqa: E501 if local_vars_configuration is None: local_vars_configuration = Configuration() @@ -129,6 +131,7 @@ def __init__(self, args=None, command=None, env=None, env_from=None, image=None, self._resize_policy = None self._resources = None self._restart_policy = None + self._restart_policy_rules = None self._runtime_version = None self._security_context = None self._startup_probe = None @@ -174,6 +177,8 @@ def __init__(self, args=None, command=None, env=None, env_from=None, image=None, self.resources = resources if restart_policy is not None: self.restart_policy = restart_policy + if restart_policy_rules is not None: + self.restart_policy_rules = restart_policy_rules if runtime_version is not None: self.runtime_version = runtime_version if security_context is not None: @@ -274,7 +279,7 @@ def env(self, env): def env_from(self): """Gets the env_from of this V1beta1ONNXRuntimeSpec. # noqa: E501 - List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 + List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 :return: The env_from of this V1beta1ONNXRuntimeSpec. # noqa: E501 :rtype: list[V1EnvFromSource] @@ -285,7 +290,7 @@ def env_from(self): def env_from(self, env_from): """Sets the env_from of this V1beta1ONNXRuntimeSpec. - List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 + List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 :param env_from: The env_from of this V1beta1ONNXRuntimeSpec. # noqa: E501 :type: list[V1EnvFromSource] @@ -519,7 +524,7 @@ def resources(self, resources): def restart_policy(self): """Gets the restart_policy of this V1beta1ONNXRuntimeSpec. # noqa: E501 - RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 + RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 :return: The restart_policy of this V1beta1ONNXRuntimeSpec. # noqa: E501 :rtype: str @@ -530,7 +535,7 @@ def restart_policy(self): def restart_policy(self, restart_policy): """Sets the restart_policy of this V1beta1ONNXRuntimeSpec. - RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 + RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 :param restart_policy: The restart_policy of this V1beta1ONNXRuntimeSpec. # noqa: E501 :type: str @@ -538,6 +543,29 @@ def restart_policy(self, restart_policy): self._restart_policy = restart_policy + @property + def restart_policy_rules(self): + """Gets the restart_policy_rules of this V1beta1ONNXRuntimeSpec. # noqa: E501 + + Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. # noqa: E501 + + :return: The restart_policy_rules of this V1beta1ONNXRuntimeSpec. # noqa: E501 + :rtype: list[V1ContainerRestartRule] + """ + return self._restart_policy_rules + + @restart_policy_rules.setter + def restart_policy_rules(self, restart_policy_rules): + """Sets the restart_policy_rules of this V1beta1ONNXRuntimeSpec. + + Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. # noqa: E501 + + :param restart_policy_rules: The restart_policy_rules of this V1beta1ONNXRuntimeSpec. # noqa: E501 + :type: list[V1ContainerRestartRule] + """ + + self._restart_policy_rules = restart_policy_rules + @property def runtime_version(self): """Gets the runtime_version of this V1beta1ONNXRuntimeSpec. # noqa: E501 diff --git a/python/kserve/kserve/models/v1beta1_paddle_server_spec.py b/python/kserve/kserve/models/v1beta1_paddle_server_spec.py index d041c3bd514..6d88b016f78 100644 --- a/python/kserve/kserve/models/v1beta1_paddle_server_spec.py +++ b/python/kserve/kserve/models/v1beta1_paddle_server_spec.py @@ -62,6 +62,7 @@ class V1beta1PaddleServerSpec(object): 'resize_policy': 'list[V1ContainerResizePolicy]', 'resources': 'V1ResourceRequirements', 'restart_policy': 'str', + 'restart_policy_rules': 'list[V1ContainerRestartRule]', 'runtime_version': 'str', 'security_context': 'V1SecurityContext', 'startup_probe': 'V1Probe', @@ -93,6 +94,7 @@ class V1beta1PaddleServerSpec(object): 'resize_policy': 'resizePolicy', 'resources': 'resources', 'restart_policy': 'restartPolicy', + 'restart_policy_rules': 'restartPolicyRules', 'runtime_version': 'runtimeVersion', 'security_context': 'securityContext', 'startup_probe': 'startupProbe', @@ -108,7 +110,7 @@ class V1beta1PaddleServerSpec(object): 'working_dir': 'workingDir' } - def __init__(self, args=None, command=None, env=None, env_from=None, image=None, image_pull_policy=None, lifecycle=None, liveness_probe=None, name='', ports=None, protocol_version=None, readiness_probe=None, resize_policy=None, resources=None, restart_policy=None, runtime_version=None, security_context=None, startup_probe=None, stdin=None, stdin_once=None, storage=None, storage_uri=None, termination_message_path=None, termination_message_policy=None, tty=None, volume_devices=None, volume_mounts=None, working_dir=None, local_vars_configuration=None): # noqa: E501 + def __init__(self, args=None, command=None, env=None, env_from=None, image=None, image_pull_policy=None, lifecycle=None, liveness_probe=None, name='', ports=None, protocol_version=None, readiness_probe=None, resize_policy=None, resources=None, restart_policy=None, restart_policy_rules=None, runtime_version=None, security_context=None, startup_probe=None, stdin=None, stdin_once=None, storage=None, storage_uri=None, termination_message_path=None, termination_message_policy=None, tty=None, volume_devices=None, volume_mounts=None, working_dir=None, local_vars_configuration=None): # noqa: E501 """V1beta1PaddleServerSpec - a model defined in OpenAPI""" # noqa: E501 if local_vars_configuration is None: local_vars_configuration = Configuration() @@ -129,6 +131,7 @@ def __init__(self, args=None, command=None, env=None, env_from=None, image=None, self._resize_policy = None self._resources = None self._restart_policy = None + self._restart_policy_rules = None self._runtime_version = None self._security_context = None self._startup_probe = None @@ -174,6 +177,8 @@ def __init__(self, args=None, command=None, env=None, env_from=None, image=None, self.resources = resources if restart_policy is not None: self.restart_policy = restart_policy + if restart_policy_rules is not None: + self.restart_policy_rules = restart_policy_rules if runtime_version is not None: self.runtime_version = runtime_version if security_context is not None: @@ -274,7 +279,7 @@ def env(self, env): def env_from(self): """Gets the env_from of this V1beta1PaddleServerSpec. # noqa: E501 - List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 + List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 :return: The env_from of this V1beta1PaddleServerSpec. # noqa: E501 :rtype: list[V1EnvFromSource] @@ -285,7 +290,7 @@ def env_from(self): def env_from(self, env_from): """Sets the env_from of this V1beta1PaddleServerSpec. - List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 + List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 :param env_from: The env_from of this V1beta1PaddleServerSpec. # noqa: E501 :type: list[V1EnvFromSource] @@ -519,7 +524,7 @@ def resources(self, resources): def restart_policy(self): """Gets the restart_policy of this V1beta1PaddleServerSpec. # noqa: E501 - RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 + RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 :return: The restart_policy of this V1beta1PaddleServerSpec. # noqa: E501 :rtype: str @@ -530,7 +535,7 @@ def restart_policy(self): def restart_policy(self, restart_policy): """Sets the restart_policy of this V1beta1PaddleServerSpec. - RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 + RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 :param restart_policy: The restart_policy of this V1beta1PaddleServerSpec. # noqa: E501 :type: str @@ -538,6 +543,29 @@ def restart_policy(self, restart_policy): self._restart_policy = restart_policy + @property + def restart_policy_rules(self): + """Gets the restart_policy_rules of this V1beta1PaddleServerSpec. # noqa: E501 + + Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. # noqa: E501 + + :return: The restart_policy_rules of this V1beta1PaddleServerSpec. # noqa: E501 + :rtype: list[V1ContainerRestartRule] + """ + return self._restart_policy_rules + + @restart_policy_rules.setter + def restart_policy_rules(self, restart_policy_rules): + """Sets the restart_policy_rules of this V1beta1PaddleServerSpec. + + Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. # noqa: E501 + + :param restart_policy_rules: The restart_policy_rules of this V1beta1PaddleServerSpec. # noqa: E501 + :type: list[V1ContainerRestartRule] + """ + + self._restart_policy_rules = restart_policy_rules + @property def runtime_version(self): """Gets the runtime_version of this V1beta1PaddleServerSpec. # noqa: E501 diff --git a/python/kserve/kserve/models/v1beta1_pmml_spec.py b/python/kserve/kserve/models/v1beta1_pmml_spec.py index 59f2c1dad27..907947fa155 100644 --- a/python/kserve/kserve/models/v1beta1_pmml_spec.py +++ b/python/kserve/kserve/models/v1beta1_pmml_spec.py @@ -62,6 +62,7 @@ class V1beta1PMMLSpec(object): 'resize_policy': 'list[V1ContainerResizePolicy]', 'resources': 'V1ResourceRequirements', 'restart_policy': 'str', + 'restart_policy_rules': 'list[V1ContainerRestartRule]', 'runtime_version': 'str', 'security_context': 'V1SecurityContext', 'startup_probe': 'V1Probe', @@ -93,6 +94,7 @@ class V1beta1PMMLSpec(object): 'resize_policy': 'resizePolicy', 'resources': 'resources', 'restart_policy': 'restartPolicy', + 'restart_policy_rules': 'restartPolicyRules', 'runtime_version': 'runtimeVersion', 'security_context': 'securityContext', 'startup_probe': 'startupProbe', @@ -108,7 +110,7 @@ class V1beta1PMMLSpec(object): 'working_dir': 'workingDir' } - def __init__(self, args=None, command=None, env=None, env_from=None, image=None, image_pull_policy=None, lifecycle=None, liveness_probe=None, name='', ports=None, protocol_version=None, readiness_probe=None, resize_policy=None, resources=None, restart_policy=None, runtime_version=None, security_context=None, startup_probe=None, stdin=None, stdin_once=None, storage=None, storage_uri=None, termination_message_path=None, termination_message_policy=None, tty=None, volume_devices=None, volume_mounts=None, working_dir=None, local_vars_configuration=None): # noqa: E501 + def __init__(self, args=None, command=None, env=None, env_from=None, image=None, image_pull_policy=None, lifecycle=None, liveness_probe=None, name='', ports=None, protocol_version=None, readiness_probe=None, resize_policy=None, resources=None, restart_policy=None, restart_policy_rules=None, runtime_version=None, security_context=None, startup_probe=None, stdin=None, stdin_once=None, storage=None, storage_uri=None, termination_message_path=None, termination_message_policy=None, tty=None, volume_devices=None, volume_mounts=None, working_dir=None, local_vars_configuration=None): # noqa: E501 """V1beta1PMMLSpec - a model defined in OpenAPI""" # noqa: E501 if local_vars_configuration is None: local_vars_configuration = Configuration() @@ -129,6 +131,7 @@ def __init__(self, args=None, command=None, env=None, env_from=None, image=None, self._resize_policy = None self._resources = None self._restart_policy = None + self._restart_policy_rules = None self._runtime_version = None self._security_context = None self._startup_probe = None @@ -174,6 +177,8 @@ def __init__(self, args=None, command=None, env=None, env_from=None, image=None, self.resources = resources if restart_policy is not None: self.restart_policy = restart_policy + if restart_policy_rules is not None: + self.restart_policy_rules = restart_policy_rules if runtime_version is not None: self.runtime_version = runtime_version if security_context is not None: @@ -274,7 +279,7 @@ def env(self, env): def env_from(self): """Gets the env_from of this V1beta1PMMLSpec. # noqa: E501 - List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 + List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 :return: The env_from of this V1beta1PMMLSpec. # noqa: E501 :rtype: list[V1EnvFromSource] @@ -285,7 +290,7 @@ def env_from(self): def env_from(self, env_from): """Sets the env_from of this V1beta1PMMLSpec. - List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 + List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 :param env_from: The env_from of this V1beta1PMMLSpec. # noqa: E501 :type: list[V1EnvFromSource] @@ -519,7 +524,7 @@ def resources(self, resources): def restart_policy(self): """Gets the restart_policy of this V1beta1PMMLSpec. # noqa: E501 - RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 + RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 :return: The restart_policy of this V1beta1PMMLSpec. # noqa: E501 :rtype: str @@ -530,7 +535,7 @@ def restart_policy(self): def restart_policy(self, restart_policy): """Sets the restart_policy of this V1beta1PMMLSpec. - RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 + RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 :param restart_policy: The restart_policy of this V1beta1PMMLSpec. # noqa: E501 :type: str @@ -538,6 +543,29 @@ def restart_policy(self, restart_policy): self._restart_policy = restart_policy + @property + def restart_policy_rules(self): + """Gets the restart_policy_rules of this V1beta1PMMLSpec. # noqa: E501 + + Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. # noqa: E501 + + :return: The restart_policy_rules of this V1beta1PMMLSpec. # noqa: E501 + :rtype: list[V1ContainerRestartRule] + """ + return self._restart_policy_rules + + @restart_policy_rules.setter + def restart_policy_rules(self, restart_policy_rules): + """Sets the restart_policy_rules of this V1beta1PMMLSpec. + + Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. # noqa: E501 + + :param restart_policy_rules: The restart_policy_rules of this V1beta1PMMLSpec. # noqa: E501 + :type: list[V1ContainerRestartRule] + """ + + self._restart_policy_rules = restart_policy_rules + @property def runtime_version(self): """Gets the runtime_version of this V1beta1PMMLSpec. # noqa: E501 diff --git a/python/kserve/kserve/models/v1beta1_predictor_extension_spec.py b/python/kserve/kserve/models/v1beta1_predictor_extension_spec.py index 0472ab894a1..74e66926845 100644 --- a/python/kserve/kserve/models/v1beta1_predictor_extension_spec.py +++ b/python/kserve/kserve/models/v1beta1_predictor_extension_spec.py @@ -62,6 +62,7 @@ class V1beta1PredictorExtensionSpec(object): 'resize_policy': 'list[V1ContainerResizePolicy]', 'resources': 'V1ResourceRequirements', 'restart_policy': 'str', + 'restart_policy_rules': 'list[V1ContainerRestartRule]', 'runtime_version': 'str', 'security_context': 'V1SecurityContext', 'startup_probe': 'V1Probe', @@ -93,6 +94,7 @@ class V1beta1PredictorExtensionSpec(object): 'resize_policy': 'resizePolicy', 'resources': 'resources', 'restart_policy': 'restartPolicy', + 'restart_policy_rules': 'restartPolicyRules', 'runtime_version': 'runtimeVersion', 'security_context': 'securityContext', 'startup_probe': 'startupProbe', @@ -108,7 +110,7 @@ class V1beta1PredictorExtensionSpec(object): 'working_dir': 'workingDir' } - def __init__(self, args=None, command=None, env=None, env_from=None, image=None, image_pull_policy=None, lifecycle=None, liveness_probe=None, name='', ports=None, protocol_version=None, readiness_probe=None, resize_policy=None, resources=None, restart_policy=None, runtime_version=None, security_context=None, startup_probe=None, stdin=None, stdin_once=None, storage=None, storage_uri=None, termination_message_path=None, termination_message_policy=None, tty=None, volume_devices=None, volume_mounts=None, working_dir=None, local_vars_configuration=None): # noqa: E501 + def __init__(self, args=None, command=None, env=None, env_from=None, image=None, image_pull_policy=None, lifecycle=None, liveness_probe=None, name='', ports=None, protocol_version=None, readiness_probe=None, resize_policy=None, resources=None, restart_policy=None, restart_policy_rules=None, runtime_version=None, security_context=None, startup_probe=None, stdin=None, stdin_once=None, storage=None, storage_uri=None, termination_message_path=None, termination_message_policy=None, tty=None, volume_devices=None, volume_mounts=None, working_dir=None, local_vars_configuration=None): # noqa: E501 """V1beta1PredictorExtensionSpec - a model defined in OpenAPI""" # noqa: E501 if local_vars_configuration is None: local_vars_configuration = Configuration() @@ -129,6 +131,7 @@ def __init__(self, args=None, command=None, env=None, env_from=None, image=None, self._resize_policy = None self._resources = None self._restart_policy = None + self._restart_policy_rules = None self._runtime_version = None self._security_context = None self._startup_probe = None @@ -174,6 +177,8 @@ def __init__(self, args=None, command=None, env=None, env_from=None, image=None, self.resources = resources if restart_policy is not None: self.restart_policy = restart_policy + if restart_policy_rules is not None: + self.restart_policy_rules = restart_policy_rules if runtime_version is not None: self.runtime_version = runtime_version if security_context is not None: @@ -274,7 +279,7 @@ def env(self, env): def env_from(self): """Gets the env_from of this V1beta1PredictorExtensionSpec. # noqa: E501 - List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 + List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 :return: The env_from of this V1beta1PredictorExtensionSpec. # noqa: E501 :rtype: list[V1EnvFromSource] @@ -285,7 +290,7 @@ def env_from(self): def env_from(self, env_from): """Sets the env_from of this V1beta1PredictorExtensionSpec. - List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 + List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 :param env_from: The env_from of this V1beta1PredictorExtensionSpec. # noqa: E501 :type: list[V1EnvFromSource] @@ -519,7 +524,7 @@ def resources(self, resources): def restart_policy(self): """Gets the restart_policy of this V1beta1PredictorExtensionSpec. # noqa: E501 - RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 + RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 :return: The restart_policy of this V1beta1PredictorExtensionSpec. # noqa: E501 :rtype: str @@ -530,7 +535,7 @@ def restart_policy(self): def restart_policy(self, restart_policy): """Sets the restart_policy of this V1beta1PredictorExtensionSpec. - RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 + RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 :param restart_policy: The restart_policy of this V1beta1PredictorExtensionSpec. # noqa: E501 :type: str @@ -538,6 +543,29 @@ def restart_policy(self, restart_policy): self._restart_policy = restart_policy + @property + def restart_policy_rules(self): + """Gets the restart_policy_rules of this V1beta1PredictorExtensionSpec. # noqa: E501 + + Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. # noqa: E501 + + :return: The restart_policy_rules of this V1beta1PredictorExtensionSpec. # noqa: E501 + :rtype: list[V1ContainerRestartRule] + """ + return self._restart_policy_rules + + @restart_policy_rules.setter + def restart_policy_rules(self, restart_policy_rules): + """Sets the restart_policy_rules of this V1beta1PredictorExtensionSpec. + + Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. # noqa: E501 + + :param restart_policy_rules: The restart_policy_rules of this V1beta1PredictorExtensionSpec. # noqa: E501 + :type: list[V1ContainerRestartRule] + """ + + self._restart_policy_rules = restart_policy_rules + @property def runtime_version(self): """Gets the runtime_version of this V1beta1PredictorExtensionSpec. # noqa: E501 diff --git a/python/kserve/kserve/models/v1beta1_sk_learn_spec.py b/python/kserve/kserve/models/v1beta1_sk_learn_spec.py index 20be16f877b..fd0bd6d2451 100644 --- a/python/kserve/kserve/models/v1beta1_sk_learn_spec.py +++ b/python/kserve/kserve/models/v1beta1_sk_learn_spec.py @@ -62,6 +62,7 @@ class V1beta1SKLearnSpec(object): 'resize_policy': 'list[V1ContainerResizePolicy]', 'resources': 'V1ResourceRequirements', 'restart_policy': 'str', + 'restart_policy_rules': 'list[V1ContainerRestartRule]', 'runtime_version': 'str', 'security_context': 'V1SecurityContext', 'startup_probe': 'V1Probe', @@ -93,6 +94,7 @@ class V1beta1SKLearnSpec(object): 'resize_policy': 'resizePolicy', 'resources': 'resources', 'restart_policy': 'restartPolicy', + 'restart_policy_rules': 'restartPolicyRules', 'runtime_version': 'runtimeVersion', 'security_context': 'securityContext', 'startup_probe': 'startupProbe', @@ -108,7 +110,7 @@ class V1beta1SKLearnSpec(object): 'working_dir': 'workingDir' } - def __init__(self, args=None, command=None, env=None, env_from=None, image=None, image_pull_policy=None, lifecycle=None, liveness_probe=None, name='', ports=None, protocol_version=None, readiness_probe=None, resize_policy=None, resources=None, restart_policy=None, runtime_version=None, security_context=None, startup_probe=None, stdin=None, stdin_once=None, storage=None, storage_uri=None, termination_message_path=None, termination_message_policy=None, tty=None, volume_devices=None, volume_mounts=None, working_dir=None, local_vars_configuration=None): # noqa: E501 + def __init__(self, args=None, command=None, env=None, env_from=None, image=None, image_pull_policy=None, lifecycle=None, liveness_probe=None, name='', ports=None, protocol_version=None, readiness_probe=None, resize_policy=None, resources=None, restart_policy=None, restart_policy_rules=None, runtime_version=None, security_context=None, startup_probe=None, stdin=None, stdin_once=None, storage=None, storage_uri=None, termination_message_path=None, termination_message_policy=None, tty=None, volume_devices=None, volume_mounts=None, working_dir=None, local_vars_configuration=None): # noqa: E501 """V1beta1SKLearnSpec - a model defined in OpenAPI""" # noqa: E501 if local_vars_configuration is None: local_vars_configuration = Configuration() @@ -129,6 +131,7 @@ def __init__(self, args=None, command=None, env=None, env_from=None, image=None, self._resize_policy = None self._resources = None self._restart_policy = None + self._restart_policy_rules = None self._runtime_version = None self._security_context = None self._startup_probe = None @@ -174,6 +177,8 @@ def __init__(self, args=None, command=None, env=None, env_from=None, image=None, self.resources = resources if restart_policy is not None: self.restart_policy = restart_policy + if restart_policy_rules is not None: + self.restart_policy_rules = restart_policy_rules if runtime_version is not None: self.runtime_version = runtime_version if security_context is not None: @@ -274,7 +279,7 @@ def env(self, env): def env_from(self): """Gets the env_from of this V1beta1SKLearnSpec. # noqa: E501 - List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 + List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 :return: The env_from of this V1beta1SKLearnSpec. # noqa: E501 :rtype: list[V1EnvFromSource] @@ -285,7 +290,7 @@ def env_from(self): def env_from(self, env_from): """Sets the env_from of this V1beta1SKLearnSpec. - List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 + List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 :param env_from: The env_from of this V1beta1SKLearnSpec. # noqa: E501 :type: list[V1EnvFromSource] @@ -519,7 +524,7 @@ def resources(self, resources): def restart_policy(self): """Gets the restart_policy of this V1beta1SKLearnSpec. # noqa: E501 - RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 + RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 :return: The restart_policy of this V1beta1SKLearnSpec. # noqa: E501 :rtype: str @@ -530,7 +535,7 @@ def restart_policy(self): def restart_policy(self, restart_policy): """Sets the restart_policy of this V1beta1SKLearnSpec. - RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 + RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 :param restart_policy: The restart_policy of this V1beta1SKLearnSpec. # noqa: E501 :type: str @@ -538,6 +543,29 @@ def restart_policy(self, restart_policy): self._restart_policy = restart_policy + @property + def restart_policy_rules(self): + """Gets the restart_policy_rules of this V1beta1SKLearnSpec. # noqa: E501 + + Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. # noqa: E501 + + :return: The restart_policy_rules of this V1beta1SKLearnSpec. # noqa: E501 + :rtype: list[V1ContainerRestartRule] + """ + return self._restart_policy_rules + + @restart_policy_rules.setter + def restart_policy_rules(self, restart_policy_rules): + """Sets the restart_policy_rules of this V1beta1SKLearnSpec. + + Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. # noqa: E501 + + :param restart_policy_rules: The restart_policy_rules of this V1beta1SKLearnSpec. # noqa: E501 + :type: list[V1ContainerRestartRule] + """ + + self._restart_policy_rules = restart_policy_rules + @property def runtime_version(self): """Gets the runtime_version of this V1beta1SKLearnSpec. # noqa: E501 diff --git a/python/kserve/kserve/models/v1beta1_tf_serving_spec.py b/python/kserve/kserve/models/v1beta1_tf_serving_spec.py index 53b426c16ac..e3b75cd60ae 100644 --- a/python/kserve/kserve/models/v1beta1_tf_serving_spec.py +++ b/python/kserve/kserve/models/v1beta1_tf_serving_spec.py @@ -62,6 +62,7 @@ class V1beta1TFServingSpec(object): 'resize_policy': 'list[V1ContainerResizePolicy]', 'resources': 'V1ResourceRequirements', 'restart_policy': 'str', + 'restart_policy_rules': 'list[V1ContainerRestartRule]', 'runtime_version': 'str', 'security_context': 'V1SecurityContext', 'startup_probe': 'V1Probe', @@ -93,6 +94,7 @@ class V1beta1TFServingSpec(object): 'resize_policy': 'resizePolicy', 'resources': 'resources', 'restart_policy': 'restartPolicy', + 'restart_policy_rules': 'restartPolicyRules', 'runtime_version': 'runtimeVersion', 'security_context': 'securityContext', 'startup_probe': 'startupProbe', @@ -108,7 +110,7 @@ class V1beta1TFServingSpec(object): 'working_dir': 'workingDir' } - def __init__(self, args=None, command=None, env=None, env_from=None, image=None, image_pull_policy=None, lifecycle=None, liveness_probe=None, name='', ports=None, protocol_version=None, readiness_probe=None, resize_policy=None, resources=None, restart_policy=None, runtime_version=None, security_context=None, startup_probe=None, stdin=None, stdin_once=None, storage=None, storage_uri=None, termination_message_path=None, termination_message_policy=None, tty=None, volume_devices=None, volume_mounts=None, working_dir=None, local_vars_configuration=None): # noqa: E501 + def __init__(self, args=None, command=None, env=None, env_from=None, image=None, image_pull_policy=None, lifecycle=None, liveness_probe=None, name='', ports=None, protocol_version=None, readiness_probe=None, resize_policy=None, resources=None, restart_policy=None, restart_policy_rules=None, runtime_version=None, security_context=None, startup_probe=None, stdin=None, stdin_once=None, storage=None, storage_uri=None, termination_message_path=None, termination_message_policy=None, tty=None, volume_devices=None, volume_mounts=None, working_dir=None, local_vars_configuration=None): # noqa: E501 """V1beta1TFServingSpec - a model defined in OpenAPI""" # noqa: E501 if local_vars_configuration is None: local_vars_configuration = Configuration() @@ -129,6 +131,7 @@ def __init__(self, args=None, command=None, env=None, env_from=None, image=None, self._resize_policy = None self._resources = None self._restart_policy = None + self._restart_policy_rules = None self._runtime_version = None self._security_context = None self._startup_probe = None @@ -174,6 +177,8 @@ def __init__(self, args=None, command=None, env=None, env_from=None, image=None, self.resources = resources if restart_policy is not None: self.restart_policy = restart_policy + if restart_policy_rules is not None: + self.restart_policy_rules = restart_policy_rules if runtime_version is not None: self.runtime_version = runtime_version if security_context is not None: @@ -274,7 +279,7 @@ def env(self, env): def env_from(self): """Gets the env_from of this V1beta1TFServingSpec. # noqa: E501 - List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 + List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 :return: The env_from of this V1beta1TFServingSpec. # noqa: E501 :rtype: list[V1EnvFromSource] @@ -285,7 +290,7 @@ def env_from(self): def env_from(self, env_from): """Sets the env_from of this V1beta1TFServingSpec. - List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 + List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 :param env_from: The env_from of this V1beta1TFServingSpec. # noqa: E501 :type: list[V1EnvFromSource] @@ -519,7 +524,7 @@ def resources(self, resources): def restart_policy(self): """Gets the restart_policy of this V1beta1TFServingSpec. # noqa: E501 - RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 + RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 :return: The restart_policy of this V1beta1TFServingSpec. # noqa: E501 :rtype: str @@ -530,7 +535,7 @@ def restart_policy(self): def restart_policy(self, restart_policy): """Sets the restart_policy of this V1beta1TFServingSpec. - RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 + RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 :param restart_policy: The restart_policy of this V1beta1TFServingSpec. # noqa: E501 :type: str @@ -538,6 +543,29 @@ def restart_policy(self, restart_policy): self._restart_policy = restart_policy + @property + def restart_policy_rules(self): + """Gets the restart_policy_rules of this V1beta1TFServingSpec. # noqa: E501 + + Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. # noqa: E501 + + :return: The restart_policy_rules of this V1beta1TFServingSpec. # noqa: E501 + :rtype: list[V1ContainerRestartRule] + """ + return self._restart_policy_rules + + @restart_policy_rules.setter + def restart_policy_rules(self, restart_policy_rules): + """Sets the restart_policy_rules of this V1beta1TFServingSpec. + + Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. # noqa: E501 + + :param restart_policy_rules: The restart_policy_rules of this V1beta1TFServingSpec. # noqa: E501 + :type: list[V1ContainerRestartRule] + """ + + self._restart_policy_rules = restart_policy_rules + @property def runtime_version(self): """Gets the runtime_version of this V1beta1TFServingSpec. # noqa: E501 diff --git a/python/kserve/kserve/models/v1beta1_torch_serve_spec.py b/python/kserve/kserve/models/v1beta1_torch_serve_spec.py index 491411e582f..5d7b35035d7 100644 --- a/python/kserve/kserve/models/v1beta1_torch_serve_spec.py +++ b/python/kserve/kserve/models/v1beta1_torch_serve_spec.py @@ -62,6 +62,7 @@ class V1beta1TorchServeSpec(object): 'resize_policy': 'list[V1ContainerResizePolicy]', 'resources': 'V1ResourceRequirements', 'restart_policy': 'str', + 'restart_policy_rules': 'list[V1ContainerRestartRule]', 'runtime_version': 'str', 'security_context': 'V1SecurityContext', 'startup_probe': 'V1Probe', @@ -93,6 +94,7 @@ class V1beta1TorchServeSpec(object): 'resize_policy': 'resizePolicy', 'resources': 'resources', 'restart_policy': 'restartPolicy', + 'restart_policy_rules': 'restartPolicyRules', 'runtime_version': 'runtimeVersion', 'security_context': 'securityContext', 'startup_probe': 'startupProbe', @@ -108,7 +110,7 @@ class V1beta1TorchServeSpec(object): 'working_dir': 'workingDir' } - def __init__(self, args=None, command=None, env=None, env_from=None, image=None, image_pull_policy=None, lifecycle=None, liveness_probe=None, name='', ports=None, protocol_version=None, readiness_probe=None, resize_policy=None, resources=None, restart_policy=None, runtime_version=None, security_context=None, startup_probe=None, stdin=None, stdin_once=None, storage=None, storage_uri=None, termination_message_path=None, termination_message_policy=None, tty=None, volume_devices=None, volume_mounts=None, working_dir=None, local_vars_configuration=None): # noqa: E501 + def __init__(self, args=None, command=None, env=None, env_from=None, image=None, image_pull_policy=None, lifecycle=None, liveness_probe=None, name='', ports=None, protocol_version=None, readiness_probe=None, resize_policy=None, resources=None, restart_policy=None, restart_policy_rules=None, runtime_version=None, security_context=None, startup_probe=None, stdin=None, stdin_once=None, storage=None, storage_uri=None, termination_message_path=None, termination_message_policy=None, tty=None, volume_devices=None, volume_mounts=None, working_dir=None, local_vars_configuration=None): # noqa: E501 """V1beta1TorchServeSpec - a model defined in OpenAPI""" # noqa: E501 if local_vars_configuration is None: local_vars_configuration = Configuration() @@ -129,6 +131,7 @@ def __init__(self, args=None, command=None, env=None, env_from=None, image=None, self._resize_policy = None self._resources = None self._restart_policy = None + self._restart_policy_rules = None self._runtime_version = None self._security_context = None self._startup_probe = None @@ -174,6 +177,8 @@ def __init__(self, args=None, command=None, env=None, env_from=None, image=None, self.resources = resources if restart_policy is not None: self.restart_policy = restart_policy + if restart_policy_rules is not None: + self.restart_policy_rules = restart_policy_rules if runtime_version is not None: self.runtime_version = runtime_version if security_context is not None: @@ -274,7 +279,7 @@ def env(self, env): def env_from(self): """Gets the env_from of this V1beta1TorchServeSpec. # noqa: E501 - List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 + List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 :return: The env_from of this V1beta1TorchServeSpec. # noqa: E501 :rtype: list[V1EnvFromSource] @@ -285,7 +290,7 @@ def env_from(self): def env_from(self, env_from): """Sets the env_from of this V1beta1TorchServeSpec. - List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 + List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 :param env_from: The env_from of this V1beta1TorchServeSpec. # noqa: E501 :type: list[V1EnvFromSource] @@ -519,7 +524,7 @@ def resources(self, resources): def restart_policy(self): """Gets the restart_policy of this V1beta1TorchServeSpec. # noqa: E501 - RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 + RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 :return: The restart_policy of this V1beta1TorchServeSpec. # noqa: E501 :rtype: str @@ -530,7 +535,7 @@ def restart_policy(self): def restart_policy(self, restart_policy): """Sets the restart_policy of this V1beta1TorchServeSpec. - RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 + RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 :param restart_policy: The restart_policy of this V1beta1TorchServeSpec. # noqa: E501 :type: str @@ -538,6 +543,29 @@ def restart_policy(self, restart_policy): self._restart_policy = restart_policy + @property + def restart_policy_rules(self): + """Gets the restart_policy_rules of this V1beta1TorchServeSpec. # noqa: E501 + + Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. # noqa: E501 + + :return: The restart_policy_rules of this V1beta1TorchServeSpec. # noqa: E501 + :rtype: list[V1ContainerRestartRule] + """ + return self._restart_policy_rules + + @restart_policy_rules.setter + def restart_policy_rules(self, restart_policy_rules): + """Sets the restart_policy_rules of this V1beta1TorchServeSpec. + + Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. # noqa: E501 + + :param restart_policy_rules: The restart_policy_rules of this V1beta1TorchServeSpec. # noqa: E501 + :type: list[V1ContainerRestartRule] + """ + + self._restart_policy_rules = restart_policy_rules + @property def runtime_version(self): """Gets the runtime_version of this V1beta1TorchServeSpec. # noqa: E501 diff --git a/python/kserve/kserve/models/v1beta1_triton_spec.py b/python/kserve/kserve/models/v1beta1_triton_spec.py index 6fcb092bff8..f6163996d80 100644 --- a/python/kserve/kserve/models/v1beta1_triton_spec.py +++ b/python/kserve/kserve/models/v1beta1_triton_spec.py @@ -62,6 +62,7 @@ class V1beta1TritonSpec(object): 'resize_policy': 'list[V1ContainerResizePolicy]', 'resources': 'V1ResourceRequirements', 'restart_policy': 'str', + 'restart_policy_rules': 'list[V1ContainerRestartRule]', 'runtime_version': 'str', 'security_context': 'V1SecurityContext', 'startup_probe': 'V1Probe', @@ -93,6 +94,7 @@ class V1beta1TritonSpec(object): 'resize_policy': 'resizePolicy', 'resources': 'resources', 'restart_policy': 'restartPolicy', + 'restart_policy_rules': 'restartPolicyRules', 'runtime_version': 'runtimeVersion', 'security_context': 'securityContext', 'startup_probe': 'startupProbe', @@ -108,7 +110,7 @@ class V1beta1TritonSpec(object): 'working_dir': 'workingDir' } - def __init__(self, args=None, command=None, env=None, env_from=None, image=None, image_pull_policy=None, lifecycle=None, liveness_probe=None, name='', ports=None, protocol_version=None, readiness_probe=None, resize_policy=None, resources=None, restart_policy=None, runtime_version=None, security_context=None, startup_probe=None, stdin=None, stdin_once=None, storage=None, storage_uri=None, termination_message_path=None, termination_message_policy=None, tty=None, volume_devices=None, volume_mounts=None, working_dir=None, local_vars_configuration=None): # noqa: E501 + def __init__(self, args=None, command=None, env=None, env_from=None, image=None, image_pull_policy=None, lifecycle=None, liveness_probe=None, name='', ports=None, protocol_version=None, readiness_probe=None, resize_policy=None, resources=None, restart_policy=None, restart_policy_rules=None, runtime_version=None, security_context=None, startup_probe=None, stdin=None, stdin_once=None, storage=None, storage_uri=None, termination_message_path=None, termination_message_policy=None, tty=None, volume_devices=None, volume_mounts=None, working_dir=None, local_vars_configuration=None): # noqa: E501 """V1beta1TritonSpec - a model defined in OpenAPI""" # noqa: E501 if local_vars_configuration is None: local_vars_configuration = Configuration() @@ -129,6 +131,7 @@ def __init__(self, args=None, command=None, env=None, env_from=None, image=None, self._resize_policy = None self._resources = None self._restart_policy = None + self._restart_policy_rules = None self._runtime_version = None self._security_context = None self._startup_probe = None @@ -174,6 +177,8 @@ def __init__(self, args=None, command=None, env=None, env_from=None, image=None, self.resources = resources if restart_policy is not None: self.restart_policy = restart_policy + if restart_policy_rules is not None: + self.restart_policy_rules = restart_policy_rules if runtime_version is not None: self.runtime_version = runtime_version if security_context is not None: @@ -274,7 +279,7 @@ def env(self, env): def env_from(self): """Gets the env_from of this V1beta1TritonSpec. # noqa: E501 - List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 + List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 :return: The env_from of this V1beta1TritonSpec. # noqa: E501 :rtype: list[V1EnvFromSource] @@ -285,7 +290,7 @@ def env_from(self): def env_from(self, env_from): """Sets the env_from of this V1beta1TritonSpec. - List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 + List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 :param env_from: The env_from of this V1beta1TritonSpec. # noqa: E501 :type: list[V1EnvFromSource] @@ -519,7 +524,7 @@ def resources(self, resources): def restart_policy(self): """Gets the restart_policy of this V1beta1TritonSpec. # noqa: E501 - RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 + RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 :return: The restart_policy of this V1beta1TritonSpec. # noqa: E501 :rtype: str @@ -530,7 +535,7 @@ def restart_policy(self): def restart_policy(self, restart_policy): """Sets the restart_policy of this V1beta1TritonSpec. - RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 + RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 :param restart_policy: The restart_policy of this V1beta1TritonSpec. # noqa: E501 :type: str @@ -538,6 +543,29 @@ def restart_policy(self, restart_policy): self._restart_policy = restart_policy + @property + def restart_policy_rules(self): + """Gets the restart_policy_rules of this V1beta1TritonSpec. # noqa: E501 + + Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. # noqa: E501 + + :return: The restart_policy_rules of this V1beta1TritonSpec. # noqa: E501 + :rtype: list[V1ContainerRestartRule] + """ + return self._restart_policy_rules + + @restart_policy_rules.setter + def restart_policy_rules(self, restart_policy_rules): + """Sets the restart_policy_rules of this V1beta1TritonSpec. + + Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. # noqa: E501 + + :param restart_policy_rules: The restart_policy_rules of this V1beta1TritonSpec. # noqa: E501 + :type: list[V1ContainerRestartRule] + """ + + self._restart_policy_rules = restart_policy_rules + @property def runtime_version(self): """Gets the runtime_version of this V1beta1TritonSpec. # noqa: E501 diff --git a/python/kserve/kserve/models/v1beta1_xg_boost_spec.py b/python/kserve/kserve/models/v1beta1_xg_boost_spec.py index a3bfbf7f667..ccbcd21c085 100644 --- a/python/kserve/kserve/models/v1beta1_xg_boost_spec.py +++ b/python/kserve/kserve/models/v1beta1_xg_boost_spec.py @@ -62,6 +62,7 @@ class V1beta1XGBoostSpec(object): 'resize_policy': 'list[V1ContainerResizePolicy]', 'resources': 'V1ResourceRequirements', 'restart_policy': 'str', + 'restart_policy_rules': 'list[V1ContainerRestartRule]', 'runtime_version': 'str', 'security_context': 'V1SecurityContext', 'startup_probe': 'V1Probe', @@ -93,6 +94,7 @@ class V1beta1XGBoostSpec(object): 'resize_policy': 'resizePolicy', 'resources': 'resources', 'restart_policy': 'restartPolicy', + 'restart_policy_rules': 'restartPolicyRules', 'runtime_version': 'runtimeVersion', 'security_context': 'securityContext', 'startup_probe': 'startupProbe', @@ -108,7 +110,7 @@ class V1beta1XGBoostSpec(object): 'working_dir': 'workingDir' } - def __init__(self, args=None, command=None, env=None, env_from=None, image=None, image_pull_policy=None, lifecycle=None, liveness_probe=None, name='', ports=None, protocol_version=None, readiness_probe=None, resize_policy=None, resources=None, restart_policy=None, runtime_version=None, security_context=None, startup_probe=None, stdin=None, stdin_once=None, storage=None, storage_uri=None, termination_message_path=None, termination_message_policy=None, tty=None, volume_devices=None, volume_mounts=None, working_dir=None, local_vars_configuration=None): # noqa: E501 + def __init__(self, args=None, command=None, env=None, env_from=None, image=None, image_pull_policy=None, lifecycle=None, liveness_probe=None, name='', ports=None, protocol_version=None, readiness_probe=None, resize_policy=None, resources=None, restart_policy=None, restart_policy_rules=None, runtime_version=None, security_context=None, startup_probe=None, stdin=None, stdin_once=None, storage=None, storage_uri=None, termination_message_path=None, termination_message_policy=None, tty=None, volume_devices=None, volume_mounts=None, working_dir=None, local_vars_configuration=None): # noqa: E501 """V1beta1XGBoostSpec - a model defined in OpenAPI""" # noqa: E501 if local_vars_configuration is None: local_vars_configuration = Configuration() @@ -129,6 +131,7 @@ def __init__(self, args=None, command=None, env=None, env_from=None, image=None, self._resize_policy = None self._resources = None self._restart_policy = None + self._restart_policy_rules = None self._runtime_version = None self._security_context = None self._startup_probe = None @@ -174,6 +177,8 @@ def __init__(self, args=None, command=None, env=None, env_from=None, image=None, self.resources = resources if restart_policy is not None: self.restart_policy = restart_policy + if restart_policy_rules is not None: + self.restart_policy_rules = restart_policy_rules if runtime_version is not None: self.runtime_version = runtime_version if security_context is not None: @@ -274,7 +279,7 @@ def env(self, env): def env_from(self): """Gets the env_from of this V1beta1XGBoostSpec. # noqa: E501 - List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 + List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 :return: The env_from of this V1beta1XGBoostSpec. # noqa: E501 :rtype: list[V1EnvFromSource] @@ -285,7 +290,7 @@ def env_from(self): def env_from(self, env_from): """Sets the env_from of this V1beta1XGBoostSpec. - List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 + List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. # noqa: E501 :param env_from: The env_from of this V1beta1XGBoostSpec. # noqa: E501 :type: list[V1EnvFromSource] @@ -519,7 +524,7 @@ def resources(self, resources): def restart_policy(self): """Gets the restart_policy of this V1beta1XGBoostSpec. # noqa: E501 - RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 + RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 :return: The restart_policy of this V1beta1XGBoostSpec. # noqa: E501 :rtype: str @@ -530,7 +535,7 @@ def restart_policy(self): def restart_policy(self, restart_policy): """Sets the restart_policy of this V1beta1XGBoostSpec. - RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 + RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed. # noqa: E501 :param restart_policy: The restart_policy of this V1beta1XGBoostSpec. # noqa: E501 :type: str @@ -538,6 +543,29 @@ def restart_policy(self, restart_policy): self._restart_policy = restart_policy + @property + def restart_policy_rules(self): + """Gets the restart_policy_rules of this V1beta1XGBoostSpec. # noqa: E501 + + Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. # noqa: E501 + + :return: The restart_policy_rules of this V1beta1XGBoostSpec. # noqa: E501 + :rtype: list[V1ContainerRestartRule] + """ + return self._restart_policy_rules + + @restart_policy_rules.setter + def restart_policy_rules(self, restart_policy_rules): + """Sets the restart_policy_rules of this V1beta1XGBoostSpec. + + Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy. # noqa: E501 + + :param restart_policy_rules: The restart_policy_rules of this V1beta1XGBoostSpec. # noqa: E501 + :type: list[V1ContainerRestartRule] + """ + + self._restart_policy_rules = restart_policy_rules + @property def runtime_version(self): """Gets the runtime_version of this V1beta1XGBoostSpec. # noqa: E501 diff --git a/router.Dockerfile b/router.Dockerfile index f552ef31687..c32dd049c78 100644 --- a/router.Dockerfile +++ b/router.Dockerfile @@ -6,6 +6,8 @@ WORKDIR /go/src/github.com/kserve/kserve COPY go.mod go.mod COPY go.sum go.sum +# Allow Go to automatically download the required toolchain version +ENV GOTOOLCHAIN=auto RUN go mod download COPY cmd/ cmd/ diff --git a/test/crds/gie-v1.yaml b/test/crds/gie-v1.yaml new file mode 100644 index 00000000000..4d2188bd50d --- /dev/null +++ b/test/crds/gie-v1.yaml @@ -0,0 +1,335 @@ +apiVersion: apiextensions.k8s.io/v1 +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.0.1 + creationTimestamp: null + name: inferencepools.inference.networking.k8s.io +spec: + group: inference.networking.k8s.io + names: + kind: InferencePool + listKind: InferencePoolList + plural: inferencepools + shortNames: + - infpool + singular: inferencepool + scope: Namespaced + versions: + - name: v1 + schema: + openAPIV3Schema: + description: | + InferencePool is the Schema for the InferencePools API. + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: Spec defines the desired state of the InferencePool. + properties: + endpointPickerRef: + description: |- + EndpointPickerRef is a reference to the Endpoint Picker extension and its + associated configuration. + properties: + failureMode: + default: FailClose + description: |- + FailureMode configures how the parent handles the case when the Endpoint Picker extension + is non-responsive. When unspecified, defaults to "FailClose". + enum: + - FailOpen + - FailClose + type: string + group: + default: "" + description: |- + Group is the group of the referent API object. When unspecified, the default value + is "", representing the Core API group. + maxLength: 253 + minLength: 0 + pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + kind: + default: Service + description: |- + Kind is the Kubernetes resource kind of the referent. + + Required if the referent is ambiguous, e.g. service with multiple ports. + + Defaults to "Service" when not specified. + + ExternalName services can refer to CNAME DNS records that may live + outside of the cluster and as such are difficult to reason about in + terms of conformance. They also may not be safe to forward to (see + CVE-2021-25740 for more information). Implementations MUST NOT + support ExternalName Services. + maxLength: 63 + minLength: 1 + pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ + type: string + name: + description: Name is the name of the referent API object. + maxLength: 253 + minLength: 1 + type: string + port: + description: |- + Port is the port of the Endpoint Picker extension service. + + Port is required when the referent is a Kubernetes Service. In this + case, the port number is the service port number, not the target port. + For other resources, destination port might be derived from the referent + resource or this field. + properties: + number: + description: |- + Number defines the port number to access the selected model server Pods. + The number must be in the range 1 to 65535. + format: int32 + maximum: 65535 + minimum: 1 + type: integer + required: + - number + type: object + required: + - name + type: object + x-kubernetes-validations: + - message: port is required when kind is 'Service' or unspecified + (defaults to 'Service') + rule: self.kind != 'Service' || has(self.port) + selector: + description: |- + Selector determines which Pods are members of this inference pool. + It matches Pods by their labels only within the same namespace; cross-namespace + selection is not supported. + + The structure of this LabelSelector is intentionally simple to be compatible + with Kubernetes Service selectors, as some implementations may translate + this configuration into a Service resource. + properties: + matchLabels: + additionalProperties: + description: |- + LabelValue is the value of a label. This is used for validation + of maps. This matches the Kubernetes label validation rules: + * must be 63 characters or less (can be empty), + * unless empty, must begin and end with an alphanumeric character ([a-z0-9A-Z]), + * could contain dashes (-), underscores (_), dots (.), and alphanumerics between. + + Valid values include: + + * MyValue + * my.name + * 123-my-value + maxLength: 63 + minLength: 0 + pattern: ^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$ + type: string + description: |- + MatchLabels contains a set of required {key,value} pairs. + An object must match every label in this map to be selected. + The matching logic is an AND operation on all entries. + type: object + required: + - matchLabels + type: object + targetPorts: + description: |- + TargetPorts defines a list of ports that are exposed by this InferencePool. + Currently, the list may only include a single port definition. + items: + description: Port defines the network port that will be exposed + by this InferencePool. + properties: + number: + description: |- + Number defines the port number to access the selected model server Pods. + The number must be in the range 1 to 65535. + format: int32 + maximum: 65535 + minimum: 1 + type: integer + required: + - number + type: object + maxItems: 1 + minItems: 1 + type: array + x-kubernetes-list-type: atomic + required: + - endpointPickerRef + - selector + - targetPorts + type: object + status: + description: Status defines the observed state of the InferencePool. + properties: + parents: + description: |- + Parents is a list of parent resources, typically Gateways, that are associated with + the InferencePool, and the status of the InferencePool with respect to each parent. + + A controller that manages the InferencePool, must add an entry for each parent it manages + and remove the parent entry when the controller no longer considers the InferencePool to + be associated with that parent. + + A maximum of 32 parents will be represented in this list. When the list is empty, + it indicates that the InferencePool is not associated with any parents. + items: + description: ParentStatus defines the observed state of InferencePool + from a Parent, i.e. Gateway. + properties: + conditions: + description: |- + Conditions is a list of status conditions that provide information about the observed + state of the InferencePool. This field is required to be set by the controller that + manages the InferencePool. + + Supported condition types are: + + * "Accepted" + * "ResolvedRefs" + items: + description: Condition contains details for one aspect of + the current state of this API Resource. + properties: + lastTransitionTime: + description: |- + lastTransitionTime is the last time the condition transitioned from one status to another. + This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + format: date-time + type: string + message: + description: |- + message is a human readable message indicating details about the transition. + This may be an empty string. + maxLength: 32768 + type: string + observedGeneration: + description: |- + observedGeneration represents the .metadata.generation that the condition was set based upon. + For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date + with respect to the current state of the instance. + format: int64 + minimum: 0 + type: integer + reason: + description: |- + reason contains a programmatic identifier indicating the reason for the condition's last transition. + Producers of specific condition types may define expected values and meanings for this field, + and whether the values are considered a guaranteed API. + The value should be a CamelCase string. + This field may not be empty. + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + type: string + status: + description: status of the condition, one of True, False, + Unknown. + enum: + - "True" + - "False" + - Unknown + type: string + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + type: string + required: + - lastTransitionTime + - message + - reason + - status + - type + type: object + maxItems: 8 + type: array + x-kubernetes-list-map-keys: + - type + x-kubernetes-list-type: map + parentRef: + description: |- + ParentRef is used to identify the parent resource that this status + is associated with. It is used to match the InferencePool with the parent + resource, such as a Gateway. + properties: + group: + default: gateway.networking.k8s.io + description: |- + Group is the group of the referent API object. When unspecified, the referent is assumed + to be in the "gateway.networking.k8s.io" API group. + maxLength: 253 + minLength: 0 + pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + kind: + default: Gateway + description: |- + Kind is the kind of the referent API object. When unspecified, the referent is assumed + to be a "Gateway" kind. + maxLength: 63 + minLength: 1 + pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ + type: string + name: + description: Name is the name of the referent API object. + maxLength: 253 + minLength: 1 + type: string + namespace: + description: |- + Namespace is the namespace of the referenced object. When unspecified, the local + namespace is inferred. + + Note that when a namespace different than the local namespace is specified, + a ReferenceGrant object is required in the referent namespace to allow that + namespace's owner to accept the reference. See the ReferenceGrant + documentation for details: https://gateway-api.sigs.k8s.io/api-types/referencegrant/ + maxLength: 63 + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ + type: string + required: + - name + type: object + required: + - parentRef + type: object + maxItems: 32 + type: array + x-kubernetes-list-type: atomic + type: object + required: + - spec + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: null + storedVersions: null diff --git a/test/crds/gie-v1alpha2.yaml b/test/crds/gie-v1alpha2.yaml new file mode 100644 index 00000000000..403dd64d1d5 --- /dev/null +++ b/test/crds/gie-v1alpha2.yaml @@ -0,0 +1,549 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + api-approved.kubernetes.io: unapproved, experimental-only + inference.networking.k8s.io/bundle-version: main-dev + name: inferencepools.inference.networking.x-k8s.io +spec: + group: inference.networking.x-k8s.io + names: + kind: InferencePool + listKind: InferencePoolList + plural: inferencepools + shortNames: + - xinfpool + singular: inferencepool + scope: Namespaced + versions: + - name: v1alpha2 + schema: + openAPIV3Schema: + description: InferencePool is the Schema for the InferencePools API. + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: InferencePoolSpec defines the desired state of InferencePool + properties: + extensionRef: + description: Extension configures an endpoint picker as an extension + service. + properties: + failureMode: + default: FailClose + description: |- + Configures how the gateway handles the case when the extension is not responsive. + Defaults to failClose. + enum: + - FailOpen + - FailClose + type: string + group: + default: "" + description: |- + Group is the group of the referent. + The default value is "", representing the Core API group. + maxLength: 253 + pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + kind: + default: Service + description: |- + Kind is the Kubernetes resource kind of the referent. + + Defaults to "Service" when not specified. + + ExternalName services can refer to CNAME DNS records that may live + outside of the cluster and as such are difficult to reason about in + terms of conformance. They also may not be safe to forward to (see + CVE-2021-25740 for more information). Implementations MUST NOT + support ExternalName Services. + maxLength: 63 + minLength: 1 + pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ + type: string + name: + description: Name is the name of the referent. + maxLength: 253 + minLength: 1 + type: string + portNumber: + description: |- + The port number on the service running the extension. When unspecified, + implementations SHOULD infer a default value of 9002 when the Kind is + Service. + format: int32 + maximum: 65535 + minimum: 1 + type: integer + required: + - name + type: object + selector: + additionalProperties: + description: |- + LabelValue is the value of a label. This is used for validation + of maps. This matches the Kubernetes label validation rules: + * must be 63 characters or less (can be empty), + * unless empty, must begin and end with an alphanumeric character ([a-z0-9A-Z]), + * could contain dashes (-), underscores (_), dots (.), and alphanumerics between. + + Valid values include: + + * MyValue + * my.name + * 123-my-value + maxLength: 63 + minLength: 0 + pattern: ^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$ + type: string + description: |- + Selector defines a map of labels to watch model server Pods + that should be included in the InferencePool. + In some cases, implementations may translate this field to a Service selector, so this matches the simple + map used for Service selectors instead of the full Kubernetes LabelSelector type. + If specified, it will be applied to match the model server pods in the same namespace as the InferencePool. + Cross namesoace selector is not supported. + type: object + targetPortNumber: + description: |- + TargetPortNumber defines the port number to access the selected model server Pods. + The number must be in the range 1 to 65535. + format: int32 + maximum: 65535 + minimum: 1 + type: integer + required: + - extensionRef + - selector + - targetPortNumber + type: object + status: + default: + parent: + - conditions: + - lastTransitionTime: "1970-01-01T00:00:00Z" + message: Waiting for controller + reason: Pending + status: Unknown + type: Accepted + parentRef: + kind: Status + name: default + description: Status defines the observed state of InferencePool. + properties: + parent: + description: |- + Parents is a list of parent resources (usually Gateways) that are + associated with the InferencePool, and the status of the InferencePool with respect to + each parent. + + A maximum of 32 Gateways will be represented in this list. When the list contains + `kind: Status, name: default`, it indicates that the InferencePool is not + associated with any Gateway and a controller must perform the following: + + - Remove the parent when setting the "Accepted" condition. + - Add the parent when the controller will no longer manage the InferencePool + and no other parents exist. + items: + description: PoolStatus defines the observed state of InferencePool + from a Gateway. + properties: + conditions: + default: + - lastTransitionTime: "1970-01-01T00:00:00Z" + message: Waiting for controller + reason: Pending + status: Unknown + type: Accepted + description: |- + Conditions track the state of the InferencePool. + + Known condition types are: + + * "Accepted" + * "ResolvedRefs" + items: + description: Condition contains details for one aspect of + the current state of this API Resource. + properties: + lastTransitionTime: + description: |- + lastTransitionTime is the last time the condition transitioned from one status to another. + This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + format: date-time + type: string + message: + description: |- + message is a human readable message indicating details about the transition. + This may be an empty string. + maxLength: 32768 + type: string + observedGeneration: + description: |- + observedGeneration represents the .metadata.generation that the condition was set based upon. + For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date + with respect to the current state of the instance. + format: int64 + minimum: 0 + type: integer + reason: + description: |- + reason contains a programmatic identifier indicating the reason for the condition's last transition. + Producers of specific condition types may define expected values and meanings for this field, + and whether the values are considered a guaranteed API. + The value should be a CamelCase string. + This field may not be empty. + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + type: string + status: + description: status of the condition, one of True, False, + Unknown. + enum: + - "True" + - "False" + - Unknown + type: string + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + type: string + required: + - lastTransitionTime + - message + - reason + - status + - type + type: object + maxItems: 8 + type: array + x-kubernetes-list-map-keys: + - type + x-kubernetes-list-type: map + parentRef: + description: GatewayRef indicates the gateway that observed + state of InferencePool. + properties: + group: + default: gateway.networking.k8s.io + description: Group is the group of the referent. + maxLength: 253 + pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + kind: + default: Gateway + description: Kind is kind of the referent. For example "Gateway". + maxLength: 63 + minLength: 1 + pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ + type: string + name: + description: Name is the name of the referent. + maxLength: 253 + minLength: 1 + type: string + namespace: + description: |- + Namespace is the namespace of the referent. If not present, + the namespace of the referent is assumed to be the same as + the namespace of the referring object. + maxLength: 63 + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ + type: string + required: + - name + type: object + required: + - parentRef + type: object + maxItems: 32 + type: array + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: null + storedVersions: null +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.16.1 + name: inferencemodels.inference.networking.x-k8s.io +spec: + group: inference.networking.x-k8s.io + names: + kind: InferenceModel + listKind: InferenceModelList + plural: inferencemodels + singular: inferencemodel + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .spec.modelName + name: Model Name + type: string + - jsonPath: .spec.poolRef.name + name: Inference Pool + type: string + - jsonPath: .spec.criticality + name: Criticality + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha2 + schema: + openAPIV3Schema: + description: InferenceModel is the Schema for the InferenceModels API. + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: |- + InferenceModelSpec represents the desired state of a specific model use case. This resource is + managed by the "Inference Workload Owner" persona. + + The Inference Workload Owner persona is someone that trains, verifies, and + leverages a large language model from a model frontend, drives the lifecycle + and rollout of new versions of those models, and defines the specific + performance and latency goals for the model. These workloads are + expected to operate within an InferencePool sharing compute capacity with other + InferenceModels, defined by the Inference Platform Admin. + + InferenceModel's modelName (not the ObjectMeta name) is unique for a given InferencePool, + if the name is reused, an error will be shown on the status of a + InferenceModel that attempted to reuse. The oldest InferenceModel, based on + creation timestamp, will be selected to remain valid. In the event of a race + condition, one will be selected at random. + properties: + criticality: + description: |- + Criticality defines how important it is to serve the model compared to other models referencing the same pool. + Criticality impacts how traffic is handled in resource constrained situations. It handles this by + queuing or rejecting requests of lower criticality. InferenceModels of an equivalent Criticality will + fairly share resources over throughput of tokens. In the future, the metric used to calculate fairness, + and the proportionality of fairness will be configurable. + + Default values for this field will not be set, to allow for future additions of new field that may 'one of' with this field. + Any implementations that may consume this field may treat an unset value as the 'Standard' range. + enum: + - Critical + - Standard + - Sheddable + type: string + modelName: + description: |- + ModelName is the name of the model as it will be set in the "model" parameter for an incoming request. + ModelNames must be unique for a referencing InferencePool + (names can be reused for a different pool in the same cluster). + The modelName with the oldest creation timestamp is retained, and the incoming + InferenceModel's Ready status is set to false with a corresponding reason. + In the rare case of a race condition, one Model will be selected randomly to be considered valid, and the other rejected. + Names can be reserved without an underlying model configured in the pool. + This can be done by specifying a target model and setting the weight to zero, + an error will be returned specifying that no valid target model is found. + maxLength: 256 + type: string + x-kubernetes-validations: + - message: modelName is immutable + rule: self == oldSelf + poolRef: + description: PoolRef is a reference to the inference pool, the pool + must exist in the same namespace. + properties: + group: + default: inference.networking.x-k8s.io + description: Group is the group of the referent. + maxLength: 253 + pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + kind: + default: InferencePool + description: Kind is kind of the referent. For example "InferencePool". + maxLength: 63 + minLength: 1 + pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ + type: string + name: + description: Name is the name of the referent. + maxLength: 253 + minLength: 1 + type: string + required: + - name + type: object + targetModels: + description: |- + TargetModels allow multiple versions of a model for traffic splitting. + If not specified, the target model name is defaulted to the modelName parameter. + modelName is often in reference to a LoRA adapter. + items: + description: |- + TargetModel represents a deployed model or a LoRA adapter. The + Name field is expected to match the name of the LoRA adapter + (or base model) as it is registered within the model server. Inference + Gateway assumes that the model exists on the model server and it's the + responsibility of the user to validate a correct match. Should a model fail + to exist at request time, the error is processed by the Inference Gateway + and emitted on the appropriate InferenceModel object. + properties: + name: + description: Name is the name of the adapter or base model, + as expected by the ModelServer. + maxLength: 253 + type: string + weight: + description: |- + Weight is used to determine the proportion of traffic that should be + sent to this model when multiple target models are specified. + + Weight defines the proportion of requests forwarded to the specified + model. This is computed as weight/(sum of all weights in this + TargetModels list). For non-zero values, there may be some epsilon from + the exact proportion defined here depending on the precision an + implementation supports. Weight is not a percentage and the sum of + weights does not need to equal 100. + + If a weight is set for any targetModel, it must be set for all targetModels. + Conversely weights are optional, so long as ALL targetModels do not specify a weight. + format: int32 + maximum: 1000000 + minimum: 1 + type: integer + required: + - name + type: object + maxItems: 10 + type: array + x-kubernetes-validations: + - message: Weights should be set for all models, or none of the models. + rule: self.all(model, has(model.weight)) || self.all(model, !has(model.weight)) + required: + - modelName + - poolRef + type: object + status: + description: InferenceModelStatus defines the observed state of InferenceModel + properties: + conditions: + default: + - lastTransitionTime: "1970-01-01T00:00:00Z" + message: Waiting for controller + reason: Pending + status: Unknown + type: Ready + description: |- + Conditions track the state of the InferenceModel. + + Known condition types are: + + * "Accepted" + items: + description: Condition contains details for one aspect of the current + state of this API Resource. + properties: + lastTransitionTime: + description: |- + lastTransitionTime is the last time the condition transitioned from one status to another. + This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + format: date-time + type: string + message: + description: |- + message is a human readable message indicating details about the transition. + This may be an empty string. + maxLength: 32768 + type: string + observedGeneration: + description: |- + observedGeneration represents the .metadata.generation that the condition was set based upon. + For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date + with respect to the current state of the instance. + format: int64 + minimum: 0 + type: integer + reason: + description: |- + reason contains a programmatic identifier indicating the reason for the condition's last transition. + Producers of specific condition types may define expected values and meanings for this field, + and whether the values are considered a guaranteed API. + The value should be a CamelCase string. + This field may not be empty. + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + type: string + status: + description: status of the condition, one of True, False, Unknown. + enum: + - "True" + - "False" + - Unknown + type: string + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + type: string + required: + - lastTransitionTime + - message + - reason + - status + - type + type: object + maxItems: 8 + type: array + x-kubernetes-list-map-keys: + - type + x-kubernetes-list-type: map + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- diff --git a/test/crds/gie.yaml b/test/crds/gie.yaml deleted file mode 100644 index 6dc370e8953..00000000000 --- a/test/crds/gie.yaml +++ /dev/null @@ -1,551 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.16.1 - name: inferencemodels.inference.networking.x-k8s.io -spec: - group: inference.networking.x-k8s.io - names: - kind: InferenceModel - listKind: InferenceModelList - plural: inferencemodels - singular: inferencemodel - scope: Namespaced - versions: - - additionalPrinterColumns: - - jsonPath: .spec.modelName - name: Model Name - type: string - - jsonPath: .spec.poolRef.name - name: Inference Pool - type: string - - jsonPath: .spec.criticality - name: Criticality - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha2 - schema: - openAPIV3Schema: - description: InferenceModel is the Schema for the InferenceModels API. - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - description: |- - InferenceModelSpec represents the desired state of a specific model use case. This resource is - managed by the "Inference Workload Owner" persona. - - The Inference Workload Owner persona is someone that trains, verifies, and - leverages a large language model from a model frontend, drives the lifecycle - and rollout of new versions of those models, and defines the specific - performance and latency goals for the model. These workloads are - expected to operate within an InferencePool sharing compute capacity with other - InferenceModels, defined by the Inference Platform Admin. - - InferenceModel's modelName (not the ObjectMeta name) is unique for a given InferencePool, - if the name is reused, an error will be shown on the status of a - InferenceModel that attempted to reuse. The oldest InferenceModel, based on - creation timestamp, will be selected to remain valid. In the event of a race - condition, one will be selected at random. - properties: - criticality: - description: |- - Criticality defines how important it is to serve the model compared to other models referencing the same pool. - Criticality impacts how traffic is handled in resource constrained situations. It handles this by - queuing or rejecting requests of lower criticality. InferenceModels of an equivalent Criticality will - fairly share resources over throughput of tokens. In the future, the metric used to calculate fairness, - and the proportionality of fairness will be configurable. - - Default values for this field will not be set, to allow for future additions of new field that may 'one of' with this field. - Any implementations that may consume this field may treat an unset value as the 'Standard' range. - enum: - - Critical - - Standard - - Sheddable - type: string - modelName: - description: |- - ModelName is the name of the model as it will be set in the "model" parameter for an incoming request. - ModelNames must be unique for a referencing InferencePool - (names can be reused for a different pool in the same cluster). - The modelName with the oldest creation timestamp is retained, and the incoming - InferenceModel's Ready status is set to false with a corresponding reason. - In the rare case of a race condition, one Model will be selected randomly to be considered valid, and the other rejected. - Names can be reserved without an underlying model configured in the pool. - This can be done by specifying a target model and setting the weight to zero, - an error will be returned specifying that no valid target model is found. - maxLength: 256 - type: string - x-kubernetes-validations: - - message: modelName is immutable - rule: self == oldSelf - poolRef: - description: PoolRef is a reference to the inference pool, the pool - must exist in the same namespace. - properties: - group: - default: inference.networking.x-k8s.io - description: Group is the group of the referent. - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - default: InferencePool - description: Kind is kind of the referent. For example "InferencePool". - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: Name is the name of the referent. - maxLength: 253 - minLength: 1 - type: string - required: - - name - type: object - targetModels: - description: |- - TargetModels allow multiple versions of a model for traffic splitting. - If not specified, the target model name is defaulted to the modelName parameter. - modelName is often in reference to a LoRA adapter. - items: - description: |- - TargetModel represents a deployed model or a LoRA adapter. The - Name field is expected to match the name of the LoRA adapter - (or base model) as it is registered within the model server. Inference - Gateway assumes that the model exists on the model server and it's the - responsibility of the user to validate a correct match. Should a model fail - to exist at request time, the error is processed by the Inference Gateway - and emitted on the appropriate InferenceModel object. - properties: - name: - description: Name is the name of the adapter or base model, - as expected by the ModelServer. - maxLength: 253 - type: string - weight: - description: |- - Weight is used to determine the proportion of traffic that should be - sent to this model when multiple target models are specified. - - Weight defines the proportion of requests forwarded to the specified - model. This is computed as weight/(sum of all weights in this - TargetModels list). For non-zero values, there may be some epsilon from - the exact proportion defined here depending on the precision an - implementation supports. Weight is not a percentage and the sum of - weights does not need to equal 100. - - If a weight is set for any targetModel, it must be set for all targetModels. - Conversely weights are optional, so long as ALL targetModels do not specify a weight. - format: int32 - maximum: 1000000 - minimum: 1 - type: integer - required: - - name - type: object - maxItems: 10 - type: array - x-kubernetes-validations: - - message: Weights should be set for all models, or none of the models. - rule: self.all(model, has(model.weight)) || self.all(model, !has(model.weight)) - required: - - modelName - - poolRef - type: object - status: - description: InferenceModelStatus defines the observed state of InferenceModel - properties: - conditions: - default: - - lastTransitionTime: "1970-01-01T00:00:00Z" - message: Waiting for controller - reason: Pending - status: Unknown - type: Ready - description: |- - Conditions track the state of the InferenceModel. - - Known condition types are: - - * "Accepted" - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 8 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.16.1 - name: inferencepools.inference.networking.x-k8s.io -spec: - group: inference.networking.x-k8s.io - names: - kind: InferencePool - listKind: InferencePoolList - plural: inferencepools - singular: inferencepool - scope: Namespaced - versions: - - name: v1alpha2 - schema: - openAPIV3Schema: - description: InferencePool is the Schema for the InferencePools API. - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - description: InferencePoolSpec defines the desired state of InferencePool - properties: - extensionRef: - description: Extension configures an endpoint picker as an extension - service. - properties: - failureMode: - default: FailClose - description: |- - Configures how the gateway handles the case when the extension is not responsive. - Defaults to failClose. - enum: - - FailOpen - - FailClose - type: string - group: - default: "" - description: |- - Group is the group of the referent. - The default value is "", representing the Core API group. - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - default: Service - description: |- - Kind is the Kubernetes resource kind of the referent. For example - "Service". - - Defaults to "Service" when not specified. - - ExternalName services can refer to CNAME DNS records that may live - outside of the cluster and as such are difficult to reason about in - terms of conformance. They also may not be safe to forward to (see - CVE-2021-25740 for more information). Implementations MUST NOT - support ExternalName Services. - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: Name is the name of the referent. - maxLength: 253 - minLength: 1 - type: string - portNumber: - description: |- - The port number on the service running the extension. When unspecified, - implementations SHOULD infer a default value of 9002 when the Kind is - Service. - format: int32 - maximum: 65535 - minimum: 1 - type: integer - required: - - name - type: object - selector: - additionalProperties: - description: |- - LabelValue is the value of a label. This is used for validation - of maps. This matches the Kubernetes label validation rules: - * must be 63 characters or less (can be empty), - * unless empty, must begin and end with an alphanumeric character ([a-z0-9A-Z]), - * could contain dashes (-), underscores (_), dots (.), and alphanumerics between. - - Valid values include: - - * MyValue - * my.name - * 123-my-value - maxLength: 63 - minLength: 0 - pattern: ^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$ - type: string - description: |- - Selector defines a map of labels to watch model server pods - that should be included in the InferencePool. - In some cases, implementations may translate this field to a Service selector, so this matches the simple - map used for Service selectors instead of the full Kubernetes LabelSelector type. - If sepecified, it will be applied to match the model server pods in the same namespace as the InferencePool. - Cross namesoace selector is not supported. - type: object - targetPortNumber: - description: |- - TargetPortNumber defines the port number to access the selected model servers. - The number must be in the range 1 to 65535. - format: int32 - maximum: 65535 - minimum: 1 - type: integer - required: - - extensionRef - - selector - - targetPortNumber - type: object - status: - default: - parent: - - conditions: - - lastTransitionTime: "1970-01-01T00:00:00Z" - message: Waiting for controller - reason: Pending - status: Unknown - type: Accepted - parentRef: - kind: Status - name: default - description: Status defines the observed state of InferencePool. - properties: - parent: - description: |- - Parents is a list of parent resources (usually Gateways) that are - associated with the InferencePool, and the status of the InferencePool with respect to - each parent. - - A maximum of 32 Gateways will be represented in this list. When the list contains - `kind: Status, name: default`, it indicates that the InferencePool is not - associated with any Gateway and a controller must perform the following: - - - Remove the parent when setting the "Accepted" condition. - - Add the parent when the controller will no longer manage the InferencePool - and no other parents exist. - items: - description: PoolStatus defines the observed state of InferencePool - from a Gateway. - properties: - conditions: - default: - - lastTransitionTime: "1970-01-01T00:00:00Z" - message: Waiting for controller - reason: Pending - status: Unknown - type: Accepted - description: |- - Conditions track the state of the InferencePool. - - Known condition types are: - - * "Accepted" - * "ResolvedRefs" - items: - description: Condition contains details for one aspect of - the current state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, - Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 8 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - parentRef: - description: GatewayRef indicates the gateway that observed - state of InferencePool. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: |- - If referring to a piece of an object instead of an entire object, this string - should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within a pod, this would take on a value like: - "spec.containers{name}" (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" (container with - index 2 in this pod). This syntax is chosen only to have some well-defined way of - referencing a part of an object. - type: string - kind: - description: |- - Kind of the referent. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - name: - description: |- - Name of the referent. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - type: string - namespace: - description: |- - Namespace of the referent. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/ - type: string - resourceVersion: - description: |- - Specific resourceVersion to which this reference is made, if any. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency - type: string - uid: - description: |- - UID of the referent. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids - type: string - type: object - x-kubernetes-map-type: atomic - required: - - parentRef - type: object - maxItems: 32 - type: array - type: object - type: object - served: true - storage: true - subresources: - status: {} \ No newline at end of file diff --git a/test/crds/serving.kserve.io_all_crds.yaml b/test/crds/serving.kserve.io_all_crds.yaml index 41267d3b05c..940c5904438 100644 --- a/test/crds/serving.kserve.io_all_crds.yaml +++ b/test/crds/serving.kserve.io_all_crds.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: clusterservingruntimes.serving.kserve.io spec: group: serving.kserve.io @@ -515,6 +515,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -603,6 +620,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -1031,6 +1065,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -1907,6 +1964,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: @@ -2584,6 +2660,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -3012,6 +3105,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -3854,6 +3970,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: @@ -4058,7 +4193,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: clusterstoragecontainers.serving.kserve.io spec: group: serving.kserve.io @@ -4127,6 +4262,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -4555,6 +4707,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -4787,7 +4962,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: inferencegraphs.serving.kserve.io spec: group: serving.kserve.io @@ -5423,7 +5598,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: inferenceservices.serving.kserve.io spec: group: serving.kserve.io @@ -5966,6 +6141,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -6386,6 +6578,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic runtimeVersion: type: string securityContext: @@ -6829,6 +7044,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -7253,6 +7485,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -7585,6 +7840,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -8013,6 +8285,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -9133,6 +9428,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: @@ -9987,6 +10301,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -10411,6 +10742,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -10733,6 +11087,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -11155,6 +11526,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic runtimeVersion: type: string securityContext: @@ -11432,6 +11826,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -11860,6 +12271,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -12117,6 +12551,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -12539,6 +12990,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic runtimeVersion: type: string securityContext: @@ -12831,6 +13305,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -13262,6 +13753,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic runtime: type: string runtimeVersion: @@ -13538,6 +14052,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -13960,6 +14491,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic runtimeVersion: type: string securityContext: @@ -14240,6 +14794,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -14662,6 +15233,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic runtimeVersion: type: string securityContext: @@ -14929,6 +15523,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -15351,6 +15962,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic runtimeVersion: type: string securityContext: @@ -15625,6 +16259,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -16047,6 +16698,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic runtimeVersion: type: string securityContext: @@ -16493,6 +17167,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -16915,6 +17606,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic runtimeVersion: type: string securityContext: @@ -17184,6 +17898,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -17606,6 +18337,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic runtimeVersion: type: string securityContext: @@ -17953,6 +18707,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -18375,6 +19146,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic runtimeVersion: type: string securityContext: @@ -19192,6 +19986,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: @@ -19870,6 +20683,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -20298,6 +21128,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -20579,6 +21432,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -21007,6 +21877,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -21296,6 +22189,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -21724,6 +22634,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -22802,6 +23735,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: @@ -23034,6 +23986,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -23456,6 +24425,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic runtimeVersion: type: string securityContext: @@ -24346,6 +25338,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -24770,6 +25779,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -25102,6 +26134,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -25530,6 +26579,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -26650,6 +27722,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: @@ -27018,7 +28109,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: llminferenceserviceconfigs.serving.kserve.io spec: group: serving.kserve.io @@ -27053,10 +28144,6 @@ spec: model: properties: criticality: - enum: - - Critical - - Standard - - Sheddable type: string lora: properties: @@ -27619,6 +28706,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -28047,6 +29151,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -28331,6 +29458,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -28759,6 +29903,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -29000,6 +30167,8 @@ spec: type: boolean hostname: type: string + hostnameOverride: + type: string imagePullSecrets: items: properties: @@ -29057,6 +30226,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -29485,6 +30671,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -30564,6 +31773,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: @@ -31246,6 +32474,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -31674,6 +32919,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -31958,6 +33226,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -32386,6 +33671,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -32627,6 +33935,8 @@ spec: type: boolean hostname: type: string + hostnameOverride: + type: string imagePullSecrets: items: properties: @@ -32684,6 +33994,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -33112,6 +34439,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -34191,6 +35541,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: @@ -34446,6 +35815,7 @@ spec: type: string maxItems: 16 type: array + x-kubernetes-list-type: atomic parentRefs: items: properties: @@ -34483,6 +35853,7 @@ spec: type: object maxItems: 32 type: array + x-kubernetes-list-type: atomic rules: default: - matches: @@ -34497,6 +35868,72 @@ spec: filters: items: properties: + cors: + properties: + allowCredentials: + type: boolean + allowHeaders: + items: + maxLength: 256 + minLength: 1 + pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + allowMethods: + items: + enum: + - GET + - HEAD + - POST + - PUT + - DELETE + - CONNECT + - OPTIONS + - TRACE + - PATCH + - '*' + type: string + maxItems: 9 + type: array + x-kubernetes-list-type: set + x-kubernetes-validations: + - message: AllowMethods cannot + contain '*' alongside other + methods + rule: '!(''*'' in self && + self.size() > 1)' + allowOrigins: + items: + maxLength: 253 + minLength: 1 + pattern: (^\*$)|(^([a-zA-Z][a-zA-Z0-9+\-.]+):\/\/([^:/?#]+)(:([0-9]{1,5}))?$) + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + x-kubernetes-validations: + - message: AllowOrigins cannot + contain '*' alongside other + origins + rule: '!(''*'' in self && + self.size() > 1)' + exposeHeaders: + items: + maxLength: 256 + minLength: 1 + pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + maxAge: + default: 5 + format: int32 + minimum: 1 + type: integer + type: object extensionRef: properties: group: @@ -34517,6 +35954,103 @@ spec: - kind - name type: object + externalAuth: + properties: + backendRef: + properties: + group: + default: "" + maxLength: 253 + pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + kind: + default: Service + maxLength: 63 + minLength: 1 + pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ + type: string + name: + maxLength: 253 + minLength: 1 + type: string + namespace: + maxLength: 63 + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ + type: string + port: + format: int32 + maximum: 65535 + minimum: 1 + type: integer + required: + - name + type: object + x-kubernetes-validations: + - message: Must have port for + Service reference + rule: '(size(self.group) == + 0 && self.kind == ''Service'') + ? has(self.port) : true' + forwardBody: + properties: + maxSize: + type: integer + type: object + grpc: + properties: + allowedHeaders: + items: + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + type: object + http: + properties: + allowedHeaders: + items: + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + allowedResponseHeaders: + items: + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + path: + maxLength: 1024 + pattern: ^(?:[-A-Za-z0-9/._~!$&'()*+,;=:@]|[%][0-9a-fA-F]{2})+$ + type: string + type: object + protocol: + enum: + - HTTP + - GRPC + type: string + required: + - backendRef + - protocol + type: object + x-kubernetes-validations: + - message: grpc must be specified + when protocol is set to 'GRPC' + rule: 'self.protocol == ''GRPC'' + ? has(self.grpc) : true' + - message: protocol must be 'GRPC' + when grpc is set + rule: 'has(self.grpc) ? self.protocol + == ''GRPC'' : true' + - message: http must be specified + when protocol is set to 'HTTP' + rule: 'self.protocol == ''HTTP'' + ? has(self.http) : true' + - message: protocol must be 'HTTP' + when http is set + rule: 'has(self.http) ? self.protocol + == ''HTTP'' : true' requestHeaderModifier: properties: add: @@ -34632,6 +36166,12 @@ spec: required: - backendRef type: object + x-kubernetes-validations: + - message: Only one of percent or + fraction may be specified in + HTTPRequestMirrorFilter + rule: '!(has(self.percent) && + has(self.fraction))' requestRedirect: properties: hostname: @@ -34695,6 +36235,9 @@ spec: enum: - 301 - 302 + - 303 + - 307 + - 308 type: integer type: object responseHeaderModifier: @@ -34868,12 +36411,8 @@ spec: self.type == ''ExtensionRef'')' maxItems: 16 type: array + x-kubernetes-list-type: atomic x-kubernetes-validations: - - message: May specify either httpRouteFilterRequestRedirect - or httpRouteFilterRequestRewrite, - but not both - rule: '!(self.exists(f, f.type == ''RequestRedirect'') - && self.exists(f, f.type == ''URLRewrite''))' - message: May specify either httpRouteFilterRequestRedirect or httpRouteFilterRequestRewrite, but not both @@ -34935,9 +36474,74 @@ spec: == ''Service'') ? has(self.port) : true' maxItems: 16 type: array + x-kubernetes-list-type: atomic filters: items: properties: + cors: + properties: + allowCredentials: + type: boolean + allowHeaders: + items: + maxLength: 256 + minLength: 1 + pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + allowMethods: + items: + enum: + - GET + - HEAD + - POST + - PUT + - DELETE + - CONNECT + - OPTIONS + - TRACE + - PATCH + - '*' + type: string + maxItems: 9 + type: array + x-kubernetes-list-type: set + x-kubernetes-validations: + - message: AllowMethods cannot contain + '*' alongside other methods + rule: '!(''*'' in self && self.size() + > 1)' + allowOrigins: + items: + maxLength: 253 + minLength: 1 + pattern: (^\*$)|(^([a-zA-Z][a-zA-Z0-9+\-.]+):\/\/([^:/?#]+)(:([0-9]{1,5}))?$) + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + x-kubernetes-validations: + - message: AllowOrigins cannot contain + '*' alongside other origins + rule: '!(''*'' in self && self.size() + > 1)' + exposeHeaders: + items: + maxLength: 256 + minLength: 1 + pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + maxAge: + default: 5 + format: int32 + minimum: 1 + type: integer + type: object extensionRef: properties: group: @@ -34958,6 +36562,103 @@ spec: - kind - name type: object + externalAuth: + properties: + backendRef: + properties: + group: + default: "" + maxLength: 253 + pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + kind: + default: Service + maxLength: 63 + minLength: 1 + pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ + type: string + name: + maxLength: 253 + minLength: 1 + type: string + namespace: + maxLength: 63 + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ + type: string + port: + format: int32 + maximum: 65535 + minimum: 1 + type: integer + required: + - name + type: object + x-kubernetes-validations: + - message: Must have port for Service + reference + rule: '(size(self.group) == 0 && + self.kind == ''Service'') ? has(self.port) + : true' + forwardBody: + properties: + maxSize: + type: integer + type: object + grpc: + properties: + allowedHeaders: + items: + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + type: object + http: + properties: + allowedHeaders: + items: + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + allowedResponseHeaders: + items: + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + path: + maxLength: 1024 + pattern: ^(?:[-A-Za-z0-9/._~!$&'()*+,;=:@]|[%][0-9a-fA-F]{2})+$ + type: string + type: object + protocol: + enum: + - HTTP + - GRPC + type: string + required: + - backendRef + - protocol + type: object + x-kubernetes-validations: + - message: grpc must be specified when + protocol is set to 'GRPC' + rule: 'self.protocol == ''GRPC'' ? has(self.grpc) + : true' + - message: protocol must be 'GRPC' when + grpc is set + rule: 'has(self.grpc) ? self.protocol + == ''GRPC'' : true' + - message: http must be specified when + protocol is set to 'HTTP' + rule: 'self.protocol == ''HTTP'' ? has(self.http) + : true' + - message: protocol must be 'HTTP' when + http is set + rule: 'has(self.http) ? self.protocol + == ''HTTP'' : true' requestHeaderModifier: properties: add: @@ -35073,6 +36774,10 @@ spec: required: - backendRef type: object + x-kubernetes-validations: + - message: Only one of percent or fraction + may be specified in HTTPRequestMirrorFilter + rule: '!(has(self.percent) && has(self.fraction))' requestRedirect: properties: hostname: @@ -35134,6 +36839,9 @@ spec: enum: - 301 - 302 + - 303 + - 307 + - 308 type: integer type: object responseHeaderModifier: @@ -35276,6 +36984,7 @@ spec: == ''ExtensionRef'')' maxItems: 16 type: array + x-kubernetes-list-type: atomic x-kubernetes-validations: - message: May specify either httpRouteFilterRequestRedirect or httpRouteFilterRequestRewrite, but not @@ -35390,6 +37099,7 @@ spec: type: object maxItems: 64 type: array + x-kubernetes-list-type: atomic name: maxLength: 253 minLength: 1 @@ -35408,6 +37118,7 @@ spec: minimum: 400 type: integer type: array + x-kubernetes-list-type: atomic type: object sessionPersistence: properties: @@ -35505,6 +37216,7 @@ spec: ? false : true) : true' maxItems: 16 type: array + x-kubernetes-list-type: atomic x-kubernetes-validations: - message: While 16 rules and 64 matches per rule are allowed, the total number of matches across @@ -35526,6 +37238,11 @@ spec: : 0) + (self.size() > 14 ? self[14].matches.size() : 0) + (self.size() > 15 ? self[15].matches.size() : 0) <= 128' + useDefaultGateways: + enum: + - All + - None + type: string type: object type: object type: object @@ -35542,7 +37259,7 @@ spec: x-kubernetes-map-type: atomic spec: properties: - extensionRef: + endpointPickerRef: properties: failureMode: default: FailClose @@ -35552,43 +37269,58 @@ spec: type: string group: default: "" - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ type: string kind: default: Service - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ type: string name: - maxLength: 253 - minLength: 1 type: string - portNumber: - format: int32 - maximum: 65535 - minimum: 1 - type: integer + port: + properties: + number: + format: int32 + maximum: 65535 + minimum: 1 + type: integer + required: + - number + type: object required: - name type: object + x-kubernetes-validations: + - message: port is required when kind is 'Service' + or unspecified (defaults to 'Service') + rule: self.kind != 'Service' || has(self.port) selector: - additionalProperties: - maxLength: 63 - minLength: 0 - pattern: ^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$ - type: string + properties: + matchLabels: + additionalProperties: + type: string + maxProperties: 64 + minProperties: 1 + type: object + required: + - matchLabels type: object - targetPortNumber: - format: int32 - maximum: 65535 - minimum: 1 - type: integer + targetPorts: + items: + properties: + number: + format: int32 + maximum: 65535 + minimum: 1 + type: integer + required: + - number + type: object + maxItems: 1 + minItems: 1 + type: array required: - - extensionRef + - endpointPickerRef - selector - - targetPortNumber + - targetPorts type: object type: object template: @@ -36082,6 +37814,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -36510,6 +38259,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -36794,6 +38566,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -37222,6 +39011,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -37463,6 +39275,8 @@ spec: type: boolean hostname: type: string + hostnameOverride: + type: string imagePullSecrets: items: properties: @@ -37520,6 +39334,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -37948,6 +39779,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -39027,6 +40881,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: @@ -39711,6 +41584,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -40139,6 +42029,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -40423,6 +42336,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -40851,6 +42781,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -41092,6 +43045,8 @@ spec: type: boolean hostname: type: string + hostnameOverride: + type: string imagePullSecrets: items: properties: @@ -41149,6 +43104,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -41577,6 +43549,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -42656,6 +44651,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: @@ -43338,6 +45352,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -43766,6 +45797,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -44050,6 +46104,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -44478,6 +46549,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -44719,6 +46813,8 @@ spec: type: boolean hostname: type: string + hostnameOverride: + type: string imagePullSecrets: items: properties: @@ -44776,6 +46872,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -45204,6 +47317,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -46283,6 +48419,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: @@ -46483,7 +48638,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: llminferenceservices.serving.kserve.io spec: group: serving.kserve.io @@ -46537,10 +48692,6 @@ spec: model: properties: criticality: - enum: - - Critical - - Standard - - Sheddable type: string lora: properties: @@ -47103,6 +49254,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -47531,6 +49699,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -47815,6 +50006,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -48243,6 +50451,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -48484,6 +50715,8 @@ spec: type: boolean hostname: type: string + hostnameOverride: + type: string imagePullSecrets: items: properties: @@ -48541,6 +50774,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -48969,6 +51219,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -50048,6 +52321,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: @@ -50730,6 +53022,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -51158,6 +53467,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -51442,6 +53774,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -51870,6 +54219,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -52111,6 +54483,8 @@ spec: type: boolean hostname: type: string + hostnameOverride: + type: string imagePullSecrets: items: properties: @@ -52168,6 +54542,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -52596,6 +54987,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -53675,6 +56089,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: @@ -53930,6 +56363,7 @@ spec: type: string maxItems: 16 type: array + x-kubernetes-list-type: atomic parentRefs: items: properties: @@ -53968,6 +56402,7 @@ spec: type: object maxItems: 32 type: array + x-kubernetes-list-type: atomic rules: default: - matches: @@ -53982,6 +56417,72 @@ spec: filters: items: properties: + cors: + properties: + allowCredentials: + type: boolean + allowHeaders: + items: + maxLength: 256 + minLength: 1 + pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + allowMethods: + items: + enum: + - GET + - HEAD + - POST + - PUT + - DELETE + - CONNECT + - OPTIONS + - TRACE + - PATCH + - '*' + type: string + maxItems: 9 + type: array + x-kubernetes-list-type: set + x-kubernetes-validations: + - message: AllowMethods cannot + contain '*' alongside other + methods + rule: '!(''*'' in self && + self.size() > 1)' + allowOrigins: + items: + maxLength: 253 + minLength: 1 + pattern: (^\*$)|(^([a-zA-Z][a-zA-Z0-9+\-.]+):\/\/([^:/?#]+)(:([0-9]{1,5}))?$) + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + x-kubernetes-validations: + - message: AllowOrigins cannot + contain '*' alongside other + origins + rule: '!(''*'' in self && + self.size() > 1)' + exposeHeaders: + items: + maxLength: 256 + minLength: 1 + pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + maxAge: + default: 5 + format: int32 + minimum: 1 + type: integer + type: object extensionRef: properties: group: @@ -54002,6 +56503,103 @@ spec: - kind - name type: object + externalAuth: + properties: + backendRef: + properties: + group: + default: "" + maxLength: 253 + pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + kind: + default: Service + maxLength: 63 + minLength: 1 + pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ + type: string + name: + maxLength: 253 + minLength: 1 + type: string + namespace: + maxLength: 63 + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ + type: string + port: + format: int32 + maximum: 65535 + minimum: 1 + type: integer + required: + - name + type: object + x-kubernetes-validations: + - message: Must have port for + Service reference + rule: '(size(self.group) == + 0 && self.kind == ''Service'') + ? has(self.port) : true' + forwardBody: + properties: + maxSize: + type: integer + type: object + grpc: + properties: + allowedHeaders: + items: + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + type: object + http: + properties: + allowedHeaders: + items: + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + allowedResponseHeaders: + items: + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + path: + maxLength: 1024 + pattern: ^(?:[-A-Za-z0-9/._~!$&'()*+,;=:@]|[%][0-9a-fA-F]{2})+$ + type: string + type: object + protocol: + enum: + - HTTP + - GRPC + type: string + required: + - backendRef + - protocol + type: object + x-kubernetes-validations: + - message: grpc must be specified + when protocol is set to 'GRPC' + rule: 'self.protocol == ''GRPC'' + ? has(self.grpc) : true' + - message: protocol must be 'GRPC' + when grpc is set + rule: 'has(self.grpc) ? self.protocol + == ''GRPC'' : true' + - message: http must be specified + when protocol is set to 'HTTP' + rule: 'self.protocol == ''HTTP'' + ? has(self.http) : true' + - message: protocol must be 'HTTP' + when http is set + rule: 'has(self.http) ? self.protocol + == ''HTTP'' : true' requestHeaderModifier: properties: add: @@ -54117,6 +56715,12 @@ spec: required: - backendRef type: object + x-kubernetes-validations: + - message: Only one of percent or + fraction may be specified in + HTTPRequestMirrorFilter + rule: '!(has(self.percent) && + has(self.fraction))' requestRedirect: properties: hostname: @@ -54180,6 +56784,9 @@ spec: enum: - 301 - 302 + - 303 + - 307 + - 308 type: integer type: object responseHeaderModifier: @@ -54353,12 +56960,8 @@ spec: self.type == ''ExtensionRef'')' maxItems: 16 type: array + x-kubernetes-list-type: atomic x-kubernetes-validations: - - message: May specify either httpRouteFilterRequestRedirect - or httpRouteFilterRequestRewrite, - but not both - rule: '!(self.exists(f, f.type == ''RequestRedirect'') - && self.exists(f, f.type == ''URLRewrite''))' - message: May specify either httpRouteFilterRequestRedirect or httpRouteFilterRequestRewrite, but not both @@ -54420,9 +57023,74 @@ spec: == ''Service'') ? has(self.port) : true' maxItems: 16 type: array + x-kubernetes-list-type: atomic filters: items: properties: + cors: + properties: + allowCredentials: + type: boolean + allowHeaders: + items: + maxLength: 256 + minLength: 1 + pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + allowMethods: + items: + enum: + - GET + - HEAD + - POST + - PUT + - DELETE + - CONNECT + - OPTIONS + - TRACE + - PATCH + - '*' + type: string + maxItems: 9 + type: array + x-kubernetes-list-type: set + x-kubernetes-validations: + - message: AllowMethods cannot contain + '*' alongside other methods + rule: '!(''*'' in self && self.size() + > 1)' + allowOrigins: + items: + maxLength: 253 + minLength: 1 + pattern: (^\*$)|(^([a-zA-Z][a-zA-Z0-9+\-.]+):\/\/([^:/?#]+)(:([0-9]{1,5}))?$) + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + x-kubernetes-validations: + - message: AllowOrigins cannot contain + '*' alongside other origins + rule: '!(''*'' in self && self.size() + > 1)' + exposeHeaders: + items: + maxLength: 256 + minLength: 1 + pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + maxAge: + default: 5 + format: int32 + minimum: 1 + type: integer + type: object extensionRef: properties: group: @@ -54443,6 +57111,103 @@ spec: - kind - name type: object + externalAuth: + properties: + backendRef: + properties: + group: + default: "" + maxLength: 253 + pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + kind: + default: Service + maxLength: 63 + minLength: 1 + pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ + type: string + name: + maxLength: 253 + minLength: 1 + type: string + namespace: + maxLength: 63 + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ + type: string + port: + format: int32 + maximum: 65535 + minimum: 1 + type: integer + required: + - name + type: object + x-kubernetes-validations: + - message: Must have port for Service + reference + rule: '(size(self.group) == 0 && + self.kind == ''Service'') ? has(self.port) + : true' + forwardBody: + properties: + maxSize: + type: integer + type: object + grpc: + properties: + allowedHeaders: + items: + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + type: object + http: + properties: + allowedHeaders: + items: + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + allowedResponseHeaders: + items: + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + path: + maxLength: 1024 + pattern: ^(?:[-A-Za-z0-9/._~!$&'()*+,;=:@]|[%][0-9a-fA-F]{2})+$ + type: string + type: object + protocol: + enum: + - HTTP + - GRPC + type: string + required: + - backendRef + - protocol + type: object + x-kubernetes-validations: + - message: grpc must be specified when + protocol is set to 'GRPC' + rule: 'self.protocol == ''GRPC'' ? has(self.grpc) + : true' + - message: protocol must be 'GRPC' when + grpc is set + rule: 'has(self.grpc) ? self.protocol + == ''GRPC'' : true' + - message: http must be specified when + protocol is set to 'HTTP' + rule: 'self.protocol == ''HTTP'' ? has(self.http) + : true' + - message: protocol must be 'HTTP' when + http is set + rule: 'has(self.http) ? self.protocol + == ''HTTP'' : true' requestHeaderModifier: properties: add: @@ -54558,6 +57323,10 @@ spec: required: - backendRef type: object + x-kubernetes-validations: + - message: Only one of percent or fraction + may be specified in HTTPRequestMirrorFilter + rule: '!(has(self.percent) && has(self.fraction))' requestRedirect: properties: hostname: @@ -54619,6 +57388,9 @@ spec: enum: - 301 - 302 + - 303 + - 307 + - 308 type: integer type: object responseHeaderModifier: @@ -54784,6 +57556,7 @@ spec: == ''ExtensionRef'')' maxItems: 16 type: array + x-kubernetes-list-type: atomic x-kubernetes-validations: - message: May specify either httpRouteFilterRequestRedirect or httpRouteFilterRequestRewrite, but not @@ -54951,6 +57724,7 @@ spec: type: object maxItems: 64 type: array + x-kubernetes-list-type: atomic name: maxLength: 253 minLength: 1 @@ -54969,6 +57743,7 @@ spec: minimum: 400 type: integer type: array + x-kubernetes-list-type: atomic type: object sessionPersistence: properties: @@ -55066,6 +57841,7 @@ spec: ? false : true) : true' maxItems: 16 type: array + x-kubernetes-list-type: atomic x-kubernetes-validations: - message: While 16 rules and 64 matches per rule are allowed, the total number of matches across @@ -55087,6 +57863,11 @@ spec: : 0) + (self.size() > 14 ? self[14].matches.size() : 0) + (self.size() > 15 ? self[15].matches.size() : 0) <= 128' + useDefaultGateways: + enum: + - All + - None + type: string type: object type: object type: object @@ -55103,7 +57884,7 @@ spec: x-kubernetes-map-type: atomic spec: properties: - extensionRef: + endpointPickerRef: properties: failureMode: default: FailClose @@ -55113,43 +57894,58 @@ spec: type: string group: default: "" - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ type: string kind: default: Service - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ type: string name: - maxLength: 253 - minLength: 1 type: string - portNumber: - format: int32 - maximum: 65535 - minimum: 1 - type: integer + port: + properties: + number: + format: int32 + maximum: 65535 + minimum: 1 + type: integer + required: + - number + type: object required: - name type: object + x-kubernetes-validations: + - message: port is required when kind is 'Service' + or unspecified (defaults to 'Service') + rule: self.kind != 'Service' || has(self.port) selector: - additionalProperties: - maxLength: 63 - minLength: 0 - pattern: ^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$ - type: string + properties: + matchLabels: + additionalProperties: + type: string + maxProperties: 64 + minProperties: 1 + type: object + required: + - matchLabels type: object - targetPortNumber: - format: int32 - maximum: 65535 - minimum: 1 - type: integer + targetPorts: + items: + properties: + number: + format: int32 + maximum: 65535 + minimum: 1 + type: integer + required: + - number + type: object + maxItems: 1 + minItems: 1 + type: array required: - - extensionRef + - endpointPickerRef - selector - - targetPortNumber + - targetPorts type: object type: object template: @@ -55643,6 +58439,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -56071,6 +58884,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -56355,6 +59191,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -56783,6 +59636,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -57024,6 +59900,8 @@ spec: type: boolean hostname: type: string + hostnameOverride: + type: string imagePullSecrets: items: properties: @@ -57081,6 +59959,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -57509,6 +60404,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -58588,6 +61506,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: @@ -59272,6 +62209,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -59700,6 +62654,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -59984,6 +62961,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -60412,6 +63406,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -60653,6 +63670,8 @@ spec: type: boolean hostname: type: string + hostnameOverride: + type: string imagePullSecrets: items: properties: @@ -60710,6 +63729,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -61138,6 +64174,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -62217,6 +65276,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: @@ -62899,6 +65977,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -63327,6 +66422,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -63611,6 +66729,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -64039,6 +67174,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -64280,6 +67438,8 @@ spec: type: boolean hostname: type: string + hostnameOverride: + type: string imagePullSecrets: items: properties: @@ -64337,6 +67497,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -64765,6 +67942,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -65844,6 +69044,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: @@ -66102,7 +69321,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: localmodelcaches.serving.kserve.io spec: group: serving.kserve.io @@ -66188,7 +69407,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: localmodelnodegroups.serving.kserve.io spec: group: serving.kserve.io @@ -66880,7 +70099,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: localmodelnodes.serving.kserve.io spec: group: serving.kserve.io @@ -66941,7 +70160,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: servingruntimes.serving.kserve.io spec: group: serving.kserve.io @@ -67454,6 +70673,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -67542,6 +70778,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -67970,6 +71223,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -68846,6 +72122,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: @@ -69523,6 +72818,23 @@ spec: - fieldPath type: object x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -69951,6 +73263,29 @@ spec: type: object restartPolicy: type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic securityContext: properties: allowPrivilegeEscalation: @@ -70793,6 +74128,25 @@ spec: type: array x-kubernetes-list-type: atomic type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + required: + - keyType + - signerName + type: object secret: properties: items: @@ -70997,7 +74351,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.2 + controller-gen.kubebuilder.io/version: v0.17.2 name: trainedmodels.serving.kserve.io spec: group: serving.kserve.io diff --git a/test/e2e/llmisvc/conftest.py b/test/e2e/llmisvc/conftest.py index a3c29132902..a671a562881 100644 --- a/test/e2e/llmisvc/conftest.py +++ b/test/e2e/llmisvc/conftest.py @@ -13,6 +13,7 @@ # limitations under the License. import pytest +from kubernetes import client # This hook is used to ensure that the test names are unique and to ensure that @@ -43,3 +44,16 @@ def pytest_configure(config): config.addinivalue_line( "markers", "llminferenceservice: mark test as an LLM inference service test" ) + + +# RHCL (Red Hat Connectivity Link) is optional per https://github.com/opendatahub-io/kserve/pull/939 +# Auth tests require RHCL to be installed, so this fixture allows conditional test execution +@pytest.fixture(scope="session") +def rhcl_available(): + """Check if RHCL (AuthPolicy CRD) is installed in the cluster.""" + try: + api = client.ApiextensionsV1Api() + api.read_custom_resource_definition("authpolicies.kuadrant.io") + return True + except Exception: + return False diff --git a/test/e2e/llmisvc/test_llm_auth.py b/test/e2e/llmisvc/test_llm_auth.py index 8de7a128f88..5d7da867b34 100644 --- a/test/e2e/llmisvc/test_llm_auth.py +++ b/test/e2e/llmisvc/test_llm_auth.py @@ -42,6 +42,10 @@ "router": {"scheduler": {}, "route": {}, "gateway": {}}, } +# Auth tests are conditional on RHCL (Red Hat Connectivity Link) availability +# RHCL is optional per https://github.com/opendatahub-io/kserve/pull/939 +# Tests skip gracefully when RHCL is not installed in the cluster + def create_service_account_with_get_access( kserve_client: KServeClient, @@ -219,7 +223,9 @@ def cleanup_service_account( ids=generate_test_id, ) @log_execution -def test_llm_auth_enabled_requires_token(test_case: TestCase): +def test_llm_auth_enabled_requires_token(rhcl_available, test_case: TestCase): + if not rhcl_available: + pytest.skip("RHCL not installed - skipping auth test") """ Test that when auth is enabled (default): - Requests WITH valid token succeed @@ -355,7 +361,9 @@ def test_llm_auth_enabled_requires_token(test_case: TestCase): ids=generate_test_id, ) @log_execution -def test_llm_auth_invalid_token_rejected(test_case: TestCase): +def test_llm_auth_invalid_token_rejected(rhcl_available, test_case: TestCase): + if not rhcl_available: + pytest.skip("RHCL not installed - skipping auth test") """ Test that when auth is enabled: - Requests with MALFORMED tokens are rejected @@ -476,7 +484,9 @@ def test_llm_auth_invalid_token_rejected(test_case: TestCase): ids=generate_test_id, ) @log_execution -def test_llm_auth_disabled_no_token_required(test_case: TestCase): +def test_llm_auth_disabled_no_token_required(rhcl_available, test_case: TestCase): + if not rhcl_available: + pytest.skip("RHCL not installed - skipping auth test") """ Test that when auth is disabled via annotation: - Requests WITHOUT token succeed diff --git a/test/overlays/llm-istio-experimental/istiod.yaml b/test/overlays/llm-istio-experimental/istiod.yaml index ae099070c89..8f1017fc2e2 100644 --- a/test/overlays/llm-istio-experimental/istiod.yaml +++ b/test/overlays/llm-istio-experimental/istiod.yaml @@ -3003,6 +3003,8 @@ spec: divisor: "1" - name: PLATFORM value: "" + - name: ENABLE_GATEWAY_API_INFERENCE_EXTENSION + value: "true" resources: requests: cpu: 500m diff --git a/test/scripts/gh-actions/setup-deps.sh b/test/scripts/gh-actions/setup-deps.sh index 136d26d9af7..e90a97d6001 100755 --- a/test/scripts/gh-actions/setup-deps.sh +++ b/test/scripts/gh-actions/setup-deps.sh @@ -43,7 +43,7 @@ wget https://github.com/mikefarah/yq/releases/download/${YQ_VERSION}/yq_linux_am # For now, it uses helm to install istio but it will be removed once the experimental version is stable # ------------------------------------------------------------ GATEWAY_API_EXPERIMENTAL_VERSION="v1.3.0" -GATEWAY_API_EXT_VERSION="v0.5.0" +GATEWAY_API_EXT_VERSION="v1.0.0" if [[ $NETWORK_LAYER == "istio-gatewayapi" || $NETWORK_LAYER == "envoy-gatewayapi" || $NETWORK_LAYER == "istio-gatewayapi-ext" ]]; then echo "Installing Gateway CRDs ..." diff --git a/test/scripts/openshift-ci/infra/deploy.istio-exp.sh b/test/scripts/openshift-ci/infra/deploy.istio-exp.sh index d03a43e1a53..4df51afe7ff 100755 --- a/test/scripts/openshift-ci/infra/deploy.istio-exp.sh +++ b/test/scripts/openshift-ci/infra/deploy.istio-exp.sh @@ -14,6 +14,8 @@ set -euo pipefail +GATEWAY_API_EXT_VERSION="v1.0.0" + # install_upstream_istio install_upstream_istio() { local PROJECT_ROOT="$1" @@ -21,11 +23,40 @@ install_upstream_istio() { echo "⚠️ Installing upstream Istio GIE support" echo "⚠️ Temporarily until Ingress Operator provides it out of the box" + # OpenShift 4.19.9+ has Gateway API CRDs managed by Ingress Operator + # Skip Gateway API CRD installation - they're already present and protected by admission policy + echo "ℹ️ Using OpenShift-managed Gateway API CRDs (GatewayClass, Gateway, HTTPRoute, etc.)" + + # Install Gateway API Inference Extension CRDs only (InferencePool, InferenceModel, etc.) + echo "📦 Installing Gateway API Inference Extension CRDs..." + oc apply -f "https://github.com/kubernetes-sigs/gateway-api-inference-extension/releases/download/${GATEWAY_API_EXT_VERSION}/manifests.yaml" + oc create namespace istio-system >/dev/null 2>&1 || true oc create namespace openshift-ingress >/dev/null 2>&1 || true + # Install Istio with GIE support + echo "📦 Installing Istio with GIE support..." oc create -f "${PROJECT_ROOT}/test/overlays/llm-istio-experimental" -n istio-system || true + # Wait for Istio to be ready + echo "⏳ Waiting for Istio pods to be ready..." + oc wait --for=condition=Ready pods --all --timeout=240s -n istio-system || true + + # Create GatewayClass for Istio controller + echo "📦 Creating Istio GatewayClass..." + { + oc apply -f - <