Skip to content

Commit 292de70

Browse files
Goncalo Silvaravinitp
authored andcommitted
Added - Support for MHS - DB system database mode and access mode
1 parent 3087294 commit 292de70

9 files changed

+142
-0
lines changed

examples/mysql/main.tf

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,10 @@ resource "oci_mysql_mysql_db_system" "test_mysql_db_system" {
116116
source_type = "BACKUP"
117117
}
118118

119+
#Optional
120+
access_mode = "UNRESTRICTED"
121+
database_mode = "READ_WRITE"
122+
119123
#Optional
120124
crash_recovery = "ENABLED"
121125
database_management = "DISABLED"

internal/integrationtest/mysql_mysql_db_system_resource_2_test.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,20 @@ var (
2727
"data_storage": acctest.RepresentationGroup{RepType: acctest.Optional, Group: MysqlMysqlDbSystemDataStorageRepresentation},
2828
}
2929

30+
mysqlDbSystemRepresentationDbSystemModesUpdate = map[string]interface{}{
31+
"admin_password": acctest.Representation{RepType: acctest.Required, Create: `BEstrO0ng_#11`},
32+
"admin_username": acctest.Representation{RepType: acctest.Required, Create: `adminUser`},
33+
"availability_domain": acctest.Representation{RepType: acctest.Required, Create: `${data.oci_identity_availability_domains.test_availability_domains.availability_domains.0.name}`},
34+
"compartment_id": acctest.Representation{RepType: acctest.Required, Create: `${var.compartment_id}`},
35+
"configuration_id": acctest.Representation{RepType: acctest.Optional, Create: `${var.MysqlConfigurationOCID[var.region]}`},
36+
"shape_name": acctest.Representation{RepType: acctest.Required, Create: `MySQL.VM.Standard.E3.1.8GB`},
37+
"subnet_id": acctest.Representation{RepType: acctest.Required, Create: `${oci_core_subnet.test_subnet.id}`},
38+
"data_storage_size_in_gb": acctest.Representation{RepType: acctest.Required, Create: `50`},
39+
"access_mode": acctest.Representation{RepType: acctest.Optional, Create: `UNRESTRICTED`, Update: `RESTRICTED`},
40+
"database_mode": acctest.Representation{RepType: acctest.Optional, Create: `READ_WRITE`, Update: `READ_ONLY`},
41+
"database_management": acctest.Representation{RepType: acctest.Optional, Create: `DISABLED`},
42+
}
43+
3044
MysqlMysqlDbSystemDataStorageRepresentation = map[string]interface{}{
3145
"is_auto_expand_storage_enabled": acctest.Representation{RepType: acctest.Optional, Create: `false`, Update: `true`},
3246
"max_storage_size_in_gbs": acctest.Representation{RepType: acctest.Optional, Create: `100`, Update: `150`},
@@ -86,3 +100,53 @@ func TestMysqlMysqlDbSystemResource_dataStorageTest(t *testing.T) {
86100
},
87101
})
88102
}
103+
104+
// issue-routing-tag: mysql/default
105+
func TestMysqlMysqlDbSystemResource_databaseModes(t *testing.T) {
106+
httpreplay.SetScenario("TestMysqlMysqlDbSystemResource_databaseModes")
107+
defer httpreplay.SaveScenario()
108+
109+
config := acctest.ProviderTestConfig()
110+
111+
compartmentId := utils.GetEnvSettingWithBlankDefault("compartment_ocid")
112+
compartmentIdVariableStr := fmt.Sprintf("variable \"compartment_id\" { default = \"%s\" }\n", compartmentId)
113+
114+
resourceName := "oci_mysql_mysql_db_system.test_mysql_db_system"
115+
116+
var resId, resId2 string
117+
118+
acctest.ResourceTest(t, nil, []resource.TestStep{
119+
// verify Create with DbSystem modes
120+
{
121+
Config: config + compartmentIdVariableStr + MysqlMysqlDbSystemResourceDependencies +
122+
acctest.GenerateResourceFromRepresentationMap("oci_mysql_mysql_db_system", "test_mysql_db_system", acctest.Optional, acctest.Create, mysqlDbSystemRepresentationDbSystemModesUpdate),
123+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
124+
resource.TestCheckResourceAttr(resourceName, "access_mode", "UNRESTRICTED"),
125+
resource.TestCheckResourceAttr(resourceName, "database_mode", "READ_WRITE"),
126+
127+
func(s *terraform.State) (err error) {
128+
resId, err = acctest.FromInstanceState(s, resourceName, "id")
129+
return err
130+
},
131+
),
132+
},
133+
134+
// verify update of DbSystem modes
135+
{
136+
Config: config + compartmentIdVariableStr + MysqlMysqlDbSystemResourceDependencies +
137+
acctest.GenerateResourceFromRepresentationMap("oci_mysql_mysql_db_system", "test_mysql_db_system", acctest.Optional, acctest.Update, mysqlDbSystemRepresentationDbSystemModesUpdate),
138+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
139+
resource.TestCheckResourceAttr(resourceName, "access_mode", "RESTRICTED"),
140+
resource.TestCheckResourceAttr(resourceName, "database_mode", "READ_ONLY"),
141+
142+
func(s *terraform.State) (err error) {
143+
resId2, err = acctest.FromInstanceState(s, resourceName, "id")
144+
if resId != resId2 {
145+
return fmt.Errorf("Resource recreated when it was supposed to be updated.")
146+
}
147+
return err
148+
},
149+
),
150+
},
151+
})
152+
}

