From 0995ef573f85c811711ef60dcd7431c0a2372a04 Mon Sep 17 00:00:00 2001 From: Elena Morozova Date: Wed, 18 Dec 2019 16:14:24 -0800 Subject: [PATCH] Fix ensureStaticIP if name for existed address was changed It might happend when we change external IP address from ephemeral to static and give it a custom name. In this case GetRegionAddress with given name will return Not Found --- .../gce/gce_loadbalancer_external.go | 12 ++++++++++++ .../gce/gce_loadbalancer_external_test.go | 7 +++++++ 2 files changed, 19 insertions(+) diff --git a/staging/src/k8s.io/legacy-cloud-providers/gce/gce_loadbalancer_external.go b/staging/src/k8s.io/legacy-cloud-providers/gce/gce_loadbalancer_external.go index f8a7074c022..7fb9ce22c7a 100644 --- a/staging/src/k8s.io/legacy-cloud-providers/gce/gce_loadbalancer_external.go +++ b/staging/src/k8s.io/legacy-cloud-providers/gce/gce_loadbalancer_external.go @@ -1060,6 +1060,18 @@ func ensureStaticIP(s CloudAddressService, name, serviceName, region, existingIP existed = true } + // If address exists, get it by IP, because name might be different. + // This can specifically happen if the IP was changed from ephemeral to static, + // which results in a new name for the IP. + if existingIP != "" { + addr, err := s.GetRegionAddressByIP(region, existingIP) + if err != nil { + return "", false, fmt.Errorf("error getting static IP address: %v", err) + } + return addr.Address, existed, nil + } + + // Otherwise, get address by name addr, err := s.GetRegionAddress(name, region) if err != nil { return "", false, fmt.Errorf("error getting static IP address: %v", err) diff --git a/staging/src/k8s.io/legacy-cloud-providers/gce/gce_loadbalancer_external_test.go b/staging/src/k8s.io/legacy-cloud-providers/gce/gce_loadbalancer_external_test.go index 59a25f9772c..ef50ca68a63 100644 --- a/staging/src/k8s.io/legacy-cloud-providers/gce/gce_loadbalancer_external_test.go +++ b/staging/src/k8s.io/legacy-cloud-providers/gce/gce_loadbalancer_external_test.go @@ -63,6 +63,13 @@ func TestEnsureStaticIP(t *testing.T) { if err != nil || !existed || ip != ipPrime { t.Fatalf(`ensureStaticIP(%v, %v, %v, %v, %v) = %v, %v, %v; want %v, true, nil`, gce, ipName, serviceName, gce.region, ip, ipPrime, existed, err, ip) } + + // Ensure call with different name + ipName = "another-name-for-static-ip" + ipPrime, existed, err = ensureStaticIP(gce, ipName, serviceName, gce.region, ip, cloud.NetworkTierDefault) + if err != nil || !existed || ip != ipPrime { + t.Fatalf(`ensureStaticIP(%v, %v, %v, %v, %v) = %v, %v, %v; want %v, true, nil`, gce, ipName, serviceName, gce.region, ip, ipPrime, existed, err, ip) + } } func TestEnsureStaticIPWithTier(t *testing.T) {