Skip to content

Commit 3e0cd2a

Browse files
Xu ZhangMaxrovr
authored andcommitted
Added - Support for OIC Gen3 Disaster Recovery
1 parent ec5a83f commit 3e0cd2a

8 files changed

+379
-61
lines changed

examples/integration/main.tf

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,15 @@ variable "region" {
1919
variable "compartment_id" {
2020
}
2121

22+
variable "compartment_id_for_update" {
23+
}
24+
2225
variable "instance_type" {
2326
default = "STANDARDX"
2427
}
2528

2629
variable "integration_instance_idcs_access_token" {
27-
default = "" #
30+
default = ""
2831
}
2932

3033
variable "integration_instance_consumption_model" {
@@ -72,7 +75,7 @@ resource "oci_integration_integration_instance" "test_integration_instance" {
7275
shape = "DEVELOPMENT"
7376
display_name = "instance-created-via-tf-${random_integer.seq.result}"
7477
is_byol = "false"
75-
message_packs = "10"
78+
message_packs = "1"
7679
domain_id = var.domain_id
7780

7881
lifecycle {
@@ -180,4 +183,35 @@ resource "oci_integration_private_endpoint_outbound_connection" "integration_pri
180183
depends_on = [
181184
oci_integration_oracle_managed_custom_endpoint.integretion_custom_endpoint
182185
]
186+
# resource "oci_integration_integration_instance" "test_integration_instance_idcs" {
187+
# #Required
188+
# compartment_id = var.compartment_id
189+
# display_name = "instance4643_idcs"
190+
# integration_instance_type = "STANDARDX"
191+
# shape = "DEVELOPMENT"
192+
# # shape = "PRODUCTION"
193+
# is_byol = "false"
194+
# message_packs = "10"
195+
# idcs_at = var.integration_instance_idcs_access_token
196+
# }
197+
198+
resource "oci_integration_private_endpoint_outbound_connection" "integration_private_endpoint" {
199+
integration_instance_id = oci_integration_integration_instance.test_integration_instance.id
200+
nsg_ids = [var.nsg_id]
201+
subnet_id = var.subnet_id
202+
}
203+
204+
resource "oci_integration_integration_instance" "test_integration_instance_with_dr" {
205+
#Required
206+
compartment_id = var.compartment_id
207+
integration_instance_type = "STANDARDX"
208+
shape = "DEVELOPMENT"
209+
display_name = "DR"
210+
is_byol = "false"
211+
message_packs = "1"
212+
domain_id = var.domain_id
213+
is_disaster_recovery_enabled = "true"
214+
lifecycle {
215+
ignore_changes = ["system_tags"]
216+
}
183217
}

internal/integrationtest/integration_integration_instance_test.go

Lines changed: 103 additions & 39 deletions
Large diffs are not rendered by default.

internal/service/integration/integration_integration_instance_data_source.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,12 @@ func (s *IntegrationIntegrationInstanceDataSourceCrud) SetData() error {
9696
s.D.Set("defined_tags", tfresource.DefinedTagsToMap(s.Res.DefinedTags))
9797
}
9898

99+
if s.Res.DisasterRecoveryDetails != nil {
100+
s.D.Set("disaster_recovery_details", []interface{}{DisasterRecoveryDetailsToMap(s.Res.DisasterRecoveryDetails)})
101+
} else {
102+
s.D.Set("disaster_recovery_details", nil)
103+
}
104+
99105
if s.Res.DisplayName != nil {
100106
s.D.Set("display_name", *s.Res.DisplayName)
101107
}
@@ -122,6 +128,10 @@ func (s *IntegrationIntegrationInstanceDataSourceCrud) SetData() error {
122128
s.D.Set("is_byol", *s.Res.IsByol)
123129
}
124130

131+
if s.Res.IsDisasterRecoveryEnabled != nil {
132+
s.D.Set("is_disaster_recovery_enabled", *s.Res.IsDisasterRecoveryEnabled)
133+
}
134+
125135
if s.Res.IsFileServerEnabled != nil {
126136
s.D.Set("is_file_server_enabled", *s.Res.IsFileServerEnabled)
127137
}
@@ -130,6 +140,10 @@ func (s *IntegrationIntegrationInstanceDataSourceCrud) SetData() error {
130140
s.D.Set("is_visual_builder_enabled", *s.Res.IsVisualBuilderEnabled)
131141
}
132142

143+
if s.Res.LifecycleDetails != nil {
144+
s.D.Set("lifecycle_details", *s.Res.LifecycleDetails)
145+
}
146+
133147
if s.Res.MessagePacks != nil {
134148
s.D.Set("message_packs", *s.Res.MessagePacks)
135149
}

internal/service/integration/integration_integration_instance_resource.go

Lines changed: 166 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,12 @@ func IntegrationIntegrationInstanceResource() *schema.Resource {
181181
StateFunc: tfresource.GetMd5Hash,
182182
Sensitive: true,
183183
},
184+
"is_disaster_recovery_enabled": {
185+
Type: schema.TypeBool,
186+
Optional: true,
187+
Computed: true,
188+
ForceNew: true,
189+
},
184190
"is_file_server_enabled": {
185191
Type: schema.TypeBool,
186192
Optional: true,
@@ -282,12 +288,16 @@ func IntegrationIntegrationInstanceResource() *schema.Resource {
282288
Type: schema.TypeInt,
283289
Optional: true,
284290
},
285-
286291
// "remove_oracle_managed_custom_endpoint_trigger": {
287292
// Type: schema.TypeInt,
288293
// Optional: true,
289294
// },
290295

296+
"failover_trigger": {
297+
Type: schema.TypeInt,
298+
Optional: true,
299+
},
300+
291301
// Computed
292302
"attachments": {
293303
Type: schema.TypeList,
@@ -322,6 +332,56 @@ func IntegrationIntegrationInstanceResource() *schema.Resource {
322332
},
323333
},
324334
},
335+
"disaster_recovery_details": {
336+
Type: schema.TypeList,
337+
Computed: true,
338+
Elem: &schema.Resource{
339+
Schema: map[string]*schema.Schema{
340+
// Required
341+
342+
// Optional
343+
344+
// Computed
345+
"cross_region_integration_instance_details": {
346+
Type: schema.TypeList,
347+
Computed: true,
348+
Elem: &schema.Resource{
349+
Schema: map[string]*schema.Schema{
350+
// Required
351+
352+
// Optional
353+
354+
// Computed
355+
"id": {
356+
Type: schema.TypeString,
357+
Computed: true,
358+
},
359+
"region": {
360+
Type: schema.TypeString,
361+
Computed: true,
362+
},
363+
"role": {
364+
Type: schema.TypeString,
365+
Computed: true,
366+
},
367+
"time_role_changed": {
368+
Type: schema.TypeString,
369+
Computed: true,
370+
},
371+
},
372+
},
373+
},
374+
"regional_instance_url": {
375+
Type: schema.TypeString,
376+
Computed: true,
377+
},
378+
"role": {
379+
Type: schema.TypeString,
380+
Computed: true,
381+
},
382+
},
383+
},
384+
},
325385
"data_retention_period": {
326386
Type: schema.TypeString,
327387
Computed: true,
@@ -367,6 +427,10 @@ func IntegrationIntegrationInstanceResource() *schema.Resource {
367427
Type: schema.TypeString,
368428
Computed: true,
369429
},
430+
"lifecycle_details": {
431+
Type: schema.TypeString,
432+
Computed: true,
433+
},
370434
"private_endpoint_outbound_connection": {
371435
Type: schema.TypeList,
372436
Computed: true,
@@ -445,6 +509,14 @@ func createIntegrationIntegrationInstance(d *schema.ResourceData, m interface{})
445509
return err
446510
}
447511
}
512+
513+
if _, ok := sync.D.GetOkExists("failover_trigger"); ok {
514+
err := sync.DisasterRecoveryFailover()
515+
if err != nil {
516+
return err
517+
}
518+
}
519+
448520
var powerOff = false
449521
if configState, ok := sync.D.GetOkExists("state"); ok {
450522
wantedState := oci_integration.IntegrationInstanceLifecycleStateEnum(strings.ToUpper(configState.(string)))
@@ -538,6 +610,22 @@ func updateIntegrationIntegrationInstance(d *schema.ResourceData, m interface{})
538610
}
539611
}
540612

613+
if _, ok := sync.D.GetOkExists("failover_trigger"); ok && sync.D.HasChange("failover_trigger") {
614+
oldRaw, newRaw := sync.D.GetChange("failover_trigger")
615+
oldValue := oldRaw.(int)
616+
newValue := newRaw.(int)
617+
if oldValue < newValue {
618+
err := sync.DisasterRecoveryFailover()
619+
620+
if err != nil {
621+
return err
622+
}
623+
} else {
624+
sync.D.Set("failover_trigger", oldRaw)
625+
return fmt.Errorf("new value of trigger should be greater than the old value")
626+
}
627+
}
628+
541629
if err := tfresource.UpdateResource(d, sync); err != nil {
542630
return err
543631
}
@@ -675,6 +763,11 @@ func (s *IntegrationIntegrationInstanceResourceCrud) Create() error {
675763
request.IsByol = &tmp
676764
}
677765

766+
if isDisasterRecoveryEnabled, ok := s.D.GetOkExists("is_disaster_recovery_enabled"); ok {
767+
tmp := isDisasterRecoveryEnabled.(bool)
768+
request.IsDisasterRecoveryEnabled = &tmp
769+
}
770+
678771
if isFileServerEnabled, ok := s.D.GetOkExists("is_file_server_enabled"); ok {
679772
tmp := isFileServerEnabled.(bool)
680773
request.IsFileServerEnabled = &tmp
@@ -1025,6 +1118,12 @@ func (s *IntegrationIntegrationInstanceResourceCrud) SetData() error {
10251118
s.D.Set("defined_tags", tfresource.DefinedTagsToMap(s.Res.DefinedTags))
10261119
}
10271120

1121+
if s.Res.DisasterRecoveryDetails != nil {
1122+
s.D.Set("disaster_recovery_details", []interface{}{DisasterRecoveryDetailsToMap(s.Res.DisasterRecoveryDetails)})
1123+
} else {
1124+
s.D.Set("disaster_recovery_details", nil)
1125+
}
1126+
10281127
if s.Res.DisplayName != nil {
10291128
s.D.Set("display_name", *s.Res.DisplayName)
10301129
}
@@ -1051,6 +1150,10 @@ func (s *IntegrationIntegrationInstanceResourceCrud) SetData() error {
10511150
s.D.Set("is_byol", *s.Res.IsByol)
10521151
}
10531152

1153+
if s.Res.IsDisasterRecoveryEnabled != nil {
1154+
s.D.Set("is_disaster_recovery_enabled", *s.Res.IsDisasterRecoveryEnabled)
1155+
}
1156+
10541157
if s.Res.IsFileServerEnabled != nil {
10551158
s.D.Set("is_file_server_enabled", *s.Res.IsFileServerEnabled)
10561159
}
@@ -1059,6 +1162,10 @@ func (s *IntegrationIntegrationInstanceResourceCrud) SetData() error {
10591162
s.D.Set("is_visual_builder_enabled", *s.Res.IsVisualBuilderEnabled)
10601163
}
10611164

1165+
if s.Res.LifecycleDetails != nil {
1166+
s.D.Set("lifecycle_details", *s.Res.LifecycleDetails)
1167+
}
1168+
10621169
if s.Res.MessagePacks != nil {
10631170
s.D.Set("message_packs", *s.Res.MessagePacks)
10641171
}
@@ -1222,6 +1329,29 @@ func (s *IntegrationIntegrationInstanceResourceCrud) RemoveOracleManagedCustomEn
12221329
return nil
12231330
}
12241331

1332+
func (s *IntegrationIntegrationInstanceResourceCrud) DisasterRecoveryFailover() error {
1333+
request := oci_integration.DisasterRecoveryFailoverRequest{}
1334+
1335+
idTmp := s.D.Id()
1336+
request.IntegrationInstanceId = &idTmp
1337+
1338+
request.RequestMetadata.RetryPolicy = tfresource.GetRetryPolicy(s.DisableNotFoundRetries, "integration")
1339+
1340+
_, err := s.Client.DisasterRecoveryFailover(context.Background(), request)
1341+
if err != nil {
1342+
return err
1343+
}
1344+
1345+
if waitErr := tfresource.WaitForUpdatedState(s.D, s); waitErr != nil {
1346+
return waitErr
1347+
}
1348+
1349+
val := s.D.Get("failover_trigger")
1350+
s.D.Set("failover_trigger", val)
1351+
1352+
return nil
1353+
}
1354+
12251355
func AttachmentDetailsToMap(obj oci_integration.AttachmentDetails) map[string]interface{} {
12261356
result := map[string]interface{}{}
12271357

@@ -1327,7 +1457,41 @@ func CustomEndpointDetailsToMap(obj *oci_integration.CustomEndpointDetails) map[
13271457
result["hostname"] = string(*obj.Hostname)
13281458
}
13291459

1330-
result["managed_type"] = string(obj.ManagedType)
1460+
return result
1461+
}
1462+
1463+
func CrossRegionIntegrationInstanceDetailsToMap(obj *oci_integration.CrossRegionIntegrationInstanceDetails) map[string]interface{} {
1464+
result := map[string]interface{}{}
1465+
1466+
if obj.Id != nil {
1467+
result["id"] = string(*obj.Id)
1468+
}
1469+
1470+
if obj.Region != nil {
1471+
result["region"] = string(*obj.Region)
1472+
}
1473+
1474+
result["role"] = string(obj.Role)
1475+
1476+
if obj.TimeRoleChanged != nil {
1477+
result["time_role_changed"] = obj.TimeRoleChanged.String()
1478+
}
1479+
1480+
return result
1481+
}
1482+
1483+
func DisasterRecoveryDetailsToMap(obj *oci_integration.DisasterRecoveryDetails) map[string]interface{} {
1484+
result := map[string]interface{}{}
1485+
1486+
if obj.CrossRegionIntegrationInstanceDetails != nil {
1487+
result["cross_region_integration_instance_details"] = []interface{}{CrossRegionIntegrationInstanceDetailsToMap(obj.CrossRegionIntegrationInstanceDetails)}
1488+
}
1489+
1490+
if obj.RegionalInstanceUrl != nil {
1491+
result["regional_instance_url"] = string(*obj.RegionalInstanceUrl)
1492+
}
1493+
1494+
result["role"] = string(obj.Role)
13311495

13321496
return result
13331497
}

internal/service/integration/integration_integration_instances_data_source.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,10 @@ func (s *IntegrationIntegrationInstancesDataSourceCrud) SetData() error {
154154
integrationInstance["is_byol"] = *r.IsByol
155155
}
156156

157+
if r.IsDisasterRecoveryEnabled != nil {
158+
integrationInstance["is_disaster_recovery_enabled"] = *r.IsDisasterRecoveryEnabled
159+
}
160+
157161
if r.IsFileServerEnabled != nil {
158162
integrationInstance["is_file_server_enabled"] = *r.IsFileServerEnabled
159163
}
@@ -162,6 +166,10 @@ func (s *IntegrationIntegrationInstancesDataSourceCrud) SetData() error {
162166
integrationInstance["is_visual_builder_enabled"] = *r.IsVisualBuilderEnabled
163167
}
164168

169+
if r.LifecycleDetails != nil {
170+
integrationInstance["lifecycle_details"] = *r.LifecycleDetails
171+
}
172+
165173
if r.MessagePacks != nil {
166174
integrationInstance["message_packs"] = *r.MessagePacks
167175
}

0 commit comments

Comments
 (0)