Skip to content

Commit d26dcc4

Browse files
Atul Adityasrinioci
authored andcommitted
Added - Support for Support Cross region Backup copy & Replication for volumes encrypted with Customer KMS Keys
1 parent bdbd8c3 commit d26dcc4

36 files changed

+325
-40
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved.
2+
// Licensed under the Mozilla Public License v2.0
3+
4+
variable "tenancy_ocid" {
5+
}
6+
7+
variable "user_ocid" {
8+
}
9+
10+
variable "fingerprint" {
11+
}
12+
13+
variable "private_key_path" {
14+
}
15+
16+
variable "region" {
17+
}
18+
19+
variable "compartment_ocid" {
20+
}
21+
22+
23+
data "oci_identity_availability_domain" "ad" {
24+
compartment_id = var.tenancy_ocid
25+
ad_number = 1
26+
}
27+
28+
provider "oci" {
29+
# version = "6.9.0"
30+
tenancy_ocid = var.tenancy_ocid
31+
user_ocid = var.user_ocid
32+
fingerprint = var.fingerprint
33+
private_key_path = var.private_key_path
34+
region = var.region
35+
36+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
2+
resource "oci_core_volume" "test_volume_with_required_parameter" {
3+
availability_domain = data.oci_identity_availability_domain.ad.name
4+
compartment_id = var.compartment_ocid
5+
}
6+
7+
variable "kms_key_ocid_cross_region" {
8+
default = ""
9+
}
10+
resource "oci_core_volume" "test_volume_with_optional_parameter" {
11+
availability_domain = data.oci_identity_availability_domain.ad.name
12+
compartment_id = var.compartment_ocid
13+
display_name = "test_volume"
14+
15+
// please find allowed other region's availability_domain and hardcode here
16+
block_volume_replicas {
17+
availability_domain = data.oci_identity_availability_domain.ad.name
18+
display_name = "test_replicas"
19+
}
20+
21+
// if you want delete volume and this volume has replicas, please disable replicas at first, set this "block_volume_replicas_deletion" to true
22+
block_volume_replicas_deletion = true
23+
24+
}
25+
26+
output "volume" {
27+
value = {
28+
test_volume_with_required_parameter = oci_core_volume.test_volume_with_required_parameter.id
29+
test_volume_with_optional_parameter = oci_core_volume.test_volume_with_optional_parameter.id
30+
}
31+
}

internal/integrationtest/core_block_volume_replica_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ var (
3838

3939
//hardcode availability_domain here to meet the cross region replicas requirement
4040
CoreBlockDependenceVolumeBlockVolumeReplicasRepresentation = map[string]interface{}{
41-
"availability_domain": acctest.Representation{RepType: acctest.Required, Create: `KvuH:US-ASHBURN-AD-1`},
41+
"availability_domain": acctest.Representation{RepType: acctest.Required, Create: `pjBI:US-ASHBURN-AD-1`},
4242
"display_name": acctest.Representation{RepType: acctest.Optional, Create: `displayName`},
4343
}
4444

internal/integrationtest/core_boot_volume_replica_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ var (
3939
"boot_volume_replicas_deletion": acctest.Representation{RepType: acctest.Optional, Create: `false`, Update: `true`},
4040
}
4141
CoreCoreBootVolumeDependenceBootVolumeReplicasRepresentation = map[string]interface{}{
42-
"availability_domain": acctest.Representation{RepType: acctest.Required, Create: `KvuH:US-ASHBURN-AD-1`},
42+
"availability_domain": acctest.Representation{RepType: acctest.Required, Create: `pjBI:US-ASHBURN-AD-1`},
4343
"display_name": acctest.Representation{RepType: acctest.Optional, Create: `displayName`},
4444
}
4545
CoreBootVolumeReplicaResourceConfig = CoreBootVolumeResourceDependencies
@@ -56,7 +56,6 @@ func TestCoreBootVolumeReplicaResource_basic(t *testing.T) {
5656
compartmentIdVariableStr := fmt.Sprintf("variable \"compartment_id\" { default = \"%s\" }\n", compartmentId)
5757

5858
resourceName := "oci_core_boot_volume.test_boot_volume"
59-
6059
acctest.SaveConfigContent("", "", "", t)
6160

6261
acctest.ResourceTest(t, nil, []resource.TestStep{

internal/integrationtest/core_boot_volume_test.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ var (
6161
"values": acctest.Representation{RepType: acctest.Required, Create: []string{`${oci_core_boot_volume.test_boot_volume.id}`}},
6262
}
6363

64+
IgnoreSystemTagsChangesRep = map[string]interface{}{
65+
"ignore_changes": acctest.Representation{RepType: acctest.Required, Create: []string{`system_tags`, `defined_tags`, `freeform_tags`, `xrc_kms_key_id`}},
66+
}
67+
6468
CoreBootVolumeRepresentation = map[string]interface{}{
6569
"availability_domain": acctest.Representation{RepType: acctest.Required, Create: `${data.oci_identity_availability_domains.test_availability_domains.availability_domains.0.name}`},
6670
"compartment_id": acctest.Representation{RepType: acctest.Required, Create: `${var.compartment_id}`},
@@ -75,7 +79,8 @@ var (
7579
"vpus_per_gb": acctest.Representation{RepType: acctest.Optional, Create: `10`, Update: `10`},
7680
"autotune_policies": acctest.RepresentationGroup{RepType: acctest.Optional, Group: CoreBootVolumeAutotunePoliciesRepresentation},
7781
"is_auto_tune_enabled": acctest.Representation{RepType: acctest.Optional, Create: `false`, Update: `false`},
78-
"lifecycle": acctest.RepresentationGroup{RepType: acctest.Required, Group: CoreIgnoreSystemTagsChangesRepresentation},
82+
"xrc_kms_key_id": acctest.Representation{RepType: acctest.Optional, Create: `${lookup(data.oci_kms_keys.test_keys_dependency.keys[0], "id")}`},
83+
"lifecycle": acctest.RepresentationGroup{RepType: acctest.Required, Group: IgnoreSystemTagsChangesRep},
7984
}
8085

8186
CoreDeltaRestoreBootVolumeRepresentation = map[string]interface{}{
@@ -111,6 +116,7 @@ var (
111116
CoreBootVolumeBootVolumeReplicasRepresentation = map[string]interface{}{
112117
"availability_domain": acctest.Representation{RepType: acctest.Required, Create: `${data.oci_identity_availability_domains.test_availability_domains.availability_domains.0.name}`, Update: `availabilityDomain2`},
113118
"display_name": acctest.Representation{RepType: acctest.Optional, Create: `displayName`, Update: `displayName2`},
119+
"xrr_kms_key_id": acctest.Representation{RepType: acctest.Optional, Create: `${lookup(data.oci_kms_keys.test_keys_dependency.keys[0], "id")}`},
114120
}
115121

116122
CoreBootVolumeResourceDependencies = acctest.GenerateResourceFromRepresentationMap("oci_core_subnet", "test_subnet", acctest.Required, acctest.Create, CoreSubnetRepresentation) +
@@ -366,6 +372,7 @@ func TestCoreBootVolumeResource_basic(t *testing.T) {
366372
ImportStateVerifyIgnore: []string{
367373
"backup_policy_id",
368374
"cluster_placement_group_id",
375+
"xrc_kms_key_id",
369376
},
370377
ResourceName: resourceName,
371378
},

internal/integrationtest/core_volume_backup_policy_assignment_test.go

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,16 @@ import (
1818
"github.com/oracle/terraform-provider-oci/internal/acctest"
1919
tf_client "github.com/oracle/terraform-provider-oci/internal/client"
2020
"github.com/oracle/terraform-provider-oci/internal/resourcediscovery"
21+
2122
"github.com/oracle/terraform-provider-oci/internal/tfresource"
2223
"github.com/oracle/terraform-provider-oci/internal/utils"
2324
)
2425

2526
var (
26-
CoreCoreVolumeBackupPolicyAssignmentRequiredOnlyResource = acctest.GenerateResourceFromRepresentationMap("oci_core_volume_backup_policy_assignment", "test_volume_backup_policy_assignment", acctest.Required, acctest.Create, CoreVolumeBackupPolicyAssignmentRepresentation)
27+
CoreVolumeBackupPolicyAssignmentRequiredOnlyResource = acctest.GenerateResourceFromRepresentationMap("oci_core_volume_backup_policy_assignment", "test_volume_backup_policy_assignment", acctest.Required, acctest.Create, CoreVolumeBackupPolicyAssignmentRepresentation)
2728

2829
CoreCoreVolumeBackupPolicyAssignmentDataSourceRepresentation = map[string]interface{}{
30+
2931
"asset_id": acctest.Representation{RepType: acctest.Required, Create: `${oci_core_volume.test_volume.id}`},
3032
"filter": acctest.RepresentationGroup{RepType: acctest.Required, Group: CoreVolumeBackupPolicyAssignmentDataSourceFilterRepresentation}}
3133
CoreVolumeBackupPolicyAssignmentDataSourceFilterRepresentation = map[string]interface{}{
@@ -34,13 +36,15 @@ var (
3436
}
3537

3638
CoreVolumeBackupPolicyAssignmentRepresentation = map[string]interface{}{
37-
"asset_id": acctest.Representation{RepType: acctest.Required, Create: `${oci_core_volume.test_volume.id}`},
38-
"policy_id": acctest.Representation{RepType: acctest.Required, Create: `${data.oci_core_volume_backup_policies.test_volume_backup_policies.volume_backup_policies.0.id}`},
39+
"asset_id": acctest.Representation{RepType: acctest.Required, Create: `${oci_core_volume.test_volume.id}`},
40+
"policy_id": acctest.Representation{RepType: acctest.Required, Create: `${data.oci_core_volume_backup_policies.test_volume_backup_policies.volume_backup_policies.0.id}`},
41+
"xrc_kms_key_id": acctest.Representation{RepType: acctest.Optional, Create: `${var.kms_key_ocid_cross_region}`},
3942
}
4043

4144
CoreVolumeBackupPolicyAssignmentResourceDependencies = utils.VolumeBackupPolicyDependency +
4245
acctest.GenerateResourceFromRepresentationMap("oci_core_volume", "test_volume", acctest.Required, acctest.Create, CoreVolumeRepresentation) +
43-
AvailabilityDomainConfig
46+
AvailabilityDomainConfig +
47+
KeyResourceDependencyConfig
4448
)
4549

4650
// issue-routing-tag: core/blockStorage
@@ -59,13 +63,27 @@ func TestCoreVolumeBackupPolicyAssignmentResource_basic(t *testing.T) {
5963
var resId string
6064
// Save TF content to Create resource with only required properties. This has to be exactly the same as the config part in the Create step in the test.
6165
acctest.SaveConfigContent(config+compartmentIdVariableStr+CoreVolumeBackupPolicyAssignmentResourceDependencies+
62-
acctest.GenerateResourceFromRepresentationMap("oci_core_volume_backup_policy_assignment", "test_volume_backup_policy_assignment", acctest.Required, acctest.Create, CoreVolumeBackupPolicyAssignmentRepresentation), "core", "volumeBackupPolicyAssignment", t)
66+
acctest.GenerateResourceFromRepresentationMap("oci_core_volume_backup_policy_assignment", "test_volume_backup_policy_assignment", acctest.Optional, acctest.Create, CoreVolumeBackupPolicyAssignmentRepresentation), "core", "volumeBackupPolicyAssignment", t)
6367

6468
acctest.ResourceTest(t, testAccCheckCoreVolumeBackupPolicyAssignmentDestroy, []resource.TestStep{
6569
// verify Create
6670
{
6771
Config: config + compartmentIdVariableStr + CoreVolumeBackupPolicyAssignmentResourceDependencies +
6872
acctest.GenerateResourceFromRepresentationMap("oci_core_volume_backup_policy_assignment", "test_volume_backup_policy_assignment", acctest.Required, acctest.Create, CoreVolumeBackupPolicyAssignmentRepresentation),
73+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
74+
resource.TestCheckResourceAttrSet(resourceName, "asset_id"),
75+
resource.TestCheckResourceAttrSet(resourceName, "policy_id"),
76+
),
77+
},
78+
79+
// delete before next Create
80+
{
81+
Config: config + compartmentIdVariableStr + CoreVolumeBackupPolicyAssignmentResourceDependencies,
82+
},
83+
// verify Create with optionals
84+
{
85+
Config: config + compartmentIdVariableStr + CoreVolumeBackupPolicyAssignmentResourceDependencies +
86+
acctest.GenerateResourceFromRepresentationMap("oci_core_volume_backup_policy_assignment", "test_volume_backup_policy_assignment", acctest.Optional, acctest.Create, CoreVolumeBackupPolicyAssignmentRepresentation),
6987
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
7088
resource.TestCheckResourceAttrSet(resourceName, "asset_id"),
7189
resource.TestCheckResourceAttrSet(resourceName, "policy_id"),
@@ -100,7 +118,7 @@ func TestCoreVolumeBackupPolicyAssignmentResource_basic(t *testing.T) {
100118
},
101119
// verify resource import
102120
{
103-
Config: config + CoreCoreVolumeBackupPolicyAssignmentRequiredOnlyResource,
121+
Config: config + CoreVolumeBackupPolicyAssignmentRequiredOnlyResource,
104122
ImportState: true,
105123
ImportStateVerify: true,
106124
ImportStateVerifyIgnore: []string{},

internal/integrationtest/core_volume_group_replica_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,14 @@ var (
2626
"volume_group_replicas": acctest.RepresentationGroup{RepType: acctest.Optional, Group: CoreVolumeGroupVolumeGroupReplicasRepresentation},
2727
"volume_group_replicas_deletion": acctest.Representation{RepType: acctest.Optional, Create: `false`, Update: `true`},
2828
"preserve_volume_replica": acctest.Representation{RepType: acctest.Optional, Create: `false`, Update: `false`},
29+
"lifecycle": acctest.RepresentationGroup{RepType: acctest.Required, Group: CoreIgnoreSystemTagsChangesRepresentation},
2930
}
3031

3132
//hardcode availability_domain here to meet the cross region replicas requirement
3233
CoreVolumeGroupVolumeGroupReplicasRepresentation = map[string]interface{}{
33-
"availability_domain": acctest.Representation{RepType: acctest.Required, Create: `KvuH:US-ASHBURN-AD-1`},
34+
"availability_domain": acctest.Representation{RepType: acctest.Required, Create: `pjBI:US-ASHBURN-AD-1`},
3435
"display_name": acctest.Representation{RepType: acctest.Optional, Create: `displayName`},
36+
"xrr_kms_key_id": acctest.Representation{RepType: acctest.Optional, Create: `${var.kms_key_ocid_cross_region}`},
3537
}
3638
)
3739

@@ -70,7 +72,7 @@ func TestCoreVolumeGroupReplicaResource_basic(t *testing.T) {
7072
resource.TestCheckResourceAttrSet(resourceName, "volume_group_replicas.0.display_name"),
7173

7274
func(s *terraform.State) (err error) {
73-
time.Sleep(2 * time.Minute)
75+
time.Sleep(35 * time.Minute)
7476
return
7577
},
7678
),
@@ -82,11 +84,9 @@ func TestCoreVolumeGroupReplicaResource_basic(t *testing.T) {
8284
resource.TestCheckResourceAttrSet(resourceName, "availability_domain"),
8385
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
8486
resource.TestCheckResourceAttr(resourceName, "display_name", "displayName2"),
85-
resource.TestCheckResourceAttr(resourceName, "state", "AVAILABLE"),
86-
resource.TestCheckNoResourceAttr(resourceName, "volume_group_replicas"),
87-
87+
resource.TestCheckResourceAttr(resourceName, "state", "UPDATE_PENDING"),
8888
func(s *terraform.State) (err error) {
89-
time.Sleep(2 * time.Minute)
89+
time.Sleep(10 * time.Minute)
9090
return
9191
},
9292
),

internal/integrationtest/core_volume_group_test.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,17 @@ var (
3434

3535
volumeGroupDataSourceRepresentation = map[string]interface{}{
3636
"compartment_id": acctest.Representation{RepType: acctest.Required, Create: `${var.compartment_id}`},
37-
"availability_domain": acctest.Representation{RepType: acctest.Optional, Create: `${data.oci_identity_availability_domains.test_availability_domains.availability_domains.0.name}`},
37+
"availability_domain": acctest.Representation{RepType: acctest.Required, Create: `${data.oci_identity_availability_domains.test_availability_domains.availability_domains.0.name}`},
3838
"display_name": acctest.Representation{RepType: acctest.Optional, Create: `displayName`, Update: `displayName2`},
3939
"state": acctest.Representation{RepType: acctest.Optional, Create: `AVAILABLE`},
4040
"filter": acctest.RepresentationGroup{RepType: acctest.Required, Group: volumeGroupDataSourceFilterRepresentation}}
4141
volumeGroupDataSourceFilterRepresentation = map[string]interface{}{
4242
"name": acctest.Representation{RepType: acctest.Required, Create: `id`},
4343
"values": acctest.Representation{RepType: acctest.Required, Create: []string{`${oci_core_volume_group.test_volume_group.id}`}},
4444
}
45+
CoreIgnoreTagsChangesRepresentation = map[string]interface{}{
46+
"ignore_changes": acctest.Representation{RepType: acctest.Required, Create: []string{`defined_tags`, `freeform_tags`}},
47+
}
4548

4649
CoreVolumeGroupRepresentation = map[string]interface{}{
4750
"availability_domain": acctest.Representation{RepType: acctest.Required, Create: `${data.oci_identity_availability_domains.test_availability_domains.availability_domains.0.name}`},
@@ -53,11 +56,14 @@ var (
5356
"display_name": acctest.Representation{RepType: acctest.Optional, Create: `displayName`, Update: `displayName2`},
5457
"volume_ids": acctest.Representation{RepType: acctest.Optional, Create: nil, Update: []string{`${oci_core_volume.source_volume_list.*.id[0]}`}},
5558
"freeform_tags": acctest.Representation{RepType: acctest.Optional, Create: map[string]string{"Department": "Finance"}, Update: map[string]string{"Department": "Accounting"}},
59+
"xrc_kms_key_id": acctest.Representation{RepType: acctest.Optional, Create: `${lookup(data.oci_kms_keys.test_keys_dependency.keys[0], "id")}`},
60+
"lifecycle": acctest.RepresentationGroup{RepType: acctest.Required, Group: CoreIgnoreTagsChangesRepresentation},
5661
}
5762
CoreVolumeGroupSourceDetailsRepresentation = map[string]interface{}{
5863
"type": acctest.Representation{RepType: acctest.Required, Create: `volumeIds`},
5964
"volume_ids": acctest.Representation{RepType: acctest.Required, Create: `${oci_core_volume.source_volume_list.*.id}`},
6065
}
66+
6167
CoreVolumeSourceDetailsJumbledVolumeIdsRepresentation = map[string]interface{}{
6268
"type": acctest.Representation{RepType: acctest.Required, Create: `volumeIds`},
6369
"volume_ids": acctest.Representation{RepType: acctest.Required, Create: []string{`${oci_core_volume.source_volume_list.*.id[1]}`, `${oci_core_volume.source_volume_list.*.id[0]}`}},
@@ -82,6 +88,8 @@ var (
8288
}
8389
` +
8490
AvailabilityDomainConfig +
91+
KeyResourceDependencyConfig +
92+
8593
utils.VolumeBackupPolicyDependency +
8694
CoreVolumeBackupPolicyRequiredOnlyResource
8795
VolumeGroupRequiredOnlyResourceDependencies = AvailabilityDomainConfig + SourceVolumeListDependency
@@ -170,6 +178,7 @@ func TestCoreVolumeGroupResource_basic(t *testing.T) {
170178
resource.TestCheckResourceAttr(resourceName, "source_details.#", "1"),
171179
resource.TestCheckResourceAttr(resourceName, "source_details.0.type", "volumeIds"),
172180
resource.TestCheckResourceAttrSet(resourceName, "time_created"),
181+
173182
resource.TestCheckResourceAttr(resourceName, "volume_ids.#", "2"),
174183

175184
func(s *terraform.State) (err error) {
@@ -287,6 +296,7 @@ func TestCoreVolumeGroupResource_basic(t *testing.T) {
287296
ImportStateVerify: true,
288297
ImportStateVerifyIgnore: []string{
289298
"backup_policy_id",
299+
"xrc_kms_key_id",
290300
"cluster_placement_group_id",
291301
},
292302
ResourceName: resourceName,

0 commit comments

Comments
 (0)