Skip to content

Commit 965882b

Browse files
author
Brett Mack
committed
Added protection for api limiting
1 parent 8376a5a commit 965882b

5 files changed

Lines changed: 152 additions & 177 deletions

File tree

builtin/providers/vcd/resource_vcd_dnat.go

Lines changed: 21 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@ import (
44
"fmt"
55
"github.com/hashicorp/terraform/helper/schema"
66
"github.com/opencredo/vmware-govcd"
7-
"regexp"
87
"strings"
9-
"time"
108
)
119

1210
func resourceVcdDNAT() *schema.Resource {
@@ -48,41 +46,30 @@ func resourceVcdDNATCreate(d *schema.ResourceData, meta interface{}) error {
4846
// operation we must wait until we can aquire a lock on the client
4947
vcd_client.Mutex.Lock()
5048
defer vcd_client.Mutex.Unlock()
51-
var task govcd.Task
5249
portString := getPortString(d.Get("port").(int))
5350

51+
edgeGateway, err := vcd_client.OrgVdc.FindEdgeGateway(d.Get("edge_gateway").(string))
52+
53+
if err != nil {
54+
return fmt.Errorf("Unable to find edge gateway: %#v", err)
55+
}
56+
5457
// Creating a loop to offer further protection from the edge gateway erroring
5558
// due to being busy eg another person is using another client so wouldn't be
5659
// constrained by out lock. If the edge gateway reurns with a busy error, wait
5760
// 3 seconds and then try again. Continue until a non-busy error or success
58-
for {
59-
err := vcd_client.OrgVdc.Refresh()
60-
if err != nil {
61-
return fmt.Errorf("Error refreshing vdc: %#v", err)
62-
}
63-
64-
edgeGateway, err := vcd_client.OrgVdc.FindEdgeGateway(d.Get("edge_gateway").(string))
6561

66-
if err != nil {
67-
return fmt.Errorf("Unable to find edge gateway: %#v", err)
68-
}
69-
70-
task, err = edgeGateway.AddNATMapping("DNAT", d.Get("external_ip").(string),
62+
err = retryCall(4, func() error {
63+
task, err := edgeGateway.AddNATMapping("DNAT", d.Get("external_ip").(string),
7164
d.Get("internal_ip").(string),
7265
portString)
73-
7466
if err != nil {
75-
if v, _ := regexp.MatchString("is busy completing an operation.$", err.Error()); v {
76-
time.Sleep(3 * time.Second)
77-
continue
78-
} else {
79-
return fmt.Errorf("Error setting DNAT rules: %#v", err)
80-
}
67+
return fmt.Errorf("Error setting DNAT rules: %#v", err)
8168
}
82-
break
83-
}
8469

85-
err := task.WaitTaskCompletion()
70+
return task.WaitTaskCompletion()
71+
})
72+
8673
if err != nil {
8774
return fmt.Errorf("Error completing tasks: %#v", err)
8875
}
@@ -129,41 +116,23 @@ func resourceVcdDNATDelete(d *schema.ResourceData, meta interface{}) error {
129116
// operation we must wait until we can aquire a lock on the client
130117
vcd_client.Mutex.Lock()
131118
defer vcd_client.Mutex.Unlock()
132-
var task govcd.Task
133119
portString := getPortString(d.Get("port").(int))
134120

135-
// Creating a loop to offer further protection from the edge gateway erroring
136-
// due to being busy eg another person is using another client so wouldn't be
137-
// constrained by out lock. If the edge gateway reurns with a busy error, wait
138-
// 3 seconds and then try again. Continue until a non-busy error or success
139-
for {
140-
err := vcd_client.OrgVdc.Refresh()
141-
if err != nil {
142-
return fmt.Errorf("Error refreshing vdc: %#v", err)
143-
}
144-
145-
edgeGateway, err := vcd_client.OrgVdc.FindEdgeGateway(d.Get("edge_gateway").(string))
146-
147-
if err != nil {
148-
return fmt.Errorf("Unable to find edge gateway: %#v", err)
149-
}
121+
edgeGateway, err := vcd_client.OrgVdc.FindEdgeGateway(d.Get("edge_gateway").(string))
150122

151-
task, err = edgeGateway.RemoveNATMapping("DNAT", d.Get("external_ip").(string),
123+
if err != nil {
124+
return fmt.Errorf("Unable to find edge gateway: %#v", err)
125+
}
126+
err = retryCall(4, func() error {
127+
task, err := edgeGateway.RemoveNATMapping("DNAT", d.Get("external_ip").(string),
152128
d.Get("internal_ip").(string),
153129
portString)
154-
155130
if err != nil {
156-
if v, _ := regexp.MatchString("is busy completing an operation.$", err.Error()); v {
157-
time.Sleep(3 * time.Second)
158-
continue
159-
} else {
160-
return fmt.Errorf("Error setting DNAT rules: %#v", err)
161-
}
131+
return fmt.Errorf("Error setting DNAT rules: %#v", err)
162132
}
163-
break
164-
}
165133

166-
err := task.WaitTaskCompletion()
134+
return task.WaitTaskCompletion()
135+
})
167136
if err != nil {
168137
return fmt.Errorf("Error completing tasks: %#v", err)
169138
}

builtin/providers/vcd/resource_vcd_network.go

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,10 @@ import (
66
"bytes"
77
"fmt"
88
"github.com/hashicorp/terraform/helper/hashcode"
9-
"github.com/hashicorp/terraform/helper/resource"
109
"github.com/hashicorp/terraform/helper/schema"
1110
"github.com/opencredo/vmware-govcd"
1211
types "github.com/opencredo/vmware-govcd/types/v56"
1312
"strings"
14-
"time"
1513
)
1614

1715
func resourceVcdNetwork() *schema.Resource {
@@ -151,29 +149,33 @@ func resourceVcdNetworkCreate(d *schema.ResourceData, meta interface{}) error {
151149
}
152150

153151
log.Printf("[INFO] NETWORK: %#v", newnetwork)
154-
err = vcd_client.OrgVdc.CreateOrgVDCNetwork(newnetwork)
155152

153+
err = retryCall(4, func() error {
154+
return vcd_client.OrgVdc.CreateOrgVDCNetwork(newnetwork)
155+
})
156156
if err != nil {
157157
return fmt.Errorf("Error: %#v", err)
158158
}
159159

160-
if dhcp, ok := d.GetOk("dhcp_pool"); ok {
161-
err := vcd_client.OrgVdc.Refresh()
162-
if err != nil {
163-
return fmt.Errorf("Error refreshing vdc: %#v", err)
164-
}
165-
166-
network, err := vcd_client.OrgVdc.FindVDCNetwork(d.Get("name").(string))
167-
if err != nil {
168-
return fmt.Errorf("Error finding network: %#v", err)
169-
}
160+
err = vcd_client.OrgVdc.Refresh()
161+
if err != nil {
162+
return fmt.Errorf("Error refreshing vdc: %#v", err)
163+
}
170164

171-
task, err := edgeGateway.AddDhcpPool(network.OrgVDCNetwork, dhcp.(*schema.Set).List())
165+
network, err := vcd_client.OrgVdc.FindVDCNetwork(d.Get("name").(string))
166+
if err != nil {
167+
return fmt.Errorf("Error finding network: %#v", err)
168+
}
172169

173-
if err != nil {
174-
return fmt.Errorf("Error adding DHCP pool: %#v", err)
175-
}
176-
err = task.WaitTaskCompletion()
170+
if dhcp, ok := d.GetOk("dhcp_pool"); ok {
171+
err = retryCall(4, func() error {
172+
task, err := edgeGateway.AddDhcpPool(network.OrgVDCNetwork, dhcp.(*schema.Set).List())
173+
if err != nil {
174+
return fmt.Errorf("Error adding DHCP pool: %#v", err)
175+
}
176+
177+
return task.WaitTaskCompletion()
178+
})
177179
if err != nil {
178180
return fmt.Errorf("Error completing tasks: %#v", err)
179181
}
@@ -233,16 +235,12 @@ func resourceVcdNetworkDelete(d *schema.ResourceData, meta interface{}) error {
233235
return fmt.Errorf("Error finding network: %#v", err)
234236
}
235237

236-
err = resource.Retry(3*time.Minute, func() error {
238+
err = retryCall(4, func() error {
237239
task, err := network.Delete()
238240
if err != nil {
239241
return fmt.Errorf("Error Deleting Network: %#v", err)
240242
}
241-
err = task.WaitTaskCompletion()
242-
if err != nil {
243-
return fmt.Errorf("Error completing tasks: %#v", err)
244-
}
245-
return nil
243+
return task.WaitTaskCompletion()
246244
})
247245
if err != nil {
248246
return err

builtin/providers/vcd/resource_vcd_snat.go

Lines changed: 21 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ import (
44
"fmt"
55
"github.com/hashicorp/terraform/helper/schema"
66
"github.com/opencredo/vmware-govcd"
7-
"regexp"
8-
"time"
97
)
108

119
func resourceVcdSNAT() *schema.Resource {
@@ -42,42 +40,27 @@ func resourceVcdSNATCreate(d *schema.ResourceData, meta interface{}) error {
4240
// operation we must wait until we can aquire a lock on the client
4341
vcd_client.Mutex.Lock()
4442
defer vcd_client.Mutex.Unlock()
45-
var task govcd.Task
4643

4744
// Creating a loop to offer further protection from the edge gateway erroring
4845
// due to being busy eg another person is using another client so wouldn't be
4946
// constrained by out lock. If the edge gateway reurns with a busy error, wait
5047
// 3 seconds and then try again. Continue until a non-busy error or success
51-
for {
52-
err := vcd_client.OrgVdc.Refresh()
53-
if err != nil {
54-
return fmt.Errorf("Error refreshing vdc: %#v", err)
55-
}
56-
57-
edgeGateway, err := vcd_client.OrgVdc.FindEdgeGateway(d.Get("edge_gateway").(string))
58-
59-
if err != nil {
60-
return fmt.Errorf("Unable to find edge gateway: %#v", err)
61-
}
48+
edgeGateway, err := vcd_client.OrgVdc.FindEdgeGateway(d.Get("edge_gateway").(string))
49+
if err != nil {
50+
return fmt.Errorf("Unable to find edge gateway: %#v", err)
51+
}
6252

63-
task, err = edgeGateway.AddNATMapping("SNAT", d.Get("internal_ip").(string),
53+
err = retryCall(4, func() error {
54+
task, err := edgeGateway.AddNATMapping("SNAT", d.Get("internal_ip").(string),
6455
d.Get("external_ip").(string),
6556
"any")
66-
6757
if err != nil {
68-
if v, _ := regexp.MatchString("is busy completing an operation.$", err.Error()); v {
69-
time.Sleep(3 * time.Second)
70-
continue
71-
} else {
72-
return fmt.Errorf("Error setting SNAT rules: %#v", err)
73-
}
58+
return fmt.Errorf("Error setting SNAT rules: %#v", err)
7459
}
75-
break
76-
}
77-
78-
err := task.WaitTaskCompletion()
60+
return task.WaitTaskCompletion()
61+
})
7962
if err != nil {
80-
return fmt.Errorf("Error completing tasks: %#v", err)
63+
return err
8164
}
8265

8366
d.SetId(d.Get("internal_ip").(string))
@@ -120,42 +103,24 @@ func resourceVcdSNATDelete(d *schema.ResourceData, meta interface{}) error {
120103
// operation we must wait until we can aquire a lock on the client
121104
vcd_client.Mutex.Lock()
122105
defer vcd_client.Mutex.Unlock()
123-
var task govcd.Task
124106

125-
// Creating a loop to offer further protection from the edge gateway erroring
126-
// due to being busy eg another person is using another client so wouldn't be
127-
// constrained by out lock. If the edge gateway reurns with a busy error, wait
128-
// 3 seconds and then try again. Continue until a non-busy error or success
129-
for {
130-
err := vcd_client.OrgVdc.Refresh()
131-
if err != nil {
132-
return fmt.Errorf("Error refreshing vdc: %#v", err)
133-
}
134-
135-
edgeGateway, err := vcd_client.OrgVdc.FindEdgeGateway(d.Get("edge_gateway").(string))
136-
137-
if err != nil {
138-
return fmt.Errorf("Unable to find edge gateway: %#v", err)
139-
}
107+
edgeGateway, err := vcd_client.OrgVdc.FindEdgeGateway(d.Get("edge_gateway").(string))
108+
if err != nil {
109+
return fmt.Errorf("Unable to find edge gateway: %#v", err)
110+
}
140111

141-
task, err = edgeGateway.RemoveNATMapping("SNAT", d.Get("internal_ip").(string),
112+
err = retryCall(4, func() error {
113+
task, err := edgeGateway.RemoveNATMapping("SNAT", d.Get("internal_ip").(string),
142114
d.Get("external_ip").(string),
143115
"")
144-
145116
if err != nil {
146-
if v, _ := regexp.MatchString("is busy completing an operation.$", err.Error()); v {
147-
time.Sleep(3 * time.Second)
148-
continue
149-
} else {
150-
return fmt.Errorf("Error setting SNAT rules: %#v", err)
151-
}
117+
return fmt.Errorf("Error setting SNAT rules: %#v", err)
152118
}
153-
break
154-
}
155-
156-
err := task.WaitTaskCompletion()
119+
return task.WaitTaskCompletion()
120+
})
157121
if err != nil {
158-
return fmt.Errorf("Error completing tasks: %#v", err)
122+
return err
159123
}
124+
160125
return nil
161126
}

0 commit comments

Comments
 (0)