diff --git a/pkg/action/action.go b/pkg/action/action.go index e93d6181f..3d4d8c553 100644 --- a/pkg/action/action.go +++ b/pkg/action/action.go @@ -204,16 +204,14 @@ func annotateAndMerge(files map[string]string) (string, error) { if strings.TrimSpace(doc) == "" { continue } - manifests, err := kio.ParseAll(doc) + manifest, err := kyaml.Parse(doc) if err != nil { return "", fmt.Errorf("parsing %s: %w", fname, err) } - for _, manifest := range manifests { - if err := manifest.PipeE(kyaml.SetAnnotation(filenameAnnotation, fname)); err != nil { - return "", fmt.Errorf("annotating %s: %w", fname, err) - } - combinedManifests = append(combinedManifests, manifest) + if err := manifest.PipeE(kyaml.SetAnnotation(filenameAnnotation, fname)); err != nil { + return "", fmt.Errorf("annotating %s: %w", fname, err) } + combinedManifests = append(combinedManifests, manifest) } } @@ -234,13 +232,13 @@ func annotateAndMerge(files map[string]string) (string, error) { // group), so that merging results from different invocations does not collide // on the same synthetic key. func splitAndDeannotate(postrendered, fallbackPrefix string) (map[string]string, error) { - manifests, err := kio.ParseAll(postrendered) - if err != nil { - return nil, fmt.Errorf("error parsing YAML: %w", err) - } - + docs := releaseutil.SplitManifests(postrendered) manifestsByFilename := make(map[string][]*kyaml.RNode) - for i, manifest := range manifests { + for i := 0; i < len(docs); i++ { + manifest, err := kyaml.Parse(docs[fmt.Sprintf("manifest-%d", i)]) + if err != nil { + return nil, fmt.Errorf("error parsing YAML: %w", err) + } meta, err := manifest.GetMeta() if err != nil { return nil, fmt.Errorf("getting metadata: %w", err) diff --git a/pkg/action/action_test.go b/pkg/action/action_test.go index 056c539a5..4aebff784 100644 --- a/pkg/action/action_test.go +++ b/pkg/action/action_test.go @@ -1704,7 +1704,7 @@ data: { name: "invalid yaml input", input: "invalid: yaml: content:", - expectedError: "error parsing YAML: MalformedYAMLError", + expectedError: "error parsing YAML:", }, { name: "manifest without filename annotation", @@ -1799,6 +1799,33 @@ data: } } +func TestRenderResources_PostRenderer_ListAnchorRoundTrip(t *testing.T) { + cfg := actionConfigFixture(t) + ch := buildChartWithTemplates([]*common.File{{ + Name: "templates/list.yaml", + ModTime: time.Now(), + Data: []byte(`apiVersion: v1 +kind: List +items: +- apiVersion: v1 + kind: ConfigMap + metadata: + name: cm-a + data: &shared + key: value +- apiVersion: v1 + kind: ConfigMap + metadata: + name: cm-b + data: *shared`), + }}) + + _, buf, _, err := cfg.renderResources(t.Context(), ch, nil, "test-release", "", false, false, false, &mockPostRenderer{}, false, false, false, PostRenderStrategyCombined) + require.NoError(t, err) + assert.Contains(t, buf.String(), "name: cm-a") + assert.Contains(t, buf.String(), "name: cm-b") +} + func TestRenderResources_PostRenderer_Success(t *testing.T) { cfg := actionConfigFixture(t) @@ -1915,7 +1942,7 @@ func TestRenderResources_PostRenderer_SplitError(t *testing.T) { mockPR, false, false, false, PostRenderStrategyCombined, ) - assert.ErrorContains(t, err, "error while parsing post rendered output: error parsing YAML: MalformedYAMLError:") + assert.ErrorContains(t, err, "error while parsing post rendered output: error parsing YAML:") } func TestRenderResources_PostRenderer_Integration(t *testing.T) {