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
9853func 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}
227213func ComparePartnerMetadataDiff(_, old, new string, d *schema.ResourceData ) bool {
228214 var oldJson map[string]interface{}
0 commit comments