Skip to content

Commit ecc4ce3

Browse files
author
Brett Mack
committed
Converted firewall_rules rule set to a list type. Code tidy
1 parent dc8924b commit ecc4ce3

7 files changed

Lines changed: 127 additions & 161 deletions

builtin/providers/vcd/resource_vcd_dnat.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,15 @@ func resourceVcdDNAT() *schema.Resource {
4141
}
4242

4343
func resourceVcdDNATCreate(d *schema.ResourceData, meta interface{}) error {
44-
vcd_client := meta.(*govcd.VCDClient)
44+
vcdClient := meta.(*govcd.VCDClient)
4545
// Multiple VCD components need to run operations on the Edge Gateway, as
4646
// the edge gatway will throw back an error if it is already performing an
4747
// operation we must wait until we can aquire a lock on the client
48-
vcd_client.Mutex.Lock()
49-
defer vcd_client.Mutex.Unlock()
48+
vcdClient.Mutex.Lock()
49+
defer vcdClient.Mutex.Unlock()
5050
portString := getPortString(d.Get("port").(int))
5151

52-
edgeGateway, err := vcd_client.OrgVdc.FindEdgeGateway(d.Get("edge_gateway").(string))
52+
edgeGateway, err := vcdClient.OrgVdc.FindEdgeGateway(d.Get("edge_gateway").(string))
5353

5454
if err != nil {
5555
return fmt.Errorf("Unable to find edge gateway: %#v", err)
@@ -80,8 +80,8 @@ func resourceVcdDNATCreate(d *schema.ResourceData, meta interface{}) error {
8080
}
8181

8282
func resourceVcdDNATRead(d *schema.ResourceData, meta interface{}) error {
83-
vcd_client := meta.(*govcd.VCDClient)
84-
e, err := vcd_client.OrgVdc.FindEdgeGateway(d.Get("edge_gateway").(string))
83+
vcdClient := meta.(*govcd.VCDClient)
84+
e, err := vcdClient.OrgVdc.FindEdgeGateway(d.Get("edge_gateway").(string))
8585

8686
if err != nil {
8787
return fmt.Errorf("Unable to find edge gateway: %#v", err)
@@ -106,15 +106,15 @@ func resourceVcdDNATRead(d *schema.ResourceData, meta interface{}) error {
106106
}
107107

108108
func resourceVcdDNATDelete(d *schema.ResourceData, meta interface{}) error {
109-
vcd_client := meta.(*govcd.VCDClient)
109+
vcdClient := meta.(*govcd.VCDClient)
110110
// Multiple VCD components need to run operations on the Edge Gateway, as
111111
// the edge gatway will throw back an error if it is already performing an
112112
// operation we must wait until we can aquire a lock on the client
113-
vcd_client.Mutex.Lock()
114-
defer vcd_client.Mutex.Unlock()
113+
vcdClient.Mutex.Lock()
114+
defer vcdClient.Mutex.Unlock()
115115
portString := getPortString(d.Get("port").(int))
116116

117-
edgeGateway, err := vcd_client.OrgVdc.FindEdgeGateway(d.Get("edge_gateway").(string))
117+
edgeGateway, err := vcdClient.OrgVdc.FindEdgeGateway(d.Get("edge_gateway").(string))
118118

119119
if err != nil {
120120
return fmt.Errorf("Unable to find edge gateway: %#v", err)
Lines changed: 53 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
package vcd
22

33
import (
4-
"bytes"
54
"fmt"
6-
"github.com/hashicorp/terraform/helper/hashcode"
75
"github.com/hashicorp/terraform/helper/schema"
86
"github.com/hmrc/vmware-govcd"
97
types "github.com/hmrc/vmware-govcd/types/v56"
8+
"log"
109
"strings"
1110
)
1211

@@ -30,7 +29,7 @@ func resourceVcdFirewallRules() *schema.Resource {
3029
},
3130

3231
"rule": &schema.Schema{
33-
Type: schema.TypeSet,
32+
Type: schema.TypeList,
3433
Optional: true,
3534
ForceNew: true,
3635
Elem: &schema.Resource{
@@ -77,29 +76,30 @@ func resourceVcdFirewallRules() *schema.Resource {
7776
},
7877
},
7978
},
80-
Set: resourceVcdNetworkFirewallRuleHash,
8179
},
8280
},
8381
}
8482
}
8583

8684
func resourceVcdFirewallRulesCreate(d *schema.ResourceData, meta interface{}) error {
87-
vcd_client := meta.(*govcd.VCDClient)
88-
vcd_client.Mutex.Lock()
89-
defer vcd_client.Mutex.Unlock()
85+
vcdClient := meta.(*govcd.VCDClient)
86+
vcdClient.Mutex.Lock()
87+
defer vcdClient.Mutex.Unlock()
9088

91-
edgeGateway, err := vcd_client.OrgVdc.FindEdgeGateway(d.Get("edge_gateway").(string))
89+
edgeGateway, err := vcdClient.OrgVdc.FindEdgeGateway(d.Get("edge_gateway").(string))
9290
if err != nil {
9391
return fmt.Errorf("Unable to find edge gateway: %s", err)
9492
}
9593

9694
err = retryCall(5, func() error {
9795
edgeGateway.Refresh()
98-
firewallRules, _ := expandFirewallRules(d.Get("rule").(*schema.Set).List(), edgeGateway.EdgeGateway)
96+
firewallRules, _ := expandFirewallRules(d, edgeGateway.EdgeGateway)
9997
task, err := edgeGateway.CreateFirewallRules(d.Get("default_action").(string), firewallRules)
10098
if err != nil {
99+
log.Printf("[INFO] Error setting firewall rules: %s", err)
101100
return fmt.Errorf("Error setting firewall rules: %#v", err)
102101
}
102+
103103
return task.WaitTaskCompletion()
104104
})
105105
if err != nil {
@@ -112,13 +112,13 @@ func resourceVcdFirewallRulesCreate(d *schema.ResourceData, meta interface{}) er
112112
}
113113

114114
func resourceFirewallRulesDelete(d *schema.ResourceData, meta interface{}) error {
115-
vcd_client := meta.(*govcd.VCDClient)
116-
vcd_client.Mutex.Lock()
117-
defer vcd_client.Mutex.Unlock()
115+
vcdClient := meta.(*govcd.VCDClient)
116+
vcdClient.Mutex.Lock()
117+
defer vcdClient.Mutex.Unlock()
118118

119-
edgeGateway, err := vcd_client.OrgVdc.FindEdgeGateway(d.Get("edge_gateway").(string))
119+
edgeGateway, err := vcdClient.OrgVdc.FindEdgeGateway(d.Get("edge_gateway").(string))
120120

121-
firewallRules := deleteFirewallRules(d.Get("rule").(*schema.Set).List(), edgeGateway.EdgeGateway)
121+
firewallRules := deleteFirewallRules(d, edgeGateway.EdgeGateway)
122122
defaultAction := edgeGateway.EdgeGateway.Configuration.EdgeGatewayServiceConfiguration.FirewallService.DefaultAction
123123
task, err := edgeGateway.CreateFirewallRules(defaultAction, firewallRules)
124124
if err != nil {
@@ -134,28 +134,42 @@ func resourceFirewallRulesDelete(d *schema.ResourceData, meta interface{}) error
134134
}
135135

136136
func resourceFirewallRulesRead(d *schema.ResourceData, meta interface{}) error {
137-
vcd_client := meta.(*govcd.VCDClient)
137+
vcdClient := meta.(*govcd.VCDClient)
138138

139-
edgeGateway, err := vcd_client.OrgVdc.FindEdgeGateway(d.Get("edge_gateway").(string))
139+
edgeGateway, err := vcdClient.OrgVdc.FindEdgeGateway(d.Get("edge_gateway").(string))
140140
if err != nil {
141141
return fmt.Errorf("Error finding edge gateway: %#v", err)
142142
}
143+
ruleList := d.Get("rule").([]interface{})
143144
firewallRules := *edgeGateway.EdgeGateway.Configuration.EdgeGatewayServiceConfiguration.FirewallService
144-
d.Set("rule", resourceVcdFirewallRulesGather(firewallRules.FirewallRule, d.Get("rule").(*schema.Set).List()))
145+
rulesCount := d.Get("rule.#").(int)
146+
for i := 0; i < rulesCount; i++ {
147+
prefix := fmt.Sprintf("rule.%d", i)
148+
if d.Get(prefix+".id").(string) == "" {
149+
log.Printf("[INFO] Rule %d has no id. Searching...", i)
150+
ruleid, err := matchFirewallRule(d, prefix, firewallRules.FirewallRule)
151+
if err == nil {
152+
currentRule := ruleList[i].(map[string]interface{})
153+
currentRule["id"] = ruleid
154+
ruleList[i] = currentRule
155+
}
156+
}
157+
}
158+
d.Set("rule", ruleList)
145159
d.Set("default_action", firewallRules.DefaultAction)
146160

147161
return nil
148162
}
149163

150-
func deleteFirewallRules(configured []interface{}, gateway *types.EdgeGateway) []*types.FirewallRule {
164+
func deleteFirewallRules(d *schema.ResourceData, gateway *types.EdgeGateway) []*types.FirewallRule {
151165
firewallRules := gateway.Configuration.EdgeGatewayServiceConfiguration.FirewallService.FirewallRule
152-
fwrules := make([]*types.FirewallRule, 0, len(firewallRules)-len(configured))
166+
rulesCount := d.Get("rule.#").(int)
167+
fwrules := make([]*types.FirewallRule, 0, len(firewallRules)-rulesCount)
153168

154169
for _, f := range firewallRules {
155170
keep := true
156-
for _, r := range configured {
157-
data := r.(map[string]interface{})
158-
if data["id"].(string) != f.ID {
171+
for i := 0; i < rulesCount; i++ {
172+
if d.Get(fmt.Sprintf("rule.%d.id", i)).(string) != f.ID {
159173
continue
160174
}
161175
keep = false
@@ -167,75 +181,25 @@ func deleteFirewallRules(configured []interface{}, gateway *types.EdgeGateway) [
167181
return fwrules
168182
}
169183

170-
func resourceVcdFirewallRulesGather(rules []*types.FirewallRule, configured []interface{}) []map[string]interface{} {
171-
fwrules := make([]map[string]interface{}, 0, len(configured))
172-
173-
for i := len(configured) - 1; i >= 0; i-- {
174-
data := configured[i].(map[string]interface{})
175-
rule, err := matchFirewallRule(data, rules)
176-
if err != nil {
177-
continue
178-
}
179-
fwrules = append(fwrules, rule)
180-
}
181-
return fwrules
182-
}
184+
func matchFirewallRule(d *schema.ResourceData, prefix string, rules []*types.FirewallRule) (string, error) {
183185

184-
func matchFirewallRule(data map[string]interface{}, rules []*types.FirewallRule) (map[string]interface{}, error) {
185-
rule := make(map[string]interface{})
186186
for _, m := range rules {
187-
if data["id"].(string) == "" {
188-
if data["description"].(string) == m.Description &&
189-
data["policy"].(string) == m.Policy &&
190-
data["protocol"].(string) == getProtocol(*m.Protocols) &&
191-
data["destination_port"].(string) == getPortString(m.Port) &&
192-
strings.ToLower(data["destination_ip"].(string)) == strings.ToLower(m.DestinationIP) &&
193-
data["source_port"].(string) == getPortString(m.SourcePort) &&
194-
strings.ToLower(data["source_ip"].(string)) == strings.ToLower(m.SourceIP) {
195-
rule["id"] = m.ID
196-
rule["description"] = m.Description
197-
rule["policy"] = m.Policy
198-
rule["protocol"] = getProtocol(*m.Protocols)
199-
rule["destination_port"] = getPortString(m.Port)
200-
rule["destination_ip"] = strings.ToLower(m.DestinationIP)
201-
rule["source_port"] = getPortString(m.SourcePort)
202-
rule["source_ip"] = strings.ToLower(m.SourceIP)
203-
return rule, nil
204-
}
205-
} else {
206-
if data["id"].(string) == m.ID {
207-
rule["id"] = m.ID
208-
rule["description"] = m.Description
209-
rule["policy"] = m.Policy
210-
rule["protocol"] = getProtocol(*m.Protocols)
211-
rule["destination_port"] = getPortString(m.Port)
212-
rule["destination_ip"] = strings.ToLower(m.DestinationIP)
213-
rule["source_port"] = getPortString(m.SourcePort)
214-
rule["source_ip"] = strings.ToLower(m.SourceIP)
215-
return rule, nil
216-
}
187+
log.Printf("[INFO] %s - %s", d.Get(prefix+".description").(string), m.Description)
188+
log.Printf("[INFO] %s - %s", d.Get(prefix+".policy").(string), m.Policy)
189+
log.Printf("[INFO] %s - %s", d.Get(prefix+".protocol").(string), getProtocol(*m.Protocols))
190+
log.Printf("[INFO] %s - %s", d.Get(prefix+".destination_port").(string), getPortString(m.Port))
191+
log.Printf("[INFO] %s - %s", strings.ToLower(d.Get(prefix+".destination_ip").(string)), strings.ToLower(m.DestinationIP))
192+
log.Printf("[INFO] %s - %s", d.Get(prefix+".source_port").(string), getPortString(m.SourcePort))
193+
log.Printf("[INFO] %s - %s", strings.ToLower(d.Get(prefix+".source_ip").(string)), strings.ToLower(m.SourceIP))
194+
if d.Get(prefix+".description").(string) == m.Description &&
195+
d.Get(prefix+".policy").(string) == m.Policy &&
196+
strings.ToLower(d.Get(prefix+".protocol").(string)) == getProtocol(*m.Protocols) &&
197+
strings.ToLower(d.Get(prefix+".destination_port").(string)) == getPortString(m.Port) &&
198+
strings.ToLower(d.Get(prefix+".destination_ip").(string)) == strings.ToLower(m.DestinationIP) &&
199+
strings.ToLower(d.Get(prefix+".source_port").(string)) == getPortString(m.SourcePort) &&
200+
strings.ToLower(d.Get(prefix+".source_ip").(string)) == strings.ToLower(m.SourceIP) {
201+
return m.ID, nil
217202
}
218203
}
219-
return rule, fmt.Errorf("Unable to find rule")
220-
}
221-
222-
func resourceVcdNetworkFirewallRuleHash(v interface{}) int {
223-
var buf bytes.Buffer
224-
m := v.(map[string]interface{})
225-
buf.WriteString(fmt.Sprintf("%s-",
226-
strings.ToLower(m["description"].(string))))
227-
buf.WriteString(fmt.Sprintf("%s-",
228-
strings.ToLower(m["policy"].(string))))
229-
buf.WriteString(fmt.Sprintf("%s-",
230-
strings.ToLower(m["protocol"].(string))))
231-
buf.WriteString(fmt.Sprintf("%s-",
232-
strings.ToLower(m["destination_port"].(string))))
233-
buf.WriteString(fmt.Sprintf("%s-",
234-
strings.ToLower(m["destination_ip"].(string))))
235-
buf.WriteString(fmt.Sprintf("%s-",
236-
strings.ToLower(m["source_port"].(string))))
237-
buf.WriteString(fmt.Sprintf("%s-",
238-
strings.ToLower(m["source_ip"].(string))))
239-
240-
return hashcode.String(buf.String())
204+
return "", fmt.Errorf("Unable to find rule")
241205
}

builtin/providers/vcd/resource_vcd_firewall_rules_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@ package vcd
22

33
import (
44
"fmt"
5-
"testing"
6-
//"regexp"
75
"log"
86
"os"
7+
"testing"
98

109
"github.com/hashicorp/terraform/helper/resource"
1110
"github.com/hashicorp/terraform/terraform"

builtin/providers/vcd/resource_vcd_network.go

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ func resourceVcdNetwork() *schema.Resource {
9595
},
9696
},
9797
},
98-
Set: resourceVcdNetworkIpAddressHash,
98+
Set: resourceVcdNetworkIPAddressHash,
9999
},
100100
"static_ip_pool": &schema.Schema{
101101
Type: schema.TypeSet,
@@ -114,21 +114,21 @@ func resourceVcdNetwork() *schema.Resource {
114114
},
115115
},
116116
},
117-
Set: resourceVcdNetworkIpAddressHash,
117+
Set: resourceVcdNetworkIPAddressHash,
118118
},
119119
},
120120
}
121121
}
122122

123123
func resourceVcdNetworkCreate(d *schema.ResourceData, meta interface{}) error {
124-
vcd_client := meta.(*govcd.VCDClient)
125-
log.Printf("[TRACE] CLIENT: %#v", vcd_client)
126-
vcd_client.Mutex.Lock()
127-
defer vcd_client.Mutex.Unlock()
124+
vcdClient := meta.(*govcd.VCDClient)
125+
log.Printf("[TRACE] CLIENT: %#v", vcdClient)
126+
vcdClient.Mutex.Lock()
127+
defer vcdClient.Mutex.Unlock()
128128

129-
edgeGateway, err := vcd_client.OrgVdc.FindEdgeGateway(d.Get("edge_gateway").(string))
129+
edgeGateway, err := vcdClient.OrgVdc.FindEdgeGateway(d.Get("edge_gateway").(string))
130130

131-
ipRanges := expandIpRange(d.Get("static_ip_pool").(*schema.Set).List())
131+
ipRanges := expandIPRange(d.Get("static_ip_pool").(*schema.Set).List())
132132

133133
newnetwork := &types.OrgVDCNetwork{
134134
Xmlns: "http://www.vmware.com/vcloud/v1.5",
@@ -157,18 +157,18 @@ func resourceVcdNetworkCreate(d *schema.ResourceData, meta interface{}) error {
157157
log.Printf("[INFO] NETWORK: %#v", newnetwork)
158158

159159
err = retryCall(4, func() error {
160-
return vcd_client.OrgVdc.CreateOrgVDCNetwork(newnetwork)
160+
return vcdClient.OrgVdc.CreateOrgVDCNetwork(newnetwork)
161161
})
162162
if err != nil {
163163
return fmt.Errorf("Error: %#v", err)
164164
}
165165

166-
err = vcd_client.OrgVdc.Refresh()
166+
err = vcdClient.OrgVdc.Refresh()
167167
if err != nil {
168168
return fmt.Errorf("Error refreshing vdc: %#v", err)
169169
}
170170

171-
network, err := vcd_client.OrgVdc.FindVDCNetwork(d.Get("name").(string))
171+
network, err := vcdClient.OrgVdc.FindVDCNetwork(d.Get("name").(string))
172172
if err != nil {
173173
return fmt.Errorf("Error finding network: %#v", err)
174174
}
@@ -194,16 +194,16 @@ func resourceVcdNetworkCreate(d *schema.ResourceData, meta interface{}) error {
194194
}
195195

196196
func resourceVcdNetworkRead(d *schema.ResourceData, meta interface{}) error {
197-
vcd_client := meta.(*govcd.VCDClient)
198-
log.Printf("[DEBUG] VCD Client configuration: %#v", vcd_client)
199-
log.Printf("[DEBUG] VCD Client configuration: %#v", vcd_client.OrgVdc)
197+
vcdClient := meta.(*govcd.VCDClient)
198+
log.Printf("[DEBUG] VCD Client configuration: %#v", vcdClient)
199+
log.Printf("[DEBUG] VCD Client configuration: %#v", vcdClient.OrgVdc)
200200

201-
err := vcd_client.OrgVdc.Refresh()
201+
err := vcdClient.OrgVdc.Refresh()
202202
if err != nil {
203203
return fmt.Errorf("Error refreshing vdc: %#v", err)
204204
}
205205

206-
network, err := vcd_client.OrgVdc.FindVDCNetwork(d.Id())
206+
network, err := vcdClient.OrgVdc.FindVDCNetwork(d.Id())
207207
if err != nil {
208208
log.Printf("[DEBUG] Network no longer exists. Removing from tfstate")
209209
d.SetId("")
@@ -222,15 +222,15 @@ func resourceVcdNetworkRead(d *schema.ResourceData, meta interface{}) error {
222222
}
223223

224224
func resourceVcdNetworkDelete(d *schema.ResourceData, meta interface{}) error {
225-
vcd_client := meta.(*govcd.VCDClient)
226-
vcd_client.Mutex.Lock()
227-
defer vcd_client.Mutex.Unlock()
228-
err := vcd_client.OrgVdc.Refresh()
225+
vcdClient := meta.(*govcd.VCDClient)
226+
vcdClient.Mutex.Lock()
227+
defer vcdClient.Mutex.Unlock()
228+
err := vcdClient.OrgVdc.Refresh()
229229
if err != nil {
230230
return fmt.Errorf("Error refreshing vdc: %#v", err)
231231
}
232232

233-
network, err := vcd_client.OrgVdc.FindVDCNetwork(d.Id())
233+
network, err := vcdClient.OrgVdc.FindVDCNetwork(d.Id())
234234
if err != nil {
235235
return fmt.Errorf("Error finding network: %#v", err)
236236
}
@@ -249,7 +249,7 @@ func resourceVcdNetworkDelete(d *schema.ResourceData, meta interface{}) error {
249249
return nil
250250
}
251251

252-
func resourceVcdNetworkIpAddressHash(v interface{}) int {
252+
func resourceVcdNetworkIPAddressHash(v interface{}) int {
253253
var buf bytes.Buffer
254254
m := v.(map[string]interface{})
255255
buf.WriteString(fmt.Sprintf("%s-",

0 commit comments

Comments
 (0)