From f8b31b21d92321799c117afba28959e600cb05f4 Mon Sep 17 00:00:00 2001 From: knoflook Date: Fri, 1 Oct 2021 19:48:48 +0200 Subject: [PATCH 1/4] WIP: #172 upgrade --major/minor/patch placeholder --- cli/recipe/upgrade.go | 70 +++++++++++++++++++++++++++++-------------- 1 file changed, 48 insertions(+), 22 deletions(-) diff --git a/cli/recipe/upgrade.go b/cli/recipe/upgrade.go index 627d46b8..e1884c94 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,44 @@ is up to the end-user to decide. } logrus.Debugf("detected compatible upgradable tags '%s' for '%s'", compatibleStrings, service.Name) + if bumpType != 0 { + if bumpType == 1 { + // Patch upgrade + fmt.Println("Patch") + } else if bumpType == 2 { + // Minor upgrade + fmt.Println("Minor") + } else { + // Major upgrade + fmt.Println("Major") + } + } 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) + } + } - 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) } } - - var upgradeTag string - 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) + /* + 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) + */ } return nil -- 2.49.0 From 3f1ddc049e5f808e98fde20dbc892d881faa31de Mon Sep 17 00:00:00 2001 From: knoflook Date: Fri, 1 Oct 2021 20:33:24 +0200 Subject: [PATCH 2/4] feat: upgrade an app with no user input with --minor/major/patch flag --- cli/recipe/upgrade.go | 31 +++++++++++++++---------------- go.mod | 2 +- go.sum | 4 ++++ 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/cli/recipe/upgrade.go b/cli/recipe/upgrade.go index e1884c94..dbf6d8ac 100644 --- a/cli/recipe/upgrade.go +++ b/cli/recipe/upgrade.go @@ -117,16 +117,18 @@ is up to the end-user to decide. } logrus.Debugf("detected compatible upgradable tags '%s' for '%s'", compatibleStrings, service.Name) + var upgradeTag string if bumpType != 0 { - if bumpType == 1 { - // Patch upgrade - fmt.Println("Patch") - } else if bumpType == 2 { - // Minor upgrade - fmt.Println("Minor") - } else { - // Major upgrade - fmt.Println("Major") + 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 + } } } else { msg := fmt.Sprintf("upgrade to which tag? (service: %s, tag: %s)", service.Name, tag) @@ -140,7 +142,6 @@ is up to the end-user to decide. } } - var upgradeTag string prompt := &survey.Select{ Message: msg, Options: compatibleStrings, @@ -149,12 +150,10 @@ is up to the end-user to decide. 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) - */ + 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) } 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= -- 2.49.0 From 61f73bae6f436ea158fffe0098f713bff602cc3c Mon Sep 17 00:00:00 2001 From: knoflook Date: Mon, 4 Oct 2021 13:40:24 +0200 Subject: [PATCH 3/4] fix: --major/minor/patch is the most serious upgrade you want to do --- cli/recipe/upgrade.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cli/recipe/upgrade.go b/cli/recipe/upgrade.go index dbf6d8ac..ad2f8e9e 100644 --- a/cli/recipe/upgrade.go +++ b/cli/recipe/upgrade.go @@ -125,7 +125,7 @@ is up to the end-user to decide. return err } delta := tagcmp.UpgradeType(upElement) - if delta == bumpType { + if delta <= bumpType { upgradeTag = upTag.String() break } @@ -150,10 +150,11 @@ is up to the end-user to decide. 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 updated from '%s' to '%s' for '%s'", tag.String(), upgradeTag, recipe.Name) } return nil -- 2.49.0 From 5af4bb4f10ac4a63a2faa0212f456f39b245334f Mon Sep 17 00:00:00 2001 From: knoflook Date: Tue, 5 Oct 2021 11:39:05 +0200 Subject: [PATCH 4/4] fix: don't crash when there is a more serious upgrade available --- cli/recipe/upgrade.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cli/recipe/upgrade.go b/cli/recipe/upgrade.go index ad2f8e9e..59613d6c 100644 --- a/cli/recipe/upgrade.go +++ b/cli/recipe/upgrade.go @@ -130,6 +130,10 @@ is up to the end-user to decide. 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()) { @@ -154,7 +158,7 @@ is up to the end-user to decide. if err := recipe.UpdateTag(image, upgradeTag); err != nil { logrus.Fatal(err) } - logrus.Infof("tag updated from '%s' to '%s' for '%s'", tag.String(), upgradeTag, recipe.Name) + logrus.Infof("tag upgraded from '%s' to '%s' for '%s'", tag.String(), upgradeTag, image) } return nil -- 2.49.0