{"record":{"id":"6995b8a38cf7b926","repo":"kubernetes/kops","slug":"failed-to-list-lbs-v","errorCode":null,"errorMessage":"failed to list lbs: %v","messagePattern":"failed to list lbs: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/resources/digitalocean/resources.go","lineNumber":228,"sourceCode":"\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\topt.Page = page + 1\n\t}\n\n\treturn allRecords, nil\n}\n\nfunc listLoadBalancers(cloud fi.Cloud, clusterName string) ([]*resources.Resource, error) {\n\tc := cloud.(do.DOCloud)\n\tvar resourceTrackers []*resources.Resource\n\n\tclusterTag := \"KubernetesCluster-Master:\" + strings.ReplaceAll(clusterName, \".\", \"-\")\n\n\tlbs, err := c.GetAllLoadBalancers()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to list lbs: %v\", err)\n\t}\n\n\tfor _, lb := range lbs {\n\t\tif strings.Contains(lb.Tag, clusterTag) {\n\t\t\tresourceTracker := &resources.Resource{\n\t\t\t\tName:    lb.Name,\n\t\t\t\tID:      lb.ID,\n\t\t\t\tType:    resourceTypeLoadBalancer,\n\t\t\t\tDeleter: deleteLoadBalancer,\n\t\t\t\tObj:     lb,\n\t\t\t}\n\n\t\t\tvar blocks []string\n\t\t\tfor _, dropletID := range lb.DropletIDs {\n\t\t\t\tblocks = append(blocks, \"droplet:\"+strconv.Itoa(dropletID))\n\t\t\t}\n\n\t\t\tresourceTracker.Blocks = blocks","sourceCodeStart":210,"sourceCodeEnd":246,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/pkg/resources/digitalocean/resources.go#L210-L246","documentation":"Fires in listLoadBalancers when GetAllLoadBalancers fails while discovering DigitalOcean load balancers for the cluster tag KubernetesCluster-Master:<name> during resource discovery/teardown — an API, credentials, or network failure listing LBs.","triggerScenarios":"GetAllLoadBalancers (godo LoadBalancersService().List, paginated) errors: invalid token lacking read scope on load balancers, network failure, or DO API 5xx/429.","commonSituations":"API token rotated to one without LB read permissions; DO API outage; rate limiting after many API calls during a large cluster delete.","solutions":["Check the DigitalOcean API token and its scopes","Retry after transient API errors or rate limits","Verify load balancers exist in the expected region"],"exampleFix":"// before\ntoken = read-only-scope-token  # missing loadbalancer:read\n// after\ntoken = token-with-loadbalancer-read-scope\nkops delete cluster --cloud digitalocean ...","handlingStrategy":"retry","validationCode":"lbs, err := c.GetAllLoadBalancers()\nif err != nil {\n\tif rl, ok := err.(*godo.RateLimitError); ok {\n\t\ttime.Sleep(time.Until(rl.Rate.Reset))\n\t\tlbs, err = c.GetAllLoadBalancers()\n\t}\n}","typeGuard":null,"tryCatchPattern":"lbs, err := c.GetAllLoadBalancers()\nif err != nil {\n\treturn fmt.Errorf(\"failed to list lbs: %w\", err)\n}","preventionTips":["Token must include load balancer read scope","Apply rate-limit backoff across all DO API calls in a delete run","Space out large cluster teardowns to avoid 429s"],"tags":["digitalocean","load-balancer","api-error"],"backgroundTag":"digitalocean-api-error","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"}