Skip to content

Commit f8daea2

Browse files
Terraform Team Automationsagarp337
authored andcommitted
Bug Fix - adding fix for cloudguard detector rule condition paramter unmarshalling issue
1 parent 4a6958b commit f8daea2

File tree

2 files changed

+120
-5
lines changed

2 files changed

+120
-5
lines changed

internal/integrationtest/cloud_guard_detector_recipe_test.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,86 @@ func TestCloudGuardDetectorRecipeResource_basic(t *testing.T) {
360360
})
361361
}
362362

363+
func TestCloudGuardDetectorRecipeResource_updateOptionalParamsWithoutDestroy(t *testing.T) {
364+
httpreplay.SetScenario("TestCloudGuardDetectorRecipeResource_basic")
365+
defer httpreplay.SaveScenario()
366+
367+
config := acctest.ProviderTestConfig()
368+
369+
compartmentId := utils.GetEnvSettingWithBlankDefault("compartment_ocid")
370+
compartmentIdVariableStr := fmt.Sprintf("variable \"compartment_id\" { default = \"%s\" }\n", compartmentId)
371+
372+
resourceName := "oci_cloud_guard_detector_recipe.test_detector_recipe"
373+
var resId string
374+
// 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.
375+
acctest.SaveConfigContent(config+compartmentIdVariableStr+CloudGuardDetectorRecipeResourceDependencies+
376+
acctest.GenerateResourceFromRepresentationMap("oci_cloud_guard_detector_recipe", "test_detector_recipe", acctest.Optional, acctest.Create, CloudGuardDetectorRecipeRepresentation), "cloudguard", "detectorRecipe", t)
377+
378+
acctest.ResourceTest(t, testAccCheckCloudGuardDetectorRecipeDestroy, []resource.TestStep{
379+
// verify Create Recipe
380+
{
381+
Config: config + compartmentIdVariableStr + CloudGuardDetectorRecipeResourceDependencies +
382+
acctest.GenerateResourceFromRepresentationMap("oci_cloud_guard_detector_recipe", "test_detector_recipe", acctest.Required, acctest.Create, CloudGuardDetectorRecipeRepresentation),
383+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
384+
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
385+
resource.TestCheckResourceAttr(resourceName, "display_name", "displayName"),
386+
resource.TestCheckResourceAttrSet(resourceName, "source_detector_recipe_id"),
387+
388+
func(s *terraform.State) (err error) {
389+
resId, err = acctest.FromInstanceState(s, resourceName, "id")
390+
return err
391+
},
392+
),
393+
},
394+
// verify Create with optionals
395+
{
396+
Config: config + compartmentIdVariableStr + CloudGuardDetectorRecipeResourceDependencies +
397+
acctest.GenerateResourceFromRepresentationMap("oci_cloud_guard_detector_recipe", "test_detector_recipe", acctest.Optional, acctest.Create, CloudGuardDetectorRecipeRepresentation),
398+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
399+
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
400+
resource.TestCheckResourceAttr(resourceName, "description", "description"),
401+
resource.TestCheckResourceAttr(resourceName, "detector", "IAAS_CONFIGURATION_DETECTOR"),
402+
resource.TestCheckResourceAttr(resourceName, "detector_rules.#", "1"),
403+
resource.TestCheckResourceAttr(resourceName, "detector_rules.0.details.#", "1"),
404+
//Just checking it being set, it being a JSON
405+
resource.TestCheckResourceAttr(resourceName, "detector_rules.0.details.0.condition", "{\"kind\":\"SIMPLE\",\"parameter\":\"lbCertificateExpiringSoonFilter\",\"value\":\"10\",\"operator\":\"EQUALS\",\"valueType\":\"CUSTOM\"}"),
406+
resource.TestCheckResourceAttr(resourceName, "detector_rules.0.details.0.configurations.#", "1"),
407+
resource.TestCheckResourceAttr(resourceName, "detector_rules.0.details.0.configurations.0.config_key", "lbCertificateExpiringSoonConfig"),
408+
resource.TestCheckResourceAttr(resourceName, "detector_rules.0.details.0.configurations.0.data_type", "int"),
409+
resource.TestCheckResourceAttr(resourceName, "detector_rules.0.details.0.configurations.0.name", "Days before expiring"),
410+
resource.TestCheckResourceAttr(resourceName, "detector_rules.0.details.0.configurations.0.value", "30"),
411+
// Configuration values will be set only if data_type is complex such as multiList
412+
resource.TestCheckResourceAttr(resourceName, "detector_rules.0.details.0.configurations.0.values.#", "0"),
413+
//resource.TestCheckResourceAttr(resourceName, "detector_rules.0.details.0.configurations.0.values.0.list_type", "CUSTOM"),
414+
//resource.TestCheckResourceAttr(resourceName, "detector_rules.0.details.0.configurations.0.values.0.managed_list_type", "RESOURCE_OCID"),
415+
//resource.TestCheckResourceAttr(resourceName, "detector_rules.0.details.0.configurations.0.values.0.value", "resourceOcid1"),
416+
resource.TestCheckResourceAttr(resourceName, "detector_rules.0.details.0.is_enabled", "false"),
417+
resource.TestCheckResourceAttr(resourceName, "detector_rules.0.details.0.labels.#", "1"),
418+
resource.TestCheckResourceAttr(resourceName, "detector_rules.0.details.0.risk_level", "CRITICAL"),
419+
resource.TestCheckResourceAttrSet(resourceName, "detector_rules.0.detector"),
420+
resource.TestCheckResourceAttrSet(resourceName, "detector_rules.0.detector_rule_id"),
421+
resource.TestCheckResourceAttrSet(resourceName, "detector_rules.0.resource_type"),
422+
resource.TestCheckResourceAttrSet(resourceName, "detector_rules.0.service_type"),
423+
resource.TestCheckResourceAttr(resourceName, "display_name", "displayName"),
424+
resource.TestCheckResourceAttr(resourceName, "freeform_tags.%", "1"),
425+
resource.TestCheckResourceAttrSet(resourceName, "id"),
426+
resource.TestCheckResourceAttrSet(resourceName, "owner"),
427+
resource.TestCheckResourceAttrSet(resourceName, "source_detector_recipe_id"),
428+
429+
func(s *terraform.State) (err error) {
430+
resId, err = acctest.FromInstanceState(s, resourceName, "id")
431+
if isEnableExportCompartment, _ := strconv.ParseBool(utils.GetEnvSettingWithDefault("enable_export_compartment", "true")); isEnableExportCompartment {
432+
if errExport := resourcediscovery.TestExportCompartmentWithResourceName(&resId, &compartmentId, resourceName); errExport != nil {
433+
return errExport
434+
}
435+
}
436+
return err
437+
},
438+
),
439+
},
440+
})
441+
}
442+
363443
func testAccCheckCloudGuardDetectorRecipeDestroy(s *terraform.State) error {
364444
noResourceFound := true
365445
client := acctest.TestAccProvider.Meta().(*tf_client.OracleClients).CloudGuardClient()

internal/service/cloud_guard/cloud_guard_detector_recipe_resource.go

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ package cloud_guard
66
import (
77
"context"
88
"encoding/json"
9+
"errors"
910
"fmt"
11+
"strings"
1012

1113
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1214

@@ -1118,12 +1120,13 @@ func (s *CloudGuardDetectorRecipeResourceCrud) mapToUpdateDetectorRuleDetails(fi
11181120
//Condition Modelling
11191121
if condition, ok := s.D.GetOkExists(fmt.Sprintf(fieldKeyFormat, "condition")); ok {
11201122
tmp := condition.(string)
1121-
var conditionObj oci_cloud_guard.Condition
1122-
err := json.Unmarshal([]byte(tmp), &conditionObj)
1123-
if err != nil {
1124-
return result, err
1123+
if len(strings.TrimSpace(tmp)) > 0 {
1124+
var err error
1125+
result.Condition, err = jsonToCondition(tmp)
1126+
if err != nil {
1127+
return result, err
1128+
}
11251129
}
1126-
result.Condition = &conditionObj
11271130
}
11281131

11291132
if configurations, ok := s.D.GetOkExists(fmt.Sprintf(fieldKeyFormat, "configurations")); ok {
@@ -1200,6 +1203,38 @@ func (s *CloudGuardDetectorRecipeResourceCrud) mapToUpdateDetectorRuleDetails(fi
12001203
return result, nil
12011204
}
12021205

1206+
func jsonToCondition(data string) (oci_cloud_guard.Condition, error) {
1207+
var val cloudGuardCondition
1208+
var err error
1209+
if err := json.Unmarshal([]byte(data), &val); err == nil {
1210+
if schemaData, err := UnmarshalPolymorphicConditionJSON(val.Kind, data); err == nil {
1211+
return schemaData, nil
1212+
}
1213+
}
1214+
return nil, err
1215+
}
1216+
1217+
type cloudGuardCondition struct {
1218+
JsonData []byte
1219+
Kind string `json:"kind"`
1220+
}
1221+
1222+
func UnmarshalPolymorphicConditionJSON(kind string, data string) (oci_cloud_guard.Condition, error) {
1223+
var err error
1224+
switch kind {
1225+
case "SIMPLE":
1226+
mm := oci_cloud_guard.SimpleCondition{}
1227+
err = json.Unmarshal([]byte(data), &mm)
1228+
return mm, err
1229+
case "COMPOSITE":
1230+
mm := oci_cloud_guard.CompositeCondition{}
1231+
err = json.Unmarshal([]byte(data), &mm)
1232+
return mm, err
1233+
default:
1234+
return nil, errors.New(fmt.Sprintf("Recieved unsupported enum value for Condition : %s.", kind))
1235+
}
1236+
}
1237+
12031238
func (s *CloudGuardDetectorRecipeResourceCrud) updateCompartment(compartment interface{}) error {
12041239
changeCompartmentRequest := oci_cloud_guard.ChangeDetectorRecipeCompartmentRequest{}
12051240

0 commit comments

Comments
 (0)