From 450136ca1a589601e95975a935df9e47d4bec50d Mon Sep 17 00:00:00 2001 From: Fabio Ribeiro Date: Sun, 5 May 2024 16:57:13 +0200 Subject: [PATCH] chore(bump): bumps region versions Bump will be responsible to verify the greatest version across regions and creates region version until reach the latest. --- cmd/bump.go | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++++ cmd/root.go | 5 ++- go.mod | 9 +++++ go.sum | 18 ++++++++++ 4 files changed, 127 insertions(+), 3 deletions(-) create mode 100644 cmd/bump.go diff --git a/cmd/bump.go b/cmd/bump.go new file mode 100644 index 0000000..733d8cc --- /dev/null +++ b/cmd/bump.go @@ -0,0 +1,98 @@ +/* + * Copyright (c) Fabio da Silva Ribeiro + * SPDX-License-Identifier: MIT + */ + +package cmd + +import ( + "bytes" + "errors" + "fmt" + + "golang.org/x/sync/errgroup" + + "github.com/aws/aws-sdk-go-v2/config" + "github.com/urfave/cli/v2" + + "github.com/faabiosr/lb/internal" +) + +var bumpCmd = &cli.Command{ + Name: "bump", + Description: "bump layer to latest version across regions", + Flags: []cli.Flag{ + &cli.StringSliceFlag{ + Name: "regions", + Aliases: []string{"r"}, + Usage: "list of regions separated by comma.", + Required: true, + }, + }, + ArgsUsage: "layer-name", + Action: func(cc *cli.Context) error { + name := cc.Args().First() + if name == "" { + return errors.New(`required argument "layer-name" not set`) + } + + regions := cc.StringSlice("regions") + if len(regions) <= 1 { + return errors.New(`required flag "regions" must contain at least two regions`) + } + + cfg, err := config.LoadDefaultConfig(cc.Context) + if err != nil { + return fmt.Errorf("failed to load aws config: %w", err) + } + + l := internal.LoadLayer(cfg, name) + + greatest, err := l.GreatestVersion(cc.Context, regions) + if err != nil { + return err + } + + if greatest.Number == 0 { + return errors.New("there are no published versions") + } + + g, ctx := errgroup.WithContext(cc.Context) + + for _, region := range regions { + g.Go(func() error { + latest, err := l.LatestVersion(ctx, region) + if err != nil { + return err + } + + for i := latest.Number; i < greatest.Number; i++ { + current, err := l.FetchVersion(ctx, i+1, greatest.Region) + if err != nil { + return err + } + + buf := &bytes.Buffer{} + if err := l.DownloadVersion(ctx, current, buf); err != nil { + return err + } + + current.Region = region + current.Content.File = buf.Bytes() + + if err := l.PublishVersion(ctx, current); err != nil { + return err + } + } + + return nil + }) + } + + if err := g.Wait(); err != nil { + return err + } + + return nil + }, +} diff --git a/cmd/root.go b/cmd/root.go index cd50e54..6bb6290 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -52,7 +52,6 @@ Commands:{{template "visibleCommandCategoryTemplate" .}}{{end}} For more information on a command, use '{{.HelpName}} [command] --help'. ` - // nolint:unused commandHelpTemplate = `{{.HelpName}}{{if .Description}} - {{template "descriptionTemplate" .}}{{end}} Usage: {{if .UsageText}}{{wrap .UsageText 3}}{{else}}{{.HelpName}}{{if .VisibleFlags}} [options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}{{if .Args}}[arguments...]{{end}}[arguments...]{{end}}{{end}}{{if .VisibleFlags}} @@ -89,12 +88,12 @@ func newCmd() *cli.App { return nil } + app.Commands = commands(bumpCmd) + return app } // commands sets custom help templates and default values. -// -// nolint:unused func commands(cmds ...*cli.Command) []*cli.Command { for _, cmd := range cmds { cmd.Usage = cmd.Description diff --git a/go.mod b/go.mod index b1d9dcd..f510a62 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.22 require ( github.com/aws/aws-sdk-go-v2 v1.26.0 + github.com/aws/aws-sdk-go-v2/config v1.27.9 github.com/aws/aws-sdk-go-v2/service/lambda v1.53.3 github.com/urfave/cli/v2 v2.27.1 golang.org/x/sync v0.6.0 @@ -11,8 +12,16 @@ require ( require ( github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.1 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.9 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.0 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.4 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.4 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.6 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.20.3 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.3 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.28.5 // indirect github.com/aws/smithy-go v1.20.1 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect diff --git a/go.sum b/go.sum index e813397..2c9bec1 100644 --- a/go.sum +++ b/go.sum @@ -2,12 +2,30 @@ github.com/aws/aws-sdk-go-v2 v1.26.0 h1:/Ce4OCiM3EkpW7Y+xUnfAFpchU78K7/Ug01sZni9 github.com/aws/aws-sdk-go-v2 v1.26.0/go.mod h1:35hUlJVYd+M++iLI3ALmVwMOyRYMmRqUXpTtRGW+K9I= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.1 h1:gTK2uhtAPtFcdRRJilZPx8uJLL2J85xK11nKtWL0wfU= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.1/go.mod h1:sxpLb+nZk7tIfCWChfd+h4QwHNUR57d8hA1cleTkjJo= +github.com/aws/aws-sdk-go-v2/config v1.27.9 h1:gRx/NwpNEFSk+yQlgmk1bmxxvQ5TyJ76CWXs9XScTqg= +github.com/aws/aws-sdk-go-v2/config v1.27.9/go.mod h1:dK1FQfpwpql83kbD873E9vz4FyAxuJtR22wzoXn3qq0= +github.com/aws/aws-sdk-go-v2/credentials v1.17.9 h1:N8s0/7yW+h8qR8WaRlPQeJ6czVMNQVNtNdUqf6cItao= +github.com/aws/aws-sdk-go-v2/credentials v1.17.9/go.mod h1:446YhIdmSV0Jf/SLafGZalQo+xr2iw7/fzXGDPTU1yQ= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.0 h1:af5YzcLf80tv4Em4jWVD75lpnOHSBkPUZxZfGkrI3HI= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.0/go.mod h1:nQ3how7DMnFMWiU1SpECohgC82fpn4cKZ875NDMmwtA= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.4 h1:0ScVK/4qZ8CIW0k8jOeFVsyS/sAiXpYxRBLolMkuLQM= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.4/go.mod h1:84KyjNZdHC6QZW08nfHI6yZgPd+qRgaWcYsyLUo3QY8= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.4 h1:sHmMWWX5E7guWEFQ9SVo6A3S4xpPrWnd77a6y4WM6PU= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.4/go.mod h1:WjpDrhWisWOIoS9n3nk67A3Ll1vfULJ9Kq6h29HTD48= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1 h1:EyBZibRTVAs6ECHZOw5/wlylS9OcTzwyjeQMudmREjE= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1/go.mod h1:JKpmtYhhPs7D97NL/ltqz7yCkERFW5dOlHyVl66ZYF8= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.6 h1:b+E7zIUHMmcB4Dckjpkapoy47W6C9QBv/zoUP+Hn8Kc= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.6/go.mod h1:S2fNV0rxrP78NhPbCZeQgY8H9jdDMeGtwcfZIRxzBqU= github.com/aws/aws-sdk-go-v2/service/lambda v1.53.3 h1:KsKBuL+bIKhY7SMk+MXSBAj8PLHsTqlU2d0px98azyI= github.com/aws/aws-sdk-go-v2/service/lambda v1.53.3/go.mod h1:trTURvQC8AJ41JYhFpVrZKY5tfzGgVUcSijVgfmgl8w= +github.com/aws/aws-sdk-go-v2/service/sso v1.20.3 h1:mnbuWHOcM70/OFUlZZ5rcdfA8PflGXXiefU/O+1S3+8= +github.com/aws/aws-sdk-go-v2/service/sso v1.20.3/go.mod h1:5HFu51Elk+4oRBZVxmHrSds5jFXmFj8C3w7DVF2gnrs= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.3 h1:uLq0BKatTmDzWa/Nu4WO0M1AaQDaPpwTKAeByEc6WFM= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.3/go.mod h1:b+qdhjnxj8GSR6t5YfphOffeoQSQ1KmpoVVuBn+PWxs= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.5 h1:J/PpTf/hllOjx8Xu9DMflff3FajfLxqM5+tepvVXmxg= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.5/go.mod h1:0ih0Z83YDH/QeQ6Ori2yGE2XvWYv/Xm+cZc01LC6oK0= github.com/aws/smithy-go v1.20.1 h1:4SZlSlMr36UEqC7XOyRVb27XMeZubNcBNN+9IgEPIQw= github.com/aws/smithy-go v1.20.1/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=