Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

vcluster config convert statefulSet.affinity bugfix #2329

Merged
merged 4 commits into from
Dec 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions config/diff.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,14 +112,16 @@ func prune(in interface{}) interface{} {

for k, v := range inType {
inType[k] = prune(v)
if inType[k] == nil {
// delete key only if original value was not nil (but for example empty map),
// otherwise we want to keep null as a value
if inType[k] == nil && v != nil {
delete(inType, k)
}
FabianKramm marked this conversation as resolved.
Show resolved Hide resolved
}

if len(inType) == 0 {
return nil
}

return inType
default:
return in
Expand Down
3 changes: 2 additions & 1 deletion config/legacyconfig/migrate.go
Original file line number Diff line number Diff line change
Expand Up @@ -274,13 +274,14 @@ func convertBaseValues(oldConfig BaseHelm, newConfig *config.Config) error {
}

newConfig.Networking.Advanced.FallbackHostCluster = oldConfig.FallbackHostDNS

newConfig.ControlPlane.StatefulSet.Labels = oldConfig.Labels
newConfig.ControlPlane.StatefulSet.Annotations = oldConfig.Annotations
newConfig.ControlPlane.StatefulSet.Pods.Labels = oldConfig.PodLabels
newConfig.ControlPlane.StatefulSet.Pods.Annotations = oldConfig.PodAnnotations
newConfig.ControlPlane.StatefulSet.Scheduling.Tolerations = oldConfig.Tolerations
newConfig.ControlPlane.StatefulSet.Scheduling.NodeSelector = oldConfig.NodeSelector
newConfig.ControlPlane.StatefulSet.Scheduling.Affinity = oldConfig.Affinity
newConfig.ControlPlane.StatefulSet.Scheduling.Affinity = mergeMaps(newConfig.ControlPlane.StatefulSet.Scheduling.Affinity, oldConfig.Affinity)
newConfig.ControlPlane.StatefulSet.Scheduling.PriorityClassName = oldConfig.PriorityClassName

newConfig.Networking.ReplicateServices.FromHost = oldConfig.MapServices.FromHost
Expand Down
204 changes: 185 additions & 19 deletions config/legacyconfig/migrate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -297,8 +297,7 @@ sync:
enabled: true
statefulSet:
scheduling:
podManagementPolicy: OrderedReady
`,
podManagementPolicy: OrderedReady`,
},
{
Name: "embedded etcd",
Expand Down Expand Up @@ -463,9 +462,7 @@ controlPlane:
tag: v1.30.2-k3s2
statefulSet:
scheduling:
podManagementPolicy: OrderedReady

`,
podManagementPolicy: OrderedReady`,
ExpectedErr: "migrate legacy k3s values: config is already in correct format",
},
{
Expand All @@ -484,26 +481,195 @@ controlPlane:
enabled: true
statefulSet:
scheduling:
podManagementPolicy: OrderedReady

`,
podManagementPolicy: OrderedReady`,
ExpectedErr: "migrate legacy k8s values: config is already in correct format",
},
{
Name: "statefulset affinity added",
Distro: "k8s",
In: `isolation:
# nodeProxyPermission:
# enabled: true
enabled: true
podSecurityStandard: baseline
resourceQuota:
enabled: true
quota:
count/endpoints: null
count/pods: null
count/services: null
count/configmaps: null
count/secrets: null
count/persistentvolumeclaims: null
limits.cpu: 256
limits.memory: 1Ti
requests.storage: 10Ti
requests.ephemeral-storage: null
requests.memory: 128Gi
requests.cpu: 120
services.loadbalancers: null
services.nodeports: null
limitRange:
enabled: true
defaultRequest:
cpu: 24m
memory: 32Mi
ephemeral-storage: null
default:
ephemeral-storage: null
memory: 2Gi
cpu: 512m
# max:
# cpu: 32
# memory: 64Gi
# ephemeral-storage: 512Gi
networkPolicy:
enabled: false
storage:
className: px-pool
sync:
secrets:
enabled: true
nodes:
enabled: true
networkpolicies:
enabled: true
hoststorageclasses:
enabled: true
# enableHA: true
embeddedEtcd:
enabled: true
syncer:
resources:
limits:
cpu: '8'
ephemeral-storage: 8Gi
memory: 10Gi
# extraArgs:
# - '--sync-labels=namespace,aussiebb.io/,..aussiebb.io/'
replicas: 3
labels:
aussiebb.io/profile: "true"
storage:
size: 50Gi
className: px-pool-etcd
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- vcluster
topologyKey: "kubernetes.io/hostname"
coredns:
replicas: 3
resources:
limits:
cpu: '2'
memory: '1Gi'
api:
extraArgs:
- "-v=4"`,
Expected: `controlPlane:
backingStore:
etcd:
embedded:
enabled: true
coredns:
deployment:
replicas: 3
resources:
limits:
cpu: "2"
memory: 1Gi
distro:
k8s:
apiServer:
extraArgs:
- -v=4
enabled: true
statefulSet:
highAvailability:
replicas: 3
persistence:
volumeClaim:
size: 50Gi
storageClass: px-pool-etcd
resources:
limits:
cpu: "8"
memory: 10Gi
scheduling:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- vcluster
topologyKey: kubernetes.io/hostname
podManagementPolicy: OrderedReady
policies:
limitRange:
default:
cpu: 512m
ephemeral-storage: null
memory: 2Gi
defaultRequest:
cpu: 24m
ephemeral-storage: null
memory: 32Mi
enabled: true
podSecurityStandard: baseline
resourceQuota:
enabled: true
quota:
count/configmaps: null
count/endpoints: null
count/persistentvolumeclaims: null
count/pods: null
count/secrets: null
count/services: null
limits.cpu: 256
limits.memory: 1Ti
requests.cpu: 120
requests.ephemeral-storage: null
requests.memory: 128Gi
requests.storage: 10Ti
services.loadbalancers: null
services.nodeports: null
sync:
fromHost:
nodes:
enabled: true
storageClasses:
enabled: true
toHost:
networkPolicies:
enabled: true`,
ExpectedErr: "",
},
}

for _, testCase := range testCases {
out, err := MigrateLegacyConfig(testCase.Distro, testCase.In)
if err != nil {
if testCase.ExpectedErr != "" && testCase.ExpectedErr == err.Error() {
continue
}
t.Run(testCase.Name, func(t *testing.T) {
out, err := MigrateLegacyConfig(testCase.Distro, testCase.In)
if err != nil {
if testCase.ExpectedErr != "" && testCase.ExpectedErr == err.Error() {
return
}

t.Fatalf("Test case %s failed with: %v", testCase.Name, err)
}
t.Fatalf("Test case %s failed with: %v", testCase.Name, err)
}

if strings.TrimSpace(testCase.Expected) != strings.TrimSpace(out) {
t.Log(out)
}
assert.Equal(t, strings.TrimSpace(testCase.Expected), strings.TrimSpace(out), testCase.Name)
if strings.TrimSpace(testCase.Expected) != strings.TrimSpace(out) {
t.Log(out)
}
assert.Equal(t, strings.TrimSpace(testCase.Expected), strings.TrimSpace(out), testCase.Name)
})
}
}
Loading