From 0e896f42e1ff913392fbbbf8f93bede51c0bb9a8 Mon Sep 17 00:00:00 2001 From: Nick Walker Date: Fri, 1 May 2026 09:41:41 +1200 Subject: [PATCH 1/5] Allow overriding operator-generated configuration with custom values --- api/v1alpha1/valkeycluster_types.go | 18 ++- api/v1alpha1/zz_generated.deepcopy.go | 22 +++- .../valkeycluster_controller_configmap.go | 28 +++-- .../valkeycluster_controller_test.go | 111 ++++++++++++++++++ test/e2e/e2e_test.go | 41 +++++++ 5 files changed, 211 insertions(+), 9 deletions(-) diff --git a/api/v1alpha1/valkeycluster_types.go b/api/v1alpha1/valkeycluster_types.go index 8921651..962b7f8 100644 --- a/api/v1alpha1/valkeycluster_types.go +++ b/api/v1alpha1/valkeycluster_types.go @@ -88,9 +88,25 @@ type ValkeyClusterSpec struct { InitialDelaySeconds int32 `json:"initialDelaySeconds,omitempty"` } +// ValkeyConfigParameter is a single valkey config directive with its value. +type ValkeyConfigParameter struct { + // Name is the valkey config directive name (e.g. "maxmemory"). + Name string `json:"name"` + // Value is the raw string that follows the directive name on the config line. + // Supports multi-argument directives (e.g. "900 1" for save) and quoted strings. + Value string `json:"value"` +} + type ValkeyConfig struct { - // Raw valkey.conf content provided as a string + // Raw valkey.conf content provided as a string. Takes precedence as the config + // base; Parameters are still appended on top if both are set. RawConfig string `json:"rawConfig,omitempty"` + + // Parameters are valkey config directives appended after the operator-generated + // config (last-wins). Multiple entries with the same name are supported + // (e.g. multiple save directives). Values here override operator-set defaults + // including requirepass/primaryauth. + Parameters []ValkeyConfigParameter `json:"parameters,omitempty"` } // ValkeyClusterStatus defines the observed state of ValkeyCluster diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go index d0f633f..53665c3 100644 --- a/api/v1alpha1/zz_generated.deepcopy.go +++ b/api/v1alpha1/zz_generated.deepcopy.go @@ -140,7 +140,7 @@ func (in *ValkeyClusterSpec) DeepCopyInto(out *ValkeyClusterSpec) { if in.ValkeyConfig != nil { in, out := &in.ValkeyConfig, &out.ValkeyConfig *out = new(ValkeyConfig) - **out = **in + (*in).DeepCopyInto(*out) } } @@ -197,6 +197,11 @@ func (in *ValkeyClusterStatus) DeepCopy() *ValkeyClusterStatus { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ValkeyConfig) DeepCopyInto(out *ValkeyConfig) { *out = *in + if in.Parameters != nil { + in, out := &in.Parameters, &out.Parameters + *out = make([]ValkeyConfigParameter, len(*in)) + copy(*out, *in) + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ValkeyConfig. @@ -208,3 +213,18 @@ func (in *ValkeyConfig) DeepCopy() *ValkeyConfig { in.DeepCopyInto(out) return out } + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ValkeyConfigParameter) DeepCopyInto(out *ValkeyConfigParameter) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ValkeyConfigParameter. +func (in *ValkeyConfigParameter) DeepCopy() *ValkeyConfigParameter { + if in == nil { + return nil + } + out := new(ValkeyConfigParameter) + in.DeepCopyInto(out) + return out +} diff --git a/internal/controller/valkeycluster_controller_configmap.go b/internal/controller/valkeycluster_controller_configmap.go index cbd0c1e..b064d9b 100644 --- a/internal/controller/valkeycluster_controller_configmap.go +++ b/internal/controller/valkeycluster_controller_configmap.go @@ -4,6 +4,7 @@ import ( "context" "crypto/sha256" "fmt" + "strings" cachev1alpha1 "github.com/halter/valkey-cluster-operator/api/v1alpha1" corev1 "k8s.io/api/core/v1" @@ -107,16 +108,29 @@ func (r *ValkeyClusterReconciler) upsertConfigMap(ctx context.Context, valkeyClu } func getValkeyConfigContent(valkeyCluster *cachev1alpha1.ValkeyCluster) (string, error) { + var base string + if valkeyCluster.Spec.ValkeyConfig != nil && valkeyCluster.Spec.ValkeyConfig.RawConfig != "" { - return valkeyCluster.Spec.ValkeyConfig.RawConfig, nil + base = valkeyCluster.Spec.ValkeyConfig.RawConfig + } else { + valkeyConf, err := scripts.ReadFile("scripts/valkey.conf") + if err != nil { + return "", err + } + base = string(valkeyConf) + if valkeyCluster.Spec.Password != "" { + base = fmt.Sprintf("%s\nrequirepass %s\nprimaryauth %s", base, valkeyCluster.Spec.Password, valkeyCluster.Spec.Password) + } } - valkeyConf, err := scripts.ReadFile("scripts/valkey.conf") - if err != nil { - return "", err + + if valkeyCluster.Spec.ValkeyConfig == nil || len(valkeyCluster.Spec.ValkeyConfig.Parameters) == 0 { + return base, nil } - if valkeyCluster.Spec.Password != "" { - valkeyConf = []byte(fmt.Sprintf("%[1]s\nrequirepass %[2]s\nprimaryauth %[2]s", string(valkeyConf), valkeyCluster.Spec.Password)) + var sb strings.Builder + sb.WriteString(base) + for _, p := range valkeyCluster.Spec.ValkeyConfig.Parameters { + sb.WriteString(fmt.Sprintf("\n%s %s", p.Name, p.Value)) } - return string(valkeyConf), nil + return sb.String(), nil } diff --git a/internal/controller/valkeycluster_controller_test.go b/internal/controller/valkeycluster_controller_test.go index 8eed883..ef4c9c9 100644 --- a/internal/controller/valkeycluster_controller_test.go +++ b/internal/controller/valkeycluster_controller_test.go @@ -18,6 +18,7 @@ package controller import ( "context" + "strings" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" @@ -31,6 +32,116 @@ import ( cachev1alpha1 "github.com/halter/valkey-cluster-operator/api/v1alpha1" ) +var _ = Describe("getValkeyConfigContent", func() { + param := func(name, value string) cachev1alpha1.ValkeyConfigParameter { + return cachev1alpha1.ValkeyConfigParameter{Name: name, Value: value} + } + cluster := func(password string, cfg *cachev1alpha1.ValkeyConfig) *cachev1alpha1.ValkeyCluster { + return &cachev1alpha1.ValkeyCluster{ + Spec: cachev1alpha1.ValkeyClusterSpec{ + Password: password, + ValkeyConfig: cfg, + }, + } + } + + It("returns base config when no ValkeyConfig is set", func() { + out, err := getValkeyConfigContent(cluster("", nil)) + Expect(err).NotTo(HaveOccurred()) + Expect(out).To(ContainSubstring("cluster-enabled yes")) + Expect(out).NotTo(ContainSubstring("maxmemory")) + }) + + It("appends a simple parameter after base config", func() { + out, err := getValkeyConfigContent(cluster("", &cachev1alpha1.ValkeyConfig{ + Parameters: []cachev1alpha1.ValkeyConfigParameter{param("maxmemory", "100mb")}, + })) + Expect(err).NotTo(HaveOccurred()) + Expect(out).To(ContainSubstring("cluster-enabled yes")) + Expect(out).To(ContainSubstring("\nmaxmemory 100mb")) + }) + + It("appends a multi-argument parameter", func() { + out, err := getValkeyConfigContent(cluster("", &cachev1alpha1.ValkeyConfig{ + Parameters: []cachev1alpha1.ValkeyConfigParameter{param("save", "900 1")}, + })) + Expect(err).NotTo(HaveOccurred()) + Expect(out).To(ContainSubstring("\nsave 900 1")) + }) + + It("appends a quoted value verbatim", func() { + out, err := getValkeyConfigContent(cluster("", &cachev1alpha1.ValkeyConfig{ + Parameters: []cachev1alpha1.ValkeyConfigParameter{param("requirepass", `"my secret"`)}, + })) + Expect(err).NotTo(HaveOccurred()) + Expect(out).To(ContainSubstring(`requirepass "my secret"`)) + }) + + It("appends multiple parameters in specified order", func() { + out, err := getValkeyConfigContent(cluster("", &cachev1alpha1.ValkeyConfig{ + Parameters: []cachev1alpha1.ValkeyConfigParameter{ + param("maxmemory", "512mb"), + param("maxmemory-policy", "allkeys-lru"), + param("maxmemory-clients", "10mb"), + }, + })) + Expect(err).NotTo(HaveOccurred()) + Expect(out).To(ContainSubstring("\nmaxmemory 512mb")) + Expect(out).To(ContainSubstring("\nmaxmemory-policy allkeys-lru")) + Expect(out).To(ContainSubstring("\nmaxmemory-clients 10mb")) + // Order is preserved + maxIdx := strings.Index(out, "maxmemory 512mb") + policyIdx := strings.Index(out, "maxmemory-policy allkeys-lru") + clientsIdx := strings.Index(out, "maxmemory-clients 10mb") + Expect(maxIdx).To(BeNumerically("<", policyIdx)) + Expect(policyIdx).To(BeNumerically("<", clientsIdx)) + }) + + It("supports repeated keys for multi-value directives", func() { + out, err := getValkeyConfigContent(cluster("", &cachev1alpha1.ValkeyConfig{ + Parameters: []cachev1alpha1.ValkeyConfigParameter{ + param("save", "900 1"), + param("save", "300 10"), + }, + })) + Expect(err).NotTo(HaveOccurred()) + Expect(strings.Count(out, "\nsave ")).To(Equal(2)) + Expect(out).To(ContainSubstring("\nsave 900 1")) + Expect(out).To(ContainSubstring("\nsave 300 10")) + Expect(strings.Index(out, "save 900 1")).To(BeNumerically("<", strings.Index(out, "save 300 10"))) + }) + + It("parameters override operator-injected password (last-wins)", func() { + out, err := getValkeyConfigContent(cluster("operatorpass", &cachev1alpha1.ValkeyConfig{ + Parameters: []cachev1alpha1.ValkeyConfigParameter{param("requirepass", "custom")}, + })) + Expect(err).NotTo(HaveOccurred()) + // Operator injects requirepass operatorpass; user param requirepass custom comes after + operatorIdx := strings.Index(out, "requirepass operatorpass") + userIdx := strings.Index(out, "requirepass custom") + Expect(operatorIdx).To(BeNumerically(">=", 0)) + Expect(userIdx).To(BeNumerically(">", operatorIdx)) + }) + + It("returns RawConfig verbatim when set", func() { + raw := "port 6379\ncluster-enabled yes\n" + out, err := getValkeyConfigContent(cluster("", &cachev1alpha1.ValkeyConfig{RawConfig: raw})) + Expect(err).NotTo(HaveOccurred()) + Expect(out).To(Equal(raw)) + }) + + It("appends Parameters on top of RawConfig when both are set", func() { + raw := "port 6379\ncluster-enabled yes\n" + out, err := getValkeyConfigContent(cluster("", &cachev1alpha1.ValkeyConfig{ + RawConfig: raw, + Parameters: []cachev1alpha1.ValkeyConfigParameter{param("maxmemory", "64mb")}, + })) + Expect(err).NotTo(HaveOccurred()) + Expect(out).To(HavePrefix(raw)) + Expect(out).To(ContainSubstring("\nmaxmemory 64mb")) + }) +}) + var _ = Describe("ValkeyCluster Controller", func() { Context("When reconciling a resource", func() { const resourceName = "test-resource" diff --git a/test/e2e/e2e_test.go b/test/e2e/e2e_test.go index 01e6ee4..66d0eb2 100644 --- a/test/e2e/e2e_test.go +++ b/test/e2e/e2e_test.go @@ -441,6 +441,47 @@ var _ = Describe("controller", Ordered, func() { } EventuallyWithOffset(1, verifyPVCResources, 3*time.Minute, 15*time.Second).Should(Succeed()) }) + It("set config parameters", func() { + patchCmd := exec.Command("kubectl", + "-n", namespace, + "patch", "valkeycluster", "valkeycluster-sample", + "--type=json", + `-p=[{"op":"add","path":"/spec/valkeyConfig","value":{"parameters":[{"name":"maxmemory","value":"32mb"},{"name":"maxmemory-policy","value":"allkeys-lru"},{"name":"maxmemory-clients","value":"10mb"}]}}]`, + ) + _, err := utils.Run(patchCmd) + ExpectWithOffset(1, err).NotTo(HaveOccurred()) + + verifyConfigMap := func() error { + cmd := exec.Command("kubectl", "get", "configmap", + "valkeycluster-sample", + "-o", `jsonpath={.data.valkey\.conf}`, + "-n", namespace, + ) + cfgOutput, err := utils.Run(cmd) + ExpectWithOffset(2, err).NotTo(HaveOccurred()) + for _, expected := range []string{ + "maxmemory 32mb", + "maxmemory-policy allkeys-lru", + "maxmemory-clients 10mb", + } { + if !strings.Contains(string(cfgOutput), expected) { + return fmt.Errorf("expected configmap to contain %q but got: %s", expected, cfgOutput) + } + } + return nil + } + EventuallyWithOffset(1, verifyConfigMap, time.Minute, time.Second).Should(Succeed()) + + // Remove valkeyConfig so subsequent tests start from a clean state. + removeCmd := exec.Command("kubectl", + "-n", namespace, + "patch", "valkeycluster", "valkeycluster-sample", + "--type=json", + `-p=[{"op":"remove","path":"/spec/valkeyConfig"}]`, + ) + _, err = utils.Run(removeCmd) + ExpectWithOffset(1, err).NotTo(HaveOccurred()) + }) It("apply custom rawConfig", func() { Skip("skip raw config test") customConfig := `port 6379 From 5d94d885e6d40e4478ca6af75240a2678ed84033 Mon Sep 17 00:00:00 2001 From: Nick Walker Date: Fri, 1 May 2026 15:15:03 +1200 Subject: [PATCH 2/5] Revert deepcopy autogenerated change --- api/v1alpha1/zz_generated.deepcopy.go | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go index 53665c3..d0f633f 100644 --- a/api/v1alpha1/zz_generated.deepcopy.go +++ b/api/v1alpha1/zz_generated.deepcopy.go @@ -140,7 +140,7 @@ func (in *ValkeyClusterSpec) DeepCopyInto(out *ValkeyClusterSpec) { if in.ValkeyConfig != nil { in, out := &in.ValkeyConfig, &out.ValkeyConfig *out = new(ValkeyConfig) - (*in).DeepCopyInto(*out) + **out = **in } } @@ -197,11 +197,6 @@ func (in *ValkeyClusterStatus) DeepCopy() *ValkeyClusterStatus { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ValkeyConfig) DeepCopyInto(out *ValkeyConfig) { *out = *in - if in.Parameters != nil { - in, out := &in.Parameters, &out.Parameters - *out = make([]ValkeyConfigParameter, len(*in)) - copy(*out, *in) - } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ValkeyConfig. @@ -213,18 +208,3 @@ func (in *ValkeyConfig) DeepCopy() *ValkeyConfig { in.DeepCopyInto(out) return out } - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ValkeyConfigParameter) DeepCopyInto(out *ValkeyConfigParameter) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ValkeyConfigParameter. -func (in *ValkeyConfigParameter) DeepCopy() *ValkeyConfigParameter { - if in == nil { - return nil - } - out := new(ValkeyConfigParameter) - in.DeepCopyInto(out) - return out -} From a1a7a9fe204752c838a054983cf4564a0672807e Mon Sep 17 00:00:00 2001 From: Nick Walker Date: Fri, 1 May 2026 15:30:23 +1200 Subject: [PATCH 3/5] Bump to v16.4 for use with Go > 1.23 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 4382683..0fe2564 100644 --- a/Makefile +++ b/Makefile @@ -210,7 +210,7 @@ GOLANGCI_LINT = $(LOCALBIN)/golangci-lint ## Tool Versions KUSTOMIZE_VERSION ?= v5.4.3 -CONTROLLER_TOOLS_VERSION ?= v0.16.1 +CONTROLLER_TOOLS_VERSION ?= v0.16.4 ENVTEST_VERSION ?= release-0.19 GOLANGCI_LINT_VERSION ?= v1.59.1 From d64d973a763302217be7bc19fdfe379f28379c88 Mon Sep 17 00:00:00 2001 From: Nick Walker Date: Fri, 1 May 2026 15:31:47 +1200 Subject: [PATCH 4/5] Update generated --- api/v1alpha1/zz_generated.deepcopy.go | 22 +++++- .../bases/cache.halter.io_valkeyclusters.yaml | 30 ++++++++- config/rbac/role.yaml | 67 ++++++++++--------- 3 files changed, 83 insertions(+), 36 deletions(-) diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go index d0f633f..53665c3 100644 --- a/api/v1alpha1/zz_generated.deepcopy.go +++ b/api/v1alpha1/zz_generated.deepcopy.go @@ -140,7 +140,7 @@ func (in *ValkeyClusterSpec) DeepCopyInto(out *ValkeyClusterSpec) { if in.ValkeyConfig != nil { in, out := &in.ValkeyConfig, &out.ValkeyConfig *out = new(ValkeyConfig) - **out = **in + (*in).DeepCopyInto(*out) } } @@ -197,6 +197,11 @@ func (in *ValkeyClusterStatus) DeepCopy() *ValkeyClusterStatus { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ValkeyConfig) DeepCopyInto(out *ValkeyConfig) { *out = *in + if in.Parameters != nil { + in, out := &in.Parameters, &out.Parameters + *out = make([]ValkeyConfigParameter, len(*in)) + copy(*out, *in) + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ValkeyConfig. @@ -208,3 +213,18 @@ func (in *ValkeyConfig) DeepCopy() *ValkeyConfig { in.DeepCopyInto(out) return out } + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ValkeyConfigParameter) DeepCopyInto(out *ValkeyConfigParameter) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ValkeyConfigParameter. +func (in *ValkeyConfigParameter) DeepCopy() *ValkeyConfigParameter { + if in == nil { + return nil + } + out := new(ValkeyConfigParameter) + in.DeepCopyInto(out) + return out +} diff --git a/config/crd/bases/cache.halter.io_valkeyclusters.yaml b/config/crd/bases/cache.halter.io_valkeyclusters.yaml index 428d75c..d24be86 100644 --- a/config/crd/bases/cache.halter.io_valkeyclusters.yaml +++ b/config/crd/bases/cache.halter.io_valkeyclusters.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.1 + controller-gen.kubebuilder.io/version: v0.16.4 name: valkeyclusters.cache.halter.io spec: group: cache.halter.io @@ -385,8 +385,34 @@ spec: description: Overwrite the default operator-provided configuration with user-defined config properties: + parameters: + description: |- + Parameters are valkey config directives appended after the operator-generated + config (last-wins). Multiple entries with the same name are supported + (e.g. multiple save directives). Values here override operator-set defaults + including requirepass/primaryauth. + items: + description: ValkeyConfigParameter is a single valkey config + directive with its value. + properties: + name: + description: Name is the valkey config directive name (e.g. + "maxmemory"). + type: string + value: + description: |- + Value is the raw string that follows the directive name on the config line. + Supports multi-argument directives (e.g. "900 1" for save) and quoted strings. + type: string + required: + - name + - value + type: object + type: array rawConfig: - description: Raw valkey.conf content provided as a string + description: |- + Raw valkey.conf content provided as a string. Takes precedence as the config + base; Parameters are still appended on top if both are set. type: string type: object type: object diff --git a/config/rbac/role.yaml b/config/rbac/role.yaml index c1110a5..55f1e9e 100644 --- a/config/rbac/role.yaml +++ b/config/rbac/role.yaml @@ -5,9 +5,12 @@ metadata: name: manager-role rules: - apiGroups: - - apps + - "" resources: - - statefulsets + - configmaps + - persistentvolumeclaims + - pods/exec + - services verbs: - create - delete @@ -17,50 +20,43 @@ rules: - update - watch - apiGroups: - - batch + - "" resources: - - jobs + - events verbs: - create - - delete - - get - - list - patch - - update - - watch - apiGroups: - - cache.halter.io + - "" resources: - - valkeyclusters + - pods verbs: - - create - delete - get - list - - patch - - update - watch - apiGroups: - - cache.halter.io + - "" resources: - - valkeyclusters/finalizers + - pods/log verbs: - - update + - get - apiGroups: - - cache.halter.io + - apps resources: - - valkeyclusters/status + - statefulsets verbs: + - create + - delete - get + - list - patch - update + - watch - apiGroups: - - "" + - batch resources: - - configmaps - - persistentvolumeclaims - - pods/exec - - services + - jobs verbs: - create - delete @@ -70,23 +66,28 @@ rules: - update - watch - apiGroups: - - "" + - cache.halter.io resources: - - events + - valkeyclusters verbs: - create + - delete + - get + - list - patch + - update + - watch - apiGroups: - - "" + - cache.halter.io resources: - - pods + - valkeyclusters/finalizers verbs: - - get - - list - - watch + - update - apiGroups: - - "" + - cache.halter.io resources: - - pods/log + - valkeyclusters/status verbs: - get + - patch + - update From 5ef3332cb9e2a2c9447bf5be2d9da9753ff179f4 Mon Sep 17 00:00:00 2001 From: Nick Walker Date: Fri, 1 May 2026 16:08:23 +1200 Subject: [PATCH 5/5] Upgrade dagger --- .dagger/.gitignore | 1 + .dagger/go.mod | 52 ++++++++++++++++++---- .dagger/go.sum | 105 +++++++++++++++++++++++++++++++++++++++++---- dagger.json | 5 ++- 4 files changed, 145 insertions(+), 18 deletions(-) diff --git a/.dagger/.gitignore b/.dagger/.gitignore index 7ebabcc..773338b 100644 --- a/.dagger/.gitignore +++ b/.dagger/.gitignore @@ -2,3 +2,4 @@ /internal/dagger /internal/querybuilder /internal/telemetry +/.env diff --git a/.dagger/go.mod b/.dagger/go.mod index 3fa68b0..02d33ef 100644 --- a/.dagger/go.mod +++ b/.dagger/go.mod @@ -1,22 +1,58 @@ module dagger/valkey-cluster-operator -go 1.24.3 +go 1.25.0 require ( github.com/blang/semver/v4 v4.0.0 + github.com/dagger/otel-go v1.43.0 gopkg.in/yaml.v3 v3.0.1 ) require ( - github.com/kr/pretty v0.3.1 // indirect - github.com/rogpeppe/go-internal v1.13.1 // indirect - gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect + dagger.io/dagger v0.20.6-0.20260415192040-7058e9313c72 + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.17.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.17.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.41.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.41.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.41.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.41.0 // indirect + go.opentelemetry.io/otel/log v0.17.0 // indirect + go.opentelemetry.io/otel/sdk v1.43.0 + go.opentelemetry.io/otel/sdk/log v0.17.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect + go.opentelemetry.io/proto/otlp v1.9.0 // indirect + golang.org/x/net v0.52.0 // indirect + golang.org/x/text v0.35.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 // indirect + google.golang.org/grpc v1.79.3 // indirect + google.golang.org/protobuf v1.36.11 // indirect ) -replace go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc => go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0 +require ( + github.com/99designs/gqlgen v0.17.90 // indirect + github.com/Khan/genqlient v0.8.1 + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/sosodev/duration v1.4.0 // indirect + github.com/vektah/gqlparser/v2 v2.5.33 + go.opentelemetry.io/auto/sdk v1.2.1 // indirect + go.opentelemetry.io/otel v1.43.0 + go.opentelemetry.io/otel/metric v1.43.0 // indirect + go.opentelemetry.io/otel/trace v1.43.0 + golang.org/x/sync v0.20.0 // indirect + golang.org/x/sys v0.43.0 // indirect +) + +replace go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc => go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.16.0 -replace go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp => go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 +replace go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp => go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.16.0 -replace go.opentelemetry.io/otel/log => go.opentelemetry.io/otel/log v0.8.0 +replace go.opentelemetry.io/otel/log => go.opentelemetry.io/otel/log v0.16.0 -replace go.opentelemetry.io/otel/sdk/log => go.opentelemetry.io/otel/sdk/log v0.8.0 +replace go.opentelemetry.io/otel/sdk/log => go.opentelemetry.io/otel/sdk/log v0.16.0 diff --git a/.dagger/go.sum b/.dagger/go.sum index 6766f0a..b4ef07b 100644 --- a/.dagger/go.sum +++ b/.dagger/go.sum @@ -1,17 +1,106 @@ +dagger.io/dagger v0.20.6-0.20260415192040-7058e9313c72 h1:s39e07WvaUU6tLhpojK8ZEIoIbOSn5hHOJra0waenxQ= +dagger.io/dagger v0.20.6-0.20260415192040-7058e9313c72/go.mod h1:ZXg8+pQZaZUC8rAw4V/gPP8aKvKARIJZ+pfcV+RC1es= +github.com/99designs/gqlgen v0.17.90 h1:wSv6blm/PoplU6QoNw83EcQpNtC0HX3/+44vITJOzpk= +github.com/99designs/gqlgen v0.17.90/go.mod h1:GqYrEwYsqCG8VaOsq2kJUCUKwAE1T+u2i+Nj7NtXiVI= +github.com/Khan/genqlient v0.8.1 h1:wtOCc8N9rNynRLXN3k3CnfzheCUNKBcvXmVv5zt6WCs= +github.com/Khan/genqlient v0.8.1/go.mod h1:R2G6DzjBvCbhjsEajfRjbWdVglSH/73kSivC9TLWVjU= +github.com/agnivade/levenshtein v1.2.1 h1:EHBY3UOn1gwdy/VbFwgo4cxecRznFk7fKWN1KOX7eoM= +github.com/agnivade/levenshtein v1.2.1/go.mod h1:QVVI16kDrtSuwcpd0p1+xMC6Z/VfhtCyDIjcwga4/DU= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/dagger/otel-go v1.43.0 h1:AYCnAamWmxtSxigWPTgC+8EWqiWPcDZEegh8y05gdJ8= +github.com/dagger/otel-go v1.43.0/go.mod h1:83CTuXi70zcx1kaym5buqmb7RNzg1E9dEiQSFyLbLdU= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +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/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +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/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -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/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= +github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/sosodev/duration v1.4.0 h1:35ed0KiVFriGHHzZZJaZLgmTEEICIyt8Sx0RQfj9IjE= +github.com/sosodev/duration v1.4.0/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg= +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/vektah/gqlparser/v2 v2.5.33 h1:lRp8aIeNUNbimf/axZd7ETg24q06hBtPaas+TcvI/7E= +github.com/vektah/gqlparser/v2 v2.5.33/go.mod h1:c1I28gSOVNzlfc4WuDlqU7voQnsqI6OG2amkBAFmgts= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= +go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.16.0 h1:ZVg+kCXxd9LtAaQNKBxAvJ5NpMf7LpvEr4MIZqb0TMQ= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.16.0/go.mod h1:hh0tMeZ75CCXrHd9OXRYxTlCAdxcXioWHFIpYw2rZu8= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.16.0 h1:djrxvDxAe44mJUrKataUbOhCKhR3F8QCyWucO16hTQs= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.16.0/go.mod h1:dt3nxpQEiSoKvfTVxp3TUg5fHPLhKtbcnN3Z1I1ePD0= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.41.0 h1:VO3BL6OZXRQ1yQc8W6EVfJzINeJ35BkiHx4MYfoQf44= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.41.0/go.mod h1:qRDnJ2nv3CQXMK2HUd9K9VtvedsPAce3S+/4LZHjX/s= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.41.0 h1:MMrOAN8H1FrvDyq9UJ4lu5/+ss49Qgfgb7Zpm0m8ABo= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.41.0/go.mod h1:Na+2NNASJtF+uT4NxDe0G+NQb+bUgdPDfwxY/6JmS/c= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0 h1:ao6Oe+wSebTlQ1OEht7jlYTzQKE+pnx/iNywFvTbuuI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0/go.mod h1:u3T6vz0gh/NVzgDgiwkgLxpsSF6PaPmo2il0apGJbls= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.41.0 h1:mq/Qcf28TWz719lE3/hMB4KkyDuLJIvgJnFGcd0kEUI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.41.0/go.mod h1:yk5LXEYhsL2htyDNJbEq7fWzNEigeEdV5xBF/Y+kAv0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.41.0 h1:inYW9ZhgqiDqh6BioM7DVHHzEGVq76Db5897WLGZ5Go= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.41.0/go.mod h1:Izur+Wt8gClgMJqO/cZ8wdeeMryJ/xxiOVgFSSfpDTY= +go.opentelemetry.io/otel/log v0.16.0 h1:DeuBPqCi6pQwtCK0pO4fvMB5eBq6sNxEnuTs88pjsN4= +go.opentelemetry.io/otel/log v0.16.0/go.mod h1:rWsmqNVTLIA8UnwYVOItjyEZDbKIkMxdQunsIhpUMes= +go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= +go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= +go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= +go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= +go.opentelemetry.io/otel/sdk/log v0.16.0 h1:e/b4bdlQwC5fnGtG3dlXUrNOnP7c8YLVSpSfEBIkTnI= +go.opentelemetry.io/otel/sdk/log v0.16.0/go.mod h1:JKfP3T6ycy7QEuv3Hj8oKDy7KItrEkus8XJE6EoSzw4= +go.opentelemetry.io/otel/sdk/log/logtest v0.16.0 h1:/XVkpZ41rVRTP4DfMgYv1nEtNmf65XPPyAdqV90TMy4= +go.opentelemetry.io/otel/sdk/log/logtest v0.16.0/go.mod h1:iOOPgQr5MY9oac/F5W86mXdeyWZGleIx3uXO98X2R6Y= +go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= +go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= +go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= +go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= +go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A= +go.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= +golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= +golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= +golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= +golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= +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/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171 h1:tu/dtnW1o3wfaxCOjSLn5IRX4YDcJrtlpzYkhHhGaC4= +google.golang.org/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171/go.mod h1:M5krXqk4GhBKvB596udGL3UyjL4I1+cTbK0orROM9ng= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 h1:ggcbiqK8WWh6l1dnltU4BgWGIGo+EVYxCaAPih/zQXQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= +google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 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= diff --git a/dagger.json b/dagger.json index db7002a..5bcb75f 100644 --- a/dagger.json +++ b/dagger.json @@ -1,8 +1,9 @@ { "name": "valkey-cluster-operator", - "engineVersion": "v0.18.8", + "engineVersion": "v0.20.6", "sdk": { "source": "go" }, - "source": ".dagger" + "source": ".dagger", + "disableDefaultFunctionCaching": true }