@@ -66,7 +66,7 @@ var _ = Describe("Instance", func() {
6666 ts = mockClient .Template .(* cloudstack.MockTemplateServiceIface )
6767 vs = mockClient .Volume .(* cloudstack.MockVolumeServiceIface )
6868 as = mockClient .Address .(* cloudstack.MockAddressServiceIface )
69- client = cloud .NewClientFromCSAPIClient (mockClient )
69+ client = cloud .NewClientFromCSAPIClient (mockClient , nil )
7070
7171 dummies .SetDummyVars ()
7272 })
@@ -128,6 +128,8 @@ var _ = Describe("Instance", func() {
128128 expectVMNotFound := func () {
129129 vms .EXPECT ().GetVirtualMachinesMetricByID (* dummies .CSMachine1 .Spec .InstanceID ).Return (nil , - 1 , notFoundError )
130130 vms .EXPECT ().GetVirtualMachinesMetricByName (dummies .CSMachine1 .Name ).Return (nil , - 1 , notFoundError )
131+ }
132+ expectPublicIPAddress := func () {
131133 aslp := & cloudstack.ListPublicIpAddressesParams {}
132134 as .EXPECT ().NewListPublicIpAddressesParams ().Return (aslp )
133135 as .EXPECT ().ListPublicIpAddresses (aslp ).Return (& cloudstack.ListPublicIpAddressesResponse {
@@ -151,14 +153,29 @@ var _ = Describe("Instance", func() {
151153
152154 It ("returns errors occurring while fetching service offering information" , func () {
153155 expectVMNotFound ()
156+ expectPublicIPAddress ()
154157 sos .EXPECT ().GetServiceOfferingByName (dummies .CSMachine1 .Spec .Offering .Name , gomock .Any ()).Return (& cloudstack.ServiceOffering {}, - 1 , unknownError )
155158 Ω (client .GetOrCreateVMInstance (
156159 dummies .CSMachine1 , dummies .CAPIMachine , dummies .CSCluster , dummies .CSFailureDomain1 , dummies .CSAffinityGroup , "" )).
157160 ShouldNot (Succeed ())
158161 })
159162
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+
160176 It ("returns errors if more than one service offering found" , func () {
161177 expectVMNotFound ()
178+ expectPublicIPAddress ()
162179 sos .EXPECT ().GetServiceOfferingByName (dummies .CSMachine1 .Spec .Offering .Name , gomock .Any ()).Return (& cloudstack.ServiceOffering {
163180 Id : dummies .CSMachine1 .Spec .Offering .ID ,
164181 Name : dummies .CSMachine1 .Spec .Offering .Name ,
@@ -170,6 +187,7 @@ var _ = Describe("Instance", func() {
170187
171188 It ("returns errors while fetching template" , func () {
172189 expectVMNotFound ()
190+ expectPublicIPAddress ()
173191 sos .EXPECT ().GetServiceOfferingByName (dummies .CSMachine1 .Spec .Offering .Name , gomock .Any ()).
174192 Return (& cloudstack.ServiceOffering {
175193 Id : dummies .CSMachine1 .Spec .Offering .ID ,
@@ -184,6 +202,7 @@ var _ = Describe("Instance", func() {
184202
185203 It ("returns errors when more than one template found" , func () {
186204 expectVMNotFound ()
205+ expectPublicIPAddress ()
187206 sos .EXPECT ().GetServiceOfferingByName (dummies .CSMachine1 .Spec .Offering .Name , gomock .Any ()).
188207 Return (& cloudstack.ServiceOffering {
189208 Id : dummies .CSMachine1 .Spec .Offering .ID ,
@@ -197,6 +216,7 @@ var _ = Describe("Instance", func() {
197216
198217 It ("returns errors when more than one diskoffering found" , func () {
199218 expectVMNotFound ()
219+ expectPublicIPAddress ()
200220 sos .EXPECT ().GetServiceOfferingByName (dummies .CSMachine1 .Spec .Offering .Name , gomock .Any ()).
201221 Return (& cloudstack.ServiceOffering {
202222 Id : dummies .CSMachine1 .Spec .Offering .ID ,
@@ -211,6 +231,7 @@ var _ = Describe("Instance", func() {
211231
212232 It ("returns errors when fetching diskoffering" , func () {
213233 expectVMNotFound ()
234+ expectPublicIPAddress ()
214235 sos .EXPECT ().GetServiceOfferingByName (dummies .CSMachine1 .Spec .Offering .Name , gomock .Any ()).
215236 Return (& cloudstack.ServiceOffering {
216237 Id : dummies .CSMachine1 .Spec .Offering .ID ,
@@ -226,6 +247,7 @@ var _ = Describe("Instance", func() {
226247
227248 It ("returns errors when disk size not zero for non-customized disk offering" , func () {
228249 expectVMNotFound ()
250+ expectPublicIPAddress ()
229251 dummies .CSMachine1 .Spec .DiskOffering .CustomSize = 1
230252 sos .EXPECT ().GetServiceOfferingByName (dummies .CSMachine1 .Spec .Offering .Name , gomock .Any ()).
231253 Return (& cloudstack.ServiceOffering {
@@ -242,6 +264,7 @@ var _ = Describe("Instance", func() {
242264
243265 It ("returns errors when disk size zero for customized disk offering" , func () {
244266 expectVMNotFound ()
267+ expectPublicIPAddress ()
245268 dummies .CSMachine1 .Spec .DiskOffering .CustomSize = 0
246269 sos .EXPECT ().GetServiceOfferingByName (dummies .CSMachine1 .Spec .Offering .Name , gomock .Any ()).
247270 Return (& cloudstack.ServiceOffering {
@@ -258,8 +281,203 @@ var _ = Describe("Instance", func() {
258281 ShouldNot (Succeed ())
259282 })
260283
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+
261478 It ("handles deployment errors" , func () {
262479 expectVMNotFound ()
480+ expectPublicIPAddress ()
263481 sos .EXPECT ().GetServiceOfferingByName (dummies .CSMachine1 .Spec .Offering .Name , gomock .Any ()).
264482 Return (& cloudstack.ServiceOffering {
265483 Id : offeringFakeID ,
0 commit comments