From 72178c90ba0e9567b2be811adbbe4b24a6dc8903 Mon Sep 17 00:00:00 2001 From: Rory <16801068+Rory-Z@users.noreply.github.com> Date: Tue, 9 Jan 2024 00:05:25 +0800 Subject: [PATCH] fix: fix always update svc (#995) when svc type is nodePort or loadBalancer, the svc will always update fix https://github.com/emqx/emqx-operator/issues/982 Signed-off-by: Rory Z <16801068+Rory-Z@users.noreply.github.com> --- internal/handler/handler.go | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/internal/handler/handler.go b/internal/handler/handler.go index c64f2cca0..049f1a566 100644 --- a/internal/handler/handler.go +++ b/internal/handler/handler.go @@ -114,9 +114,26 @@ func (handler *Handler) CreateOrUpdate(ctx context.Context, scheme *runtime.Sche return err } // Required fields when updating service in k8s 1.21 - if storageResource.Spec.ClusterIP != "" { - resource.Spec.ClusterIP = storageResource.Spec.ClusterIP + if resource.Spec.Type == "" || resource.Spec.Type == corev1.ServiceTypeClusterIP { + if storageResource.Spec.ClusterIP != "" { + resource.Spec.ClusterIP = storageResource.Spec.ClusterIP + } } + // If nodePort is not set, will always update service + if resource.Spec.Type == corev1.ServiceTypeNodePort || resource.Spec.Type == corev1.ServiceTypeLoadBalancer { + nodePortMap := make(map[string]int32) + for _, port := range storageResource.Spec.Ports { + nodePortMap[port.Name] = port.NodePort + } + for i, port := range resource.Spec.Ports { + if port.NodePort == 0 { + if nodePort, ok := nodePortMap[port.Name]; ok { + resource.Spec.Ports[i].NodePort = nodePort + } + } + } + } + obj = resource }