diff --git a/apis/v1alpha1/register.go b/apis/v1alpha1/register.go index bacf47d737..f9970f4b4c 100644 --- a/apis/v1alpha1/register.go +++ b/apis/v1alpha1/register.go @@ -40,6 +40,8 @@ func addKnownTypes(scheme *runtime.Scheme) error { &ObservabilityPolicyList{}, &ClientSettingsPolicy{}, &ClientSettingsPolicyList{}, + &SnippetsFilter{}, + &SnippetsFilterList{}, ) // AddToGroupVersion allows the serialization of client types like ListOptions. metav1.AddToGroupVersion(scheme, SchemeGroupVersion) diff --git a/apis/v1alpha1/snippetsfilter_types.go b/apis/v1alpha1/snippetsfilter_types.go new file mode 100644 index 0000000000..c8941fb2f4 --- /dev/null +++ b/apis/v1alpha1/snippetsfilter_types.go @@ -0,0 +1,110 @@ +package v1alpha1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +genclient +// +kubebuilder:object:root=true +// +kubebuilder:storageversion +// +kubebuilder:subresource:status +// +kubebuilder:resource:categories=nginx-gateway-fabric,shortName=snippetsfilter +// +kubebuilder:printcolumn:name="Age",type=date,JSONPath=`.metadata.creationTimestamp` + +// SnippetsFilter is a filter that allows inserting NGINX configuration into the +// generated NGINX config for HTTPRoute and GRPCRoute resources. +type SnippetsFilter struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + // Spec defines the desired state of the SnippetsFilter. + Spec SnippetsFilterSpec `json:"spec"` + + // Status defines the state of the SnippetsFilter. + Status SnippetsFilterStatus `json:"status,omitempty"` +} + +// +kubebuilder:object:root=true + +// SnippetsFilterList contains a list of SnippetFilters. +type SnippetsFilterList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []SnippetsFilter `json:"items"` +} + +// SnippetsFilterSpec defines the desired state of the SnippetsFilter. +type SnippetsFilterSpec struct { + // Snippets is a list of NGINX configuration snippets. + // There can only be one snippet per context. + // Allowed contexts: main, http, http.server, http.server.location. + Snippets []Snippet `json:"snippets"` +} + +// Snippet represents an NGINX configuration snippet. +type Snippet struct { + // Context is the NGINX context to insert the snippet into. + Context NginxContext `json:"context"` + + // Value is the NGINX configuration snippet. + Value string `json:"value"` +} + +// NginxContext represents the NGINX configuration context. +// +// +kubebuilder:validation:Enum=main;http;http.server;http.server.location +type NginxContext string + +const ( + // NginxContextMain is the main context of the NGINX configuration. + NginxContextMain NginxContext = "main" + + // NginxContextHTTP is the http context of the NGINX configuration. + // https://nginx.org/en/docs/http/ngx_http_core_module.html#http + NginxContextHTTP NginxContext = "http" + + // NginxContextHTTPServer is the server context of the NGINX configuration. + // https://nginx.org/en/docs/http/ngx_http_core_module.html#server + NginxContextHTTPServer NginxContext = "http.server" + + // NginxContextHTTPServerLocation is the location context of the NGINX configuration. + // https://nginx.org/en/docs/http/ngx_http_core_module.html#location + NginxContextHTTPServerLocation NginxContext = "http.server.location" +) + +// SnippetsFilterStatus defines the state of SnippetsFilter. +type SnippetsFilterStatus struct { + // Conditions describes the state of the SnippetsFilter. + // +optional + // +listType=map + // +listMapKey=type + // +kubebuilder:validation:MaxItems=8 + Conditions []metav1.Condition `json:"conditions,omitempty"` +} + +// SnippetsFilterConditionType is a type of condition associated with SnippetsFilter. +type SnippetsFilterConditionType string + +// SnippetsFilterConditionReason is a reason for a SnippetsFilter condition type. +type SnippetsFilterConditionReason string + +const ( + // SnippetsFilterConditionTypeAccepted indicates that the SnippetsFilter is accepted. + // + // Possible reasons for this condition to be True: + // + // * Accepted + // + // Possible reasons for this condition to be False: + // + // * Invalid. + SnippetsFilterConditionTypeAccepted SnippetsFilterConditionType = "Accepted" + + // SnippetsFilterConditionReasonAccepted is used with the Accepted condition type when + // the condition is true. + SnippetsFilterConditionReasonAccepted SnippetsFilterConditionReason = "Accepted" + + // SnippetsFilterConditionTypeInvalid is used with the Accepted condition type when + // SnippetsFilter is invalid. + SnippetsFilterConditionTypeInvalid SnippetsFilterConditionType = "Invalid" +) diff --git a/apis/v1alpha1/zz_generated.deepcopy.go b/apis/v1alpha1/zz_generated.deepcopy.go index 90cdca7a41..d64caaa8c8 100644 --- a/apis/v1alpha1/zz_generated.deepcopy.go +++ b/apis/v1alpha1/zz_generated.deepcopy.go @@ -463,6 +463,122 @@ func (in *ObservabilityPolicySpec) DeepCopy() *ObservabilityPolicySpec { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Snippet) DeepCopyInto(out *Snippet) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Snippet. +func (in *Snippet) DeepCopy() *Snippet { + if in == nil { + return nil + } + out := new(Snippet) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SnippetsFilter) DeepCopyInto(out *SnippetsFilter) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SnippetsFilter. +func (in *SnippetsFilter) DeepCopy() *SnippetsFilter { + if in == nil { + return nil + } + out := new(SnippetsFilter) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *SnippetsFilter) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SnippetsFilterList) DeepCopyInto(out *SnippetsFilterList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]SnippetsFilter, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SnippetsFilterList. +func (in *SnippetsFilterList) DeepCopy() *SnippetsFilterList { + if in == nil { + return nil + } + out := new(SnippetsFilterList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *SnippetsFilterList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SnippetsFilterSpec) DeepCopyInto(out *SnippetsFilterSpec) { + *out = *in + if in.Snippets != nil { + in, out := &in.Snippets, &out.Snippets + *out = make([]Snippet, len(*in)) + copy(*out, *in) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SnippetsFilterSpec. +func (in *SnippetsFilterSpec) DeepCopy() *SnippetsFilterSpec { + if in == nil { + return nil + } + out := new(SnippetsFilterSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SnippetsFilterStatus) DeepCopyInto(out *SnippetsFilterStatus) { + *out = *in + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]v1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SnippetsFilterStatus. +func (in *SnippetsFilterStatus) DeepCopy() *SnippetsFilterStatus { + if in == nil { + return nil + } + out := new(SnippetsFilterStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *SpanAttribute) DeepCopyInto(out *SpanAttribute) { *out = *in diff --git a/config/crd/bases/gateway.nginx.org_snippetsfilters.yaml b/config/crd/bases/gateway.nginx.org_snippetsfilters.yaml new file mode 100644 index 0000000000..364989ec7f --- /dev/null +++ b/config/crd/bases/gateway.nginx.org_snippetsfilters.yaml @@ -0,0 +1,151 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.16.2 + name: snippetsfilters.gateway.nginx.org +spec: + group: gateway.nginx.org + names: + categories: + - nginx-gateway-fabric + kind: SnippetsFilter + listKind: SnippetsFilterList + plural: snippetsfilters + shortNames: + - snippetsfilter + singular: snippetsfilter + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + description: |- + SnippetsFilter is a filter that allows inserting NGINX configuration into the + generated NGINX config for HTTPRoute and GRPCRoute resources. + 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 SnippetsFilter. + properties: + snippets: + description: |- + Snippets is a list of NGINX configuration snippets. + There can only be one snippet per context. + Allowed contexts: main, http, http.server, http.server.location. + items: + description: Snippet represents an NGINX configuration snippet. + properties: + context: + description: Context is the NGINX context to insert the snippet + into. + enum: + - main + - http + - http.server + - http.server.location + type: string + value: + description: Value is the NGINX configuration snippet. + type: string + required: + - context + - value + type: object + type: array + required: + - snippets + type: object + status: + description: Status defines the state of the SnippetsFilter. + properties: + conditions: + description: Conditions describes the state of the SnippetsFilter. + 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 + required: + - spec + type: object + served: true + storage: true + subresources: + status: {} diff --git a/site/content/reference/api.md b/site/content/reference/api.md index d9dd3d2de2..ad4c7c3c67 100644 --- a/site/content/reference/api.md +++ b/site/content/reference/api.md @@ -25,6 +25,8 @@ Resource Types: NginxProxy
  • ObservabilityPolicy +
  • +SnippetsFilter
  • ClientSettingsPolicy @@ -453,6 +455,99 @@ sigs.k8s.io/gateway-api/apis/v1alpha2.PolicyStatus +

    SnippetsFilter + +

    +

    +

    SnippetsFilter is a filter that allows inserting NGINX configuration into the +generated NGINX config for HTTPRoute and GRPCRoute resources.

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FieldDescription
    +apiVersion
    +string
    + +gateway.nginx.org/v1alpha1 + +
    +kind
    +string +
    SnippetsFilter
    +metadata
    + + +Kubernetes meta/v1.ObjectMeta + + +
    +Refer to the Kubernetes API documentation for the fields of the +metadata field. +
    +spec
    + + +SnippetsFilterSpec + + +
    +

    Spec defines the desired state of the SnippetsFilter.

    +
    +
    + + + + + +
    +snippets
    + + +[]Snippet + + +
    +

    Snippets is a list of NGINX configuration snippets. +There can only be one snippet per context. +Allowed contexts: main, http, http.server, http.server.location.

    +
    +
    +status
    + + +SnippetsFilterStatus + + +
    +

    Status defines the state of the SnippetsFilter.

    +

    ClientBody

    @@ -793,6 +888,40 @@ ControllerLogLevel +

    NginxContext +(string alias)

    +

    +

    +(Appears on: +Snippet) +

    +

    +

    NginxContext represents the NGINX configuration context.

    +

    + + + + + + + + + + + + + + + + +
    ValueDescription

    "http"

    NginxContextHTTP is the http context of the NGINX configuration. +https://nginx.org/en/docs/http/ngx_http_core_module.html#http

    +

    "http.server"

    NginxContextHTTPServer is the server context of the NGINX configuration. +https://nginx.org/en/docs/http/ngx_http_core_module.html#server

    +

    "http.server.location"

    NginxContextHTTPServerLocation is the location context of the NGINX configuration. +https://nginx.org/en/docs/http/ngx_http_core_module.html#location

    +

    "main"

    NginxContextMain is the main context of the NGINX configuration.

    +

    NginxGatewayConditionReason (string alias)

    @@ -1025,6 +1154,168 @@ Support: HTTPRoute, GRPCRoute.

    or gigabytes (g). Examples: 1024, 8k, 1m.

    +

    Snippet + +

    +

    +(Appears on: +SnippetsFilterSpec) +

    +

    +

    Snippet represents an NGINX configuration snippet.

    +

    + + + + + + + + + + + + + + + + + +
    FieldDescription
    +context
    + + +NginxContext + + +
    +

    Context is the NGINX context to insert the snippet into.

    +
    +value
    + +string + +
    +

    Value is the NGINX configuration snippet.

    +
    +

    SnippetsFilterConditionReason +(string alias)

    +

    +

    +

    SnippetsFilterConditionReason is a reason for a SnippetsFilter condition type.

    +

    + + + + + + + + + + +
    ValueDescription

    "Accepted"

    SnippetsFilterConditionReasonAccepted is used with the Accepted condition type when +the condition is true.

    +
    +

    SnippetsFilterConditionType +(string alias)

    +

    +

    +

    SnippetsFilterConditionType is a type of condition associated with SnippetsFilter.

    +

    + + + + + + + + + + + + +
    ValueDescription

    "Accepted"

    SnippetsFilterConditionTypeAccepted indicates that the SnippetsFilter is accepted.

    +

    Possible reasons for this condition to be True:

    +
      +
    • Accepted
    • +
    +

    Possible reasons for this condition to be False:

    +
      +
    • Invalid.
    • +
    +

    "Invalid"

    SnippetsFilterConditionTypeInvalid is used with the Accepted condition type when +SnippetsFilter is invalid.

    +
    +

    SnippetsFilterSpec + +

    +

    +(Appears on: +SnippetsFilter) +

    +

    +

    SnippetsFilterSpec defines the desired state of the SnippetsFilter.

    +

    + + + + + + + + + + + + + +
    FieldDescription
    +snippets
    + + +[]Snippet + + +
    +

    Snippets is a list of NGINX configuration snippets. +There can only be one snippet per context. +Allowed contexts: main, http, http.server, http.server.location.

    +
    +

    SnippetsFilterStatus + +

    +

    +(Appears on: +SnippetsFilter) +

    +

    +

    SnippetsFilterStatus defines the state of SnippetsFilter.

    +

    + + + + + + + + + + + + + +
    FieldDescription
    +conditions
    + + +[]Kubernetes meta/v1.Condition + + +
    +(Optional) +

    Conditions describes the state of the SnippetsFilter.

    +

    SpanAttribute