diff --git a/cli/recipe/upgrade.go b/cli/recipe/upgrade.go index 627d46b8..59613d6c 100644 --- a/cli/recipe/upgrade.go +++ b/cli/recipe/upgrade.go @@ -29,9 +29,22 @@ semver-like convention. In this case, all possible tags will be listed and it is up to the end-user to decide. `, ArgsUsage: "", + Flags: []cli.Flag{ + PatchFlag, + MinorFlag, + MajorFlag, + }, Action: func(c *cli.Context) error { recipe := internal.ValidateRecipe(c) + bumpType := btoi(Major)*4 + btoi(Minor)*2 + btoi(Patch) + if bumpType != 0 { + // a bitwise check if the number is a power of 2 + if (bumpType & (bumpType - 1)) != 0 { + logrus.Fatal("you can only use one of: --major, --minor, --patch.") + } + } + for _, service := range recipe.Config.Services { catlVersions, err := catalogue.VersionsOfService(recipe.Name, service.Name) if err != nil { @@ -104,31 +117,48 @@ is up to the end-user to decide. } logrus.Debugf("detected compatible upgradable tags '%s' for '%s'", compatibleStrings, service.Name) - - msg := fmt.Sprintf("upgrade to which tag? (service: %s, tag: %s)", service.Name, tag) - if !tagcmp.IsParsable(img.(reference.NamedTagged).Tag()) { - tag := img.(reference.NamedTagged).Tag() - logrus.Warning(fmt.Sprintf("unable to determine versioning semantics of '%s', listing all tags", tag)) - msg = fmt.Sprintf("upgrade to which tag? (service: %s, tag: %s)", service.Name, tag) - compatibleStrings = []string{} - for _, regVersion := range regVersions { - compatibleStrings = append(compatibleStrings, regVersion.Name) - } - } - var upgradeTag string - prompt := &survey.Select{ - Message: msg, - Options: compatibleStrings, - } - if err := survey.AskOne(prompt, &upgradeTag); err != nil { - logrus.Fatal(err) + if bumpType != 0 { + for _, upTag := range compatible { + upElement, err := tag.UpgradeElement(upTag) + if err != nil { + return err + } + delta := tagcmp.UpgradeType(upElement) + if delta <= bumpType { + upgradeTag = upTag.String() + break + } + } + if upgradeTag == "" { + logrus.Warnf("not upgrading from '%s' to '%s' for '%s', because the upgrade type is more serious than what user wants.", tag.String(), compatible[0].String(), image) + continue + } + } else { + msg := fmt.Sprintf("upgrade to which tag? (service: %s, tag: %s)", service.Name, tag) + if !tagcmp.IsParsable(img.(reference.NamedTagged).Tag()) { + tag := img.(reference.NamedTagged).Tag() + logrus.Warning(fmt.Sprintf("unable to determine versioning semantics of '%s', listing all tags", tag)) + msg = fmt.Sprintf("upgrade to which tag? (service: %s, tag: %s)", service.Name, tag) + compatibleStrings = []string{} + for _, regVersion := range regVersions { + compatibleStrings = append(compatibleStrings, regVersion.Name) + } + } + + prompt := &survey.Select{ + Message: msg, + Options: compatibleStrings, + } + if err := survey.AskOne(prompt, &upgradeTag); err != nil { + logrus.Fatal(err) + } } if err := recipe.UpdateTag(image, upgradeTag); err != nil { logrus.Fatal(err) } - logrus.Debugf("tag updated from '%s' to '%s' for '%s'", image, upgradeTag, recipe.Name) + logrus.Infof("tag upgraded from '%s' to '%s' for '%s'", tag.String(), upgradeTag, image) } return nil diff --git a/go.mod b/go.mod index a1934ba6..32495d25 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module coopcloud.tech/abra go 1.17 require ( - coopcloud.tech/tagcmp v0.0.0-20210906102006-2a8edd82d75d + coopcloud.tech/tagcmp v0.0.0-20211003080922-7b06d1c16182 github.com/AlecAivazis/survey/v2 v2.3.1 github.com/Autonomic-Cooperative/godotenv v1.3.1-0.20210731170023-c37c0920d1a4 github.com/Gurpartap/logrus-stack v0.0.0-20170710170904-89c00d8a28f4 diff --git a/go.sum b/go.sum index fe7354d0..82ce42e0 100644 --- a/go.sum +++ b/go.sum @@ -23,6 +23,10 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= coopcloud.tech/tagcmp v0.0.0-20210906102006-2a8edd82d75d h1:5jeUIiToqQ7vTlLeycdGp4Ezurd6/RTNl5K38usHtoo= coopcloud.tech/tagcmp v0.0.0-20210906102006-2a8edd82d75d/go.mod h1:ESVm0wQKcbcFi06jItF3rI7enf4Jt2PvbkWpDDHk1DQ= +coopcloud.tech/tagcmp v0.0.0-20211003074705-03d2daced95c h1:7kCjnhjrOevcJeA/koCyyv20E6AglvqC7biGbLzyrbU= +coopcloud.tech/tagcmp v0.0.0-20211003074705-03d2daced95c/go.mod h1:ESVm0wQKcbcFi06jItF3rI7enf4Jt2PvbkWpDDHk1DQ= +coopcloud.tech/tagcmp v0.0.0-20211003080922-7b06d1c16182 h1:VGFzudsoGXGRaw5eJE3rErHHUDsmuIJpQkdfKJgrNs4= +coopcloud.tech/tagcmp v0.0.0-20211003080922-7b06d1c16182/go.mod h1:ESVm0wQKcbcFi06jItF3rI7enf4Jt2PvbkWpDDHk1DQ= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/AlecAivazis/survey/v2 v2.3.1 h1:lzkuHA60pER7L4eYL8qQJor4bUWlJe4V0gqAT19tdOA= github.com/AlecAivazis/survey/v2 v2.3.1/go.mod h1:TH2kPCDU3Kqq7pLbnCWwZXDBjnhZtmsCle5EiYDJ2fg=