Skip to content

Commit f8a9dfb

Browse files
bh-orclMaxrovr
authored andcommitted
Bug Fix - Fix using security_attributes in UpdateInstance and add tests
1 parent 87aaa3c commit f8a9dfb

File tree

3 files changed

+159
-4
lines changed

3 files changed

+159
-4
lines changed

internal/integrationtest/core_instance_resource_test.go

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2602,6 +2602,137 @@ func (s *ResourceCoreInstanceTestSuite) TestAccResourceCoreInstance_launchOption
26022602
})
26032603
}
26042604

2605+
func TestResourceCoreInstance_UpdateSecurityAttributes(t *testing.T) {
2606+
httpreplay.SetScenario("TestAccResourceCoreInstance_securityAttributes")
2607+
defer httpreplay.SaveScenario()
2608+
2609+
instanceName := "t"
2610+
instanceResourceKey := "oci_core_instance." + instanceName
2611+
2612+
subnetConfig := acctest.GenerateResourceFromRepresentationMap("oci_core_subnet", "test_subnet",
2613+
acctest.Required, acctest.Create, acctest.RepresentationCopyWithNewProperties(CoreSubnetRepresentation,
2614+
map[string]interface{}{
2615+
"dns_label": acctest.Representation{RepType: acctest.Required, Create: "dnslabel"},
2616+
}))
2617+
vcnConfig := acctest.GenerateResourceFromRepresentationMap("oci_core_vcn", "test_vcn",
2618+
acctest.Required, acctest.Create, acctest.RepresentationCopyWithNewProperties(CoreVcnRepresentation,
2619+
map[string]interface{}{
2620+
"dns_label": acctest.Representation{RepType: acctest.Required, Create: "dnslabel"},
2621+
}))
2622+
AvailabilityDomainConfig := AvailabilityDomainConfig
2623+
imageConfig := utils.OciImageIdsVariable
2624+
instanceCreateConfig := acctest.GenerateResourceFromRepresentationMap("oci_core_instance", instanceName,
2625+
acctest.Required, acctest.Create, CoreInstanceRepresentation)
2626+
2627+
securityAttributesInstanceConfig := acctest.GenerateResourceFromRepresentationMap("oci_core_instance",
2628+
instanceName, acctest.Required, acctest.Create,
2629+
acctest.RepresentationCopyWithNewProperties(CoreInstanceRepresentation, map[string]interface{}{
2630+
"security_attributes": acctest.Representation{RepType: acctest.Required, Create: map[string]string{
2631+
"oracle-zpr.sensitivity.value": "low",
2632+
"oracle-zpr.sensitivity.mode": "enforce",
2633+
}},
2634+
}))
2635+
changedSecurityAttributesConfig := acctest.GenerateResourceFromRepresentationMap("oci_core_instance",
2636+
instanceName, acctest.Required, acctest.Create,
2637+
acctest.RepresentationCopyWithNewProperties(CoreInstanceRepresentation, map[string]interface{}{
2638+
"security_attributes": acctest.Representation{RepType: acctest.Required, Create: map[string]string{
2639+
"oracle-zpr.sensitivity.value": "medium",
2640+
"oracle-zpr.sensitivity.mode": "enforce",
2641+
}},
2642+
}))
2643+
deletedSecurityAttributesConfig := acctest.GenerateResourceFromRepresentationMap("oci_core_instance",
2644+
instanceName, acctest.Required, acctest.Create,
2645+
acctest.RepresentationCopyWithNewProperties(CoreInstanceRepresentation, map[string]interface{}{
2646+
"security_attributes": acctest.Representation{RepType: acctest.Required, Create: map[string]string{}},
2647+
}))
2648+
securityAttributesTimeoutConfig := acctest.GenerateResourceFromRepresentationMap("oci_core_instance",
2649+
instanceName, acctest.Required, acctest.Create,
2650+
acctest.RepresentationCopyWithNewProperties(CoreInstanceRepresentation, map[string]interface{}{
2651+
"security_attributes": acctest.Representation{RepType: acctest.Required, Create: map[string]string{
2652+
"oracle-zpr.sensitivity.value": "low",
2653+
"oracle-zpr.sensitivity.mode": "enforce",
2654+
}},
2655+
"timeouts": acctest.RepresentationGroup{RepType: acctest.Required, Group: map[string]interface{}{
2656+
"update": acctest.Representation{RepType: acctest.Required, Create: "1s"},
2657+
}},
2658+
}))
2659+
2660+
config := acctest.LegacyTestProviderConfig() + AvailabilityDomainConfig + imageConfig + subnetConfig + vcnConfig
2661+
2662+
var instanceId string
2663+
resource.Test(t, resource.TestCase{
2664+
Providers: map[string]*schema.Provider{
2665+
"oci": acctest.TestAccProvider,
2666+
},
2667+
CheckDestroy: testAccCheckCoreInstanceDestroy,
2668+
Steps: []resource.TestStep{
2669+
{ // Create an instance
2670+
Config: config + instanceCreateConfig,
2671+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
2672+
func(s *terraform.State) (err error) {
2673+
instanceId, err = acctest.FromInstanceState(s, instanceResourceKey, "id")
2674+
return err
2675+
},
2676+
),
2677+
},
2678+
{ // Verify add security_attributes
2679+
Config: config + securityAttributesInstanceConfig,
2680+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
2681+
resource.TestCheckResourceAttr(instanceResourceKey, "security_attributes.%", "2"),
2682+
resource.TestCheckResourceAttr(instanceResourceKey, "security_attributes.oracle-zpr.sensitivity.value", "low"),
2683+
resource.TestCheckResourceAttr(instanceResourceKey, "security_attributes.oracle-zpr.sensitivity.mode", "enforce"),
2684+
func(ts *terraform.State) (err error) {
2685+
newId, err := acctest.FromInstanceState(ts, instanceResourceKey, "id")
2686+
if newId != instanceId {
2687+
return fmt.Errorf("expected same instance ocid, got different")
2688+
}
2689+
return err
2690+
},
2691+
),
2692+
},
2693+
{ // Verify change security_attributes
2694+
Config: config + changedSecurityAttributesConfig,
2695+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
2696+
resource.TestCheckResourceAttr(instanceResourceKey, "security_attributes.%", "2"),
2697+
resource.TestCheckResourceAttr(instanceResourceKey, "security_attributes.oracle-zpr.sensitivity.value", "medium"),
2698+
resource.TestCheckResourceAttr(instanceResourceKey, "security_attributes.oracle-zpr.sensitivity.mode", "enforce"),
2699+
func(ts *terraform.State) (err error) {
2700+
newId, err := acctest.FromInstanceState(ts, instanceResourceKey, "id")
2701+
if newId != instanceId {
2702+
return fmt.Errorf("expected same instance ocid, got different")
2703+
}
2704+
return err
2705+
},
2706+
),
2707+
},
2708+
{ // Verify remove security_attributes
2709+
Config: config + deletedSecurityAttributesConfig,
2710+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
2711+
resource.TestCheckResourceAttr(instanceResourceKey, "security_attributes.%", "0"),
2712+
func(ts *terraform.State) (err error) {
2713+
newId, err := acctest.FromInstanceState(ts, instanceResourceKey, "id")
2714+
if newId != instanceId {
2715+
return fmt.Errorf("expected same instance ocid, got different")
2716+
}
2717+
return err
2718+
},
2719+
),
2720+
},
2721+
{ // Verify update timeout
2722+
Config: config + securityAttributesTimeoutConfig,
2723+
Check: func(ts *terraform.State) (err error) {
2724+
newId, err := acctest.FromInstanceState(ts, instanceResourceKey, "id")
2725+
if newId != instanceId {
2726+
return fmt.Errorf("expected same instance ocid, got different")
2727+
}
2728+
return err
2729+
},
2730+
ExpectError: regexp.MustCompile("Timed out waiting for configuration to reach specified condition"),
2731+
},
2732+
},
2733+
})
2734+
}
2735+
26052736
// issue-routing-tag: core/computeSharedOwnershipVmAndBm
26062737
func TestAccResourceCoreInstance_nvmeVMShape(t *testing.T) {
26072738
httpreplay.SetScenario("TestAccResourceCoreInstance_nvmeVMShape")

internal/integrationtest/core_instance_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,7 @@ var (
338338
"type": acctest.Representation{RepType: acctest.Required, Create: `bootVolume`},
339339
}
340340
CoreInstanceSourceDetailsRepresentation = map[string]interface{}{
341-
"source_id": acctest.Representation{RepType: acctest.Required, Create: `${var.InstanceImageOCID[var.region]`},
341+
"source_id": acctest.Representation{RepType: acctest.Required, Create: `${var.InstanceImageOCID[var.region]}`},
342342
"source_type": acctest.Representation{RepType: acctest.Required, Create: `image`, Update: `image`},
343343
"boot_volume_size_in_gbs": acctest.Representation{RepType: acctest.Optional, Create: `60`, Update: `70`},
344344
"boot_volume_vpus_per_gb": acctest.Representation{RepType: acctest.Optional, Create: `10`},

internal/service/core/core_instance_resource.go

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1620,12 +1620,36 @@ func (s *CoreInstanceResourceCrud) Update() error {
16201620
return err
16211621
}
16221622

1623+
s.Res = &response.Instance
1624+
16231625
if securityAttributes, ok := s.D.GetOkExists("security_attributes"); ok {
1624-
request.SecurityAttributes = tfresource.MapToSecurityAttributes(securityAttributes.(map[string]interface{}))
1626+
if s.D.HasChange("security_attributes") {
1627+
securityAttributesRequest := oci_core.UpdateInstanceRequest{}
1628+
tmp := s.D.Id()
1629+
securityAttributesRequest.InstanceId = &tmp
1630+
securityAttributesRequest.SecurityAttributes = tfresource.MapToSecurityAttributes(securityAttributes.(map[string]interface{}))
1631+
securityAttributesResponse, err := s.Client.UpdateInstance(context.Background(), securityAttributesRequest)
1632+
securityAttributeErrorMsgTemplate := `[ERROR] Failed to update Security Attributes: %q (Instance ID: "%v"`
1633+
if err != nil {
1634+
log.Printf(securityAttributeErrorMsgTemplate+`, desired Security Attributes: %q)`, err, s.Res.Id, securityAttributes)
1635+
return err
1636+
}
1637+
s.Res = &securityAttributesResponse.Instance
1638+
areSecurityAttributesStable := func() bool {
1639+
return s.Res != nil &&
1640+
s.Res.SecurityAttributesState == oci_core.InstanceSecurityAttributesStateStable
1641+
}
1642+
if !areSecurityAttributesStable() {
1643+
log.Printf(`[DEBUG] Waiting for securityAttributesState to become [%s]`, oci_core.InstanceSecurityAttributesStateStable)
1644+
err := tfresource.WaitForResourceCondition(s, areSecurityAttributesStable, s.D.Timeout(schema.TimeoutUpdate))
1645+
if err != nil {
1646+
log.Printf(securityAttributeErrorMsgTemplate+`, timed out waiting for Security Attributes to update)`, err, s.Res.Id)
1647+
return err
1648+
}
1649+
}
1650+
}
16251651
}
16261652

1627-
s.Res = &response.Instance
1628-
16291653
// Check for changes in the create_vnic_details sub resource and separately Update the vnic
16301654
_, ok := s.D.GetOkExists("create_vnic_details")
16311655
if !s.D.HasChange("create_vnic_details") || !ok {

0 commit comments

Comments
 (0)