Skip to content

Commit c520003

Browse files
author
Ravi Tandon
committed
Unreverted: Add a customdiff into Instance resource to track nested metadata properties that require instance to be re-created
This reverts commit 0f3cdc2.
1 parent f108ee8 commit c520003

File tree

9 files changed

+328
-30
lines changed

9 files changed

+328
-30
lines changed

oci/core_instance_resource.go

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import (
1111
"strconv"
1212
"strings"
1313

14+
"github.com/hashicorp/terraform/helper/customdiff"
15+
1416
"github.com/hashicorp/terraform/helper/schema"
1517
"github.com/hashicorp/terraform/helper/validation"
1618

@@ -328,6 +330,15 @@ func InstanceResource() *schema.Resource {
328330
Computed: true,
329331
},
330332
},
333+
// CustomizeDiff for Instance resource
334+
// Updates of 'ssh_authorized_keys' and 'user_data' in Instance 'metadata' should result in Force New
335+
CustomizeDiff: customdiff.All(
336+
customdiff.ForceNewIfChange("metadata", func(old, new, meta interface{}) bool {
337+
oldMetadataMap := objectMapToStringMap(old.(map[string]interface{}))
338+
newMetadataMap := objectMapToStringMap(new.(map[string]interface{}))
339+
return (oldMetadataMap["ssh_authorized_keys"] != newMetadataMap["ssh_authorized_keys"]) || (oldMetadataMap["user_data"] != newMetadataMap["user_data"])
340+
}),
341+
),
331342
}
332343
}
333344

