@@ -10,9 +10,9 @@ import (
10
10
11
11
func resourceComputeProjectMetadata () * schema.Resource {
12
12
return & schema.Resource {
13
- Create : resourceComputeProjectMetadataCreate ,
13
+ Create : resourceComputeProjectMetadataCreateOrUpdate ,
14
14
Read : resourceComputeProjectMetadataRead ,
15
- Update : resourceComputeProjectMetadataUpdate ,
15
+ Update : resourceComputeProjectMetadataCreateOrUpdate ,
16
16
Delete : resourceComputeProjectMetadataDelete ,
17
17
18
18
SchemaVersion : 0 ,
@@ -34,55 +34,21 @@ func resourceComputeProjectMetadata() *schema.Resource {
34
34
}
35
35
}
36
36
37
- func resourceComputeProjectMetadataCreate (d * schema.ResourceData , meta interface {}) error {
37
+ func resourceComputeProjectMetadataCreateOrUpdate (d * schema.ResourceData , meta interface {}) error {
38
38
config := meta .(* Config )
39
39
40
40
projectID , err := getProject (d , config )
41
41
if err != nil {
42
42
return err
43
43
}
44
44
45
- createMD := func () error {
46
- // Load project service
47
- log .Printf ("[DEBUG] Loading project service: %s" , projectID )
48
- project , err := config .clientCompute .Projects .Get (projectID ).Do ()
49
- if err != nil {
50
- return fmt .Errorf ("Error loading project '%s': %s" , projectID , err )
51
- }
52
-
53
- md := project .CommonInstanceMetadata
54
-
55
- newMDMap := d .Get ("metadata" ).(map [string ]interface {})
56
- // Ensure that we aren't overwriting entries that already exist
57
- for _ , kv := range md .Items {
58
- if _ , ok := newMDMap [kv .Key ]; ok {
59
- return fmt .Errorf ("Error, key '%s' already exists in project '%s'" , kv .Key , projectID )
60
- }
61
- }
62
-
63
- // Append new metadata to existing metadata
64
- for key , val := range newMDMap {
65
- v := val .(string )
66
- md .Items = append (md .Items , & compute.MetadataItems {
67
- Key : key ,
68
- Value : & v ,
69
- })
70
- }
71
-
72
- op , err := config .clientCompute .Projects .SetCommonInstanceMetadata (projectID , md ).Do ()
73
-
74
- if err != nil {
75
- return fmt .Errorf ("SetCommonInstanceMetadata failed: %s" , err )
76
- }
77
-
78
- log .Printf ("[DEBUG] SetCommonMetadata: %d (%s)" , op .Id , op .SelfLink )
79
-
80
- return computeOperationWait (config .clientCompute , op , project .Name , "SetCommonMetadata" )
45
+ md := & compute.Metadata {
46
+ Items : expandComputeMetadata (d .Get ("metadata" ).(map [string ]interface {})),
81
47
}
82
48
83
- err = MetadataRetryWrapper ( createMD )
49
+ err = resourceComputeProjectMetadataSet ( projectID , config , md )
84
50
if err != nil {
85
- return err
51
+ return fmt . Errorf ( "SetCommonInstanceMetadata failed: %s" , err )
86
52
}
87
53
88
54
return resourceComputeProjectMetadataRead (d , meta )
@@ -103,70 +69,13 @@ func resourceComputeProjectMetadataRead(d *schema.ResourceData, meta interface{}
103
69
return handleNotFoundError (err , d , fmt .Sprintf ("Project metadata for project %q" , projectID ))
104
70
}
105
71
106
- md := flattenMetadata (project .CommonInstanceMetadata )
107
- existingMetadata := d .Get ("metadata" ).(map [string ]interface {})
108
- // Remove all keys not explicitly mentioned in the terraform config
109
- for k := range md {
110
- if _ , ok := existingMetadata [k ]; ! ok {
111
- delete (md , k )
112
- }
113
- }
114
-
115
- if err = d .Set ("metadata" , md ); err != nil {
72
+ err = d .Set ("metadata" , flattenMetadata (project .CommonInstanceMetadata ))
73
+ if err != nil {
116
74
return fmt .Errorf ("Error setting metadata: %s" , err )
117
75
}
118
76
119
77
d .Set ("project" , projectID )
120
78
d .SetId ("common_metadata" )
121
-
122
- return nil
123
- }
124
-
125
- func resourceComputeProjectMetadataUpdate (d * schema.ResourceData , meta interface {}) error {
126
- config := meta .(* Config )
127
-
128
- projectID , err := getProject (d , config )
129
- if err != nil {
130
- return err
131
- }
132
-
133
- if d .HasChange ("metadata" ) {
134
- o , n := d .GetChange ("metadata" )
135
-
136
- updateMD := func () error {
137
- // Load project service
138
- log .Printf ("[DEBUG] Loading project service: %s" , projectID )
139
- project , err := config .clientCompute .Projects .Get (projectID ).Do ()
140
- if err != nil {
141
- return fmt .Errorf ("Error loading project '%s': %s" , projectID , err )
142
- }
143
-
144
- md := project .CommonInstanceMetadata
145
-
146
- MetadataUpdate (o .(map [string ]interface {}), n .(map [string ]interface {}), md )
147
-
148
- op , err := config .clientCompute .Projects .SetCommonInstanceMetadata (projectID , md ).Do ()
149
-
150
- if err != nil {
151
- return fmt .Errorf ("SetCommonInstanceMetadata failed: %s" , err )
152
- }
153
-
154
- log .Printf ("[DEBUG] SetCommonMetadata: %d (%s)" , op .Id , op .SelfLink )
155
-
156
- // Optimistic locking requires the fingerprint received to match
157
- // the fingerprint we send the server, if there is a mismatch then we
158
- // are working on old data, and must retry
159
- return computeOperationWait (config .clientCompute , op , project .Name , "SetCommonMetadata" )
160
- }
161
-
162
- err := MetadataRetryWrapper (updateMD )
163
- if err != nil {
164
- return err
165
- }
166
-
167
- return resourceComputeProjectMetadataRead (d , meta )
168
- }
169
-
170
79
return nil
171
80
}
172
81
@@ -178,30 +87,33 @@ func resourceComputeProjectMetadataDelete(d *schema.ResourceData, meta interface
178
87
return err
179
88
}
180
89
181
- // Load project service
182
- log .Printf ("[DEBUG] Loading project service: %s" , projectID )
183
- project , err := config .clientCompute .Projects .Get (projectID ).Do ()
90
+ md := & compute.Metadata {}
91
+ err = resourceComputeProjectMetadataSet (projectID , config , md )
184
92
if err != nil {
185
- return fmt .Errorf ("Error loading project '%s' : %s" , projectID , err )
93
+ return fmt .Errorf ("SetCommonInstanceMetadata failed : %s" , err )
186
94
}
187
95
188
- md := project .CommonInstanceMetadata
189
-
190
- // Remove all items
191
- md .Items = nil
192
-
193
- op , err := config .clientCompute .Projects .SetCommonInstanceMetadata (projectID , md ).Do ()
96
+ return resourceComputeProjectMetadataRead (d , meta )
97
+ }
194
98
195
- if err != nil {
196
- return fmt .Errorf ("Error removing metadata from project %s: %s" , projectID , err )
197
- }
99
+ func resourceComputeProjectMetadataSet (projectID string , config * Config , md * compute.Metadata ) error {
100
+ createMD := func () error {
101
+ log .Printf ("[DEBUG] Loading project service: %s" , projectID )
102
+ project , err := config .clientCompute .Projects .Get (projectID ).Do ()
103
+ if err != nil {
104
+ return fmt .Errorf ("Error loading project '%s': %s" , projectID , err )
105
+ }
198
106
199
- log .Printf ("[DEBUG] SetCommonMetadata: %d (%s)" , op .Id , op .SelfLink )
107
+ md .Fingerprint = project .CommonInstanceMetadata .Fingerprint
108
+ op , err := config .clientCompute .Projects .SetCommonInstanceMetadata (projectID , md ).Do ()
109
+ if err != nil {
110
+ return fmt .Errorf ("SetCommonInstanceMetadata failed: %s" , err )
111
+ }
200
112
201
- err = computeOperationWait (config .clientCompute , op , project .Name , "SetCommonMetadata" )
202
- if err != nil {
203
- return err
113
+ log .Printf ("[DEBUG] SetCommonMetadata: %d (%s)" , op .Id , op .SelfLink )
114
+ return computeOperationWait (config .clientCompute , op , project .Name , "SetCommonMetadata" )
204
115
}
205
116
206
- return resourceComputeProjectMetadataRead (d , meta )
117
+ err := MetadataRetryWrapper (createMD )
118
+ return err
207
119
}
0 commit comments