From 419bc0ad9d188c388208e471563ab10eb9b00f66 Mon Sep 17 00:00:00 2001 From: fujiwara Date: Sat, 25 Mar 2023 00:43:16 +0900 Subject: [PATCH] ecspresso revisons --revision (current|latest|[number]) --- cli_test.go | 20 ++++++++++++++++-- revisions.go | 59 +++++++++++++++++++++++++++++++++++----------------- 2 files changed, 58 insertions(+), 21 deletions(-) diff --git a/cli_test.go b/cli_test.go index 23b4bb42..3bf262ad 100644 --- a/cli_test.go +++ b/cli_test.go @@ -394,7 +394,7 @@ var cliTests = []struct { args: []string{"revisions"}, sub: "revisions", subOption: &ecspresso.RevisionsOption{ - Revision: ptr(int64(0)), + Revision: ptr(""), Output: ptr("table"), }, }, @@ -402,7 +402,23 @@ var cliTests = []struct { args: []string{"revisions", "--revision", "123", "--output", "json"}, sub: "revisions", subOption: &ecspresso.RevisionsOption{ - Revision: ptr(int64(123)), + Revision: ptr("123"), + Output: ptr("json"), + }, + }, + { + args: []string{"revisions", "--revision", "current", "--output", "json"}, + sub: "revisions", + subOption: &ecspresso.RevisionsOption{ + Revision: ptr("current"), + Output: ptr("json"), + }, + }, + { + args: []string{"revisions", "--revision", "latest", "--output", "json"}, + sub: "revisions", + subOption: &ecspresso.RevisionsOption{ + Revision: ptr("latest"), Output: ptr("json"), }, }, diff --git a/revisions.go b/revisions.go index 5cdae955..706f1355 100644 --- a/revisions.go +++ b/revisions.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "os" + "strconv" "strings" "github.com/aws/aws-sdk-go-v2/aws" @@ -14,7 +15,7 @@ import ( ) type RevisionsOption struct { - Revision *int64 `help:"revision number to output" default:"0"` + Revision *string `help:"revision number or 'current' or 'latest'" default:""` Output *string `help:"output format (json, table, tsv)" default:"table" enum:"json,table,tsv"` } @@ -72,30 +73,17 @@ func (d *App) Revesions(ctx context.Context, opt RevisionsOption) error { ctx, cancel := d.Start(ctx) defer cancel() - inUse, err := d.inUseRevisions(ctx) + td, err := d.LoadTaskDefinition(d.config.TaskDefinitionPath) if err != nil { return err } - td, err := d.LoadTaskDefinition(d.config.TaskDefinitionPath) - if err != nil { - return err + if rv := aws.ToString(opt.Revision); rv != "" { + return d.dumpRevision(ctx, aws.ToString(td.Family), rv) } - if r := aws.ToInt64(opt.Revision); r > 0 { - name := fmt.Sprintf("%s:%d", aws.ToString(td.Family), r) - res, err := d.ecs.DescribeTaskDefinition(ctx, &ecs.DescribeTaskDefinitionInput{ - TaskDefinition: &name, - Include: []types.TaskDefinitionField{types.TaskDefinitionFieldTags}, - }) - if err != nil { - return fmt.Errorf("failed to describe task definition %s: %w", name, err) - } - b, err := MarshalJSONForAPI(res.TaskDefinition) - if err != nil { - return err - } - _, err = os.Stdout.Write(b) + inUse, err := d.inUseRevisions(ctx) + if err != nil { return err } @@ -133,3 +121,36 @@ func (d *App) Revesions(ctx context.Context, opt RevisionsOption) error { } return nil } + +func (d *App) dumpRevision(ctx context.Context, family string, rv string) error { + var name string + switch rv { + case "current": + family, revision, err := d.resolveTaskdefinition(ctx) + if err != nil { + return err + } + name = family + ":" + revision + case "latest": + name = family + default: + rint64, err := strconv.ParseInt(rv, 10, 64) + if err != nil { + return fmt.Errorf("invalid revision: %s", rv) + } + name = fmt.Sprintf("%s:%d", family, rint64) + } + res, err := d.ecs.DescribeTaskDefinition(ctx, &ecs.DescribeTaskDefinitionInput{ + TaskDefinition: &name, + Include: []types.TaskDefinitionField{types.TaskDefinitionFieldTags}, + }) + if err != nil { + return fmt.Errorf("failed to describe task definition %s: %w", name, err) + } + b, err := MarshalJSONForAPI(res.TaskDefinition) + if err != nil { + return err + } + _, err = os.Stdout.Write(b) + return err +}