Skip to content

Commit 74f1943

Browse files
author
Kubernetes Submit Queue
authored
Merge pull request #48849 from nicksardo/gce-panic-fix
Automatic merge from submit-queue (batch tested with PRs 48555, 48849) GCE: Fix panic when service loadbalancer has static IP address Fixes #48848 ```release-note Fix service controller crash loop when Service with GCP LoadBalancer uses static IP (#48848, @nicksardo) ```
2 parents 009858f + 98368d9 commit 74f1943

File tree

3 files changed

+21
-21
lines changed

3 files changed

+21
-21
lines changed

pkg/cloudprovider/providers/gce/gce_addresses.go

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,13 @@ func newAddressMetricContext(request, region string) *metricContext {
3333
// Caller is allocated a random IP if they do not specify an ipAddress. If an
3434
// ipAddress is specified, it must belong to the current project, eg: an
3535
// ephemeral IP associated with a global forwarding rule.
36-
func (gce *GCECloud) ReserveGlobalAddress(addr *compute.Address) (*compute.Address, error) {
36+
func (gce *GCECloud) ReserveGlobalAddress(addr *compute.Address) error {
3737
mc := newAddressMetricContext("reserve", "")
3838
op, err := gce.service.GlobalAddresses.Insert(gce.projectID, addr).Do()
3939
if err != nil {
40-
return nil, mc.Observe(err)
41-
}
42-
43-
if err := gce.waitForGlobalOp(op, mc); err != nil {
44-
return nil, err
40+
return mc.Observe(err)
4541
}
46-
47-
return gce.GetGlobalAddress(addr.Name)
42+
return gce.waitForGlobalOp(op, mc)
4843
}
4944

5045
// DeleteGlobalAddress deletes a global address by name.
@@ -65,17 +60,13 @@ func (gce *GCECloud) GetGlobalAddress(name string) (*compute.Address, error) {
6560
}
6661

6762
// ReserveRegionAddress creates a region address
68-
func (gce *GCECloud) ReserveRegionAddress(addr *compute.Address, region string) (*compute.Address, error) {
63+
func (gce *GCECloud) ReserveRegionAddress(addr *compute.Address, region string) error {
6964
mc := newAddressMetricContext("reserve", region)
7065
op, err := gce.service.Addresses.Insert(gce.projectID, region, addr).Do()
7166
if err != nil {
72-
return nil, mc.Observe(err)
73-
}
74-
if err := gce.waitForRegionOp(op, region, mc); err != nil {
75-
return nil, err
67+
return mc.Observe(err)
7668
}
77-
78-
return gce.GetRegionAddress(addr.Name, region)
69+
return gce.waitForRegionOp(op, region, mc)
7970
}
8071

8172
// DeleteRegionAddress deletes a region address by name.

pkg/cloudprovider/providers/gce/gce_loadbalancer_external.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -921,14 +921,18 @@ func (gce *GCECloud) ensureStaticIP(name, serviceName, region, existingIP string
921921
addressObj.Address = existingIP
922922
}
923923

924-
address, err := gce.ReserveRegionAddress(addressObj, region)
925-
if err != nil {
924+
if err = gce.ReserveRegionAddress(addressObj, region); err != nil {
926925
if !isHTTPErrorCode(err, http.StatusConflict) {
927926
return "", false, fmt.Errorf("error creating gce static IP address: %v", err)
928927
}
929928
// StatusConflict == the IP exists already.
930929
existed = true
931930
}
932931

933-
return address.Address, existed, nil
932+
addr, err := gce.GetRegionAddress(name, region)
933+
if err != nil {
934+
return "", false, fmt.Errorf("error getting static IP address: %v", err)
935+
}
936+
937+
return addr.Address, existed, nil
934938
}

test/e2e/framework/ingress_utils.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -715,17 +715,22 @@ func (cont *GCEIngressController) Init() {
715715
func (cont *GCEIngressController) CreateStaticIP(name string) string {
716716
gceCloud := cont.Cloud.Provider.(*gcecloud.GCECloud)
717717
addr := &compute.Address{Name: name}
718-
ip, err := gceCloud.ReserveGlobalAddress(addr)
719-
if err != nil {
718+
if err := gceCloud.ReserveGlobalAddress(addr); err != nil {
720719
if delErr := gceCloud.DeleteGlobalAddress(name); delErr != nil {
721720
if cont.isHTTPErrorCode(delErr, http.StatusNotFound) {
722721
Logf("Static ip with name %v was not allocated, nothing to delete", name)
723722
} else {
724723
Logf("Failed to delete static ip %v: %v", name, delErr)
725724
}
726725
}
727-
Failf("Failed to allocated static ip %v: %v", name, err)
726+
Failf("Failed to allocate static ip %v: %v", name, err)
728727
}
728+
729+
ip, err := gceCloud.GetGlobalAddress(name)
730+
if err != nil {
731+
Failf("Failed to get newly created static ip %v: %v", name, err)
732+
}
733+
729734
cont.staticIPName = ip.Name
730735
Logf("Reserved static ip %v: %v", cont.staticIPName, ip.Address)
731736
return ip.Address

0 commit comments

Comments
 (0)