{"record":{"id":"5ac187af53d466ae","repo":"kubernetes/kops","slug":"error-getting-forwardingrule-q-v","errorCode":null,"errorMessage":"error getting ForwardingRule %q: %v","messagePattern":"error getting ForwardingRule %q: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/gcetasks/forwardingrule.go","lineNumber":89,"sourceCode":"\treturn e.Name\n}\n\nfunc (e *ForwardingRule) PruneForwardingRulesWithName(name string) {\n\te.pruneForwardingRules = append(e.pruneForwardingRules, forwardingRulePruneSpec{Name: name})\n}\n\nfunc (e *ForwardingRule) Find(c *fi.CloudupContext) (*ForwardingRule, error) {\n\tctx := c.Context()\n\n\tcloud := c.T.Cloud.(gce.GCECloud)\n\tname := fi.ValueOf(e.Name)\n\n\tr, err := cloud.Compute().ForwardingRules().Get(ctx, cloud.Project(), cloud.Region(), name)\n\tif err != nil {\n\t\tif gce.IsNotFound(err) {\n\t\t\treturn nil, nil\n\t\t}\n\t\treturn nil, fmt.Errorf(\"error getting ForwardingRule %q: %v\", name, err)\n\t}\n\n\tactual := &ForwardingRule{\n\t\tName:       new(r.Name),\n\t\tIPProtocol: r.IPProtocol,\n\t}\n\tif r.PortRange != \"\" {\n\t\tactual.PortRange = &r.PortRange\n\t}\n\tif len(r.Ports) > 0 {\n\t\tactual.Ports = r.Ports\n\t}\n\n\tif r.Target != \"\" {\n\t\tactual.TargetPool = &TargetPool{\n\t\t\tName: new(lastComponent(r.Target)),\n\t\t}\n\t}","sourceCodeStart":71,"sourceCodeEnd":107,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/gcetasks/forwardingrule.go#L71-L107","documentation":"ForwardingRule.Find() looks up the forwarding rule via Compute().ForwardingRules().Get(). NotFound is treated as 'resource absent' (returns nil,nil), but any other API failure is wrapped as 'error getting ForwardingRule %q: %v'. It means the discovery/read step for reconciliation failed.","triggerScenarios":"ForwardingRules().Get returns a non-404 error: permission denied on the compute API, invalid region/project, rate limiting, or backend API outage during kops update/cluster diff.","commonSituations":"Service account missing compute.forwardingRules.get; misconfigured region in kops cluster spec; GCP API quota/rate limits during large applies; intermittent 500s from the Compute API.","solutions":["Check the wrapped %v detail for the specific Google API status code.","Verify the service account has compute.viewer / compute.forwardingRules.get rights.","Confirm the cluster's region setting matches where the load balancer lives.","Retry after a short delay if the error is rateLimitExceeded or transient."],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// pre-checks before apply:\n// gcloud compute forwarding-rules describe NAME --region=R --project=P\n// gcloud projects get-iam-policy PROJECT  # confirm compute.forwardingRules.get","typeGuard":null,"tryCatchPattern":"var lastErr error\nfor attempt := 0; attempt < 3; attempt++ {\n  err := kopsUpdate()\n  if err == nil { break }\n  lastErr = err\n  var gerr *googleapi.Error\n  if errors.As(err, &gerr) && (gerr.Code == 429 || gerr.Code >= 500) {\n    time.Sleep(time.Duration(1<<attempt) * time.Second)\n    continue\n  }\n  log.Fatalf(\"forwarding rule get failed: %v\", err)\n}","preventionTips":["Verify the cluster region matches where load balancers live.","Grant compute.viewer so Find/Get calls never hit permissionDenied.","Retry applies when GCP is rate limiting during large operations."],"tags":["gce","load-balancer","api-error","cloud"],"backgroundTag":"gcp-api-get-failed","analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T12:17:11.808Z"}