1
0
mirror of https://github.com/openshift/installer.git synced 2026-02-05 15:47:14 +01:00

pkg/destroy/gcp: refactor operation handling

The GCP destroy code repeated a lot of boilerplate operation handling.
This refactors all of that into a single function for increased
maintainability.
This commit is contained in:
Patrick Dillon
2025-01-21 15:52:41 -05:00
parent 4fd9f0f429
commit 2fc65ca2c6
17 changed files with 54 additions and 192 deletions

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}