{"record":{"id":"7482a874a454cb8c","repo":"kubernetes/kops","slug":"failed-to-list-members-v","errorCode":null,"errorMessage":"failed to list members: %v","messagePattern":"failed to list members: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/openstack/loadbalancer.go","lineNumber":468,"sourceCode":"\t\t}\n\t\treturn pool, err\n\t}\n\treturn pool, nil\n}\n\nfunc (c *openstackCloud) ListPoolMembers(poolID string, opts v2pools.ListMembersOpts) (memberList []v2pools.Member, err error) {\n\treturn listPoolMembers(c, poolID, opts)\n}\n\nfunc listPoolMembers(c OpenstackCloud, poolID string, opts v2pools.ListMembersOpts) (memberList []v2pools.Member, err error) {\n\tif c.LoadBalancerClient() == nil {\n\t\treturn memberList, fmt.Errorf(\"loadbalancer support not available in this deployment\")\n\t}\n\n\tdone, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {\n\t\tmemberPage, err := v2pools.ListMembers(c.LoadBalancerClient(), poolID, opts).AllPages(context.TODO())\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"failed to list members: %v\", err)\n\t\t}\n\t\tmemberList, err = v2pools.ExtractMembers(memberPage)\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"failed to extract members: %v\", err)\n\t\t}\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 memberList, err\n\t}\n\treturn memberList, nil\n}\n\nfunc (c *openstackCloud) ListPools(opts v2pools.ListOpts) (poolList []v2pools.Pool, err error) {\n\treturn listPools(c, opts)","sourceCodeStart":450,"sourceCodeEnd":486,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/openstack/loadbalancer.go#L450-L486","documentation":"Wraps an error from the OpenStack Octavia v2 pools.ListMembers paginated call inside listPoolMembers. The retry loop aborts when AllPages fails, attaching the underlying API error (auth, 404 pool, connectivity, etc.).","triggerScenarios":"v2pools.ListMembers(...).AllPages(context.TODO()) returns a non-nil error: invalid/expired token, nonexistent pool ID, Octavia endpoint unreachable, timeout, or API returning 4xx/5xx — retried readBackoff times before being returned wrapped.","commonSituations":"Wrong OS_* credentials or expired token; pool deleted concurrently by another reconciler; Octavia service down or endpoint misconfigured; network partition between kops and the OpenStack API.","solutions":["Inspect the wrapped inner error for the root cause (auth vs 404 vs connectivity)","Re-authenticate: verify OS_USERNAME/OS_PASSWORD/OS_TOKEN and project scope are valid","Confirm the poolID exists via `openstack loadbalancer member list <pool>`","Verify connectivity to the Octavia public endpoint and that Octavia service is healthy"],"exampleFix":"null","handlingStrategy":"retry","validationCode":"// validate pool exists first\npools, err := cloud.ListPools(v2pools.ListOpts{Name: poolName})\nif err != nil || len(pools) == 0 { return fmt.Errorf(\"pool %q not found\", poolName) }","typeGuard":null,"tryCatchPattern":"members, err := cloud.ListPoolMembers(poolID, opts)\nif err != nil {\n\tif strings.Contains(err.Error(), \"401\") || strings.Contains(err.Error(), \"authentication\") {\n\t\t// re-authenticate and retry once\n\t}\n\treturn fmt.Errorf(\"listing members for pool %s: %w\", poolID, err)\n}","preventionTips":["Pre-validate poolID existence before listing members","Keep Keystone tokens fresh / use a re-authenticating provider","Monitor Octavia API health before reconciliation loops"],"tags":["openstack","octavia","loadbalancer","api-error"],"backgroundTag":"openstack-api-request-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"}