From 990d4b765391788b09ea161a9188a2150659cd20 Mon Sep 17 00:00:00 2001 From: ajanikow <12255597+ajanikow@users.noreply.github.com> Date: Thu, 30 Jul 2020 08:56:35 +0000 Subject: [PATCH 1/3] Do not rotate more than one member in single plan execution --- pkg/deployment/reconcile/plan_builder_rotate_upgrade.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pkg/deployment/reconcile/plan_builder_rotate_upgrade.go b/pkg/deployment/reconcile/plan_builder_rotate_upgrade.go index eba20009e..a6d8909bd 100644 --- a/pkg/deployment/reconcile/plan_builder_rotate_upgrade.go +++ b/pkg/deployment/reconcile/plan_builder_rotate_upgrade.go @@ -136,6 +136,11 @@ func createRotateOrUpgradePlanInternal(log zerolog.Logger, apiObject k8sutil.API continue } + if !newPlan.IsEmpty() { + // Only rotate/upgrade 1 pod at a time + continue + } + pod, found := cachedStatus.Pod(m.PodName) if !found { continue From 7fcd16b070d931abd2accd1d721c58f8c0d0e19c Mon Sep 17 00:00:00 2001 From: ajanikow <12255597+ajanikow@users.noreply.github.com> Date: Fri, 31 Jul 2020 06:11:41 +0000 Subject: [PATCH 2/3] Fix NodeAffinity --- CHANGELOG.md | 1 + pkg/deployment/pod/affinity.go | 25 ++++++++++++++----- .../reconcile/plan_builder_rotate_upgrade.go | 5 ---- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cb88034f1..197fcb7e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - Add Labels and Annotations to ServiceMonitor - Allow to expose Exporter in HTTP with secured Deployments - Change rotation by annotation order (coordinator before dbserver) +- Fix NodeAffinity propagation ## [1.0.4](https://github.com/arangodb/kube-arangodb/tree/1.0.4) (2020-07-28) - Add Encryption Key rotation feature for ArangoDB EE 3.7+ diff --git a/pkg/deployment/pod/affinity.go b/pkg/deployment/pod/affinity.go index bcdd9e158..277767987 100644 --- a/pkg/deployment/pod/affinity.go +++ b/pkg/deployment/pod/affinity.go @@ -124,15 +124,28 @@ func MergeNodeAffinity(a, b *core.NodeAffinity) { a.PreferredDuringSchedulingIgnoredDuringExecution = append(a.PreferredDuringSchedulingIgnoredDuringExecution, rule) } - if b.RequiredDuringSchedulingIgnoredDuringExecution != nil { - if a.RequiredDuringSchedulingIgnoredDuringExecution == nil { - a.RequiredDuringSchedulingIgnoredDuringExecution = b.RequiredDuringSchedulingIgnoredDuringExecution.DeepCopy() - } else { - for _, rule := range b.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms { - a.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms = append(a.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms, rule) + var newSelectorTerms []core.NodeSelectorTerm + + if b.RequiredDuringSchedulingIgnoredDuringExecution == nil || len(b.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms) == 0 { + newSelectorTerms = a.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms + } else if a.RequiredDuringSchedulingIgnoredDuringExecution == nil || len(a.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms) == 0 { + newSelectorTerms = b.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms + } else { + for _, aTerms := range a.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms { + for _, bTerms := range b.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms { + term := aTerms.DeepCopy() + if len(bTerms.MatchExpressions) != 0 { + term.MatchExpressions = append(term.MatchExpressions, bTerms.MatchExpressions...) + } + if len(bTerms.MatchFields) != 0 { + term.MatchFields = append(term.MatchFields, bTerms.MatchFields...) + } + newSelectorTerms = append(newSelectorTerms, *term) } } } + + a.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms = newSelectorTerms } func ReturnPodAffinityOrNil(a core.PodAffinity) *core.PodAffinity { diff --git a/pkg/deployment/reconcile/plan_builder_rotate_upgrade.go b/pkg/deployment/reconcile/plan_builder_rotate_upgrade.go index a6d8909bd..eba20009e 100644 --- a/pkg/deployment/reconcile/plan_builder_rotate_upgrade.go +++ b/pkg/deployment/reconcile/plan_builder_rotate_upgrade.go @@ -136,11 +136,6 @@ func createRotateOrUpgradePlanInternal(log zerolog.Logger, apiObject k8sutil.API continue } - if !newPlan.IsEmpty() { - // Only rotate/upgrade 1 pod at a time - continue - } - pod, found := cachedStatus.Pod(m.PodName) if !found { continue From db2adcef404130d7f102005c039cf31d8470481c Mon Sep 17 00:00:00 2001 From: ajanikow <12255597+ajanikow@users.noreply.github.com> Date: Fri, 31 Jul 2020 09:35:48 +0000 Subject: [PATCH 3/3] Fix IT --- pkg/deployment/deployment_affinity_test.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/pkg/deployment/deployment_affinity_test.go b/pkg/deployment/deployment_affinity_test.go index 5badcda80..5b6610f1e 100644 --- a/pkg/deployment/deployment_affinity_test.go +++ b/pkg/deployment/deployment_affinity_test.go @@ -673,14 +673,15 @@ func TestEnsurePod_ArangoDB_NodeAffinity(t *testing.T) { Subdomain: testDeploymentName + "-int", Affinity: modifyAffinity(testDeploymentName, api.ServerGroupDBServersString, false, "", func(a *core.Affinity) { - n := core.NodeSelectorTerm{ - MatchFields: []core.NodeSelectorRequirement{ - { - Key: "key", - }, + f := a.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms[0] + + f.MatchFields = []core.NodeSelectorRequirement{ + { + Key: "key", }, } - a.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms = append(a.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms, n) + + a.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms[0] = f }), }, },