From 08c49dd0374f1581ed315c0139a575623010b02e Mon Sep 17 00:00:00 2001 From: Philip Laine Date: Fri, 3 May 2024 10:30:56 +0200 Subject: [PATCH 1/2] Add tests for remove copies from components to enable refactoring --- src/pkg/packager/creator/differential_test.go | 66 ------------------- 1 file changed, 66 deletions(-) delete mode 100644 src/pkg/packager/creator/differential_test.go diff --git a/src/pkg/packager/creator/differential_test.go b/src/pkg/packager/creator/differential_test.go deleted file mode 100644 index cc616f92ed..0000000000 --- a/src/pkg/packager/creator/differential_test.go +++ /dev/null @@ -1,66 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// SPDX-FileCopyrightText: 2021-Present The Zarf Authors - -package creator - -import ( - "testing" - - "github.com/defenseunicorns/zarf/src/types" - "github.com/stretchr/testify/require" -) - -func TestRemoveCopiesFromComponents(t *testing.T) { - components := []types.ZarfComponent{ - { - Images: []string{ - "example.com/include-image-tag:latest", - "example.com/image-with-tag:v1", - "example.com/diff-image-with-tag:v1", - "example.com/image-with-digest@sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "example.com/diff-image-with-digest@sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "example.com/image-with-tag-and-digest:v1@sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "example.com/diff-image-with-tag-and-digest:v1@sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - }, - Repos: []string{ - "https://example.com/no-ref.git", - "https://example.com/branch.git@refs/heads/main", - "https://example.com/tag.git@v1", - "https://example.com/diff-tag.git@v1", - "https://example.com/commit.git@524980951ff16e19dc25232e9aea8fd693989ba6", - "https://example.com/diff-commit.git@524980951ff16e19dc25232e9aea8fd693989ba6", - }, - }, - } - loadedDiffData := types.DifferentialData{ - DifferentialImages: map[string]bool{ - "example.com/include-image-tag:latest": true, - "example.com/diff-image-with-tag:v1": true, - "example.com/diff-image-with-digest@sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855": true, - "example.com/diff-image-with-tag-and-digest:v1@sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855": true, - }, - DifferentialRepos: map[string]bool{ - "https://example.com/no-ref.git": true, - "https://example.com/branch.git@refs/heads/main": true, - "https://example.com/diff-tag.git@v1": true, - "https://example.com/diff-commit.git@524980951ff16e19dc25232e9aea8fd693989ba6": true, - }, - } - diffComponents, err := removeCopiesFromComponents(components, &loadedDiffData) - require.NoError(t, err) - - expectedImages := []string{ - "example.com/include-image-tag:latest", - "example.com/image-with-tag:v1", - "example.com/image-with-digest@sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "example.com/image-with-tag-and-digest:v1@sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - } - require.ElementsMatch(t, expectedImages, diffComponents[0].Images) - expectedRepos := []string{ - "https://example.com/no-ref.git", - "https://example.com/branch.git@refs/heads/main", - "https://example.com/tag.git@v1", - "https://example.com/commit.git@524980951ff16e19dc25232e9aea8fd693989ba6", - } - require.ElementsMatch(t, expectedRepos, diffComponents[0].Repos) -} From 5685987c4fb3df2020aba18672fca601cb29d87e Mon Sep 17 00:00:00 2001 From: Philip Laine Date: Fri, 3 May 2024 13:31:35 +0200 Subject: [PATCH 2/2] chore: refactor remove copies from components to a filter --- src/pkg/packager/creator/differential.go | 48 ---------------- src/pkg/packager/creator/normal.go | 4 +- src/pkg/packager/filters/diff.go | 63 +++++++++++++++++++++ src/pkg/packager/filters/diff_test.go | 70 ++++++++++++++++++++++++ 4 files changed, 136 insertions(+), 49 deletions(-) create mode 100644 src/pkg/packager/filters/diff.go create mode 100644 src/pkg/packager/filters/diff_test.go diff --git a/src/pkg/packager/creator/differential.go b/src/pkg/packager/creator/differential.go index 59915eead1..ee373836d0 100644 --- a/src/pkg/packager/creator/differential.go +++ b/src/pkg/packager/creator/differential.go @@ -5,17 +5,13 @@ package creator import ( - "fmt" "os" "github.com/defenseunicorns/zarf/src/config" - "github.com/defenseunicorns/zarf/src/internal/packager/git" "github.com/defenseunicorns/zarf/src/pkg/layout" "github.com/defenseunicorns/zarf/src/pkg/packager/sources" - "github.com/defenseunicorns/zarf/src/pkg/transform" "github.com/defenseunicorns/zarf/src/pkg/utils" "github.com/defenseunicorns/zarf/src/types" - "github.com/go-git/go-git/v5/plumbing" ) // loadDifferentialData sets any images and repos from the existing reference package in the DifferentialData and returns it. @@ -58,47 +54,3 @@ func loadDifferentialData(diffPkgPath string) (diffData *types.DifferentialData, DifferentialPackageVersion: diffPkg.Metadata.Version, }, nil } - -// removeCopiesFromComponents removes any images and repos already present in the reference package components. -func removeCopiesFromComponents(components []types.ZarfComponent, loadedDiffData *types.DifferentialData) (diffComponents []types.ZarfComponent, err error) { - for _, component := range components { - newImageList := []string{} - newRepoList := []string{} - - for _, img := range component.Images { - imgRef, err := transform.ParseImageRef(img) - if err != nil { - return nil, fmt.Errorf("unable to parse image ref %s: %s", img, err.Error()) - } - - imgTag := imgRef.TagOrDigest - includeImage := imgTag == ":latest" || imgTag == ":stable" || imgTag == ":nightly" - if includeImage || !loadedDiffData.DifferentialImages[img] { - newImageList = append(newImageList, img) - } - } - - for _, repoURL := range component.Repos { - _, refPlain, err := transform.GitURLSplitRef(repoURL) - if err != nil { - return nil, err - } - - var ref plumbing.ReferenceName - if refPlain != "" { - ref = git.ParseRef(refPlain) - } - - includeRepo := ref == "" || (!ref.IsTag() && !plumbing.IsHash(refPlain)) - if includeRepo || !loadedDiffData.DifferentialRepos[repoURL] { - newRepoList = append(newRepoList, repoURL) - } - } - - component.Images = newImageList - component.Repos = newRepoList - diffComponents = append(diffComponents, component) - } - - return diffComponents, nil -} diff --git a/src/pkg/packager/creator/normal.go b/src/pkg/packager/creator/normal.go index fed5003380..81478c730e 100644 --- a/src/pkg/packager/creator/normal.go +++ b/src/pkg/packager/creator/normal.go @@ -27,6 +27,7 @@ import ( "github.com/defenseunicorns/zarf/src/pkg/layout" "github.com/defenseunicorns/zarf/src/pkg/message" "github.com/defenseunicorns/zarf/src/pkg/packager/actions" + "github.com/defenseunicorns/zarf/src/pkg/packager/filters" "github.com/defenseunicorns/zarf/src/pkg/packager/sources" "github.com/defenseunicorns/zarf/src/pkg/transform" "github.com/defenseunicorns/zarf/src/pkg/utils" @@ -110,7 +111,8 @@ func (pc *PackageCreator) LoadPackageDefinition(dst *layout.PackagePaths) (pkg t return types.ZarfPackage{}, nil, errors.New(lang.PkgCreateErrDifferentialNoVersion) } - pkg.Components, err = removeCopiesFromComponents(pkg.Components, diffData) + filter := filters.ByDifferentialData(diffData) + pkg.Components, err = filter.Apply(pkg) if err != nil { return types.ZarfPackage{}, nil, err } diff --git a/src/pkg/packager/filters/diff.go b/src/pkg/packager/filters/diff.go new file mode 100644 index 0000000000..fe722e9741 --- /dev/null +++ b/src/pkg/packager/filters/diff.go @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2021-Present The Zarf Authors + +package filters + +import ( + "fmt" + + "github.com/defenseunicorns/zarf/src/internal/packager/git" + "github.com/defenseunicorns/zarf/src/pkg/transform" + "github.com/defenseunicorns/zarf/src/types" + "github.com/go-git/go-git/v5/plumbing" +) + +// ByDifferentialData filters any images and repos already present in the reference package components. +func ByDifferentialData(diffData *types.DifferentialData) ComponentFilterStrategy { + return &differentialDataFilter{ + diffData: diffData, + } +} + +type differentialDataFilter struct { + diffData *types.DifferentialData +} + +func (f *differentialDataFilter) Apply(pkg types.ZarfPackage) ([]types.ZarfComponent, error) { + diffComponents := []types.ZarfComponent{} + for _, component := range pkg.Components { + filteredImages := []string{} + for _, img := range component.Images { + imgRef, err := transform.ParseImageRef(img) + if err != nil { + return nil, fmt.Errorf("unable to parse image ref %s: %w", img, err) + } + imgTag := imgRef.TagOrDigest + includeImage := imgTag == ":latest" || imgTag == ":stable" || imgTag == ":nightly" + if includeImage || !f.diffData.DifferentialImages[img] { + filteredImages = append(filteredImages, img) + } + } + component.Images = filteredImages + + filteredRepos := []string{} + for _, repoURL := range component.Repos { + _, refPlain, err := transform.GitURLSplitRef(repoURL) + if err != nil { + return nil, err + } + var ref plumbing.ReferenceName + if refPlain != "" { + ref = git.ParseRef(refPlain) + } + includeRepo := ref == "" || (!ref.IsTag() && !plumbing.IsHash(refPlain)) + if includeRepo || !f.diffData.DifferentialRepos[repoURL] { + filteredRepos = append(filteredRepos, repoURL) + } + } + component.Repos = filteredRepos + + diffComponents = append(diffComponents, component) + } + return diffComponents, nil +} diff --git a/src/pkg/packager/filters/diff_test.go b/src/pkg/packager/filters/diff_test.go new file mode 100644 index 0000000000..8ee64fab84 --- /dev/null +++ b/src/pkg/packager/filters/diff_test.go @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2021-Present The Zarf Authors + +package filters + +import ( + "testing" + + "github.com/defenseunicorns/zarf/src/types" + "github.com/stretchr/testify/require" +) + +func TestCopyFilter(t *testing.T) { + pkg := types.ZarfPackage{ + Components: []types.ZarfComponent{ + { + Images: []string{ + "example.com/include-image-tag:latest", + "example.com/image-with-tag:v1", + "example.com/diff-image-with-tag:v1", + "example.com/image-with-digest@sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "example.com/diff-image-with-digest@sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "example.com/image-with-tag-and-digest:v1@sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "example.com/diff-image-with-tag-and-digest:v1@sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + }, + Repos: []string{ + "https://example.com/no-ref.git", + "https://example.com/branch.git@refs/heads/main", + "https://example.com/tag.git@v1", + "https://example.com/diff-tag.git@v1", + "https://example.com/commit.git@524980951ff16e19dc25232e9aea8fd693989ba6", + "https://example.com/diff-commit.git@524980951ff16e19dc25232e9aea8fd693989ba6", + }, + }, + }, + } + loadedDiffData := types.DifferentialData{ + DifferentialImages: map[string]bool{ + "example.com/include-image-tag:latest": true, + "example.com/diff-image-with-tag:v1": true, + "example.com/diff-image-with-digest@sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855": true, + "example.com/diff-image-with-tag-and-digest:v1@sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855": true, + }, + DifferentialRepos: map[string]bool{ + "https://example.com/no-ref.git": true, + "https://example.com/branch.git@refs/heads/main": true, + "https://example.com/diff-tag.git@v1": true, + "https://example.com/diff-commit.git@524980951ff16e19dc25232e9aea8fd693989ba6": true, + }, + } + + filter := ByDifferentialData(&loadedDiffData) + diffComponents, err := filter.Apply(pkg) + require.NoError(t, err) + + expectedImages := []string{ + "example.com/include-image-tag:latest", + "example.com/image-with-tag:v1", + "example.com/image-with-digest@sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "example.com/image-with-tag-and-digest:v1@sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + } + require.ElementsMatch(t, expectedImages, diffComponents[0].Images) + expectedRepos := []string{ + "https://example.com/no-ref.git", + "https://example.com/branch.git@refs/heads/main", + "https://example.com/tag.git@v1", + "https://example.com/commit.git@524980951ff16e19dc25232e9aea8fd693989ba6", + } + require.ElementsMatch(t, expectedRepos, diffComponents[0].Repos) +}