Skip to content

Commit aba1c25

Browse files
Nilesh ParmarMonica Joshi
authored andcommitted
Added - Support for BDS - Implement ODH Patching in Staged manner
1 parent b98b916 commit aba1c25

10 files changed

+378
-29
lines changed

internal/integrationtest/bds_bds_instance_os_patch_action_test.go

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,8 @@ import (
1515
)
1616

1717
// issue-routing-tag: bds/default
18-
func TestBdsBdsInstanceOSPatchActionResource(t *testing.T) {
19-
//t.Skip("Run manual with an older cluster with patch available")
20-
httpreplay.SetScenario("TestBdsBdsInstanceOSPatchActionResource")
18+
func TestBdsBdsInstanceOSPatchActionResource_basic(t *testing.T) {
19+
httpreplay.SetScenario("TestBdsBdsInstanceOSPatchActionResource_basic")
2120
defer httpreplay.SaveScenario()
2221

2322
config := acctest.ProviderTestConfig()
@@ -29,30 +28,33 @@ func TestBdsBdsInstanceOSPatchActionResource(t *testing.T) {
2928
subnetIdVariableStr := fmt.Sprintf("variable \"subnet_id\" { default = \"%s\" }\n", subnetId)
3029

3130
// Pass cluster ocid as variable to directly apply OS patch to existing cluster
32-
//bdsinstanceId := utils.GetEnvSettingWithBlankDefault("bdsinstance_ocid")
33-
//bdsinstanceIdVariableStr := fmt.Sprintf("variable \"bdsinstance_id\" { default = \"%s\" }\n", bdsinstanceId)
31+
bdsinstanceId := utils.GetEnvSettingWithBlankDefault("bdsinstance_ocid")
32+
bdsinstanceIdVariableStr := fmt.Sprintf("variable \"bdsinstance_id\" { default = \"%s\" }\n", bdsinstanceId)
3433

3534
// Passing patching configs strategy & parameters in this representation
3635
BdsBdsInstanceOSPatchConfigRepresentation := map[string]interface{}{
37-
"patching_config_strategy": acctest.Representation{RepType: acctest.Required, Create: "PATCHING_BASED"},
36+
"patching_config_strategy": acctest.Representation{RepType: acctest.Required, Create: "DOMAIN_BASED"},
3837
"batch_size": acctest.Representation{RepType: acctest.Required, Create: "3"},
39-
"wait_time_between_batch_in_seconds": acctest.Representation{RepType: acctest.Required, Create: "60"},
40-
"tolerance_threshold_per_batch": acctest.Representation{RepType: acctest.Required, Create: "0"},
38+
"wait_time_between_batch_in_seconds": acctest.Representation{RepType: acctest.Required, Create: "600"},
39+
"tolerance_threshold_per_batch": acctest.Representation{RepType: acctest.Required, Create: "1"},
40+
41+
"wait_time_between_domain_in_seconds": acctest.Representation{RepType: acctest.Required, Create: "300"},
42+
"tolerance_threshold_per_domain": acctest.Representation{RepType: acctest.Required, Create: "1"},
4143
}
4244

4345
// Passing timeout representation since OS patching may take more time then default values
4446
PatchTimeoutsRepresentation := map[string]interface{}{
45-
"create": acctest.Representation{RepType: acctest.Required, Create: `4h`},
46-
"update": acctest.Representation{RepType: acctest.Required, Create: `4h`},
47-
"delete": acctest.Representation{RepType: acctest.Required, Create: `4h`},
47+
"create": acctest.Representation{RepType: acctest.Required, Create: `12h`},
48+
"update": acctest.Representation{RepType: acctest.Required, Create: `12h`},
49+
"delete": acctest.Representation{RepType: acctest.Required, Create: `12h`},
4850
}
4951

5052
// To use default patching strategy (nodes will be patched and rebooted AD/FD by AD/FD), comment patching_configs & above config representation
5153
var (
5254
BdsBdsInstanceOSPatchActionRepresentation = map[string]interface{}{
5355
"bds_instance_id": acctest.Representation{RepType: acctest.Required, Create: `${oci_bds_bds_instance.test_bds_instance.id}`},
54-
"cluster_admin_password": acctest.Representation{RepType: acctest.Required, Create: `T3JhY2xlVGVhbVVTQSExMjM=`},
55-
"os_patch_version": acctest.Representation{RepType: acctest.Required, Create: "ol7.9-x86_64-1.28.0.619-0.0"},
56+
"cluster_admin_password": acctest.Representation{RepType: acctest.Required, Create: `clusterAdminPassword`},
57+
"os_patch_version": acctest.Representation{RepType: acctest.Required, Create: "patchVersion"},
5658
"patching_configs": acctest.RepresentationGroup{RepType: acctest.Required, Group: BdsBdsInstanceOSPatchConfigRepresentation},
5759
"timeouts": acctest.RepresentationGroup{RepType: acctest.Required, Group: PatchTimeoutsRepresentation},
5860
}
@@ -65,18 +67,18 @@ func TestBdsBdsInstanceOSPatchActionResource(t *testing.T) {
6567
resourceName := "oci_bds_bds_instance_os_patch_action.test_bds_instance_os_patch_action"
6668

6769
// 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.
68-
acctest.SaveConfigContent(config+compartmentIdVariableStr+subnetIdVariableStr+BdsBdsInstanceOSPatchActionResourceDependencies+
70+
acctest.SaveConfigContent(config+compartmentIdVariableStr+subnetIdVariableStr+bdsinstanceIdVariableStr+BdsBdsInstanceOSPatchActionResourceDependencies+
6971
acctest.GenerateResourceFromRepresentationMap("oci_bds_bds_instance_os_patch_action", "test_bds_instance_os_patch_action", acctest.Required, acctest.Create, BdsBdsInstanceOSPatchActionRepresentation), "bds", "bdsInstanceOSPatchAction", t)
7072

7173
acctest.ResourceTest(t, nil, []resource.TestStep{
7274
// verify Create
7375
{
74-
Config: config + compartmentIdVariableStr + subnetIdVariableStr + BdsBdsInstanceOSPatchActionResourceDependencies +
76+
Config: config + compartmentIdVariableStr + subnetIdVariableStr + bdsinstanceIdVariableStr + BdsBdsInstanceOSPatchActionResourceDependencies +
7577
acctest.GenerateResourceFromRepresentationMap("oci_bds_bds_instance_os_patch_action", "test_bds_instance_os_patch_action", acctest.Required, acctest.Create, BdsBdsInstanceOSPatchActionRepresentation),
7678
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
7779
resource.TestCheckResourceAttrSet(resourceName, "bds_instance_id"),
78-
resource.TestCheckResourceAttr(resourceName, "cluster_admin_password", "T3JhY2xlVGVhbVVTQSExMjM="),
79-
resource.TestCheckResourceAttrSet(resourceName, "state"),
80+
resource.TestCheckResourceAttr(resourceName, "cluster_admin_password", "T3JhY2xlVGVhbUlEQzMzIUAj"),
81+
resource.TestCheckResourceAttr(resourceName, "os_patch_version", "ol7.9-x86_64-1.27.0.696-0.0"),
8082
),
8183
},
8284
})

internal/integrationtest/bds_bds_instance_patch_action_test.go

Lines changed: 60 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,41 @@ package integrationtest
55

66
import (
77
"fmt"
8+
"strconv"
89
"testing"
910

10-
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
11+
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
12+
"github.com/oracle/terraform-provider-oci/internal/resourcediscovery"
1113

14+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
1215
"github.com/oracle/terraform-provider-oci/httpreplay"
1316
"github.com/oracle/terraform-provider-oci/internal/acctest"
1417

1518
"github.com/oracle/terraform-provider-oci/internal/utils"
1619
)
1720

1821
var (
22+
//BdsBdsInstancePatchActionRequiredOnlyResource = BdsBdsInstancePatchActionResourceDependencies +
23+
//acctest.GenerateResourceFromRepresentationMap("oci_bds_bds_instance_patch_action", "test_bds_instance_patch_action", acctest.Required, acctest.Create, BdsBdsInstancePatchActionRepresentation)
24+
1925
BdsBdsInstancePatchActionRepresentation = map[string]interface{}{
2026
"bds_instance_id": acctest.Representation{RepType: acctest.Required, Create: `${oci_bds_bds_instance.test_bds_instance.id}`},
21-
"cluster_admin_password": acctest.Representation{RepType: acctest.Required, Create: `V2VsY29tZTE=`},
22-
"version": acctest.Representation{RepType: acctest.Required, Create: "ODH-1.1.0.379"},
27+
"cluster_admin_password": acctest.Representation{RepType: acctest.Required, Create: `clusterAdminPassword`},
28+
"version": acctest.Representation{RepType: acctest.Required, Create: `version`},
29+
"patching_config": acctest.RepresentationGroup{RepType: acctest.Required, Group: BdsBdsInstancePatchActionPatchingConfigRepresentation},
30+
"timeouts": acctest.RepresentationGroup{RepType: acctest.Required, Group: PatchTimeoutsRepresentation},
31+
}
32+
BdsBdsInstancePatchActionPatchingConfigRepresentation = map[string]interface{}{
33+
"patching_config_strategy": acctest.Representation{RepType: acctest.Required, Create: `DOWNTIME_BASED`},
34+
"batch_size": acctest.Representation{RepType: acctest.Required, Create: `3`},
35+
"wait_time_between_batch_in_seconds": acctest.Representation{RepType: acctest.Required, Create: `600`},
36+
"wait_time_between_domain_in_seconds": acctest.Representation{RepType: acctest.Required, Create: `600`},
37+
}
38+
39+
PatchTimeoutsRepresentation = map[string]interface{}{
40+
"create": acctest.Representation{RepType: acctest.Required, Create: `24h`},
41+
"update": acctest.Representation{RepType: acctest.Required, Create: `24h`},
42+
"delete": acctest.Representation{RepType: acctest.Required, Create: `24h`},
2343
}
2444

2545
BdsBdsInstancePatchActionResourceDependencies = acctest.GenerateResourceFromRepresentationMap("oci_bds_bds_instance", "test_bds_instance", acctest.Required, acctest.Create, bdsInstanceOdhRepresentation) +
@@ -29,7 +49,7 @@ var (
2949

3050
// issue-routing-tag: bds/default
3151
func TestBdsBdsInstancePatchActionResource_basic(t *testing.T) {
32-
t.Skip("Run manual with an older cluster with patch available")
52+
//t.Skip("Run manual with an older cluster with patch available")
3353
httpreplay.SetScenario("TestBdsBdsInstancePatchActionResource_basic")
3454
defer httpreplay.SaveScenario()
3555

@@ -40,18 +60,51 @@ func TestBdsBdsInstancePatchActionResource_basic(t *testing.T) {
4060

4161
resourceName := "oci_bds_bds_instance_patch_action.test_bds_instance_patch_action"
4262

63+
var resId string
64+
// Save TF content to Create resource with optional properties. This has to be exactly the same as the config part in the "create with optionals" step in the test.
4365
// 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.
44-
acctest.SaveConfigContent(config+compartmentIdVariableStr+BdsBdsInstancePatchActionResourceDependencies+
45-
acctest.GenerateResourceFromRepresentationMap("oci_bds_bds_instance_patch_action", "test_bds_instance_patch_action", acctest.Required, acctest.Create, BdsBdsInstancePatchActionRepresentation), "bds", "bdsInstancePatchAction", t)
66+
67+
acctest.SaveConfigContent(config+compartmentIdVariableStr+
68+
acctest.GenerateResourceFromRepresentationMap("oci_bds_bds_instance_patch_action", "test_bds_instance_patch_action", acctest.Optional, acctest.Create, BdsBdsInstancePatchActionRepresentation), "bds", "bdsInstancePatchAction", t)
4669

4770
acctest.ResourceTest(t, nil, []resource.TestStep{
4871
// verify Create
4972
{
50-
Config: config + compartmentIdVariableStr + BdsBdsInstancePatchActionResourceDependencies +
73+
Config: config + compartmentIdVariableStr +
5174
acctest.GenerateResourceFromRepresentationMap("oci_bds_bds_instance_patch_action", "test_bds_instance_patch_action", acctest.Required, acctest.Create, BdsBdsInstancePatchActionRepresentation),
5275
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
5376
resource.TestCheckResourceAttrSet(resourceName, "bds_instance_id"),
5477
),
5578
},
79+
80+
// delete before next Create
81+
{
82+
Config: config + compartmentIdVariableStr + BdsBdsInstancePatchActionResourceDependencies,
83+
},
84+
// verify Create with optionals
85+
{
86+
Config: config + compartmentIdVariableStr + BdsBdsInstancePatchActionResourceDependencies +
87+
acctest.GenerateResourceFromRepresentationMap("oci_bds_bds_instance_patch_action", "test_bds_instance_patch_action", acctest.Optional, acctest.Create, BdsBdsInstancePatchActionRepresentation),
88+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
89+
resource.TestCheckResourceAttrSet(resourceName, "bds_instance_id"),
90+
resource.TestCheckResourceAttr(resourceName, "cluster_admin_password", "clusterAdminPassword"),
91+
resource.TestCheckResourceAttr(resourceName, "patching_config.#", "1"),
92+
resource.TestCheckResourceAttr(resourceName, "patching_config.0.batch_size", "3"),
93+
resource.TestCheckResourceAttr(resourceName, "patching_config.0.patching_config_strategy", "DOWNTIME_BASED"),
94+
resource.TestCheckResourceAttr(resourceName, "patching_config.0.wait_time_between_batch_in_seconds", "600"),
95+
resource.TestCheckResourceAttr(resourceName, "patching_config.0.wait_time_between_domain_in_seconds", "600"),
96+
resource.TestCheckResourceAttr(resourceName, "version", "version"),
97+
98+
func(s *terraform.State) (err error) {
99+
resId, err = acctest.FromInstanceState(s, resourceName, "id")
100+
if isEnableExportCompartment, _ := strconv.ParseBool(utils.GetEnvSettingWithDefault("enable_export_compartment", "true")); isEnableExportCompartment {
101+
if errExport := resourcediscovery.TestExportCompartmentWithResourceName(&resId, &compartmentId, resourceName); errExport != nil {
102+
return errExport
103+
}
104+
}
105+
return err
106+
},
107+
),
108+
},
56109
})
57110
}

internal/integrationtest/bds_odh_instance_resource_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,39 @@ var (
5353
"values": acctest.Representation{RepType: acctest.Required, Create: []string{`${oci_bds_bds_instance.test_bds_instance.id}`}},
5454
}
5555

56+
BdsBdsInstanceRepresentation = map[string]interface{}{
57+
"cluster_admin_password": acctest.Representation{RepType: acctest.Required, Create: `clusterAdminPassword`},
58+
"cluster_public_key": acctest.Representation{RepType: acctest.Required, Create: `clusterPublicKey`},
59+
"cluster_version": acctest.Representation{RepType: acctest.Required, Create: `ODH2_0`},
60+
"compartment_id": acctest.Representation{RepType: acctest.Required, Create: `${var.compartment_id}`},
61+
"display_name": acctest.Representation{RepType: acctest.Required, Create: `displayName`, Update: `displayName2`},
62+
"is_high_availability": acctest.Representation{RepType: acctest.Required, Create: `false`},
63+
"is_secure": acctest.Representation{RepType: acctest.Required, Create: `false`},
64+
"nodes": acctest.RepresentationGroup{RepType: acctest.Required, Group: BdsBdsInstanceNodesRepresentation},
65+
"bootstrap_script_url": acctest.Representation{RepType: acctest.Optional, Create: `bootstrapScriptUrl`, Update: `bootstrapScriptUrl2`},
66+
"cluster_profile": acctest.Representation{RepType: acctest.Optional, Create: `HADOOP_EXTENDED`},
67+
"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")}`},
68+
"freeform_tags": acctest.Representation{RepType: acctest.Optional, Create: map[string]string{"freeformTags": "freeformTags"}, Update: map[string]string{"freeformTags2": "freeformTags2"}},
69+
"kerberos_realm_name": acctest.Representation{RepType: acctest.Optional, Create: `kerberosRealmName`},
70+
"kms_key_id": acctest.Representation{RepType: acctest.Optional, Create: `${lookup(data.oci_kms_keys.test_keys_dependency.keys[0], "id")}`},
71+
"network_config": acctest.RepresentationGroup{RepType: acctest.Optional, Group: BdsBdsInstanceNetworkConfigRepresentation},
72+
"add_kafka_trigger": acctest.Representation{RepType: acctest.Optional, Create: `0`, Update: `1`},
73+
"execute_bootstrap_script_trigger": acctest.Representation{RepType: acctest.Optional, Create: `0`, Update: `1`},
74+
"remove_kafka_trigger": acctest.Representation{RepType: acctest.Optional, Create: `0`, Update: `1`},
75+
"state": acctest.Representation{RepType: acctest.Optional, Create: `INACTIVE`, Update: `ACTIVE`},
76+
}
77+
78+
BdsBdsInstanceNodesRepresentation = map[string]interface{}{
79+
"shape": acctest.Representation{RepType: acctest.Required, Create: `VM.Standard2.1`, Update: `VM.Standard2.4`},
80+
"subnet_id": acctest.Representation{RepType: acctest.Required, Create: `${oci_core_subnet.test_subnet.id}`},
81+
"block_volume_size_in_gbs": acctest.Representation{RepType: acctest.Required, Create: `150`},
82+
"number_of_nodes": acctest.Representation{RepType: acctest.Required, Create: `3`, Update: `4`},
83+
}
84+
BdsBdsInstanceNetworkConfigRepresentation = map[string]interface{}{
85+
"cidr_block": acctest.Representation{RepType: acctest.Optional, Create: `111.112.0.0/16`},
86+
"is_nat_gateway_required": acctest.Representation{RepType: acctest.Optional, Create: `true`},
87+
}
88+
5689
bdsInstanceOdhRepresentation = map[string]interface{}{
5790
"cluster_admin_password": acctest.Representation{RepType: acctest.Required, Create: `T3JhY2xlVGVhbVVTQSExMjM=`},
5891
"cluster_public_key": acctest.Representation{RepType: acctest.Required, Create: `ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDpUa4zUZKyU3AkW9yoJTBDO550wpWZOXdHswfRq75gbJ2ZYlMtifvwiO3qUL/RIZSC6e1wA5OL2LQ97UaHrLLPXgjvKGVIDRHqPkzTOayjJ4ZA7NPNhcu6f/OxhKkCYF3TAQObhMJmUSMrWSUeufaRIujDz1HHqazxOgFk09fj4i2dcGnfPcm32t8a9MzlsHSmgexYCUwxGisuuWTsnMgxbqsj6DaY51l+SEPi5tf10iFmUWqziF0eKDDQ/jHkwLJ8wgBJef9FSOmwJReHcBY+NviwFTatGj7Cwtnks6CVomsFD+rAMJ9uzM8SCv5agYunx07hnEXbR9r/TXqgXGfN [email protected]`},

internal/service/bds/bds_bds_instance_os_patch_action_resource.go

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ func BdsBdsInstanceOSPatchActionResource() *schema.Resource {
5454
Type: schema.TypeList,
5555
Optional: true,
5656
Computed: true,
57+
ForceNew: true,
58+
MaxItems: 1,
59+
MinItems: 1,
5760
Elem: &schema.Resource{
5861
Schema: map[string]*schema.Schema{
5962
"patching_config_strategy": {
@@ -64,6 +67,7 @@ func BdsBdsInstanceOSPatchActionResource() *schema.Resource {
6467
ValidateFunc: validation.StringInSlice([]string{
6568
"DOWNTIME_BASED",
6669
"BATCHING_BASED",
70+
"DOMAIN_BASED",
6771
}, true),
6872
},
6973

@@ -84,6 +88,18 @@ func BdsBdsInstanceOSPatchActionResource() *schema.Resource {
8488
Optional: true,
8589
Computed: true,
8690
},
91+
92+
"tolerance_threshold_per_domain": {
93+
Type: schema.TypeInt,
94+
Optional: true,
95+
Computed: true,
96+
},
97+
98+
"wait_time_between_domain_in_seconds": {
99+
Type: schema.TypeInt,
100+
Optional: true,
101+
Computed: true,
102+
},
87103
},
88104
},
89105
},
@@ -288,6 +304,7 @@ func (s *BdsBdsInstanceOSPatchActionResourceCrud) mapToPatchingConfigs(fieldKeyF
288304
patchingConfigStrategy = "" // default value
289305
}
290306
switch strings.ToLower(patchingConfigStrategy) {
307+
291308
case strings.ToLower("BATCHING_BASED"):
292309
result := oci_bds.BatchingBasedPatchingConfigs{}
293310

@@ -306,13 +323,27 @@ func (s *BdsBdsInstanceOSPatchActionResourceCrud) mapToPatchingConfigs(fieldKeyF
306323
result.ToleranceThresholdPerBatch = &tmp
307324
}
308325

326+
baseObject = result
327+
case strings.ToLower("DOMAIN_BASED"):
328+
result := oci_bds.DomainBasedPatchingConfigs{}
329+
330+
if waitTimeBetweenDomainInSeconds, ok := s.D.GetOkExists(fmt.Sprintf(fieldKeyFormat, "wait_time_between_domain_in_seconds")); ok {
331+
tmp := waitTimeBetweenDomainInSeconds.(int)
332+
result.WaitTimeBetweenDomainInSeconds = &tmp
333+
}
334+
335+
if toleranceThresholdPerDomain, ok := s.D.GetOkExists(fmt.Sprintf(fieldKeyFormat, "tolerance_threshold_per_domain")); ok {
336+
tmp := toleranceThresholdPerDomain.(int)
337+
result.ToleranceThresholdPerDomain = &tmp
338+
}
339+
309340
baseObject = result
310341
case strings.ToLower("DOWNTIME_BASED"):
311342
result := oci_bds.DowntimeBasedPatchingConfigs{}
312343
baseObject = result
313344

314345
default:
315-
return baseObject, nil
346+
return nil, fmt.Errorf("unknown patching_config_strategy '%v' was specified", patchingConfigStrategy)
316347
}
317348
return baseObject, nil
318349
}

0 commit comments

Comments
 (0)