@@ -664,6 +664,70 @@ func TestAccStorageTransferJob_awsS3CompatibleDataSource(t *testing.T) {
664664 })
665665}
666666
667+ func TestAccStorageTransferJob_transferManifest (t * testing.T ) {
668+ t .Parallel ()
669+
670+ project := envvar .GetTestProjectFromEnv ()
671+ src := acctest .RandString (t , 10 )
672+ dst := acctest .RandString (t , 10 )
673+ desc := acctest .RandString (t , 10 )
674+
675+ manifestV1 := fmt .Sprintf ("manifest-%s-v1.csv" , acctest .RandString (t , 6 ))
676+ manifestV2 := fmt .Sprintf ("manifest-%s-v2.csv" , acctest .RandString (t , 6 ))
677+
678+ acctest .VcrTest (t , resource.TestCase {
679+ PreCheck : func () { acctest .AccTestPreCheck (t ) },
680+ ProtoV5ProviderFactories : acctest .ProtoV5ProviderFactories (t ),
681+ CheckDestroy : testAccStorageTransferJobDestroyProducer (t ),
682+ Steps : []resource.TestStep {
683+ {
684+ Config : testAccStorageTransferJob_withTransferManifest (project , src , dst , desc , manifestV1 ),
685+ Check : resource .ComposeAggregateTestCheckFunc (
686+ resource .TestCheckResourceAttr (
687+ "google_storage_transfer_job.transfer_job" ,
688+ "transfer_spec.0.transfer_manifest.0.location" ,
689+ fmt .Sprintf ("gs://%s/%s" , src , manifestV1 ),
690+ ),
691+ ),
692+ },
693+ {
694+ ResourceName : "google_storage_transfer_job.transfer_job" ,
695+ ImportState : true ,
696+ ImportStateVerify : true ,
697+ },
698+ {
699+ Config : testAccStorageTransferJob_withTransferManifest (project , src , dst , desc , manifestV2 ),
700+ Check : resource .ComposeAggregateTestCheckFunc (
701+ resource .TestCheckResourceAttr (
702+ "google_storage_transfer_job.transfer_job" ,
703+ "transfer_spec.0.transfer_manifest.0.location" ,
704+ fmt .Sprintf ("gs://%s/%s" , src , manifestV2 ),
705+ ),
706+ ),
707+ },
708+ {
709+ ResourceName : "google_storage_transfer_job.transfer_job" ,
710+ ImportState : true ,
711+ ImportStateVerify : true ,
712+ },
713+ {
714+ Config : testAccStorageTransferJob_withoutTransferManifest (project , src , dst , desc ),
715+ Check : resource .ComposeAggregateTestCheckFunc (
716+ resource .TestCheckNoResourceAttr (
717+ "google_storage_transfer_job.transfer_job" ,
718+ "transfer_spec.0.transfer_manifest.0.location" ,
719+ ),
720+ ),
721+ },
722+ {
723+ ResourceName : "google_storage_transfer_job.transfer_job" ,
724+ ImportState : true ,
725+ ImportStateVerify : true ,
726+ },
727+ },
728+ })
729+ }
730+
667731func testAccStorageTransferJobDestroyProducer (t * testing.T ) func (s * terraform.State ) error {
668732 return func (s * terraform.State ) error {
669733 config := acctest .GoogleProviderConfig (t )
@@ -2886,3 +2950,155 @@ resource "google_storage_transfer_job" "with_sa" {
28862950}
28872951` , project , dataSourceBucketName , project , dataSinkBucketName , project , description , project )
28882952}
2953+
2954+ func testAccStorageTransferJob_withTransferManifest (project , dataSourceBucketName , dataSinkBucketName , transferJobDescription , manifestObjectName string ) string {
2955+ return fmt .Sprintf (`
2956+ data "google_storage_transfer_project_service_account" "default" {
2957+ project = "%[1]s"
2958+ }
2959+
2960+ resource "google_storage_bucket" "data_source" {
2961+ project = "%[1]s"
2962+ name = "%[2]s"
2963+ location = "US"
2964+ force_destroy = true
2965+ uniform_bucket_level_access = true
2966+ }
2967+
2968+ resource "google_storage_bucket" "data_sink" {
2969+ project = "%[1]s"
2970+ name = "%[3]s"
2971+ location = "US"
2972+ force_destroy = true
2973+ uniform_bucket_level_access = true
2974+ }
2975+
2976+ resource "google_storage_bucket_iam_member" "source_iam" {
2977+ bucket = google_storage_bucket.data_source.name
2978+ role = "roles/storage.admin"
2979+ member = "serviceAccount:${data.google_storage_transfer_project_service_account.default.email}"
2980+ }
2981+
2982+ resource "google_storage_bucket_iam_member" "sink_iam" {
2983+ bucket = google_storage_bucket.data_sink.name
2984+ role = "roles/storage.admin"
2985+ member = "serviceAccount:${data.google_storage_transfer_project_service_account.default.email}"
2986+ }
2987+
2988+ resource "google_storage_bucket_object" "manifest"{
2989+ name = "%[5]s"
2990+ bucket = google_storage_bucket.data_source.name
2991+ content = "dummy-manifest-content"
2992+ depends_on = [
2993+ google_storage_bucket_iam_member.sink_iam, google_storage_bucket_iam_member.source_iam,
2994+ ]
2995+ }
2996+
2997+ resource "google_storage_transfer_job" "transfer_job" {
2998+ description = "%[4]s"
2999+ project = "%[1]s"
3000+
3001+ transfer_spec {
3002+ transfer_manifest {
3003+ location = "gs://${google_storage_bucket.data_source.name}/${google_storage_bucket_object.manifest.name}"
3004+ }
3005+ gcs_data_source {
3006+ bucket_name = google_storage_bucket.data_source.name
3007+ path = "foo/bar/"
3008+ }
3009+ gcs_data_sink {
3010+ bucket_name = google_storage_bucket.data_sink.name
3011+ path = "foo/bar/"
3012+ }
3013+ }
3014+
3015+ schedule {
3016+ schedule_start_date {
3017+ year = 2023
3018+ month = 1
3019+ day = 13
3020+ }
3021+ schedule_end_date {
3022+ year = 2023
3023+ month = 1
3024+ day = 13
3025+ }
3026+ }
3027+
3028+ depends_on = [
3029+ google_storage_bucket_object.manifest,
3030+ ]
3031+
3032+ }
3033+ ` , project , dataSourceBucketName , dataSinkBucketName , transferJobDescription , manifestObjectName )
3034+ }
3035+
3036+ func testAccStorageTransferJob_withoutTransferManifest (project , dataSourceBucketName , dataSinkBucketName , transferJobDescription string ) string {
3037+ return fmt .Sprintf (`
3038+ data "google_storage_transfer_project_service_account" "default" {
3039+ project = "%[1]s"
3040+ }
3041+
3042+ resource "google_storage_bucket" "data_source" {
3043+ project = "%[1]s"
3044+ name = "%[2]s"
3045+ location = "US"
3046+ force_destroy = true
3047+ uniform_bucket_level_access = true
3048+ }
3049+
3050+ resource "google_storage_bucket" "data_sink" {
3051+ project = "%[1]s"
3052+ name = "%[3]s"
3053+ location = "US"
3054+ force_destroy = true
3055+ uniform_bucket_level_access = true
3056+ }
3057+
3058+ resource "google_storage_bucket_iam_member" "source_iam" {
3059+ bucket = google_storage_bucket.data_source.name
3060+ role = "roles/storage.admin"
3061+ member = "serviceAccount:${data.google_storage_transfer_project_service_account.default.email}"
3062+ }
3063+
3064+ resource "google_storage_bucket_iam_member" "sink_iam" {
3065+ bucket = google_storage_bucket.data_sink.name
3066+ role = "roles/storage.admin"
3067+ member = "serviceAccount:${data.google_storage_transfer_project_service_account.default.email}"
3068+ }
3069+
3070+ resource "google_storage_transfer_job" "transfer_job" {
3071+ description = "%[4]s"
3072+ project = "%[1]s"
3073+
3074+ transfer_spec {
3075+ gcs_data_source {
3076+ bucket_name = google_storage_bucket.data_source.name
3077+ path = "foo/bar/"
3078+ }
3079+ gcs_data_sink {
3080+ bucket_name = google_storage_bucket.data_sink.name
3081+ path = "foo/bar/"
3082+ }
3083+ }
3084+
3085+ schedule {
3086+ schedule_start_date {
3087+ year = 2023
3088+ month = 1
3089+ day = 13
3090+ }
3091+ schedule_end_date {
3092+ year = 2023
3093+ month = 1
3094+ day = 13
3095+ }
3096+ }
3097+
3098+ depends_on = [
3099+ google_storage_bucket_iam_member.sink_iam, google_storage_bucket_iam_member.source_iam,
3100+ ]
3101+
3102+ }
3103+ ` , project , dataSourceBucketName , dataSinkBucketName , transferJobDescription )
3104+ }
0 commit comments