@@ -203,6 +203,7 @@ type runLocalExecuteMocks struct {
203203 ecsClient * mocks.MockecsClient
204204 store * mocks.Mockstore
205205 sessCreds credentials.Provider
206+ sessProvider * mocks.MocksessionProvider
206207 interpolator * mocks.Mockinterpolator
207208 ws * mocks.MockwsWlDirReader
208209 mockMft * mockWorkloadMft
@@ -268,6 +269,7 @@ func TestRunLocalOpts_Execute(t *testing.T) {
268269 }
269270
270271 taskDef := & awsecs.TaskDefinition {
272+ TaskRoleArn : aws .String ("mock-arn" ),
271273 ContainerDefinitions : []* sdkecs.ContainerDefinition {
272274 {
273275 Name : aws .String ("foo" ),
@@ -328,6 +330,7 @@ func TestRunLocalOpts_Execute(t *testing.T) {
328330 },
329331 }
330332 alteredTaskDef := & awsecs.TaskDefinition {
333+ TaskRoleArn : aws .String ("mock-arn" ),
331334 ContainerDefinitions : []* sdkecs.ContainerDefinition {
332335 {
333336 Name : aws .String ("foo" ),
@@ -429,6 +432,52 @@ func TestRunLocalOpts_Execute(t *testing.T) {
429432 "AWS_SESSION_TOKEN" : "myEnvToken" ,
430433 },
431434 }
435+ expectedTaskRoleTask := orchestrator.Task {
436+ Containers : map [string ]orchestrator.ContainerDefinition {
437+ "foo" : {
438+ ImageURI : "image1" ,
439+ EnvVars : map [string ]string {
440+ "FOO_VAR" : "foo-value" ,
441+ },
442+ Secrets : map [string ]string {
443+ "SHARED_SECRET" : "secretvalue" ,
444+ "AWS_ACCESS_KEY_ID" : "taskRoleID" ,
445+ "AWS_SECRET_ACCESS_KEY" : "taskRoleSecret" ,
446+ "AWS_SESSION_TOKEN" : "taskRoleToken" ,
447+ "AWS_DEFAULT_REGION" : testRegion ,
448+ "AWS_REGION" : testRegion ,
449+ },
450+ Ports : map [string ]string {
451+ "80" : "8080" ,
452+ "999" : "9999" ,
453+ },
454+ IsEssential : true ,
455+ DependsOn : map [string ]string {
456+ "bar" : "start" ,
457+ },
458+ },
459+ "bar" : {
460+ ImageURI : "image2" ,
461+ EnvVars : map [string ]string {
462+ "BAR_VAR" : "bar-value" ,
463+ },
464+ Secrets : map [string ]string {
465+ "SHARED_SECRET" : "secretvalue" ,
466+ "AWS_ACCESS_KEY_ID" : "taskRoleID" ,
467+ "AWS_SECRET_ACCESS_KEY" : "taskRoleSecret" ,
468+ "AWS_SESSION_TOKEN" : "taskRoleToken" ,
469+ "AWS_DEFAULT_REGION" : testRegion ,
470+ "AWS_REGION" : testRegion ,
471+ },
472+ Ports : map [string ]string {
473+ "777" : "7777" ,
474+ "10000" : "10000" ,
475+ },
476+ IsEssential : true ,
477+ DependsOn : map [string ]string {},
478+ },
479+ },
480+ }
432481
433482 testCases := map [string ]struct {
434483 inputAppName string
@@ -437,6 +486,7 @@ func TestRunLocalOpts_Execute(t *testing.T) {
437486 inputEnvOverrides map [string ]string
438487 inputPortOverrides []string
439488 inputWatch bool
489+ inputTaskRole bool
440490 inputProxy bool
441491 buildImagesError error
442492
@@ -467,6 +517,20 @@ func TestRunLocalOpts_Execute(t *testing.T) {
467517 },
468518 wantedError : errors .New (`get task: get env vars: parse env overrides: "bad:OVERRIDE" targets invalid container` ),
469519 },
520+ "error retrieving task role credentials" : {
521+ inputAppName : testAppName ,
522+ inputWkldName : testWkldName ,
523+ inputEnvName : testEnvName ,
524+ inputTaskRole : true ,
525+ setupMocks : func (t * testing.T , m * runLocalExecuteMocks ) {
526+ m .ecsClient .EXPECT ().TaskDefinition (testAppName , testEnvName , testWkldName ).Return (taskDef , nil )
527+ m .ssm .EXPECT ().GetSecretValue (gomock .Any (), "mysecret" ).Return ("secretvalue" , nil )
528+ m .ecsClient .EXPECT ().TaskDefinition (testAppName , testEnvName , testWkldName ).Return (taskDef , nil )
529+ m .sessProvider .EXPECT ().FromRole ("mock-arn" , testRegion ).Return (nil , errors .New ("some error" ))
530+ },
531+ wantedError : errors .New (`get task: retrieve task role credentials: some error
532+ ecs exec method not implemented` ),
533+ },
470534 "error reading workload manifest" : {
471535 inputAppName : testAppName ,
472536 inputWkldName : testWkldName ,
@@ -743,6 +807,39 @@ func TestRunLocalOpts_Execute(t *testing.T) {
743807 }
744808 },
745809 },
810+ "success, one run task call, taskrole assumerole method" : {
811+ inputAppName : testAppName ,
812+ inputWkldName : testWkldName ,
813+ inputEnvName : testEnvName ,
814+ inputTaskRole : true ,
815+ setupMocks : func (t * testing.T , m * runLocalExecuteMocks ) {
816+ m .ecsClient .EXPECT ().TaskDefinition (testAppName , testEnvName , testWkldName ).Return (taskDef , nil )
817+ m .ssm .EXPECT ().GetSecretValue (gomock .Any (), "mysecret" ).Return ("secretvalue" , nil )
818+ m .ecsClient .EXPECT ().TaskDefinition (testAppName , testEnvName , testWkldName ).Return (taskDef , nil )
819+ taskRoleSess := & session.Session {
820+ Config : & aws.Config {
821+ Credentials : credentials .NewStaticCredentials ("taskRoleID" , "taskRoleSecret" , "taskRoleToken" ),
822+ Region : aws .String (testRegion ),
823+ },
824+ }
825+ m .sessProvider .EXPECT ().FromRole ("mock-arn" , testRegion ).Return (taskRoleSess , nil )
826+ m .ws .EXPECT ().ReadWorkloadManifest (testWkldName ).Return ([]byte ("" ), nil )
827+ m .interpolator .EXPECT ().Interpolate ("" ).Return ("" , nil )
828+
829+ errCh := make (chan error , 1 )
830+ m .orchestrator .StartFn = func () <- chan error {
831+ errCh <- errors .New ("some error" )
832+ return errCh
833+ }
834+ m .orchestrator .RunTaskFn = func (task orchestrator.Task , opts ... orchestrator.RunTaskOption ) {
835+ require .Equal (t , expectedTaskRoleTask , task )
836+ }
837+ m .orchestrator .StopFn = func () {
838+ require .Len (t , errCh , 0 )
839+ close (errCh )
840+ }
841+ },
842+ },
746843 "handles ctrl-c, waits to get all errors" : {
747844 inputAppName : testAppName ,
748845 inputWkldName : testWkldName ,
@@ -959,6 +1056,7 @@ func TestRunLocalOpts_Execute(t *testing.T) {
9591056 ssm : mocks .NewMocksecretGetter (ctrl ),
9601057 secretsManager : mocks .NewMocksecretGetter (ctrl ),
9611058 store : mocks .NewMockstore (ctrl ),
1059+ sessProvider : mocks .NewMocksessionProvider (ctrl ),
9621060 interpolator : mocks .NewMockinterpolator (ctrl ),
9631061 ws : mocks .NewMockwsWlDirReader (ctrl ),
9641062 mockRunner : mocks .NewMockexecRunner (ctrl ),
@@ -978,6 +1076,7 @@ func TestRunLocalOpts_Execute(t *testing.T) {
9781076 envName : tc .inputEnvName ,
9791077 envOverrides : tc .inputEnvOverrides ,
9801078 watch : tc .inputWatch ,
1079+ useTaskRole : tc .inputTaskRole ,
9811080 portOverrides : portOverrides {
9821081 {
9831082 host : "777" ,
@@ -1007,6 +1106,7 @@ func TestRunLocalOpts_Execute(t *testing.T) {
10071106 ssm : m .ssm ,
10081107 secretsManager : m .secretsManager ,
10091108 store : m .store ,
1109+ sessProvider : m .sessProvider ,
10101110 sess : & session.Session {
10111111 Config : & aws.Config {
10121112 Credentials : credentials .NewStaticCredentials ("myID" , "mySecret" , "myToken" ),
0 commit comments