From f8b4fe9af6a1a49c18910651325e7c09b4ecc510 Mon Sep 17 00:00:00 2001 From: Markus Pesch Date: Fri, 21 Feb 2025 09:51:53 +0100 Subject: [PATCH] fix(dockerCompoe): compare srcIP and srcPort of mergeExistingWinPorts() --- pkg/domain/dockerCompose/config.go | 30 ++++++++++++++++---- pkg/domain/dockerCompose/config_test.go | 37 +++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 6 deletions(-) diff --git a/pkg/domain/dockerCompose/config.go b/pkg/domain/dockerCompose/config.go index e99d062..d2b349e 100644 --- a/pkg/domain/dockerCompose/config.go +++ b/pkg/domain/dockerCompose/config.go @@ -856,15 +856,33 @@ func (s *Service) mergeExistingWinPorts(ports []string) { case s.Ports == nil && ports == nil: return default: - for _, port := range ports { - if len(port) <= 0 { - continue + LOOP: + for i := range ports { + if len(ports[i]) <= 0 { + continue LOOP } - src, dest, protocol := splitStringInPortMapping(port) - if !s.ExistsDestinationPort(dest) { - s.SetPort(src, dest, protocol) + newPort := port(ports[i]) + + for j := range s.Ports { + existingPort := port(s.Ports[j]) + switch { + case newPort.existsSrcIP() && existingPort.existsSrcIP() && + newPort.getSrc() == existingPort.getSrc(): + continue LOOP + case !newPort.existsSrcIP() && existingPort.existsSrcIP() && + newPort.getSrcPort() == existingPort.getSrcPort(): + continue LOOP + case newPort.existsSrcIP() && !existingPort.existsSrcIP() && + newPort.getSrcPort() == existingPort.getSrcPort(): + continue LOOP + case !newPort.existsSrcIP() && !existingPort.existsSrcIP() && + newPort.getSrcPort() == existingPort.getSrcPort(): + continue LOOP + } } + + s.Ports = append(s.Ports, ports[i]) } } } diff --git a/pkg/domain/dockerCompose/config_test.go b/pkg/domain/dockerCompose/config_test.go index efa497d..8448d63 100644 --- a/pkg/domain/dockerCompose/config_test.go +++ b/pkg/domain/dockerCompose/config_test.go @@ -1183,6 +1183,43 @@ func TestService_MergeExistingWin(t *testing.T) { Ports: []string{"80:80"}, }, }, + { + serviceDeploymentA: &dockerCompose.Service{ + Ports: []string{ + "0.0.0.0:15005:5005/tcp", + "0.0.0.0:18080:8080/tcp", + }, + }, + serviceDeploymentB: &dockerCompose.Service{ + Ports: []string{"0.0.0.0:6300:6300/tcp"}, + }, + expectedService: &dockerCompose.Service{ + Ports: []string{ + "0.0.0.0:15005:5005/tcp", + "0.0.0.0:18080:8080/tcp", + "0.0.0.0:6300:6300/tcp", + }, + }, + }, + { + serviceDeploymentA: &dockerCompose.Service{ + Ports: []string{ + "0.0.0.0:15005:5005/tcp", + "0.0.0.0:18080:8080/tcp", + }, + }, + serviceDeploymentB: &dockerCompose.Service{ + Ports: []string{ + "15005:15005", + }, + }, + expectedService: &dockerCompose.Service{ + Ports: []string{ + "0.0.0.0:15005:5005/tcp", + "0.0.0.0:18080:8080/tcp", + }, + }, + }, // Secrets {