diff --git a/pkg/destroy/gcp/address.go b/pkg/destroy/gcp/address.go index 19293430ce..68d5bdaf59 100644 --- a/pkg/destroy/gcp/address.go +++ b/pkg/destroy/gcp/address.go @@ -90,18 +90,8 @@ func (o *ClusterUninstaller) deleteAddress(ctx context.Context, item cloudResour return fmt.Errorf("invalid address type %q", item.typeName) } - if err != nil && !isNoOp(err) { - o.resetRequestID(item.typeName, item.name) - return fmt.Errorf("failed to delete address %s: %w", item.name, err) - } - if op != nil && op.Status == "DONE" && isErrorStatus(op.HttpErrorStatusCode) { - o.resetRequestID(item.typeName, item.name) - return fmt.Errorf("failed to delete address %s with error: %s", item.name, operationErrorMessage(op)) - } - if (err != nil && isNoOp(err)) || (op != nil && op.Status == "DONE") { - o.resetRequestID(item.typeName, item.name) - o.deletePendingItems(item.typeName, []cloudResource{item}) - o.Logger.Infof("Deleted address %s", item.name) + if err = o.handleOperation(op, err, item, "address"); err != nil { + return err } return nil } diff --git a/pkg/destroy/gcp/backendservice.go b/pkg/destroy/gcp/backendservice.go index 82c1c46bfb..1cf71e8195 100644 --- a/pkg/destroy/gcp/backendservice.go +++ b/pkg/destroy/gcp/backendservice.go @@ -85,18 +85,8 @@ func (o *ClusterUninstaller) deleteBackendService(ctx context.Context, item clou return fmt.Errorf("invalid backend service type %q", item.typeName) } - if err != nil && !isNoOp(err) { - o.resetRequestID(item.typeName, item.name) - return fmt.Errorf("failed to delete backend service %s: %w", item.name, err) - } - if op != nil && op.Status == "DONE" && isErrorStatus(op.HttpErrorStatusCode) { - o.resetRequestID(item.typeName, item.name) - return fmt.Errorf("failed to delete backend service %s with error: %s", item.name, operationErrorMessage(op)) - } - if (err != nil && isNoOp(err)) || (op != nil && op.Status == "DONE") { - o.resetRequestID(item.typeName, item.name) - o.deletePendingItems(item.typeName, []cloudResource{item}) - o.Logger.Infof("Deleted backend service %s", item.name) + if err = o.handleOperation(op, err, item, "backend service"); err != nil { + return err } return nil } diff --git a/pkg/destroy/gcp/disk.go b/pkg/destroy/gcp/disk.go index 5320067cb8..93de7f3bb2 100644 --- a/pkg/destroy/gcp/disk.go +++ b/pkg/destroy/gcp/disk.go @@ -124,18 +124,8 @@ func (o *ClusterUninstaller) deleteDisk(ctx context.Context, item cloudResource) ctx, cancel := context.WithTimeout(ctx, defaultTimeout) defer cancel() op, err := o.computeSvc.Disks.Delete(o.ProjectID, item.zone, item.name).RequestId(o.requestID(item.typeName, item.zone, item.name)).Context(ctx).Do() - if err != nil && !isNoOp(err) { - o.resetRequestID(item.typeName, item.zone, item.name) - return errors.Wrapf(err, "failed to delete disk %s in zone %s", item.name, item.zone) - } - if op != nil && op.Status == "DONE" && isErrorStatus(op.HttpErrorStatusCode) { - o.resetRequestID(item.typeName, item.zone, item.name) - return errors.Errorf("failed to delete disk %s in zone %s with error: %s", item.name, item.zone, operationErrorMessage(op)) - } - if (err != nil && isNoOp(err)) || (op != nil && op.Status == "DONE") { - o.resetRequestID(item.typeName, item.name) - o.deletePendingItems(item.typeName, []cloudResource{item}) - o.Logger.Infof("Deleted disk %s", item.name) + if err = o.handleOperation(op, err, item, "disk"); err != nil { + return err } return nil } diff --git a/pkg/destroy/gcp/firewall.go b/pkg/destroy/gcp/firewall.go index 83ea15757d..a4d94b697e 100644 --- a/pkg/destroy/gcp/firewall.go +++ b/pkg/destroy/gcp/firewall.go @@ -89,18 +89,8 @@ func (o *ClusterUninstaller) deleteFirewall(ctx context.Context, item cloudResou ctx, cancel := context.WithTimeout(ctx, defaultTimeout) defer cancel() op, err := o.computeSvc.Firewalls.Delete(item.project, item.name).RequestId(o.requestID(item.typeName, item.name)).Context(ctx).Do() - if err != nil && !isNoOp(err) { - o.resetRequestID(item.typeName, item.name) - return errors.Wrapf(err, "failed to delete firewall %s", item.name) - } - if op != nil && op.Status == "DONE" && isErrorStatus(op.HttpErrorStatusCode) { - o.resetRequestID(item.typeName, item.name) - return errors.Errorf("failed to delete firewall %s with error: %s", item.name, operationErrorMessage(op)) - } - if (err != nil && isNoOp(err)) || (op != nil && op.Status == "DONE") { - o.resetRequestID(item.typeName, item.name) - o.deletePendingItems(item.typeName, []cloudResource{item}) - o.Logger.Infof("Deleted firewall rule %s", item.name) + if err = o.handleOperation(op, err, item, "firewall"); err != nil { + return err } return nil } diff --git a/pkg/destroy/gcp/forwardingrule.go b/pkg/destroy/gcp/forwardingrule.go index 7a19a4a2bb..c6dcfcb474 100644 --- a/pkg/destroy/gcp/forwardingrule.go +++ b/pkg/destroy/gcp/forwardingrule.go @@ -92,18 +92,8 @@ func (o *ClusterUninstaller) deleteForwardingRule(ctx context.Context, item clou return fmt.Errorf("invalid forwarding rule type %q", item.typeName) } - if err != nil && !isNoOp(err) { - o.resetRequestID(item.typeName, item.name) - return fmt.Errorf("failed to delete forwarding rule %s: %w", item.name, err) - } - if op != nil && op.Status == "DONE" && isErrorStatus(op.HttpErrorStatusCode) { - o.resetRequestID(item.typeName, item.name) - return fmt.Errorf("failed to delete forwarding rule %s with error: %s", item.name, operationErrorMessage(op)) - } - if (err != nil && isNoOp(err)) || (op != nil && op.Status == "DONE") { - o.resetRequestID(item.typeName, item.name) - o.deletePendingItems(item.typeName, []cloudResource{item}) - o.Logger.Infof("Deleted forwarding rule %s", item.name) + if err = o.handleOperation(op, err, item, "forwarding rule"); err != nil { + return err } return nil } diff --git a/pkg/destroy/gcp/gcp.go b/pkg/destroy/gcp/gcp.go index 87e34695ff..ec142c8106 100644 --- a/pkg/destroy/gcp/gcp.go +++ b/pkg/destroy/gcp/gcp.go @@ -399,3 +399,25 @@ func operationErrorMessage(op *compute.Operation) string { } return strings.Join(errs, ", ") } + +func (o *ClusterUninstaller) handleOperation(op *compute.Operation, err error, item cloudResource, resourceType string) error { + identifier := []string{item.typeName, item.name} + if item.zone != "" { + identifier = []string{item.typeName, item.zone, item.name} + } + + if err != nil && !isNoOp(err) { + o.resetRequestID(identifier...) + return fmt.Errorf("failed to delete %s %s: %w", resourceType, item.name, err) + } + if op != nil && op.Status == "DONE" && isErrorStatus(op.HttpErrorStatusCode) { + o.resetRequestID(identifier...) + return fmt.Errorf("failed to delete %s %s with error: %s", resourceType, item.name, operationErrorMessage(op)) + } + if (err != nil && isNoOp(err)) || (op != nil && op.Status == "DONE") { + o.resetRequestID(identifier...) + o.deletePendingItems(item.typeName, []cloudResource{item}) + o.Logger.Infof("Deleted %s %s", resourceType, item.name) + } + return nil +} diff --git a/pkg/destroy/gcp/healthcheck.go b/pkg/destroy/gcp/healthcheck.go index 2f17cddb0d..3d7f1a3fff 100644 --- a/pkg/destroy/gcp/healthcheck.go +++ b/pkg/destroy/gcp/healthcheck.go @@ -84,18 +84,8 @@ func (o *ClusterUninstaller) deleteHealthCheck(ctx context.Context, item cloudRe return fmt.Errorf("invalid health check type %q", item.typeName) } - if err != nil && !isNoOp(err) { - o.resetRequestID(item.typeName, item.name) - return fmt.Errorf("failed to delete health check %s: %w", item.name, err) - } - if op != nil && op.Status == "DONE" && isErrorStatus(op.HttpErrorStatusCode) { - o.resetRequestID(item.typeName, item.name) - return fmt.Errorf("failed to delete health check %s with error: %s", item.name, operationErrorMessage(op)) - } - if (err != nil && isNoOp(err)) || (op != nil && op.Status == "DONE") { - o.resetRequestID(item.typeName, item.name) - o.deletePendingItems(item.typeName, []cloudResource{item}) - o.Logger.Infof("Deleted health check %s", item.name) + if err = o.handleOperation(op, err, item, "health check"); err != nil { + return err } return nil } diff --git a/pkg/destroy/gcp/httphealthcheck.go b/pkg/destroy/gcp/httphealthcheck.go index cd498fd467..bafbfb578c 100644 --- a/pkg/destroy/gcp/httphealthcheck.go +++ b/pkg/destroy/gcp/httphealthcheck.go @@ -60,18 +60,8 @@ func (o *ClusterUninstaller) deleteHTTPHealthCheck(ctx context.Context, item clo ctx, cancel := context.WithTimeout(ctx, defaultTimeout) defer cancel() op, err := o.computeSvc.HttpHealthChecks.Delete(o.ProjectID, item.name).RequestId(o.requestID(item.typeName, item.name)).Context(ctx).Do() - if err != nil && !isNoOp(err) { - o.resetRequestID(item.typeName, item.name) - return errors.Wrapf(err, "failed to delete HTTP health check %s", item.name) - } - if op != nil && op.Status == "DONE" && isErrorStatus(op.HttpErrorStatusCode) { - o.resetRequestID(item.typeName, item.name) - return errors.Errorf("failed to delete HTTP health check %s with error: %s", item.name, operationErrorMessage(op)) - } - if (err != nil && isNoOp(err)) || (op != nil && op.Status == "DONE") { - o.resetRequestID(item.typeName, item.name) - o.deletePendingItems(item.typeName, []cloudResource{item}) - o.Logger.Infof("Deleted HTTP health check %s", item.name) + if err = o.handleOperation(op, err, item, "HTTP health check"); err != nil { + return err } return nil } diff --git a/pkg/destroy/gcp/image.go b/pkg/destroy/gcp/image.go index 62b87ed764..40e031a3cb 100644 --- a/pkg/destroy/gcp/image.go +++ b/pkg/destroy/gcp/image.go @@ -59,18 +59,8 @@ func (o *ClusterUninstaller) deleteImage(ctx context.Context, item cloudResource ctx, cancel := context.WithTimeout(ctx, defaultTimeout) defer cancel() op, err := o.computeSvc.Images.Delete(o.ProjectID, item.name).Context(ctx).RequestId(o.requestID(item.typeName, item.name)).Do() - if err != nil && !isNoOp(err) { - o.resetRequestID(item.typeName, item.name) - return errors.Wrapf(err, "failed to delete image %s", item.name) - } - if op != nil && op.Status == "DONE" && isErrorStatus(op.HttpErrorStatusCode) { - o.resetRequestID(item.typeName, item.name) - return errors.Errorf("failed to delete image %s with error: %s", item.name, operationErrorMessage(op)) - } - if (err != nil && isNoOp(err)) || (op != nil && op.Status == "DONE") { - o.resetRequestID(item.typeName, item.name) - o.deletePendingItems(item.typeName, []cloudResource{item}) - o.Logger.Infof("Deleted image %s", item.name) + if err = o.handleOperation(op, err, item, "image"); err != nil { + return err } return nil } diff --git a/pkg/destroy/gcp/instance.go b/pkg/destroy/gcp/instance.go index 055cf407fa..2894dbc1c1 100644 --- a/pkg/destroy/gcp/instance.go +++ b/pkg/destroy/gcp/instance.go @@ -106,18 +106,8 @@ func (o *ClusterUninstaller) deleteInstance(ctx context.Context, item cloudResou ctx, cancel := context.WithTimeout(ctx, defaultTimeout) defer cancel() op, err := o.computeSvc.Instances.Delete(o.ProjectID, item.zone, item.name).RequestId(o.requestID(item.typeName, item.zone, item.name)).Context(ctx).Do() - if err != nil && !isNoOp(err) { - o.resetRequestID(item.typeName, item.zone, item.name) - return errors.Wrapf(err, "failed to delete instance %s in zone %s", item.name, item.zone) - } - if op != nil && op.Status == "DONE" && isErrorStatus(op.HttpErrorStatusCode) { - o.resetRequestID(item.typeName, item.zone, item.name) - return errors.Errorf("failed to delete instance %s in zone %s with error: %s", item.name, item.zone, operationErrorMessage(op)) - } - if (err != nil && isNoOp(err)) || (op != nil && op.Status == "DONE") { - o.resetRequestID(item.typeName, item.name) - o.deletePendingItems(item.typeName, []cloudResource{item}) - o.Logger.Infof("Deleted instance %s", item.name) + if err = o.handleOperation(op, err, item, "instance"); err != nil { + return err } return nil } diff --git a/pkg/destroy/gcp/instancegroup.go b/pkg/destroy/gcp/instancegroup.go index 20e1e42484..43696fc519 100644 --- a/pkg/destroy/gcp/instancegroup.go +++ b/pkg/destroy/gcp/instancegroup.go @@ -68,18 +68,8 @@ func (o *ClusterUninstaller) deleteInstanceGroup(ctx context.Context, item cloud ctx, cancel := context.WithTimeout(ctx, defaultTimeout) defer cancel() op, err := o.computeSvc.InstanceGroups.Delete(o.ProjectID, item.zone, item.name).RequestId(o.requestID(item.typeName, item.zone, item.name)).Context(ctx).Do() - if err != nil && !isNoOp(err) { - o.resetRequestID(item.typeName, item.zone, item.name) - return errors.Wrapf(err, "failed to delete instance group %s in zone %s", item.name, item.zone) - } - if op != nil && op.Status == "DONE" && isErrorStatus(op.HttpErrorStatusCode) { - o.resetRequestID(instanceGroupResourceName, item.zone, item.name) - return errors.Errorf("failed to delete instance group %s in zone %s with error: %s", item.name, item.zone, operationErrorMessage(op)) - } - if (err != nil && isNoOp(err)) || (op != nil && op.Status == "DONE") { - o.resetRequestID(item.typeName, item.name) - o.deletePendingItems(item.typeName, []cloudResource{item}) - o.Logger.Infof("Deleted instance group %s", item.name) + if err = o.handleOperation(op, err, item, "instance group"); err != nil { + return err } return nil } diff --git a/pkg/destroy/gcp/network.go b/pkg/destroy/gcp/network.go index fa19bc87a3..7b366d39f3 100644 --- a/pkg/destroy/gcp/network.go +++ b/pkg/destroy/gcp/network.go @@ -53,18 +53,8 @@ func (o *ClusterUninstaller) deleteNetwork(ctx context.Context, item cloudResour ctx, cancel := context.WithTimeout(ctx, defaultTimeout) defer cancel() op, err := o.computeSvc.Networks.Delete(o.ProjectID, item.name).RequestId(o.requestID(item.typeName, item.name)).Context(ctx).Do() - if err != nil && !isNoOp(err) { - o.resetRequestID(item.typeName, item.name) - return errors.Wrapf(err, "failed to delete network %s", item.name) - } - if op != nil && op.Status == "DONE" && isErrorStatus(op.HttpErrorStatusCode) { - o.resetRequestID(item.typeName, item.name) - return errors.Errorf("failed to delete network %s with error: %s", item.name, operationErrorMessage(op)) - } - if (err != nil && isNoOp(err)) || (op != nil && op.Status == "DONE") { - o.resetRequestID(item.typeName, item.name) - o.deletePendingItems(item.typeName, []cloudResource{item}) - o.Logger.Infof("Deleted network %s", item.name) + if err = o.handleOperation(op, err, item, "network"); err != nil { + return err } return nil } diff --git a/pkg/destroy/gcp/route.go b/pkg/destroy/gcp/route.go index b5748c13c1..1db6277f88 100644 --- a/pkg/destroy/gcp/route.go +++ b/pkg/destroy/gcp/route.go @@ -71,18 +71,8 @@ func (o *ClusterUninstaller) deleteRoute(ctx context.Context, item cloudResource ctx, cancel := context.WithTimeout(ctx, defaultTimeout) defer cancel() op, err := o.computeSvc.Routes.Delete(o.ProjectID, item.name).RequestId(o.requestID(item.typeName, item.name)).Context(ctx).Do() - if err != nil && !isNoOp(err) { - o.resetRequestID(item.typeName, item.name) - return errors.Wrapf(err, "failed to delete route %s", item.name) - } - if op != nil && op.Status == "DONE" && isErrorStatus(op.HttpErrorStatusCode) { - o.resetRequestID(item.typeName, item.name) - return errors.Errorf("failed to delete route %s with error: %s", item.name, operationErrorMessage(op)) - } - if (err != nil && isNoOp(err)) || (op != nil && op.Status == "DONE") { - o.resetRequestID(item.typeName, item.name) - o.deletePendingItems(item.typeName, []cloudResource{item}) - o.Logger.Infof("Deleted route %s", item.name) + if err = o.handleOperation(op, err, item, "route"); err != nil { + return err } return nil } diff --git a/pkg/destroy/gcp/router.go b/pkg/destroy/gcp/router.go index 4a7dd41931..3982276089 100644 --- a/pkg/destroy/gcp/router.go +++ b/pkg/destroy/gcp/router.go @@ -59,18 +59,8 @@ func (o *ClusterUninstaller) deleteRouter(ctx context.Context, item cloudResourc ctx, cancel := context.WithTimeout(ctx, defaultTimeout) defer cancel() op, err := o.computeSvc.Routers.Delete(o.ProjectID, o.Region, item.name).RequestId(o.requestID(item.typeName, item.name)).Context(ctx).Do() - if err != nil && !isNoOp(err) { - o.resetRequestID(item.typeName, item.name) - return errors.Wrapf(err, "failed to delete router %s", item.name) - } - if op != nil && op.Status == "DONE" && isErrorStatus(op.HttpErrorStatusCode) { - o.resetRequestID(item.typeName, item.name) - return errors.Errorf("failed to delete router %s with error: %s", item.name, operationErrorMessage(op)) - } - if (err != nil && isNoOp(err)) || (op != nil && op.Status == "DONE") { - o.resetRequestID(item.typeName, item.name) - o.deletePendingItems(item.typeName, []cloudResource{item}) - o.Logger.Infof("Deleted router %s", item.name) + if err = o.handleOperation(op, err, item, "router"); err != nil { + return err } return nil } diff --git a/pkg/destroy/gcp/subnetwork.go b/pkg/destroy/gcp/subnetwork.go index 579763bf8c..ae7c34332d 100644 --- a/pkg/destroy/gcp/subnetwork.go +++ b/pkg/destroy/gcp/subnetwork.go @@ -68,18 +68,8 @@ func (o *ClusterUninstaller) deleteSubnetwork(ctx context.Context, item cloudRes ctx, cancel := context.WithTimeout(ctx, defaultTimeout) defer cancel() op, err := o.computeSvc.Subnetworks.Delete(o.ProjectID, o.Region, item.name).RequestId(o.requestID(item.typeName, item.name)).Context(ctx).Do() - if err != nil && !isNoOp(err) { - o.resetRequestID(item.typeName, item.name) - return errors.Wrapf(err, "failed to delete subnetwork %s", item.name) - } - if op != nil && op.Status == "DONE" && isErrorStatus(op.HttpErrorStatusCode) { - o.resetRequestID(item.typeName, item.name) - return errors.Errorf("failed to delete subnetwork %s with error: %s", item.name, operationErrorMessage(op)) - } - if (err != nil && isNoOp(err)) || (op != nil && op.Status == "DONE") { - o.resetRequestID(item.typeName, item.name) - o.deletePendingItems(item.typeName, []cloudResource{item}) - o.Logger.Infof("Deleted subnetwork %s", item.name) + if err = o.handleOperation(op, err, item, "subnetwork"); err != nil { + return err } return nil } diff --git a/pkg/destroy/gcp/targetTCPProxies.go b/pkg/destroy/gcp/targetTCPProxies.go index 7469166609..d3e5056905 100644 --- a/pkg/destroy/gcp/targetTCPProxies.go +++ b/pkg/destroy/gcp/targetTCPProxies.go @@ -61,18 +61,8 @@ func (o *ClusterUninstaller) deleteTargetTCPProxy(ctx context.Context, item clou defer cancel() op, err := o.computeSvc.TargetTcpProxies.Delete(o.ProjectID, item.name).RequestId(o.requestID(item.typeName, item.name)).Context(ctx).Do() - if err != nil && !isNoOp(err) { - o.resetRequestID(item.typeName, item.name) - return fmt.Errorf("failed to target tcp proxy %s: %w", item.name, err) - } - if op != nil && op.Status == "DONE" && isErrorStatus(op.HttpErrorStatusCode) { - o.resetRequestID(item.typeName, item.name) - return fmt.Errorf("failed to delete target tcp proxy %s with error: %s", item.name, operationErrorMessage(op)) - } - if (err != nil && isNoOp(err)) || (op != nil && op.Status == "DONE") { - o.resetRequestID(item.typeName, item.name) - o.deletePendingItems(item.typeName, []cloudResource{item}) - o.Logger.Infof("Deleted target tcp proxy %s", item.name) + if err = o.handleOperation(op, err, item, "target tcp proxy"); err != nil { + return err } return nil } diff --git a/pkg/destroy/gcp/targetpool.go b/pkg/destroy/gcp/targetpool.go index b3b6ff7585..0c7ed71704 100644 --- a/pkg/destroy/gcp/targetpool.go +++ b/pkg/destroy/gcp/targetpool.go @@ -64,18 +64,8 @@ func (o *ClusterUninstaller) deleteTargetPool(ctx context.Context, item cloudRes ctx, cancel := context.WithTimeout(ctx, defaultTimeout) defer cancel() op, err := o.computeSvc.TargetPools.Delete(o.ProjectID, o.Region, item.name).RequestId(o.requestID(item.typeName, item.name)).Context(ctx).Do() - if err != nil && !isNoOp(err) { - o.resetRequestID(item.typeName, item.name) - return errors.Wrapf(err, "failed to delete target pool %s", item.name) - } - if op != nil && op.Status == "DONE" && isErrorStatus(op.HttpErrorStatusCode) { - o.resetRequestID(item.typeName, item.name) - return errors.Errorf("failed to delete target pool %s with error: %s", item.name, operationErrorMessage(op)) - } - if (err != nil && isNoOp(err)) || (op != nil && op.Status == "DONE") { - o.resetRequestID(item.typeName, item.name) - o.deletePendingItems(item.typeName, []cloudResource{item}) - o.Logger.Infof("Deleted target pool %s", item.name) + if err = o.handleOperation(op, err, item, "target pool"); err != nil { + return err } return nil }