hashicorp/nomad · error
%v
Error message
%v
What it means
While generating the HTML index for the debug bundle, template parsing errors are silently discarded with `head, _ :=` / `line, _ :=`, and then a stale `err` (from an earlier statement, e.g. creating the HTML file) is re-checked and wrapped with `%v`. The template parses shown always succeed, so this error surfaces only when the earlier file-creation step failed, and the message loses the error's type (unwrapped via %v).
Source
Thrown at command/operator_debug.go:1735
if err != nil {
return err
}
defer jsonFh.Close()
json.NewEncoder(jsonFh).Encode(c.manifest)
// Write the HTML
path = filepath.Join(c.collectDir, "index.html")
htmlFh, err := os.Create(path)
if err != nil {
return err
}
defer htmlFh.Close()
head, _ := template.New("head").Parse("<html><head><title>{{.}}</title></head>\n<body><h1>{{.}}</h1>\n<ul>")
line, _ := template.New("line").Parse("<li><a href=\"{{.}}\">{{.}}</a></li>\n")
if err != nil {
return fmt.Errorf("%v", err)
}
tail := "</ul></body></html>\n"
head.Execute(htmlFh, c.timestamp)
for _, f := range c.manifest {
line.Execute(htmlFh, f)
}
htmlFh.WriteString(tail)
return nil
}
// trap captures signals, and closes stopCh
func (c *OperatorDebugCommand) trap() {
sigCh := make(chan os.Signal, 1)
signal.Notify(sigCh,
syscall.SIGHUP,
syscall.SIGINT,View on GitHub (pinned to 482b49bf1a)
Solutions
- Look at the stringified message body for the underlying OS error (path, permission, or ENOSPC)
- Ensure the -output directory for the debug bundle exists and is writable
- Free disk space if the message indicates a full filesystem
- Fix the code to check err immediately after creating htmlFh and wrap with %w instead of %v to preserve the cause
Example fix
// before
head, _ := template.New("head").Parse(...)
line, _ := template.New("line").Parse(...)
if err != nil {
return fmt.Errorf("%v", err)
}
// after
fh, err := os.Create(...)
if err != nil {
return fmt.Errorf("failed to create html file: %w", err)
}
head, err := template.New("head").Parse(...)
if err != nil {
return fmt.Errorf("failed to parse head template: %w", err)
} Defensive patterns
Strategy: validation
Validate before calling
// before generating the bundle index, verify the html file was created
fh, err := os.Create(htmlPath)
if err != nil {
return fmt.Errorf("create html index: %w", err)
}
// and validate templates eagerly
if _, err := template.New("head").Parse(headTmpl); err != nil {
return fmt.Errorf("bad head template: %w", err)
} Try / catch
if err := generateIndex(htmlFh, c); err != nil {
log.Printf("debug bundle index generation failed: %v", err)
// inspect inner OS error for the real filesystem cause
} Prevention
- Never discard template parse errors with `_`; check them immediately
- Check err right after each os.Create/Write step, not several statements later
- Wrap errors with %w so callers can errors.Is/As the cause
- Ensure the debug output directory is writable before starting collection
When it happens
Trigger: The `err` variable left over from creating/opening the HTML output file (htmlFh) is non-nil when control reaches the check after the template.Parse calls, producing fmt.Errorf("%v", err).
Common situations: `nomad operator debug` cannot create its HTML index file because the output directory is missing, unwritable, or the disk is full; the real cause is hidden because the error is stringified, not wrapped.
Understand the failure class
Background: "failed to write file", "Could not save figure", "Error saving remote file" — file write failed: causes and fixes across languages and libraries — this error's family across 38 libraries.
Related errors
- failed to write to file: %w
- unable to read rooted allocation directory
- can't seek to offset %d: %w
- Couldn't copy %q to %q: %w
- failed to encode bootstrap command line: %w
AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04).
Data as JSON: /api/errors/489c13ae5bd0a5b5.
Report an issue: GitHub.