Skip to content

Commit 7fbea93

Browse files
googlyrahmanniharika-98
authored andcommitted
Add support for cross bucket replication feature (GoogleCloudPlatform#12562)
1 parent 7be42ae commit 7fbea93

File tree

3 files changed

+363
-8
lines changed

3 files changed

+363
-8
lines changed

mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl

+119-7
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,35 @@ import (
1919
)
2020

2121
var (
22-
objectConditionsKeys = []string{
22+
transferSpecObjectConditionsKeys = []string{
2323
"transfer_spec.0.object_conditions.0.min_time_elapsed_since_last_modification",
2424
"transfer_spec.0.object_conditions.0.max_time_elapsed_since_last_modification",
2525
"transfer_spec.0.object_conditions.0.include_prefixes",
2626
"transfer_spec.0.object_conditions.0.exclude_prefixes",
2727
"transfer_spec.0.object_conditions.0.last_modified_since",
2828
"transfer_spec.0.object_conditions.0.last_modified_before",
2929
}
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+
}
3038

31-
transferOptionsKeys = []string{
39+
transferSpecTransferOptionsKeys = []string{
3240
"transfer_spec.0.transfer_options.0.overwrite_objects_already_existing_in_sink",
3341
"transfer_spec.0.transfer_options.0.delete_objects_unique_in_sink",
3442
"transfer_spec.0.transfer_options.0.delete_objects_from_source_after_transfer",
3543
"transfer_spec.0.transfer_options.0.overwrite_when",
3644
}
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+
}
3751

3852
transferSpecDataSourceKeys = []string{
3953
"transfer_spec.0.gcs_data_source",
@@ -47,6 +61,14 @@ var (
4761
"transfer_spec.0.gcs_data_sink",
4862
"transfer_spec.0.posix_data_sink",
4963
}
64+
65+
replicationSpecDataSourceKeys = []string{
66+
"replication_spec.0.gcs_data_source",
67+
}
68+
replicationSpecDataSinkKeys = []string{
69+
"replication_spec.0.gcs_data_sink",
70+
}
71+
5072
awsS3AuthKeys = []string{
5173
"transfer_spec.0.aws_s3_data_source.0.aws_access_key",
5274
"transfer_spec.0.aws_s3_data_source.0.role_arn",
@@ -98,6 +120,7 @@ func ResourceStorageTransferJob() *schema.Resource {
98120
Optional: true,
99121
MaxItems: 1,
100122
ConflictsWith: []string{"schedule"},
123+
DiffSuppressFunc: diffSuppressEventStream,
101124
Elem: &schema.Resource{
102125
Schema: map[string]*schema.Schema{
103126
"name": {
@@ -120,14 +143,46 @@ func ResourceStorageTransferJob() *schema.Resource {
120143
},
121144
},
122145
},
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+
},
123176
"transfer_spec": {
124177
Type: schema.TypeList,
125-
Required: true,
178+
Optional: true,
126179
MaxItems: 1,
180+
ConflictsWith: []string{"replication_spec"},
181+
ExactlyOneOf: []string{"transfer_spec", "replication_spec"},
127182
Elem: &schema.Resource{
128183
Schema: map[string]*schema.Schema{
129-
"object_conditions": objectConditionsSchema(),
130-
"transfer_options": transferOptionsSchema(),
184+
"object_conditions": objectConditionsSchema(transferSpecObjectConditionsKeys),
185+
"transfer_options": transferOptionsSchema(transferSpecTransferOptionsKeys),
131186
"source_agent_pool_name": {
132187
Type: schema.TypeString,
133188
Optional: true,
@@ -307,7 +362,7 @@ func ResourceStorageTransferJob() *schema.Resource {
307362
}
308363
}
309364

310-
func objectConditionsSchema() *schema.Schema {
365+
func objectConditionsSchema(objectConditionsKeys []string) *schema.Schema {
311366
return &schema.Schema{
312367
Type: schema.TypeList,
313368
Optional: true,
@@ -368,7 +423,7 @@ func objectConditionsSchema() *schema.Schema {
368423
}
369424
}
370425

371-
func transferOptionsSchema() *schema.Schema {
426+
func transferOptionsSchema(transferOptionsKeys []string) *schema.Schema {
372427
return &schema.Schema{
373428
Type: schema.TypeList,
374429
Optional: true,
@@ -642,6 +697,7 @@ func resourceStorageTransferJobCreate(d *schema.ResourceData, meta interface{})
642697
Schedule: expandTransferSchedules(d.Get("schedule").([]interface{})),
643698
EventStream: expandEventStream(d.Get("event_stream").([]interface{})),
644699
TransferSpec: expandTransferSpecs(d.Get("transfer_spec").([]interface{})),
700+
ReplicationSpec: expandReplicationSpecs(d.Get("replication_spec").([]interface{})),
645701
NotificationConfig: expandTransferJobNotificationConfig(d.Get("notification_config").([]interface{})),
646702
}
647703

@@ -726,6 +782,11 @@ func resourceStorageTransferJobRead(d *schema.ResourceData, meta interface{}) er
726782
return err
727783
}
728784

785+
err = d.Set("replication_spec", flattenReplicationSpec(res.ReplicationSpec))
786+
if err != nil {
787+
return err
788+
}
789+
729790
err = d.Set("notification_config", flattenTransferJobNotificationConfig(res.NotificationConfig))
730791
if err != nil {
731792
return err
@@ -784,6 +845,13 @@ func resourceStorageTransferJobUpdate(d *schema.ResourceData, meta interface{})
784845
}
785846
}
786847

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+
787855
if d.HasChange("notification_config") {
788856
fieldMask = append(fieldMask, "notification_config")
789857
if v, ok := d.GetOk("notification_config"); ok {
@@ -1277,6 +1345,9 @@ func expandTransferSpecs(transferSpecs []interface{}) *storagetransfer.TransferS
12771345
}
12781346

12791347
func flattenTransferSpec(transferSpec *storagetransfer.TransferSpec, d *schema.ResourceData) []map[string]interface{} {
1348+
if transferSpec == nil || reflect.DeepEqual(transferSpec, &storagetransfer.TransferSpec{}) {
1349+
return nil
1350+
}
12801351

12811352
data := map[string]interface{}{}
12821353

@@ -1354,3 +1425,44 @@ func flattenTransferJobNotificationConfig(notificationConfig *storagetransfer.No
13541425

13551426
return []map[string]interface{}{data}
13561427
}
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

Comments
 (0)