Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,12 @@ func dataSourceGoogleComputeInstanceRead(d *schema.ResourceData, meta interface{
return transport_tpg.HandleDataSourceNotFoundError(err, d, fmt.Sprintf("Instance %s", name), id)
}

md := flattenMetadataBeta(instance.Metadata)
md := make(map[string]string)
if instance.Metadata != nil {
for _, item := range instance.Metadata.Items {
md[item.Key] = *item.Value
}
}
if err = d.Set("metadata", md); err != nil {
return fmt.Errorf("error setting metadata: %s", err)
}
Expand Down
153 changes: 17 additions & 136 deletions mmv1/third_party/terraform/services/compute/metadata.go.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,8 @@ import (
"google.golang.org/api/googleapi"
"reflect"
{{- end }}
"sort"

{{ if eq $.TargetVersionName `ga` }}
"google.golang.org/api/compute/v1"
{{- else }}
{{- if ne $.TargetVersionName "ga" }}
compute "google.golang.org/api/compute/v0.beta"
{{- end }}

Expand All @@ -29,150 +26,34 @@ func MetadataRetryWrapper(update func() error) error {
return transport_tpg.MetadataRetryWrapper(update)
}

// Update the metadata (serverMD) according to the provided diff (oldMDMap v
// newMDMap).
func MetadataUpdate(oldMDMap map[string]interface{}, newMDMap map[string]interface{}, serverMD *compute.Metadata) {
curMDMap := make(map[string]string)
// Load metadata on server into map
for _, kv := range serverMD.Items {
// If the server state has a key that we had in our old
// state, but not in our new state, we should delete it
_, okOld := oldMDMap[kv.Key]
_, okNew := newMDMap[kv.Key]
if okOld && !okNew {
continue
} else {
curMDMap[kv.Key] = *kv.Value
}
}

// Insert new metadata into existing metadata (overwriting when needed)
for key, val := range newMDMap {
curMDMap[key] = val.(string)
}

// Reformat old metadata into a list
serverMD.Items = nil
for key, val := range curMDMap {
v := val
serverMD.Items = append(serverMD.Items, &compute.MetadataItems{
Key: key,
Value: &v,
})
func expandComputeMetadata(m map[string]interface{}) map[string]string {
result := make(map[string]string, len(m))
for k, v := range m {
result[k] = v.(string)
}
return result
}

// Update the beta metadata (serverMD) according to the provided diff (oldMDMap v
// newMDMap).
func BetaMetadataUpdate(oldMDMap map[string]interface{}, newMDMap map[string]interface{}, serverMD *compute.Metadata) {
curMDMap := make(map[string]string)
// Load metadata on server into map
for _, kv := range serverMD.Items {
// If the server state has a key that we had in our old
// state, but not in our new state, we should delete it
_, okOld := oldMDMap[kv.Key]
_, okNew := newMDMap[kv.Key]
if okOld && !okNew {
continue
} else {
curMDMap[kv.Key] = *kv.Value
}
}

// Insert new metadata into existing metadata (overwriting when needed)
for key, val := range newMDMap {
curMDMap[key] = val.(string)
}

// Reformat old metadata into a list
serverMD.Items = nil
for key, val := range curMDMap {
v := val
serverMD.Items = append(serverMD.Items, &compute.MetadataItems{
Key: key,
Value: &v,
})
}
}

func expandComputeMetadata(m map[string]interface{}) []*compute.MetadataItems {
metadata := make([]*compute.MetadataItems, 0, len(m))
var keys []string
for key := range m {
keys = append(keys, key)
}
sort.Strings(keys)
// Append new metadata to existing metadata
for _, key := range keys {
v := m[key].(string)
metadata = append(metadata, &compute.MetadataItems{
Key: key,
Value: &v,
})
}

return metadata
}

func flattenMetadataBeta(metadata *compute.Metadata) map[string]string {
metadataMap := make(map[string]string)
if metadata == nil {
return metadataMap
}
for _, item := range metadata.Items {
metadataMap[item.Key] = *item.Value
}
return metadataMap
}

// This function differs from flattenMetadataBeta only in that it takes
// compute.metadata rather than compute.metadata as an argument. It should
// be removed in favour of flattenMetadataBeta if/when all resources using it get
// beta support.
func FlattenMetadata(metadata *compute.Metadata) map[string]interface{} {
metadataMap := make(map[string]interface{})
if metadata == nil {
return metadataMap
}
for _, item := range metadata.Items {
metadataMap[item.Key] = *item.Value
}
return metadataMap
}

func resourceInstanceMetadata(d tpgresource.TerraformResourceData) (*compute.Metadata, error) {
m := &compute.Metadata{}
func resourceInstanceMetadata(d tpgresource.TerraformResourceData) (map[string]string, string, error) {
mdMap := d.Get("metadata").(map[string]interface{})
if v, ok := d.GetOk("metadata_startup_script"); ok && v.(string) != "" {
if w, ok := mdMap["startup-script"]; ok {
// metadata.startup-script could be from metadata_startup_script in the first place
if v != w {
return nil, errors.New("Cannot provide both metadata_startup_script and metadata.startup-script.")
return nil, "", errors.New("Cannot provide both metadata_startup_script and metadata.startup-script.")
}
}
mdMap["startup-script"] = v
}
if len(mdMap) > 0 {
m.Items = make([]*compute.MetadataItems, 0, len(mdMap))
var keys []string
for k := range mdMap {
keys = append(keys, k)
}
sort.Strings(keys)
for _, k := range keys {
v := mdMap[k].(string)
m.Items = append(m.Items, &compute.MetadataItems{
Key: k,
Value: &v,
})
}

// Set the fingerprint. If the metadata has never been set before
// then this will just be blank.
m.Fingerprint = d.Get("metadata_fingerprint").(string)
items := make(map[string]string, len(mdMap))
for k, v := range mdMap {
items[k] = v.(string)
}

return m, nil
fingerprint := ""
if len(items) > 0 {
fingerprint = d.Get("metadata_fingerprint").(string)
}
return items, fingerprint, nil
}
{{- if ne $.TargetVersionName "ga" }}

Expand Down Expand Up @@ -234,4 +115,4 @@ func ComparePartnerMetadataDiff(_, old, new string, d *schema.ResourceData) bool
}
return false
}
{{- end }}
{{- end }}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"fmt"
"log"
"net/http"
"sort"
"strconv"
"strings"
"time"
Expand All @@ -30,6 +31,24 @@ import (
{{- end }}
)

func buildComputeMetadata(items map[string]string, fingerprint string) *compute.Metadata {
md := &compute.Metadata{Fingerprint: fingerprint}
if len(items) == 0 {
return md
}
keys := make([]string, 0, len(items))
for k := range items {
keys = append(keys, k)
}
sort.Strings(keys)
md.Items = make([]*compute.MetadataItems, 0, len(items))
for _, k := range keys {
v := items[k]
md.Items = append(md.Items, &compute.MetadataItems{Key: k, Value: &v})
}
return md
}

func IpCidrRangeDiffSuppress(k, old, new string, d *schema.ResourceData) bool {
// The range may be a:
// A) single IP address (e.g. 10.2.3.4)
Expand Down Expand Up @@ -1798,10 +1817,11 @@ func expandComputeInstance(project string, d *schema.ResourceData, config *trans
return nil, fmt.Errorf("Error creating params: %s", err)
}

metadata, err := resourceInstanceMetadata(d)
mdItems, mdFingerprint, err := resourceInstanceMetadata(d)
if err != nil {
return nil, fmt.Errorf("Error creating metadata: %s", err)
}
metadata := buildComputeMetadata(mdItems, mdFingerprint)

{{ if ne $.TargetVersionName `ga` -}}
PartnerMetadata, err := resourceInstancePartnerMetadata(d)
Expand Down Expand Up @@ -2032,7 +2052,12 @@ func resourceComputeInstanceRead(d *schema.ResourceData, meta interface{}) error
return err
}

md := flattenMetadataBeta(instance.Metadata)
md := make(map[string]string)
if instance.Metadata != nil {
for _, item := range instance.Metadata.Items {
md[item.Key] = *item.Value
}
}

// If the existing state contains "metadata_startup_script" instead of "metadata.startup-script",
// we should move the remote metadata.startup-script to metadata_startup_script to avoid
Expand Down Expand Up @@ -2405,15 +2430,12 @@ func resourceComputeInstanceUpdate(d *schema.ResourceData, meta interface{}) err
}

if d.HasChange("metadata") {
metadata, err := resourceInstanceMetadata(d)
mdItems, _, err := resourceInstanceMetadata(d)
if err != nil {
return fmt.Errorf("Error parsing metadata: %s", err)
}

metadataV1 := &compute.Metadata{}
if err := tpgresource.Convert(metadata, metadataV1); err != nil {
return err
}
metadataV1 := buildComputeMetadata(mdItems, "")

// We're retrying for an error 412 where the metadata fingerprint is out of date
err = transport_tpg.Retry(transport_tpg.RetryOptions{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1632,10 +1632,11 @@ func resourceComputeInstanceTemplateCreate(d *schema.ResourceData, meta interfac
return err
}

metadata, err := resourceInstanceMetadata(d)
mdItems, mdFingerprint, err := resourceInstanceMetadata(d)
if err != nil {
return err
}
metadata := buildComputeMetadata(mdItems, mdFingerprint)
{{- if ne $.TargetVersionName "ga" }}
PartnerMetadata, err := resourceInstancePartnerMetadata(d)
if err != nil {
Expand Down Expand Up @@ -2022,7 +2023,12 @@ func resourceComputeInstanceTemplateRead(d *schema.ResourceData, meta interface{

md := instanceTemplate.Properties.Metadata

_md := flattenMetadataBeta(md)
_md := make(map[string]string)
if md != nil {
for _, item := range md.Items {
_md[item.Key] = *item.Value
}
}

if script, scriptExists := d.GetOk("metadata_startup_script"); scriptExists {
if err = d.Set("metadata_startup_script", script); err != nil {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,7 @@ func resourceComputeProjectMetadataCreateOrUpdate(d *schema.ResourceData, meta i
return err
}

md := &compute.Metadata{
Items: expandComputeMetadata(d.Get("metadata").(map[string]interface{})),
}
md := buildComputeMetadata(expandComputeMetadata(d.Get("metadata").(map[string]interface{})), "")

err = resourceComputeProjectMetadataSet(projectID, userAgent, config, md, d.Timeout(schema.TimeoutCreate))
if err != nil {
Expand Down Expand Up @@ -109,7 +107,13 @@ func resourceComputeProjectMetadataRead(d *schema.ResourceData, meta interface{}
return transport_tpg.HandleNotFoundError(err, d, fmt.Sprintf("Project metadata for project %q", projectId))
}

err = d.Set("metadata", FlattenMetadata(project.CommonInstanceMetadata))
rawMd := make(map[string]interface{})
if project.CommonInstanceMetadata != nil {
for _, item := range project.CommonInstanceMetadata.Items {
rawMd[item.Key] = *item.Value
}
}
err = d.Set("metadata", rawMd)
if err != nil {
return fmt.Errorf("Error setting metadata: %s", err)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,6 @@ import (
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/customdiff"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"

{{ if eq $.TargetVersionName `ga` }}
"google.golang.org/api/compute/v1"
{{- else }}
compute "google.golang.org/api/compute/v0.beta"
{{- end }}
)

type metadataPresentBehavior bool
Expand Down Expand Up @@ -113,7 +108,12 @@ func resourceComputeProjectMetadataItemRead(d *schema.ResourceData, meta interfa
return fmt.Errorf("Error loading project '%s': %s", projectID, err)
}

md := FlattenMetadata(project.CommonInstanceMetadata)
md := make(map[string]interface{})
if project.CommonInstanceMetadata != nil {
for _, item := range project.CommonInstanceMetadata.Items {
md[item.Key] = *item.Value
}
}
val, ok := md[d.Id()]
if !ok {
// Resource no longer exists
Expand Down Expand Up @@ -213,7 +213,12 @@ func updateComputeCommonInstanceMetadata(config *transport_tpg.Config, projectID
return fmt.Errorf("Error loading project '%s': %s", projectID, err)
}

md := FlattenMetadata(project.CommonInstanceMetadata)
md := make(map[string]interface{})
if project.CommonInstanceMetadata != nil {
for _, item := range project.CommonInstanceMetadata.Items {
md[item.Key] = *item.Value
}
}

val, ok := md[key]

Expand Down Expand Up @@ -246,10 +251,7 @@ func updateComputeCommonInstanceMetadata(config *transport_tpg.Config, projectID
// Attempt to write the new value now
op, err := config.NewComputeClient(userAgent).Projects.SetCommonInstanceMetadata(
projectID,
&compute.Metadata{
Fingerprint: fingerprint,
Items: expandComputeMetadata(md),
},
buildComputeMetadata(expandComputeMetadata(md), fingerprint),
).Do()

if err != nil {
Expand Down
Loading
Loading