{"record":{"id":"149c3bedec4091e7","repo":"kubernetes/kops","slug":"error-listing-server-groups-v","errorCode":null,"errorMessage":"error listing server groups: %v","messagePattern":"error listing server groups: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/openstack/server_group.go","lineNumber":69,"sourceCode":"\t\treturn i, err\n\t} else if done {\n\t\treturn i, nil\n\t} else {\n\t\treturn i, wait.ErrWaitTimeout\n\t}\n}\n\nfunc (c *openstackCloud) ListServerGroups(opts servergroups.ListOptsBuilder) ([]servergroups.ServerGroup, error) {\n\treturn listServerGroups(c, opts)\n}\n\nfunc listServerGroups(c OpenstackCloud, opts servergroups.ListOptsBuilder) ([]servergroups.ServerGroup, error) {\n\tvar sgs []servergroups.ServerGroup\n\n\tdone, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {\n\t\tallPages, err := servergroups.List(c.ComputeClient(), opts).AllPages(context.TODO())\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"error listing server groups: %v\", err)\n\t\t}\n\n\t\tr, err := servergroups.ExtractServerGroups(allPages)\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"error extracting server groups from pages: %v\", err)\n\t\t}\n\t\tsgs = r\n\t\treturn true, nil\n\t})\n\tif err != nil {\n\t\treturn sgs, err\n\t} else if done {\n\t\treturn sgs, nil\n\t} else {\n\t\treturn sgs, wait.ErrWaitTimeout\n\t}\n}\n","sourceCodeStart":51,"sourceCodeEnd":87,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/openstack/server_group.go#L51-L87","documentation":"listServerGroups wraps the Gophercloud servergroups.List(...).AllPages call. When paging the Nova server-groups index fails (the initial request or any subsequent page), the error is wrapped as \"error listing server groups: %v\". kOps uses this to find existing server groups during cluster operations, so the operation aborts.","triggerScenarios":"servergroups.List(c.ComputeClient(), opts).AllPages(context.TODO()) errors: 401/403 auth failure against the compute endpoint, 404 missing compute service/endpoint, malformed ListOpts filter, API rate limiting (413/429), or a network timeout mid-pagination.","commonSituations":"Expired Keystone token during a long-running kOps command; misconfigured region or endpoint interface (public vs internal); nova-api briefly unavailable; cloud policy revoking compute:list_server_groups permission; OpenStack upgrade changing the server-groups API response shape so pagination breaks.","solutions":["Run 'openstack server group list' with the same credentials/region to reproduce and see the raw HTTP error.","Fix auth: refresh OS_* credentials/token; if 403, grant the project the required compute roles.","Correct the identity/region/interface settings in the kOps OpenStack cloud config so the compute endpoint resolves.","If rate-limited, reduce concurrent API calls or increase nova-api rate limits, then retry.","Retry after transient outages; persistent errors indicate credential/endpoint misconfiguration."],"exampleFix":"// before: endpoint missing due to wrong interface\nauthOpts.IdentityEndpoint = \"https://keystone.example.com/v3\"\n// after: let gophercloud discover the compute endpoint in the right region\nauthOpts.Scope = &tokens.Scope{ProjectName: project, DomainName: domain}\nprovider, _ := openstack.NewClient(authOpts.IdentityEndpoint)\nopenstack.Authenticate(provider, authOpts)\ncomputeClient, _ := openstack.NewComputeV2(provider, endpoints.EndpointOpts{Region: correctRegion, Availability: endpoints.AvailabilityPublic})","handlingStrategy":"retry","validationCode":"// Pre-flight: can we reach the compute endpoint at all?\nclient, err := openstack.NewComputeV2(provider, endpoints.EndpointOpts{Region: region})\nif err != nil {\n\treturn fmt.Errorf(\"compute endpoint for region %q not available: %w\", region, err)\n}","typeGuard":null,"tryCatchPattern":"sgs, err := cloud.ListServerGroups(opts)\nif err != nil {\n\tif errors.Is(err, wait.ErrWaitTimeout) {\n\t\t// retries exhausted; fall back to treating as empty or fail loudly\n\t\treturn fmt.Errorf(\"listing server groups timed out: %w\", err)\n\t}\n\tvar gerr gophercloud.ErrUnexpectedResponseCode\n\tif errors.As(err, &gerr) && (gerr.Actual == 401 || gerr.Actual == 403) {\n\t\t// re-authenticate once, then retry the listing\n\t\tif rerr := reauthenticate(provider); rerr == nil {\n\t\t\tsgs, err = cloud.ListServerGroups(opts)\n\t\t}\n\t}\n\tif err != nil {\n\t\treturn err\n\t}\n}","preventionTips":["Refresh Keystone tokens before long-running kOps operations.","Pin the correct region and endpoint interface (public/internal) in the cloud config.","Avoid hammering nova-api from many parallel kOps runs to prevent rate limiting.","Watch for OpenStack upgrades that change the compute API and test listing after upgrades."],"tags":["openstack","nova","server-group","pagination","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"}