{"record":{"id":"35e6a6c4acd7531b","repo":"kubernetes/kops","slug":"failed-to-list-l3-floating-ip-v-35e6a6","errorCode":null,"errorMessage":"Failed to list L3 floating ip: %v","messagePattern":"Failed to list L3 floating ip: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/openstacktasks/floatingip.go","lineNumber":61,"sourceCode":"\tWellKnownServices []wellknownservices.WellKnownService\n}\n\nvar _ fi.HasAddress = (*FloatingIP)(nil)\n\nvar readBackoff = wait.Backoff{\n\tDuration: time.Second,\n\tFactor:   1.5,\n\tJitter:   0.1,\n\tSteps:    10,\n}\n\n// this function tries to find l3 floating, and retries x times to find that. In some cases the floatingip is not in place in first request\nfunc findL3Floating(cloud openstack.OpenstackCloud, opts l3floatingip.ListOpts) ([]l3floatingip.FloatingIP, error) {\n\tvar result []l3floatingip.FloatingIP\n\tdone, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {\n\t\tfips, err := cloud.ListL3FloatingIPs(opts)\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"Failed to list L3 floating ip: %v\", err)\n\t\t}\n\t\tif len(fips) == 0 {\n\t\t\treturn false, nil\n\t\t}\n\t\tresult = fips\n\t\treturn true, nil\n\t})\n\tif !done {\n\t\tif err == nil {\n\t\t\terr = wait.ErrWaitTimeout\n\t\t}\n\t\treturn result, err\n\t}\n\treturn result, nil\n}\n\n// GetWellKnownServices implements fi.HasAddress::GetWellKnownServices.\n// It indicates which services we support with this address.","sourceCodeStart":43,"sourceCodeEnd":79,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/openstacktasks/floatingip.go#L43-L79","documentation":"findL3Floating in upup/pkg/fi/cloudup/openstacktasks/floatingip.go:61 wraps any error from cloud.ListL3FloatingIPs (Neutron l3 floatingip list) while retrying with readBackoff. It indicates the Neutron Networking API list call failed, not that no floating IP was found (an empty list just retries until timeout). The raw gophercloud/Neutron error is embedded in %v.","triggerScenarios":"Neutron returns 401/403 (bad token or no access to the project's networks), 404 if the networking endpoint/extension is missing, or 5xx/timeouts — retried across ~10 backoff steps then surfaced.","commonSituations":"Expired Keystone tokens during a long `kops update cluster`; missing networking service endpoint in the catalog; Neutron outage or API rate limiting; user lacking rights to list floating IPs in the external network's project.","solutions":["Read the wrapped error: for 401 re-authenticate (`kops export kubecfg --admin` won't help; refresh OS_* credentials) and rerun.","For 403, grant the project/user the Networking service listing rights or use the correct project scope.","Verify the Neutron public endpoint is reachable (`openstack floating ip list`) and catalog entries are correct.","If it's a transient Neutron 5xx, simply rerun the kops command once the service recovers."],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// sanity-check Neutron reachability before invoking the task\n_, err := cloud.ListL3FloatingIPs(l3floatingip.ListOpts{Limit: 1})\nif err != nil {\n    return fmt.Errorf(\"neutron unreachable: %w\", err)\n}","typeGuard":"func isAuthError(err error) bool {\n    var gerr gophercloud.ErrUnexpectedResponseCode\n    return errors.As(err, &gerr) && (gerr.Actual == 401 || gerr.Actual == 403)\n}","tryCatchPattern":"fips, err := findL3Floating(cloud, opts)\nif err != nil {\n    if isAuthError(err) {\n        // re-authenticate / fix credentials, then retry once\n    }\n    return fmt.Errorf(\"floating ip lookup aborted: %w\", err)\n}","preventionTips":["Refresh tokens before long-running kops operations","Verify `openstack floating ip list` works with the same credentials first","Monitor Neutron service health during cluster operations","Keep project scope consistent in the cloud config"],"tags":["openstack","neutron","floating-ip","list","retry"],"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"}