{"record":{"id":"801cf45c0e1c9f82","repo":"kubernetes/kops","slug":"error-querying-for-disk-q-v","errorCode":null,"errorMessage":"error querying for disk %q: %v","messagePattern":"error querying for disk %q: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/gcetasks/instance.go","lineNumber":123,"sourceCode":"\tfor _, serviceAccount := range r.ServiceAccounts {\n\t\tfor _, scope := range serviceAccount.Scopes {\n\t\t\tactual.Scopes = append(actual.Scopes, scopeToShortForm(scope))\n\t\t}\n\t}\n\n\tactual.Disks = make(map[string]*Disk)\n\tfor i, disk := range r.Disks {\n\t\tif i == 0 {\n\t\t\tsource := disk.Source\n\n\t\t\t// TODO: Parse source URL instead of assuming same project/zone?\n\t\t\tname := lastComponent(source)\n\t\t\td, err := cloud.Compute().Disks().Get(cloud.Project(), *e.Zone, name)\n\t\t\tif err != nil {\n\t\t\t\tif gce.IsNotFound(err) {\n\t\t\t\t\treturn nil, fmt.Errorf(\"disk not found %q: %v\", source, err)\n\t\t\t\t}\n\t\t\t\treturn nil, fmt.Errorf(\"error querying for disk %q: %v\", source, err)\n\t\t\t}\n\n\t\t\timage, err := ShortenImageURL(cloud.Project(), d.SourceImage)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"error parsing source image URL: %v\", err)\n\t\t\t}\n\t\t\tactual.Image = new(image)\n\t\t} else {\n\t\t\turl, err := gce.ParseGoogleCloudURL(disk.Source)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"unable to parse disk source URL: %q\", disk.Source)\n\t\t\t}\n\n\t\t\tactual.Disks[disk.DeviceName] = &Disk{Name: &url.Name}\n\t\t}\n\t}\n\n\tif r.Metadata != nil {","sourceCodeStart":105,"sourceCodeEnd":141,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/gcetasks/instance.go#L105-L141","documentation":"In Instance.Find, when Disks().Get on the boot disk fails with an error that is NOT NotFound (as opposed to the 'disk not found' branch), kOps wraps it as 'error querying for disk'. This represents an API-level failure querying the disk rather than its absence.","triggerScenarios":"Disks().Get(project, zone, name) returns a non-NotFound error: IAM permission denied (compute.disks.get), Compute Engine API disabled, invalid zone, rate limiting, or transient network/API failure.","commonSituations":"kops service account missing compute.disks.get permission, Compute Engine API not fully enabled, regional outage or 429 throttling during `kops update cluster --refresh`/`kops get --deep`.","solutions":["Read the wrapped %v error to identify the API cause","Grant compute.viewer (includes compute.disks.get) to the kops service account","Verify Compute Engine API is enabled for the project","Retry on transient 429/5xx errors"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// Confirm API access and IAM before deep refresh\n_, err := cloud.Compute().Disks().List(cloud.Project(), *e.Zone).PageSize(1).Do()\nif err != nil {\n\tvar ge *googleapi.Error\n\tif errors.As(err, &ge) && ge.Code == 403 { return fmt.Errorf(\"grant compute.disks.get to the kops SA\") }\n\treturn err\n}","typeGuard":"func isRetryableAPIErr(err error) bool {\n\tvar ge *googleapi.Error\n\treturn errors.As(err, &ge) && (ge.Code == 429 || ge.Code >= 500)\n}","tryCatchPattern":"d, err := cloud.Compute().Disks().Get(cloud.Project(), *e.Zone, name)\nif err != nil {\n\tif gce.IsNotFound(err) { return nil, fmt.Errorf(\"disk not found %q: %v\", source, err) }\n\tif isRetryableAPIErr(err) { return nil, retry.WithBackoff(err) }\n\treturn nil, fmt.Errorf(\"error querying for disk %q: %v\", source, err)\n}","preventionTips":["Enable the Compute Engine API and verify IAM (compute.viewer) before kops runs","Retry transient 429/5xx with exponential backoff","Check status.cloud.google.com for Compute Engine incidents before large refreshes","Reproduce with the equivalent gcloud command to isolate credentials vs code"],"tags":["gce","disk","api-error"],"backgroundTag":"gce-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"}