diff --git a/apix/v1/inferencepool_types.go b/apix/v1/inferencepool_types.go new file mode 100644 index 000000000..2c7b52705 --- /dev/null +++ b/apix/v1/inferencepool_types.go @@ -0,0 +1,307 @@ +/* +Copyright 2025 The Kubernetes 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 v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// InferencePool is the Schema for the InferencePools API. +// +// +kubebuilder:object:root=true +// TODO: change the annotation once it gets officially approved +// +kubebuilder:metadata:annotations="api-approved.kubernetes.io=https://github.com/kubernetes-sigs/gateway-api-inference-extension/pull/1173" +// +kubebuilder:resource:shortName=infpool +// +kubebuilder:subresource:status +// +kubebuilder:storageversion +// +genclient +type InferencePool struct { + metav1.TypeMeta `json:",inline"` + + // +optional + metav1.ObjectMeta `json:"metadata,omitempty"` + + // Spec defines the desired state of the InferencePool. + // + // +required + Spec InferencePoolSpec `json:"spec,omitzero"` + + // Status defines the observed state of the InferencePool. + // + // +optional + //nolint:kubeapilinter // status should not be a pointer. + Status InferencePoolStatus `json:"status,omitempty"` +} + +// InferencePoolList contains a list of InferencePools. +// +// +kubebuilder:object:root=true +type InferencePoolList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []InferencePool `json:"items"` +} + +// InferencePoolSpec defines the desired state of the InferencePool. +type InferencePoolSpec struct { + // 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. + // + // +required + Selector LabelSelector `json:"selector,omitzero"` + + // TargetPorts defines a list of ports that are exposed by this InferencePool. + // Currently, the list may only include a single port definition. + // + // +kubebuilder:validation:MinItems=1 + // +kubebuilder:validation:MaxItems=1 + // +listType=atomic + // +required + TargetPorts []Port `json:"targetPorts,omitempty"` + + // EndpointPickerRef is a reference to the Endpoint Picker extension and its + // associated configuration. + // + // +required + EndpointPickerRef EndpointPickerRef `json:"endpointPickerRef,omitzero"` +} + +// Port defines the network port that will be exposed by this InferencePool. +type Port struct { + // Number defines the port number to access the selected model server Pods. + // The number must be in the range 1 to 65535. + // + // +required + Number PortNumber `json:"number,omitempty"` +} + +// EndpointPickerRef specifies a reference to an Endpoint Picker extension and its +// associated configuration. +// +kubebuilder:validation:XValidation:rule="self.kind != 'Service' || has(self.port)",message="port is required when kind is 'Service' or unspecified (defaults to 'Service')" +type EndpointPickerRef struct { + // Group is the group of the referent API object. When unspecified, the default value + // is "", representing the Core API group. + // + // +optional + // +kubebuilder:default="" + Group *Group `json:"group,omitempty"` + + // 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. + // + // +optional + // +kubebuilder:default=Service + Kind Kind `json:"kind,omitempty"` + + // Name is the name of the referent API object. + // + // +required + Name ObjectName `json:"name,omitempty"` + + // 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. + // + // +optional + Port *Port `json:"port,omitempty"` + + // FailureMode configures how the parent handles the case when the Endpoint Picker extension + // is non-responsive. When unspecified, defaults to "FailClose". + // + // +optional + // +kubebuilder:default="FailClose" + FailureMode EndpointPickerFailureMode `json:"failureMode,omitempty"` +} + +// EndpointPickerFailureMode defines the options for how the parent handles the case when the +// Endpoint Picker extension is non-responsive. +// +// +kubebuilder:validation:Enum=FailOpen;FailClose +type EndpointPickerFailureMode string + +const ( + // EndpointPickerFailOpen specifies that the parent should forward the request to an endpoint + // of its picking when the Endpoint Picker extension fails. + EndpointPickerFailOpen EndpointPickerFailureMode = "FailOpen" + // EndpointPickerFailClose specifies that the parent should drop the request when the Endpoint + // Picker extension fails. + EndpointPickerFailClose EndpointPickerFailureMode = "FailClose" +) + +// InferencePoolStatus defines the observed state of the InferencePool. +type InferencePoolStatus struct { + // 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. + // + // +kubebuilder:validation:MaxItems=32 + // +optional + // +listType=atomic + Parents []ParentStatus `json:"parents,omitempty"` +} + +// ParentStatus defines the observed state of InferencePool from a Parent, i.e. Gateway. +type ParentStatus struct { + // 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" + // + // +optional + // +listType=map + // +listMapKey=type + // +kubebuilder:validation:MaxItems=8 + Conditions []metav1.Condition `json:"conditions,omitempty"` + + // 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. + // + // +required + ParentRef ParentReference `json:"parentRef,omitzero"` +} + +// InferencePoolConditionType is a type of status condition for the InferencePool. +type InferencePoolConditionType string + +// InferencePoolReason is the reason for a type of InferencePool status condition. +type InferencePoolReason string + +const ( + // InferencePoolConditionAccepted is a type of condition that indicates whether + // the InferencePool has been accepted or rejected by a Parent, and why. + // + // Possible reasons for this condition to be True are: + // + // * "SupportedByParent" + // + // Possible reasons for this condition to be False are: + // + // * "Accepted" + // * "HTTPRouteNotAccepted" + // + // Possible reasons for this condition to be Unknown are: + // + // * "Pending" + // + // Controllers MAY raise this condition with other reasons, but should + // prefer to use the reasons listed above to improve interoperability. + InferencePoolConditionAccepted InferencePoolConditionType = "Accepted" + + // InferencePoolReasonAccepted is a reason used with the "Accepted" condition + // when the InferencePool is accepted by a Parent because the Parent supports + // InferencePool as a backend. + InferencePoolReasonAccepted InferencePoolReason = "Accepted" + + // InferencePoolReasonNotSupportedByParent is a reason used with the "Accepted" + // condition when the InferencePool has not been accepted by a Parent because + // the Parent does not support InferencePool as a backend. + InferencePoolReasonNotSupportedByParent InferencePoolReason = "NotSupportedByParent" + + // InferencePoolReasonHTTPRouteNotAccepted is an optional reason used with the + // "Accepted" condition when the InferencePool is referenced by an HTTPRoute that + // has been rejected by the Parent. The user should inspect the status of the + // referring HTTPRoute for the specific reason. + InferencePoolReasonHTTPRouteNotAccepted InferencePoolReason = "HTTPRouteNotAccepted" +) + +const ( + // InferencePoolConditionResolvedRefs is a type of condition that indicates whether + // the controller was able to resolve all the object references for the InferencePool. + // + // Possible reasons for this condition to be True are: + // + // * "ResolvedRefs" + // + // Possible reasons for this condition to be False are: + // + // * "InvalidExtensionRef" + // + // Controllers MAY raise this condition with other reasons, but should + // prefer to use the reasons listed above to improve interoperability. + InferencePoolConditionResolvedRefs InferencePoolConditionType = "ResolvedRefs" + + // InferencePoolReasonResolvedRefs is a reason used with the "ResolvedRefs" + // condition when the condition is true. + InferencePoolReasonResolvedRefs InferencePoolReason = "ResolvedRefs" + + // InferencePoolReasonInvalidExtensionRef is a reason used with the "ResolvedRefs" + // condition when the Extension is invalid in some way. This can include an + // unsupported kind or API group, or a reference to a resource that cannot be found. + InferencePoolReasonInvalidExtensionRef InferencePoolReason = "InvalidExtensionRef" +) + +// ParentReference identifies an API object. It is used to associate the InferencePool with a +// parent resource, such as a Gateway. +type ParentReference struct { + // 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. + // + // +optional + // +kubebuilder:default="gateway.networking.k8s.io" + Group *Group `json:"group,omitempty"` + + // Kind is the kind of the referent API object. When unspecified, the referent is assumed + // to be a "Gateway" kind. + // + // +optional + // +kubebuilder:default=Gateway + Kind Kind `json:"kind,omitempty"` + + // Name is the name of the referent API object. + // + // +required + Name ObjectName `json:"name,omitempty"` + + // 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/ + // + // +optional + Namespace Namespace `json:"namespace,omitempty"` +} diff --git a/apix/v1/shared_types.go b/apix/v1/shared_types.go new file mode 100644 index 000000000..bc315fd4f --- /dev/null +++ b/apix/v1/shared_types.go @@ -0,0 +1,143 @@ +/* +Copyright 2025 The Kubernetes 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 v1 + +// Group refers to a Kubernetes Group. It must either be an empty string or a +// RFC 1123 subdomain. +// +// This validation is based off of the corresponding Kubernetes validation: +// https://github.com/kubernetes/apimachinery/blob/02cfb53916346d085a6c6c7c66f882e3c6b0eca6/pkg/util/validation/validation.go#L208 +// +// Valid values include: +// +// * "" - empty string implies core Kubernetes API group +// * "gateway.networking.k8s.io" +// * "foo.example.com" +// +// Invalid values include: +// +// * "example.com/bar" - "/" is an invalid character +// +// +kubebuilder:validation:MinLength=0 +// +kubebuilder:validation:MaxLength=253 +// +kubebuilder:validation:Pattern=`^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$` +type Group string + +// Kind refers to a Kubernetes Kind. +// +// Valid values include: +// +// * "Service" +// * "HTTPRoute" +// +// Invalid values include: +// +// * "invalid/kind" - "/" is an invalid character +// +// +kubebuilder:validation:MinLength=1 +// +kubebuilder:validation:MaxLength=63 +// +kubebuilder:validation:Pattern=`^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$` +type Kind string + +// ObjectName refers to the name of a Kubernetes object. +// Object names can have a variety of forms, including RFC 1123 subdomains, +// RFC 1123 labels, or RFC 1035 labels. +// +// +kubebuilder:validation:MinLength=1 +// +kubebuilder:validation:MaxLength=253 +type ObjectName string + +// Namespace refers to a Kubernetes namespace. It must be a RFC 1123 label. +// +// This validation is based off of the corresponding Kubernetes validation: +// https://github.com/kubernetes/apimachinery/blob/02cfb53916346d085a6c6c7c66f882e3c6b0eca6/pkg/util/validation/validation.go#L187 +// +// This is used for Namespace name validation here: +// https://github.com/kubernetes/apimachinery/blob/02cfb53916346d085a6c6c7c66f882e3c6b0eca6/pkg/api/validation/generic.go#L63 +// +// Valid values include: +// +// * "example" +// +// Invalid values include: +// +// * "example.com" - "." is an invalid character +// +// +kubebuilder:validation:Pattern=`^[a-z0-9]([-a-z0-9]*[a-z0-9])?$` +// +kubebuilder:validation:MinLength=1 +// +kubebuilder:validation:MaxLength=63 +type Namespace string + +// PortNumber defines a network port. +// +// +kubebuilder:validation:Minimum=1 +// +kubebuilder:validation:Maximum=65535 +type PortNumber int32 + +// LabelKey was originally copied from: https://github.com/kubernetes-sigs/gateway-api/blob/99a3934c6bc1ce0874f3a4c5f20cafd8977ffcb4/apis/v1/shared_types.go#L694-L731 +// Duplicated as to not take an unexpected dependency on gw's API. +// +// LabelKey is the key of a label. This is used for validation +// of maps. This matches the Kubernetes "qualified name" validation that is used for labels. +// Labels are case sensitive, so: my-label and My-Label are considered distinct. +// +// Valid values include: +// +// * example +// * example.com +// * example.com/path +// * example.com/path.html +// +// Invalid values include: +// +// * example~ - "~" is an invalid character +// * example.com. - can not start or end with "." +// +// +kubebuilder:validation:MinLength=1 +// +kubebuilder:validation:MaxLength=253 +// +kubebuilder:validation: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_.]{0,61})?[A-Za-z0-9]$` +type LabelKey string + +// 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 +// +// +kubebuilder:validation:MinLength=0 +// +kubebuilder:validation:MaxLength=63 +// +kubebuilder:validation:Pattern=`^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$` +type LabelValue string + +// LabelSelector defines a query for resources based on their labels. +// This simplified version uses only the matchLabels field. +type LabelSelector struct { + // 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. + // + // +required + // +kubebuilder:validation:MinItems=1 + // +kubebuilder:validation:MaxItems=64 + MatchLabels map[LabelKey]LabelValue `json:"matchLabels,omitempty"` +} diff --git a/config/crd/bases/inference.networking.k8s.io_inferencepools.yaml b/config/crd/bases/inference.networking.k8s.io_inferencepools.yaml new file mode 100644 index 000000000..5521124f2 --- /dev/null +++ b/config/crd/bases/inference.networking.k8s.io_inferencepools.yaml @@ -0,0 +1,336 @@ + +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: main-dev + 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 \ No newline at end of file