{"record":{"id":"0d65a0c8e84498b9","repo":"kubernetes/kops","slug":"error-writing-terraform-data-to-output-file-q-v","errorCode":null,"errorMessage":"error writing terraform data to output file %q: %v","messagePattern":"error writing terraform data to output file %q: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/terraform/target.go","lineNumber":103,"sourceCode":"\treturn nil\n}\n\nfunc (t *TerraformTarget) Finish(taskMap map[string]fi.CloudupTask) error {\n\tif err := t.finishHCL2(); err != nil {\n\t\treturn err\n\t}\n\n\tfor relativePath, contents := range t.Files {\n\t\tp := path.Join(t.outDir, relativePath)\n\n\t\terr := os.MkdirAll(path.Dir(p), os.FileMode(0o755))\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"error creating output directory %q: %v\", path.Dir(p), err)\n\t\t}\n\n\t\terr = os.WriteFile(p, contents, os.FileMode(0o644))\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"error writing terraform data to output file %q: %v\", p, err)\n\t\t}\n\t}\n\tklog.Infof(\"Terraform output is in %s\", t.outDir)\n\n\treturn nil\n}\n","sourceCodeStart":85,"sourceCodeEnd":110,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/terraform/target.go#L85-L110","documentation":"TerraformTarget.Finish writes each generated Terraform file with os.WriteFile (mode 0644) into the output tree. If the write fails, this error wraps the OS cause and includes the target file path. The Terraform JSON/HCL output could not be persisted, so the update target is incomplete.","triggerScenarios":"os.WriteFile fails for outDir/<relativePath> — out of disk space, permission denied on an existing file owned by another user, immutable files, or the path became unwritable between MkdirAll and WriteFile.","commonSituations":"Previous run of kops (or terraform) created files as root inside out/; disk quota exceeded in CI; read-only mount; antivirus/EDR blocking writes.","solutions":["Free disk space / increase quota on the volume holding --out.","`sudo chown -R $(whoami) out/` or delete the out directory and re-run so kops recreates it.","Choose a fresh output directory: `kops update cluster --out out-new/`.","Check the wrapped OS error (after `%v`) for the precise errno (ENOSPC, EACCES, EROFS)."],"exampleFix":"// before\nkops update cluster --out /mnt/ro/out\n// after\nkops update cluster --out /home/user/out","handlingStrategy":"validation","validationCode":"outDir := \"/home/user/out\"\ninfo, err := os.StatfsCompat(outDir) // or syscall.Statfs\nif err == nil && info.Bavail*uint64(info.Bsize) < 100<<20 {\n    return fmt.Errorf(\"less than 100MB free in %s\", outDir)\n}","typeGuard":null,"tryCatchPattern":"if err := target.Finish(taskMap); err != nil {\n    if strings.Contains(err.Error(), \"error writing terraform data\") {\n        // fix ownership/disk, wipe outDir, re-run update\n    }\n}","preventionTips":["Use a fresh output directory per run: `rm -rf out && kops update ...`.","Fix ownership of previous outputs before re-running as a non-root user.","Monitor disk space in CI runners.","Don't target read-only or immutable mounts."],"tags":["filesystem","terraform","kops","write-failed"],"backgroundTag":"file-write-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"}