diff --git a/controllers/instance/statefulset.go b/controllers/instance/statefulset.go index 8ff5819..7b2dadd 100644 --- a/controllers/instance/statefulset.go +++ b/controllers/instance/statefulset.go @@ -301,10 +301,6 @@ func compileEnvVars(instance *proxyv1alpha1.Instance) []corev1.EnvVar { for k, v := range instance.Spec.Env { envVars = append(envVars, corev1.EnvVar{Name: k, Value: v}) } - - sort.Slice(envVars, func(i, j int) bool { - return envVars[i].Name < envVars[j].Name - }) return envVars } @@ -312,10 +308,27 @@ func needsUpdate(oldStatefulSet, newStatefulSet *appsv1.StatefulSet) bool { oldCpy := oldStatefulSet.DeepCopy() newCpy := newStatefulSet.DeepCopy() + normalizeEnvs(oldCpy) + normalizeEnvs(newCpy) + removeIrrelevantProperties(oldCpy) removeIrrelevantProperties(newCpy) - return !equality.Semantic.DeepEqual(oldCpy.Spec, newCpy.Spec) || !equality.Semantic.DeepEqual(oldCpy.OwnerReferences, newCpy.OwnerReferences) + return !equality.Semantic.DeepEqual(oldCpy.Spec, newCpy.Spec) || + !equality.Semantic.DeepEqual(oldCpy.OwnerReferences, newCpy.OwnerReferences) +} + +func normalizeEnvs(statefulSet *appsv1.StatefulSet) { + for ii := range statefulSet.Spec.Template.Spec.Containers { + sort.Slice(statefulSet.Spec.Template.Spec.Containers[ii].Env, func(i, j int) bool { + return statefulSet.Spec.Template.Spec.Containers[ii].Env[i].Name < statefulSet.Spec.Template.Spec.Containers[ii].Env[j].Name + }) + } + for ii := range statefulSet.Spec.Template.Spec.InitContainers { + sort.Slice(statefulSet.Spec.Template.Spec.InitContainers[ii].Env, func(i, j int) bool { + return statefulSet.Spec.Template.Spec.InitContainers[ii].Env[i].Name < statefulSet.Spec.Template.Spec.InitContainers[ii].Env[j].Name + }) + } } func removeIrrelevantProperties(ss *appsv1.StatefulSet) { diff --git a/controllers/instance/statefulset_test.go b/controllers/instance/statefulset_test.go index 4fbb634..447d36a 100644 --- a/controllers/instance/statefulset_test.go +++ b/controllers/instance/statefulset_test.go @@ -61,6 +61,10 @@ var _ = Describe("Reconcile", Label("controller"), func() { }, }, Labels: labels, + Env: map[string]string{ + "WATCH_PATH": "/a/b", + "SHUTDOWN_WAIT": "15m", + }, }, } @@ -87,6 +91,7 @@ var _ = Describe("Reconcile", Label("controller"), func() { " then echo 'timeout waiting for IP 10.158.182.27, aborting'\n exit 1\n fi\n echo 'waiting for IP 10.158.182.27 to be assigned...'\n" + " sleep 5\n done\n\n echo 'IP 10.158.182.27 assignment verified, waiting 5 seconds before continuing...'\n\n" + " sleep 5\n\n echo -n \"BIND_ADDRESS=10.158.182.27\" > /var/lib/haproxy/run/env\n cat /var/lib/haproxy/run/env\n exit 0\nfi\n\nexit 1\n")) + Ω(statefulSet.Spec.Template.Spec.Containers[0].Env).Should(HaveLen(4)) }) It("update only on spec change", func() {