{"record":{"id":"0cda98392ee569f6","repo":"kubernetes/kops","slug":"error-listing-instancegroupmanagers-v-0cda98","errorCode":null,"errorMessage":"error listing InstanceGroupManagers: %v","messagePattern":"error listing InstanceGroupManagers: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/gce/instancegroups.go","lineNumber":164,"sourceCode":"\t\ttemplates, err := FindInstanceTemplates(c, cluster.Name)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tfor _, t := range templates {\n\t\t\tinstanceTemplates[t.SelfLink] = t\n\t\t}\n\t}\n\n\tzones, err := c.Zones()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tfor _, zoneName := range zones {\n\t\tmigs, err := c.Compute().InstanceGroupManagers().List(ctx, project, zoneName)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"error listing InstanceGroupManagers: %v\", err)\n\t\t}\n\t\tfor _, mig := range migs {\n\t\t\tname := mig.Name\n\n\t\t\tinstanceTemplate := instanceTemplates[mig.InstanceTemplate]\n\t\t\tif instanceTemplate == nil {\n\t\t\t\tklog.V(2).Infof(\"ignoring MIG %s with unmanaged InstanceTemplate: %s\", name, mig.InstanceTemplate)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tig, err := matchInstanceGroup(mig, cluster, instancegroups)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"error getting instance group for MIG %q\", name)\n\t\t\t}\n\t\t\tif ig == nil {\n\t\t\t\tif warnUnmatched {\n\t\t\t\t\tklog.Warningf(\"Found MIG with no corresponding instance group %q\", name)\n\t\t\t\t}","sourceCodeStart":146,"sourceCodeEnd":182,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/gce/instancegroups.go#L146-L182","documentation":"Returned by GetCloudGroups when listing managed instance groups (InstanceGroupManagers) in a zone fails via Compute().InstanceGroupManagers().List(). It wraps the underlying GCE API error so the caller knows the cloud-group inventory could not be built. This aborts operations that need the current cloud topology (rolling updates, cluster validation).","triggerScenarios":"Calling GetCloudGroups where InstanceGroupManagers().List(ctx, project, zoneName) returns any error for one of the cluster's zones: IAM permission denied (compute.instanceGroupManagers.list), invalid zone, API quota exhaustion/rate limiting, or network/API outage.","commonSituations":"Running `kops get clusters`/rolling-update against GCP with a misconfigured service account, a region/zone change after cluster creation, GCE API rate limiting in large clusters, or transient Google API outages.","solutions":["Inspect the wrapped cause: 403 -> grant compute.instanceGroupManagers.list via roles/compute.viewer or instanceAdmin.","Verify the zone names resolved for the cluster actually exist in the project (gcloud compute zones list).","Retry on 429/5xx rate-limit or transient errors; reduce concurrent calls for large multi-zone clusters.","Confirm GOOGLE_APPLICATION_CREDENTIALS / default credentials are valid and not expired."],"exampleFix":"// before\nreturn nil, fmt.Errorf(\"error listing InstanceGroupManagers: %v\", err)\n// after (skip unavailable zones only if acceptable, else fail)\nif gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 403 {\n    return nil, fmt.Errorf(\"missing compute.instanceGroupManagers.list IAM permission in zone %s: %v\", zoneName, err)\n}\nreturn nil, fmt.Errorf(\"error listing InstanceGroupManagers: %v\", err)","handlingStrategy":"retry","validationCode":"// pre-flight checks before invoking GetCloudGroups-dependent commands\nctx := context.Background()\n_, err := computeService.InstanceGroupManagers.List(project, zone).Context(ctx).Do()\nif err != nil {\n    log.Fatalf(\"cannot list MIGs in %s: %v\", zone, err) // fix IAM/quota first\n}","typeGuard":"func isGoogleAPIErr(err error, code int) bool {\n    var gerr *googleapi.Error\n    return errors.As(err, &gerr) && gerr.Code == code\n}","tryCatchPattern":"migs, err := c.Compute().InstanceGroupManagers().List(ctx, project, zone)\nif err != nil {\n    if isGoogleAPIErr(err, 429) || isGoogleAPIErr(err, 500) {\n        time.Sleep(backoff)\n        migs, err = c.Compute().InstanceGroupManagers().List(ctx, project, zone)\n    }\n    if err != nil {\n        return nil, fmt.Errorf(\"error listing InstanceGroupManagers: %v\", err)\n    }\n}","preventionTips":["Grant compute.viewer or compute.instanceAdmin.v1 to the kops service account.","Verify GOOGLE_APPLICATION_CREDENTIALS points to a valid, non-expired key.","Check the zones in the cluster spec exist in the target project.","For large multi-zone clusters, throttle concurrent GCE API calls to avoid 429s."],"tags":["gce","gcp","instance-group","api-error","kops"],"backgroundTag":"gce-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"}