Skip to content

Commit 0c55b33

Browse files
authored
Migrated compute metadata to use transport_tpg (GoogleCloudPlatform#17154)
1 parent d9e3c72 commit 0c55b33

4 files changed

Lines changed: 94 additions & 91 deletions

File tree

mmv1/third_party/terraform/services/compute/metadata.go.tmpl

Lines changed: 70 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"errors"
88
{{- if ne $.TargetVersionName "ga" }}
99
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
10-
"google.golang.org/api/googleapi"
1110
"reflect"
1211
{{- end }}
1312
"sort"
@@ -29,70 +28,26 @@ func MetadataRetryWrapper(update func() error) error {
2928
return transport_tpg.MetadataRetryWrapper(update)
3029
}
3130

32-
// Update the metadata (serverMD) according to the provided diff (oldMDMap v
33-
// newMDMap).
34-
func MetadataUpdate(oldMDMap map[string]interface{}, newMDMap map[string]interface{}, serverMD *compute.Metadata) {
35-
curMDMap := make(map[string]string)
36-
// Load metadata on server into map
37-
for _, kv := range serverMD.Items {
38-
// If the server state has a key that we had in our old
39-
// state, but not in our new state, we should delete it
40-
_, okOld := oldMDMap[kv.Key]
41-
_, okNew := newMDMap[kv.Key]
31+
// MetadataUpdate merges the diff between oldMDMap and newMDMap into serverMD.
32+
// Keys present in oldMDMap but absent from newMDMap are removed from serverMD.
33+
// Keys present in newMDMap are inserted or overwritten in serverMD.
34+
// serverMD is modified in place.
35+
func MetadataUpdate(oldMDMap map[string]interface{}, newMDMap map[string]interface{}, serverMD map[string]interface{}) {
36+
for key := range serverMD {
37+
_, okOld := oldMDMap[key]
38+
_, okNew := newMDMap[key]
4239
if okOld && !okNew {
43-
continue
44-
} else {
45-
curMDMap[kv.Key] = *kv.Value
40+
delete(serverMD, key)
4641
}
4742
}
48-
49-
// Insert new metadata into existing metadata (overwriting when needed)
5043
for key, val := range newMDMap {
51-
curMDMap[key] = val.(string)
52-
}
53-
54-
// Reformat old metadata into a list
55-
serverMD.Items = nil
56-
for key, val := range curMDMap {
57-
v := val
58-
serverMD.Items = append(serverMD.Items, &compute.MetadataItems{
59-
Key: key,
60-
Value: &v,
61-
})
44+
serverMD[key] = val.(string)
6245
}
6346
}
6447

65-
// Update the beta metadata (serverMD) according to the provided diff (oldMDMap v
66-
// newMDMap).
67-
func BetaMetadataUpdate(oldMDMap map[string]interface{}, newMDMap map[string]interface{}, serverMD *compute.Metadata) {
68-
curMDMap := make(map[string]string)
69-
// Load metadata on server into map
70-
for _, kv := range serverMD.Items {
71-
// If the server state has a key that we had in our old
72-
// state, but not in our new state, we should delete it
73-
_, okOld := oldMDMap[kv.Key]
74-
_, okNew := newMDMap[kv.Key]
75-
if okOld && !okNew {
76-
continue
77-
} else {
78-
curMDMap[kv.Key] = *kv.Value
79-
}
80-
}
81-
82-
// Insert new metadata into existing metadata (overwriting when needed)
83-
for key, val := range newMDMap {
84-
curMDMap[key] = val.(string)
85-
}
86-
87-
// Reformat old metadata into a list
88-
serverMD.Items = nil
89-
for key, val := range curMDMap {
90-
v := val
91-
serverMD.Items = append(serverMD.Items, &compute.MetadataItems{
92-
Key: key,
93-
Value: &v,
94-
})
95-
}
48+
// BetaMetadataUpdate is equivalent to MetadataUpdate.
49+
func BetaMetadataUpdate(oldMDMap map[string]interface{}, newMDMap map[string]interface{}, serverMD map[string]interface{}) {
50+
MetadataUpdate(oldMDMap, newMDMap, serverMD)
9651
}
9752

9853
func expandComputeMetadata(m map[string]interface{}) []*compute.MetadataItems {
@@ -176,53 +131,84 @@ func resourceInstanceMetadata(d tpgresource.TerraformResourceData) (*compute.Met
176131
}
177132
{{- if ne $.TargetVersionName "ga" }}
178133

179-
func resourceInstancePartnerMetadata(d tpgresource.TerraformResourceData) (map[string]compute.StructuredEntries, error) {
180-
partnerMetadata := make(map[string]compute.StructuredEntries)
134+
func resourceInstancePartnerMetadata(d tpgresource.TerraformResourceData) (map[string]interface{}, error) {
135+
result := make(map[string]interface{})
181136
partnerMetadataMap := d.Get("partner_metadata").(map[string]interface{})
182-
if len(partnerMetadataMap) > 0 {
183-
for key, value := range partnerMetadataMap {
184-
var jsonMap map[string]interface{}
185-
err := json.Unmarshal([]byte(value.(string)), &jsonMap)
186-
if err != nil {
187-
return nil, err
188-
}
189-
structuredEntries := jsonMap["entries"].(map[string]interface{})
190-
structuredEntriesJson, err := json.Marshal(&structuredEntries)
191-
if err != nil {
192-
return nil, err
193-
}
194-
partnerMetadata[key] = compute.StructuredEntries{
195-
Entries: googleapi.RawMessage(structuredEntriesJson),
196-
}
137+
for key, value := range partnerMetadataMap {
138+
var parsed map[string]interface{}
139+
if err := json.Unmarshal([]byte(value.(string)), &parsed); err != nil {
140+
return nil, err
197141
}
142+
result[key] = parsed
198143
}
199-
return partnerMetadata, nil
144+
return result, nil
200145
}
201146

202-
func resourceInstancePatchPartnerMetadata(d tpgresource.TerraformResourceData, currentPartnerMetadata map[string]compute.StructuredEntries) map[string]compute.StructuredEntries {
147+
func resourceInstancePatchPartnerMetadata(d tpgresource.TerraformResourceData, currentPartnerMetadata map[string]interface{}) map[string]interface{} {
203148
partnerMetadata, _ := resourceInstancePartnerMetadata(d)
204149
for key := range currentPartnerMetadata {
205150
if _, ok := partnerMetadata[key]; !ok {
206-
partnerMetadata[key] = compute.StructuredEntries{}
151+
partnerMetadata[key] = nil
207152
}
208153
}
209154
return partnerMetadata
210-
211155
}
212-
func flattenPartnerMetadata(partnerMetadata map[string]compute.StructuredEntries) (map[string]string, error) {
156+
157+
func flattenPartnerMetadata(partnerMetadata map[string]interface{}) (map[string]string, error) {
213158
partnerMetadataMap := make(map[string]string)
214159
for key, value := range partnerMetadata {
160+
if value == nil {
161+
continue
162+
}
163+
jsonString, err := json.Marshal(value)
164+
if err != nil {
165+
return nil, err
166+
}
167+
partnerMetadataMap[key] = string(jsonString)
168+
}
169+
return partnerMetadataMap, nil
170+
}
215171

216-
jsonString, err := json.Marshal(&value)
172+
func convertPartnerMetadataToCompute(pm map[string]interface{}) (map[string]compute.StructuredEntries, error) {
173+
result := make(map[string]compute.StructuredEntries)
174+
for key, value := range pm {
175+
if value == nil {
176+
result[key] = compute.StructuredEntries{}
177+
continue
178+
}
179+
seBytes, err := json.Marshal(value)
217180
if err != nil {
218181
return nil, err
219182
}
220-
if value.Entries != nil {
221-
partnerMetadataMap[key] = string(jsonString)
183+
var se compute.StructuredEntries
184+
if err := json.Unmarshal(seBytes, &se); err != nil {
185+
return nil, err
222186
}
187+
result[key] = se
188+
}
189+
return result, nil
190+
}
223191

192+
func convertPartnerMetadataFromCompute(pm map[string]compute.StructuredEntries) map[string]interface{} {
193+
result := make(map[string]interface{})
194+
for key, value := range pm {
195+
if value.Entries == nil {
196+
result[key] = nil
197+
continue
198+
}
199+
seBytes, err := json.Marshal(value)
200+
if err != nil {
201+
result[key] = nil
202+
continue
203+
}
204+
var m map[string]interface{}
205+
if err := json.Unmarshal(seBytes, &m); err != nil {
206+
result[key] = nil
207+
continue
208+
}
209+
result[key] = m
224210
}
225-
return partnerMetadataMap, nil
211+
return result
226212
}
227213
func ComparePartnerMetadataDiff(_, old, new string, d *schema.ResourceData) bool {
228214
var oldJson map[string]interface{}

mmv1/third_party/terraform/services/compute/resource_compute_instance.go.tmpl

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1804,10 +1804,14 @@ func expandComputeInstance(project string, d *schema.ResourceData, config *trans
18041804
}
18051805

18061806
{{ if ne $.TargetVersionName `ga` -}}
1807-
PartnerMetadata, err := resourceInstancePartnerMetadata(d)
1807+
partnerMetadataMap, err := resourceInstancePartnerMetadata(d)
18081808
if err != nil {
18091809
return nil, fmt.Errorf("Error creating partner metadata: %s", err)
18101810
}
1811+
PartnerMetadata, err := convertPartnerMetadataToCompute(partnerMetadataMap)
1812+
if err != nil {
1813+
return nil, fmt.Errorf("Error converting partner metadata: %s", err)
1814+
}
18111815
{{- end }}
18121816

18131817
networkInterfaces, err := expandNetworkInterfaces(d, config)
@@ -2055,7 +2059,7 @@ func resourceComputeInstanceRead(d *schema.ResourceData, meta interface{}) error
20552059

20562060
{{ if ne $.TargetVersionName `ga` -}}
20572061
if instance.PartnerMetadata != nil {
2058-
partnerMetadata, err := flattenPartnerMetadata(instance.PartnerMetadata)
2062+
partnerMetadata, err := flattenPartnerMetadata(convertPartnerMetadataFromCompute(instance.PartnerMetadata))
20592063
if err != nil {
20602064
return fmt.Errorf("Error parsing partner metadata: %s", err)
20612065
}
@@ -2455,7 +2459,12 @@ func resourceComputeInstanceUpdate(d *schema.ResourceData, meta interface{}) err
24552459
return fmt.Errorf("Error retrieving partner_metadata: %s", err)
24562460
}
24572461
instance.Fingerprint = instance.Fingerprint
2458-
instance.PartnerMetadata = resourceInstancePatchPartnerMetadata(d, instance.PartnerMetadata)
2462+
patchedPM := resourceInstancePatchPartnerMetadata(d, convertPartnerMetadataFromCompute(instance.PartnerMetadata))
2463+
computePM, err := convertPartnerMetadataToCompute(patchedPM)
2464+
if err != nil {
2465+
return fmt.Errorf("Error converting partner metadata: %s", err)
2466+
}
2467+
instance.PartnerMetadata = computePM
24592468
instance.NullFields = []string{"partnerMetadata"}
24602469

24612470
op, err := NewClient(config, userAgent).Instances.Update(project, zone, instance.Name, instance).Do()

mmv1/third_party/terraform/services/compute/resource_compute_instance_template.go.tmpl

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1637,7 +1637,11 @@ func resourceComputeInstanceTemplateCreate(d *schema.ResourceData, meta interfac
16371637
return err
16381638
}
16391639
{{- if ne $.TargetVersionName "ga" }}
1640-
PartnerMetadata, err := resourceInstancePartnerMetadata(d)
1640+
partnerMetadataMap, err := resourceInstancePartnerMetadata(d)
1641+
if err != nil {
1642+
return err
1643+
}
1644+
PartnerMetadata, err := convertPartnerMetadataToCompute(partnerMetadataMap)
16411645
if err != nil {
16421646
return err
16431647
}
@@ -2043,7 +2047,7 @@ func resourceComputeInstanceTemplateRead(d *schema.ResourceData, meta interface{
20432047

20442048
{{ if ne $.TargetVersionName `ga` -}}
20452049
if instanceTemplate.Properties.PartnerMetadata != nil {
2046-
partnerMetadata, err := flattenPartnerMetadata(instanceTemplate.Properties.PartnerMetadata)
2050+
partnerMetadata, err := flattenPartnerMetadata(convertPartnerMetadataFromCompute(instanceTemplate.Properties.PartnerMetadata))
20472051
if err != nil {
20482052
return fmt.Errorf("Error parsing partner metadata: %s", err)
20492053
}

mmv1/third_party/terraform/services/compute/resource_compute_region_instance_template.go.tmpl

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1307,7 +1307,11 @@ func resourceComputeRegionInstanceTemplateCreate(d *schema.ResourceData, meta in
13071307
}
13081308

13091309
{{ if ne $.TargetVersionName `ga` -}}
1310-
PartnerMetadata, err := resourceInstancePartnerMetadata(d)
1310+
partnerMetadataMap, err := resourceInstancePartnerMetadata(d)
1311+
if err != nil {
1312+
return err
1313+
}
1314+
PartnerMetadata, err := convertPartnerMetadataToCompute(partnerMetadataMap)
13111315
if err != nil {
13121316
return err
13131317
}
@@ -1502,7 +1506,7 @@ func resourceComputeRegionInstanceTemplateRead(d *schema.ResourceData, meta inte
15021506

15031507
{{ if ne $.TargetVersionName `ga` -}}
15041508
if instanceProperties.PartnerMetadata != nil {
1505-
partnerMetadata, err := flattenPartnerMetadata(instanceProperties.PartnerMetadata)
1509+
partnerMetadata, err := flattenPartnerMetadata(convertPartnerMetadataFromCompute(instanceProperties.PartnerMetadata))
15061510
if err != nil {
15071511
return fmt.Errorf("Error parsing partner metadata: %s", err)
15081512
}

0 commit comments

Comments
 (0)