{"record":{"id":"d79514bd16ffc16b","repo":"kubernetes/kops","slug":"getapiingressstatus-failed-to-list-control-plane","errorCode":null,"errorMessage":"GetApiIngressStatus: Failed to list control plane nodes: %v","messagePattern":"GetApiIngressStatus: Failed to list control plane nodes: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/openstack/cloud.go","lineNumber":806,"sourceCode":"\t\t\treturn ingresses, fmt.Errorf(\"GetApiIngressStatus: Failed to list floating IP's: %v\", err)\n\t\t}\n\t\tfor _, fip := range fips {\n\t\t\tif fip.PortID == lb.VipPortID {\n\t\t\t\tingresses = append(ingresses, fi.ApiIngressStatus{\n\t\t\t\t\tIP: fip.FloatingIP,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n\n\treturn ingresses, nil\n}\n\nfunc getIPIngressStatus(c OpenstackCloud, cluster *kops.Cluster) (ingresses []fi.ApiIngressStatus, err error) {\n\tdone, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {\n\t\tinstances, err := c.ListInstances(servers.ListOpts{})\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"GetApiIngressStatus: Failed to list control plane nodes: %v\", err)\n\t\t}\n\t\tfor _, instance := range instances {\n\t\t\tval, ok := instance.Metadata[\"k8s\"]\n\t\t\tval2, ok2 := instance.Metadata[\"KopsRole\"]\n\t\t\tif ok && val == cluster.Name && ok2 {\n\t\t\t\trole, success := kops.ParseInstanceGroupRole(val2, false)\n\t\t\t\tif success && role.HasControlPlane() {\n\t\t\t\t\tifName := instance.Metadata[TagKopsNetwork]\n\t\t\t\t\taddress, err := GetServerFixedIP(&instance, ifName)\n\t\t\t\t\tif err == nil {\n\t\t\t\t\t\tingresses = append(ingresses, fi.ApiIngressStatus{\n\t\t\t\t\t\t\tIP: address,\n\t\t\t\t\t\t})\n\t\t\t\t\t} else {\n\t\t\t\t\t\tips, err := c.ListServerFloatingIPs(instance.ID)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn false, err\n\t\t\t\t\t\t}","sourceCodeStart":788,"sourceCodeEnd":824,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/openstack/cloud.go#L788-L824","documentation":"Error returned from getIPIngressStatus when listing all Nova instances fails while searching for control-plane (master) nodes to derive the API ingress address from instance addresses. Wrapped by vfs.RetryWithBackoff so the underlying call is retried before surfacing.","triggerScenarios":"c.ListInstances(servers.ListOpts{}) errors inside the retry closure: Nova compute API unreachable, auth failure, or endpoint misconfiguration.","commonSituations":"Nova outage during `kops get cluster`/validation; expired OpenStack token; compute endpoint absent from catalog in a stripped-down cloud config; network partition to the Nova API.","solutions":["Check Nova API: `openstack server list` with the same credentials","Re-authenticate / refresh OS_* environment credentials","Verify the compute endpoint is registered in the Keystone catalog","Retry — this path is wrapped in RetryWithBackoff, so transient faults often self-heal"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// preflight\nif _, err := novaClient.Get(novaClient.ServiceURL(\"servers\", \"detail\"), nil); err != nil {\n    return fmt.Errorf(\"nova API unreachable: %v\", err)\n}","typeGuard":null,"tryCatchPattern":"done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {\n    instances, err := c.ListInstances(servers.ListOpts{})\n    if err != nil { return false, fmt.Errorf(\"GetApiIngressStatus: Failed to list control plane nodes: %v\", err) }\n    return true, nil\n})","preventionTips":["Rely on the existing RetryWithBackoff and avoid escalating on first failure","Keep OS_* credentials valid for validation commands","Verify compute endpoint registration in the cloud config"],"tags":["openstack","nova","instances","ingress"],"backgroundTag":"openstack-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"}