@@ -3,6 +3,7 @@ package machinepool
33import (
44 "context"
55 "fmt"
6+ "github.com/openshift/hive/pkg/constants"
67 "testing"
78
89 "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute"
@@ -29,6 +30,7 @@ func TestAzureActuator(t *testing.T) {
2930 expectedImage * machineapi.Image
3031 expectedErr bool
3132 }{
33+ // < 4.12
3234 {
3335 name : "generate single machineset for single zone" ,
3436 clusterDeployment : testAzureClusterDeployment (),
@@ -251,6 +253,229 @@ func TestAzureActuator(t *testing.T) {
251253 Type : "MarketplaceWithPlan" ,
252254 },
253255 },
256+ // >= 4.12
257+ {
258+ name : "generate single machineset for single zone (4.12+)" ,
259+ clusterDeployment : testAzureClusterDeployment412 (),
260+ pool : testAzurePool (),
261+ mockAzureClient : func (mockCtrl * gomock.Controller , client * mockazure.MockClient ) {
262+ mockListResourceSKUs (mockCtrl , client , []string {"zone1" })
263+ mockGetVMCapabilities (mockCtrl , client , "V1,V2" )
264+ mockListImagesByResourceGroup (mockCtrl , client , []compute.Image {
265+ testAzureImage (compute .HyperVGenerationTypesV1 ),
266+ })
267+ },
268+ expectedMachineSetReplicas : map [string ]int64 {
269+ generateAzureMachineSetName ("zone1" ): 3 ,
270+ },
271+ },
272+ {
273+ name : "generate machinesets across zones (4.12+)" ,
274+ clusterDeployment : testAzureClusterDeployment412 (),
275+ pool : testAzurePool (),
276+ mockAzureClient : func (mockCtrl * gomock.Controller , client * mockazure.MockClient ) {
277+ mockListResourceSKUs (mockCtrl , client , []string {"zone1" , "zone2" , "zone3" })
278+ mockGetVMCapabilities (mockCtrl , client , "V1,V2" )
279+ mockListImagesByResourceGroup (mockCtrl , client , []compute.Image {
280+ testAzureImage (compute .HyperVGenerationTypesV1 ),
281+ })
282+ },
283+ expectedMachineSetReplicas : map [string ]int64 {
284+ generateAzureMachineSetName ("zone1" ): 1 ,
285+ generateAzureMachineSetName ("zone2" ): 1 ,
286+ generateAzureMachineSetName ("zone3" ): 1 ,
287+ },
288+ },
289+ {
290+ name : "generate machinesets for specified zones (4.12+)" ,
291+ clusterDeployment : testAzureClusterDeployment412 (),
292+ pool : func () * hivev1.MachinePool {
293+ pool := testAzurePool ()
294+ pool .Spec .Platform .Azure .Zones = []string {"zone1" , "zone2" , "zone3" }
295+ return pool
296+ }(),
297+ mockAzureClient : func (mockCtrl * gomock.Controller , client * mockazure.MockClient ) {
298+ mockGetVMCapabilities (mockCtrl , client , "V1,V2" )
299+ mockListImagesByResourceGroup (mockCtrl , client , []compute.Image {
300+ testAzureImage (compute .HyperVGenerationTypesV1 ),
301+ })
302+ },
303+ expectedMachineSetReplicas : map [string ]int64 {
304+ generateAzureMachineSetName ("zone1" ): 1 ,
305+ generateAzureMachineSetName ("zone2" ): 1 ,
306+ generateAzureMachineSetName ("zone3" ): 1 ,
307+ },
308+ },
309+ {
310+ name : "more replicas than zones (4.12+)" ,
311+ clusterDeployment : testAzureClusterDeployment412 (),
312+ pool : func () * hivev1.MachinePool {
313+ p := testAzurePool ()
314+ p .Spec .Replicas = pointer .Int64Ptr (5 )
315+ return p
316+ }(),
317+ mockAzureClient : func (mockCtrl * gomock.Controller , client * mockazure.MockClient ) {
318+ mockListResourceSKUs (mockCtrl , client , []string {"zone1" , "zone2" , "zone3" })
319+ mockGetVMCapabilities (mockCtrl , client , "V1,V2" )
320+ mockListImagesByResourceGroup (mockCtrl , client , []compute.Image {
321+ testAzureImage (compute .HyperVGenerationTypesV1 ),
322+ })
323+ },
324+ expectedMachineSetReplicas : map [string ]int64 {
325+ generateAzureMachineSetName ("zone1" ): 2 ,
326+ generateAzureMachineSetName ("zone2" ): 2 ,
327+ generateAzureMachineSetName ("zone3" ): 1 ,
328+ },
329+ },
330+ {
331+ name : "more zones than replicas (4.12+)" ,
332+ clusterDeployment : testAzureClusterDeployment412 (),
333+ pool : testAzurePool (),
334+ mockAzureClient : func (mockCtrl * gomock.Controller , client * mockazure.MockClient ) {
335+ mockListResourceSKUs (mockCtrl , client , []string {"zone1" , "zone2" , "zone3" , "zone4" , "zone5" })
336+ mockGetVMCapabilities (mockCtrl , client , "V1,V2" )
337+ mockListImagesByResourceGroup (mockCtrl , client , []compute.Image {
338+ testAzureImage (compute .HyperVGenerationTypesV1 ),
339+ })
340+ },
341+ expectedMachineSetReplicas : map [string ]int64 {
342+ generateAzureMachineSetName ("zone1" ): 1 ,
343+ generateAzureMachineSetName ("zone2" ): 1 ,
344+ generateAzureMachineSetName ("zone3" ): 1 ,
345+ generateAzureMachineSetName ("zone4" ): 0 ,
346+ generateAzureMachineSetName ("zone5" ): 0 ,
347+ },
348+ },
349+ {
350+ name : "list zones returns zero (4.12+)" ,
351+ clusterDeployment : testAzureClusterDeployment412 (),
352+ pool : testAzurePool (),
353+ mockAzureClient : func (mockCtrl * gomock.Controller , client * mockazure.MockClient ) {
354+ mockListResourceSKUs (mockCtrl , client , []string {})
355+ mockGetVMCapabilities (mockCtrl , client , "V1,V2" )
356+ mockListImagesByResourceGroup (mockCtrl , client , []compute.Image {
357+ testAzureImage (compute .HyperVGenerationTypesV1 ),
358+ })
359+ },
360+ expectedErr : true ,
361+ },
362+ {
363+ name : "default V1 image exists and instance supports V1 images (4.12+)" ,
364+ clusterDeployment : testAzureClusterDeployment412 (),
365+ pool : testAzurePool (),
366+ mockAzureClient : func (mockCtrl * gomock.Controller , client * mockazure.MockClient ) {
367+ mockListResourceSKUs (mockCtrl , client , []string {"zone1" , "zone2" , "zone3" })
368+ mockGetVMCapabilities (mockCtrl , client , "V1,V2" )
369+ mockListImagesByResourceGroup (mockCtrl , client , []compute.Image {
370+ testAzureImage (compute .HyperVGenerationTypesV1 ),
371+ })
372+ },
373+ expectedMachineSetReplicas : map [string ]int64 {
374+ generateAzureMachineSetName ("zone1" ): 1 ,
375+ generateAzureMachineSetName ("zone2" ): 1 ,
376+ generateAzureMachineSetName ("zone3" ): 1 ,
377+ },
378+ // V1 image is chosen for machinepool
379+ expectedImage : & machineapi.Image {
380+ ResourceID : "/resourceGroups/foo-12345-rg/providers/Microsoft.Compute/galleries/gallery_foo_12345/images/foo-12345/versions/latest" ,
381+ },
382+ },
383+ {
384+ name : "default V1 and V2 images exist but instance only supports V1 images (4.12+)" ,
385+ clusterDeployment : testAzureClusterDeployment412 (),
386+ pool : testAzurePool (),
387+ mockAzureClient : func (mockCtrl * gomock.Controller , client * mockazure.MockClient ) {
388+ mockListResourceSKUs (mockCtrl , client , []string {"zone1" , "zone2" , "zone3" })
389+ mockGetVMCapabilities (mockCtrl , client , "V1" )
390+ mockListImagesByResourceGroup (mockCtrl , client , []compute.Image {
391+ testAzureImage (compute .HyperVGenerationTypesV1 ),
392+ testAzureImage (compute .HyperVGenerationTypesV2 ),
393+ })
394+ },
395+ expectedMachineSetReplicas : map [string ]int64 {
396+ generateAzureMachineSetName ("zone1" ): 1 ,
397+ generateAzureMachineSetName ("zone2" ): 1 ,
398+ generateAzureMachineSetName ("zone3" ): 1 ,
399+ },
400+ // V1 image is chosen for machinepool
401+ expectedImage : & machineapi.Image {
402+ ResourceID : "/resourceGroups/foo-12345-rg/providers/Microsoft.Compute/galleries/gallery_foo_12345/images/foo-12345/versions/latest" ,
403+ },
404+ },
405+ {
406+ name : "default V1 and V2 images exist and instance supports V1 and V2 images (4.12+)" ,
407+ clusterDeployment : testAzureClusterDeployment412 (),
408+ pool : testAzurePool (),
409+ mockAzureClient : func (mockCtrl * gomock.Controller , client * mockazure.MockClient ) {
410+ mockListResourceSKUs (mockCtrl , client , []string {"zone1" , "zone2" , "zone3" })
411+ mockGetVMCapabilities (mockCtrl , client , "V1,V2" )
412+ mockListImagesByResourceGroup (mockCtrl , client , []compute.Image {
413+ testAzureImage (compute .HyperVGenerationTypesV1 ),
414+ testAzureImage (compute .HyperVGenerationTypesV2 ),
415+ })
416+ },
417+ expectedMachineSetReplicas : map [string ]int64 {
418+ generateAzureMachineSetName ("zone1" ): 1 ,
419+ generateAzureMachineSetName ("zone2" ): 1 ,
420+ generateAzureMachineSetName ("zone3" ): 1 ,
421+ },
422+ // V2 ("-gen2") image is chosen for machinepool
423+ expectedImage : & machineapi.Image {
424+ ResourceID : "/resourceGroups/foo-12345-rg/providers/Microsoft.Compute/galleries/gallery_foo_12345/images/foo-12345-gen2/versions/latest" ,
425+ },
426+ },
427+ {
428+ name : "default V1 and V2 images exist but instance only supports V2 images (4.12+)" ,
429+ clusterDeployment : testAzureClusterDeployment412 (),
430+ pool : testAzurePool (),
431+ mockAzureClient : func (mockCtrl * gomock.Controller , client * mockazure.MockClient ) {
432+ mockListResourceSKUs (mockCtrl , client , []string {"zone1" , "zone2" , "zone3" })
433+ mockGetVMCapabilities (mockCtrl , client , "V2" )
434+ mockListImagesByResourceGroup (mockCtrl , client , []compute.Image {
435+ testAzureImage (compute .HyperVGenerationTypesV1 ),
436+ testAzureImage (compute .HyperVGenerationTypesV2 ),
437+ })
438+ },
439+ expectedMachineSetReplicas : map [string ]int64 {
440+ generateAzureMachineSetName ("zone1" ): 1 ,
441+ generateAzureMachineSetName ("zone2" ): 1 ,
442+ generateAzureMachineSetName ("zone3" ): 1 ,
443+ },
444+ // V2 ("-gen2") image is chosen for machinepool
445+ expectedImage : & machineapi.Image {
446+ ResourceID : "/resourceGroups/foo-12345-rg/providers/Microsoft.Compute/galleries/gallery_foo_12345/images/foo-12345-gen2/versions/latest" ,
447+ },
448+ },
449+ {
450+ name : "machinepool provides osImage (4.12+)" ,
451+ clusterDeployment : testAzureClusterDeployment412 (),
452+ pool : func () * hivev1.MachinePool {
453+ mp := testAzurePool ()
454+ mp .Spec .Platform .Azure .OSImage = & hivev1azure.OSImage {
455+ Publisher : "testpublisher" ,
456+ Offer : "testoffer" ,
457+ SKU : "testsku" ,
458+ Version : "testversion" ,
459+ }
460+ return mp
461+ }(),
462+ mockAzureClient : func (mockCtrl * gomock.Controller , client * mockazure.MockClient ) {
463+ mockGetVMCapabilities (mockCtrl , client , "V1,V2" )
464+ mockListResourceSKUs (mockCtrl , client , []string {"zone1" , "zone2" , "zone3" })
465+ },
466+ expectedMachineSetReplicas : map [string ]int64 {
467+ generateAzureMachineSetName ("zone1" ): 1 ,
468+ generateAzureMachineSetName ("zone2" ): 1 ,
469+ generateAzureMachineSetName ("zone3" ): 1 ,
470+ },
471+ expectedImage : & machineapi.Image {
472+ Publisher : "testpublisher" ,
473+ Offer : "testoffer" ,
474+ SKU : "testsku" ,
475+ Version : "testversion" ,
476+ Type : "MarketplaceWithPlan" ,
477+ },
478+ },
254479 }
255480
256481 for _ , test := range tests {
@@ -364,6 +589,12 @@ func testAzureClusterDeployment() *hivev1.ClusterDeployment {
364589 return cd
365590}
366591
592+ func testAzureClusterDeployment412 () * hivev1.ClusterDeployment {
593+ cd := testAzureClusterDeployment ()
594+ cd .Labels [constants .VersionMajorMinorPatchLabel ] = "4.12.0"
595+ return cd
596+ }
597+
367598func testAzureImage (hyperVGen compute.HyperVGenerationTypes ) compute.Image {
368599 return compute.Image {
369600 ImageProperties : & compute.ImageProperties {
0 commit comments