diff --git a/charts/templates/aiven.nais.io_aivenapplications.yaml b/charts/templates/aiven.nais.io_aivenapplications.yaml index cf5efc53..560fd117 100644 --- a/charts/templates/aiven.nais.io_aivenapplications.yaml +++ b/charts/templates/aiven.nais.io_aivenapplications.yaml @@ -124,6 +124,25 @@ spec: description: SecretName is the name of the secret containing Aiven credentials type: string + valkey: + description: Valkey is a section configuring the Valkey credentials + to provision + items: + properties: + access: + description: Access level for Valkey user + enum: + - read + - write + - readwrite + - admin + type: string + instance: + description: The last part of the name used when creating the + instance (ie. valkey--) + type: string + type: object + type: array required: - secretName type: object diff --git a/config/crd/bases/aiven.io_valkeys.yaml b/config/crd/bases/aiven.io_valkeys.yaml new file mode 100644 index 00000000..99ea31ef --- /dev/null +++ b/config/crd/bases/aiven.io_valkeys.yaml @@ -0,0 +1,146 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + name: valkeys.aiven.io +spec: + group: aiven.io + names: + kind: Valkey + listKind: ValkeyList + plural: valkeys + singular: valkey + scope: Namespaced + versions: + - deprecated: true + deprecationWarning: Simplified Valkey type copied from aiven-operator, not to + be installed in clusters! + name: v1alpha1 + schema: + openAPIV3Schema: + 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: + properties: + plan: + description: Subscription plan. + maxLength: 128 + type: string + project: + description: Target project. + format: ^[a-zA-Z0-9_-]*$ + maxLength: 63 + type: string + x-kubernetes-validations: + - message: Value is immutable + rule: self == oldSelf + tags: + additionalProperties: + type: string + description: Tags are key-value pairs that allow you to categorize + services. + type: object + required: + - plan + - project + type: object + status: + properties: + conditions: + description: Conditions represent the latest available observations + of a service state + items: + description: "Condition contains details for one aspect of the current + state of this API Resource.\n---\nThis struct is intended for + direct use as an array at the field path .status.conditions. For + example,\n\n\n\ttype FooStatus struct{\n\t // Represents the + observations of a foo's current state.\n\t // Known .status.conditions.type + are: \"Available\", \"Progressing\", and \"Degraded\"\n\t // + +patchMergeKey=type\n\t // +patchStrategy=merge\n\t // +listType=map\n\t + \ // +listMapKey=type\n\t Conditions []metav1.Condition `json:\"conditions,omitempty\" + patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"`\n\n\n\t + \ // other fields\n\t}" + 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. + --- + Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be + useful (see .node.status.conditions), the ability to deconflict is important. + The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) + 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 + type: array + state: + description: Service state + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} diff --git a/config/crd/bases/aiven.nais.io_aivenapplications.yaml b/config/crd/bases/aiven.nais.io_aivenapplications.yaml index cf5efc53..560fd117 100644 --- a/config/crd/bases/aiven.nais.io_aivenapplications.yaml +++ b/config/crd/bases/aiven.nais.io_aivenapplications.yaml @@ -124,6 +124,25 @@ spec: description: SecretName is the name of the secret containing Aiven credentials type: string + valkey: + description: Valkey is a section configuring the Valkey credentials + to provision + items: + properties: + access: + description: Access level for Valkey user + enum: + - read + - write + - readwrite + - admin + type: string + instance: + description: The last part of the name used when creating the + instance (ie. valkey--) + type: string + type: object + type: array required: - secretName type: object diff --git a/pkg/apis/aiven.io/v1alpha1/valkey_types.go b/pkg/apis/aiven.io/v1alpha1/valkey_types.go new file mode 100644 index 00000000..d8c7e383 --- /dev/null +++ b/pkg/apis/aiven.io/v1alpha1/valkey_types.go @@ -0,0 +1,44 @@ +package aiven_io_v1alpha1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func init() { + SchemeBuilder.Register( + &Valkey{}, &ValkeyList{}, + ) +} + +// +kubebuilder:object:generate=true +type ValkeyStatus struct { + // Conditions represent the latest available observations of a service state + Conditions []metav1.Condition `json:"conditions,omitempty"` + + // Service state + State string `json:"state,omitempty"` +} + +// Types defined here because importing them directly from aiven-operator introduces dependency resolution hell +// Copied and simplified types as of v0.12.0 + +// +kubebuilder:object:root=true +// +kubebuilder:subresource:status +// +kubebuilder:deprecatedversion:warning="Simplified Valkey type copied from aiven-operator, not to be installed in clusters!" +type Valkey struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + Spec ValkeySpec `json:"spec,omitempty"` + Status ValkeyStatus `json:"status,omitempty"` +} + +type ValkeySpec struct { + ServiceCommonSpec `json:",inline"` +} + +// +kubebuilder:object:root=true +type ValkeyList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []Valkey `json:"items"` +} diff --git a/pkg/apis/aiven.io/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/aiven.io/v1alpha1/zz_generated.deepcopy.go index 0e5a36bf..ca7c6269 100644 --- a/pkg/apis/aiven.io/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/aiven.io/v1alpha1/zz_generated.deepcopy.go @@ -224,3 +224,100 @@ func (in *ServiceCommonSpec) DeepCopy() *ServiceCommonSpec { in.DeepCopyInto(out) return out } + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Valkey) DeepCopyInto(out *Valkey) { + *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 Valkey. +func (in *Valkey) DeepCopy() *Valkey { + if in == nil { + return nil + } + out := new(Valkey) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Valkey) 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 *ValkeyList) DeepCopyInto(out *ValkeyList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Valkey, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ValkeyList. +func (in *ValkeyList) DeepCopy() *ValkeyList { + if in == nil { + return nil + } + out := new(ValkeyList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ValkeyList) 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 *ValkeySpec) DeepCopyInto(out *ValkeySpec) { + *out = *in + in.ServiceCommonSpec.DeepCopyInto(&out.ServiceCommonSpec) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ValkeySpec. +func (in *ValkeySpec) DeepCopy() *ValkeySpec { + if in == nil { + return nil + } + out := new(ValkeySpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ValkeyStatus) DeepCopyInto(out *ValkeyStatus) { + *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 ValkeyStatus. +func (in *ValkeyStatus) DeepCopy() *ValkeyStatus { + if in == nil { + return nil + } + out := new(ValkeyStatus) + in.DeepCopyInto(out) + return out +} diff --git a/pkg/apis/aiven.nais.io/v1/aiven_application_types.go b/pkg/apis/aiven.nais.io/v1/aiven_application_types.go index a9697c70..5d63721b 100644 --- a/pkg/apis/aiven.nais.io/v1/aiven_application_types.go +++ b/pkg/apis/aiven.nais.io/v1/aiven_application_types.go @@ -57,6 +57,14 @@ type RedisSpec struct { Access string `json:"access,omitempty"` } +type ValkeySpec struct { + // The last part of the name used when creating the instance (ie. valkey--) + Instance string `json:"instance,omitempty"` + // Access level for Valkey user + // +kubebuilder:validation:Enum=read;write;readwrite;admin + Access string `json:"access,omitempty"` +} + type InfluxDBSpec struct { // Name of the InfluxDB instance (`influx-`) Instance string `json:"instance,omitempty"` @@ -78,6 +86,8 @@ type AivenApplicationSpec struct { OpenSearch *OpenSearchSpec `json:"openSearch,omitempty"` // Redis is a section configuring the Redis credentials to provision Redis []*RedisSpec `json:"redis,omitempty"` + // Valkey is a section configuring the Valkey credentials to provision + Valkey []*ValkeySpec `json:"valkey,omitempty"` // InfluxDB is a section configuring the InfluxDB credentials to provision InfluxDB *InfluxDBSpec `json:"influxDB,omitempty"` } diff --git a/pkg/apis/aiven.nais.io/v1/zz_generated.deepcopy.go b/pkg/apis/aiven.nais.io/v1/zz_generated.deepcopy.go index 782e8685..58ed08a8 100644 --- a/pkg/apis/aiven.nais.io/v1/zz_generated.deepcopy.go +++ b/pkg/apis/aiven.nais.io/v1/zz_generated.deepcopy.go @@ -127,6 +127,17 @@ func (in *AivenApplicationSpec) DeepCopyInto(out *AivenApplicationSpec) { } } } + if in.Valkey != nil { + in, out := &in.Valkey, &out.Valkey + *out = make([]*ValkeySpec, len(*in)) + for i := range *in { + if (*in)[i] != nil { + in, out := &(*in)[i], &(*out)[i] + *out = new(ValkeySpec) + **out = **in + } + } + } if in.InfluxDB != nil { in, out := &in.InfluxDB, &out.InfluxDB *out = new(InfluxDBSpec) @@ -229,3 +240,18 @@ func (in *RedisSpec) DeepCopy() *RedisSpec { in.DeepCopyInto(out) return out } + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ValkeySpec) DeepCopyInto(out *ValkeySpec) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ValkeySpec. +func (in *ValkeySpec) DeepCopy() *ValkeySpec { + if in == nil { + return nil + } + out := new(ValkeySpec) + in.DeepCopyInto(out) + return out +}