Skip to content

Commit 6d5278f

Browse files
Sandeep KokaMaxrovr
authored andcommitted
Added - Support for ADB-S: Cross-Tenancy Autonomous Data Guard standby
1 parent c8daec5 commit 6d5278f

11 files changed

+658
-5
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// Copyright (c) 2017, 2021, Oracle and/or its affiliates. All rights reserved.
2+
// Licensed under the Mozilla Public License v2.0
3+
4+
resource "random_string" "autonomous_database_admin_password" {
5+
length = 16
6+
min_numeric = 1
7+
min_lower = 1
8+
min_upper = 1
9+
min_special = 1
10+
}
11+
resource "time_sleep" "wait_300_seconds" {
12+
destroy_duration = "5m"
13+
depends_on = [oci_database_autonomous_database.autonomous_database_cross_tenancy_dataguard_primary]
14+
}
15+
16+
resource "oci_database_autonomous_database" "autonomous_database_cross_tenancy_dataguard_primary" {
17+
admin_password = random_string.autonomous_database_admin_password.result
18+
compartment_id = var.compartment_id
19+
cpu_core_count = "1"
20+
data_storage_size_in_tbs = "1"
21+
db_name = "adbdb11ff6510"
22+
db_version = "19c"
23+
license_model = "LICENSE_INCLUDED"
24+
is_free_tier = "false"
25+
}
26+
27+
resource "oci_database_autonomous_database" "autonomous_database_cross_tenancy_dataguard_standby" {
28+
provider = oci.standby_tenancy
29+
compartment_id = var.standby_compartment_id
30+
source = "CROSS_TENANCY_DISASTER_RECOVERY"
31+
disaster_recovery_type = "ADG"
32+
source_id = oci_database_autonomous_database.autonomous_database_cross_tenancy_dataguard_primary.id
33+
db_name = oci_database_autonomous_database.autonomous_database_cross_tenancy_dataguard_primary.db_name
34+
}
35+
36+
data "oci_database_autonomous_databases" "autonomous_databases" {
37+
filter {
38+
name = "id"
39+
values = [oci_database_autonomous_database.autonomous_database_cross_tenancy_dataguard_standby.id]
40+
}
41+
42+
filter {
43+
name = "role"
44+
values = ["STANDBY"]
45+
}
46+
47+
#Required
48+
compartment_id = var.standby_compartment_id
49+
50+
}
51+
52+
output "autonomous_databases" {
53+
value = data.oci_database_autonomous_databases.autonomous_databases.autonomous_databases
54+
}
55+
56+
data "oci_database_autonomous_database_peers" "autonomous_database_peers" {
57+
autonomous_database_id = oci_database_autonomous_database.autonomous_database_cross_tenancy_dataguard_primary.id
58+
}
59+
60+
output "autonomous_database_peers" {
61+
value = data.oci_database_autonomous_database_peers.autonomous_database_peers.autonomous_database_peer_collection
62+
}
63+
64+
65+
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
// Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved.
2+
// Licensed under the Mozilla Public License v2.0
3+
4+
variable "tenancy_ocid" {
5+
}
6+
7+
variable "standby_tenancy_ocid" {
8+
}
9+
10+
variable "user_ocid" {
11+
}
12+
13+
variable "standby_user_ocid" {
14+
}
15+
16+
variable "fingerprint" {
17+
}
18+
19+
variable "standby_fingerprint" {
20+
}
21+
22+
variable "private_key_path" {
23+
}
24+
25+
variable "standby_private_key_path" {
26+
}
27+
28+
variable "compartment_id" {
29+
}
30+
31+
variable "standby_compartment_id" {
32+
}
33+
34+
variable "standby_region" {
35+
}
36+
37+
provider "oci" {
38+
region = var.region
39+
tenancy_ocid = var.tenancy_ocid
40+
user_ocid = var.user_ocid
41+
fingerprint = var.fingerprint
42+
private_key_path = var.private_key_path
43+
}
44+
45+
provider "oci" {
46+
alias = "standby_tenancy"
47+
region = var.standby_region
48+
tenancy_ocid = var.standby_tenancy_ocid
49+
user_ocid = var.user_ocid
50+
fingerprint = var.standby_fingerprint
51+
private_key_path = var.standby_private_key_path
52+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
// Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
2+
// Licensed under the Mozilla Public License v2.0
3+
4+
package integrationtest
5+
6+
import (
7+
"fmt"
8+
"testing"
9+
10+
"github.com/oracle/terraform-provider-oci/internal/acctest"
11+
"github.com/oracle/terraform-provider-oci/internal/utils"
12+
13+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
14+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
15+
"github.com/oracle/terraform-provider-oci/httpreplay"
16+
)
17+
18+
var (
19+
DatabaseAutonomousDatabasePeerDataSourceRepresentation = map[string]interface{}{
20+
"autonomous_database_id": acctest.Representation{RepType: acctest.Required, Create: `${oci_database_autonomous_database.test_autonomous_database.id}`},
21+
}
22+
23+
DatabaseAutonomousDatabaseRepresentation11 = map[string]interface{}{
24+
"compartment_id": acctest.Representation{RepType: acctest.Required, Create: utils.GetEnvSettingWithBlankDefault("compartment_ocid")},
25+
"cpu_core_count": acctest.Representation{RepType: acctest.Required, Create: `1`},
26+
"data_storage_size_in_tbs": acctest.Representation{RepType: acctest.Required, Create: `1`},
27+
"db_name": acctest.Representation{RepType: acctest.Required, Create: adbName},
28+
"admin_password": acctest.Representation{RepType: acctest.Required, Create: `BEstrO0ng_#11`, Update: `BEstrO0ng_#12`},
29+
"db_workload": acctest.Representation{RepType: acctest.Optional, Create: `OLTP`},
30+
"character_set": acctest.Representation{RepType: acctest.Optional, Create: `AL32UTF8`},
31+
"display_name": acctest.Representation{RepType: acctest.Optional, Create: `example_autonomous_database`, Update: `displayName2`},
32+
"is_auto_scaling_enabled": acctest.Representation{RepType: acctest.Optional, Create: `false`},
33+
"is_auto_scaling_for_storage_enabled": acctest.Representation{RepType: acctest.Optional, Create: `false`},
34+
"is_dedicated": acctest.Representation{RepType: acctest.Optional, Create: `false`},
35+
"is_mtls_connection_required": acctest.Representation{RepType: acctest.Optional, Create: `false`, Update: `true`},
36+
"autonomous_maintenance_schedule_type": acctest.Representation{RepType: acctest.Optional, Create: `REGULAR`},
37+
"is_preview_version_with_service_terms_accepted": acctest.Representation{RepType: acctest.Optional, Create: `false`},
38+
"customer_contacts": acctest.RepresentationGroup{RepType: acctest.Optional, Group: DatabaseAutonomousDatabaseCustomerContactsRepresentation},
39+
"license_model": acctest.Representation{RepType: acctest.Optional, Create: `LICENSE_INCLUDED`},
40+
"scheduled_operations": acctest.RepresentationGroup{RepType: acctest.Optional, Group: DatabaseAutonomousDatabaseScheduledOperationsRepresentation},
41+
"whitelisted_ips": acctest.Representation{RepType: acctest.Optional, Create: []string{`1.1.1.1/28`}},
42+
"operations_insights_status": acctest.Representation{RepType: acctest.Optional, Create: `NOT_ENABLED`, Update: `ENABLED`},
43+
"timeouts": acctest.RepresentationGroup{RepType: acctest.Required, Group: autonomousDatabaseTimeoutsRepresentation},
44+
"ncharacter_set": acctest.Representation{RepType: acctest.Optional, Create: `AL16UTF16`},
45+
"state": acctest.Representation{RepType: acctest.Optional, Create: `AVAILABLE`},
46+
}
47+
)
48+
49+
func TestDatabaseAutonomousDatabasePeerResource_basic(t *testing.T) {
50+
datasourceName := "data.oci_database_autonomous_database_peers.test_autonomous_database_peers"
51+
52+
httpreplay.SetScenario("TestDatabaseCrossRegionDisasterRecovery_basic")
53+
defer httpreplay.SaveScenario()
54+
55+
provider := acctest.TestAccProvider
56+
config := acctest.ProviderTestConfig()
57+
compartmentId := utils.GetEnvSettingWithBlankDefault("compartment_ocid")
58+
compartmentIdVariableStr := fmt.Sprintf("variable \"compartment_id\" { default = \"%s\" }\n", compartmentId)
59+
60+
resource.Test(t, resource.TestCase{
61+
PreCheck: func() { acctest.TestAccPreCheck(t) },
62+
Providers: map[string]*schema.Provider{
63+
"oci": provider,
64+
},
65+
Steps: []resource.TestStep{
66+
{
67+
Config: config +
68+
acctest.GenerateResourceFromRepresentationMap("oci_database_autonomous_database", "test_autonomous_database", acctest.Required, acctest.Create, DatabaseAutonomousDatabaseRepresentation11) +
69+
acctest.GenerateDataSourceFromRepresentationMap("oci_database_autonomous_database_peers", "test_autonomous_database_peers", acctest.Required, acctest.Create, DatabaseAutonomousDatabasePeerDataSourceRepresentation) +
70+
compartmentIdVariableStr,
71+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
72+
resource.TestCheckResourceAttrSet(datasourceName, "autonomous_database_peer_collection.#"),
73+
resource.TestCheckResourceAttr(datasourceName, "autonomous_database_peer_collection.0.items.#", "0"),
74+
),
75+
},
76+
},
77+
})
78+
}
Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
// Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
2+
// Licensed under the Mozilla Public License v2.0
3+
4+
package database
5+
6+
import (
7+
"context"
8+
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
10+
oci_database "github.com/oracle/oci-go-sdk/v65/database"
11+
12+
"github.com/oracle/terraform-provider-oci/internal/client"
13+
"github.com/oracle/terraform-provider-oci/internal/tfresource"
14+
)
15+
16+
func DatabaseAutonomousDatabasePeersDataSource() *schema.Resource {
17+
return &schema.Resource{
18+
Read: readDatabaseAutonomousDatabasePeers,
19+
Schema: map[string]*schema.Schema{
20+
"filter": tfresource.DataSourceFiltersSchema(),
21+
"autonomous_database_id": {
22+
Type: schema.TypeString,
23+
Required: true,
24+
},
25+
"autonomous_database_peer_collection": {
26+
Type: schema.TypeList,
27+
Computed: true,
28+
Elem: &schema.Resource{
29+
Schema: map[string]*schema.Schema{
30+
// Required
31+
32+
// Optional
33+
34+
// Computed
35+
"items": {
36+
Type: schema.TypeList,
37+
Computed: true,
38+
Elem: &schema.Resource{
39+
Schema: map[string]*schema.Schema{
40+
// Required
41+
42+
// Optional
43+
44+
// Computed
45+
"id": {
46+
Type: schema.TypeString,
47+
Computed: true,
48+
},
49+
"region": {
50+
Type: schema.TypeString,
51+
Computed: true,
52+
},
53+
},
54+
},
55+
},
56+
},
57+
},
58+
},
59+
},
60+
}
61+
}
62+
63+
func readDatabaseAutonomousDatabasePeers(d *schema.ResourceData, m interface{}) error {
64+
sync := &DatabaseAutonomousDatabasePeersDataSourceCrud{}
65+
sync.D = d
66+
sync.Client = m.(*client.OracleClients).DatabaseClient()
67+
68+
return tfresource.ReadResource(sync)
69+
}
70+
71+
type DatabaseAutonomousDatabasePeersDataSourceCrud struct {
72+
D *schema.ResourceData
73+
Client *oci_database.DatabaseClient
74+
Res *oci_database.ListAutonomousDatabasePeersResponse
75+
}
76+
77+
func (s *DatabaseAutonomousDatabasePeersDataSourceCrud) VoidState() {
78+
s.D.SetId("")
79+
}
80+
81+
func (s *DatabaseAutonomousDatabasePeersDataSourceCrud) Get() error {
82+
request := oci_database.ListAutonomousDatabasePeersRequest{}
83+
84+
if autonomousDatabaseId, ok := s.D.GetOkExists("autonomous_database_id"); ok {
85+
tmp := autonomousDatabaseId.(string)
86+
request.AutonomousDatabaseId = &tmp
87+
}
88+
89+
request.RequestMetadata.RetryPolicy = tfresource.GetRetryPolicy(false, "database")
90+
91+
response, err := s.Client.ListAutonomousDatabasePeers(context.Background(), request)
92+
if err != nil {
93+
return err
94+
}
95+
96+
s.Res = &response
97+
request.Page = s.Res.OpcNextPage
98+
99+
for request.Page != nil {
100+
listResponse, err := s.Client.ListAutonomousDatabasePeers(context.Background(), request)
101+
if err != nil {
102+
return err
103+
}
104+
105+
s.Res.Items = append(s.Res.Items, listResponse.Items...)
106+
request.Page = listResponse.OpcNextPage
107+
}
108+
109+
return nil
110+
}
111+
112+
func (s *DatabaseAutonomousDatabasePeersDataSourceCrud) SetData() error {
113+
if s.Res == nil {
114+
return nil
115+
}
116+
117+
s.D.SetId(tfresource.GenerateDataSourceHashID("DatabaseAutonomousDatabasePeersDataSource-", DatabaseAutonomousDatabasePeersDataSource(), s.D))
118+
resources := []map[string]interface{}{}
119+
autonomousDatabasePeer := map[string]interface{}{}
120+
121+
items := []interface{}{}
122+
for _, item := range s.Res.Items {
123+
items = append(items, AutonomousDatabasePeerSummaryToMap(item))
124+
}
125+
autonomousDatabasePeer["items"] = items
126+
127+
if f, fOk := s.D.GetOkExists("filter"); fOk {
128+
items = tfresource.ApplyFiltersInCollection(f.(*schema.Set), items, DatabaseAutonomousDatabasePeersDataSource().Schema["autonomous_database_peer_collection"].Elem.(*schema.Resource).Schema)
129+
autonomousDatabasePeer["items"] = items
130+
}
131+
132+
resources = append(resources, autonomousDatabasePeer)
133+
if err := s.D.Set("autonomous_database_peer_collection", resources); err != nil {
134+
return err
135+
}
136+
137+
return nil
138+
}
139+
140+
func AutonomousDatabasePeerSummaryToMap(obj oci_database.AutonomousDatabasePeerSummary) map[string]interface{} {
141+
result := map[string]interface{}{}
142+
143+
if obj.Id != nil {
144+
result["id"] = string(*obj.Id)
145+
}
146+
147+
if obj.Region != nil {
148+
result["region"] = string(*obj.Region)
149+
}
150+
151+
return result
152+
}

0 commit comments

Comments
 (0)