@@ -18,6 +18,7 @@ package canary
18
18
19
19
import (
20
20
"context"
21
+ "encoding/json"
21
22
"fmt"
22
23
23
24
"go.uber.org/zap"
@@ -26,6 +27,7 @@ import (
26
27
"k8s.io/apimachinery/pkg/api/errors"
27
28
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
28
29
"k8s.io/apimachinery/pkg/runtime/schema"
30
+ "k8s.io/apimachinery/pkg/types"
29
31
"k8s.io/client-go/kubernetes"
30
32
"k8s.io/client-go/util/retry"
31
33
@@ -34,7 +36,7 @@ import (
34
36
)
35
37
36
38
var (
37
- daemonSetScaleDownNodeSelector = map [string ]string {"flagger.app/scale-to-zero" : "true" }
39
+ daemonSetScaleDownNodeSelector = map [string ]interface {} {"flagger.app/scale-to-zero" : "true" }
38
40
)
39
41
40
42
// DaemonSetController is managing the operations for Kubernetes DaemonSet kind
@@ -54,39 +56,35 @@ func (c *DaemonSetController) ScaleToZero(cd *flaggerv1.Canary) error {
54
56
return fmt .Errorf ("daemonset %s.%s get query error: %w" , targetName , cd .Namespace , err )
55
57
}
56
58
57
- daeCopy := dae .DeepCopy ()
58
- daeCopy .Spec .Template .Spec .NodeSelector = make (map [string ]string ,
59
- len (dae .Spec .Template .Spec .NodeSelector )+ len (daemonSetScaleDownNodeSelector ))
60
- for k , v := range dae .Spec .Template .Spec .NodeSelector {
61
- daeCopy .Spec .Template .Spec .NodeSelector [k ] = v
59
+ patch , err := c .getNodeSelectorPatch (daemonSetScaleDownNodeSelector )
60
+ if err == nil {
61
+ _ , err = c .kubeClient .AppsV1 ().DaemonSets (dae .Namespace ).Patch (context .TODO (), dae .GetName (), types .StrategicMergePatchType , patch , metav1.PatchOptions {})
62
62
}
63
63
64
- for k , v := range daemonSetScaleDownNodeSelector {
65
- daeCopy .Spec .Template .Spec .NodeSelector [k ] = v
66
- }
67
-
68
- _ , err = c .kubeClient .AppsV1 ().DaemonSets (dae .Namespace ).Update (context .TODO (), daeCopy , metav1.UpdateOptions {})
69
64
if err != nil {
70
- return fmt .Errorf ("updating daemonset %s.%s failed: %w" , daeCopy .GetName (), daeCopy .Namespace , err )
65
+ return fmt .Errorf ("updating daemonset %s.%s failed: %w" , dae .GetName (), dae .Namespace , err )
71
66
}
72
67
return nil
73
68
}
74
69
75
70
func (c * DaemonSetController ) ScaleFromZero (cd * flaggerv1.Canary ) error {
76
71
targetName := cd .Spec .TargetRef .Name
77
- dep , err := c .kubeClient .AppsV1 ().DaemonSets (cd .Namespace ).Get (context .TODO (), targetName , metav1.GetOptions {})
72
+ dae , err := c .kubeClient .AppsV1 ().DaemonSets (cd .Namespace ).Get (context .TODO (), targetName , metav1.GetOptions {})
78
73
if err != nil {
79
74
return fmt .Errorf ("daemonset %s.%s query error: %w" , targetName , cd .Namespace , err )
80
75
}
81
76
82
- depCopy := dep . DeepCopy ()
77
+ nodeSelector := map [ string ] interface {}{}
83
78
for k := range daemonSetScaleDownNodeSelector {
84
- delete (depCopy .Spec .Template .Spec .NodeSelector , k )
79
+ nodeSelector [k ] = nil
80
+ }
81
+ patch , err := c .getNodeSelectorPatch (nodeSelector )
82
+ if err == nil {
83
+ _ , err = c .kubeClient .AppsV1 ().DaemonSets (dae .Namespace ).Patch (context .TODO (), dae .GetName (), types .StrategicMergePatchType , patch , metav1.PatchOptions {})
85
84
}
86
85
87
- _ , err = c .kubeClient .AppsV1 ().DaemonSets (dep .Namespace ).Update (context .TODO (), depCopy , metav1.UpdateOptions {})
88
86
if err != nil {
89
- return fmt .Errorf ("scaling up daemonset %s.%s failed: %w" , depCopy .GetName (), depCopy .Namespace , err )
87
+ return fmt .Errorf ("scaling up daemonset %s.%s failed: %w" , dae .GetName (), dae .Namespace , err )
90
88
}
91
89
return nil
92
90
}
@@ -324,6 +322,16 @@ func (c *DaemonSetController) getSelectorLabel(daemonSet *appsv1.DaemonSet) (str
324
322
)
325
323
}
326
324
325
+ // createNodeSelectorPatch returns the nodeSelector field strategic patch used for scaling
326
+ func (c * DaemonSetController ) getNodeSelectorPatch (nodeSelector map [string ]interface {}) ([]byte , error ) {
327
+ nodeSelectorJSON , err := json .Marshal (nodeSelector )
328
+ if err != nil {
329
+ return nil , err
330
+ }
331
+ patch := []byte (fmt .Sprintf (`{"spec":{"template":{"spec":{"nodeSelector":%s}}}}` , nodeSelectorJSON ))
332
+ return patch , nil
333
+ }
334
+
327
335
func (c * DaemonSetController ) HaveDependenciesChanged (cd * flaggerv1.Canary ) (bool , error ) {
328
336
return c .configTracker .HasConfigChanged (cd )
329
337
}
0 commit comments