Skip to content

Commit

Permalink
Use Patch instead of Update in the daemonset_controller when scaling
Browse files Browse the repository at this point in the history
Signed-off-by: Aurel Canciu <[email protected]>
  • Loading branch information
relu committed Apr 30, 2024
1 parent 7306d56 commit a39851c
Showing 1 changed file with 25 additions and 17 deletions.
42 changes: 25 additions & 17 deletions pkg/canary/daemonset_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package canary

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

"go.uber.org/zap"
Expand All @@ -26,6 +27,7 @@ import (
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/util/retry"

Expand All @@ -34,7 +36,7 @@ import (
)

var (
daemonSetScaleDownNodeSelector = map[string]string{"flagger.app/scale-to-zero": "true"}
daemonSetScaleDownNodeSelector = map[string]interface{}{"flagger.app/scale-to-zero": "true"}
)

// DaemonSetController is managing the operations for Kubernetes DaemonSet kind
Expand All @@ -54,39 +56,35 @@ func (c *DaemonSetController) ScaleToZero(cd *flaggerv1.Canary) error {
return fmt.Errorf("daemonset %s.%s get query error: %w", targetName, cd.Namespace, err)
}

daeCopy := dae.DeepCopy()
daeCopy.Spec.Template.Spec.NodeSelector = make(map[string]string,
len(dae.Spec.Template.Spec.NodeSelector)+len(daemonSetScaleDownNodeSelector))
for k, v := range dae.Spec.Template.Spec.NodeSelector {
daeCopy.Spec.Template.Spec.NodeSelector[k] = v
patch, err := c.getNodeSelectorPatch(daemonSetScaleDownNodeSelector)
if err == nil {
_, err = c.kubeClient.AppsV1().DaemonSets(dae.Namespace).Patch(context.TODO(), dae.GetName(), types.StrategicMergePatchType, patch, metav1.PatchOptions{})
}

for k, v := range daemonSetScaleDownNodeSelector {
daeCopy.Spec.Template.Spec.NodeSelector[k] = v
}

_, err = c.kubeClient.AppsV1().DaemonSets(dae.Namespace).Update(context.TODO(), daeCopy, metav1.UpdateOptions{})
if err != nil {
return fmt.Errorf("updating daemonset %s.%s failed: %w", daeCopy.GetName(), daeCopy.Namespace, err)
return fmt.Errorf("updating daemonset %s.%s failed: %w", dae.GetName(), dae.Namespace, err)
}
return nil
}

func (c *DaemonSetController) ScaleFromZero(cd *flaggerv1.Canary) error {
targetName := cd.Spec.TargetRef.Name
dep, err := c.kubeClient.AppsV1().DaemonSets(cd.Namespace).Get(context.TODO(), targetName, metav1.GetOptions{})
dae, err := c.kubeClient.AppsV1().DaemonSets(cd.Namespace).Get(context.TODO(), targetName, metav1.GetOptions{})
if err != nil {
return fmt.Errorf("daemonset %s.%s query error: %w", targetName, cd.Namespace, err)
}

depCopy := dep.DeepCopy()
nodeSelector := map[string]interface{}{}
for k := range daemonSetScaleDownNodeSelector {
delete(depCopy.Spec.Template.Spec.NodeSelector, k)
nodeSelector[k] = nil
}
patch, err := c.getNodeSelectorPatch(nodeSelector)
if err == nil {
_, err = c.kubeClient.AppsV1().DaemonSets(dae.Namespace).Patch(context.TODO(), dae.GetName(), types.StrategicMergePatchType, patch, metav1.PatchOptions{})
}

_, err = c.kubeClient.AppsV1().DaemonSets(dep.Namespace).Update(context.TODO(), depCopy, metav1.UpdateOptions{})
if err != nil {
return fmt.Errorf("scaling up daemonset %s.%s failed: %w", depCopy.GetName(), depCopy.Namespace, err)
return fmt.Errorf("scaling up daemonset %s.%s failed: %w", dae.GetName(), dae.Namespace, err)
}
return nil
}
Expand Down Expand Up @@ -324,6 +322,16 @@ func (c *DaemonSetController) getSelectorLabel(daemonSet *appsv1.DaemonSet) (str
)
}

// createNodeSelectorPatch returns the nodeSelector field strategic patch used for scaling
func (c *DaemonSetController) getNodeSelectorPatch(nodeSelector map[string]interface{}) ([]byte, error) {
nodeSelectorJSON, err := json.Marshal(nodeSelector)
if err != nil {
return nil, err
}
patch := []byte(fmt.Sprintf(`{"spec":{"template":{"spec":{"nodeSelector":%s}}}}`, nodeSelectorJSON))
return patch, nil
}

func (c *DaemonSetController) HaveDependenciesChanged(cd *flaggerv1.Canary) (bool, error) {
return c.configTracker.HasConfigChanged(cd)
}
Expand Down

0 comments on commit a39851c

Please sign in to comment.