@@ -220,6 +220,7 @@ func TestGenerationAwsAdvancedOptsConsolidated(t *testing.T) {
220220 MsgMenu {cmd .AwsAdvancedOptDone , 2 },
221221 MsgRsp {cmd .QuestionConsolidatedCloudtrail , "y" },
222222 MsgRsp {cmd .QuestionUseExistingCloudtrail , "n" },
223+ MsgRsp {cmd .QuestionEnableCloudtrailOrganization , "n" },
223224 MsgRsp {cmd .QuestionCloudtrailName , "" },
224225 // S3 Bucket Questions
225226 MsgRsp {cmd .QuestionBucketName , "" },
@@ -277,6 +278,7 @@ func TestGenerationAwsAdvancedOptsUseExistingCloudtrail(t *testing.T) {
277278 MsgMenu {cmd .AwsAdvancedOptDone , 2 },
278279 MsgRsp {cmd .QuestionConsolidatedCloudtrail , "n" },
279280 MsgRsp {cmd .QuestionUseExistingCloudtrail , "y" },
281+ MsgRsp {cmd .QuestionEnableCloudtrailOrganization , "n" },
280282 MsgRsp {cmd .QuestionCloudtrailExistingBucketArn , "notright" },
281283 MsgRsp {"invalid arn supplied" , "arn:aws:s3:::bucket_name" },
282284 // SNS Topic Questions
@@ -330,6 +332,7 @@ func TestGenerationAwsAdvancedOptsConsolidatedWithSubAccounts(t *testing.T) {
330332 MsgMenu {cmd .AwsAdvancedOptDone , 2 },
331333 MsgRsp {cmd .QuestionConsolidatedCloudtrail , "y" },
332334 MsgRsp {cmd .QuestionUseExistingCloudtrail , "n" },
335+ MsgRsp {cmd .QuestionEnableCloudtrailOrganization , "n" },
333336 MsgRsp {cmd .QuestionCloudtrailName , "" },
334337 MsgRsp {cmd .QuestionBucketName , "" },
335338 MsgRsp {cmd .QuestionBucketEnableEncryption , "y" },
@@ -546,6 +549,7 @@ func TestGenerationAwsAdvancedOptsUseExistingElements(t *testing.T) {
546549 MsgMenu {cmd .AwsAdvancedOptDone , 2 },
547550 MsgRsp {cmd .QuestionConsolidatedCloudtrail , "n" },
548551 MsgRsp {cmd .QuestionUseExistingCloudtrail , "y" },
552+ MsgRsp {cmd .QuestionEnableCloudtrailOrganization , "n" },
549553 MsgRsp {cmd .QuestionCloudtrailExistingBucketArn , bucketArn },
550554 MsgRsp {cmd .QuestionsUseExistingSNSTopic , "y" },
551555 MsgRsp {cmd .QuestionSnsTopicArn , topicArn },
@@ -599,6 +603,7 @@ func TestGenerationAwsAdvancedOptsCreateNewElements(t *testing.T) {
599603 MsgMenu {cmd .AwsAdvancedOptDone , 2 },
600604 MsgRsp {cmd .QuestionConsolidatedCloudtrail , "n" },
601605 MsgRsp {cmd .QuestionUseExistingCloudtrail , "n" },
606+ MsgRsp {cmd .QuestionEnableCloudtrailOrganization , "n" },
602607 MsgRsp {cmd .QuestionCloudtrailName , trailName },
603608 // S3 Questions
604609 MsgRsp {cmd .QuestionBucketName , bucketName },
@@ -894,6 +899,7 @@ func TestGenerationAwsS3BucketNotificationInteractive(t *testing.T) {
894899
895900 MsgRsp {cmd .QuestionConsolidatedCloudtrail , "" },
896901 MsgRsp {cmd .QuestionUseExistingCloudtrail , "" },
902+ MsgRsp {cmd .QuestionEnableCloudtrailOrganization , "n" },
897903 MsgRsp {cmd .QuestionCloudtrailName , "" },
898904 // S3 Questions
899905 MsgRsp {cmd .QuestionBucketName , "" },
@@ -930,6 +936,176 @@ func TestGenerationAwsS3BucketNotificationInteractive(t *testing.T) {
930936 assert .Equal (t , buildTf , tfResult )
931937}
932938
939+ func TestGenerationAwsCloudtrailOrganization (t * testing.T ) {
940+ os .Setenv ("LW_NOCACHE" , "true" )
941+ defer os .Setenv ("LW_NOCACHE" , "" )
942+ var final string
943+ var runError error
944+ region := "us-west-2"
945+
946+ tfResult := runGenerateTest (t ,
947+ func (c * expect.Console ) {
948+ expectsCliOutput (t , c , []MsgRspHandler {
949+ MsgRsp {cmd .QuestionEnableAgentless , "n" },
950+ MsgRsp {cmd .QuestionAwsEnableConfig , "n" },
951+ MsgRsp {cmd .QuestionEnableCloudtrail , "y" },
952+ MsgRsp {cmd .QuestionAwsRegion , region },
953+
954+ MsgRsp {cmd .QuestionAwsConfigAdvanced , "y" },
955+ MsgMenu {cmd .AwsAdvancedOptDone , 0 },
956+
957+ MsgRsp {cmd .QuestionConsolidatedCloudtrail , "" },
958+ MsgRsp {cmd .QuestionUseExistingCloudtrail , "" },
959+ MsgRsp {cmd .QuestionEnableCloudtrailOrganization , "y" },
960+ MsgRsp {cmd .QuestionCloudtrailName , "" },
961+ MsgRsp {cmd .QuestionConfigureCloudtrailOrganizationMappings , "n" },
962+ // S3 Questions
963+ MsgRsp {cmd .QuestionBucketName , "" },
964+ MsgRsp {cmd .QuestionBucketEnableEncryption , "" },
965+ MsgRsp {cmd .QuestionBucketSseKeyArn , "" },
966+ MsgRsp {cmd .QuestionS3BucketNotification , "n" },
967+ // SNS Topic Questions
968+ MsgRsp {cmd .QuestionsUseExistingSNSTopic , "" },
969+ MsgRsp {cmd .QuestionSnsTopicName , "" },
970+ MsgRsp {cmd .QuestionSnsEnableEncryption , "" },
971+ MsgRsp {cmd .QuestionSnsEncryptionKeyArn , "" },
972+ // SQS Questions
973+ MsgRsp {cmd .QuestionSqsQueueName , "" },
974+ MsgRsp {cmd .QuestionSqsEnableEncryption , "" },
975+ MsgRsp {cmd .QuestionSqsEncryptionKeyArn , "" },
976+
977+ MsgRsp {cmd .QuestionAwsAnotherAdvancedOpt , "n" },
978+ MsgRsp {cmd .QuestionRunTfPlan , "n" },
979+ })
980+
981+ final , _ = c .ExpectEOF ()
982+ },
983+ "generate" ,
984+ "cloud-account" ,
985+ "aws" ,
986+ )
987+
988+ assert .Nil (t , runError )
989+ assert .Contains (t , final , "Terraform code saved in" )
990+
991+ buildTf , _ := aws .NewTerraform (region , true , false , false ,
992+ true ).Generate ()
993+ assert .Equal (t , buildTf , tfResult )
994+ }
995+
996+ func TestGenerationAwsCloudtrailOrganizationAccountMappings (t * testing.T ) {
997+ os .Setenv ("LW_NOCACHE" , "true" )
998+ defer os .Setenv ("LW_NOCACHE" , "" )
999+ var final string
1000+ var runError error
1001+ region := "us-west-2"
1002+
1003+ tfResult := runGenerateTest (t ,
1004+ func (c * expect.Console ) {
1005+ expectsCliOutput (t , c , []MsgRspHandler {
1006+ MsgRsp {cmd .QuestionEnableAgentless , "n" },
1007+ MsgRsp {cmd .QuestionAwsEnableConfig , "n" },
1008+ MsgRsp {cmd .QuestionEnableCloudtrail , "y" },
1009+ MsgRsp {cmd .QuestionAwsRegion , region },
1010+
1011+ MsgRsp {cmd .QuestionAwsConfigAdvanced , "y" },
1012+ MsgMenu {cmd .AwsAdvancedOptDone , 0 },
1013+
1014+ MsgRsp {cmd .QuestionConsolidatedCloudtrail , "" },
1015+ MsgRsp {cmd .QuestionUseExistingCloudtrail , "" },
1016+ MsgRsp {cmd .QuestionEnableCloudtrailOrganization , "y" },
1017+ MsgRsp {cmd .QuestionCloudtrailName , "" },
1018+ MsgRsp {cmd .QuestionConfigureCloudtrailOrganizationMappings , "y" },
1019+ MsgRsp {cmd .QuestionCloudtrailAccountMappingsLWDefaultAccount , "main" },
1020+ MsgRsp {cmd .QuestionCloudtrailOrgAccountMappingsLWAccount , "sub-account-1" },
1021+ MsgMultilineRsp {cmd .QuestionCloudtrailOrgAccountMappingsAwsAccounts , []string {"123456789011" }},
1022+ MsgRsp {cmd .QuestionCloudtrailOrgAccountMappingAnotherAdvancedOpt , "n" },
1023+ // S3 Questions
1024+ MsgRsp {cmd .QuestionBucketName , "" },
1025+ MsgRsp {cmd .QuestionBucketEnableEncryption , "" },
1026+ MsgRsp {cmd .QuestionBucketSseKeyArn , "" },
1027+ MsgRsp {cmd .QuestionS3BucketNotification , "n" },
1028+ // SNS Topic Questions
1029+ MsgRsp {cmd .QuestionsUseExistingSNSTopic , "" },
1030+ MsgRsp {cmd .QuestionSnsTopicName , "" },
1031+ MsgRsp {cmd .QuestionSnsEnableEncryption , "" },
1032+ MsgRsp {cmd .QuestionSnsEncryptionKeyArn , "" },
1033+ // SQS Questions
1034+ MsgRsp {cmd .QuestionSqsQueueName , "" },
1035+ MsgRsp {cmd .QuestionSqsEnableEncryption , "" },
1036+ MsgRsp {cmd .QuestionSqsEncryptionKeyArn , "" },
1037+
1038+ MsgRsp {cmd .QuestionAwsAnotherAdvancedOpt , "n" },
1039+ MsgRsp {cmd .QuestionRunTfPlan , "n" },
1040+ })
1041+
1042+ final , _ = c .ExpectEOF ()
1043+ },
1044+ "generate" ,
1045+ "cloud-account" ,
1046+ "aws" ,
1047+ )
1048+
1049+ assert .Nil (t , runError )
1050+ assert .Contains (t , final , "Terraform code saved in" )
1051+
1052+ orgAccountMappings := aws.OrgAccountMapping {
1053+ DefaultLaceworkAccount : "main" ,
1054+ Mapping : []aws.OrgAccountMap {
1055+ {
1056+ LaceworkAccount : "sub-account-1" ,
1057+ AwsAccounts : []string {"123456789011" },
1058+ },
1059+ },
1060+ }
1061+
1062+ buildTf , _ := aws .NewTerraform (region , true , false , false ,
1063+ true , aws .WithOrgAccountMappings (orgAccountMappings )).Generate ()
1064+ assert .Equal (t , buildTf , tfResult )
1065+ }
1066+
1067+ func TestGenerationCloudtrailOrgMappingsNonInteractive (t * testing.T ) {
1068+ os .Setenv ("LW_NOCACHE" , "true" )
1069+ defer os .Setenv ("LW_NOCACHE" , "" )
1070+ var final string
1071+ var runError error
1072+ region := "us-east-2"
1073+
1074+ tfResult := runGenerateTest (t ,
1075+ func (c * expect.Console ) {
1076+ final , _ = c .ExpectEOF ()
1077+ },
1078+ "generate" ,
1079+ "ca" ,
1080+ "aws" ,
1081+ "--cloudtrail" ,
1082+ "--aws_region" ,
1083+ "us-east-2" ,
1084+ "--aws_organization" ,
1085+ "--cloudtrail_org_account_mapping" ,
1086+ "{\" default_lacework_account\" :\" main\" , \" mapping\" : [{ \" aws_accounts\" : [\" 123456789011\" ], \" lacework_account\" : \" sub-account-1\" }]}" ,
1087+ "--noninteractive" ,
1088+ )
1089+
1090+ assert .Nil (t , runError )
1091+ assert .Contains (t , final , "Terraform code saved in" )
1092+
1093+ orgAccountMappings := aws.OrgAccountMapping {
1094+ DefaultLaceworkAccount : "main" ,
1095+ Mapping : []aws.OrgAccountMap {
1096+ {
1097+ LaceworkAccount : "sub-account-1" ,
1098+ AwsAccounts : []string {"123456789011" },
1099+ },
1100+ },
1101+ }
1102+
1103+ buildTf , _ := aws .NewTerraform (region , true , false , false ,
1104+ true , aws .WithOrgAccountMappings (orgAccountMappings )).Generate ()
1105+
1106+ assert .Equal (t , buildTf , tfResult )
1107+ }
1108+
9331109// Test Agentless organization integration
9341110func TestGenerationAgentlessOrganization (t * testing.T ) {
9351111 os .Setenv ("LW_NOCACHE" , "true" )
0 commit comments