Skip to content

Commit c906ab7

Browse files
MarkLeithSrividyaKamakshi
authored andcommitted
Added - Support for HeatWave Service: Zerotrust Packet Routing (ZPR)
1 parent be8980a commit c906ab7

20 files changed

+176
-2
lines changed

examples/mysql/main.tf

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,9 @@ resource "oci_mysql_mysql_db_system" "test_mysql_db_system" {
176176
configuration = "DISABLED"
177177
port = "443"
178178
}
179+
180+
#Optional
181+
security_attributes = {"oracle-zpr.sensitivity.value": "low", "oracle-zpr.sensitivity.mode": "enforce"}
179182
}
180183

181184
data "oci_mysql_mysql_configurations" "test_mysql_configurations" {

examples/mysql/replica/main.tf

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,9 @@ resource "oci_mysql_replica" "test_replica" {
117117
#mysql_version = "8.1.0"
118118
nsg_ids = [oci_core_network_security_group.test_network_security_group.id]
119119
shape_name = "MySQL.VM.Standard.E3.4.64GB"
120+
121+
# Optional
122+
security_attributes = {"oracle-zpr.sensitivity.value": "low", "oracle-zpr.sensitivity.mode": "enforce"}
120123
}
121124
}
122125

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
// Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved.
2+
3+
package integrationtest
4+
5+
import (
6+
"fmt"
7+
"testing"
8+
9+
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
10+
"github.com/hashicorp/terraform-plugin-testing/terraform"
11+
12+
"github.com/oracle/terraform-provider-oci/httpreplay"
13+
"github.com/oracle/terraform-provider-oci/internal/acctest"
14+
"github.com/oracle/terraform-provider-oci/internal/utils"
15+
)
16+
17+
var (
18+
mysqlDbSystemSecurityAttributes = map[string]interface{}{
19+
// standard required properties
20+
"admin_password": acctest.Representation{RepType: acctest.Required, Create: `BEstrO0ng_#11`},
21+
"admin_username": acctest.Representation{RepType: acctest.Required, Create: `adminUser`},
22+
"availability_domain": acctest.Representation{RepType: acctest.Required, Create: `${data.oci_identity_availability_domains.test_availability_domains.availability_domains.0.name}`},
23+
"compartment_id": acctest.Representation{RepType: acctest.Required, Create: `${var.compartment_id}`},
24+
"shape_name": acctest.Representation{RepType: acctest.Required, Create: `MySQL.VM.Standard.E3.1.8GB`},
25+
"subnet_id": acctest.Representation{RepType: acctest.Required, Create: `${oci_core_subnet.test_subnet.id}`},
26+
"data_storage_size_in_gb": acctest.Representation{RepType: acctest.Required, Create: `50`},
27+
28+
// use an easier to track display name
29+
"display_name": acctest.Representation{RepType: acctest.Optional, Create: `TestDbSystemSecurityAttributes`},
30+
31+
// avoid wasting time setting up DBM when that's not what we're testing here
32+
"database_management": acctest.Representation{RepType: acctest.Optional, Create: `DISABLED`},
33+
34+
// disable backup policy to avoid wasting even more time and resources
35+
"backup_policy": acctest.RepresentationGroup{RepType: acctest.Required, Group: disabledBackupPolicy},
36+
37+
// create with the default SAs and then clear SAs on update
38+
"security_attributes": acctest.Representation{RepType: acctest.Optional,
39+
Create: map[string]string{"oracle-zpr.sensitivity.value": "low", "oracle-zpr.sensitivity.mode": "enforce"},
40+
Update: map[string]string{}},
41+
}
42+
)
43+
44+
// issue-routing-tag: mysql/default
45+
func TestMysqlMysqlDbSystemResource_securityAttributes(t *testing.T) {
46+
httpreplay.SetScenario("TestMysqlMysqlDbSystemResource_securityAttributes")
47+
defer httpreplay.SaveScenario()
48+
49+
config := acctest.ProviderTestConfig()
50+
51+
compartmentId := utils.GetEnvSettingWithBlankDefault("compartment_ocid")
52+
compartmentIdVariableStr := fmt.Sprintf("variable \"compartment_id\" { default = \"%s\" }\n", compartmentId)
53+
54+
resourceName := "oci_mysql_mysql_db_system.test_mysql_db_system"
55+
56+
var resId, resId2 string
57+
58+
acctest.ResourceTest(t, nil, []resource.TestStep{
59+
// verify create results in a DBS with SA
60+
{
61+
Config: config + compartmentIdVariableStr + MysqlMysqlDbSystemResourceDependencies +
62+
acctest.GenerateResourceFromRepresentationMap("oci_mysql_mysql_db_system", "test_mysql_db_system", acctest.Optional, acctest.Create, mysqlDbSystemSecurityAttributes),
63+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
64+
resource.TestCheckResourceAttr(resourceName, "security_attributes.%", "2"),
65+
66+
func(s *terraform.State) (err error) {
67+
resId, err = acctest.FromInstanceState(s, resourceName, "id")
68+
return err
69+
},
70+
),
71+
},
72+
73+
// verify update results in the removal of SA
74+
{
75+
Config: config + compartmentIdVariableStr + MysqlMysqlDbSystemResourceDependencies +
76+
acctest.GenerateResourceFromRepresentationMap("oci_mysql_mysql_db_system", "test_mysql_db_system", acctest.Optional, acctest.Update, mysqlDbSystemSecurityAttributes),
77+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
78+
resource.TestCheckResourceAttr(resourceName, "security_attributes.%", "0"),
79+
80+
func(s *terraform.State) (err error) {
81+
resId2, err = acctest.FromInstanceState(s, resourceName, "id")
82+
if resId != resId2 {
83+
return fmt.Errorf("Resource recreated when it was supposed to be updated.")
84+
}
85+
return err
86+
},
87+
),
88+
},
89+
})
90+
}

