From ab1ee006a77fa87811ecb6f6f60fefadabe0afb6 Mon Sep 17 00:00:00 2001 From: Marko Mikulicic Date: Fri, 11 Sep 2020 11:42:15 +0200 Subject: [PATCH] Fix annotation merge and knot8 pull with Knot8file --- cmd/knot8/main.go | 6 ++++-- cmd/knot8/manifest.go | 27 +++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/cmd/knot8/main.go b/cmd/knot8/main.go index 7af18a2..f9711b8 100644 --- a/cmd/knot8/main.go +++ b/cmd/knot8/main.go @@ -273,6 +273,7 @@ func renderOriginalAnnoBody(fields map[string]Field) ([]byte, error) { type PullCmd struct { CommonFlags + CommonSchemaFlags Upstream string `arg:"" help:"Upstream file/URL." type:"file"` } @@ -283,7 +284,7 @@ func (s *PullCmd) Run(ctx *Context) error { return fmt.Errorf("pull/merge with %d files currently not supported", len(s.Paths)) } - manifestSetC, err := openFields(s.Paths, "") + manifestSetC, err := openFields(s.Paths, s.Schema) if err != nil { return err } @@ -304,7 +305,7 @@ func (s *PullCmd) Run(ctx *Context) error { return err } - manifestSetU, err := openFields([]string{upstream.Name()}, "") + manifestSetU, err := openFields([]string{upstream.Name()}, s.Schema) if err != nil { return err } @@ -479,6 +480,7 @@ func openFields(paths []string, schema string) (*ManifestSet, error) { return nil, err } ms = ms.Intersect(manifests) + manifests.MergeAnnotations(ms) ext, err := parseFields(ms) if err != nil { return nil, err diff --git a/cmd/knot8/manifest.go b/cmd/knot8/manifest.go index 8f02576..7155276 100644 --- a/cmd/knot8/manifest.go +++ b/cmd/knot8/manifest.go @@ -78,8 +78,7 @@ func parseManifests(f *shadowFile) (Manifests, error) { } for k := range m.Metadata.Annotations { - c := strings.SplitN(k, "/", 2) - if !strings.HasSuffix(c[0], annoDomain) { + if !isOurAnnotation(k) { delete(m.Metadata.Annotations, k) } } @@ -134,3 +133,27 @@ func (ms Manifests) Intersect(src Manifests) Manifests { } return res } + +// MergeAnnotations copies annotations from the src into ms if they exist +func (ms Manifests) MergeAnnotations(src Manifests) { + anns := map[FQN]map[string]string{} + for _, s := range src { + anns[s.FQN()] = s.Metadata.Annotations + } + + for _, d := range ms { + for k, v := range anns[d.FQN()] { + if isOurAnnotation(k) { + if d.Metadata.Annotations == nil { + d.Metadata.Annotations = map[string]string{} + } + d.Metadata.Annotations[k] = v + } + } + } +} + +func isOurAnnotation(a string) bool { + c := strings.SplitN(a, "/", 2) + return strings.HasSuffix(c[0], annoDomain) +}