Skip to content

Commit

Permalink
fix panic on run --dry-run
Browse files Browse the repository at this point in the history
  • Loading branch information
fujiwara committed Nov 6, 2024
1 parent 6ab7213 commit a569d71
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 47 deletions.
6 changes: 4 additions & 2 deletions export_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,10 @@ func ResetAWSV2ConfigLoadOptionsFunc() {
awsv2ConfigLoadOptionsFunc = nil
}

func (d *App) TaskDefinitionArnForRun(ctx context.Context, opt RunOption) (string, error) {
return d.taskDefinitionArnForRun(ctx, opt)
type TaskDefinitionForRun = taskDefinitionForRun

func (d *App) ResolveTaskDefinitionForRun(ctx context.Context, opt RunOption) (*taskDefinitionForRun, error) {
return d.resolveTaskDefinitionForRun(ctx, opt)
}

func (opt *DiffOption) SetWriter(w io.Writer) {
Expand Down
57 changes: 35 additions & 22 deletions run.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,17 +63,25 @@ func (d *App) Run(ctx context.Context, opt RunOption) error {
d.Log("[DEBUG] Overrides")
d.LogJSON(ov)

tdArn, err := d.taskDefinitionArnForRun(ctx, opt)
tdForRun, err := d.resolveTaskDefinitionForRun(ctx, opt)
if err != nil {
return err
}
d.Log("Task definition ARN: %s", tdArn)
if tdForRun.Arn == "" && tdForRun.TaskDefinitionInput != nil {
d.Log("Task definition family %s will be registered", *tdForRun.TaskDefinitionInput.Family)
} else {
d.Log("Task definition ARN: %s", tdForRun.Arn)
}

td, err := d.DescribeTaskDefinition(ctx, tdArn)
if err != nil {
return err
if tdForRun.TaskDefinitionInput == nil {
var err error
td, err := d.DescribeTaskDefinition(ctx, tdForRun.Arn)
if err != nil {
return err
}
tdForRun.TaskDefinitionInput = td
}
watchContainer := containerOf(td, &opt.WatchContainer)
watchContainer := containerOf(tdForRun.TaskDefinitionInput, &opt.WatchContainer)
if watchContainer == nil {
return fmt.Errorf("container %s not found in the task definition", opt.WatchContainer)
}
Expand All @@ -84,7 +92,7 @@ func (d *App) Run(ctx context.Context, opt RunOption) error {
return nil
}

task, err := d.RunTask(ctx, tdArn, &ov, &opt)
task, err := d.RunTask(ctx, tdForRun.Arn, &ov, &opt)
if err != nil {
return err
}
Expand Down Expand Up @@ -239,63 +247,68 @@ func (d *App) waitTask(ctx context.Context, task *types.Task, untilRunning bool)
return nil
}

func (d *App) taskDefinitionArnForRun(ctx context.Context, opt RunOption) (string, error) {
type taskDefinitionForRun struct {
Arn string
TaskDefinitionInput *TaskDefinitionInput
}

func (d *App) resolveTaskDefinitionForRun(ctx context.Context, opt RunOption) (*taskDefinitionForRun, error) {
switch {
case *opt.Revision > 0:
if opt.LatestTaskDefinition {
return "", ErrConflictOptions("revision and latest-task-definition are exclusive")
return nil, ErrConflictOptions("revision and latest-task-definition are exclusive")
}
family, _, err := d.resolveTaskdefinition(ctx)
if err != nil {
return "", err
return nil, err
}
return fmt.Sprintf("%s:%d", family, *opt.Revision), nil
return &taskDefinitionForRun{Arn: fmt.Sprintf("%s:%d", family, *opt.Revision)}, nil
case opt.LatestTaskDefinition:
family, _, err := d.resolveTaskdefinition(ctx)
if err != nil {
return "", err
return nil, err
}
d.Log("Revision is not specified. Use latest task definition family " + family)
latestTdArn, err := d.findLatestTaskDefinitionArn(ctx, family)
if err != nil {
return "", err
return nil, err
}
return latestTdArn, nil
return &taskDefinitionForRun{Arn: latestTdArn}, nil
case opt.SkipTaskDefinition:
family, rev, err := d.resolveTaskdefinition(ctx)
if err != nil {
return "", err
return nil, err
}
if rev != "" {
return fmt.Sprintf("%s:%s", family, rev), nil
return &taskDefinitionForRun{Arn: fmt.Sprintf("%s:%s", family, rev)}, nil
}
d.Log("Revision is not specified. Use latest task definition family " + family)
latestTdArn, err := d.findLatestTaskDefinitionArn(ctx, family)
if err != nil {
return "", err
return nil, err
}
return latestTdArn, nil
return &taskDefinitionForRun{Arn: latestTdArn}, nil
default:
tdPath := opt.TaskDefinition
if tdPath == "" {
tdPath = d.config.TaskDefinitionPath
}
in, err := d.LoadTaskDefinition(tdPath)
if err != nil {
return "", err
return nil, err
}
{
b, _ := MarshalJSONForAPI(in)
d.Log("[DEBUG] task definition: %s", string(b))
}
if opt.DryRun {
return fmt.Sprintf("family %s will be registered", *in.Family), nil
return &taskDefinitionForRun{Arn: "", TaskDefinitionInput: in}, nil
}
newTd, err := d.RegisterTaskDefinition(ctx, in)
if err != nil {
return "", err
return nil, err
}
return *newTd.TaskDefinitionArn, nil
return &taskDefinitionForRun{Arn: *newTd.TaskDefinitionArn}, nil
}
}

Expand Down
58 changes: 35 additions & 23 deletions run_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,76 +11,81 @@ import (

type taskDefinitionArnForRunSuite struct {
opts []string
td string
arn string
family string
raiseErr bool
}

var testTaskDefinitionArnForRunSuite = map[string][]taskDefinitionArnForRunSuite{
"tests/run-with-sv.yaml": {
{
opts: []string{"--skip-task-definition"},
td: "katsubushi:39",
arn: "katsubushi:39",
},
{
opts: []string{"--skip-task-definition", "--revision=42"},
td: "katsubushi:42",
arn: "katsubushi:42",
},
{
opts: []string{"--latest-task-definition"},
td: "katsubushi:45",
arn: "katsubushi:45",
},
{
opts: []string{"--latest-task-definition", "--skip-task-definition"},
td: "katsubushi:45",
arn: "katsubushi:45",
},
{
opts: []string{"--latest-task-definition", "--skip-task-definition", "--revision=41"},
td: "katsubushi:41",
arn: "katsubushi:41",
raiseErr: true, // latest-task-definition and revision are exclusive
},
{
opts: []string{"--latest-task-definition", "--revision=41"},
td: "katsubushi:41",
arn: "katsubushi:41",
raiseErr: true, // latest-task-definition and revision are exclusive
},
{
opts: nil,
td: "family katsubushi will be registered",
opts: nil,
arn: "",
family: "katsubushi",
},
{
opts: []string{"--task-def=tests/run-test-td.json"},
td: "family test will be registered",
opts: []string{"--task-def=tests/run-test-td.json"},
arn: "",
family: "test",
},
},
"tests/run-without-sv.yaml": {
{
opts: []string{"--skip-task-definition"},
td: "katsubushi:45",
arn: "katsubushi:45",
},
{
opts: []string{"--skip-task-definition", "--revision=42"},
td: "katsubushi:42",
arn: "katsubushi:42",
},
{
opts: []string{"--latest-task-definition"},
td: "katsubushi:45",
arn: "katsubushi:45",
},
{
opts: []string{"--latest-task-definition", "--skip-task-definition"},
td: "katsubushi:45",
arn: "katsubushi:45",
},
{
opts: []string{"--latest-task-definition", "--revision=42"},
td: "katsubushi:42",
arn: "katsubushi:42",
raiseErr: true, // latest-task-definition and revision are exclusive
},
{
opts: nil,
td: "family katsubushi will be registered",
opts: nil,
arn: "",
family: "katsubushi",
},
{
opts: []string{"--task-def=tests/run-test-td.json"},
td: "family test will be registered",
opts: []string{"--task-def=tests/run-test-td.json"},
arn: "",
family: "test",
},
},
}
Expand Down Expand Up @@ -110,7 +115,7 @@ func TestTaskDefinitionArnForRun(t *testing.T) {
t.Error(err)
}
opts := *cliopts.Run
tdArn, err := app.TaskDefinitionArnForRun(ctx, opts)
td, err := app.ResolveTaskDefinitionForRun(ctx, opts)
if s.raiseErr {
if err == nil {
t.Errorf("%s %s expected error, but got nil", config, args)
Expand All @@ -121,8 +126,15 @@ func TestTaskDefinitionArnForRun(t *testing.T) {
t.Errorf("%s %s unexpected error: %s", config, args, err)
continue
}
if td := ecspresso.ArnToName(tdArn); td != s.td {
t.Errorf("%s %s expected %s, got %s", config, args, s.td, td)
if td.Arn != "" {
if name := ecspresso.ArnToName(td.Arn); name != s.arn {
t.Errorf("%s %s expected %s, got %s", config, args, s.arn, name)
}
} else {
family := *td.TaskDefinitionInput.Family
if family != s.family {
t.Errorf("%s %s expected %s, got %s", config, args, s.family, family)
}
}
}
}
Expand Down

0 comments on commit a569d71

Please sign in to comment.