@@ -66,7 +66,7 @@ var _ = Describe("Instance", func() {
66
66
ts = mockClient .Template .(* cloudstack.MockTemplateServiceIface )
67
67
vs = mockClient .Volume .(* cloudstack.MockVolumeServiceIface )
68
68
as = mockClient .Address .(* cloudstack.MockAddressServiceIface )
69
- client = cloud .NewClientFromCSAPIClient (mockClient )
69
+ client = cloud .NewClientFromCSAPIClient (mockClient , nil )
70
70
71
71
dummies .SetDummyVars ()
72
72
})
@@ -128,6 +128,8 @@ var _ = Describe("Instance", func() {
128
128
expectVMNotFound := func () {
129
129
vms .EXPECT ().GetVirtualMachinesMetricByID (* dummies .CSMachine1 .Spec .InstanceID ).Return (nil , - 1 , notFoundError )
130
130
vms .EXPECT ().GetVirtualMachinesMetricByName (dummies .CSMachine1 .Name ).Return (nil , - 1 , notFoundError )
131
+ }
132
+ expectPublicIPAddress := func () {
131
133
aslp := & cloudstack.ListPublicIpAddressesParams {}
132
134
as .EXPECT ().NewListPublicIpAddressesParams ().Return (aslp )
133
135
as .EXPECT ().ListPublicIpAddresses (aslp ).Return (& cloudstack.ListPublicIpAddressesResponse {
@@ -151,14 +153,29 @@ var _ = Describe("Instance", func() {
151
153
152
154
It ("returns errors occurring while fetching service offering information" , func () {
153
155
expectVMNotFound ()
156
+ expectPublicIPAddress ()
154
157
sos .EXPECT ().GetServiceOfferingByName (dummies .CSMachine1 .Spec .Offering .Name , gomock .Any ()).Return (& cloudstack.ServiceOffering {}, - 1 , unknownError )
155
158
Ω (client .GetOrCreateVMInstance (
156
159
dummies .CSMachine1 , dummies .CAPIMachine , dummies .CSCluster , dummies .CSFailureDomain1 , dummies .CSAffinityGroup , "" )).
157
160
ShouldNot (Succeed ())
158
161
})
159
162
163
+ It ("returns errors occurring if not enough public IPs available" , func () {
164
+ expectVMNotFound ()
165
+
166
+ aslp := & cloudstack.ListPublicIpAddressesParams {}
167
+ as .EXPECT ().NewListPublicIpAddressesParams ().Return (aslp )
168
+ as .EXPECT ().ListPublicIpAddresses (aslp ).Return (& cloudstack.ListPublicIpAddressesResponse {
169
+ Count : 2 , PublicIpAddresses : []* cloudstack.PublicIpAddress {{State : "Allocated" }, {State : "Allocated" }},
170
+ }, nil )
171
+ Ω (client .GetOrCreateVMInstance (
172
+ dummies .CSMachine1 , dummies .CAPIMachine , dummies .CSCluster , dummies .CSFailureDomain1 , dummies .CSAffinityGroup , "" )).
173
+ ShouldNot (Succeed ())
174
+ })
175
+
160
176
It ("returns errors if more than one service offering found" , func () {
161
177
expectVMNotFound ()
178
+ expectPublicIPAddress ()
162
179
sos .EXPECT ().GetServiceOfferingByName (dummies .CSMachine1 .Spec .Offering .Name , gomock .Any ()).Return (& cloudstack.ServiceOffering {
163
180
Id : dummies .CSMachine1 .Spec .Offering .ID ,
164
181
Name : dummies .CSMachine1 .Spec .Offering .Name ,
@@ -170,6 +187,7 @@ var _ = Describe("Instance", func() {
170
187
171
188
It ("returns errors while fetching template" , func () {
172
189
expectVMNotFound ()
190
+ expectPublicIPAddress ()
173
191
sos .EXPECT ().GetServiceOfferingByName (dummies .CSMachine1 .Spec .Offering .Name , gomock .Any ()).
174
192
Return (& cloudstack.ServiceOffering {
175
193
Id : dummies .CSMachine1 .Spec .Offering .ID ,
@@ -184,6 +202,7 @@ var _ = Describe("Instance", func() {
184
202
185
203
It ("returns errors when more than one template found" , func () {
186
204
expectVMNotFound ()
205
+ expectPublicIPAddress ()
187
206
sos .EXPECT ().GetServiceOfferingByName (dummies .CSMachine1 .Spec .Offering .Name , gomock .Any ()).
188
207
Return (& cloudstack.ServiceOffering {
189
208
Id : dummies .CSMachine1 .Spec .Offering .ID ,
@@ -197,6 +216,7 @@ var _ = Describe("Instance", func() {
197
216
198
217
It ("returns errors when more than one diskoffering found" , func () {
199
218
expectVMNotFound ()
219
+ expectPublicIPAddress ()
200
220
sos .EXPECT ().GetServiceOfferingByName (dummies .CSMachine1 .Spec .Offering .Name , gomock .Any ()).
201
221
Return (& cloudstack.ServiceOffering {
202
222
Id : dummies .CSMachine1 .Spec .Offering .ID ,
@@ -211,6 +231,7 @@ var _ = Describe("Instance", func() {
211
231
212
232
It ("returns errors when fetching diskoffering" , func () {
213
233
expectVMNotFound ()
234
+ expectPublicIPAddress ()
214
235
sos .EXPECT ().GetServiceOfferingByName (dummies .CSMachine1 .Spec .Offering .Name , gomock .Any ()).
215
236
Return (& cloudstack.ServiceOffering {
216
237
Id : dummies .CSMachine1 .Spec .Offering .ID ,
@@ -226,6 +247,7 @@ var _ = Describe("Instance", func() {
226
247
227
248
It ("returns errors when disk size not zero for non-customized disk offering" , func () {
228
249
expectVMNotFound ()
250
+ expectPublicIPAddress ()
229
251
dummies .CSMachine1 .Spec .DiskOffering .CustomSize = 1
230
252
sos .EXPECT ().GetServiceOfferingByName (dummies .CSMachine1 .Spec .Offering .Name , gomock .Any ()).
231
253
Return (& cloudstack.ServiceOffering {
@@ -242,6 +264,7 @@ var _ = Describe("Instance", func() {
242
264
243
265
It ("returns errors when disk size zero for customized disk offering" , func () {
244
266
expectVMNotFound ()
267
+ expectPublicIPAddress ()
245
268
dummies .CSMachine1 .Spec .DiskOffering .CustomSize = 0
246
269
sos .EXPECT ().GetServiceOfferingByName (dummies .CSMachine1 .Spec .Offering .Name , gomock .Any ()).
247
270
Return (& cloudstack.ServiceOffering {
@@ -258,8 +281,203 @@ var _ = Describe("Instance", func() {
258
281
ShouldNot (Succeed ())
259
282
})
260
283
284
+ Context ("when account & domains have limits" , func () {
285
+ It ("returns errors when there are not enough available CPU in account" , func () {
286
+ expectVMNotFound ()
287
+ expectPublicIPAddress ()
288
+ dummies .CSMachine1 .Spec .DiskOffering .CustomSize = 0
289
+ sos .EXPECT ().GetServiceOfferingByName (dummies .CSMachine1 .Spec .Offering .Name , gomock .Any ()).
290
+ Return (& cloudstack.ServiceOffering {
291
+ Id : dummies .CSMachine1 .Spec .Offering .ID ,
292
+ Name : dummies .CSMachine1 .Spec .Offering .Name ,
293
+ Cpunumber : 2 ,
294
+ Memory : 1024 ,
295
+ }, 1 , nil )
296
+ ts .EXPECT ().GetTemplateID (dummies .CSMachine1 .Spec .Template .Name , executableFilter , dummies .Zone1 .ID ).Return (dummies .CSMachine1 .Spec .Template .ID , 1 , nil )
297
+ dos .EXPECT ().GetDiskOfferingID (dummies .CSMachine1 .Spec .DiskOffering .Name , gomock .Any ()).Return (diskOfferingFakeID , 1 , nil )
298
+ dos .EXPECT ().GetDiskOfferingByID (diskOfferingFakeID ).Return (& cloudstack.DiskOffering {Iscustomized : false }, 1 , nil )
299
+ user := & cloud.User {
300
+ Account : cloud.Account {
301
+ Domain : cloud.Domain {
302
+ CPUAvailable : "20" ,
303
+ MemoryAvailable : "2048" ,
304
+ VMAvailable : "20" ,
305
+ },
306
+ CPUAvailable : "1" ,
307
+ MemoryAvailable : "2048" ,
308
+ VMAvailable : "20" ,
309
+ },
310
+ }
311
+ c := cloud .NewClientFromCSAPIClient (mockClient , user )
312
+ Ω (c .GetOrCreateVMInstance (
313
+ dummies .CSMachine1 , dummies .CAPIMachine , dummies .CSCluster , dummies .CSFailureDomain1 , dummies .CSAffinityGroup , "" )).
314
+ Should (MatchError (MatchRegexp ("CPU available .* in account can't fulfil the requirement:.*" )))
315
+ })
316
+
317
+ It ("returns errors when there are not enough available CPU in domain" , func () {
318
+ expectVMNotFound ()
319
+ expectPublicIPAddress ()
320
+ dummies .CSMachine1 .Spec .DiskOffering .CustomSize = 0
321
+ sos .EXPECT ().GetServiceOfferingByName (dummies .CSMachine1 .Spec .Offering .Name , gomock .Any ()).
322
+ Return (& cloudstack.ServiceOffering {
323
+ Id : dummies .CSMachine1 .Spec .Offering .ID ,
324
+ Name : dummies .CSMachine1 .Spec .Offering .Name ,
325
+ Cpunumber : 2 ,
326
+ Memory : 1024 ,
327
+ }, 1 , nil )
328
+ ts .EXPECT ().GetTemplateID (dummies .CSMachine1 .Spec .Template .Name , executableFilter , dummies .Zone1 .ID ).Return (dummies .CSMachine1 .Spec .Template .ID , 1 , nil )
329
+ dos .EXPECT ().GetDiskOfferingID (dummies .CSMachine1 .Spec .DiskOffering .Name , gomock .Any ()).Return (diskOfferingFakeID , 1 , nil )
330
+ dos .EXPECT ().GetDiskOfferingByID (diskOfferingFakeID ).Return (& cloudstack.DiskOffering {Iscustomized : false }, 1 , nil )
331
+ user := & cloud.User {
332
+ Account : cloud.Account {
333
+ Domain : cloud.Domain {
334
+ CPUAvailable : "1" ,
335
+ MemoryAvailable : "2048" ,
336
+ VMAvailable : "20" ,
337
+ },
338
+ CPUAvailable : "20" ,
339
+ MemoryAvailable : "2048" ,
340
+ VMAvailable : "20" ,
341
+ },
342
+ }
343
+ c := cloud .NewClientFromCSAPIClient (mockClient , user )
344
+ Ω (c .GetOrCreateVMInstance (
345
+ dummies .CSMachine1 , dummies .CAPIMachine , dummies .CSCluster , dummies .CSFailureDomain1 , dummies .CSAffinityGroup , "" )).
346
+ Should (MatchError (MatchRegexp ("CPU available .* in domain can't fulfil the requirement:.*" )))
347
+ })
348
+
349
+ It ("returns errors when there is not enough available memory in account" , func () {
350
+ expectVMNotFound ()
351
+ expectPublicIPAddress ()
352
+ dummies .CSMachine1 .Spec .DiskOffering .CustomSize = 0
353
+ sos .EXPECT ().GetServiceOfferingByName (dummies .CSMachine1 .Spec .Offering .Name , gomock .Any ()).
354
+ Return (& cloudstack.ServiceOffering {
355
+ Id : dummies .CSMachine1 .Spec .Offering .ID ,
356
+ Name : dummies .CSMachine1 .Spec .Offering .Name ,
357
+ Cpunumber : 2 ,
358
+ Memory : 1024 ,
359
+ }, 1 , nil )
360
+ ts .EXPECT ().GetTemplateID (dummies .CSMachine1 .Spec .Template .Name , executableFilter , dummies .Zone1 .ID ).Return (dummies .CSMachine1 .Spec .Template .ID , 1 , nil )
361
+ dos .EXPECT ().GetDiskOfferingID (dummies .CSMachine1 .Spec .DiskOffering .Name , gomock .Any ()).Return (diskOfferingFakeID , 1 , nil )
362
+ dos .EXPECT ().GetDiskOfferingByID (diskOfferingFakeID ).Return (& cloudstack.DiskOffering {Iscustomized : false }, 1 , nil )
363
+ user := & cloud.User {
364
+ Account : cloud.Account {
365
+ Domain : cloud.Domain {
366
+ CPUAvailable : "20" ,
367
+ MemoryAvailable : "2048" ,
368
+ VMAvailable : "20" ,
369
+ },
370
+ CPUAvailable : "20" ,
371
+ MemoryAvailable : "512" ,
372
+ VMAvailable : "20" ,
373
+ },
374
+ }
375
+ c := cloud .NewClientFromCSAPIClient (mockClient , user )
376
+ Ω (c .GetOrCreateVMInstance (
377
+ dummies .CSMachine1 , dummies .CAPIMachine , dummies .CSCluster , dummies .CSFailureDomain1 , dummies .CSAffinityGroup , "" )).
378
+ Should (MatchError (MatchRegexp ("memory available .* in account can't fulfil the requirement:.*" )))
379
+ })
380
+
381
+ It ("returns errors when there is not enough available memory in domain" , func () {
382
+ expectVMNotFound ()
383
+ expectPublicIPAddress ()
384
+ dummies .CSMachine1 .Spec .DiskOffering .CustomSize = 0
385
+ sos .EXPECT ().GetServiceOfferingByName (dummies .CSMachine1 .Spec .Offering .Name , gomock .Any ()).
386
+ Return (& cloudstack.ServiceOffering {
387
+ Id : dummies .CSMachine1 .Spec .Offering .ID ,
388
+ Name : dummies .CSMachine1 .Spec .Offering .Name ,
389
+ Cpunumber : 2 ,
390
+ Memory : 1024 ,
391
+ }, 1 , nil )
392
+ ts .EXPECT ().GetTemplateID (dummies .CSMachine1 .Spec .Template .Name , executableFilter , dummies .Zone1 .ID ).Return (dummies .CSMachine1 .Spec .Template .ID , 1 , nil )
393
+ dos .EXPECT ().GetDiskOfferingID (dummies .CSMachine1 .Spec .DiskOffering .Name , gomock .Any ()).Return (diskOfferingFakeID , 1 , nil )
394
+ dos .EXPECT ().GetDiskOfferingByID (diskOfferingFakeID ).Return (& cloudstack.DiskOffering {Iscustomized : false }, 1 , nil )
395
+ user := & cloud.User {
396
+ Account : cloud.Account {
397
+ Domain : cloud.Domain {
398
+ CPUAvailable : "20" ,
399
+ MemoryAvailable : "512" ,
400
+ VMAvailable : "20" ,
401
+ },
402
+ CPUAvailable : "20" ,
403
+ MemoryAvailable : "2048" ,
404
+ VMAvailable : "20" ,
405
+ },
406
+ }
407
+ c := cloud .NewClientFromCSAPIClient (mockClient , user )
408
+ Ω (c .GetOrCreateVMInstance (
409
+ dummies .CSMachine1 , dummies .CAPIMachine , dummies .CSCluster , dummies .CSFailureDomain1 , dummies .CSAffinityGroup , "" )).
410
+ Should (MatchError (MatchRegexp ("memory available .* in domain can't fulfil the requirement:.*" )))
411
+ })
412
+
413
+ It ("returns errors when there is not enough available VM limit in account" , func () {
414
+ expectVMNotFound ()
415
+ expectPublicIPAddress ()
416
+ dummies .CSMachine1 .Spec .DiskOffering .CustomSize = 0
417
+ sos .EXPECT ().GetServiceOfferingByName (dummies .CSMachine1 .Spec .Offering .Name , gomock .Any ()).
418
+ Return (& cloudstack.ServiceOffering {
419
+ Id : dummies .CSMachine1 .Spec .Offering .ID ,
420
+ Name : dummies .CSMachine1 .Spec .Offering .Name ,
421
+ Cpunumber : 2 ,
422
+ Memory : 1024 ,
423
+ }, 1 , nil )
424
+ ts .EXPECT ().GetTemplateID (dummies .CSMachine1 .Spec .Template .Name , executableFilter , dummies .Zone1 .ID ).Return (dummies .CSMachine1 .Spec .Template .ID , 1 , nil )
425
+ dos .EXPECT ().GetDiskOfferingID (dummies .CSMachine1 .Spec .DiskOffering .Name , gomock .Any ()).Return (diskOfferingFakeID , 1 , nil )
426
+ dos .EXPECT ().GetDiskOfferingByID (diskOfferingFakeID ).Return (& cloudstack.DiskOffering {Iscustomized : false }, 1 , nil )
427
+ user := & cloud.User {
428
+ Account : cloud.Account {
429
+ Domain : cloud.Domain {
430
+ CPUAvailable : "20" ,
431
+ MemoryAvailable : "2048" ,
432
+ VMAvailable : "20" ,
433
+ },
434
+ CPUAvailable : "20" ,
435
+ MemoryAvailable : "2048" ,
436
+ VMAvailable : "0" ,
437
+ },
438
+ }
439
+ c := cloud .NewClientFromCSAPIClient (mockClient , user )
440
+ Ω (c .GetOrCreateVMInstance (
441
+ dummies .CSMachine1 , dummies .CAPIMachine , dummies .CSCluster , dummies .CSFailureDomain1 , dummies .CSAffinityGroup , "" )).
442
+ Should (MatchError ("VM Limit in account has reached it's maximum value" ))
443
+ })
444
+
445
+ It ("returns errors when there is not enough available VM limit in domain" , func () {
446
+ expectVMNotFound ()
447
+ expectPublicIPAddress ()
448
+ dummies .CSMachine1 .Spec .DiskOffering .CustomSize = 0
449
+ sos .EXPECT ().GetServiceOfferingByName (dummies .CSMachine1 .Spec .Offering .Name , gomock .Any ()).
450
+ Return (& cloudstack.ServiceOffering {
451
+ Id : dummies .CSMachine1 .Spec .Offering .ID ,
452
+ Name : dummies .CSMachine1 .Spec .Offering .Name ,
453
+ Cpunumber : 2 ,
454
+ Memory : 1024 ,
455
+ }, 1 , nil )
456
+ ts .EXPECT ().GetTemplateID (dummies .CSMachine1 .Spec .Template .Name , executableFilter , dummies .Zone1 .ID ).Return (dummies .CSMachine1 .Spec .Template .ID , 1 , nil )
457
+ dos .EXPECT ().GetDiskOfferingID (dummies .CSMachine1 .Spec .DiskOffering .Name , gomock .Any ()).Return (diskOfferingFakeID , 1 , nil )
458
+ dos .EXPECT ().GetDiskOfferingByID (diskOfferingFakeID ).Return (& cloudstack.DiskOffering {Iscustomized : false }, 1 , nil )
459
+ user := & cloud.User {
460
+ Account : cloud.Account {
461
+ Domain : cloud.Domain {
462
+ CPUAvailable : "20" ,
463
+ MemoryAvailable : "2048" ,
464
+ VMAvailable : "0" ,
465
+ },
466
+ CPUAvailable : "20" ,
467
+ MemoryAvailable : "2048" ,
468
+ VMAvailable : "10" ,
469
+ },
470
+ }
471
+ c := cloud .NewClientFromCSAPIClient (mockClient , user )
472
+ Ω (c .GetOrCreateVMInstance (
473
+ dummies .CSMachine1 , dummies .CAPIMachine , dummies .CSCluster , dummies .CSFailureDomain1 , dummies .CSAffinityGroup , "" )).
474
+ Should (MatchError ("VM Limit in domain has reached it's maximum value" ))
475
+ })
476
+ })
477
+
261
478
It ("handles deployment errors" , func () {
262
479
expectVMNotFound ()
480
+ expectPublicIPAddress ()
263
481
sos .EXPECT ().GetServiceOfferingByName (dummies .CSMachine1 .Spec .Offering .Name , gomock .Any ()).
264
482
Return (& cloudstack.ServiceOffering {
265
483
Id : offeringFakeID ,
0 commit comments