diff --git a/butane/config/common/common.go b/butane/config/common/common.go index f760bfaa7..55797f61b 100644 --- a/butane/config/common/common.go +++ b/butane/config/common/common.go @@ -22,6 +22,7 @@ type TranslateOptions struct { type TranslateBytesOptions struct { TranslateOptions - Pretty bool - Raw bool // encode only the Ignition config, not any wrapper + Pretty bool + Raw bool // encode only the Ignition config, not any wrapper + YAMLDocumentSeparator bool // prepend YAML document separator (---) to YAML output } diff --git a/butane/config/openshift/v4_23_exp/translate_test.go b/butane/config/openshift/v4_23_exp/translate_test.go index 13980a3e2..629ac6e17 100644 --- a/butane/config/openshift/v4_23_exp/translate_test.go +++ b/butane/config/openshift/v4_23_exp/translate_test.go @@ -16,6 +16,7 @@ package v4_23_exp import ( "fmt" + "strings" "testing" baseutil "github.com/coreos/ignition/v2/butane/base/util" @@ -422,3 +423,34 @@ func TestValidateSupport(t *testing.T) { }) } } + +// TestYAMLDocumentSeparator tests that the YAML document separator is only +// emitted when requested. +func TestYAMLDocumentSeparator(t *testing.T) { + in := []byte(`variant: openshift +version: 4.23.0-experimental +metadata: + name: something + labels: + machineconfiguration.openshift.io/role: worker +`) + + tests := []struct { + separator bool + prefix string + }{ + {false, "# Generated by Butane; do not edit\n"}, + {true, "---\n# Generated by Butane; do not edit\n"}, + } + + for _, test := range tests { + t.Run(fmt.Sprintf("separator %v", test.separator), func(t *testing.T) { + actual, r, err := ToConfigBytes(in, common.TranslateBytesOptions{ + YAMLDocumentSeparator: test.separator, + }) + assert.NoError(t, err, "translation failed") + assert.False(t, r.IsFatal(), "fatal report: %v", r) + assert.True(t, strings.HasPrefix(string(actual), test.prefix), "expected prefix %q, got %q", test.prefix, string(actual)) + }) + } +} diff --git a/butane/config/util/util.go b/butane/config/util/util.go index fc6de99db..b49e2fa8e 100644 --- a/butane/config/util/util.go +++ b/butane/config/util/util.go @@ -161,6 +161,9 @@ func TranslateBytesYAML(input []byte, container interface{}, translateMethod str } var yamlCfgBuf bytes.Buffer + if options.YAMLDocumentSeparator { + yamlCfgBuf.WriteString("---\n") + } yamlCfgBuf.WriteString("# Generated by Butane; do not edit\n") encoder := yaml.NewEncoder(&yamlCfgBuf) encoder.SetIndent(2) diff --git a/butane/internal/main.go b/butane/internal/main.go index 1d384ff37..98dd97427 100644 --- a/butane/internal/main.go +++ b/butane/internal/main.go @@ -61,6 +61,7 @@ func main() { pflag.BoolVarP(&strict, "strict", "s", false, "fail on any warning") pflag.BoolVarP(&options.Pretty, "pretty", "p", false, "output formatted json") pflag.BoolVarP(&options.Raw, "raw", "r", false, "never wrap in a MachineConfig; force Ignition output") + pflag.BoolVar(&options.YAMLDocumentSeparator, "yaml-doc-separator", false, "prepend YAML document separator (---) to YAML output") pflag.BoolVar(&rawErrors, "raw-errors", false, "show raw errors, rather than pretty printing them") pflag.StringVar(&colorFlag, "color", "auto", `control color output: "auto", "always", or "never"`) pflag.Lookup("color").NoOptDefVal = "always" diff --git a/docs/release-notes.md b/docs/release-notes.md index e4015a63f..1fde37e5d 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,6 +10,9 @@ nav_order: 9 ### Features +- Butane: add `--yaml-doc-separator` to prepend the YAML document separator + (`---`) to MachineConfig output + ### Changes ### Bug fixes