Skip to content

Commit 1d4c6bb

Browse files
Vasanth SMeharwadeDivya
authored andcommitted
Added - Support for Point-in-time Recovery for non-HA MySQL Database System
1 parent f1def60 commit 1d4c6bb

11 files changed

+289
-1
lines changed

internal/integrationtest/mysql_mysql_db_system_resource_test.go

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ var (
2020
"backup_id": acctest.Representation{RepType: acctest.Optional, Create: `${oci_mysql_mysql_backup.test_mysql_backup.id}`},
2121
}
2222

23+
mysqlDbSystemSourcePitrRepresentation = map[string]interface{}{
24+
"source_type": acctest.Representation{RepType: acctest.Required, Create: `PITR`},
25+
"db_system_id": acctest.Representation{RepType: acctest.Optional, Create: `${oci_mysql_mysql_db_system.test_mysql_pitr_db_system.id}`},
26+
}
27+
2328
mysqlHADbSystemRepresentation = map[string]interface{}{
2429
"admin_password": acctest.Representation{RepType: acctest.Required, Create: `BEstrO0ng_#11`},
2530
"admin_username": acctest.Representation{RepType: acctest.Required, Create: `adminUser`},
@@ -77,8 +82,72 @@ var (
7782
MysqlDbSystemSourceBackupResourceDependencies = MysqlMysqlDbSystemResourceDependencies + utils.MysqlHAConfigurationIdVariable +
7883
acctest.GenerateResourceFromRepresentationMap("oci_mysql_mysql_backup", "test_mysql_backup", acctest.Required, acctest.Create, MysqlMysqlBackupRepresentation) +
7984
acctest.GenerateResourceFromRepresentationMap("oci_mysql_mysql_db_system", "test_mysql_backup_db_system", acctest.Required, acctest.Create, MysqlMysqlDbSystemRepresentation)
85+
86+
MysqlDbSystemSourcePitrResourceDependencies = MysqlMysqlDbSystemResourceDependencies + acctest.GenerateResourceFromRepresentationMap("oci_mysql_mysql_db_system", "test_mysql_pitr_db_system", acctest.Optional, acctest.Update, MysqlMysqlDbSystemRepresentation)
8087
)
8188

89+
func TestMysqlMysqlDbSystemResource_sourcePitr(t *testing.T) {
90+
httpreplay.SetScenario("TestMysqlMysqlDbSystemResource_sourcePitr")
91+
defer httpreplay.SaveScenario()
92+
93+
config := acctest.ProviderTestConfig()
94+
95+
compartmentId := utils.GetEnvSettingWithBlankDefault("compartment_ocid")
96+
compartmentIdVariableStr := fmt.Sprintf("variable \"compartment_id\" { default = \"%s\" }\n", compartmentId)
97+
98+
resourceName := "oci_mysql_mysql_db_system.test_mysql_db_sytem_source_pitr"
99+
100+
// changing admin_password RepType to Optional. As it is an optional parameter for restore operation.
101+
updatedAdminPasswordRepresentation := acctest.GetUpdatedRepresentationCopy("admin_password", acctest.Representation{RepType: acctest.Optional, Create: `BEstrO0ng_#11`},
102+
MysqlMysqlDbSystemRepresentation)
103+
104+
// changing admin_username RepType to Optional. As it is an optional parameter for restore operation.
105+
updatedAdminUsernameRepresentation := acctest.GetUpdatedRepresentationCopy("admin_username", acctest.Representation{RepType: acctest.Optional, Create: `adminUser`},
106+
updatedAdminPasswordRepresentation)
107+
108+
sourcePitrRepresentation := acctest.GetUpdatedRepresentationCopy("ip_address", acctest.Representation{RepType: acctest.Optional, Create: `10.0.0.8`},
109+
acctest.RepresentationCopyWithNewProperties(acctest.RepresentationCopyWithRemovedProperties(updatedAdminUsernameRepresentation, []string{"data_storage_size_in_gb"}), map[string]interface{}{
110+
"source": acctest.RepresentationGroup{RepType: acctest.Optional, Group: mysqlDbSystemSourcePitrRepresentation},
111+
}))
112+
113+
acctest.ResourceTest(t, testAccCheckMysqlMysqlDbSystemDestroy, []resource.TestStep{
114+
// Verify PointInTimeRecovery
115+
{
116+
Config: config + compartmentIdVariableStr + MysqlDbSystemSourcePitrResourceDependencies +
117+
acctest.GenerateResourceFromRepresentationMap("oci_mysql_mysql_db_system", "test_mysql_db_sytem_source_pitr", acctest.Optional, acctest.Create, sourcePitrRepresentation),
118+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
119+
resource.TestCheckResourceAttrSet(resourceName, "availability_domain"),
120+
resource.TestCheckResourceAttr(resourceName, "backup_policy.#", "1"),
121+
resource.TestCheckResourceAttr(resourceName, "backup_policy.0.freeform_tags.%", "1"),
122+
resource.TestCheckResourceAttr(resourceName, "backup_policy.0.is_enabled", "false"),
123+
resource.TestCheckResourceAttr(resourceName, "backup_policy.0.retention_in_days", "10"),
124+
resource.TestCheckResourceAttr(resourceName, "backup_policy.0.window_start_time", "01:00-00:00"),
125+
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
126+
resource.TestCheckResourceAttrSet(resourceName, "configuration_id"),
127+
resource.TestCheckResourceAttr(resourceName, "description", "MySQL Database Service"),
128+
resource.TestCheckResourceAttr(resourceName, "display_name", "DBSystem001"),
129+
resource.TestCheckResourceAttr(resourceName, "fault_domain", "FAULT-DOMAIN-1"),
130+
resource.TestCheckResourceAttr(resourceName, "freeform_tags.%", "1"),
131+
resource.TestCheckResourceAttr(resourceName, "hostname_label", "hostnameLabel"),
132+
resource.TestCheckResourceAttrSet(resourceName, "id"),
133+
resource.TestCheckResourceAttr(resourceName, "ip_address", "10.0.0.8"),
134+
resource.TestCheckResourceAttr(resourceName, "maintenance.#", "1"),
135+
resource.TestCheckResourceAttr(resourceName, "maintenance.0.window_start_time", "sun 01:00"),
136+
resource.TestCheckResourceAttr(resourceName, "port", "3306"),
137+
resource.TestCheckResourceAttr(resourceName, "port_x", "33306"),
138+
resource.TestCheckResourceAttrSet(resourceName, "shape_name"),
139+
resource.TestCheckResourceAttr(resourceName, "source.#", "1"),
140+
resource.TestCheckResourceAttrSet(resourceName, "source.0.db_system_id"),
141+
resource.TestCheckResourceAttr(resourceName, "source.0.source_type", "PITR"),
142+
resource.TestCheckResourceAttrSet(resourceName, "state"),
143+
resource.TestCheckResourceAttrSet(resourceName, "subnet_id"),
144+
resource.TestCheckResourceAttrSet(resourceName, "time_created"),
145+
resource.TestCheckResourceAttrSet(resourceName, "time_updated"),
146+
),
147+
},
148+
})
149+
}
150+
82151
// issue-routing-tag: mysql/default
83152
func TestMysqlMysqlDbSystemResource_sourceBackup(t *testing.T) {
84153
httpreplay.SetScenario("TestMysqlMysqlDbSystemResource_sourceBackup")

internal/integrationtest/mysql_mysql_db_system_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,18 +84,28 @@ var (
8484
"defined_tags": acctest.Representation{RepType: acctest.Optional, Create: `${map("${oci_identity_tag_namespace.tag-namespace1.name}.${oci_identity_tag.tag1.name}", "value")}`, Update: `${map("${oci_identity_tag_namespace.tag-namespace1.name}.${oci_identity_tag.tag1.name}", "updatedValue")}`},
8585
"freeform_tags": acctest.Representation{RepType: acctest.Optional, Create: map[string]string{"Department": "Finance"}, Update: map[string]string{"Department": "Accounting"}},
8686
"is_enabled": acctest.Representation{RepType: acctest.Optional, Create: `false`, Update: `true`},
87+
"pitr_policy": acctest.RepresentationGroup{RepType: acctest.Optional, Group: mysqlDbSystemBackupPolicyPitrPolicyRepresentation},
8788
"retention_in_days": acctest.Representation{RepType: acctest.Optional, Create: `10`, Update: `11`},
8889
"window_start_time": acctest.Representation{RepType: acctest.Optional, Create: `01:00-00:00`, Update: `02:00-00:00`},
8990
}
9091

92+
mysqlDbSystemBackupPolicyPitrPolicyRepresentation = map[string]interface{}{
93+
"is_enabled": acctest.Representation{RepType: acctest.Optional, Create: `false`, Update: `true`},
94+
}
95+
9196
MysqlDbSystemBackupPolicyNotUpdateableRepresentation = map[string]interface{}{
9297
"defined_tags": acctest.Representation{RepType: acctest.Optional, Create: `${map("${oci_identity_tag_namespace.tag-namespace1.name}.${oci_identity_tag.tag1.name}", "value")}`},
9398
"freeform_tags": acctest.Representation{RepType: acctest.Optional, Create: map[string]string{"Department": "Finance"}},
9499
"is_enabled": acctest.Representation{RepType: acctest.Optional, Create: `false`},
100+
"pitr_policy": acctest.RepresentationGroup{RepType: acctest.Optional, Group: mysqlDbSystemBackupPolicyPitrPolicyNotUpdateableRepresentation},
95101
"retention_in_days": acctest.Representation{RepType: acctest.Optional, Create: `10`},
96102
"window_start_time": acctest.Representation{RepType: acctest.Optional, Create: `01:00-00:00`},
97103
}
98104

105+
mysqlDbSystemBackupPolicyPitrPolicyNotUpdateableRepresentation = map[string]interface{}{
106+
"is_enabled": acctest.Representation{RepType: acctest.Optional, Create: `false`},
107+
}
108+
99109
mysqlDbSystemDeletionPolicyRepresentation = map[string]interface{}{
100110
// Don't update these as setting the deletion policy to true or backup retention to retain will leave resources
101111
// that can't be removed.
@@ -173,6 +183,8 @@ func TestMysqlMysqlDbSystemResource_basic(t *testing.T) {
173183
resource.TestCheckResourceAttr(resourceName, "backup_policy.#", "1"),
174184
resource.TestCheckResourceAttr(resourceName, "backup_policy.0.freeform_tags.%", "1"),
175185
resource.TestCheckResourceAttr(resourceName, "backup_policy.0.is_enabled", "false"),
186+
resource.TestCheckResourceAttr(resourceName, "backup_policy.0.pitr_policy.#", "1"),
187+
resource.TestCheckResourceAttr(resourceName, "backup_policy.0.pitr_policy.0.is_enabled", "false"),
176188
resource.TestCheckResourceAttr(resourceName, "backup_policy.0.retention_in_days", "10"),
177189
resource.TestCheckResourceAttr(resourceName, "backup_policy.0.window_start_time", "01:00-00:00"),
178190
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
@@ -227,6 +239,8 @@ func TestMysqlMysqlDbSystemResource_basic(t *testing.T) {
227239
resource.TestCheckResourceAttr(resourceName, "backup_policy.#", "1"),
228240
resource.TestCheckResourceAttr(resourceName, "backup_policy.0.freeform_tags.%", "1"),
229241
resource.TestCheckResourceAttr(resourceName, "backup_policy.0.is_enabled", "true"),
242+
resource.TestCheckResourceAttr(resourceName, "backup_policy.0.pitr_policy.#", "1"),
243+
resource.TestCheckResourceAttr(resourceName, "backup_policy.0.pitr_policy.0.is_enabled", "true"),
230244
resource.TestCheckResourceAttr(resourceName, "backup_policy.0.retention_in_days", "11"),
231245
resource.TestCheckResourceAttr(resourceName, "backup_policy.0.window_start_time", "02:00-00:00"),
232246
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
@@ -329,6 +343,8 @@ func TestMysqlMysqlDbSystemResource_basic(t *testing.T) {
329343
resource.TestCheckResourceAttr(singularDatasourceName, "backup_policy.#", "1"),
330344
resource.TestCheckResourceAttr(singularDatasourceName, "backup_policy.0.freeform_tags.%", "1"),
331345
resource.TestCheckResourceAttr(singularDatasourceName, "backup_policy.0.is_enabled", "true"),
346+
resource.TestCheckResourceAttr(singularDatasourceName, "backup_policy.0.pitr_policy.#", "1"),
347+
resource.TestCheckResourceAttr(singularDatasourceName, "backup_policy.0.pitr_policy.0.is_enabled", "true"),
332348
resource.TestCheckResourceAttr(singularDatasourceName, "backup_policy.0.retention_in_days", "11"),
333349
resource.TestCheckResourceAttr(singularDatasourceName, "backup_policy.0.window_start_time", "02:00-00:00"),
334350
resource.TestCheckResourceAttr(singularDatasourceName, "channels.#", "1"),
@@ -354,6 +370,7 @@ func TestMysqlMysqlDbSystemResource_basic(t *testing.T) {
354370
resource.TestCheckResourceAttr(singularDatasourceName, "is_highly_available", "false"),
355371
resource.TestCheckResourceAttr(singularDatasourceName, "maintenance.#", "1"),
356372
resource.TestCheckResourceAttr(singularDatasourceName, "maintenance.0.window_start_time", "sun 01:00"),
373+
resource.TestCheckResourceAttrSet(singularDatasourceName, "mysql_version"),
357374
resource.TestCheckResourceAttr(singularDatasourceName, "port", "3306"),
358375
resource.TestCheckResourceAttr(singularDatasourceName, "port_x", "33306"),
359376
resource.TestCheckResourceAttr(singularDatasourceName, "source.#", "1"),

internal/service/mysql/mysql_mysql_backup_resource.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,23 @@ func MysqlMysqlBackupResource() *schema.Resource {
133133
Type: schema.TypeBool,
134134
Computed: true,
135135
},
136+
"pitr_policy": {
137+
Type: schema.TypeList,
138+
Computed: true,
139+
Elem: &schema.Resource{
140+
Schema: map[string]*schema.Schema{
141+
// Required
142+
143+
// Optional
144+
145+
// Computed
146+
"is_enabled": {
147+
Type: schema.TypeBool,
148+
Computed: true,
149+
},
150+
},
151+
},
152+
},
136153
"retention_in_days": {
137154
Type: schema.TypeInt,
138155
Computed: true,
@@ -626,6 +643,10 @@ func BackupPolicyToMap(obj *oci_mysql.BackupPolicy) map[string]interface{} {
626643
result["is_enabled"] = bool(*obj.IsEnabled)
627644
}
628645

646+
if obj.PitrPolicy != nil {
647+
result["pitr_policy"] = []interface{}{PitrPolicyToMap(obj.PitrPolicy)}
648+
}
649+
629650
if obj.RetentionInDays != nil {
630651
result["retention_in_days"] = int(*obj.RetentionInDays)
631652
}

internal/service/mysql/mysql_mysql_db_system_data_source.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,12 @@ func (s *MysqlMysqlDbSystemDataSourceCrud) SetData() error {
178178
s.D.Set("mysql_version", *s.Res.MysqlVersion)
179179
}
180180

181+
if s.Res.PointInTimeRecoveryDetails != nil {
182+
s.D.Set("point_in_time_recovery_details", []interface{}{PointInTimeRecoveryDetailsToMap(s.Res.PointInTimeRecoveryDetails)})
183+
} else {
184+
s.D.Set("point_in_time_recovery_details", nil)
185+
}
186+
181187
if s.Res.Port != nil {
182188
s.D.Set("port", *s.Res.Port)
183189
}

0 commit comments

Comments
 (0)