@@ -175,32 +175,44 @@ func resourceSecurityFirewallRead(d *schema.ResourceData, meta interface{}) erro
175
175
176
176
func resourceSecurityFirewallUpdate (d * schema.ResourceData , meta interface {}) error {
177
177
var (
178
- api = meta .(* api.API )
179
- params []map [string ]interface {}
180
- localFirewalls = d .Get ("rules" ).(* schema.Set ).List ()
178
+ api = meta .(* api.API )
179
+ instanceID = d .Get ("instance_id" ).(int )
180
+ replace = d .Get ("replace" ).(bool )
181
+ rules []map [string ]interface {}
182
+ sleep = d .Get ("sleep" ).(int )
183
+ timeout = d .Get ("timeout" ).(int )
181
184
)
182
185
183
186
if ! d .HasChange ("rules" ) {
184
187
return nil
185
188
}
186
189
187
- for _ , k := range localFirewalls {
188
- params = append (params , k .(map [string ]interface {}))
189
- }
190
- log .Printf ("[DEBUG] cloudamqp::resource::security_firewall::update instance id: %v, params: %v" , d .Get ("instance_id" ), params )
191
- data , err := api .UpdateFirewallSettings (d .Get ("instance_id" ).(int ), params , d .Get ("sleep" ).(int ), d .Get ("timeout" ).(int ))
192
- if err != nil {
193
- return err
190
+ if replace {
191
+ for _ , k := range d .Get ("rules" ).(* schema.Set ).List () {
192
+ rules = append (rules , k .(map [string ]interface {}))
193
+ }
194
+ log .Printf ("[DEBUG] Firewall update instance id: %v, rules: %v" , instanceID , rules )
195
+ return api .UpdateFirewallSettings (instanceID , rules , sleep , timeout )
194
196
}
195
- rules := make ([]map [string ]interface {}, len (data ))
196
- for k , v := range data {
197
- rules [k ] = readRule (v )
197
+
198
+ oldRules , newRules := d .GetChange ("rules" )
199
+ deleteRules := oldRules .(* schema.Set ).Difference (newRules .(* schema.Set )).List ()
200
+ log .Printf ("[DEBUG] Update firewall, remove rules: %v" , deleteRules )
201
+ for _ , v := range deleteRules {
202
+ rule := v .(map [string ]interface {})
203
+ rule ["services" ] = []string {}
204
+ rule ["ports" ] = []int {}
205
+ rules = append (rules , rule )
198
206
}
199
207
200
- if err = d .Set ("rules" , rules ); err != nil {
201
- return fmt .Errorf ("error setting rules for resource %s, %s" , d .Id (), err )
208
+ updateRules := newRules .(* schema.Set ).Difference (oldRules .(* schema.Set )).List ()
209
+ log .Printf ("[DEBUG] Update firewall, patch rules: %v" , updateRules )
210
+ for _ , v := range updateRules {
211
+ rules = append (rules , readRule (v .(map [string ]interface {})))
202
212
}
203
- return nil
213
+
214
+ log .Printf ("[DEBUG] Update firewall, rules: %v" , rules )
215
+ return api .PatchFirewallSettings (instanceID , rules , sleep , timeout )
204
216
}
205
217
206
218
func resourceSecurityFirewallDelete (d * schema.ResourceData , meta interface {}) error {
0 commit comments