From d7cf11b876797f83842a0ec715ef71697c557ad8 Mon Sep 17 00:00:00 2001 From: cellarspoon Date: Wed, 5 Jan 2022 17:57:48 +0100 Subject: [PATCH] fix: further fixes for gracefully handling missing tag Follows 1b37d2d5f5e3a4b8c45481f082cb6f9d25cefdae. --- cli/recipe/upgrade.go | 7 +++++-- pkg/compose/compose.go | 32 +++++++++++++++++--------------- pkg/recipe/recipe.go | 10 ++++++---- 3 files changed, 28 insertions(+), 21 deletions(-) diff --git a/cli/recipe/upgrade.go b/cli/recipe/upgrade.go index 5cf512da..36c70c6e 100644 --- a/cli/recipe/upgrade.go +++ b/cli/recipe/upgrade.go @@ -241,10 +241,13 @@ You may invoke this command in "wizard" mode and be prompted for input: } } if upgradeTag != "skip" { - if err := recipe.UpdateTag(image, upgradeTag); err != nil { + ok, err := recipe.UpdateTag(image, upgradeTag) + if err != nil { logrus.Fatal(err) } - logrus.Infof("tag upgraded from %s to %s for %s", tag.String(), upgradeTag, image) + if ok { + logrus.Infof("tag upgraded from %s to %s for %s", tag.String(), upgradeTag, image) + } } else { logrus.Warnf("not upgrading %s, skipping as requested", image) } diff --git a/pkg/compose/compose.go b/pkg/compose/compose.go index 688c0876..a1e898c4 100644 --- a/pkg/compose/compose.go +++ b/pkg/compose/compose.go @@ -16,10 +16,10 @@ import ( ) // UpdateTag updates an image tag in-place on file system local compose files. -func UpdateTag(pattern, image, tag, recipeName string) error { +func UpdateTag(pattern, image, tag, recipeName string) (bool, error) { composeFiles, err := filepath.Glob(pattern) if err != nil { - return err + return false, err } logrus.Debugf("considering %s config(s) for tag update", strings.Join(composeFiles, ", ")) @@ -30,12 +30,12 @@ func UpdateTag(pattern, image, tag, recipeName string) error { envSamplePath := path.Join(config.RECIPES_DIR, recipeName, ".env.sample") sampleEnv, err := config.ReadEnv(envSamplePath) if err != nil { - return err + return false, err } compose, err := loader.LoadComposefile(opts, sampleEnv) if err != nil { - return err + return false, err } for _, service := range compose.Services { @@ -45,24 +45,26 @@ func UpdateTag(pattern, image, tag, recipeName string) error { img, _ := reference.ParseNormalizedNamed(service.Image) if err != nil { - return err + return false, err + } + + var composeTag string + switch img.(type) { + case reference.NamedTagged: + composeTag = img.(reference.NamedTagged).Tag() + default: + // unable to parse, typically image missing tag + return false, nil } composeImage := reference.Path(img) - if strings.Contains(composeImage, "library") { - // ParseNormalizedNamed prepends 'library' to images like nginx:, - // postgres:, i.e. images which do not have a username in the - // first position of the string - composeImage = strings.Split(composeImage, "/")[1] - } - composeTag := img.(reference.NamedTagged).Tag() logrus.Debugf("parsed %s from %s", composeTag, service.Image) if image == composeImage { bytes, err := ioutil.ReadFile(composeFile) if err != nil { - return err + return false, err } old := fmt.Sprintf("%s:%s", composeImage, composeTag) @@ -72,13 +74,13 @@ func UpdateTag(pattern, image, tag, recipeName string) error { logrus.Debugf("updating %s to %s in %s", old, new, compose.Filename) if err := ioutil.WriteFile(compose.Filename, []byte(replacedBytes), 0764); err != nil { - return err + return true, err } } } } - return nil + return false, nil } // UpdateLabel updates a label in-place on file system local compose files. diff --git a/pkg/recipe/recipe.go b/pkg/recipe/recipe.go index 296913d0..6fd0f43f 100644 --- a/pkg/recipe/recipe.go +++ b/pkg/recipe/recipe.go @@ -163,15 +163,17 @@ func (r Recipe) UpdateLabel(pattern, serviceName, label string) error { } // UpdateTag updates a recipe tag -func (r Recipe) UpdateTag(image, tag string) error { +func (r Recipe) UpdateTag(image, tag string) (bool, error) { pattern := fmt.Sprintf("%s/%s/compose**yml", config.RECIPES_DIR, r.Name) image = StripTagMeta(image) - if err := compose.UpdateTag(pattern, image, tag, r.Name); err != nil { - return err + ok, err := compose.UpdateTag(pattern, image, tag, r.Name) + if err != nil { + return false, err } - return nil + + return ok, nil } // Tags list the recipe tags