Skip to content

Commit

Permalink
chore: refactor remove copies from components to a filter
Browse files Browse the repository at this point in the history
  • Loading branch information
phillebaba committed May 3, 2024
1 parent 7169a92 commit 04d20e7
Show file tree
Hide file tree
Showing 4 changed files with 136 additions and 49 deletions.
48 changes: 0 additions & 48 deletions src/pkg/packager/creator/differential.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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
}
4 changes: 3 additions & 1 deletion src/pkg/packager/creator/normal.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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
}
Expand Down
63 changes: 63 additions & 0 deletions src/pkg/packager/filters/diff.go
Original file line number Diff line number Diff line change
@@ -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
}
70 changes: 70 additions & 0 deletions src/pkg/packager/filters/diff_test.go
Original file line number Diff line number Diff line change
@@ -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)
}

0 comments on commit 04d20e7

Please sign in to comment.