@@ -30,6 +30,13 @@ import (
30
30
)
31
31
32
32
var _ = Describe ("Network" , func () {
33
+
34
+ const (
35
+ ipAddress = "192.168.1.14"
36
+ errorMessage = "Error"
37
+ )
38
+
39
+ error := errors .New (errorMessage )
33
40
var ( // Declare shared vars.
34
41
mockCtrl * gomock.Controller
35
42
mockClient * csapi.CloudStackClient
@@ -137,7 +144,6 @@ var _ = Describe("Network", func() {
137
144
138
145
Context ("in an isolated network with public IPs available" , func () {
139
146
It ("will resolve public IP details given an endpoint spec" , func () {
140
- ipAddress := "192.168.1.14"
141
147
as .EXPECT ().NewListPublicIpAddressesParams ().Return (& csapi.ListPublicIpAddressesParams {})
142
148
as .EXPECT ().ListPublicIpAddresses (gomock .Any ()).
143
149
Return (& csapi.ListPublicIpAddressesResponse {
@@ -151,6 +157,80 @@ var _ = Describe("Network", func() {
151
157
})
152
158
})
153
159
160
+ Context ("In an isolated network with all public IPs allocated" , func () {
161
+ It ("No public IP addresses available" , func () {
162
+ as .EXPECT ().NewListPublicIpAddressesParams ().Return (& csapi.ListPublicIpAddressesParams {})
163
+ as .EXPECT ().ListPublicIpAddresses (gomock .Any ()).
164
+ Return (& csapi.ListPublicIpAddressesResponse {
165
+ Count : 0 ,
166
+ PublicIpAddresses : []* csapi.PublicIpAddress {},
167
+ }, nil )
168
+ publicIPAddress , err := client .GetPublicIP (dummies .CSZone1 , dummies .CSISONet1 , dummies .CSCluster )
169
+ Ω (publicIPAddress ).Should (BeNil ())
170
+ Ω (err .Error ()).Should (ContainSubstring ("no public addresses found in available networks" ))
171
+ })
172
+
173
+ It ("All Public IPs allocated" , func () {
174
+ as .EXPECT ().NewListPublicIpAddressesParams ().Return (& csapi.ListPublicIpAddressesParams {})
175
+ as .EXPECT ().ListPublicIpAddresses (gomock .Any ()).
176
+ Return (& csapi.ListPublicIpAddressesResponse {
177
+ Count : 2 ,
178
+ PublicIpAddresses : []* csapi.PublicIpAddress {{
179
+ State : "Allocated" ,
180
+ Allocated : "true" ,
181
+ Associatednetworkid : "1" ,
182
+ },
183
+ {
184
+ State : "Allocated" ,
185
+ Allocated : "true" ,
186
+ Associatednetworkid : "1" ,
187
+ }},
188
+ }, nil )
189
+ publicIPAddress , err := client .GetPublicIP (dummies .CSZone1 , dummies .CSISONet1 , dummies .CSCluster )
190
+ Ω (publicIPAddress ).Should (BeNil ())
191
+ Ω (err .Error ()).Should (ContainSubstring ("all Public IP Address(es) found were already allocated" ))
192
+ })
193
+ })
194
+
195
+ Context ("Associate Public IP address to Network" , func () {
196
+ It ("Successfully Associated Public IP to provided isolated network" , func () {
197
+ as .EXPECT ().NewListPublicIpAddressesParams ().Return (& csapi.ListPublicIpAddressesParams {})
198
+ as .EXPECT ().ListPublicIpAddresses (gomock .Any ()).
199
+ Return (& csapi.ListPublicIpAddressesResponse {
200
+ Count : 1 ,
201
+ PublicIpAddresses : []* csapi.PublicIpAddress {{Id : "PublicIPID" , Ipaddress : ipAddress }},
202
+ }, nil )
203
+ aip := & csapi.AssociateIpAddressParams {}
204
+ as .EXPECT ().NewAssociateIpAddressParams ().Return (aip )
205
+ as .EXPECT ().AssociateIpAddress (aip ).Return (& csapi.AssociateIpAddressResponse {}, nil )
206
+ // Will add cluster tag once to Network and once to PublicIP.
207
+ createdByResponse := & csapi.ListTagsResponse {Tags : []* csapi.Tag {{Key : cloud .CreatedByCAPCTagName , Value : "1" }}}
208
+ gomock .InOrder (
209
+ rs .EXPECT ().NewListTagsParams ().Return (& csapi.ListTagsParams {}),
210
+ rs .EXPECT ().ListTags (gomock .Any ()).Return (createdByResponse , nil ))
211
+
212
+ // Will add creation and cluster tags to network and PublicIP.
213
+ rs .EXPECT ().NewCreateTagsParams (gomock .Any (), gomock .Any (), gomock .Any ()).
214
+ Return (& csapi.CreateTagsParams {}).Times (2 )
215
+ rs .EXPECT ().CreateTags (gomock .Any ()).Return (& csapi.CreateTagsResponse {}, nil ).Times (2 )
216
+
217
+ Ω (client .AssociatePublicIPAddress (dummies .CSZone1 , dummies .CSISONet1 , dummies .CSCluster )).Should (Succeed ())
218
+ })
219
+
220
+ It ("Failure Associating Public IP to Isolated network" , func () {
221
+ as .EXPECT ().NewListPublicIpAddressesParams ().Return (& csapi.ListPublicIpAddressesParams {})
222
+ as .EXPECT ().ListPublicIpAddresses (gomock .Any ()).
223
+ Return (& csapi.ListPublicIpAddressesResponse {
224
+ Count : 1 ,
225
+ PublicIpAddresses : []* csapi.PublicIpAddress {{Id : "PublicIPID" , Ipaddress : ipAddress }},
226
+ }, nil )
227
+ aip := & csapi.AssociateIpAddressParams {}
228
+ as .EXPECT ().NewAssociateIpAddressParams ().Return (aip )
229
+ as .EXPECT ().AssociateIpAddress (aip ).Return (nil , errors .New ("Failed to allocate IP address" ))
230
+ Ω (client .AssociatePublicIPAddress (dummies .CSZone1 , dummies .CSISONet1 , dummies .CSCluster ).Error ()).Should (ContainSubstring ("associating public IP address with ID" ))
231
+ })
232
+ })
233
+
154
234
Context ("The specific load balancer rule does exist" , func () {
155
235
It ("resolves the rule's ID" , func () {
156
236
lbs .EXPECT ().NewListLoadBalancerRulesParams ().Return (& csapi.ListLoadBalancerRulesParams {})
@@ -163,6 +243,27 @@ var _ = Describe("Network", func() {
163
243
Ω (dummies .CSISONet1 .Status .LBRuleID ).Should (Equal (dummies .LBRuleID ))
164
244
})
165
245
246
+ It ("Failed to resolve LB rule details" , func () {
247
+ lbs .EXPECT ().NewListLoadBalancerRulesParams ().Return (& csapi.ListLoadBalancerRulesParams {})
248
+ lbs .EXPECT ().ListLoadBalancerRules (gomock .Any ()).Return (
249
+ & csapi.ListLoadBalancerRulesResponse {LoadBalancerRules : []* csapi.LoadBalancerRule {
250
+ {Publicport : "differentPublicPort" , Id : dummies .LBRuleID }}}, nil )
251
+
252
+ dummies .CSISONet1 .Status .LBRuleID = ""
253
+ Ω (client .ResolveLoadBalancerRuleDetails (dummies .CSZone1 , dummies .CSISONet1 , dummies .CSCluster ).Error ()).
254
+ Should (Equal ("no load balancer rule found" ))
255
+ })
256
+
257
+ It ("Failed to list LB rules" , func () {
258
+ lbs .EXPECT ().NewListLoadBalancerRulesParams ().Return (& csapi.ListLoadBalancerRulesParams {})
259
+ lbs .EXPECT ().ListLoadBalancerRules (gomock .Any ()).Return (
260
+ nil , error )
261
+
262
+ dummies .CSISONet1 .Status .LBRuleID = ""
263
+ Ω (client .ResolveLoadBalancerRuleDetails (dummies .CSZone1 , dummies .CSISONet1 , dummies .CSCluster ).Error ()).
264
+ Should (ContainSubstring ("listing load balancer rules" ))
265
+ })
266
+
166
267
It ("doesn't create a new load balancer rule on create" , func () {
167
268
lbs .EXPECT ().NewListLoadBalancerRulesParams ().Return (& csapi.ListLoadBalancerRulesParams {})
168
269
lbs .EXPECT ().ListLoadBalancerRules (gomock .Any ()).
@@ -175,6 +276,49 @@ var _ = Describe("Network", func() {
175
276
})
176
277
})
177
278
279
+ Context ("Assign VM to Load Balancer rule" , func () {
280
+ It ("Associates VM to LB rule" , func () {
281
+ dummies .CSISONet1 .Status .LBRuleID = "lbruleid"
282
+ lbip := & csapi.ListLoadBalancerRuleInstancesParams {}
283
+ albp := & csapi.AssignToLoadBalancerRuleParams {}
284
+ lbs .EXPECT ().NewListLoadBalancerRuleInstancesParams (dummies .CSISONet1 .Status .LBRuleID ).
285
+ Return (lbip )
286
+ lbs .EXPECT ().ListLoadBalancerRuleInstances (lbip ).Return (& csapi.ListLoadBalancerRuleInstancesResponse {}, nil )
287
+ lbs .EXPECT ().NewAssignToLoadBalancerRuleParams (dummies .CSISONet1 .Status .LBRuleID ).Return (albp )
288
+ lbs .EXPECT ().AssignToLoadBalancerRule (albp ).Return (& csapi.AssignToLoadBalancerRuleResponse {}, nil )
289
+
290
+ Ω (client .AssignVMToLoadBalancerRule (dummies .CSISONet1 , * dummies .CSMachine1 .Spec .InstanceID )).Should (Succeed ())
291
+ })
292
+
293
+ It ("Associating VM to LB rule fails" , func () {
294
+ dummies .CSISONet1 .Status .LBRuleID = "lbruleid"
295
+ lbip := & csapi.ListLoadBalancerRuleInstancesParams {}
296
+ albp := & csapi.AssignToLoadBalancerRuleParams {}
297
+ lbs .EXPECT ().NewListLoadBalancerRuleInstancesParams (dummies .CSISONet1 .Status .LBRuleID ).
298
+ Return (lbip )
299
+ lbs .EXPECT ().ListLoadBalancerRuleInstances (lbip ).Return (& csapi.ListLoadBalancerRuleInstancesResponse {}, nil )
300
+ lbs .EXPECT ().NewAssignToLoadBalancerRuleParams (dummies .CSISONet1 .Status .LBRuleID ).Return (albp )
301
+ lbs .EXPECT ().AssignToLoadBalancerRule (albp ).Return (nil , error )
302
+
303
+ Ω (client .AssignVMToLoadBalancerRule (dummies .CSISONet1 , * dummies .CSMachine1 .Spec .InstanceID )).ShouldNot (Succeed ())
304
+ })
305
+
306
+ It ("LB Rule already assigned to VM" , func () {
307
+ dummies .CSISONet1 .Status .LBRuleID = "lbruleid"
308
+ lbip := & csapi.ListLoadBalancerRuleInstancesParams {}
309
+ lbs .EXPECT ().NewListLoadBalancerRuleInstancesParams (dummies .CSISONet1 .Status .LBRuleID ).
310
+ Return (lbip )
311
+ lbs .EXPECT ().ListLoadBalancerRuleInstances (lbip ).Return (& csapi.ListLoadBalancerRuleInstancesResponse {
312
+ Count : 1 ,
313
+ LoadBalancerRuleInstances : []* csapi.VirtualMachine {{
314
+ Id : * dummies .CSMachine1 .Spec .InstanceID ,
315
+ }},
316
+ }, nil )
317
+
318
+ Ω (client .AssignVMToLoadBalancerRule (dummies .CSISONet1 , * dummies .CSMachine1 .Spec .InstanceID )).Should (Succeed ())
319
+ })
320
+ })
321
+
178
322
Context ("load balancer rule does not exist" , func () {
179
323
It ("calls cloudstack to create a new load balancer rule." , func () {
180
324
lbs .EXPECT ().NewListLoadBalancerRulesParams ().Return (& csapi.ListLoadBalancerRulesParams {})
@@ -189,6 +333,77 @@ var _ = Describe("Network", func() {
189
333
Ω (client .GetOrCreateLoadBalancerRule (dummies .CSZone1 , dummies .CSISONet1 , dummies .CSCluster )).Should (Succeed ())
190
334
Ω (dummies .CSISONet1 .Status .LBRuleID ).Should (Equal ("2ndLBRuleID" ))
191
335
})
336
+
337
+ It ("Fails to resolve load balancer rule details" , func () {
338
+ lbs .EXPECT ().NewListLoadBalancerRulesParams ().Return (& csapi.ListLoadBalancerRulesParams {})
339
+ lbs .EXPECT ().ListLoadBalancerRules (gomock .Any ()).
340
+ Return (nil , error )
341
+ err := client .GetOrCreateLoadBalancerRule (dummies .CSZone1 , dummies .CSISONet1 , dummies .CSCluster )
342
+ Ω (err ).ShouldNot (Succeed ())
343
+ Ω (err .Error ()).Should (ContainSubstring (errorMessage ))
344
+ })
345
+
346
+ It ("Fails to create a new load balancer rule." , func () {
347
+ lbs .EXPECT ().NewListLoadBalancerRulesParams ().Return (& csapi.ListLoadBalancerRulesParams {})
348
+ lbs .EXPECT ().ListLoadBalancerRules (gomock .Any ()).
349
+ Return (& csapi.ListLoadBalancerRulesResponse {
350
+ LoadBalancerRules : []* csapi.LoadBalancerRule {{Publicport : "7443" , Id : dummies .LBRuleID }}}, nil )
351
+ lbs .EXPECT ().NewCreateLoadBalancerRuleParams (gomock .Any (), gomock .Any (), gomock .Any (), gomock .Any ()).
352
+ Return (& csapi.CreateLoadBalancerRuleParams {})
353
+ lbs .EXPECT ().CreateLoadBalancerRule (gomock .Any ()).
354
+ Return (nil , error )
355
+ err := client .GetOrCreateLoadBalancerRule (dummies .CSZone1 , dummies .CSISONet1 , dummies .CSCluster )
356
+ Ω (err ).ShouldNot (Succeed ())
357
+ Ω (err .Error ()).Should (Equal (errorMessage ))
358
+
359
+ })
360
+ })
361
+
362
+ Context ("Delete Network" , func () {
363
+ It ("Calls CloudStack to delete network" , func () {
364
+ dnp := & csapi.DeleteNetworkParams {}
365
+ ns .EXPECT ().NewDeleteNetworkParams (dummies .ISONet1 .ID ).Return (dnp )
366
+ ns .EXPECT ().DeleteNetwork (dnp ).Return (& csapi.DeleteNetworkResponse {}, nil )
367
+
368
+ Ω (client .DeleteNetwork (dummies .ISONet1 )).Should (Succeed ())
369
+ })
370
+
371
+ It ("Network deletion failure" , func () {
372
+ dnp := & csapi.DeleteNetworkParams {}
373
+ ns .EXPECT ().NewDeleteNetworkParams (dummies .ISONet1 .ID ).Return (dnp )
374
+ ns .EXPECT ().DeleteNetwork (dnp ).Return (nil , error )
375
+ err := client .DeleteNetwork (dummies .ISONet1 )
376
+ Ω (err ).ShouldNot (Succeed ())
377
+ Ω (err .Error ()).Should (ContainSubstring ("deleting network with id " + dummies .ISONet1 .ID ))
378
+ })
379
+ })
380
+
381
+ Context ("Dispose or cleanup isolate network resources" , func () {
382
+ It ("Delete all isolated network resources when not managed by CAPC" , func () {
383
+ dummies .CSISONet1 .Status .PublicIPID = "publicIpId"
384
+ rtlp := & csapi.ListTagsParams {}
385
+ rs .EXPECT ().NewListTagsParams ().Return (rtlp ).Times (4 )
386
+ rs .EXPECT ().ListTags (rtlp ).Return (& csapi.ListTagsResponse {}, nil ).Times (4 )
387
+ as .EXPECT ().GetPublicIpAddressByID (dummies .CSISONet1 .Status .PublicIPID ).Return (& csapi.PublicIpAddress {}, 1 , nil )
388
+
389
+ Ω (client .DisposeIsoNetResources (dummies .CSZone1 , dummies .CSISONet1 , dummies .CSCluster )).Should (Succeed ())
390
+ })
391
+
392
+ It ("Delete all isolated network resources when managed by CAPC" , func () {
393
+ dummies .CSISONet1 .Status .PublicIPID = "publicIpId"
394
+ rtdp := & csapi.DeleteTagsParams {}
395
+ rtlp := & csapi.ListTagsParams {}
396
+ createdByCAPCResponse := & csapi.ListTagsResponse {Tags : []* csapi.Tag {{Key : cloud .CreatedByCAPCTagName , Value : "1" }}}
397
+ rs .EXPECT ().NewDeleteTagsParams (gomock .Any (), gomock .Any ()).Return (rtdp )
398
+ rs .EXPECT ().DeleteTags (rtdp ).Return (& csapi.DeleteTagsResponse {}, nil )
399
+ rs .EXPECT ().NewListTagsParams ().Return (rtlp ).Times (4 )
400
+ rs .EXPECT ().ListTags (rtlp ).Return (createdByCAPCResponse , nil )
401
+ rs .EXPECT ().ListTags (rtlp ).Return (& csapi.ListTagsResponse {}, nil ).Times (3 )
402
+ as .EXPECT ().GetPublicIpAddressByID (dummies .CSISONet1 .Status .PublicIPID ).Return (& csapi.PublicIpAddress {}, 1 , nil )
403
+
404
+ Ω (client .DisposeIsoNetResources (dummies .CSZone1 , dummies .CSISONet1 , dummies .CSCluster )).Should (Succeed ())
405
+ })
406
+
192
407
})
193
408
194
409
Context ("Networking Integ Tests" , Label ("integ" ), func () {
0 commit comments