Skip to content

Commit d2a008f

Browse files
Sonali PurdhaniNagaRajuPasunuri
authored andcommitted
Added - Support for Resource Usage Tracking Enhancement | ADB-C@C
1 parent 2e8b66c commit d2a008f

23 files changed

+1083
-80
lines changed

examples/database/exadata_cc/adbd/acd.tf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,9 @@ resource "oci_database_autonomous_container_database" "autonomous_container_data
2525
patch_model = "RELEASE_UPDATES"
2626
service_level_agreement_type = "STANDARD"
2727
version_preference = "LATEST_RELEASE_UPDATE"
28+
}
29+
30+
data "oci_database_autonomous_container_database_resource_usage" "test_autonomous_container_database_resource_usages" {
31+
#Required
32+
autonomous_container_database_id = oci_database_autonomous_container_database.autonomous_container_database.id
2833
}

examples/database/exadata_cc/adbd/datasources.tf

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,17 @@ data "oci_database_autonomous_virtual_machines" "test_autonomous_virtual_machine
2323

2424
#Optional
2525
state = var.autonomous_virtual_machine_state
26+
}
27+
28+
data "oci_database_autonomous_vm_cluster_acd_resource_usages" "test_autonomous_vm_cluster_acd_resource_usages" {
29+
#Required
30+
autonomous_vm_cluster_id = oci_database_autonomous_vm_cluster.test_autonomous_vm_cluster.id
31+
32+
#Optional
33+
compartment_id = var.compartment_ocid
34+
}
35+
36+
data "oci_database_autonomous_vm_cluster_resource_usage" "test_autonomous_vm_cluster_resource_usages" {
37+
#Required
38+
autonomous_vm_cluster_id = oci_database_autonomous_vm_cluster.test_autonomous_vm_cluster.id
2639
}

internal/integrationtest/database_autonomous_container_database_resource_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ var (
5454
}
5555

