{"record":{"id":"e95f01c7db937857","repo":"kubernetes/kops","slug":"error-deleting-loadbalancer-v","errorCode":null,"errorMessage":"error deleting loadbalancer: %v","messagePattern":"error deleting loadbalancer: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/openstack/loadbalancer.go","lineNumber":192,"sourceCode":"\t\treturn nil\n\t} else {\n\t\treturn wait.ErrWaitTimeout\n\t}\n}\n\nfunc (c *openstackCloud) DeleteLB(lbID string, opts loadbalancers.DeleteOpts) error {\n\treturn deleteLB(c, lbID, opts)\n}\n\nfunc deleteLB(c OpenstackCloud, lbID string, opts loadbalancers.DeleteOpts) error {\n\tif c.LoadBalancerClient() == nil {\n\t\treturn fmt.Errorf(\"loadbalancer support not available in this deployment\")\n\t}\n\n\tdone, err := vfs.RetryWithBackoff(deleteBackoff, func() (bool, error) {\n\t\terr := loadbalancers.Delete(context.TODO(), c.LoadBalancerClient(), lbID, opts).ExtractErr()\n\t\tif err != nil && !isNotFound(err) {\n\t\t\treturn false, fmt.Errorf(\"error deleting loadbalancer: %v\", err)\n\t\t}\n\t\tif isNotFound(err) {\n\t\t\treturn true, nil\n\t\t}\n\t\treturn false, nil\n\t})\n\tif err != nil {\n\t\treturn err\n\t} else if done {\n\t\treturn nil\n\t} else {\n\t\treturn wait.ErrWaitTimeout\n\t}\n}\n\nfunc (c *openstackCloud) CreateLB(opt loadbalancers.CreateOptsBuilder) (*loadbalancers.LoadBalancer, error) {\n\treturn createLB(c, opt)\n}","sourceCodeStart":174,"sourceCodeEnd":210,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/openstack/loadbalancer.go#L174-L210","documentation":"Inside deleteLB, loadbalancers.Delete (with DeleteOpts such as cascade) is executed under vfs.RetryWithBackoff; non-NotFound failures are wrapped as 'error deleting loadbalancer: %v'. It indicates the Octavia API rejected or failed the LB deletion after retries, with the underlying reason preserved in %v.","triggerScenarios":"Deleting an LB stuck in PENDING_UPDATE/PENDING_DELETE (409), insufficient quotas or RBAC (403), cascade delete unsupported by the deployed Octavia version, or transient 5xx/timeouts.","commonSituations":"Octavia amphora in ERROR state preventing deletion; concurrent reconciliation deleting the same LB; older Octavia releases lacking cascade cascade=true semantics passed via DeleteOpts; neutron quota exhaustion.","solutions":["Retry after the LB leaves PENDING_* state — the helper already backs off; a persistent 409 means stuck resources","Fix amphora/VM state (force-delete or reset via Octavia CLI) if the LB is in ERROR","Verify DeleteOpts match the deployed Octavia version (cascade support) and adjust accordingly","Check RBAC/quota for the service project, then retry","Manually delete the LB resource with openstack loadbalancer delete --cascade to unblock teardown"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"lb, err := cloud.GetLB(lbID, loadbalancers.GetOpts{})\nif err != nil && isNotFound(err) { return nil } // nothing to delete\nif err != nil { return err }\nif strings.HasPrefix(lb.ProvisioningStatus, \"PENDING\") {\n\treturn fmt.Errorf(\"loadbalancer %s is %s; wait before deleting\", lbID, lb.ProvisioningStatus)\n}","typeGuard":null,"tryCatchPattern":"done, err := vfs.RetryWithBackoff(deleteBackoff, func() (bool, error) {\n\terr := loadbalancers.Delete(context.TODO(), client, lbID, opts).ExtractErr()\n\tif isNotFound(err) { return true, nil }\n\tif err != nil {\n\t\tvar gerr gophercloud.ErrUnexpectedResponseCode\n\t\tif errors.As(err, &gerr) && gerr.Actual == 409 {\n\t\t\treturn false, nil // PENDING state: keep retrying\n\t\t}\n\t\treturn false, fmt.Errorf(\"error deleting loadbalancer: %v\", err)\n\t}\n\treturn true, nil\n})","preventionTips":["Use cascade delete opts appropriate for the deployed Octavia version","Resolve amphora ERROR states before deletion (openstack loadbalancer failover)","Avoid concurrent teardown of the same LB (single reconciliation path)","Verify quotas/RBAC for the project before bulk deletions"],"tags":["openstack","octavia","loadbalancer","api-error"],"backgroundTag":"resource-delete-conflict","analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T07:17:12.445Z"}