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:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user