Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 20 additions & 8 deletions internal/pkg/cli/task_run.go
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,7 @@ func (o *runTaskOpts) configureSessAndEnv() error {

if o.env != "" {
var err error
env, err = o.targetEnv()
env, err = o.targetEnv(o.appName, o.env)
if err != nil {
return err
}
Expand Down Expand Up @@ -604,27 +604,39 @@ func (o *runTaskOpts) generateCommand() error {

func (o *runTaskOpts) runTaskCommand() (cliStringer, error) {
var cmd cliStringer
sess, err := o.provider.Default()
if err != nil {
return nil, fmt.Errorf("get default session: %s", err)
}
if arn.IsARN(o.generateCommandTarget) {
clusterName, serviceName, err := o.parseARN()
if err != nil {
return nil, err
}
sess, err := o.provider.Default()
if err != nil {
return nil, fmt.Errorf("get default session: %s", err)
}
return o.runTaskCommandFromECSService(sess, clusterName, serviceName)
}
parts := strings.Split(o.generateCommandTarget, "/")
switch len(parts) {
case 2:
clusterName, serviceName := parts[0], parts[1]
sess, err := o.provider.Default()
if err != nil {
return nil, fmt.Errorf("get default session: %s", err)
}
cmd, err = o.runTaskCommandFromECSService(sess, clusterName, serviceName)
if err != nil {
return nil, err
}
case 3:
appName, envName, workloadName := parts[0], parts[1], parts[2]
env, err := o.targetEnv(appName, envName)
if err != nil {
return nil, err
}
sess, err := o.provider.FromRole(env.ManagerRoleARN, env.Region)
if err != nil {
return nil, fmt.Errorf("get environment session: %s", err)
}
cmd, err = o.runTaskCommandFromWorkload(sess, appName, envName, workloadName)
if err != nil {
return nil, err
Expand Down Expand Up @@ -837,7 +849,7 @@ func (o *runTaskOpts) validateAppName() error {

func (o *runTaskOpts) validateEnvName() error {
if o.appName != "" {
if _, err := o.targetEnv(); err != nil {
if _, err := o.targetEnv(o.appName, o.env); err != nil {
return err
}
} else {
Expand Down Expand Up @@ -889,8 +901,8 @@ func (o *runTaskOpts) askEnvName() error {
return nil
}

func (o *runTaskOpts) targetEnv() (*config.Environment, error) {
env, err := o.store.GetEnvironment(o.appName, o.env)
func (o *runTaskOpts) targetEnv(appName, envName string) (*config.Environment, error) {
env, err := o.store.GetEnvironment(appName, envName)
if err != nil {
return nil, fmt.Errorf("get environment %s config: %w", o.env, err)
}
Expand Down
48 changes: 37 additions & 11 deletions internal/pkg/cli/task_run_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1084,7 +1084,11 @@ func TestTaskRunOpts_runTaskCommand(t *testing.T) {
"should generate a command given an app/env/svc target": {
inGenerateCommandTarget: "good-app/good-env/good-service",
setUpMocks: func(m *taskRunMocks) {
m.provider.EXPECT().Default()
m.store.EXPECT().GetEnvironment("good-app", "good-env").Return(&config.Environment{
ManagerRoleARN: "mock-role",
Region: "mock-region",
}, nil)
m.provider.EXPECT().FromRole("mock-role", "mock-region")
m.store.EXPECT().GetJob("good-app", "good-service").Return(nil, &config.ErrNoSuchJob{})
m.store.EXPECT().GetService("good-app", "good-service").Return(&config.Workload{}, nil)
},
Expand All @@ -1098,7 +1102,11 @@ func TestTaskRunOpts_runTaskCommand(t *testing.T) {
"fail to generate a command given an app/env/svc target": {
inGenerateCommandTarget: "good-app/good-env/good-service",
setUpMocks: func(m *taskRunMocks) {
m.provider.EXPECT().Default()
m.store.EXPECT().GetEnvironment("good-app", "good-env").Return(&config.Environment{
ManagerRoleARN: "mock-role",
Region: "mock-region",
}, nil)
m.provider.EXPECT().FromRole("mock-role", "mock-region")
m.store.EXPECT().GetJob("good-app", "good-service").Return(nil, &config.ErrNoSuchJob{})
m.store.EXPECT().GetService("good-app", "good-service").Return(&config.Workload{}, nil)
},
Expand All @@ -1112,7 +1120,11 @@ func TestTaskRunOpts_runTaskCommand(t *testing.T) {
"should generate a command given an app/env/job target": {
inGenerateCommandTarget: "good-app/good-env/good-job",
setUpMocks: func(m *taskRunMocks) {
m.provider.EXPECT().Default()
m.store.EXPECT().GetEnvironment("good-app", "good-env").Return(&config.Environment{
ManagerRoleARN: "mock-role",
Region: "mock-region",
}, nil)
m.provider.EXPECT().FromRole("mock-role", "mock-region")
m.store.EXPECT().GetJob("good-app", "good-job").Return(&config.Workload{}, nil)
},
mockRunTaskRequester: mockRunTaskRequester{
Expand All @@ -1125,7 +1137,11 @@ func TestTaskRunOpts_runTaskCommand(t *testing.T) {
"fail to generate a command given an app/env/job target": {
inGenerateCommandTarget: "good-app/good-env/good-job",
setUpMocks: func(m *taskRunMocks) {
m.provider.EXPECT().Default()
m.store.EXPECT().GetEnvironment("good-app", "good-env").Return(&config.Environment{
ManagerRoleARN: "mock-role",
Region: "mock-region",
}, nil)
m.provider.EXPECT().FromRole("mock-role", "mock-region")
m.store.EXPECT().GetJob("good-app", "good-job").Return(&config.Workload{}, nil)
},
mockRunTaskRequester: mockRunTaskRequester{
Expand All @@ -1138,15 +1154,23 @@ func TestTaskRunOpts_runTaskCommand(t *testing.T) {
"fail to determine if the workload is a job given an app/env/workload target": {
inGenerateCommandTarget: "good-app/good-env/bad-workload",
setUpMocks: func(m *taskRunMocks) {
m.provider.EXPECT().Default()
m.store.EXPECT().GetEnvironment("good-app", "good-env").Return(&config.Environment{
ManagerRoleARN: "mock-role",
Region: "mock-region",
}, nil)
m.provider.EXPECT().FromRole("mock-role", "mock-region")
m.store.EXPECT().GetJob("good-app", "bad-workload").Return(nil, errors.New("some error"))
},
wantedError: fmt.Errorf("determine whether workload bad-workload is a job: some error"),
},
"fail to determine if the workload is a service given an app/env/workload target": {
inGenerateCommandTarget: "good-app/good-env/bad-workload",
setUpMocks: func(m *taskRunMocks) {
m.provider.EXPECT().Default()
m.store.EXPECT().GetEnvironment("good-app", "good-env").Return(&config.Environment{
ManagerRoleARN: "mock-role",
Region: "mock-region",
}, nil)
m.provider.EXPECT().FromRole("mock-role", "mock-region")
m.store.EXPECT().GetJob("good-app", "bad-workload").Return(nil, &config.ErrNoSuchJob{})
m.store.EXPECT().GetService("good-app", "bad-workload").Return(nil, errors.New("some error"))
},
Expand All @@ -1155,18 +1179,20 @@ func TestTaskRunOpts_runTaskCommand(t *testing.T) {
"workload is neither a job nor a service": {
inGenerateCommandTarget: "good-app/good-env/bad-workload",
setUpMocks: func(m *taskRunMocks) {
m.provider.EXPECT().Default()
m.store.EXPECT().GetEnvironment("good-app", "good-env").Return(&config.Environment{
ManagerRoleARN: "mock-role",
Region: "mock-region",
}, nil)
m.provider.EXPECT().FromRole("mock-role", "mock-region")
m.store.EXPECT().GetJob("good-app", "bad-workload").Return(nil, &config.ErrNoSuchJob{})
m.store.EXPECT().GetService("good-app", "bad-workload").Return(nil, &config.ErrNoSuchService{})
},
wantedError: fmt.Errorf("workload bad-workload is neither a service nor a job"),
},
"invalid input": {
inGenerateCommandTarget: "invalid/illegal/not-good/input/is/bad",
setUpMocks: func(m *taskRunMocks) {
m.provider.EXPECT().Default()
},
wantedError: errors.New("invalid input to --generate-cmd: must be of format <cluster>/<service> or <app>/<env>/<workload>"),
setUpMocks: func(m *taskRunMocks) {},
wantedError: errors.New("invalid input to --generate-cmd: must be of format <cluster>/<service> or <app>/<env>/<workload>"),
},
}
for name, tc := range testCases {
Expand Down