@@ -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,44 @@ 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,
127
180
Elem: &schema.Resource{
128
181
Schema: map[string]*schema.Schema{
129
- "object_conditions": objectConditionsSchema(),
130
- "transfer_options": transferOptionsSchema(),
182
+ "object_conditions": objectConditionsSchema(transferSpecObjectConditionsKeys ),
183
+ "transfer_options": transferOptionsSchema(transferSpecTransferOptionsKeys ),
131
184
"source_agent_pool_name": {
132
185
Type: schema.TypeString,
133
186
Optional: true,
@@ -307,7 +360,7 @@ func ResourceStorageTransferJob() *schema.Resource {
307
360
}
308
361
}
309
362
310
- func objectConditionsSchema() *schema.Schema {
363
+ func objectConditionsSchema(objectConditionsKeys []string ) *schema.Schema {
311
364
return &schema.Schema{
312
365
Type: schema.TypeList,
313
366
Optional: true,
@@ -368,7 +421,7 @@ func objectConditionsSchema() *schema.Schema {
368
421
}
369
422
}
370
423
371
- func transferOptionsSchema() *schema.Schema {
424
+ func transferOptionsSchema(transferOptionsKeys []string ) *schema.Schema {
372
425
return &schema.Schema{
373
426
Type: schema.TypeList,
374
427
Optional: true,
@@ -642,6 +695,7 @@ func resourceStorageTransferJobCreate(d *schema.ResourceData, meta interface{})
642
695
Schedule: expandTransferSchedules(d.Get("schedule").([]interface{})),
643
696
EventStream: expandEventStream(d.Get("event_stream").([]interface{})),
644
697
TransferSpec: expandTransferSpecs(d.Get("transfer_spec").([]interface{})),
698
+ ReplicationSpec: expandReplicationSpecs(d.Get("replication_spec").([]interface{})),
645
699
NotificationConfig: expandTransferJobNotificationConfig(d.Get("notification_config").([]interface{})),
646
700
}
647
701
@@ -726,6 +780,11 @@ func resourceStorageTransferJobRead(d *schema.ResourceData, meta interface{}) er
726
780
return err
727
781
}
728
782
783
+ err = d.Set("replication_spec", flattenReplicationSpec(res.ReplicationSpec))
784
+ if err != nil {
785
+ return err
786
+ }
787
+
729
788
err = d.Set("notification_config", flattenTransferJobNotificationConfig(res.NotificationConfig))
730
789
if err != nil {
731
790
return err
@@ -784,6 +843,13 @@ func resourceStorageTransferJobUpdate(d *schema.ResourceData, meta interface{})
784
843
}
785
844
}
786
845
846
+ if d.HasChange("replication_spec") {
847
+ fieldMask = append(fieldMask, "replication_spec")
848
+ if v, ok := d.GetOk("replication_spec"); ok {
849
+ transferJob.ReplicationSpec = expandReplicationSpecs(v.([]interface{}))
850
+ }
851
+ }
852
+
787
853
if d.HasChange("notification_config") {
788
854
fieldMask = append(fieldMask, "notification_config")
789
855
if v, ok := d.GetOk("notification_config"); ok {
@@ -1277,6 +1343,9 @@ func expandTransferSpecs(transferSpecs []interface{}) *storagetransfer.TransferS
1277
1343
}
1278
1344
1279
1345
func flattenTransferSpec(transferSpec *storagetransfer.TransferSpec, d *schema.ResourceData) []map[string]interface{} {
1346
+ if transferSpec == nil || reflect.DeepEqual(transferSpec, &storagetransfer.TransferSpec{}) {
1347
+ return nil
1348
+ }
1280
1349
1281
1350
data := map[string]interface{}{}
1282
1351
@@ -1354,3 +1423,44 @@ func flattenTransferJobNotificationConfig(notificationConfig *storagetransfer.No
1354
1423
1355
1424
return []map[string]interface{}{data}
1356
1425
}
1426
+
1427
+ func diffSuppressEventStream(k, old, new string, d *schema.ResourceData) bool {
1428
+ // Check if it's a replication job.
1429
+ _, is_replication := d.GetOk("replication_spec")
1430
+ return is_replication
1431
+ }
1432
+
1433
+ func expandReplicationSpecs(replicationSpecs []interface{}) *storagetransfer.ReplicationSpec {
1434
+ if len(replicationSpecs) == 0 || replicationSpecs[0] == nil {
1435
+ return nil
1436
+ }
1437
+
1438
+ replicationSpec := replicationSpecs[0].(map[string]interface{})
1439
+ return &storagetransfer.ReplicationSpec{
1440
+ GcsDataSink: expandGcsData(replicationSpec["gcs_data_sink"].([]interface{})),
1441
+ ObjectConditions: expandObjectConditions(replicationSpec["object_conditions"].([]interface{})),
1442
+ TransferOptions: expandTransferOptions(replicationSpec["transfer_options"].([]interface{})),
1443
+ GcsDataSource: expandGcsData(replicationSpec["gcs_data_source"].([]interface{})),
1444
+ }
1445
+ }
1446
+
1447
+ func flattenReplicationSpec(replicationSpec *storagetransfer.ReplicationSpec) []map[string]interface{} {
1448
+ if replicationSpec == nil || reflect.DeepEqual(replicationSpec, &storagetransfer.ReplicationSpec{}) {
1449
+ return nil
1450
+ }
1451
+
1452
+ data := map[string]interface{}{}
1453
+ if replicationSpec.GcsDataSink != nil {
1454
+ data["gcs_data_sink"] = flattenGcsData(replicationSpec.GcsDataSink)
1455
+ }
1456
+ if replicationSpec.GcsDataSource != nil {
1457
+ data["gcs_data_source"] = flattenGcsData(replicationSpec.GcsDataSource)
1458
+ }
1459
+ if replicationSpec.ObjectConditions != nil {
1460
+ data["object_conditions"] = flattenObjectCondition(replicationSpec.ObjectConditions)
1461
+ }
1462
+ if replicationSpec.TransferOptions != nil {
1463
+ data["transfer_options"] = flattenTransferOption(replicationSpec.TransferOptions)
1464
+ }
1465
+ return []map[string]interface{}{data}
1466
+ }
0 commit comments