kubernetes/kops · error

unable to open file: %s, error: %v

Error message

unable to open file: %s, error: %v

What it means

When --out/-o specifies an output file, RunToolBoxTemplate opens it with os.OpenFile (O_RDWR|O_TRUNC|O_CREATE, 0660). If the file cannot be opened, the command fails with this message including the path and OS error. Common causes are permissions, missing parent directories, or the path being a directory.

Source

Thrown at cmd/kops/toolbox_template.go:219

			if len(data) <= 0 {
				continue
			}
			formatted, err := yaml.Marshal(&data)
			if err != nil {
				return fmt.Errorf("unable to marhshal formatted content to yaml: %s", err)
			}
			documents = append(documents, string(formatted))
		}
	}
	// join in harmony all the YAML documents back together
	content := strings.Join(documents, "---\n")

	iowriter := out
	// @check if we are writing to a file rather than stdout
	if options.outputPath != "" {
		w, err := os.OpenFile(utils.ExpandPath(options.outputPath), os.O_RDWR|os.O_TRUNC|os.O_CREATE, 0o660)
		if err != nil {
			return fmt.Errorf("unable to open file: %s, error: %v", options.outputPath, err)
		}
		defer try.CloseFile(w)
		iowriter = w
	}

	if _, err := iowriter.Write([]byte(content)); err != nil {
		return fmt.Errorf("unable to write template: %s", err)
	}

	return nil
}

// newTemplateContext is responsible for loading the --values and build a context for the template
func newTemplateContext(files []string, values []string, stringValues []string) (map[string]interface{}, error) {
	context := make(map[string]interface{})

	for _, x := range files {
		list, err := expandFiles(utils.ExpandPath(x))

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Create the parent directory: `mkdir -p $(dirname <path>)`.
  2. Check permissions/ownership on the target path and that it is not a directory.
  3. Write to a writable location or run with appropriate user/permissions.

Example fix

// before
kops toolbox template --out /nonexistent/dir/out.yaml
// after
mkdir -p /nonexistent/dir && kops toolbox template --out /nonexistent/dir/out.yaml
Defensive patterns

Strategy: validation

Validate before calling

dir := filepath.Dir(outPath)
if _, err := os.Stat(dir); os.IsNotExist(err) { os.MkdirAll(dir, 0o755) }
if fi, err := os.Stat(outPath); err == nil && fi.IsDir() { /* choose a file path */ }

Try / catch

if err := run("kops", "toolbox", "template", "--out", p); strings.Contains(err.Error(), "unable to open file") { check perms / mkdir -p and retry }

Prevention

When it happens

Trigger: Running `kops toolbox template --out <path>` where the path's directory does not exist, the user lacks write permission, the path is a directory, or the filesystem is read-only.

Common situations: Typo in output directory; running without permissions in CI containers; output path pointing at an existing directory; mounted read-only volume.

Understand the failure class

Background: "open() failed", "failed to open file", "cannot create file" — what a file open error means and how to fix it — this error's family across 42 libraries.

Related errors


AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05). Data as JSON: /api/errors/9effe84a5c2290a7. Report an issue: GitHub.