@@ -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" : {
@@ -132,6 +134,48 @@ func resourcePubsubTopicRead(d *schema.ResourceData, meta interface{}) error {
132
134
return nil
133
135
}
134
136
137
+ func resourcePubsubTopicUpdate (d * schema.ResourceData , meta interface {}) error {
138
+ config := meta .(* Config )
139
+
140
+ obj := make (map [string ]interface {})
141
+ labelsProp , err := expandPubsubTopicLabels (d .Get ("labels" ), d , config )
142
+ if err != nil {
143
+ return err
144
+ } else if v , ok := d .GetOkExists ("labels" ); ! isEmptyValue (reflect .ValueOf (v )) && (ok || ! reflect .DeepEqual (v , labelsProp )) {
145
+ obj ["labels" ] = labelsProp
146
+ }
147
+
148
+ obj , err = resourcePubsubTopicUpdateEncoder (d , meta , obj )
149
+ if err != nil {
150
+ return err
151
+ }
152
+
153
+ url , err := replaceVars (d , config , "https://pubsub.googleapis.com/v1/projects/{{project}}/topics/{{name}}" )
154
+ if err != nil {
155
+ return err
156
+ }
157
+
158
+ log .Printf ("[DEBUG] Updating Topic %q: %#v" , d .Id (), obj )
159
+ updateMask := []string {}
160
+
161
+ if d .HasChange ("labels" ) {
162
+ updateMask = append (updateMask , "labels" )
163
+ }
164
+ // updateMask is a URL parameter but not present in the schema, so replaceVars
165
+ // won't set it
166
+ url , err = addQueryParams (url , map [string ]string {"updateMask" : strings .Join (updateMask , "," )})
167
+ if err != nil {
168
+ return err
169
+ }
170
+ _ , err = sendRequestWithTimeout (config , "PATCH" , url , obj , d .Timeout (schema .TimeoutUpdate ))
171
+
172
+ if err != nil {
173
+ return fmt .Errorf ("Error updating Topic %q: %s" , d .Id (), err )
174
+ }
175
+
176
+ return resourcePubsubTopicRead (d , meta )
177
+ }
178
+
135
179
func resourcePubsubTopicDelete (d * schema.ResourceData , meta interface {}) error {
136
180
config := meta .(* Config )
137
181
@@ -192,3 +236,9 @@ func expandPubsubTopicLabels(v interface{}, d TerraformResourceData, config *Con
192
236
}
193
237
return m , nil
194
238
}
239
+
240
+ func resourcePubsubTopicUpdateEncoder (d * schema.ResourceData , meta interface {}, obj map [string ]interface {}) (map [string ]interface {}, error ) {
241
+ newObj := make (map [string ]interface {})
242
+ newObj ["topic" ] = obj
243
+ return newObj , nil
244
+ }
0 commit comments