From 2d923380a3f43fa7838779e0ad9b06d96b183288 Mon Sep 17 00:00:00 2001 From: Pavel Sviderski Date: Mon, 24 Mar 2025 20:24:40 +1000 Subject: [PATCH] chore: compare container ports to spec in assertContainerMatchesSpec --- pkg/api/port.go | 29 +++++++++++++++++++++++++++++ pkg/client/deploy/container.go | 12 ++++++++++-- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/pkg/api/port.go b/pkg/api/port.go index 7a3cf22c..b552b88e 100644 --- a/pkg/api/port.go +++ b/pkg/api/port.go @@ -3,6 +3,7 @@ package api import ( "fmt" "net/netip" + "slices" "strconv" "strings" ) @@ -261,3 +262,31 @@ func validateHostname(hostname string) error { } return nil } + +// PortsEqual returns true if the two port sets are equal. The order of the ports is not important. +func PortsEqual(a, b []PortSpec) bool { + if len(a) != len(b) { + return false + } + + var err error + aSerialised := make([]string, len(a)) + bSerialised := make([]string, len(b)) + + for i := range a { + aSerialised[i], err = a[i].String() + if err != nil { + return false + } + + bSerialised[i], err = b[i].String() + if err != nil { + return false + } + } + + slices.Sort(aSerialised) + slices.Sort(bSerialised) + + return slices.Equal(aSerialised, bSerialised) +} diff --git a/pkg/client/deploy/container.go b/pkg/client/deploy/container.go index 1ed0fd59..51853f92 100644 --- a/pkg/client/deploy/container.go +++ b/pkg/client/deploy/container.go @@ -24,8 +24,16 @@ func CompareContainerToSpec(ctr api.Container, spec api.ServiceSpec) (ContainerS } // TODO: compare mutable properties such as memory or CPU limits when they are implemented. - - // TODO: compare ports + + // TODO: remove ports check when ports are stored in the local machine store instead of as labels. + ports, err := ctr.ServicePorts() + if err != nil { + return "", fmt.Errorf("get service ports: %w", err) + } + + if !api.PortsEqual(ports, spec.Ports) { + return ContainerNeedsRecreate, nil + } return ContainerUpToDate, nil }