Skip to content

Commit 733034c

Browse files
Pedro Correiasahilg11
authored andcommitted
Added - MySQL service - Add ability to Disable Crash Recovery
1 parent 33e91e2 commit 733034c

17 files changed

+176
-3
lines changed

examples/mysql/main.tf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ resource "oci_mysql_mysql_db_system" "test_mysql_db_system" {
9393
backup_id = oci_mysql_mysql_backup.test_mysql_backup.id
9494
source_type = "BACKUP"
9595
}
96+
97+
crash_recovery = "ENABLED"
9698
}
9799

98100
data "oci_mysql_mysql_configurations" "test_mysql_configurations" {

internal/integrationtest/mysql_channel_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ var (
5353
"display_name": acctest.Representation{RepType: acctest.Optional, Create: `displayName`, Update: `displayName2`},
5454
"freeform_tags": acctest.Representation{RepType: acctest.Optional, Create: map[string]string{"bar-key": "value"}, Update: map[string]string{"Department": "Accounting"}},
5555
"is_enabled": acctest.Representation{RepType: acctest.Optional, Create: `true`, Update: `false`},
56+
"lifecycle": acctest.RepresentationGroup{RepType: acctest.Required, Group: ignoreDefinedTagsChangesForMysqlChannel},
57+
}
58+
59+
ignoreDefinedTagsChangesForMysqlChannel = map[string]interface{}{
60+
"ignore_changes": acctest.Representation{RepType: acctest.Required, Create: []string{"defined_tags"}},
5661
}
5762

5863
sslCaCertificateRepresentation = map[string]interface{}{

internal/integrationtest/mysql_mysql_backup_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ var (
5757
"display_name": acctest.Representation{RepType: acctest.Optional, Create: `displayName`, Update: `displayName2`},
5858
"freeform_tags": acctest.Representation{RepType: acctest.Optional, Create: map[string]string{"Department": "Finance"}, Update: map[string]string{"Department": "Accounting"}},
5959
"retention_in_days": acctest.Representation{RepType: acctest.Optional, Create: `10`, Update: `11`},
60+
"lifecycle": acctest.RepresentationGroup{RepType: acctest.Required, Group: ignoreDefinedTagsChangesForMysqlBackup},
61+
}
62+
63+
ignoreDefinedTagsChangesForMysqlBackup = map[string]interface{}{
64+
"ignore_changes": acctest.Representation{RepType: acctest.Required, Create: []string{"defined_tags"}},
6065
}
6166

6267
MysqlBackupResourceDependencies = acctest.GenerateResourceFromRepresentationMap("oci_core_subnet", "test_subnet", acctest.Required, acctest.Create, subnetRepresentation) +

internal/integrationtest/mysql_mysql_db_system_resource_test.go

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ var (
4040
"maintenance": acctest.RepresentationGroup{RepType: acctest.Optional, Group: mysqlDbSystemMaintenanceRepresentation},
4141
"port": acctest.Representation{RepType: acctest.Optional, Create: `3306`},
4242
"port_x": acctest.Representation{RepType: acctest.Optional, Create: `33306`},
43+
"lifecycle": acctest.RepresentationGroup{RepType: acctest.Required, Group: ignoreDefinedTagsChangesForMysqlRep},
44+
}
45+
46+
ignoreDefinedTagsChangesForMysqlRep = map[string]interface{}{
47+
"ignore_changes": acctest.Representation{RepType: acctest.Required, Create: []string{"defined_tags"}},
4348
}
4449

4550
MysqlDbSystemSourceBackupResourceDependencies = MysqlDbSystemResourceDependencies + utils.MysqlHAConfigurationIdVariable +
@@ -272,3 +277,106 @@ func TestMysqlMysqlDbSystemResource_HA(t *testing.T) {
272277
},
273278
})
274279
}
280+
281+
// issue-routing-tag: mysql/default
282+
func TestMysqlMysqlDbSystemResource_crashRecovery(t *testing.T) {
283+
httpreplay.SetScenario("TestMysqlMysqlDbSystemResource_crashRecovery")
284+
defer httpreplay.SaveScenario()
285+
286+
config := acctest.ProviderTestConfig()
287+
288+
compartmentId := utils.GetEnvSettingWithBlankDefault("compartment_ocid")
289+
compartmentIdVariableStr := fmt.Sprintf("variable \"compartment_id\" { default = \"%s\" }\n", compartmentId)
290+
291+
resourceName := "oci_mysql_mysql_db_system.test_mysql_db_system"
292+
293+
var resId, resId2 string
294+
295+
updatedRepresentation := acctest.GetUpdatedRepresentationCopy("crash_recovery", acctest.Representation{RepType: acctest.Optional, Create: `ENABLED`, Update: `DISABLED`},
296+
acctest.RepresentationCopyWithNewProperties(mysqlDbSystemRepresentation, map[string]interface{}{
297+
"backup_policy": acctest.RepresentationGroup{RepType: acctest.Optional, Group: mysqlDbSystemBackupPolicyNotUpdateableRepresentation},
298+
}))
299+
300+
acctest.ResourceTest(t, nil, []resource.TestStep{
301+
// verify Create with optionals
302+
{
303+
Config: config + compartmentIdVariableStr + MysqlDbSystemSourceBackupResourceDependencies +
304+
acctest.GenerateResourceFromRepresentationMap("oci_mysql_mysql_db_system", "test_mysql_db_system", acctest.Optional, acctest.Create, updatedRepresentation),
305+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
306+
resource.TestCheckResourceAttr(resourceName, "admin_password", "BEstrO0ng_#11"),
307+
resource.TestCheckResourceAttr(resourceName, "admin_username", "adminUser"),
308+
resource.TestCheckResourceAttrSet(resourceName, "availability_domain"),
309+
resource.TestCheckResourceAttr(resourceName, "backup_policy.#", "1"),
310+
resource.TestCheckResourceAttr(resourceName, "backup_policy.0.freeform_tags.%", "1"),
311+
resource.TestCheckResourceAttr(resourceName, "backup_policy.0.is_enabled", "false"),
312+
resource.TestCheckResourceAttr(resourceName, "backup_policy.0.retention_in_days", "10"),
313+
resource.TestCheckResourceAttr(resourceName, "backup_policy.0.window_start_time", "01:00-00:00"),
314+
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
315+
resource.TestCheckResourceAttrSet(resourceName, "configuration_id"),
316+
resource.TestCheckResourceAttr(resourceName, "crash_recovery", "ENABLED"),
317+
resource.TestCheckResourceAttr(resourceName, "description", "MySQL Database Service"),
318+
resource.TestCheckResourceAttr(resourceName, "display_name", "DBSystem001"),
319+
resource.TestCheckResourceAttr(resourceName, "fault_domain", "FAULT-DOMAIN-1"),
320+
resource.TestCheckResourceAttr(resourceName, "freeform_tags.%", "1"),
321+
resource.TestCheckResourceAttr(resourceName, "hostname_label", "hostnameLabel"),
322+
resource.TestCheckResourceAttrSet(resourceName, "id"),
323+
resource.TestCheckResourceAttr(resourceName, "ip_address", "10.0.0.3"),
324+
resource.TestCheckResourceAttr(resourceName, "maintenance.#", "1"),
325+
resource.TestCheckResourceAttr(resourceName, "maintenance.0.window_start_time", "sun 01:00"),
326+
resource.TestCheckResourceAttr(resourceName, "port", "3306"),
327+
resource.TestCheckResourceAttr(resourceName, "port_x", "33306"),
328+
resource.TestCheckResourceAttrSet(resourceName, "shape_name"),
329+
resource.TestCheckResourceAttrSet(resourceName, "state"),
330+
resource.TestCheckResourceAttrSet(resourceName, "subnet_id"),
331+
resource.TestCheckResourceAttrSet(resourceName, "time_created"),
332+
resource.TestCheckResourceAttrSet(resourceName, "time_updated"),
333+
334+
func(s *terraform.State) (err error) {
335+
resId, err = acctest.FromInstanceState(s, resourceName, "id")
336+
return err
337+
},
338+
),
339+
},
340+
341+
// verify updates to updatable parameters
342+
{
343+
Config: config + compartmentIdVariableStr + MysqlDbSystemSourceBackupResourceDependencies +
344+
acctest.GenerateResourceFromRepresentationMap("oci_mysql_mysql_db_system", "test_mysql_db_system", acctest.Optional, acctest.Update, updatedRepresentation),
345+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
346+
resource.TestCheckResourceAttr(resourceName, "admin_password", "BEstrO0ng_#11"),
347+
resource.TestCheckResourceAttr(resourceName, "admin_username", "adminUser"),
348+
resource.TestCheckResourceAttr(resourceName, "backup_policy.#", "1"),
349+
resource.TestCheckResourceAttr(resourceName, "backup_policy.0.freeform_tags.%", "1"),
350+
resource.TestCheckResourceAttr(resourceName, "backup_policy.0.is_enabled", "false"),
351+
resource.TestCheckResourceAttr(resourceName, "backup_policy.0.retention_in_days", "10"),
352+
resource.TestCheckResourceAttr(resourceName, "backup_policy.0.window_start_time", "01:00-00:00"),
353+
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
354+
resource.TestCheckResourceAttrSet(resourceName, "configuration_id"),
355+
resource.TestCheckResourceAttr(resourceName, "crash_recovery", "DISABLED"),
356+
resource.TestCheckResourceAttr(resourceName, "description", "description2"),
357+
resource.TestCheckResourceAttr(resourceName, "display_name", "displayName2"),
358+
resource.TestCheckResourceAttr(resourceName, "freeform_tags.%", "1"),
359+
resource.TestCheckResourceAttr(resourceName, "hostname_label", "hostnameLabel"),
360+
resource.TestCheckResourceAttrSet(resourceName, "id"),
361+
resource.TestCheckResourceAttr(resourceName, "ip_address", "10.0.0.3"),
362+
resource.TestCheckResourceAttr(resourceName, "maintenance.#", "1"),
363+
resource.TestCheckResourceAttr(resourceName, "maintenance.0.window_start_time", "sun 01:00"),
364+
resource.TestCheckResourceAttr(resourceName, "port", "3306"),
365+
resource.TestCheckResourceAttr(resourceName, "port_x", "33306"),
366+
resource.TestCheckResourceAttrSet(resourceName, "shape_name"),
367+
resource.TestCheckResourceAttrSet(resourceName, "state"),
368+
resource.TestCheckResourceAttrSet(resourceName, "subnet_id"),
369+
resource.TestCheckResourceAttrSet(resourceName, "time_created"),
370+
resource.TestCheckResourceAttrSet(resourceName, "time_updated"),
371+
372+
func(s *terraform.State) (err error) {
373+
resId2, err = acctest.FromInstanceState(s, resourceName, "id")
374+
if resId != resId2 {
375+
return fmt.Errorf("Resource recreated when it was supposed to be updated.")
376+
}
377+
return err
378+
},
379+
),
380+
},
381+
})
382+
}

