Skip to content

Commit eed9810

Browse files
committed
Allow 404 error on lb deletion in azure
When trying to delete a loadbalancer after all resources in azure including the resource group have been deleted we currently get an an error when trying to delete the loadbalancer afterwards because the resource group hasn't been found. Change EnsureLoadBalancerDeleted function to not fail when the resource group has already been deleted.
1 parent e23d83e commit eed9810

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)