Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions api/v1alpha1/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ type ValkeySpec struct {
Binding *BindingProperties `json:"binding,omitempty"`
ExtraEnvVars []corev1.EnvVar `json:"extraEnvVars,omitempty"`
ExtraFlags []string `json:"extraFlags,omitempty"`
// Additional annotations added to the generated workload metadata.
// +optional
Annotations map[string]string `json:"annotations,omitempty"`
}

// SentinelProperties models attributes of the sentinel sidecar
Expand Down
7 changes: 7 additions & 0 deletions api/v1alpha1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions crds/cache.cs.sap.com_valkeys.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -958,6 +958,12 @@ spec:
x-kubernetes-list-type: atomic
type: object
type: object
annotations:
additionalProperties:
type: string
description: Additional annotations added to the generated workload
metadata.
type: object
binding:
description: BindingProperties models custom properties for the generated
binding secret
Expand Down
64 changes: 64 additions & 0 deletions internal/transformer/annotation_generator.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/*
SPDX-FileCopyrightText: 2026 SAP SE or an SAP affiliate company and valkey-operator contributors
SPDX-License-Identifier: Apache-2.0
*/

package transformer

import (
"context"

"github.com/sap/component-operator-runtime/pkg/manifests"
componentoperatorruntimetypes "github.com/sap/component-operator-runtime/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/client"
)

// annotationGenerator wraps a generator and merges the component's spec.annotations
// onto the metadata of every generated StatefulSet. It is applied in the operator
// (not the vendored chart) so the behaviour is independent of the chart templates.
type annotationGenerator struct {
generator manifests.Generator
}

func NewAnnotationGenerator(generator manifests.Generator) *annotationGenerator {
return &annotationGenerator{generator: generator}
}

func (g *annotationGenerator) Generate(ctx context.Context, namespace string, name string, parameters componentoperatorruntimetypes.Unstructurable) ([]client.Object, error) {
objects, err := g.generator.Generate(ctx, namespace, name, parameters)
if err != nil {
return nil, err
}
annotations := annotationsFromParameters(parameters)
if len(annotations) == 0 {
return objects, nil
}
for i := 0; i < len(objects); i++ {
if statefulSet := asStatefulSet(objects[i]); statefulSet != nil {
merged := statefulSet.GetAnnotations()
if merged == nil {
merged = make(map[string]string, len(annotations))
}
for key, value := range annotations {
merged[key] = value
}
statefulSet.SetAnnotations(merged)
objects[i] = asUnstructurable(statefulSet)
}
}
return objects, nil
}

func annotationsFromParameters(parameters componentoperatorruntimetypes.Unstructurable) map[string]string {
raw, ok := parameters.ToUnstructured()["annotations"].(map[string]any)
if !ok {
return nil
}
annotations := make(map[string]string, len(raw))
for key, value := range raw {
if s, ok := value.(string); ok {
annotations[key] = s
}
}
return annotations
}
2 changes: 1 addition & 1 deletion pkg/operator/operator.go
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ func (o *Operator) Setup(mgr ctrl.Manager) error {

if err := component.NewReconciler[*operatorv1alpha1.Valkey](
o.options.Name,
resourceGenerator,
transformer.NewAnnotationGenerator(resourceGenerator),
component.ReconcilerOptions{},
).WithPostReconcileHook(
reconcileBinding,
Expand Down