cilium/cilium · error
writing header: %w
Error message
writing header: %w
What it means
Failed while rendering the Go file header (package clause and license comment) into the output buffer via writeHeader. This is part of assembling the generated *_config.go file and indicates an internal template/formatting failure, not a user input problem in most cases.
Source
Thrown at tools/dpgen/config.go:61
spec, err := ebpf.LoadCollectionSpec(args[0])
if err != nil {
return fmt.Errorf("loading spec: %w", err)
}
s, err := varsToStruct(spec, configOpts.outName, configOpts.kind, configOpts.typesPkg, configOpts.embeds)
if err != nil {
return fmt.Errorf("generating config struct: %w", err)
}
if needUtils {
if err := writeUtilFile("util_generated.go", configOpts.goPkg); err != nil {
return fmt.Errorf("writing util file: %w", err)
}
}
var b bytes.Buffer
if err := writeHeader(&b, configOpts.goPkg, nil); err != nil {
return fmt.Errorf("writing header: %w", err)
}
if needExternalTypes {
if configOpts.typesPkg == "" {
return fmt.Errorf("external types needed but types package is empty")
}
if err := writeImports(&b, []string{configOpts.typesPkg}); err != nil {
return fmt.Errorf("writing imports: %w", err)
}
}
if _, err := b.WriteString(s); err != nil {
return fmt.Errorf("writing struct: %w", err)
}
if err := os.WriteFile(configOpts.outFile, b.Bytes(), 0644); err != nil {
return fmt.Errorf("writing output file: %w", err)
}
return nilView on GitHub (pinned to ac7b90affa)
Solutions
- Check the --go-pkg flag value is a valid Go package name (letters/digits/underscore)
- Inspect the header template used by writeHeader in tools/dpgen for template syntax errors
- Rebuild dpgen (`go build ./tools/dpgen`) after any edits and re-run
- If caused by a recent dpgen change, git diff tools/dpgen to find the template regression and fix it
Example fix
// before writeHeader(&b, "my-pkg", nil) // invalid package name // after writeHeader(&b, "mypkg", nil)
Defensive patterns
Strategy: try-catch
Try / catch
if err := runConfig(cmd, args); err != nil {
if strings.Contains(err.Error(), "writing header") {
fmt.Fprintf(os.Stderr, "dpgen internal header/template failure, check go-pkg flag and rebuild dpgen: %v\n", err)
os.Exit(1)
}
fmt.Fprintf(os.Stderr, "%v\n", err)
os.Exit(1)
} Prevention
- Pass a valid Go package name via --go-pkg (identifiers only, no dashes)
- Rebuild dpgen after pulling changes so embedded templates match the binary
- Run `go vet ./tools/dpgen` after editing header templates
- Pin the dpgen build in CI so template and binary versions agree
When it happens
Trigger: writeHeader's internal template parsing or execution fails (malformed header template, invalid package name formatting); the bytes.Buffer accepts virtually all writes so real failures are almost always template errors introduced by code changes, or a nil/template misuse regression in tools/dpgen.
Common situations: Developers editing the header template in tools/dpgen introduce a template syntax error or pass an invalid goPkg value; rarely hit by end users of the generator.
Related errors
- writing util file: %w
- values cannot be empty
- policy computation result has stale revision
- route policy statement names do not match
- unable to insert endpoint into manager: %w
AI-assisted analysis of cilium/cilium@ac7b90affa (2026-08-31).
Data as JSON: /api/errors/084180228e452a0e.
Report an issue: GitHub.