@@ -19,21 +19,35 @@ import (
19
19
)
20
20
21
21
var (
22
- objectConditionsKeys = []string{
22
+ transferSpecObjectConditionsKeys = []string{
23
23
"transfer_spec.0.object_conditions.0.min_time_elapsed_since_last_modification",
24
24
"transfer_spec.0.object_conditions.0.max_time_elapsed_since_last_modification",
25
25
"transfer_spec.0.object_conditions.0.include_prefixes",
26
26
"transfer_spec.0.object_conditions.0.exclude_prefixes",
27
27
"transfer_spec.0.object_conditions.0.last_modified_since",
28
28
"transfer_spec.0.object_conditions.0.last_modified_before",
29
29
}
30
+ replicationSpecObjectConditionsKeys = []string{
31
+ "replication_spec.0.object_conditions.0.min_time_elapsed_since_last_modification",
32
+ "replication_spec.0.object_conditions.0.max_time_elapsed_since_last_modification",
33
+ "replication_spec.0.object_conditions.0.include_prefixes",
34
+ "replication_spec.0.object_conditions.0.exclude_prefixes",
35
+ "replication_spec.0.object_conditions.0.last_modified_since",
36
+ "replication_spec.0.object_conditions.0.last_modified_before",
37
+ }
30
38
31
- transferOptionsKeys = []string{
39
+ transferSpecTransferOptionsKeys = []string{
32
40
"transfer_spec.0.transfer_options.0.overwrite_objects_already_existing_in_sink",
33
41
"transfer_spec.0.transfer_options.0.delete_objects_unique_in_sink",
34
42
"transfer_spec.0.transfer_options.0.delete_objects_from_source_after_transfer",
35
43
"transfer_spec.0.transfer_options.0.overwrite_when",
36
44
}
45
+ replicationSpecTransferOptionsKeys = []string{
46
+ "replication_spec.0.transfer_options.0.overwrite_objects_already_existing_in_sink",
47
+ "replication_spec.0.transfer_options.0.delete_objects_unique_in_sink",
48
+ "replication_spec.0.transfer_options.0.delete_objects_from_source_after_transfer",
49
+ "replication_spec.0.transfer_options.0.overwrite_when",
50
+ }
37
51
38
52
transferSpecDataSourceKeys = []string{
39
53
"transfer_spec.0.gcs_data_source",
47
61
"transfer_spec.0.gcs_data_sink",
48
62
"transfer_spec.0.posix_data_sink",
49
63
}
64
+
65
+ replicationSpecDataSourceKeys = []string{
66
+ "replication_spec.0.gcs_data_source",
67
+ }
68
+ replicationSpecDataSinkKeys = []string{
69
+ "replication_spec.0.gcs_data_sink",
70
+ }
71
+
50
72
awsS3AuthKeys = []string{
51
73
"transfer_spec.0.aws_s3_data_source.0.aws_access_key",
52
74
"transfer_spec.0.aws_s3_data_source.0.role_arn",
@@ -98,6 +120,7 @@ func ResourceStorageTransferJob() *schema.Resource {
98
120
Optional: true,
99
121
MaxItems: 1,
100
122
ConflictsWith: []string{"schedule"},
123
+ DiffSuppressFunc: diffSuppressEventStream,
101
124
Elem: &schema.Resource{
102
125
Schema: map[string]*schema.Schema{
103
126
"name": {
@@ -120,14 +143,46 @@ func ResourceStorageTransferJob() *schema.Resource {
120
143
},
121
144
},
122
145
},
146
+ "replication_spec": {
147
+ Type: schema.TypeList,
148
+ MaxItems: 1,
149
+ Optional: true,
150
+ ConflictsWith: []string{"transfer_spec", "schedule"},
151
+ ExactlyOneOf: []string{"transfer_spec", "replication_spec"},
152
+ Elem: &schema.Resource{
153
+ Schema: map[string]*schema.Schema{
154
+ "object_conditions": objectConditionsSchema(replicationSpecObjectConditionsKeys),
155
+ "transfer_options": transferOptionsSchema(replicationSpecTransferOptionsKeys),
156
+ "gcs_data_sink": {
157
+ Type: schema.TypeList,
158
+ Optional: true,
159
+ MaxItems: 1,
160
+ Elem: gcsDataSchema(),
161
+ ExactlyOneOf: replicationSpecDataSinkKeys,
162
+ Description: `A Google Cloud Storage data sink.`,
163
+ },
164
+ "gcs_data_source": {
165
+ Type: schema.TypeList,
166
+ Optional: true,
167
+ MaxItems: 1,
168
+ Elem: gcsDataSchema(),
169
+ ExactlyOneOf: replicationSpecDataSourceKeys,
170
+ Description: `A Google Cloud Storage data source.`,
171
+ },
172
+ },
173
+ },
174
+ Description: `Replication specification.`,
175
+ },
123
176
"transfer_spec": {
124
177
Type: schema.TypeList,
125
- Required : true,
178
+ Optional : true,
126
179
MaxItems: 1,
180
+ ConflictsWith: []string{"replication_spec"},
181
+ ExactlyOneOf: []string{"transfer_spec", "replication_spec"},
127
182
Elem: &schema.Resource{
128
183
Schema: map[string]*schema.Schema{
129
- "object_conditions": objectConditionsSchema(),
130
- "transfer_options": transferOptionsSchema(),
184
+ "object_conditions": objectConditionsSchema(transferSpecObjectConditionsKeys ),
185
+ "transfer_options": transferOptionsSchema(transferSpecTransferOptionsKeys ),
131
186
"source_agent_pool_name": {
132
187
Type: schema.TypeString,
133
188
Optional: true,
@@ -307,7 +362,7 @@ func ResourceStorageTransferJob() *schema.Resource {
307
362
}
308
363
}
309
364
310
- func objectConditionsSchema() *schema.Schema {
365
+ func objectConditionsSchema(objectConditionsKeys []string ) *schema.Schema {
311
366
return &schema.Schema{
312
367
Type: schema.TypeList,
313
368
Optional: true,
@@ -368,7 +423,7 @@ func objectConditionsSchema() *schema.Schema {
368
423
}
369
424
}
370
425
371
- func transferOptionsSchema() *schema.Schema {
426
+ func transferOptionsSchema(transferOptionsKeys []string ) *schema.Schema {
372
427
return &schema.Schema{
373
428
Type: schema.TypeList,
374
429
Optional: true,
@@ -642,6 +697,7 @@ func resourceStorageTransferJobCreate(d *schema.ResourceData, meta interface{})
642
697
Schedule: expandTransferSchedules(d.Get("schedule").([]interface{})),
643
698
EventStream: expandEventStream(d.Get("event_stream").([]interface{})),
644
699
TransferSpec: expandTransferSpecs(d.Get("transfer_spec").([]interface{})),
700
+ ReplicationSpec: expandReplicationSpecs(d.Get("replication_spec").([]interface{})),
645
701
NotificationConfig: expandTransferJobNotificationConfig(d.Get("notification_config").([]interface{})),
646
702
}
647
703
@@ -726,6 +782,11 @@ func resourceStorageTransferJobRead(d *schema.ResourceData, meta interface{}) er
726
782
return err
727
783
}
728
784
785
+ err = d.Set("replication_spec", flattenReplicationSpec(res.ReplicationSpec))
786
+ if err != nil {
787
+ return err
788
+ }
789
+
729
790
err = d.Set("notification_config", flattenTransferJobNotificationConfig(res.NotificationConfig))
730
791
if err != nil {
731
792
return err
@@ -784,6 +845,13 @@ func resourceStorageTransferJobUpdate(d *schema.ResourceData, meta interface{})
784
845
}
785
846
}
786
847
848
+ if d.HasChange("replication_spec") {
849
+ fieldMask = append(fieldMask, "replication_spec")
850
+ if v, ok := d.GetOk("replication_spec"); ok {
851
+ transferJob.ReplicationSpec = expandReplicationSpecs(v.([]interface{}))
852
+ }
853
+ }
854
+
787
855
if d.HasChange("notification_config") {
788
856
fieldMask = append(fieldMask, "notification_config")
789
857
if v, ok := d.GetOk("notification_config"); ok {
@@ -1277,6 +1345,9 @@ func expandTransferSpecs(transferSpecs []interface{}) *storagetransfer.TransferS
1277
1345
}
1278
1346
1279
1347
func flattenTransferSpec(transferSpec *storagetransfer.TransferSpec, d *schema.ResourceData) []map[string]interface{} {
1348
+ if transferSpec == nil || reflect.DeepEqual(transferSpec, &storagetransfer.TransferSpec{}) {
1349
+ return nil
1350
+ }
1280
1351
1281
1352
data := map[string]interface{}{}
1282
1353
@@ -1354,3 +1425,44 @@ func flattenTransferJobNotificationConfig(notificationConfig *storagetransfer.No
1354
1425
1355
1426
return []map[string]interface{}{data}
1356
1427
}
1428
+
1429
+ func diffSuppressEventStream(k, old, new string, d *schema.ResourceData) bool {
1430
+ // Check if it's a replication job.
1431
+ _, is_replication := d.GetOk("replication_spec")
1432
+ return is_replication
1433
+ }
1434
+
1435
+ func expandReplicationSpecs(replicationSpecs []interface{}) *storagetransfer.ReplicationSpec {
1436
+ if len(replicationSpecs) == 0 || replicationSpecs[0] == nil {
1437
+ return nil
1438
+ }
1439
+
1440
+ replicationSpec := replicationSpecs[0].(map[string]interface{})
1441
+ return &storagetransfer.ReplicationSpec{
1442
+ GcsDataSink: expandGcsData(replicationSpec["gcs_data_sink"].([]interface{})),
1443
+ ObjectConditions: expandObjectConditions(replicationSpec["object_conditions"].([]interface{})),
1444
+ TransferOptions: expandTransferOptions(replicationSpec["transfer_options"].([]interface{})),
1445
+ GcsDataSource: expandGcsData(replicationSpec["gcs_data_source"].([]interface{})),
1446
+ }
1447
+ }
1448
+
1449
+ func flattenReplicationSpec(replicationSpec *storagetransfer.ReplicationSpec) []map[string]interface{} {
1450
+ if replicationSpec == nil || reflect.DeepEqual(replicationSpec, &storagetransfer.ReplicationSpec{}) {
1451
+ return nil
1452
+ }
1453
+
1454
+ data := map[string]interface{}{}
1455
+ if replicationSpec.GcsDataSink != nil {
1456
+ data["gcs_data_sink"] = flattenGcsData(replicationSpec.GcsDataSink)
1457
+ }
1458
+ if replicationSpec.GcsDataSource != nil {
1459
+ data["gcs_data_source"] = flattenGcsData(replicationSpec.GcsDataSource)
1460
+ }
1461
+ if replicationSpec.ObjectConditions != nil {
1462
+ data["object_conditions"] = flattenObjectCondition(replicationSpec.ObjectConditions)
1463
+ }
1464
+ if replicationSpec.TransferOptions != nil {
1465
+ data["transfer_options"] = flattenTransferOption(replicationSpec.TransferOptions)
1466
+ }
1467
+ return []map[string]interface{}{data}
1468
+ }
0 commit comments