{"record":{"id":"232333a665a8ada3","repo":"kubernetes/kops","slug":"error-rending-resource-s-v","errorCode":null,"errorMessage":"error rending resource %s %v","messagePattern":"error rending resource (.+?) (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/terraform/target.go","lineNumber":60,"sourceCode":"func NewTerraformTarget(cloud fi.Cloud, project string, outDir string, clusterSpecTarget *kops.TargetSpec) *TerraformTarget {\n\ttarget := TerraformTarget{\n\t\tCloud:   cloud,\n\t\tProject: project,\n\n\t\toutDir:            outDir,\n\t\tclusterSpecTarget: clusterSpecTarget,\n\t}\n\ttarget.InitTerraformWriter()\n\treturn &target\n}\n\nvar _ fi.CloudupTarget = (*TerraformTarget)(nil)\n\nfunc (t *TerraformTarget) AddFileResource(resourceType string, resourceName string, key string, r fi.Resource, base64 bool) (*terraformWriter.Literal, error) {\n\td, err := fi.ResourceAsBytes(r)\n\tif err != nil {\n\t\tid := resourceType + \"_\" + resourceName + \"_\" + key\n\t\treturn nil, fmt.Errorf(\"error rending resource %s %v\", id, err)\n\t}\n\n\treturn t.AddFileBytes(resourceType, resourceName, key, d, base64)\n}\n\nfunc (t *TerraformTarget) DefaultCheckExisting() bool {\n\treturn false\n}\n\n// tfGetProviderExtraConfig is a helper function to get extra config with safety checks on the pointers.\nfunc tfGetProviderExtraConfig(c *kops.TargetSpec) map[string]string {\n\tif c != nil &&\n\t\tc.Terraform != nil {\n\t\treturn c.Terraform.ProviderExtraConfig\n\t}\n\treturn nil\n}\n","sourceCodeStart":42,"sourceCodeEnd":78,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/terraform/target.go#L42-L78","documentation":"TerraformTarget.AddFileResource reads a fi.Resource into bytes before writing it into the Terraform output tree. If fi.ResourceAsBytes fails, the resource cannot be rendered, and the error is wrapped as \"error rending resource <type>_<name>_<key>\" with the underlying cause. This is a read/render failure, not a filesystem write failure.","triggerScenarios":"Any call to AddFileResource whose fi.Resource fails to materialize bytes — e.g. a reader returning an error, a file-backed resource with a missing/unreadable file, a lazy resource whose producer fails.","commonSituations":"Certificate/key resources pointing at missing files; a custom fi.Resource whose Open()/Read() errors (permissions, deleted temp file); network-backed resources failing during cluster apply with terraform output.","solutions":["Read the wrapped underlying error (after `%v`) to find the real cause.","Check that any file-backed resources exist and are readable at the referenced path.","Re-run `kops update cluster --target=terraform` to regenerate from scratch after fixing the source.","If using custom assets/URLs, verify they are reachable and hashes match."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// pre-read the resource to fail fast\nif _, err := fi.ResourceAsBytes(r); err != nil {\n    return fmt.Errorf(\"resource for %s/%s unreadable: %w\", resourceType, resourceName, err)\n}","typeGuard":null,"tryCatchPattern":"lit, err := target.AddFileResource(resourceType, resourceName, key, res, false)\nif err != nil {\n    return fmt.Errorf(\"adding file resource %s_%s_%s failed: %w\", resourceType, resourceName, key, err)\n}","preventionTips":["Ensure file-backed resources exist and are readable before running kops update.","Keep custom fi.Resource implementations error-free (test Open/Read).","Regenerate outputs after any changes to assets or cert/key files.","Check the wrapped cause in the message for the true failure."],"tags":["terraform","resource","io","kops"],"backgroundTag":"resource-render-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"}