Skip to content

Commit 0c233eb

Browse files
authored
Merge pull request kubernetes#93962 from phiphi282/phiphi/fix-azure-delete-lb
Fix deleting loadbalancer after resource group in azure
2 parents dd6c53d + eed9810 commit 0c233eb

File tree

4 files changed

+44
-2
lines changed

4 files changed

+44
-2
lines changed

staging/src/k8s.io/legacy-cloud-providers/azure/azure_loadbalancer.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import (
3636
servicehelpers "k8s.io/cloud-provider/service/helpers"
3737
"k8s.io/klog/v2"
3838
azcache "k8s.io/legacy-cloud-providers/azure/cache"
39+
"k8s.io/legacy-cloud-providers/azure/retry"
3940
utilnet "k8s.io/utils/net"
4041
)
4142

@@ -216,7 +217,7 @@ func (az *Cloud) EnsureLoadBalancerDeleted(ctx context.Context, clusterName stri
216217
klog.V(5).Infof("Delete service (%s): START clusterName=%q", serviceName, clusterName)
217218

218219
serviceIPToCleanup, err := az.findServiceIPAddress(ctx, clusterName, service, isInternal)
219-
if err != nil {
220+
if err != nil && !retry.HasStatusForbiddenOrIgnoredError(err) {
220221
return err
221222
}
222223

@@ -225,7 +226,7 @@ func (az *Cloud) EnsureLoadBalancerDeleted(ctx context.Context, clusterName stri
225226
return err
226227
}
227228

228-
if _, err := az.reconcileLoadBalancer(clusterName, service, nil, false /* wantLb */); err != nil {
229+
if _, err := az.reconcileLoadBalancer(clusterName, service, nil, false /* wantLb */); err != nil && !retry.HasStatusForbiddenOrIgnoredError(err) {
229230
return err
230231
}
231232

staging/src/k8s.io/legacy-cloud-providers/azure/azure_loadbalancer_test.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,7 @@ func TestEnsureLoadBalancerDeleted(t *testing.T) {
366366
service v1.Service
367367
isInternalSvc bool
368368
expectCreateError bool
369+
wrongRGAtDelete bool
369370
}{
370371
{
371372
desc: "external service should be created and deleted successfully",
@@ -385,6 +386,12 @@ func TestEnsureLoadBalancerDeleted(t *testing.T) {
385386
service: getResourceGroupTestService("service4", "random-rg", "1.2.3.4", 80),
386387
expectCreateError: true,
387388
},
389+
{
390+
desc: "annotated service with different resourceGroup shouldn't be created but should be deleted successfully",
391+
service: getResourceGroupTestService("service5", "random-rg", "", 80),
392+
expectCreateError: true,
393+
wrongRGAtDelete: true,
394+
},
388395
}
389396

390397
ctrl := gomock.NewController(t)
@@ -419,6 +426,9 @@ func TestEnsureLoadBalancerDeleted(t *testing.T) {
419426
expectedLBs = make([]network.LoadBalancer, 0)
420427
setMockLBs(az, ctrl, &expectedLBs, "service", 1, i+1, c.isInternalSvc)
421428
// finally, delete it.
429+
if c.wrongRGAtDelete {
430+
az.LoadBalancerResourceGroup = "nil"
431+
}
422432
err = az.EnsureLoadBalancerDeleted(context.TODO(), testClusterName, &c.service)
423433
expectedLBs = make([]network.LoadBalancer, 0)
424434
mockLBsClient := mockloadbalancerclient.NewMockInterface(ctrl)

staging/src/k8s.io/legacy-cloud-providers/azure/retry/azure_error.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,3 +286,20 @@ func IsErrorRetriable(err error) bool {
286286

287287
return strings.Contains(err.Error(), "Retriable: true")
288288
}
289+
290+
// HasStatusForbiddenOrIgnoredError return true if the given error code is part of the error message
291+
// This should only be used when trying to delete resources
292+
func HasStatusForbiddenOrIgnoredError(err error) bool {
293+
if err == nil {
294+
return false
295+
}
296+
297+
if strings.Contains(err.Error(), fmt.Sprintf("HTTPStatusCode: %d", http.StatusNotFound)) {
298+
return true
299+
}
300+
301+
if strings.Contains(err.Error(), fmt.Sprintf("HTTPStatusCode: %d", http.StatusForbidden)) {
302+
return true
303+
}
304+
return false
305+
}

staging/src/k8s.io/legacy-cloud-providers/azure/retry/azure_error_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,3 +352,17 @@ func TestIsErrorRetriable(t *testing.T) {
352352
result = IsErrorRetriable(fmt.Errorf("Retriable: true"))
353353
assert.Equal(t, true, result)
354354
}
355+
356+
func TestHasErrorCode(t *testing.T) {
357+
// false case
358+
result := HasStatusForbiddenOrIgnoredError(fmt.Errorf("HTTPStatusCode: 408"))
359+
assert.False(t, result)
360+
361+
// true case 404
362+
result = HasStatusForbiddenOrIgnoredError(fmt.Errorf("HTTPStatusCode: %d", http.StatusNotFound))
363+
assert.True(t, result)
364+
365+
// true case 403
366+
result = HasStatusForbiddenOrIgnoredError(fmt.Errorf("HTTPStatusCode: %d", http.StatusForbidden))
367+
assert.True(t, result)
368+
}

0 commit comments

Comments
 (0)