From b89709b23e2bea2d9501df4d2ab00b443d5cd2b1 Mon Sep 17 00:00:00 2001 From: Vladislav Sukhin Date: Tue, 21 Jan 2025 16:40:15 +0300 Subject: [PATCH] fix: container causes Signed-off-by: Vladislav Sukhin --- pkg/triggers/diff.go | 65 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 53 insertions(+), 12 deletions(-) diff --git a/pkg/triggers/diff.go b/pkg/triggers/diff.go index 9698e508bb..61d0296eec 100644 --- a/pkg/triggers/diff.go +++ b/pkg/triggers/diff.go @@ -1,8 +1,11 @@ package triggers import ( + "maps" + "github.com/google/go-cmp/cmp" apps_v1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" "github.com/kubeshop/testkube-operator/pkg/validation/tests/v1/testtrigger" ) @@ -13,26 +16,64 @@ func diffDeployments(old, new *apps_v1.Deployment) []testtrigger.Cause { if *old.Spec.Replicas != *new.Spec.Replicas { causes = append(causes, testtrigger.CauseDeploymentScaleUpdate) } - for _, newContainer := range new.Spec.Template.Spec.Containers { - oldContainer := findContainer(old.Spec.Template.Spec.Containers, newContainer.Name) - if oldContainer == nil { - causes = append(causes, testtrigger.CauseDeploymentContainersModified) - continue - } - if oldContainer.Image != newContainer.Image { - causes = append(causes, testtrigger.CauseDeploymentImageUpdate) - } - if !cmp.Equal(oldContainer.Env, newContainer.Env) { - causes = append(causes, testtrigger.CauseDeploymentEnvUpdate) + + containerCauses := append(diffContainers(old.Spec.Template.Spec.InitContainers, new.Spec.Template.Spec.InitContainers), + diffContainers(old.Spec.Template.Spec.Containers, new.Spec.Template.Spec.Containers)...) + + unique := make(map[testtrigger.Cause]struct{}) + for _, containerCause := range containerCauses { + if _, ok := unique[containerCause]; !ok { + unique[containerCause] = struct{}{} + causes = append(causes, containerCause) } - break } + if old.Generation != new.Generation { causes = append(causes, testtrigger.CauseDeploymentGenerationModified) } + if old.ResourceVersion != new.ResourceVersion { causes = append(causes, testtrigger.CauseDeploymentResourceModified) } return causes } + +func diffContainers(old, new []corev1.Container) []testtrigger.Cause { + var causes []testtrigger.Cause + oldNames := make(map[string]struct{}) + oldContainers := make(map[string]corev1.Container) + for _, o := range old { + oldNames[o.Name] = struct{}{} + oldContainers[o.Name] = o + } + + newNames := make(map[string]struct{}) + newContainers := make(map[string]corev1.Container) + for _, n := range new { + newNames[n.Name] = struct{}{} + newContainers[n.Name] = n + } + + if !maps.Equal(oldNames, newNames) { + causes = append(causes, testtrigger.CauseDeploymentContainersModified) + } + + for name, newContainer := range newContainers { + if oldContainer, ok := oldContainers[name]; ok { + if !cmp.Equal(oldContainer, newContainer) { + causes = append(causes, testtrigger.CauseDeploymentContainersModified) + } + + if oldContainer.Image != newContainer.Image { + causes = append(causes, testtrigger.CauseDeploymentImageUpdate) + } + + if !cmp.Equal(oldContainer.Env, newContainer.Env) { + causes = append(causes, testtrigger.CauseDeploymentEnvUpdate) + } + } + } + + return causes +}