@@ -999,4 +999,156 @@ describe('#compileIamRole', () => {
999999 'Fn::GetAtt' : [ 'MyTable' , 'Arn' ] ,
10001000 } ] ) ;
10011001 } ) ;
1002+
1003+ it ( 'should support callbacks' , ( ) => {
1004+ const getStateMachine = ( name , function1 , function2 , snsTopicArn , sqsQueueUrl ) => ( {
1005+ name,
1006+ definition : {
1007+ StartAt : 'A' ,
1008+ States : {
1009+ A : {
1010+ Type : 'Task' ,
1011+ Resource : 'arn:aws:states:::sns:publish.waitForTaskToken' ,
1012+ Parameters : {
1013+ Message : {
1014+ 'Input.$' : '$' ,
1015+ 'TaskToken.$' : '$$.Task.Token' ,
1016+ } ,
1017+ MessageStructure : 'json' ,
1018+ TopicArn : snsTopicArn ,
1019+ } ,
1020+ Next : 'B1' ,
1021+ } ,
1022+ B1 : {
1023+ Type : 'Task' ,
1024+ Resource : 'arn:aws:states:::lambda:invoke.waitForTaskToken' ,
1025+ Parameters : {
1026+ FunctionName : function1 ,
1027+ Payload : {
1028+ 'model.$' : '$' ,
1029+ 'token.$' : '$$.Task.Token' ,
1030+ } ,
1031+ } ,
1032+ Next : 'B2' ,
1033+ } ,
1034+ B2 : {
1035+ Type : 'Task' ,
1036+ Resource : 'arn:aws:states:::lambda:invoke.waitForTaskToken' ,
1037+ Parameters : {
1038+ FunctionName : function2 ,
1039+ Payload : {
1040+ 'model.$' : '$' ,
1041+ 'token.$' : '$$.Task.Token' ,
1042+ } ,
1043+ } ,
1044+ Next : 'C' ,
1045+ } ,
1046+ C : {
1047+ Type : 'Task' ,
1048+ Resource : 'arn:aws:states:::sqs:sendMessage.waitForTaskToken' ,
1049+ Parameters : {
1050+ QueueUrl : sqsQueueUrl ,
1051+ MessageBody : {
1052+ 'Input.$' : '$' ,
1053+ 'TaskToken.$' : '$$.Task.Token' ,
1054+ } ,
1055+ } ,
1056+ Next : 'D' ,
1057+ } ,
1058+ D : {
1059+ Type : 'Task' ,
1060+ Resource : 'arn:aws:states:::ecs:runTask.waitForTaskToken' ,
1061+ Parameters : {
1062+ LaunchType : 'FARGATE' ,
1063+ Cluster : 'cluster-arn' ,
1064+ TaskDefinition : 'job-id' ,
1065+ Overrides : {
1066+ ContainerOverrides : [
1067+ {
1068+ Name : 'cluster-name' ,
1069+ Environment : [
1070+ {
1071+ Name : 'TASK_TOKEN_ENV_VARIABLE' ,
1072+ 'Value.$' : '$$.Task.Token' ,
1073+ } ,
1074+ ] ,
1075+ } ,
1076+ ] ,
1077+ } ,
1078+ } ,
1079+ End : true ,
1080+ } ,
1081+ } ,
1082+ } ,
1083+ } ) ;
1084+
1085+ // function name can be...
1086+ const lambda1 = 'a' ; // name-only
1087+ const lambda2 = 'b:v1' ; // name-only with alias
1088+ const lambda3 = 'arn:aws:lambda:us-west-2:1234567890:function:c' ; // full arn
1089+ const lambda4 = '1234567890:function:d' ; // partial arn
1090+
1091+ const sns1 = 'arn:aws:sns:us-east-1:1234567890:foo' ;
1092+ const sns2 = 'arn:aws:sns:us-east-2:#{AWS::AccountId}:bar' ;
1093+
1094+ const sqs1 = 'https://sqs.us-east-1.amazonaws.com/1234567890/foo' ;
1095+ const sqs2 = 'https://sqs.us-east-2.amazonaws.com/#{AWS::AccountId}/bar' ;
1096+
1097+ const sqsArn1 = 'arn:aws:sqs:us-east-1:1234567890:foo' ;
1098+ const sqsArn2 = 'arn:aws:sqs:us-east-2:#{AWS::AccountId}:bar' ;
1099+
1100+ serverless . service . stepFunctions = {
1101+ stateMachines : {
1102+ myStateMachine1 : getStateMachine ( 'sm1' , lambda1 , lambda2 , sns1 , sqs1 ) ,
1103+ myStateMachine2 : getStateMachine ( 'sm2' , lambda3 , lambda4 , sns2 , sqs2 ) ,
1104+ } ,
1105+ } ;
1106+
1107+ serverlessStepFunctions . compileIamRole ( ) ;
1108+ const statements = serverlessStepFunctions . serverless . service
1109+ . provider . compiledCloudFormationTemplate . Resources . IamRoleStateMachineExecution
1110+ . Properties . Policies [ 0 ] . PolicyDocument . Statement ;
1111+
1112+ const ecsPermissions = statements . filter ( s =>
1113+ _ . isEqual ( s . Action , [ 'ecs:RunTask' , 'ecs:StopTask' , 'ecs:DescribeTasks' , 'iam:PassRole' ] )
1114+ ) ;
1115+ expect ( ecsPermissions ) . to . have . lengthOf ( 1 ) ;
1116+ expect ( ecsPermissions [ 0 ] . Resource ) . to . equal ( '*' ) ;
1117+
1118+ const eventPermissions = statements . filter ( s =>
1119+ _ . isEqual ( s . Action , [ 'events:PutTargets' , 'events:PutRule' , 'events:DescribeRule' ] )
1120+ ) ;
1121+ expect ( eventPermissions ) . to . has . lengthOf ( 1 ) ;
1122+ expect ( eventPermissions [ 0 ] . Resource ) . to . deep . eq ( [ {
1123+ 'Fn::Join' : [
1124+ ':' ,
1125+ [
1126+ 'arn:aws:events' ,
1127+ { Ref : 'AWS::Region' } ,
1128+ { Ref : 'AWS::AccountId' } ,
1129+ 'rule/StepFunctionsGetEventsForECSTaskRule' ,
1130+ ] ,
1131+ ] ,
1132+ } ] ) ;
1133+
1134+ const snsPermissions = statements . filter ( s => _ . isEqual ( s . Action , [ 'sns:Publish' ] ) ) ;
1135+ expect ( snsPermissions ) . to . have . lengthOf ( 1 ) ;
1136+ expect ( snsPermissions [ 0 ] . Resource ) . to . deep . eq ( [ sns1 , sns2 ] ) ;
1137+
1138+ const sqsPermissions = statements . filter ( s => _ . isEqual ( s . Action , [ 'sqs:SendMessage' ] ) ) ;
1139+ expect ( sqsPermissions ) . to . have . lengthOf ( 1 ) ;
1140+ expect ( sqsPermissions [ 0 ] . Resource ) . to . deep . eq ( [ sqsArn1 , sqsArn2 ] ) ;
1141+
1142+ const lambdaPermissions = statements . filter ( s =>
1143+ _ . isEqual ( s . Action , [ 'lambda:InvokeFunction' ] ) ) ;
1144+ expect ( lambdaPermissions ) . to . have . lengthOf ( 1 ) ;
1145+
1146+ const lambdaArns = [
1147+ { 'Fn::Sub' : 'arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:a' } ,
1148+ { 'Fn::Sub' : 'arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:b:v1' } ,
1149+ 'arn:aws:lambda:us-west-2:1234567890:function:c' ,
1150+ { 'Fn::Sub' : 'arn:aws:lambda:${AWS::Region}:1234567890:function:d' } ,
1151+ ] ;
1152+ expect ( lambdaPermissions [ 0 ] . Resource ) . to . deep . eq ( lambdaArns ) ;
1153+ } ) ;
10021154} ) ;
0 commit comments