@@ -18,6 +18,7 @@ import (
18
18
"fmt"
19
19
"log"
20
20
"reflect"
21
+ "strings"
21
22
"time"
22
23
23
24
"github.com/hashicorp/terraform/helper/schema"
@@ -27,6 +28,7 @@ func resourcePubsubTopic() *schema.Resource {
27
28
return & schema.Resource {
28
29
Create : resourcePubsubTopicCreate ,
29
30
Read : resourcePubsubTopicRead ,
31
+ Update : resourcePubsubTopicUpdate ,
30
32
Delete : resourcePubsubTopicDelete ,
31
33
32
34
Importer : & schema.ResourceImporter {
@@ -35,6 +37,7 @@ func resourcePubsubTopic() *schema.Resource {
35
37
36
38
Timeouts : & schema.ResourceTimeout {
37
39
Create : schema .DefaultTimeout (240 * time .Second ),
40
+ Update : schema .DefaultTimeout (240 * time .Second ),
38
41
Delete : schema .DefaultTimeout (240 * time .Second ),
39
42
},
40
43
@@ -48,7 +51,6 @@ func resourcePubsubTopic() *schema.Resource {
48
51
"labels" : {
49
52
Type : schema .TypeMap ,
50
53
Optional : true ,
51
- ForceNew : true ,
52
54
Elem : & schema.Schema {Type : schema .TypeString },
53
55
},
54
56
"project" : {
@@ -137,6 +139,48 @@ func resourcePubsubTopicRead(d *schema.ResourceData, meta interface{}) error {
137
139
return nil
138
140
}
139
141
142
+ func resourcePubsubTopicUpdate (d * schema.ResourceData , meta interface {}) error {
143
+ config := meta .(* Config )
144
+
145
+ obj := make (map [string ]interface {})
146
+ labelsProp , err := expandPubsubTopicLabels (d .Get ("labels" ), d , config )
147
+ if err != nil {
148
+ return err
149
+ } else if v , ok := d .GetOkExists ("labels" ); ! isEmptyValue (reflect .ValueOf (v )) && (ok || ! reflect .DeepEqual (v , labelsProp )) {
150
+ obj ["labels" ] = labelsProp
151
+ }
152
+
153
+ obj , err = resourcePubsubTopicUpdateEncoder (d , meta , obj )
154
+ if err != nil {
155
+ return err
156
+ }
157
+
158
+ url , err := replaceVars (d , config , "{{PubsubBasePath}}projects/{{project}}/topics/{{name}}" )
159
+ if err != nil {
160
+ return err
161
+ }
162
+
163
+ log .Printf ("[DEBUG] Updating Topic %q: %#v" , d .Id (), obj )
164
+ updateMask := []string {}
165
+
166
+ if d .HasChange ("labels" ) {
167
+ updateMask = append (updateMask , "labels" )
168
+ }
169
+ // updateMask is a URL parameter but not present in the schema, so replaceVars
170
+ // won't set it
171
+ url , err = addQueryParams (url , map [string ]string {"updateMask" : strings .Join (updateMask , "," )})
172
+ if err != nil {
173
+ return err
174
+ }
175
+ _ , err = sendRequestWithTimeout (config , "PATCH" , url , obj , d .Timeout (schema .TimeoutUpdate ))
176
+
177
+ if err != nil {
178
+ return fmt .Errorf ("Error updating Topic %q: %s" , d .Id (), err )
179
+ }
180
+
181
+ return resourcePubsubTopicRead (d , meta )
182
+ }
183
+
140
184
func resourcePubsubTopicDelete (d * schema.ResourceData , meta interface {}) error {
141
185
config := meta .(* Config )
142
186
@@ -202,3 +246,9 @@ func resourcePubsubTopicEncoder(d *schema.ResourceData, meta interface{}, obj ma
202
246
delete (obj , "name" )
203
247
return obj , nil
204
248
}
249
+
250
+ func resourcePubsubTopicUpdateEncoder (d * schema.ResourceData , meta interface {}, obj map [string ]interface {}) (map [string ]interface {}, error ) {
251
+ newObj := make (map [string ]interface {})
252
+ newObj ["topic" ] = obj
253
+ return newObj , nil
254
+ }
0 commit comments