Skip to content

Commit e31269d

Browse files
jtopjianstack72
authored andcommitted
provider/openstack: Fix Instance Metadata Deletion (hashicorp#11252)
This commit fixes a bug where instance metadata removed from the configuration was not removed from the actual instance.
1 parent da48ac2 commit e31269d

2 files changed

Lines changed: 96 additions & 4 deletions

File tree

builtin/providers/openstack/resource_openstack_compute_instance_v2.go

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -594,10 +594,34 @@ func resourceComputeInstanceV2Update(d *schema.ResourceData, meta interface{}) e
594594
}
595595

596596
if d.HasChange("metadata") {
597-
var metadataOpts servers.MetadataOpts
598-
metadataOpts = make(servers.MetadataOpts)
599-
newMetadata := d.Get("metadata").(map[string]interface{})
600-
for k, v := range newMetadata {
597+
oldMetadata, newMetadata := d.GetChange("metadata")
598+
var metadataToDelete []string
599+
600+
// Determine if any metadata keys were removed from the configuration.
601+
// Then request those keys to be deleted.
602+
for oldKey, _ := range oldMetadata.(map[string]interface{}) {
603+
var found bool
604+
for newKey, _ := range newMetadata.(map[string]interface{}) {
605+
if oldKey == newKey {
606+
found = true
607+
}
608+
}
609+
610+
if !found {
611+
metadataToDelete = append(metadataToDelete, oldKey)
612+
}
613+
}
614+
615+
for _, key := range metadataToDelete {
616+
err := servers.DeleteMetadatum(computeClient, d.Id(), key).ExtractErr()
617+
if err != nil {
618+
return fmt.Errorf("Error deleting metadata (%s) from server (%s): %s", key, d.Id(), err)
619+
}
620+
}
621+
622+
// Update existing metadata and add any new metadata.
623+
metadataOpts := make(servers.MetadataOpts)
624+
for k, v := range newMetadata.(map[string]interface{}) {
601625
metadataOpts[k] = v.(string)
602626
}
603627

builtin/providers/openstack/resource_openstack_compute_instance_v2_test.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -591,6 +591,35 @@ func TestAccComputeV2Instance_stopBeforeDestroy(t *testing.T) {
591591
})
592592
}
593593

594+
func TestAccComputeV2Instance_metadataRemove(t *testing.T) {
595+
var instance servers.Server
596+
597+
resource.Test(t, resource.TestCase{
598+
PreCheck: func() { testAccPreCheck(t) },
599+
Providers: testAccProviders,
600+
CheckDestroy: testAccCheckComputeV2InstanceDestroy,
601+
Steps: []resource.TestStep{
602+
resource.TestStep{
603+
Config: testAccComputeV2Instance_metadataRemove_1,
604+
Check: resource.ComposeTestCheckFunc(
605+
testAccCheckComputeV2InstanceExists("openstack_compute_instance_v2.instance_1", &instance),
606+
testAccCheckComputeV2InstanceMetadata(&instance, "foo", "bar"),
607+
testAccCheckComputeV2InstanceMetadata(&instance, "abc", "def"),
608+
),
609+
},
610+
resource.TestStep{
611+
Config: testAccComputeV2Instance_metadataRemove_2,
612+
Check: resource.ComposeTestCheckFunc(
613+
testAccCheckComputeV2InstanceExists("openstack_compute_instance_v2.instance_1", &instance),
614+
testAccCheckComputeV2InstanceMetadata(&instance, "foo", "bar"),
615+
testAccCheckComputeV2InstanceMetadata(&instance, "ghi", "jkl"),
616+
testAccCheckComputeV2InstanceNoMetadataKey(&instance, "abc"),
617+
),
618+
},
619+
},
620+
})
621+
}
622+
594623
func testAccCheckComputeV2InstanceDestroy(s *terraform.State) error {
595624
config := testAccProvider.Meta().(*Config)
596625
computeClient, err := config.computeV2Client(OS_REGION_NAME)
@@ -687,6 +716,23 @@ func testAccCheckComputeV2InstanceMetadata(
687716
}
688717
}
689718

719+
func testAccCheckComputeV2InstanceNoMetadataKey(
720+
instance *servers.Server, k string) resource.TestCheckFunc {
721+
return func(s *terraform.State) error {
722+
if instance.Metadata == nil {
723+
return nil
724+
}
725+
726+
for key, _ := range instance.Metadata {
727+
if k == key {
728+
return fmt.Errorf("Metadata found: %s", k)
729+
}
730+
}
731+
732+
return nil
733+
}
734+
}
735+
690736
func testAccCheckComputeV2InstanceVolumeAttachment(
691737
instance *servers.Server, volume *volumes.Volume) resource.TestCheckFunc {
692738
return func(s *terraform.State) error {
@@ -1445,3 +1491,25 @@ resource "openstack_compute_instance_v2" "instance_1" {
14451491
stop_before_destroy = true
14461492
}
14471493
`
1494+
1495+
const testAccComputeV2Instance_metadataRemove_1 = `
1496+
resource "openstack_compute_instance_v2" "instance_1" {
1497+
name = "instance_1"
1498+
security_groups = ["default"]
1499+
metadata {
1500+
foo = "bar"
1501+
abc = "def"
1502+
}
1503+
}
1504+
`
1505+
1506+
const testAccComputeV2Instance_metadataRemove_2 = `
1507+
resource "openstack_compute_instance_v2" "instance_1" {
1508+
name = "instance_1"
1509+
security_groups = ["default"]
1510+
metadata {
1511+
foo = "bar"
1512+
ghi = "jkl"
1513+
}
1514+
}
1515+
`

0 commit comments

Comments
 (0)