internal/integrationtest/mysql_mysql_db_system_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ var (
5959
"shape_name": acctest.Representation{RepType: acctest.Required, Create: `VM.Standard.E2.2`},
6060
"subnet_id": acctest.Representation{RepType: acctest.Required, Create: `${oci_core_subnet.test_subnet.id}`},
6161
"backup_policy": acctest.RepresentationGroup{RepType: acctest.Optional, Group: mysqlDbSystemBackupPolicyRepresentation},
62+
"crash_recovery": acctest.Representation{RepType: acctest.Optional, Create: `ENABLED`},
6263
"data_storage_size_in_gb": acctest.Representation{RepType: acctest.Required, Create: `50`},
6364
"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")}`},
6465
"description": acctest.Representation{RepType: acctest.Optional, Create: `MySQL Database Service`, Update: `description2`},
@@ -71,14 +72,29 @@ var (
7172
"maintenance": acctest.RepresentationGroup{RepType: acctest.Optional, Group: mysqlDbSystemMaintenanceRepresentation},
7273
"port": acctest.Representation{RepType: acctest.Optional, Create: `3306`},
7374
"port_x": acctest.Representation{RepType: acctest.Optional, Create: `33306`},
75+
"lifecycle": acctest.RepresentationGroup{RepType: acctest.Required, Group: ignoreDefinedTagsChangesForMysqlRepBasic},
7476
}
77+
78+
ignoreDefinedTagsChangesForMysqlRepBasic = map[string]interface{}{
79+
"ignore_changes": acctest.Representation{RepType: acctest.Required, Create: []string{"defined_tags", "backup_policy[0].defined_tags"}},
80+
}
81+
7582
mysqlDbSystemBackupPolicyRepresentation = map[string]interface{}{
7683
"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")}`},
7784
"freeform_tags": acctest.Representation{RepType: acctest.Optional, Create: map[string]string{"Department": "Finance"}, Update: map[string]string{"Department": "Accounting"}},
7885
"is_enabled": acctest.Representation{RepType: acctest.Optional, Create: `false`, Update: `true`},
7986
"retention_in_days": acctest.Representation{RepType: acctest.Optional, Create: `10`, Update: `11`},
8087
"window_start_time": acctest.Representation{RepType: acctest.Optional, Create: `01:00-00:00`, Update: `02:00-00:00`},
8188
}
89+
90+
mysqlDbSystemBackupPolicyNotUpdateableRepresentation = map[string]interface{}{
91+
"defined_tags": acctest.Representation{RepType: acctest.Optional, Create: `${map("${oci_identity_tag_namespace.tag-namespace1.name}.${oci_identity_tag.tag1.name}", "value")}`},
92+
"freeform_tags": acctest.Representation{RepType: acctest.Optional, Create: map[string]string{"Department": "Finance"}},
93+
"is_enabled": acctest.Representation{RepType: acctest.Optional, Create: `false`},
94+
"retention_in_days": acctest.Representation{RepType: acctest.Optional, Create: `10`},
95+
"window_start_time": acctest.Representation{RepType: acctest.Optional, Create: `01:00-00:00`},
96+
}
97+
8298
mysqlDbSystemMaintenanceRepresentation = map[string]interface{}{
8399
"window_start_time": acctest.Representation{RepType: acctest.Required, Create: `sun 01:00`},
84100
}
@@ -151,6 +167,7 @@ func TestMysqlMysqlDbSystemResource_basic(t *testing.T) {
151167
resource.TestCheckResourceAttr(resourceName, "backup_policy.0.window_start_time", "01:00-00:00"),
152168
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
153169
resource.TestCheckResourceAttrSet(resourceName, "configuration_id"),
170+
resource.TestCheckResourceAttr(resourceName, "crash_recovery", "ENABLED"),
154171
resource.TestCheckResourceAttr(resourceName, "data_storage_size_in_gb", "50"),
155172
resource.TestCheckResourceAttr(resourceName, "description", "MySQL Database Service"),
156173
resource.TestCheckResourceAttr(resourceName, "display_name", "DBSystem001"),
@@ -200,6 +217,7 @@ func TestMysqlMysqlDbSystemResource_basic(t *testing.T) {
200217
resource.TestCheckResourceAttr(resourceName, "backup_policy.0.window_start_time", "02:00-00:00"),
201218
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
202219
resource.TestCheckResourceAttrSet(resourceName, "configuration_id"),
220+
resource.TestCheckResourceAttr(resourceName, "crash_recovery", "ENABLED"),
203221
resource.TestCheckResourceAttr(resourceName, "data_storage_size_in_gb", "50"),
204222
resource.TestCheckResourceAttr(resourceName, "description", "description2"),
205223
resource.TestCheckResourceAttr(resourceName, "display_name", "displayName2"),
@@ -251,6 +269,7 @@ func TestMysqlMysqlDbSystemResource_basic(t *testing.T) {
251269
resource.TestCheckResourceAttr(datasourceName, "db_systems.0.analytics_cluster.#", "1"),
252270
resource.TestCheckResourceAttrSet(datasourceName, "db_systems.0.availability_domain"),
253271
resource.TestCheckResourceAttr(datasourceName, "db_systems.0.compartment_id", compartmentId),
272+
resource.TestCheckResourceAttr(datasourceName, "db_systems.0.crash_recovery", "ENABLED"),
254273
resource.TestCheckResourceAttr(datasourceName, "db_systems.0.current_placement.#", "1"),
255274
resource.TestCheckResourceAttr(datasourceName, "db_systems.0.description", "description2"),
256275
resource.TestCheckResourceAttr(datasourceName, "db_systems.0.display_name", "displayName2"),
@@ -286,6 +305,7 @@ func TestMysqlMysqlDbSystemResource_basic(t *testing.T) {
286305
resource.TestCheckResourceAttr(singularDatasourceName, "backup_policy.0.window_start_time", "02:00-00:00"),
287306
resource.TestCheckResourceAttr(singularDatasourceName, "channels.#", "1"),
288307
resource.TestCheckResourceAttr(singularDatasourceName, "compartment_id", compartmentId),
308+
resource.TestCheckResourceAttr(singularDatasourceName, "crash_recovery", "ENABLED"),
289309
resource.TestCheckResourceAttr(singularDatasourceName, "current_placement.#", "1"),
290310
resource.TestCheckResourceAttr(singularDatasourceName, "data_storage_size_in_gb", "50"),
291311
resource.TestCheckResourceAttr(singularDatasourceName, "description", "description2"),

internal/integrationtest/mysql_shape_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ var (
1919
"compartment_id": acctest.Representation{RepType: acctest.Required, Create: `${var.compartment_id}`},
2020
"availability_domain": acctest.Representation{RepType: acctest.Optional, Create: `${data.oci_identity_availability_domains.test_availability_domains.availability_domains.0.name}`},
2121
"is_supported_for": acctest.Representation{RepType: acctest.Optional, Create: []string{`DBSYSTEM`}},
22-
"name": acctest.Representation{RepType: acctest.Optional, Create: `name`},
22+
"name": acctest.Representation{RepType: acctest.Optional, Create: `VM.Standard.E2.2`},
2323
}
2424

2525
MySQLShapeResourceConfig = AvailabilityDomainConfig
@@ -63,7 +63,7 @@ func TestMysqlShapeResource_basic(t *testing.T) {
6363
resource.TestCheckResourceAttrSet(datasourceName, "availability_domain"),
6464
resource.TestCheckResourceAttr(datasourceName, "compartment_id", compartmentId),
6565
resource.TestCheckResourceAttr(datasourceName, "is_supported_for.#", "1"),
66-
resource.TestCheckResourceAttr(datasourceName, "name", "name"),
66+
resource.TestCheckResourceAttr(datasourceName, "name", "VM.Standard.E2.2"),
6767

6868
resource.TestCheckResourceAttrSet(datasourceName, "shapes.#"),
6969
resource.TestCheckResourceAttrSet(datasourceName, "shapes.0.cpu_core_count"),

internal/service/mysql/mysql_mysql_backup_resource.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,10 @@ func MysqlMysqlBackupResource() *schema.Resource {
153153
Type: schema.TypeString,
154154
Computed: true,
155155
},
156+
"crash_recovery": {
157+
Type: schema.TypeString,
158+
Computed: true,
159+
},
156160
"data_storage_size_in_gb": {
157161
Type: schema.TypeInt,
158162
Computed: true,
@@ -667,6 +671,8 @@ func DbSystemSnapshotToMap(obj *oci_mysql.DbSystemSnapshot) map[string]interface
667671
result["configuration_id"] = string(*obj.ConfigurationId)
668672
}
669673

674+
result["crash_recovery"] = string(obj.CrashRecovery)
675+
670676
if obj.DataStorageSizeInGBs != nil {
671677
result["data_storage_size_in_gb"] = int(*obj.DataStorageSizeInGBs)
672678
}

internal/service/mysql/mysql_mysql_db_system_data_source.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ func (s *MysqlMysqlDbSystemDataSourceCrud) SetData() error {
9696
s.D.Set("configuration_id", *s.Res.ConfigurationId)
9797
}
9898

99+
s.D.Set("crash_recovery", s.Res.CrashRecovery)
100+
99101
if s.Res.CurrentPlacement != nil {
100102
s.D.Set("current_placement", []interface{}{DbSystemPlacementToMap(s.Res.CurrentPlacement)})
101103
} else {

internal/service/mysql/mysql_mysql_db_system_resource.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,11 @@ func MysqlMysqlDbSystemResource() *schema.Resource {
119119
Computed: true,
120120
ForceNew: true,
121121
},
122+
"crash_recovery": {
123+
Type: schema.TypeString,
124+
Optional: true,
125+
Computed: true,
126+
},
122127
"data_storage_size_in_gb": {
123128
Type: schema.TypeInt,
124129
Optional: true,
@@ -741,6 +746,10 @@ func (s *MysqlMysqlDbSystemResourceCrud) Create() error {
741746
request.ConfigurationId = &tmp
742747
}
743748

749+
if crashRecovery, ok := s.D.GetOkExists("crash_recovery"); ok {
750+
request.CrashRecovery = oci_mysql.CrashRecoveryStatusEnum(crashRecovery.(string))
751+
}
752+
744753
if dataStorageSizeInGB, ok := s.D.GetOkExists("data_storage_size_in_gb"); ok {
745754
tmp := dataStorageSizeInGB.(int)
746755
request.DataStorageSizeInGBs = &tmp
@@ -877,6 +886,10 @@ func (s *MysqlMysqlDbSystemResourceCrud) Update() error {
877886
}
878887
}
879888

889+
if crashRecovery, ok := s.D.GetOkExists("crash_recovery"); ok && s.D.HasChange("crash_recovery") {
890+
request.CrashRecovery = oci_mysql.CrashRecoveryStatusEnum(crashRecovery.(string))
891+
}
892+
880893
tmp := s.D.Id()
881894
request.DbSystemId = &tmp
882895

@@ -966,6 +979,8 @@ func (s *MysqlMysqlDbSystemResourceCrud) SetData() error {
966979
s.D.Set("configuration_id", *s.Res.ConfigurationId)
967980
}
968981

982+
s.D.Set("crash_recovery", s.Res.CrashRecovery)
983+
969984
if s.Res.CurrentPlacement != nil {
970985
s.D.Set("current_placement", []interface{}{DbSystemPlacementToMap(s.Res.CurrentPlacement)})
971986
} else {

internal/service/mysql/mysql_mysql_db_systems_data_source.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,8 @@ func (s *MysqlMysqlDbSystemsDataSourceCrud) SetData() error {
165165
mysqlDbSystem["availability_domain"] = *r.AvailabilityDomain
166166
}
167167

168+
mysqlDbSystem["crash_recovery"] = r.CrashRecovery
169+
168170
if r.CurrentPlacement != nil {
169171
mysqlDbSystem["current_placement"] = []interface{}{DbSystemPlacementToMap(r.CurrentPlacement)}
170172
} else {

0 commit comments

Comments
 (0)