Skip to content

Commit 386c64a

Browse files
authored
Merge flags fix and sample spec for flags (#48)
* Args merge fixed and a flags example spec * preserve the args order
1 parent 3da950f commit 386c64a

File tree

2 files changed

+55
-6
lines changed

2 files changed

+55
-6
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
apiVersion: kit.k8s.sh/v1alpha1
2+
kind: ControlPlane
3+
metadata:
4+
name: example # Desired Cluster Name
5+
spec:
6+
kubernetesVersion: "1.21"
7+
master:
8+
apiServer:
9+
spec:
10+
nodeSelector:
11+
node.kubernetes.io/instance-type: m5.24xlarge
12+
containers:
13+
- name: apiserver
14+
args:
15+
- --max-requests-inflight=500
16+
- --max-mutating-requests-inflight=300
17+
controllerManager:
18+
spec:
19+
containers:
20+
- name: controller-manager
21+
args:
22+
- --kube-api-qps=50
23+
scheduler:
24+
spec:
25+
containers:
26+
- name: scheduler
27+
args:
28+
- --kube-api-qps=50

operator/pkg/utils/patch/patch.go

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import (
1919
"fmt"
2020
"strings"
2121

22-
"github.com/awslabs/kit/operator/pkg/utils/functional"
2322
v1 "k8s.io/api/core/v1"
2423
"k8s.io/apimachinery/pkg/util/strategicpatch"
2524
)
@@ -57,20 +56,42 @@ func mergePatch(defaultObj, patch, object interface{}) ([]byte, error) {
5756
return patchedBytes, nil
5857
}
5958

59+
// Keep the order of the args same, if the ordering changes when object is patched Kubernetes restarts the pod
6060
func mergeContainerArgs(defaultSpec, patch *v1.PodSpec) *v1.PodSpec {
61-
merged := []string{}
62-
for key, value := range functional.UnionStringMaps(parseArgsFor(defaultSpec), parseArgsFor(patch)) {
63-
merged = append(merged, strings.Join([]string{key, value}, "="))
61+
patchedArgs := parseArgsFor(patch)
62+
// get any additional args passed in patch
63+
extraArgs := additionalArgs(parseArgsFor(defaultSpec), patch)
64+
updatedArgs := []string{}
65+
// for all the args in defaultSpec, check if the value for an arg has been updated in patch
66+
for _, arg := range defaultSpec.Containers[0].Args {
67+
kv := strings.Split(arg, "=")
68+
if update, ok := patchedArgs[kv[0]]; ok {
69+
kv[1] = update
70+
}
71+
updatedArgs = append(updatedArgs, strings.Join(kv, "="))
6472
}
65-
patch.Containers[0].Args = merged
73+
patch.Containers[0].Args = append(updatedArgs, extraArgs...)
6674
return patch
6775
}
6876

6977
func parseArgsFor(podSpec *v1.PodSpec) map[string]string {
7078
result := map[string]string{}
7179
for _, arg := range podSpec.Containers[0].Args {
7280
kv := strings.Split(arg, "=")
73-
result[kv[0]] = result[kv[1]]
81+
result[kv[0]] = kv[1]
82+
}
83+
return result
84+
}
85+
86+
// needs to preserve the order of args passed in patch in every iteration
87+
func additionalArgs(defaultSpec map[string]string, patch *v1.PodSpec) []string {
88+
result := make([]string, 0)
89+
for _, arg := range patch.Containers[0].Args {
90+
kv := strings.Split(arg, "=")
91+
if _, ok := defaultSpec[kv[0]]; ok {
92+
continue
93+
}
94+
result = append(result, arg)
7495
}
7596
return result
7697
}

0 commit comments

Comments
 (0)