Skip to content

Commit

Permalink
feat(filter): handle digest based parts (#57)
Browse files Browse the repository at this point in the history
Signed-off-by: Nico <rainbowstack@gmail.com>
  • Loading branch information
bluebrown authored May 24, 2024
1 parent 2a6bc83 commit 066dcfe
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 22 deletions.
8 changes: 7 additions & 1 deletion krm/comment.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,12 @@ const (
KeyContext = "context"
)

const (
PartTag = "tag"
PartDigest = "digest"
PartTagDigest = "tag+digest"
)

type Options struct {
Type string
Tag string
Expand All @@ -46,7 +52,7 @@ func ParseOpts(expr string) (Options, error) {
case KeyContext:
opts.Context = strings.TrimSpace(v)
default:
return opts, fmt.Errorf("unknown key: %s", v)
return opts, fmt.Errorf("unknown key: %s", k)
}
}
return opts, nil
Expand Down
54 changes: 35 additions & 19 deletions krm/filter.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,56 +8,72 @@ import (
"sigs.k8s.io/kustomize/kyaml/yaml"
)

func DefaultNodeHandler(_, currentRef, nextRef string, opts Options) (string, Change, error) {
if currentRef == nextRef {
return currentRef, Change{}, nil
func DefaultNodeHandler(_, curr, next string, opts Options) (string, Change, error) {
if curr == next {
return curr, Change{}, nil
}

fullRef := currentRef
if opts.Part == "tag" {
fullRef = fmt.Sprintf("%s:%s", opts.Context, currentRef)
rawRef := curr
switch opts.Part {
case PartTag, PartTagDigest:
rawRef = strings.TrimSuffix(fmt.Sprintf("%s:%s", opts.Context, curr), ":")
case PartDigest:
rawRef = strings.TrimSuffix(fmt.Sprintf("%s@%s", opts.Context, curr), "@")
}
oldRef, err := name.ParseReference(fullRef)

oldRef, err := name.ParseReference(rawRef)
if err != nil {
return currentRef, Change{}, err
return curr, Change{}, err
}

newRef, _, err := ParseImageRefWithDigest(nextRef)
newRef, digest, err := ParseImageRefWithDigest(next)
if err != nil {
return currentRef, Change{}, err
return curr, Change{}, err
}

if oldRef.Context().Name() != newRef.Context().Name() {
return currentRef, Change{}, nil
return curr, Change{}, nil
}

ok, err := MatchTag(newRef.Identifier(), opts)
if err != nil {
return currentRef, Change{}, err
return curr, Change{}, err
}

if !ok {
return currentRef, Change{}, nil
return curr, Change{}, nil
}

if _, err := name.ParseReference(nextRef); err != nil {
return currentRef, Change{}, err
if _, err := name.ParseReference(next); err != nil {
return curr, Change{}, err
}

c := Change{
Description: fmt.Sprintf("update image ref %q to %q", currentRef, nextRef),
Description: fmt.Sprintf("update image ref %q to %q", curr, next),
Registry: newRef.Context().RegistryStr(),
Repo: newRef.Context().RepositoryStr(),
}

if opts.Part == "tag" {
switch opts.Part {
case "":
return next, c, nil

case PartTag:
return newRef.Identifier(), c, nil

case PartDigest:
return digest, c, nil

case PartTagDigest:
return strings.TrimSuffix(fmt.Sprintf("%s@%s", newRef.Identifier(), digest), "@"), c, nil

default:
return curr, Change{}, fmt.Errorf("unknown part: %s", opts.Part)
}

return nextRef, c, nil
}

var CommentPrefix = "# kobold:"
const CommentPrefix = "# kobold:"

type NodeHandler func(key, currentRef, nextRef string, opts Options) (string, Change, error)

Expand Down
34 changes: 32 additions & 2 deletions krm/filter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,9 +139,8 @@ func Test_renderer_Render(t *testing.T) {
},
wantSourceFieldValue: map[string][]wantFieldValue{},
},

// // FIXME: if there is a yaml parse error, the whole render process will fail
// // needs to use .krm ignore to ignore invalid yaml portions
// // needs to use .krmignore to ignore invalid yaml portions
// {
// name: "helm skip errors",
// giveDir: "helm-skip-errors",
Expand Down Expand Up @@ -237,6 +236,37 @@ func Test_renderer_Render(t *testing.T) {
},
},
},
{
name: "parts",
giveDir: "parts",
giveEvents: []string{
"docker.io/foo/baz:1.0.1@sha256:220611111e8c9bbe242e9dc1367c0fa89eef83f26203ee3f7c3764046e02b248",
},
wantSourceFieldValue: map[string][]wantFieldValue{
"stuff.yaml": {
{
rnodeIndex: 0,
field: "full",
value: "docker.io/foo/baz:1.0.1@sha256:220611111e8c9bbe242e9dc1367c0fa89eef83f26203ee3f7c3764046e02b248",
},
{
rnodeIndex: 0,
field: "tag",
value: "1.0.1",
},
{
rnodeIndex: 0,
field: "digest",
value: "sha256:220611111e8c9bbe242e9dc1367c0fa89eef83f26203ee3f7c3764046e02b248",
},
{
rnodeIndex: 0,
field: "tag+digest",
value: "1.0.1@sha256:220611111e8c9bbe242e9dc1367c0fa89eef83f26203ee3f7c3764046e02b248",
},
},
},
},
}
for _, tt := range tests {
tt := tt
Expand Down
4 changes: 4 additions & 0 deletions krm/testdata/parts/stuff.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
full: docker.io/foo/baz # kobold: tag: ^1; type: semver
tag: latest # kobold: tag: ^1; type: semver; part: tag; context: docker.io/foo/baz
digest: sha256:220611111e8c7bbe242e9dc1367c0fa8933f83f26203ee3f7c376a046e02b2ef # kobold: tag: ^1; type: semver; part: digest; context: docker.io/foo/baz
tag+digest: latest@sha256:220611111e8c7bbe242e9dc1367c0fa8933f83f26203ee3f7c376a046e02b2ef # kobold: tag: ^1; type: semver; part: tag+digest; context: docker.io/foo/baz

0 comments on commit 066dcfe

Please sign in to comment.