internal/integrationtest/mysql_mysql_db_system_test.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ var (
5151
}
5252

5353
MysqlMysqlDbSystemRepresentation = map[string]interface{}{
54+
"access_mode": acctest.Representation{RepType: acctest.Optional, Create: `UNRESTRICTED`},
5455
"admin_password": acctest.Representation{RepType: acctest.Required, Create: `BEstrO0ng_#11`},
5556
"admin_username": acctest.Representation{RepType: acctest.Required, Create: `adminUser`},
5657
"availability_domain": acctest.Representation{RepType: acctest.Required, Create: `${data.oci_identity_availability_domains.test_availability_domains.availability_domains.0.name}`},
@@ -62,6 +63,7 @@ var (
6263
"crash_recovery": acctest.Representation{RepType: acctest.Optional, Create: `ENABLED`},
6364
"data_storage_size_in_gb": acctest.Representation{RepType: acctest.Required, Create: `50`},
6465
"database_management": acctest.Representation{RepType: acctest.Optional, Create: `DISABLED`},
66+
"database_mode": acctest.Representation{RepType: acctest.Optional, Create: `READ_WRITE`},
6567
"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")}`},
6668
"deletion_policy": acctest.RepresentationGroup{RepType: acctest.Optional, Group: mysqlDbSystemDeletionPolicyRepresentation},
6769
"description": acctest.Representation{RepType: acctest.Optional, Create: `MySQL Database Service`, Update: `description2`},
@@ -186,6 +188,7 @@ func TestMysqlMysqlDbSystemResource_basic(t *testing.T) {
186188
acctest.GenerateResourceFromRepresentationMap("oci_mysql_mysql_db_system", "test_mysql_db_system", acctest.Optional, acctest.Create, MysqlMysqlDbSystemRepresentation) +
187189
acctest.GenerateResourceFromRepresentationMap("oci_mysql_channel", "test_channel", acctest.Required, acctest.Create, MysqlChannelRepresentation),
188190
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
191+
resource.TestCheckResourceAttr(resourceName, "access_mode", "UNRESTRICTED"),
189192
resource.TestCheckResourceAttr(resourceName, "admin_password", "BEstrO0ng_#11"),
190193
resource.TestCheckResourceAttr(resourceName, "admin_username", "adminUser"),
191194
resource.TestCheckResourceAttrSet(resourceName, "availability_domain"),
@@ -203,6 +206,7 @@ func TestMysqlMysqlDbSystemResource_basic(t *testing.T) {
203206
resource.TestCheckResourceAttr(resourceName, "data_storage.0.is_auto_expand_storage_enabled", "false"),
204207
resource.TestCheckResourceAttr(resourceName, "data_storage_size_in_gb", "50"),
205208
resource.TestCheckResourceAttr(resourceName, "database_management", "DISABLED"),
209+
resource.TestCheckResourceAttr(resourceName, "database_mode", "READ_WRITE"),
206210
resource.TestCheckResourceAttr(resourceName, "deletion_policy.#", "1"),
207211
resource.TestCheckResourceAttr(resourceName, "deletion_policy.0.automatic_backup_retention", "DELETE"),
208212
resource.TestCheckResourceAttr(resourceName, "deletion_policy.0.final_backup", "SKIP_FINAL_BACKUP"),
@@ -249,6 +253,7 @@ func TestMysqlMysqlDbSystemResource_basic(t *testing.T) {
249253
acctest.GenerateResourceFromRepresentationMap("oci_mysql_mysql_db_system", "test_mysql_db_system", acctest.Optional, acctest.Update, MysqlMysqlDbSystemRepresentation) +
250254
acctest.GenerateResourceFromRepresentationMap("oci_mysql_channel", "test_channel", acctest.Required, acctest.Create, MysqlChannelRepresentation),
251255
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
256+
resource.TestCheckResourceAttr(resourceName, "access_mode", "UNRESTRICTED"),
252257
resource.TestCheckResourceAttr(resourceName, "admin_password", "BEstrO0ng_#11"),
253258
resource.TestCheckResourceAttr(resourceName, "admin_username", "adminUser"),
254259
resource.TestCheckResourceAttr(resourceName, "backup_policy.#", "1"),
@@ -265,6 +270,7 @@ func TestMysqlMysqlDbSystemResource_basic(t *testing.T) {
265270
resource.TestCheckResourceAttr(resourceName, "data_storage.0.is_auto_expand_storage_enabled", "false"),
266271
resource.TestCheckResourceAttr(resourceName, "data_storage_size_in_gb", "50"),
267272
resource.TestCheckResourceAttr(resourceName, "database_management", "DISABLED"),
273+
resource.TestCheckResourceAttr(resourceName, "database_mode", "READ_WRITE"),
268274
resource.TestCheckResourceAttr(resourceName, "deletion_policy.#", "1"),
269275
resource.TestCheckResourceAttr(resourceName, "deletion_policy.0.automatic_backup_retention", "RETAIN"),
270276
resource.TestCheckResourceAttr(resourceName, "deletion_policy.0.final_backup", "REQUIRE_FINAL_BACKUP"),
@@ -316,6 +322,7 @@ func TestMysqlMysqlDbSystemResource_basic(t *testing.T) {
316322
resource.TestCheckResourceAttr(datasourceName, "state", "ACTIVE"),
317323

318324
resource.TestCheckResourceAttr(datasourceName, "db_systems.#", "1"),
325+
resource.TestCheckResourceAttr(datasourceName, "db_systems.0.access_mode", "UNRESTRICTED"),
319326
resource.TestCheckResourceAttrSet(datasourceName, "db_systems.0.availability_domain"),
320327
resource.TestCheckResourceAttr(datasourceName, "db_systems.0.backup_policy.#", "1"),
321328
resource.TestCheckResourceAttr(datasourceName, "db_systems.0.backup_policy.0.freeform_tags.%", "1"),
@@ -326,6 +333,7 @@ func TestMysqlMysqlDbSystemResource_basic(t *testing.T) {
326333
resource.TestCheckResourceAttr(datasourceName, "db_systems.0.crash_recovery", "ENABLED"),
327334
resource.TestCheckResourceAttr(datasourceName, "db_systems.0.current_placement.#", "1"),
328335
resource.TestCheckResourceAttr(datasourceName, "db_systems.0.database_management", "DISABLED"),
336+
resource.TestCheckResourceAttr(datasourceName, "db_systems.0.database_mode", "READ_WRITE"),
329337
resource.TestCheckResourceAttr(datasourceName, "db_systems.0.deletion_policy.#", "1"),
330338
resource.TestCheckResourceAttr(datasourceName, "db_systems.0.deletion_policy.0.automatic_backup_retention", "RETAIN"),
331339
resource.TestCheckResourceAttr(datasourceName, "db_systems.0.deletion_policy.0.final_backup", "REQUIRE_FINAL_BACKUP"),
@@ -354,6 +362,7 @@ func TestMysqlMysqlDbSystemResource_basic(t *testing.T) {
354362
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
355363
resource.TestCheckResourceAttrSet(singularDatasourceName, "db_system_id"),
356364

365+
resource.TestCheckResourceAttr(singularDatasourceName, "access_mode", "UNRESTRICTED"),
357366
resource.TestCheckResourceAttrSet(singularDatasourceName, "availability_domain"),
358367
resource.TestCheckResourceAttr(singularDatasourceName, "backup_policy.#", "1"),
359368
resource.TestCheckResourceAttr(singularDatasourceName, "backup_policy.0.freeform_tags.%", "1"),
@@ -374,6 +383,7 @@ func TestMysqlMysqlDbSystemResource_basic(t *testing.T) {
374383
resource.TestCheckResourceAttrSet(singularDatasourceName, "data_storage.0.max_storage_size_in_gbs"),
375384
resource.TestCheckResourceAttr(singularDatasourceName, "data_storage_size_in_gb", "50"),
376385
resource.TestCheckResourceAttr(singularDatasourceName, "database_management", "DISABLED"),
386+
resource.TestCheckResourceAttr(singularDatasourceName, "database_mode", "READ_WRITE"),
377387
resource.TestCheckResourceAttr(singularDatasourceName, "deletion_policy.#", "1"),
378388
resource.TestCheckResourceAttr(singularDatasourceName, "deletion_policy.0.automatic_backup_retention", "RETAIN"),
379389
resource.TestCheckResourceAttr(singularDatasourceName, "deletion_policy.0.final_backup", "REQUIRE_FINAL_BACKUP"),

internal/service/mysql/mysql_mysql_db_system_data_source.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ func (s *MysqlMysqlDbSystemDataSourceCrud) SetData() error {
6666

6767
s.D.SetId(*s.Res.Id)
6868

69+
s.D.Set("access_mode", s.Res.AccessMode)
70+
6971
if s.Res.AvailabilityDomain != nil {
7072
s.D.Set("availability_domain", *s.Res.AvailabilityDomain)
7173
}
@@ -116,6 +118,8 @@ func (s *MysqlMysqlDbSystemDataSourceCrud) SetData() error {
116118

117119
s.D.Set("database_management", s.Res.DatabaseManagement)
118120

121+
s.D.Set("database_mode", s.Res.DatabaseMode)
122+
119123
if s.Res.DefinedTags != nil {
120124
s.D.Set("defined_tags", tfresource.DefinedTagsToMap(s.Res.DefinedTags))
121125
}

internal/service/mysql/mysql_mysql_db_system_resource.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,11 @@ func MysqlMysqlDbSystemResource() *schema.Resource {
5959
},
6060

6161
// Optional
62+
"access_mode": {
63+
Type: schema.TypeString,
64+
Optional: true,
65+
Computed: true,
66+
},
6267
"admin_password": {
6368
Type: schema.TypeString,
6469
Optional: true,
@@ -208,6 +213,11 @@ func MysqlMysqlDbSystemResource() *schema.Resource {
208213
Optional: true,
209214
Computed: true,
210215
},
216+
"database_mode": {
217+
Type: schema.TypeString,
218+
Optional: true,
219+
Computed: true,
220+
},
211221
"defined_tags": {
212222
Type: schema.TypeMap,
213223
Optional: true,
@@ -942,6 +952,10 @@ func (s *MysqlMysqlDbSystemResourceCrud) UpdatedTarget() []string {
942952
func (s *MysqlMysqlDbSystemResourceCrud) Create() error {
943953
request := oci_mysql.CreateDbSystemRequest{}
944954

955+
if accessMode, ok := s.D.GetOkExists("access_mode"); ok {
956+
request.AccessMode = oci_mysql.DbSystemAccessModeEnum(accessMode.(string))
957+
}
958+
945959
if adminPassword, ok := s.D.GetOkExists("admin_password"); ok {
946960
tmp := adminPassword.(string)
947961
request.AdminPassword = &tmp
@@ -1023,6 +1037,10 @@ func (s *MysqlMysqlDbSystemResourceCrud) Create() error {
10231037
request.DatabaseManagement = oci_mysql.DatabaseManagementStatusEnum(databaseManagement.(string))
10241038
}
10251039

1040+
if databaseMode, ok := s.D.GetOkExists("database_mode"); ok {
1041+
request.DatabaseMode = oci_mysql.DbSystemDatabaseModeEnum(databaseMode.(string))
1042+
}
1043+
10261044
if definedTags, ok := s.D.GetOkExists("defined_tags"); ok {
10271045
convertedDefinedTags, err := tfresource.MapToDefinedTags(definedTags.(map[string]interface{}))
10281046
if err != nil {
@@ -1176,6 +1194,10 @@ func (s *MysqlMysqlDbSystemResourceCrud) Get() error {
11761194
func (s *MysqlMysqlDbSystemResourceCrud) Update() error {
11771195
request := oci_mysql.UpdateDbSystemRequest{}
11781196

1197+
if accessMode, ok := s.D.GetOkExists("access_mode"); ok && s.D.HasChange("access_mode") {
1198+
request.AccessMode = oci_mysql.DbSystemAccessModeEnum(accessMode.(string))
1199+
}
1200+
11791201
if backupPolicy, ok := s.D.GetOkExists("backup_policy"); ok && s.D.HasChange("backup_policy") {
11801202
if tmpList := backupPolicy.([]interface{}); len(tmpList) > 0 {
11811203
fieldKeyFormat := fmt.Sprintf("%s.%d.%%s", "backup_policy", 0)
@@ -1240,6 +1262,10 @@ func (s *MysqlMysqlDbSystemResourceCrud) Update() error {
12401262
request.DatabaseManagement = oci_mysql.DatabaseManagementStatusEnum(databaseManagement.(string))
12411263
}
12421264

1265+
if databaseMode, ok := s.D.GetOkExists("database_mode"); ok && s.D.HasChange("database_mode") {
1266+
request.DatabaseMode = oci_mysql.DbSystemDatabaseModeEnum(databaseMode.(string))
1267+
}
1268+
12431269
if definedTags, ok := s.D.GetOkExists("defined_tags"); ok && s.D.HasChange("defined_tags") {
12441270
convertedDefinedTags, err := tfresource.MapToDefinedTags(definedTags.(map[string]interface{}))
12451271
if err != nil {
@@ -1344,6 +1370,8 @@ func (s *MysqlMysqlDbSystemResourceCrud) Delete() error {
13441370
}
13451371

13461372
func (s *MysqlMysqlDbSystemResourceCrud) SetData() error {
1373+
s.D.Set("access_mode", s.Res.AccessMode)
1374+
13471375
if s.Res.AvailabilityDomain != nil {
13481376
s.D.Set("availability_domain", *s.Res.AvailabilityDomain)
13491377
}
@@ -1394,6 +1422,8 @@ func (s *MysqlMysqlDbSystemResourceCrud) SetData() error {
13941422

13951423
s.D.Set("database_management", s.Res.DatabaseManagement)
13961424

1425+
s.D.Set("database_mode", s.Res.DatabaseMode)
1426+
13971427
if s.Res.DefinedTags != nil {
13981428
s.D.Set("defined_tags", tfresource.DefinedTagsToMap(s.Res.DefinedTags))
13991429
}

internal/service/mysql/mysql_mysql_db_systems_data_source.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,8 @@ func (s *MysqlMysqlDbSystemsDataSourceCrud) SetData() error {
166166
"compartment_id": *r.CompartmentId,
167167
}
168168

169+
mysqlDbSystem["access_mode"] = r.AccessMode
170+
169171
if r.AvailabilityDomain != nil {
170172
mysqlDbSystem["availability_domain"] = *r.AvailabilityDomain
171173
}
@@ -186,6 +188,8 @@ func (s *MysqlMysqlDbSystemsDataSourceCrud) SetData() error {
186188

187189
mysqlDbSystem["database_management"] = r.DatabaseManagement
188190

191+
mysqlDbSystem["database_mode"] = r.DatabaseMode
192+
189193
if r.DefinedTags != nil {
190194
mysqlDbSystem["defined_tags"] = tfresource.DefinedTagsToMap(r.DefinedTags)
191195
}

website/docs/d/mysql_mysql_db_system.html.markdown

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ The following arguments are supported:
3232

3333
The following attributes are exported:
3434

35+
* `access_mode` - The access mode indicating if the database access is unrestricted (to all MySQL user accounts), or restricted (to only certain users with specific privileges):
36+
* UNRESTRICTED: the access to the database is not restricted;
37+
* RESTRICTED: the access is allowed only to users with specific privileges; RESTRICTED will correspond to setting the MySQL system variable [offline_mode](https://dev.mysql.com/doc/en/server-system-variables.html#sysvar_offline_mode) to ON.
3538
* `availability_domain` - The availability domain on which to deploy the Read/Write endpoint. This defines the preferred primary instance.
3639

3740
In a failover scenario, the Read/Write endpoint is redirected to one of the other availability domains and the MySQL instance in that domain is promoted to the primary instance. This redirection does not affect the IP address of the DB System in any way.
@@ -124,6 +127,9 @@ The following attributes are exported:
124127
* `email` - The email address used by Oracle to send notifications regarding the DB System.
125128
* `data_storage_size_in_gb` - Initial size of the data volume in GiBs that will be created and attached.
126129
* `database_management` - Whether to enable monitoring via the Database Management service.
130+
* `database_mode` - The database mode indicating the types of statements that are allowed to run in the the DB system. This mode applies only to statements run by user connections. Replicated write statements continue to be allowed regardless of the DatabaseMode.
131+
* READ_WRITE: allow running read and write statements on the DB system;
132+
* READ_ONLY: only allow running read statements on the DB system.
127133
* `defined_tags` - Defined tags for this resource. Each key is predefined and scoped to a namespace. Example: `{"foo-namespace.bar-key": "value"}`
128134
* `deletion_policy` - The Deletion policy for the DB System.
129135
* `automatic_backup_retention` - Specifies if any automatic backups created for a DB System should be retained or deleted when the DB System is deleted.

0 commit comments

Comments
 (0)