diff --git a/google/metadata.go b/google/metadata.go index 230b7a16..0d7aa00d 100644 --- a/google/metadata.go +++ b/google/metadata.go @@ -76,19 +76,6 @@ func MetadataUpdate(oldMDMap map[string]interface{}, newMDMap map[string]interfa } } -// Format metadata from the server data format -> schema data format -func MetadataFormatSchema(curMDMap map[string]interface{}, md *compute.Metadata) map[string]interface{} { - newMD := make(map[string]interface{}) - - for _, kv := range md.Items { - if _, ok := curMDMap[kv.Key]; ok { - newMD[kv.Key] = *kv.Value - } - } - - return newMD -} - // flattenComputeMetadata transforms a list of MetadataItems (as returned via the GCP client) into a simple map from key // to value. func flattenComputeMetadata(metadata []*compute.MetadataItems) map[string]string { diff --git a/google/resource_compute_instance.go b/google/resource_compute_instance.go index b1454eac..7462a85d 100644 --- a/google/resource_compute_instance.go +++ b/google/resource_compute_instance.go @@ -843,17 +843,25 @@ func resourceComputeInstanceRead(d *schema.ResourceData, meta interface{}) error return err } - // Synch metadata - md := instance.Metadata + md := flattenMetadata(instance.Metadata) - _md := MetadataFormatSchema(d.Get("metadata").(map[string]interface{}), md) - - if script, scriptExists := d.GetOk("metadata_startup_script"); scriptExists { - d.Set("metadata_startup_script", script) - delete(_md, "startup-script") + if _, scriptExists := d.GetOk("metadata_startup_script"); scriptExists { + d.Set("metadata_startup_script", md["startup-script"]) + // Note that here we delete startup-script from our metadata list. This is to prevent storing the startup-script + // as a value in the metadata since the config specifically tracks it under 'metadata_startup_script' + delete(md, "startup-script") } - if err = d.Set("metadata", _md); err != nil { + existingMetadata := d.Get("metadata").(map[string]interface{}) + + // Delete any keys not explicitly set in our config file + for k := range md { + if _, ok := existingMetadata[k]; !ok { + delete(md, k) + } + } + + if err = d.Set("metadata", md); err != nil { return fmt.Errorf("Error setting metadata: %s", err) } diff --git a/google/resource_compute_project_metadata.go b/google/resource_compute_project_metadata.go index 05919eb3..1814a637 100644 --- a/google/resource_compute_project_metadata.go +++ b/google/resource_compute_project_metadata.go @@ -102,9 +102,16 @@ func resourceComputeProjectMetadataRead(d *schema.ResourceData, meta interface{} return handleNotFoundError(err, d, fmt.Sprintf("Project metadata for project %q", projectID)) } - md := project.CommonInstanceMetadata + md := flattenMetadata(project.CommonInstanceMetadata) + existingMetadata := d.Get("metadata").(map[string]interface{}) + // Remove all keys not explicitly mentioned in the terraform config + for k := range md { + if _, ok := existingMetadata[k]; !ok { + delete(md, k) + } + } - if err = d.Set("metadata", MetadataFormatSchema(d.Get("metadata").(map[string]interface{}), md)); err != nil { + if err = d.Set("metadata", md); err != nil { return fmt.Errorf("Error setting metadata: %s", err) }