5656
autonomousContainerDatabaseBackupConfigBackupDestinationDetailsRepresentation = map[string]interface{}{
57-
"type": acctest.Representation{RepType: acctest.Required, Create: `RECOVERY_APPLIANCE`},
57+
"type": acctest.Representation{RepType: acctest.Required, Create: `NFS`},
5858
"id": acctest.Representation{RepType: acctest.Optional, Create: `${oci_database_backup_destination.test_backup_destination.id}`},
5959
"internet_proxy": acctest.Representation{RepType: acctest.Optional, Create: `internetProxy`},
6060
"vpc_password": acctest.Representation{RepType: acctest.Optional, Create: `vpcPassword`, Update: `vpcPassword2`},
@@ -77,7 +77,7 @@ var (
7777

7878
ExaccDatabaseAutonomousContainerDatabaseResourceDependencies = DatabaseAutonomousVmClusterRequiredOnlyResource +
7979
KeyResourceDependencyConfig + kmsKeyIdCreateVariableStr + kmsKeyIdUpdateVariableStr +
80-
acctest.GenerateResourceFromRepresentationMap("oci_database_backup_destination", "test_backup_destination", acctest.Optional, acctest.Create, DatabaseBackupDestinationRepresentation) +
80+
acctest.GenerateResourceFromRepresentationMap("oci_database_backup_destination", "test_backup_destination", acctest.Optional, acctest.Create, backupDestinationADBCCNFSRepresentation) +
8181
OkvSecretVariableStr +
8282
acctest.GenerateResourceFromRepresentationMap("oci_database_key_store", "test_key_store", acctest.Optional, acctest.Create, DatabaseKeyStoreRepresentation)
8383
)
@@ -111,7 +111,7 @@ func TestDatabaseExaccAutonomousContainerDatabase_basic(t *testing.T) {
111111
resource.TestCheckResourceAttr(resourceName, "backup_config.0.backup_destination_details.#", "1"),
112112
resource.TestCheckResourceAttrSet(resourceName, "backup_config.0.backup_destination_details.0.id"),
113113
resource.TestCheckResourceAttr(resourceName, "backup_config.0.backup_destination_details.0.internet_proxy", "internetProxy"),
114-
resource.TestCheckResourceAttr(resourceName, "backup_config.0.backup_destination_details.0.type", "RECOVERY_APPLIANCE"),
114+
resource.TestCheckResourceAttr(resourceName, "backup_config.0.backup_destination_details.0.type", "NFS"),
115115
resource.TestCheckResourceAttr(resourceName, "backup_config.0.backup_destination_details.0.vpc_user", "bkupUser1"),
116116
resource.TestCheckResourceAttr(resourceName, "backup_config.0.backup_destination_details.0.vpc_password", "vpcPassword"),
117117
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
@@ -158,7 +158,7 @@ func TestDatabaseExaccAutonomousContainerDatabase_basic(t *testing.T) {
158158
resource.TestCheckResourceAttr(resourceName, "backup_config.0.recovery_window_in_days", "11"),
159159
resource.TestCheckResourceAttrSet(resourceName, "backup_config.0.backup_destination_details.0.id"),
160160
resource.TestCheckResourceAttr(resourceName, "backup_config.0.backup_destination_details.0.internet_proxy", "internetProxy"),
161-
resource.TestCheckResourceAttr(resourceName, "backup_config.0.backup_destination_details.0.type", "RECOVERY_APPLIANCE"),
161+
resource.TestCheckResourceAttr(resourceName, "backup_config.0.backup_destination_details.0.type", "NFS"),
162162
resource.TestCheckResourceAttr(resourceName, "backup_config.0.backup_destination_details.0.vpc_user", "bkupUser1"),
163163
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
164164
resource.TestCheckResourceAttr(resourceName, "db_unique_name", acbDBName),
@@ -208,7 +208,7 @@ func TestDatabaseExaccAutonomousContainerDatabase_basic(t *testing.T) {
208208
resource.TestCheckResourceAttr(datasourceName, "autonomous_container_databases.0.backup_config.0.recovery_window_in_days", "11"),
209209
resource.TestCheckResourceAttrSet(datasourceName, "autonomous_container_databases.0.backup_config.0.backup_destination_details.0.id"),
210210
resource.TestCheckResourceAttr(datasourceName, "autonomous_container_databases.0.backup_config.0.backup_destination_details.0.internet_proxy", "internetProxy"),
211-
resource.TestCheckResourceAttr(datasourceName, "autonomous_container_databases.0.backup_config.0.backup_destination_details.0.type", "RECOVERY_APPLIANCE"),
211+
resource.TestCheckResourceAttr(datasourceName, "autonomous_container_databases.0.backup_config.0.backup_destination_details.0.type", "NFS"),
212212
resource.TestCheckResourceAttr(datasourceName, "autonomous_container_databases.0.backup_config.0.backup_destination_details.0.vpc_user", "bkupUser1"),
213213
resource.TestCheckResourceAttr(datasourceName, "autonomous_container_databases.0.compartment_id", compartmentId),
214214
resource.TestCheckResourceAttr(datasourceName, "autonomous_container_databases.0.display_name", "containerdatabases2"),
@@ -244,7 +244,7 @@ func TestDatabaseExaccAutonomousContainerDatabase_basic(t *testing.T) {
244244
resource.TestCheckResourceAttr(singularDatasourceName, "backup_config.0.recovery_window_in_days", "11"),
245245
resource.TestCheckResourceAttrSet(singularDatasourceName, "backup_config.0.backup_destination_details.0.id"),
246246
resource.TestCheckResourceAttr(singularDatasourceName, "backup_config.0.backup_destination_details.0.internet_proxy", "internetProxy"),
247-
resource.TestCheckResourceAttr(singularDatasourceName, "backup_config.0.backup_destination_details.0.type", "RECOVERY_APPLIANCE"),
247+
resource.TestCheckResourceAttr(singularDatasourceName, "backup_config.0.backup_destination_details.0.type", "NFS"),
248248
resource.TestCheckResourceAttr(singularDatasourceName, "backup_config.0.backup_destination_details.0.vpc_user", "bkupUser1"),
249249
resource.TestCheckResourceAttr(singularDatasourceName, "compartment_id", compartmentId),
250250
resource.TestCheckResourceAttr(singularDatasourceName, "display_name", "containerdatabases2"),
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
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/hashicorp/terraform-plugin-sdk/v2/helper/resource"
11+
12+
"github.com/oracle/terraform-provider-oci/httpreplay"
13+
"github.com/oracle/terraform-provider-oci/internal/acctest"
14+
15+
"github.com/oracle/terraform-provider-oci/internal/utils"
16+
)
17+
18+
var (
19+
DatabaseAutonomousVmClusterAcdResourceUsageDataSourceRepresentation = map[string]interface{}{
20+
"autonomous_vm_cluster_id": acctest.Representation{RepType: acctest.Required, Create: `${oci_database_autonomous_vm_cluster.test_autonomous_vm_cluster.id}`},
21+
"compartment_id": acctest.Representation{RepType: acctest.Optional, Create: `${var.compartment_id}`},
22+
}
23+
)
24+
25+
// issue-routing-tag: database/ExaCC
26+
func TestDatabaseAutonomousVmClusterAcdResourceUsageResource_basic(t *testing.T) {
27+
httpreplay.SetScenario("TestDatabaseAutonomousVmClusterAcdResourceUsageResource_basic")
28+
defer httpreplay.SaveScenario()
29+
30+
config := acctest.ProviderTestConfig()
31+
32+
compartmentId := utils.GetEnvSettingWithBlankDefault("compartment_ocid")
33+
compartmentIdVariableStr := fmt.Sprintf("variable \"compartment_id\" { default = \"%s\" }\n", compartmentId)
34+
35+
datasourceName := "data.oci_database_autonomous_vm_cluster_acd_resource_usages.test_autonomous_vm_cluster_acd_resource_usages"
36+
37+
acctest.SaveConfigContent("", "", "", t)
38+
39+
acctest.ResourceTest(t, nil, []resource.TestStep{
40+
{
41+
Config: config + compartmentIdVariableStr + ExaccDatabaseAutonomousContainerDatabaseResourceDependencies + ExaccAcdResourceConfig,
42+
},
43+
// verify datasource
44+
{
45+
Config: config +
46+
acctest.GenerateDataSourceFromRepresentationMap("oci_database_autonomous_vm_cluster_acd_resource_usages", "test_autonomous_vm_cluster_acd_resource_usages", acctest.Required, acctest.Create, DatabaseAutonomousVmClusterAcdResourceUsageDataSourceRepresentation) +
47+
compartmentIdVariableStr + ExaccDatabaseAutonomousContainerDatabaseResourceDependencies + ExaccAcdResourceConfig,
48+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
49+
resource.TestCheckResourceAttrSet(datasourceName, "autonomous_vm_cluster_id"),
50+
//resource.TestCheckResourceAttr(datasourceName, "compartment_id", compartmentId),
51+
52+
resource.TestCheckResourceAttrSet(datasourceName, "autonomous_container_database_resource_usages.#"),
53+
resource.TestCheckResourceAttr(datasourceName, "autonomous_container_database_resource_usages.0.autonomous_container_database_vm_usage.#", "2"),
54+
resource.TestCheckResourceAttrSet(datasourceName, "autonomous_container_database_resource_usages.0.available_cpus"),
55+
resource.TestCheckResourceAttrSet(datasourceName, "autonomous_container_database_resource_usages.0.display_name"),
56+
resource.TestCheckResourceAttrSet(datasourceName, "autonomous_container_database_resource_usages.0.id"),
57+
resource.TestCheckResourceAttrSet(datasourceName, "autonomous_container_database_resource_usages.0.largest_provisionable_autonomous_database_in_cpus"),
58+
resource.TestCheckResourceAttr(datasourceName, "autonomous_container_database_resource_usages.0.provisionable_cpus.#", "29"),
59+
resource.TestCheckResourceAttrSet(datasourceName, "autonomous_container_database_resource_usages.0.provisioned_cpus"),
60+
resource.TestCheckResourceAttrSet(datasourceName, "autonomous_container_database_resource_usages.0.reclaimable_cpus"),
61+
resource.TestCheckResourceAttrSet(datasourceName, "autonomous_container_database_resource_usages.0.reserved_cpus"),
62+
resource.TestCheckResourceAttrSet(datasourceName, "autonomous_container_database_resource_usages.0.used_cpus"),
63+
),
64+
},
65+
})
66+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
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/hashicorp/terraform-plugin-sdk/v2/helper/resource"
11+
12+
"github.com/oracle/terraform-provider-oci/httpreplay"
13+
"github.com/oracle/terraform-provider-oci/internal/acctest"
14+
15+
"github.com/oracle/terraform-provider-oci/internal/utils"
16+
)
17+
18+
var (
19+
DatabaseAutonomousVmClusterResourceUsageSingularDataSourceRepresentation = map[string]interface{}{
20+
"autonomous_vm_cluster_id": acctest.Representation{RepType: acctest.Required, Create: `${oci_database_autonomous_vm_cluster.test_autonomous_vm_cluster.id}`},
21+
}
22+
)
23+
24+
// issue-routing-tag: database/ExaCC
25+
func TestDatabaseAutonomousVmClusterResourceUsageResource_basic(t *testing.T) {
26+
httpreplay.SetScenario("TestDatabaseAutonomousVmClusterResourceUsageResource_basic")
27+
defer httpreplay.SaveScenario()
28+
29+
config := acctest.ProviderTestConfig()
30+
31+
compartmentId := utils.GetEnvSettingWithBlankDefault("compartment_ocid")
32+
compartmentIdVariableStr := fmt.Sprintf("variable \"compartment_id\" { default = \"%s\" }\n", compartmentId)
33+
34+
singularDatasourceName := "data.oci_database_autonomous_vm_cluster_resource_usage.test_autonomous_vm_cluster_resource_usage"
35+
36+
acctest.SaveConfigContent("", "", "", t)
37+
38+
acctest.ResourceTest(t, nil, []resource.TestStep{
39+
// verify singular datasource
40+
{
41+
Config: config +
42+
acctest.GenerateDataSourceFromRepresentationMap("oci_database_autonomous_vm_cluster_resource_usage", "test_autonomous_vm_cluster_resource_usage", acctest.Required, acctest.Create, DatabaseAutonomousVmClusterResourceUsageSingularDataSourceRepresentation) +
43+
compartmentIdVariableStr + DatabaseAutonomousVmClusterRequiredOnlyResource,
44+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
45+
resource.TestCheckResourceAttrSet(singularDatasourceName, "autonomous_vm_cluster_id"),
46+
47+
resource.TestCheckResourceAttrSet(singularDatasourceName, "autonomous_data_storage_size_in_tbs"),
48+
resource.TestCheckResourceAttr(singularDatasourceName, "autonomous_vm_resource_usage.#", "2"),
49+
resource.TestCheckResourceAttrSet(singularDatasourceName, "available_autonomous_data_storage_size_in_tbs"),
50+
resource.TestCheckResourceAttrSet(singularDatasourceName, "available_cpus"),
51+
resource.TestCheckResourceAttrSet(singularDatasourceName, "db_node_storage_size_in_gbs"),
52+
resource.TestCheckResourceAttrSet(singularDatasourceName, "display_name"),
53+
resource.TestCheckResourceAttrSet(singularDatasourceName, "exadata_storage_in_tbs"),
54+
resource.TestCheckResourceAttrSet(singularDatasourceName, "id"),
55+
resource.TestCheckResourceAttrSet(singularDatasourceName, "is_local_backup_enabled"),
56+
resource.TestCheckResourceAttrSet(singularDatasourceName, "memory_per_oracle_compute_unit_in_gbs"),
57+
resource.TestCheckResourceAttrSet(singularDatasourceName, "memory_size_in_gbs"),
58+
resource.TestCheckResourceAttrSet(singularDatasourceName, "non_provisionable_autonomous_container_databases"),
59+
resource.TestCheckResourceAttrSet(singularDatasourceName, "provisionable_autonomous_container_databases"),
60+
resource.TestCheckResourceAttrSet(singularDatasourceName, "provisioned_autonomous_container_databases"),
61+
resource.TestCheckResourceAttrSet(singularDatasourceName, "provisioned_cpus"),
62+
resource.TestCheckResourceAttrSet(singularDatasourceName, "reclaimable_cpus"),
63+
resource.TestCheckResourceAttrSet(singularDatasourceName, "reserved_cpus"),
64+
resource.TestCheckResourceAttrSet(singularDatasourceName, "total_container_databases"),
65+
resource.TestCheckResourceAttrSet(singularDatasourceName, "total_cpus"),
66+
resource.TestCheckResourceAttrSet(singularDatasourceName, "used_autonomous_data_storage_size_in_tbs"),
67+
resource.TestCheckResourceAttrSet(singularDatasourceName, "used_cpus"),
68+
),
69+
},
70+
})
71+
}

internal/integrationtest/database_autonomous_vm_cluster_test.go

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,14 @@ func TestDatabaseAutonomousVmClusterResource_basic(t *testing.T) {
349349
resource.TestCheckResourceAttr(datasourceName, "autonomous_vm_clusters.0.cpu_core_count_per_node", "10"),
350350
resource.TestCheckResourceAttrSet(datasourceName, "autonomous_vm_clusters.0.cpus_enabled"),
351351
resource.TestCheckResourceAttrSet(datasourceName, "autonomous_vm_clusters.0.data_storage_size_in_tbs"),
352+
resource.TestCheckResourceAttr(datasourceName, "autonomous_vm_clusters.0.autonomous_data_storage_percentage", "0"),
353+
resource.TestCheckResourceAttr(datasourceName, "autonomous_vm_clusters.0.autonomous_data_storage_size_in_tbs", "2"),
354+
resource.TestCheckResourceAttr(datasourceName, "autonomous_vm_clusters.0.cpu_percentage", "0"),
355+
resource.TestCheckResourceAttrSet(datasourceName, "autonomous_vm_clusters.0.non_provisionable_autonomous_container_databases"),
356+
resource.TestCheckResourceAttrSet(datasourceName, "autonomous_vm_clusters.0.provisioned_autonomous_container_databases"),
357+
resource.TestCheckResourceAttr(datasourceName, "autonomous_vm_clusters.0.total_autonomous_data_storage_in_tbs", "2"),
358+
resource.TestCheckResourceAttr(datasourceName, "autonomous_vm_clusters.0.total_container_databases", "2"),
359+
resource.TestCheckResourceAttrSet(datasourceName, "autonomous_vm_clusters.0.provisioned_cpus"),
352360
resource.TestCheckResourceAttrSet(datasourceName, "autonomous_vm_clusters.0.db_node_storage_size_in_gbs"),
353361
resource.TestCheckResourceAttr(datasourceName, "autonomous_vm_clusters.0.db_servers.#", "2"),
354362
resource.TestCheckResourceAttr(datasourceName, "autonomous_vm_clusters.0.display_name", "autonomousVmCluster"),
@@ -362,9 +370,10 @@ func TestDatabaseAutonomousVmClusterResource_basic(t *testing.T) {
362370
resource.TestCheckResourceAttr(datasourceName, "autonomous_vm_clusters.0.maintenance_window.#", "1"),
363371
resource.TestCheckResourceAttr(datasourceName, "autonomous_vm_clusters.0.memory_per_oracle_compute_unit_in_gbs", "20"),
364372
resource.TestCheckResourceAttrSet(datasourceName, "autonomous_vm_clusters.0.memory_size_in_gbs"),
373+
resource.TestCheckResourceAttrSet(datasourceName, "autonomous_vm_clusters.0.node_count"),
365374
resource.TestCheckResourceAttrSet(datasourceName, "autonomous_vm_clusters.0.reclaimable_cpus"),
366-
//resource.TestCheckResourceAttr(datasourceName, "autonomous_vm_clusters.0.scan_listener_port_non_tls", "1600"),
367-
//resource.TestCheckResourceAttr(datasourceName, "autonomous_vm_clusters.0.scan_listener_port_tls", "3600"),
375+
resource.TestCheckResourceAttr(datasourceName, "autonomous_vm_clusters.0.scan_listener_port_non_tls", "1600"),
376+
resource.TestCheckResourceAttr(datasourceName, "autonomous_vm_clusters.0.scan_listener_port_tls", "3600"),
368377
//resource.TestCheckResourceAttrSet(datasourceName, "autonomous_vm_clusters.0.next_maintenance_run_id"),
369378
//resource.TestCheckResourceAttrSet(datasourceName, "autonomous_vm_clusters.0.ocpus_enabled"),
370379
resource.TestCheckResourceAttrSet(datasourceName, "autonomous_vm_clusters.0.state"),
@@ -384,11 +393,18 @@ func TestDatabaseAutonomousVmClusterResource_basic(t *testing.T) {
384393
compartmentIdVariableStr + DatabaseAutonomousVmClusterResourceConfig,
385394
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
386395
resource.TestCheckResourceAttrSet(singularDatasourceName, "autonomous_vm_cluster_id"),
387-
388396
resource.TestCheckResourceAttr(singularDatasourceName, "autonomous_data_storage_size_in_tbs", "2"),
389397
resource.TestCheckResourceAttrSet(singularDatasourceName, "available_autonomous_data_storage_size_in_tbs"),
390398
resource.TestCheckResourceAttrSet(singularDatasourceName, "available_container_databases"),
391399
//resource.TestCheckResourceAttr(singularDatasourceName, "autonomous_data_storage_size_in_tbs", "1"),
400+
resource.TestCheckResourceAttr(singularDatasourceName, "autonomous_data_storage_percentage", "0"),
401+
resource.TestCheckResourceAttr(singularDatasourceName, "autonomous_data_storage_size_in_tbs", "2"),
402+
resource.TestCheckResourceAttr(singularDatasourceName, "cpu_percentage", "0"),
403+
resource.TestCheckResourceAttrSet(singularDatasourceName, "non_provisionable_autonomous_container_databases"),
404+
resource.TestCheckResourceAttrSet(singularDatasourceName, "provisioned_autonomous_container_databases"),
405+
resource.TestCheckResourceAttr(singularDatasourceName, "total_autonomous_data_storage_in_tbs", "2"),
406+
resource.TestCheckResourceAttr(singularDatasourceName, "total_container_databases", "2"),
407+
resource.TestCheckResourceAttrSet(singularDatasourceName, "provisioned_cpus"),
392408
resource.TestCheckResourceAttrSet(singularDatasourceName, "available_cpus"),
393409
resource.TestCheckResourceAttrSet(singularDatasourceName, "available_data_storage_size_in_tbs"),
394410
//resource.TestCheckResourceAttr(singularDatasourceName, "compute_model", "OCPU"),
@@ -409,6 +425,7 @@ func TestDatabaseAutonomousVmClusterResource_basic(t *testing.T) {
409425
resource.TestCheckResourceAttr(singularDatasourceName, "maintenance_window.#", "1"),
410426
resource.TestCheckResourceAttr(singularDatasourceName, "memory_per_oracle_compute_unit_in_gbs", "20"),
411427
resource.TestCheckResourceAttrSet(singularDatasourceName, "memory_size_in_gbs"),
428+
resource.TestCheckResourceAttrSet(singularDatasourceName, "node_count"),
412429
resource.TestCheckResourceAttrSet(singularDatasourceName, "reclaimable_cpus"),
413430
resource.TestCheckResourceAttr(singularDatasourceName, "scan_listener_port_non_tls", "1600"),
414431
resource.TestCheckResourceAttr(singularDatasourceName, "scan_listener_port_tls", "3600"),

0 commit comments

Comments
 (0)