{"record":{"id":"f6a42f1282e4c1ef","repo":"kubernetes/kops","slug":"failed-to-list-layer-3-floating-ips-v","errorCode":null,"errorMessage":"failed to list layer 3 floating ips: %v","messagePattern":"failed to list layer 3 floating ips: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/openstacktasks/floatingip.go","lineNumber":162,"sourceCode":"\t\t}\n\t\tif fip == nil {\n\t\t\treturn nil, nil\n\t\t}\n\t\tactual := &FloatingIP{\n\t\t\tName:      new(fip.Description),\n\t\t\tID:        new(fip.ID),\n\t\t\tLB:        e.LB,\n\t\t\tLifecycle: e.Lifecycle,\n\t\t}\n\t\te.ID = actual.ID\n\t\treturn actual, nil\n\t}\n\tfipname := fi.ValueOf(e.Name)\n\tfips, err := cloud.ListL3FloatingIPs(l3floatingip.ListOpts{\n\t\tDescription: fipname,\n\t})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to list layer 3 floating ips: %v\", err)\n\t}\n\n\tfor _, fip := range fips {\n\t\tif fip.Description == fi.ValueOf(e.Name) {\n\t\t\tactual := &FloatingIP{\n\t\t\t\tID:        new(fips[0].ID),\n\t\t\t\tName:      e.Name,\n\t\t\t\tIP:        new(fip.FloatingIP),\n\t\t\t\tLifecycle: e.Lifecycle,\n\t\t\t}\n\t\t\te.ID = actual.ID\n\t\t\te.IP = actual.IP\n\t\t\treturn actual, nil\n\t\t}\n\t}\n\n\treturn nil, nil\n}","sourceCodeStart":144,"sourceCodeEnd":180,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/openstacktasks/floatingip.go#L144-L180","documentation":"Find in floatingip.go:162 wraps errors from cloud.ListL3FloatingIPs when looking up a FloatingIP task by its Description (the task Name) rather than by port ID. It means the Neutron l3 floatingip list-by-description call errored; an empty result is NOT an error (returns nil,nil so the task will be created).","triggerScenarios":"Neutron rejects the list call: 401 expired token, 403 insufficient policy, 400 bad filter, or 5xx/rate-limit from the Neutron service.","commonSituations":"Keystone token expiry during a long-running update; project scoping mismatch so the FIPs live in another tenant; Neutron outage; API policy changes in newer OpenStack releases restricting floatingip listing.","solutions":["Check the wrapped error for HTTP status; re-authenticate or fix project scope for 401/403.","Confirm `openstack floating ip list` works with the same credentials outside kops.","For 5xx/rate limiting, wait and rerun the kops command.","Verify Neutron's floatingip list filtering by description is supported in your OpenStack release."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// verify list-by-description works before the task runs\n_, err := cloud.ListL3FloatingIPs(l3floatingip.ListOpts{Description: taskName, Limit: 1})\nif err != nil {\n    return fmt.Errorf(\"cannot list floating ips by description: %w\", err)\n}","typeGuard":"func isNeutronListFailure(err error) bool {\n    var gerr gophercloud.ErrUnexpectedResponseCode\n    return errors.As(err, &gerr) && gerr.Actual >= 400\n}","tryCatchPattern":"actual, err := e.Find(ctx)\nif err != nil {\n    if isNeutronListFailure(err) && errors.Is(err, context.DeadlineExceeded) {\n        return nil, nil // treat transient timeout as not-found; recreate\n    }\n    return nil, err\n}","preventionTips":["Keep task/Description names unique per cluster to make lookups deterministic","Re-authenticate before long updates to avoid 401s mid-run","Check Neutron health (`openstack network list`) before cluster operations","Note that empty results are not errors — only API failures hit this path"],"tags":["openstack","neutron","floating-ip","list","reconcile"],"backgroundTag":"neutron-api-list-failed","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"}