@@ -576,16 +587,6 @@ func (s *InstanceResourceCrud) Update() error {
576587

577588
response, err := s.Client.UpdateInstance(context.Background(), request)
578589
if err != nil {
579-
if response.RawResponse.StatusCode == 400 &&
580-
strings.Contains(err.Error(), "metadata field cannot be updated") {
581-
return fmt.Errorf(`%s
582-
583-
To change 'ssh_authorized_keys' or 'user_data' properties in the
584-
'metadata' field, the resource must be tainted and recreated.
585-
Use the terraform "taint" command to target this resource then
586-
run apply again.`, err)
587-
}
588-
589590
return err
590591
}
591592

oci/core_instance_resource_test.go

Lines changed: 72 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ func (s *ResourceCoreInstanceTestSuite) TestAccResourceCoreInstance_basic() {
8888
freeform_tags = { "Department" = "Accounting"}
8989
metadata {
9090
ssh_authorized_keys = "${var.ssh_public_key}"
91-
user_data = "SWYgeW91IGNhbiBzZWUgdGhpcywgdGhlbiBpdCB3b3JrZWQgbWF5YmUuCg=="
91+
user_data = "ZWNobyBoZWxsbw=="
9292
}
9393
extended_metadata {
9494
keyA = "valA"
@@ -118,7 +118,7 @@ func (s *ResourceCoreInstanceTestSuite) TestAccResourceCoreInstance_basic() {
118118
resource.TestCheckResourceAttr(s.ResourceName, "hostname_label", "hostname1"),
119119
resource.TestCheckResourceAttr(s.ResourceName, "shape", "VM.Standard2.1"),
120120
resource.TestCheckResourceAttr(s.ResourceName, "metadata.%", "2"),
121-
resource.TestCheckResourceAttr(s.ResourceName, "metadata.user_data", "SWYgeW91IGNhbiBzZWUgdGhpcywgdGhlbiBpdCB3b3JrZWQgbWF5YmUuCg=="),
121+
resource.TestCheckResourceAttr(s.ResourceName, "metadata.user_data", "ZWNobyBoZWxsbw=="),
122122
resource.TestCheckResourceAttrSet(s.ResourceName, "metadata.ssh_authorized_keys"),
123123
resource.TestCheckResourceAttr(s.ResourceName, "extended_metadata.%", "2"),
124124
resource.TestCheckResourceAttr(s.ResourceName, "extended_metadata.keyA", "valA"),
@@ -160,7 +160,7 @@ func (s *ResourceCoreInstanceTestSuite) TestAccResourceCoreInstance_basic() {
160160
shape = "VM.Standard2.1"
161161
metadata {
162162
ssh_authorized_keys = "${var.ssh_public_key}"
163-
user_data = "SWYgeW91IGNhbiBzZWUgdGhpcywgdGhlbiBpdCB3b3JrZWQgbWF5YmUuCg=="
163+
user_data = "ZWNobyBoZWxsbw=="
164164
}
165165
extended_metadata {
166166
keyA = "valA"
@@ -189,7 +189,7 @@ func (s *ResourceCoreInstanceTestSuite) TestAccResourceCoreInstance_basic() {
189189
shape = "VM.Standard2.1"
190190
metadata {
191191
ssh_authorized_keys = "${var.ssh_public_key}"
192-
user_data = "SWYgeW91IGNhbiBzZWUgdGhpcywgdGhlbiBpdCB3b3JrZWQgbWF5YmUuCg=="
192+
user_data = "ZWNobyBoZWxsbw=="
193193
}
194194
extended_metadata {
195195
keyA = "valA"
@@ -216,10 +216,10 @@ func (s *ResourceCoreInstanceTestSuite) TestAccResourceCoreInstance_basic() {
216216
defined_tags = "${map(
217217
"${oci_identity_tag_namespace.tag-namespace1.name}.${oci_identity_tag.tag1.name}", "value2"
218218
)}"
219-
freeform_tags = { "CostCenter" = "42"}
219+
freeform_tags = { "CostCenter" = "42"}
220220
metadata {
221221
ssh_authorized_keys = "${var.ssh_public_key}"
222-
user_data = "SWYgeW91IGNhbiBzZWUgdGhpcywgdGhlbiBpdCB3b3JrZWQgbWF5YmUuCg=="
222+
user_data = "ZWNobyBoZWxsbw=="
223223
}
224224
extended_metadata {
225225
keyA = "valA"
@@ -249,7 +249,7 @@ func (s *ResourceCoreInstanceTestSuite) TestAccResourceCoreInstance_basic() {
249249
subnet_id = "${oci_core_subnet.t.id}"
250250
metadata {
251251
ssh_authorized_keys = "${var.ssh_public_key}"
252-
user_data = "SWYgeW91IGNhbiBzZWUgdGhpcywgdGhlbiBpdCB3b3JrZWQgbWF5YmUuCg=="
252+
user_data = "ZWNobyBoZWxsbw=="
253253
}
254254
extended_metadata {
255255
keyA = "valA"
@@ -296,7 +296,7 @@ func (s *ResourceCoreInstanceTestSuite) TestAccResourceCoreInstance_basic() {
296296
subnet_id = "${oci_core_subnet.t.id}"
297297
metadata {
298298
ssh_authorized_keys = "${var.ssh_public_key}"
299-
user_data = "SWYgeW91IGNhbiBzZWUgdGhpcywgdGhlbiBpdCB3b3JrZWQgbWF5YmUuCg=="
299+
user_data = "ZWNobyBoZWxsbw=="
300300
}
301301
extended_metadata {
302302
keyA = "valA"
@@ -330,7 +330,7 @@ func (s *ResourceCoreInstanceTestSuite) TestAccResourceCoreInstance_basic() {
330330
subnet_id = "${oci_core_subnet.t.id}"
331331
metadata {
332332
ssh_authorized_keys = "${var.ssh_public_key}"
333-
user_data = "SWYgeW91IGNhbiBzZWUgdGhpcywgdGhlbiBpdCB3b3JrZWQgbWF5YmUuCg=="
333+
user_data = "ZWNobyBoZWxsbw=="
334334
}
335335
extended_metadata {
336336
keyA = "valA"
@@ -378,7 +378,7 @@ func (s *ResourceCoreInstanceTestSuite) TestAccResourceCoreInstance_basic() {
378378
display_name = "-tf-instance"
379379
metadata {
380380
ssh_authorized_keys = "${var.ssh_public_key}"
381-
user_data = "SWYgeW91IGNhbiBzZWUgdGhpcywgdGhlbiBpdCB3b3JrZWQgbWF5YmUuCg=="
381+
user_data = "ZWNobyBoZWxsbw=="
382382
}
383383
extended_metadata {
384384
keyA = "valA"
@@ -393,7 +393,7 @@ func (s *ResourceCoreInstanceTestSuite) TestAccResourceCoreInstance_basic() {
393393
defined_tags = "${map(
394394
"${oci_identity_tag_namespace.tag-namespace1.name}.${oci_identity_tag.tag1.name}", "value"
395395
)}"
396-
freeform_tags = { "Department" = "Accounting" }
396+
freeform_tags = { "Department" = "Accounting" }
397397
}
398398
}
399399
data "oci_core_vnic_attachments" "t" {
@@ -433,7 +433,7 @@ func (s *ResourceCoreInstanceTestSuite) TestAccResourceCoreInstance_basic() {
433433
display_name = "-tf-instance"
434434
metadata {
435435
ssh_authorized_keys = "${var.ssh_public_key}"
436-
user_data = "SWYgeW91IGNhbiBzZWUgdGhpcywgdGhlbiBpdCB3b3JrZWQgbWF5YmUuCg=="
436+
user_data = "ZWNobyBoZWxsbw=="
437437
}
438438
extended_metadata {
439439
keyA = "valA"
@@ -448,7 +448,7 @@ func (s *ResourceCoreInstanceTestSuite) TestAccResourceCoreInstance_basic() {
448448
defined_tags = "${map(
449449
"${oci_identity_tag_namespace.tag-namespace1.name}.${oci_identity_tag.tag1.name}", "updatedValue"
450450
)}"
451-
freeform_tags = { "Department" = "Finance" }
451+
freeform_tags = { "Department" = "Finance" }
452452
}
453453
}
454454
data "oci_core_vnic_attachments" "t" {
@@ -471,6 +471,58 @@ func (s *ResourceCoreInstanceTestSuite) TestAccResourceCoreInstance_basic() {
471471
},
472472
),
473473
},
474+
// verify force new by changing ssh_authorized_keys and user_data in metadata
475+
{
476+
Config: s.Config + `
477+
resource "oci_core_instance" "t" {
478+
availability_domain = "${data.oci_identity_availability_domains.ADs.availability_domains.0.name}"
479+
compartment_id = "${var.compartment_id}"
480+
image = "${var.InstanceImageOCID[var.region]}"
481+
shape = "VM.Standard1.8"
482+
display_name = "-tf-instance"
483+
metadata {
484+
ssh_authorized_keys = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDOuBJgh6lTmQvQJ4BA3RCJdSmxRtmiXAQEEIP68/G4gF3XuZdKEYTFeputacmRq9yO5ZnNXgO9akdUgePpf8+CfFtveQxmN5xo3HVCDKxu/70lbMgeu7+wJzrMOlzj+a4zNq2j0Ww2VWMsisJ6eV3bJTnO/9VLGCOC8M9noaOlcKcLgIYy4aDM724MxFX2lgn7o6rVADHRxkvLEXPVqYT4syvYw+8OVSnNgE4MJLxaw8/2K0qp19YlQyiriIXfQpci3ThxwLjymYRPj+kjU1xIxv6qbFQzHR7ds0pSWp1U06cIoKPfCazU9hGWW8yIe/vzfTbWrt2DK6pLwBn/G0x3 sample"
485+
user_data = "ZWNobyB3b3JsZA=="
486+
}
487+
extended_metadata {
488+
keyA = "valA"
489+
keyB = "{\"keyB1\": \"valB1\", \"keyB2\": {\"keyB2\": \"valB2\"}}"
490+
}
491+
create_vnic_details {
492+
subnet_id = "${oci_core_subnet.t.id}"
493+
display_name = "-tf-vnic-2"
494+
assign_public_ip = false
495+
private_ip = "10.0.1.20"
496+
skip_source_dest_check = true
497+
defined_tags = "${map(
498+
"${oci_identity_tag_namespace.tag-namespace1.name}.${oci_identity_tag.tag1.name}", "updatedValue"
499+
)}"
500+
freeform_tags = { "Department" = "Finance" }
501+
}
502+
}
503+
data "oci_core_vnic_attachments" "t" {
504+
compartment_id = "${var.compartment_id}"
505+
instance_id = "${oci_core_instance.t.id}"
506+
}
507+
data "oci_core_vnic" "t" {
508+
vnic_id = "${lookup(data.oci_core_vnic_attachments.t.vnic_attachments[0],"vnic_id")}"
509+
}`,
510+
Check: resource.ComposeAggregateTestCheckFunc(
511+
resource.TestCheckResourceAttr(s.ResourceName, "display_name", "-tf-instance"),
512+
resource.TestCheckResourceAttr(s.ResourceName, "private_ip", "10.0.1.20"),
513+
resource.TestCheckResourceAttr(s.ResourceName, "metadata.%", "2"),
514+
resource.TestCheckResourceAttr(s.ResourceName, "metadata.ssh_authorized_keys", "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDOuBJgh6lTmQvQJ4BA3RCJdSmxRtmiXAQEEIP68/G4gF3XuZdKEYTFeputacmRq9yO5ZnNXgO9akdUgePpf8+CfFtveQxmN5xo3HVCDKxu/70lbMgeu7+wJzrMOlzj+a4zNq2j0Ww2VWMsisJ6eV3bJTnO/9VLGCOC8M9noaOlcKcLgIYy4aDM724MxFX2lgn7o6rVADHRxkvLEXPVqYT4syvYw+8OVSnNgE4MJLxaw8/2K0qp19YlQyiriIXfQpci3ThxwLjymYRPj+kjU1xIxv6qbFQzHR7ds0pSWp1U06cIoKPfCazU9hGWW8yIe/vzfTbWrt2DK6pLwBn/G0x3 sample"),
515+
resource.TestCheckResourceAttr(s.ResourceName, "metadata.user_data", "ZWNobyB3b3JsZA=="),
516+
func(ts *terraform.State) (err error) {
517+
newId, err := fromInstanceState(ts, s.ResourceName, "id")
518+
if newId == instanceId {
519+
return fmt.Errorf("expected new instance ocid, got the same")
520+
}
521+
instanceId = newId
522+
return err
523+
},
524+
),
525+
},
474526
},
475527
})
476528
}
@@ -503,7 +555,7 @@ func (s *ResourceCoreInstanceTestSuite) TestAccResourceCoreInstance_preserveBoot
503555
shape = "VM.Standard2.1"
504556
metadata {
505557
ssh_authorized_keys = "${var.ssh_public_key}"
506-
user_data = "SWYgeW91IGNhbiBzZWUgdGhpcywgdGhlbiBpdCB3b3JrZWQgbWF5YmUuCg=="
558+
user_data = "ZWNobyBoZWxsbw=="
507559
}
508560
timeouts {
509561
create = "15m"
@@ -529,7 +581,7 @@ func (s *ResourceCoreInstanceTestSuite) TestAccResourceCoreInstance_preserveBoot
529581
resource.TestCheckResourceAttr(s.ResourceName, "hostname_label", "hostname1"),
530582
resource.TestCheckResourceAttr(s.ResourceName, "shape", "VM.Standard2.1"),
531583
resource.TestCheckResourceAttr(s.ResourceName, "metadata.%", "2"),
532-
resource.TestCheckResourceAttr(s.ResourceName, "metadata.user_data", "SWYgeW91IGNhbiBzZWUgdGhpcywgdGhlbiBpdCB3b3JrZWQgbWF5YmUuCg=="),
584+
resource.TestCheckResourceAttr(s.ResourceName, "metadata.user_data", "ZWNobyBoZWxsbw=="),
533585
resource.TestCheckResourceAttrSet(s.ResourceName, "metadata.ssh_authorized_keys"),
534586
resource.TestCheckResourceAttrSet(s.ResourceName, "region"),
535587
resource.TestCheckResourceAttr(s.ResourceName, "create_vnic_details.#", "1"),
@@ -564,7 +616,7 @@ func (s *ResourceCoreInstanceTestSuite) TestAccResourceCoreInstance_preserveBoot
564616
shape = "VM.Standard2.1"
565617
metadata {
566618
ssh_authorized_keys = "${var.ssh_public_key}"
567-
user_data = "SWYgeW91IGNhbiBzZWUgdGhpcywgdGhlbiBpdCB3b3JrZWQgbWF5YmUuCg=="
619+
user_data = "ZWNobyBoZWxsbw=="
568620
}
569621
timeouts {
570622
create = "15m"
@@ -589,7 +641,7 @@ func (s *ResourceCoreInstanceTestSuite) TestAccResourceCoreInstance_preserveBoot
589641
shape = "VM.Standard2.1"
590642
metadata {
591643
ssh_authorized_keys = "${var.ssh_public_key}"
592-
user_data = "SWYgeW91IGNhbiBzZWUgdGhpcywgdGhlbiBpdCB3b3JrZWQgbWF5YmUuCg=="
644+
user_data = "ZWNobyBoZWxsbw=="
593645
}
594646
timeouts {
595647
create = "15m"
@@ -639,7 +691,7 @@ func (s *ResourceCoreInstanceTestSuite) TestAccResourceCoreInstance_preserveBoot
639691
shape = "VM.Standard2.1"
640692
metadata {
641693
ssh_authorized_keys = "${var.ssh_public_key}"
642-
user_data = "SWYgeW91IGNhbiBzZWUgdGhpcywgdGhlbiBpdCB3b3JrZWQgbWF5YmUuCg=="
694+
user_data = "ZWNobyBoZWxsbw=="
643695
}
644696
timeouts {
645697
create = "15m"
@@ -696,7 +748,7 @@ func (s *ResourceCoreInstanceTestSuite) TestAccResourceCoreInstance_preserveBoot
696748
shape = "VM.Standard2.1"
697749
metadata {
698750
ssh_authorized_keys = "${var.ssh_public_key}"
699-
user_data = "SWYgeW91IGNhbiBzZWUgdGhpcywgdGhlbiBpdCB3b3JrZWQgbWF5YmUuCg=="
751+
user_data = "ZWNobyBoZWxsbw=="
700752
}
701753
timeouts {
702754
create = "15m"
@@ -747,7 +799,7 @@ func (s *ResourceCoreInstanceTestSuite) TestAccResourceCoreInstance_preserveBoot
747799
shape = "VM.Standard2.1"
748800
metadata {
749801
ssh_authorized_keys = "${var.ssh_public_key}"
750-
user_data = "SWYgeW91IGNhbiBzZWUgdGhpcywgdGhlbiBpdCB3b3JrZWQgbWF5YmUuCg=="
802+
user_data = "ZWNobyBoZWxsbw=="
751803
}
752804
timeouts {
753805
create = "15m"

vendor/github.com/hashicorp/terraform/helper/customdiff/compose.go

Lines changed: 72 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/hashicorp/terraform/helper/customdiff/computed.go

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)