From 5685987c4fb3df2020aba18672fca601cb29d87e Mon Sep 17 00:00:00 2001 From: Philip Laine Date: Fri, 3 May 2024 13:31:35 +0200 Subject: [PATCH] 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) +}