From 26c44aba26b2807103c3b5ee5b909dcb0cbf22c4 Mon Sep 17 00:00:00 2001 From: Markus Rudy Date: Tue, 21 May 2024 14:47:08 +0200 Subject: [PATCH] operators: ignore node deletion errors on absence --- .../internal/cloud/aws/client/nodeimage.go | 10 +++++++++- .../internal/cloud/aws/client/nodeimage_test.go | 5 +++++ .../internal/cloud/gcp/client/nodeimage.go | 5 +++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/operators/constellation-node-operator/internal/cloud/aws/client/nodeimage.go b/operators/constellation-node-operator/internal/cloud/aws/client/nodeimage.go index 61d6026ee..602bd8195 100644 --- a/operators/constellation-node-operator/internal/cloud/aws/client/nodeimage.go +++ b/operators/constellation-node-operator/internal/cloud/aws/client/nodeimage.go @@ -9,6 +9,7 @@ package client import ( "context" "fmt" + "strings" "time" "github.com/aws/aws-sdk-go-v2/service/autoscaling" @@ -207,7 +208,7 @@ func (c *Client) DeleteNode(ctx context.Context, providerID string) error { ShouldDecrementDesiredCapacity: toPtr(true), }, ) - if err != nil { + if err != nil && !isInstanceNotFoundError(err) { return fmt.Errorf("failed to terminate instance: %w", err) } @@ -217,3 +218,10 @@ func (c *Client) DeleteNode(ctx context.Context, providerID string) error { func toPtr[T any](v T) *T { return &v } + +func isInstanceNotFoundError(err error) bool { + if err == nil { + return false + } + return strings.Contains(err.Error(), "Instance Id not found") +} \ No newline at end of file diff --git a/operators/constellation-node-operator/internal/cloud/aws/client/nodeimage_test.go b/operators/constellation-node-operator/internal/cloud/aws/client/nodeimage_test.go index 1bae66ec0..d939f2029 100644 --- a/operators/constellation-node-operator/internal/cloud/aws/client/nodeimage_test.go +++ b/operators/constellation-node-operator/internal/cloud/aws/client/nodeimage_test.go @@ -8,6 +8,7 @@ package client import ( "context" + "fmt" "testing" "github.com/aws/aws-sdk-go-v2/service/autoscaling" @@ -382,6 +383,10 @@ func TestDeleteNode(t *testing.T) { terminateInstanceErr: assert.AnError, wantErr: true, }, + "deleting node succeeds when the instance does not exist": { + providerID: "aws:///us-east-2a/i-00000000000000000", + terminateInstanceErr: fmt.Errorf("Instance Id not found - No managed instance found for instance ID: i-00000000000000000"), + }, } for name, tc := range testCases { t.Run(name, func(t *testing.T) { diff --git a/operators/constellation-node-operator/internal/cloud/gcp/client/nodeimage.go b/operators/constellation-node-operator/internal/cloud/gcp/client/nodeimage.go index ddd102d39..321cdfbc1 100644 --- a/operators/constellation-node-operator/internal/cloud/gcp/client/nodeimage.go +++ b/operators/constellation-node-operator/internal/cloud/gcp/client/nodeimage.go @@ -140,6 +140,7 @@ func (c *Client) DeleteNode(ctx context.Context, providerID string) error { Zone: instanceGroupZone, InstanceGroupManagersDeleteInstancesRequestResource: &computepb.InstanceGroupManagersDeleteInstancesRequest{ Instances: []string{instanceID}, + SkipInstancesOnValidationError: toPtr(true), }, }) if err != nil { @@ -147,3 +148,7 @@ func (c *Client) DeleteNode(ctx context.Context, providerID string) error { } return op.Wait(ctx) } + +func toPtr[T any](v T) *T { + return &v +}