internal/integrationtest/mysql_mysql_db_system_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ var (
8282
"encrypt_data": acctest.RepresentationGroup{RepType: acctest.Optional, Group: MysqlMysqlDbSystemEncryptDataRepresentation},
8383
"lifecycle": acctest.RepresentationGroup{RepType: acctest.Required, Group: ignoreDefinedTagsChangesForMysqlRepBasic},
8484
"read_endpoint": acctest.RepresentationGroup{RepType: acctest.Optional, Group: MysqlMysqlDbSystemReadEndpointRepresentation},
85+
"security_attributes": acctest.Representation{RepType: acctest.Optional, Create: map[string]string{"oracle-zpr.sensitivity.value": "low", "oracle-zpr.sensitivity.mode": "enforce"}},
8586
}
8687

8788
ignoreDefinedTagsChangesForMysqlRepBasic = map[string]interface{}{
@@ -244,6 +245,7 @@ func TestMysqlMysqlDbSystemResource_basic(t *testing.T) {
244245
resource.TestCheckResourceAttr(resourceName, "rest.0.configuration", "DISABLED"),
245246
resource.TestCheckResourceAttr(resourceName, "secure_connections.#", "1"),
246247
resource.TestCheckResourceAttr(resourceName, "secure_connections.0.certificate_generation_type", "SYSTEM"),
248+
resource.TestCheckResourceAttr(resourceName, "security_attributes.%", "2"),
247249
resource.TestCheckResourceAttr(resourceName, "encrypt_data.#", "1"),
248250
resource.TestCheckResourceAttr(resourceName, "encrypt_data.0.key_generation_type", "SYSTEM"),
249251
resource.TestCheckResourceAttrSet(resourceName, "shape_name"),
@@ -310,6 +312,7 @@ func TestMysqlMysqlDbSystemResource_basic(t *testing.T) {
310312
resource.TestCheckResourceAttr(resourceName, "rest.0.configuration", "DISABLED"),
311313
resource.TestCheckResourceAttr(resourceName, "secure_connections.#", "1"),
312314
resource.TestCheckResourceAttr(resourceName, "secure_connections.0.certificate_generation_type", "SYSTEM"),
315+
resource.TestCheckResourceAttr(resourceName, "security_attributes.%", "2"),
313316
resource.TestCheckResourceAttr(resourceName, "encrypt_data.#", "1"),
314317
resource.TestCheckResourceAttr(resourceName, "encrypt_data.0.key_generation_type", "SYSTEM"),
315318
resource.TestCheckResourceAttrSet(resourceName, "shape_name"),
@@ -438,6 +441,7 @@ func TestMysqlMysqlDbSystemResource_basic(t *testing.T) {
438441
resource.TestCheckResourceAttr(singularDatasourceName, "secure_connections.0.certificate_generation_type", "SYSTEM"),
439442
resource.TestCheckResourceAttr(singularDatasourceName, "encrypt_data.#", "1"),
440443
resource.TestCheckResourceAttr(singularDatasourceName, "encrypt_data.0.key_generation_type", "SYSTEM"),
444+
resource.TestCheckResourceAttr(singularDatasourceName, "security_attributes.%", "2"),
441445
resource.TestCheckResourceAttr(singularDatasourceName, "source.#", "1"),
442446
resource.TestCheckResourceAttr(singularDatasourceName, "source.0.source_type", "NONE"),
443447
resource.TestCheckResourceAttrSet(singularDatasourceName, "state"),

internal/integrationtest/mysql_replica_test.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,9 @@ var (
6666
"configuration_id": acctest.Representation{RepType: acctest.Optional, Create: `${oci_mysql_mysql_db_system.test_mysql_db_system.configuration_id}`},
6767
// TODO: fix unsupported versions
6868
//"mysql_version": acctest.Representation{RepType: acctest.Optional, Create: `8.0.35`, Update: `8.1.0`},
69-
"nsg_ids": acctest.Representation{RepType: acctest.Optional, Create: []string{`${oci_core_network_security_group.test_network_security_group.id}`}},
70-
"shape_name": acctest.Representation{RepType: acctest.Optional, Create: `${oci_mysql_mysql_db_system.test_mysql_db_system.shape_name}`},
69+
"nsg_ids": acctest.Representation{RepType: acctest.Optional, Create: []string{`${oci_core_network_security_group.test_network_security_group.id}`}},
70+
"security_attributes": acctest.Representation{RepType: acctest.Optional, Create: map[string]string{"oracle-zpr.sensitivity.value": "low", "oracle-zpr.sensitivity.mode": "enforce"}},
71+
"shape_name": acctest.Representation{RepType: acctest.Optional, Create: `${oci_mysql_mysql_db_system.test_mysql_db_system.shape_name}`},
7172
}
7273

7374
ignoreDefinedTagsChangesForMysqlReplica = map[string]interface{}{
@@ -166,6 +167,7 @@ func TestMysqlReplicaResource_basic(t *testing.T) {
166167
resource.TestCheckResourceAttrSet(resourceName, "replica_overrides.0.configuration_id"),
167168
// TODO: fix unsupported versions
168169
//resource.TestCheckResourceAttr(resourceName, "replica_overrides.0.mysql_version", "8.0.35"),
170+
resource.TestCheckResourceAttr(resourceName, "replica_overrides.0.security_attributes.%", "2"),
169171
resource.TestCheckResourceAttrSet(resourceName, "replica_overrides.0.shape_name"),
170172
resource.TestCheckResourceAttrSet(resourceName, "state"),
171173
resource.TestCheckResourceAttrSet(resourceName, "time_created"),
@@ -204,6 +206,7 @@ func TestMysqlReplicaResource_basic(t *testing.T) {
204206
resource.TestCheckResourceAttrSet(resourceName, "replica_overrides.0.configuration_id"),
205207
// TODO: fix unsupported versions
206208
//resource.TestCheckResourceAttr(resourceName, "replica_overrides.0.mysql_version", "8.1.0"),
209+
resource.TestCheckResourceAttr(resourceName, "replica_overrides.0.security_attributes.%", "2"),
207210
resource.TestCheckResourceAttrSet(resourceName, "replica_overrides.0.shape_name"),
208211
resource.TestCheckResourceAttrSet(resourceName, "state"),
209212
resource.TestCheckResourceAttrSet(resourceName, "time_created"),
@@ -251,6 +254,7 @@ func TestMysqlReplicaResource_basic(t *testing.T) {
251254
resource.TestCheckResourceAttrSet(datasourceName, "replicas.0.replica_overrides.0.configuration_id"),
252255
// TODO: fix unsupported versions
253256
//resource.TestCheckResourceAttr(datasourceName, "replicas.0.replica_overrides.0.mysql_version", "8.1.0"),
257+
resource.TestCheckResourceAttr(datasourceName, "replicas.0.replica_overrides.0.security_attributes.%", "2"),
254258
resource.TestCheckResourceAttrSet(datasourceName, "replicas.0.replica_overrides.0.shape_name"),
255259
resource.TestCheckResourceAttrSet(datasourceName, "replicas.0.shape_name"),
256260
resource.TestCheckResourceAttrSet(datasourceName, "replicas.0.state"),
@@ -282,6 +286,7 @@ func TestMysqlReplicaResource_basic(t *testing.T) {
282286
resource.TestCheckResourceAttr(singularDatasourceName, "replica_overrides.#", "1"),
283287
// TODO: fix unsupported versions
284288
//resource.TestCheckResourceAttr(singularDatasourceName, "replica_overrides.0.mysql_version", "8.1.0"),
289+
resource.TestCheckResourceAttr(singularDatasourceName, "replica_overrides.0.security_attributes.%", "2"),
285290
resource.TestCheckResourceAttr(singularDatasourceName, "secure_connections.#", "1"),
286291
resource.TestCheckResourceAttrSet(singularDatasourceName, "shape_name"),
287292
resource.TestCheckResourceAttrSet(singularDatasourceName, "state"),

internal/service/mysql/mysql_mysql_backup_resource.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -597,6 +597,11 @@ func MysqlMysqlBackupResource() *schema.Resource {
597597
},
598598
},
599599
},
600+
"security_attributes": {
601+
Type: schema.TypeMap,
602+
Computed: true,
603+
Elem: schema.TypeString,
604+
},
600605
"shape_name": {
601606
Type: schema.TypeString,
602607
Computed: true,
@@ -1414,6 +1419,8 @@ func DbSystemSnapshotToMap(obj *oci_mysql.DbSystemSnapshot, datasource bool) map
14141419
result["secure_connections"] = []interface{}{SecureConnectionDetailsToMap(obj.SecureConnections)}
14151420
}
14161421

1422+
result["security_attributes"] = obj.SecurityAttributes
1423+
14171424
if obj.ShapeName != nil {
14181425
result["shape_name"] = string(*obj.ShapeName)
14191426
}

internal/service/mysql/mysql_mysql_db_system_data_source.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,10 @@ func (s *MysqlMysqlDbSystemDataSourceCrud) SetData() error {
226226
s.D.Set("secure_connections", nil)
227227
}
228228

229+
if s.Res.SecurityAttributes != nil {
230+
s.D.Set("security_attributes", tfresource.SecurityAttributesToMap(s.Res.SecurityAttributes))
231+
}
232+
229233
if s.Res.ShapeName != nil {
230234
s.D.Set("shape_name", *s.Res.ShapeName)
231235
}

internal/service/mysql/mysql_mysql_db_system_resource.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,12 @@ func MysqlMysqlDbSystemResource() *schema.Resource {
487487
},
488488
},
489489
},
490+
"security_attributes": {
491+
Type: schema.TypeMap,
492+
Optional: true,
493+
Computed: true,
494+
Elem: schema.TypeString,
495+
},
490496
"source": {
491497
Type: schema.TypeList,
492498
Optional: true,
@@ -1274,6 +1280,10 @@ func (s *MysqlMysqlDbSystemResourceCrud) Create() error {
12741280
}
12751281
}
12761282

1283+
if securityAttributes, ok := s.D.GetOkExists("security_attributes"); ok {
1284+
request.SecurityAttributes = tfresource.MapToSecurityAttributes(securityAttributes.(map[string]interface{}))
1285+
}
1286+
12771287
if shapeName, ok := s.D.GetOkExists("shape_name"); ok {
12781288
tmp := shapeName.(string)
12791289
request.ShapeName = &tmp
@@ -1510,6 +1520,10 @@ func (s *MysqlMysqlDbSystemResourceCrud) Update() error {
15101520
}
15111521
}
15121522

1523+
if securityAttributes, ok := s.D.GetOkExists("security_attributes"); ok && s.D.HasChange("security_attributes") {
1524+
request.SecurityAttributes = tfresource.MapToSecurityAttributes(securityAttributes.(map[string]interface{}))
1525+
}
1526+
15131527
if shapeName, ok := s.D.GetOkExists("shape_name"); ok && s.D.HasChange("shape_name") {
15141528
tmp := shapeName.(string)
15151529
request.ShapeName = &tmp
@@ -1702,6 +1716,8 @@ func (s *MysqlMysqlDbSystemResourceCrud) SetData() error {
17021716
s.D.Set("secure_connections", nil)
17031717
}
17041718

1719+
s.D.Set("security_attributes", tfresource.SecurityAttributesToMap(s.Res.SecurityAttributes))
1720+
17051721
if s.Res.ShapeName != nil {
17061722
s.D.Set("shape_name", *s.Res.ShapeName)
17071723
}

internal/service/mysql/mysql_replica_data_source.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,8 @@ func (s *MysqlReplicaDataSourceCrud) SetData() error {
145145
s.D.Set("secure_connections", nil)
146146
}
147147

148+
s.D.Set("security_attributes", tfresource.SecurityAttributesToMap(s.Res.SecurityAttributes))
149+
148150
if s.Res.ShapeName != nil {
149151
s.D.Set("shape_name", *s.Res.ShapeName)
150152
}

internal/service/mysql/mysql_replica_resource.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,12 @@ func MysqlReplicaResource() *schema.Resource {
9696
Type: schema.TypeString,
9797
},
9898
},
99+
"security_attributes": {
100+
Type: schema.TypeMap,
101+
Optional: true,
102+
Computed: true,
103+
Elem: schema.TypeString,
104+
},
99105
"shape_name": {
100106
Type: schema.TypeString,
101107
Optional: true,
@@ -194,6 +200,11 @@ func MysqlReplicaResource() *schema.Resource {
194200
},
195201
},
196202
},
203+
"security_attributes": {
204+
Type: schema.TypeMap,
205+
Computed: true,
206+
Elem: schema.TypeString,
207+
},
197208
"shape_name": {
198209
Type: schema.TypeString,
199210
Computed: true,
@@ -521,6 +532,8 @@ func (s *MysqlReplicaResourceCrud) SetData() error {
521532
s.D.Set("secure_connections", nil)
522533
}
523534

535+
s.D.Set("security_attributes", tfresource.SecurityAttributesToMap(s.Res.SecurityAttributes))
536+
524537
if s.Res.ShapeName != nil {
525538
s.D.Set("shape_name", *s.Res.ShapeName)
526539
}
@@ -567,6 +580,11 @@ func (s *MysqlReplicaResourceCrud) mapToReplicaOverrides(fieldKeyFormat string)
567580
}
568581
}
569582

583+
securityAttributesField := fmt.Sprintf(fieldKeyFormat, "security_attributes")
584+
if securityAttributes, ok := s.D.GetOkExists(securityAttributesField); ok && s.D.HasChange(securityAttributesField) {
585+
result.SecurityAttributes = tfresource.MapToSecurityAttributes(securityAttributes.(map[string]interface{}))
586+
}
587+
570588
shapeNameField := fmt.Sprintf(fieldKeyFormat, "shape_name")
571589
if shapeName, ok := s.D.GetOkExists(shapeNameField); ok && s.D.HasChange(shapeNameField) {
572590
tmp := shapeName.(string)
@@ -597,6 +615,10 @@ func ReplicaOverridesToMap(obj *oci_mysql.ReplicaOverrides, datasource bool) map
597615
result["nsg_ids"] = schema.NewSet(tfresource.LiteralTypeHashCodeForSets, nsgIds)
598616
}
599617

618+
if obj.SecurityAttributes != nil {
619+
result["security_attributes"] = tfresource.SecurityAttributesToMap(obj.SecurityAttributes)
620+
}
621+
600622
if obj.ShapeName != nil {
601623
result["shape_name"] = string(*obj.ShapeName)
602624
}

0 commit comments

Comments
 (0)