Skip to content

Commit

Permalink
Make getHelmValues working in deflux operator
Browse files Browse the repository at this point in the history
  • Loading branch information
RafalKorepta committed Oct 29, 2024
1 parent 55d637a commit 4d30e84
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ func decommissionStatus(ctx context.Context, l logr.Logger, c k8sclient.Client,
decommissionNodeID := int(*rp.Status.ManagedDecommissioningNode)
log := l.WithName("decommissionStatus").WithValues("decommission-node-id", decommissionNodeID)

valuesMap, err := getHelmValues(l, rp.GetHelmReleaseName(), rp.Namespace)
valuesMap, err := getHelmValues(ctx, c, l, rp.GetHelmReleaseName(), rp.Namespace, true)
if err != nil {
return fmt.Errorf("get helm values: %w", err)
}
Expand Down Expand Up @@ -304,7 +304,7 @@ func getPodFromRedpandaNodeID(ctx context.Context, l logr.Logger, c k8sclient.Cl
return nil, fmt.Errorf("get Redpanda Node ID pod list: %w", err)
}

valuesMap, err := getHelmValues(l, rp.GetHelmReleaseName(), rp.Namespace)
valuesMap, err := getHelmValues(ctx, c, l, rp.GetHelmReleaseName(), rp.Namespace, true)
if err != nil {
return nil, fmt.Errorf("get helm values: %w", err)
}
Expand Down Expand Up @@ -371,7 +371,7 @@ func reconcilePodsDecommission(ctx context.Context, l logr.Logger, c k8sclient.C
return err
}

valuesMap, err := getHelmValues(l, rp.GetHelmReleaseName(), rp.Namespace)
valuesMap, err := getHelmValues(ctx, c, l, rp.GetHelmReleaseName(), rp.Namespace, true)
if err != nil {
return fmt.Errorf("get helm values: %w", err)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -295,7 +295,7 @@ func (r *RedpandaReconciler) reconcile(ctx context.Context, rp *v1alpha2.Redpand
}

for _, sts := range redpandaStatefulSets {
decommission, err := needsDecommission(ctx, sts, log)
decommission, err := needsDecommission(ctx, sts, log, r.Client, true)
if err != nil {
return rp, err
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,16 @@ package redpanda

import (
"context"
"encoding/json"
"fmt"
"os"

"github.com/fluxcd/pkg/runtime/logger"
"github.com/go-logr/logr"
"github.com/redpanda-data/helm-charts/charts/redpanda"
"github.com/redpanda-data/helm-charts/pkg/gotohelm/helmette"
"github.com/redpanda-data/helm-charts/pkg/kube"
"github.com/redpanda-data/redpanda-operator/operator/api/redpanda/v1alpha2"
"helm.sh/helm/v3/pkg/action"
"helm.sh/helm/v3/pkg/cli"
corev1 "k8s.io/api/core/v1"
Expand Down Expand Up @@ -59,7 +64,31 @@ func isValidReleaseName(releaseName string, redpandaNameList []string) bool {
return false
}

func getHelmValues(log logr.Logger, releaseName, namespace string) (map[string]interface{}, error) {
func getHelmValues(ctx context.Context, c client.Client, log logr.Logger, releaseName, namespace string, operatorMode bool) (map[string]interface{}, error) {
if operatorMode {
rp := v1alpha2.Redpanda{}
err := c.Get(ctx, client.ObjectKey{Name: releaseName, Namespace: namespace}, &rp)
if err != nil {
return nil, fmt.Errorf("getting Redpanda customer resource: %w", err)
}

values := redpanda.Values{}
b, err := json.Marshal(rp.Spec.ClusterSpec)
if err != nil {
return nil, fmt.Errorf("marshalling cluster spec: %w", err)
}

err = json.Unmarshal(b, &values)
if err != nil {
return nil, fmt.Errorf("unmarshalling cluster spec into redpanda Values: %w", err)
}

d, err := redpanda.Chart.Dot(kube.Config{}, helmette.Release{Name: releaseName, Namespace: namespace, IsInstall: true, IsUpgrade: true, Service: "operator"}, values)
if err != nil {
return nil, fmt.Errorf("compute chart values: %w", err)
}
return d.Values.AsMap(), nil
}
settings := cli.New()
actionConfig := new(action.Configuration)
if err := actionConfig.Init(settings.RESTClientGetter(), namespace, os.Getenv("HELM_DRIVER"), func(format string, v ...interface{}) { Debugf(log, format, v) }); err != nil {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ func (r *DecommissionReconciler) verifyIfNeedDecommission(ctx context.Context, s

requestedReplicas := ptr.Deref(sts.Spec.Replicas, 0)

valuesMap, err := getHelmValues(log, releaseName, namespace)
valuesMap, err := getHelmValues(ctx, r, log, releaseName, namespace, r.OperatorMode)
if err != nil {
return ctrl.Result{}, fmt.Errorf("could not retrieve values, probably not a valid managed helm release: %w", err)
}
Expand Down Expand Up @@ -319,7 +319,7 @@ func (r *DecommissionReconciler) reconcileDecommission(ctx context.Context, log
return ctrl.Result{Requeue: true, RequeueAfter: 10 * time.Second}, nil
}

valuesMap, err := getHelmValues(log, releaseName, namespace)
valuesMap, err := getHelmValues(ctx, r, log, releaseName, namespace, r.OperatorMode)
if err != nil {
return ctrl.Result{}, fmt.Errorf("could not retrieve values, probably not a valid managed helm release: %w", err)
}
Expand Down Expand Up @@ -727,7 +727,7 @@ func getConditionOfTypeAndListWithout(conditionType appsv1.StatefulSetConditionT
return oldCondition, newConditions
}

func needsDecommission(ctx context.Context, sts *appsv1.StatefulSet, log logr.Logger) (bool, error) {
func needsDecommission(ctx context.Context, sts *appsv1.StatefulSet, log logr.Logger, c client.Client, operatorMode bool) (bool, error) {
namespace := sts.Namespace

releaseName, ok := sts.Labels[K8sInstanceLabelKey]
Expand All @@ -737,7 +737,7 @@ func needsDecommission(ctx context.Context, sts *appsv1.StatefulSet, log logr.Lo
}

requestedReplicas := ptr.Deref(sts.Spec.Replicas, 0)
valuesMap, err := getHelmValues(log, releaseName, namespace)
valuesMap, err := getHelmValues(ctx, c, log, releaseName, namespace, operatorMode)
if err != nil {
return false, fmt.Errorf("could not retrieve values, probably not a valid managed helm release: %w", err)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ func (r *RedpandaNodePVCReconciler) reconcile(ctx context.Context, req ctrl.Requ
}

if !foundKey {
valuesMap, err := getHelmValues(log, releaseName, req.Namespace)
valuesMap, err := getHelmValues(ctx, r, log, releaseName, req.Namespace, r.OperatorMode)
if err != nil {
Infof(log, "could not retrieve values for release %q, probably not a valid managed helm release: %s", releaseName, err)
continue
Expand Down

0 comments on commit 4d30e84

Please sign in to comment.