Skip to content

Commit

Permalink
il5 series support, vm.go improvements and tests (Azure#2086)
Browse files Browse the repository at this point in the history
  • Loading branch information
cadenmarchese authored and ellis-johnson committed Jun 3, 2022
1 parent d1cc53f commit ababdec
Show file tree
Hide file tree
Showing 6 changed files with 275 additions and 74 deletions.
18 changes: 12 additions & 6 deletions pkg/api/admin/openshiftcluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -176,12 +176,18 @@ const (
VMSizeStandardD16sV3 VMSize = "Standard_D16s_v3"
VMSizeStandardD32sV3 VMSize = "Standard_D32s_v3"

VMSizeStandardE4sV3 VMSize = "Standard_E4s_v3"
VMSizeStandardE8sV3 VMSize = "Standard_E8s_v3"
VMSizeStandardE16sV3 VMSize = "Standard_E16s_v3"
VMSizeStandardE32sV3 VMSize = "Standard_E32s_v3"
VMSizeStandardE64isV3 VMSize = "Standard_E64is_v3"
VMSizeStandardE64iV3 VMSize = "Standard_E64i_v3"
VMSizeStandardE4sV3 VMSize = "Standard_E4s_v3"
VMSizeStandardE8sV3 VMSize = "Standard_E8s_v3"
VMSizeStandardE16sV3 VMSize = "Standard_E16s_v3"
VMSizeStandardE32sV3 VMSize = "Standard_E32s_v3"
VMSizeStandardE64isV3 VMSize = "Standard_E64is_v3"
VMSizeStandardE64iV3 VMSize = "Standard_E64i_v3"
VMSizeStandardE80isV4 VMSize = "Standard_E80is_v4"
VMSizeStandardE80idsV4 VMSize = "Standard_E80ids_v4"
VMSizeStandardE104iV5 VMSize = "Standard_E104i_v5"
VMSizeStandardE104isV5 VMSize = "Standard_E104is_v5"
VMSizeStandardE104idV5 VMSize = "Standard_E104id_v5"
VMSizeStandardE104idsV5 VMSize = "Standard_E104ids_v5"

VMSizeStandardF4sV2 VMSize = "Standard_F4s_v2"
VMSizeStandardF8sV2 VMSize = "Standard_F8s_v2"
Expand Down
18 changes: 12 additions & 6 deletions pkg/api/openshiftcluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -294,12 +294,18 @@ const (
VMSizeStandardD16sV3 VMSize = "Standard_D16s_v3"
VMSizeStandardD32sV3 VMSize = "Standard_D32s_v3"

VMSizeStandardE4sV3 VMSize = "Standard_E4s_v3"
VMSizeStandardE8sV3 VMSize = "Standard_E8s_v3"
VMSizeStandardE16sV3 VMSize = "Standard_E16s_v3"
VMSizeStandardE32sV3 VMSize = "Standard_E32s_v3"
VMSizeStandardE64isV3 VMSize = "Standard_E64is_v3"
VMSizeStandardE64iV3 VMSize = "Standard_E64i_v3"
VMSizeStandardE4sV3 VMSize = "Standard_E4s_v3"
VMSizeStandardE8sV3 VMSize = "Standard_E8s_v3"
VMSizeStandardE16sV3 VMSize = "Standard_E16s_v3"
VMSizeStandardE32sV3 VMSize = "Standard_E32s_v3"
VMSizeStandardE64isV3 VMSize = "Standard_E64is_v3"
VMSizeStandardE64iV3 VMSize = "Standard_E64i_v3"
VMSizeStandardE80isV4 VMSize = "Standard_E80is_v4"
VMSizeStandardE80idsV4 VMSize = "Standard_E80ids_v4"
VMSizeStandardE104iV5 VMSize = "Standard_E104i_v5"
VMSizeStandardE104isV5 VMSize = "Standard_E104is_v5"
VMSizeStandardE104idV5 VMSize = "Standard_E104id_v5"
VMSizeStandardE104idsV5 VMSize = "Standard_E104ids_v5"

VMSizeStandardF4sV2 VMSize = "Standard_F4s_v2"
VMSizeStandardF8sV2 VMSize = "Standard_F8s_v2"
Expand Down
18 changes: 12 additions & 6 deletions pkg/api/validate/dynamic/quota.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,18 @@ func addRequiredResources(requiredResources map[string]int, vmSize api.VMSize, c
api.VMSizeStandardD16sV3: {CoreCount: 16, Family: "standardDSv3Family"},
api.VMSizeStandardD32sV3: {CoreCount: 32, Family: "standardDSv3Family"},

api.VMSizeStandardE4sV3: {CoreCount: 4, Family: "standardESv3Family"},
api.VMSizeStandardE8sV3: {CoreCount: 8, Family: "standardESv3Family"},
api.VMSizeStandardE16sV3: {CoreCount: 16, Family: "standardESv3Family"},
api.VMSizeStandardE32sV3: {CoreCount: 32, Family: "standardESv3Family"},
api.VMSizeStandardE64isV3: {CoreCount: 64, Family: "standardESv3Family"},
api.VMSizeStandardE64iV3: {CoreCount: 64, Family: "standardESv3Family"},
api.VMSizeStandardE4sV3: {CoreCount: 4, Family: "standardESv3Family"},
api.VMSizeStandardE8sV3: {CoreCount: 8, Family: "standardESv3Family"},
api.VMSizeStandardE16sV3: {CoreCount: 16, Family: "standardESv3Family"},
api.VMSizeStandardE32sV3: {CoreCount: 32, Family: "standardESv3Family"},
api.VMSizeStandardE64isV3: {CoreCount: 64, Family: "standardESv3Family"},
api.VMSizeStandardE64iV3: {CoreCount: 64, Family: "standardESv3Family"},
api.VMSizeStandardE80isV4: {CoreCount: 80, Family: "standardEISv4Family"},
api.VMSizeStandardE80idsV4: {CoreCount: 80, Family: "standardEIDSv4Family"},
api.VMSizeStandardE104iV5: {CoreCount: 104, Family: "standardEIv5Family"},
api.VMSizeStandardE104isV5: {CoreCount: 104, Family: "standardEISv5Family"},
api.VMSizeStandardE104idV5: {CoreCount: 104, Family: "standardEIDv5Family"},
api.VMSizeStandardE104idsV5: {CoreCount: 104, Family: "standardEIDSv5Family"},

api.VMSizeStandardF4sV2: {CoreCount: 4, Family: "standardFSv2Family"},
api.VMSizeStandardF8sV2: {CoreCount: 8, Family: "standardFSv2Family"},
Expand Down
60 changes: 58 additions & 2 deletions pkg/api/validate/dynamic/sku_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,22 +23,50 @@ func TestValidateVMSku(t *testing.T) {
name string
restrictions mgmtcompute.ResourceSkuRestrictionsReasonCode
restrictionLocation *[]string
restrictedZones []string
targetLocation string
workerProfile1Sku string
workerProfile2Sku string
masterProfileSku string
availableSku string
availableSku2 string
restrictedSku string
resourceSkusClientErr error
wantErr string
}{
{
name: "worker and master sku are valid",
name: "worker and master skus are valid",
workerProfile1Sku: "Standard_D4s_v2",
workerProfile2Sku: "Standard_D4s_v2",
masterProfileSku: "Standard_D4s_v2",
availableSku: "Standard_D4s_v2",
},
{
name: "worker and master skus are distinct, both valid",
workerProfile1Sku: "Standard_E104i_v5",
workerProfile2Sku: "Standard_E104i_v5",
masterProfileSku: "Standard_D4s_v2",
availableSku: "Standard_E104i_v5",
availableSku2: "Standard_D4s_v2",
},
{
name: "worker and master skus are distinct, one invalid",
workerProfile1Sku: "Standard_E104i_v5",
workerProfile2Sku: "Standard_E104i_v5",
masterProfileSku: "Standard_D4s_v2",
availableSku: "Standard_E104i_v5",
availableSku2: "Standard_E104i_v5",
wantErr: "400: InvalidParameter: properties.masterProfile.VMSize: The selected SKU 'Standard_D4s_v2' is unavailable in region 'eastus'",
},
{
name: "worker and master skus are distinct, both invalid",
workerProfile1Sku: "Standard_E104i_v5",
workerProfile2Sku: "Standard_E104i_v5",
masterProfileSku: "Standard_D4s_v2",
availableSku: "Standard_L8s_v2",
availableSku2: "Standard_L16s_v2",
wantErr: "400: InvalidParameter: properties.masterProfile.VMSize: The selected SKU 'Standard_D4s_v2' is unavailable in region 'eastus'",
},
{
name: "unable to retrieve skus information",
workerProfile1Sku: "Standard_D4s_v2",
Expand Down Expand Up @@ -96,12 +124,30 @@ func TestValidateVMSku(t *testing.T) {
restrictedSku: "Standard_L80",
wantErr: "400: InvalidParameter: properties.masterProfile.VMSize: The selected SKU 'Standard_L80' is restricted in region 'eastus' for selected subscription",
},
{
name: "sku is restricted in a single zone",
restrictions: mgmtcompute.NotAvailableForSubscription,
restrictionLocation: &[]string{
"eastus",
},
restrictedZones: []string{"3"},
workerProfile1Sku: "Standard_D4s_v2",
workerProfile2Sku: "Standard_D4s_v2",
masterProfileSku: "Standard_L80",
availableSku: "Standard_D4s_v2",
restrictedSku: "Standard_L80",
wantErr: "400: InvalidParameter: properties.masterProfile.VMSize: The selected SKU 'Standard_L80' is restricted in region 'eastus' for selected subscription",
},
} {
t.Run(tt.name, func(t *testing.T) {
if tt.targetLocation == "" {
tt.targetLocation = "eastus"
}

if tt.restrictedZones == nil {
tt.restrictedZones = []string{"1", "2", "3"}
}

controller := gomock.NewController(t)
defer controller.Finish()

Expand Down Expand Up @@ -132,11 +178,21 @@ func TestValidateVMSku(t *testing.T) {
Capabilities: &[]mgmtcompute.ResourceSkuCapabilities{},
ResourceType: to.StringPtr("virtualMachines"),
},
{
Name: &tt.availableSku2,
Locations: &[]string{"eastus"},
LocationInfo: &[]mgmtcompute.ResourceSkuLocationInfo{
{Zones: &[]string{"1, 2, 3"}},
},
Restrictions: &[]mgmtcompute.ResourceSkuRestrictions{},
Capabilities: &[]mgmtcompute.ResourceSkuCapabilities{},
ResourceType: to.StringPtr("virtualMachines"),
},
{
Name: &tt.restrictedSku,
Locations: &[]string{tt.targetLocation},
LocationInfo: &[]mgmtcompute.ResourceSkuLocationInfo{
{Zones: &[]string{"1, 2, 3"}},
{Zones: &tt.restrictedZones},
},
Restrictions: &[]mgmtcompute.ResourceSkuRestrictions{
{
Expand Down
130 changes: 76 additions & 54 deletions pkg/api/validate/vm.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,66 +7,88 @@ import (
"github.com/Azure/ARO-RP/pkg/api"
)

var supportedMasterVMSizes = map[api.VMSize]bool{
// General purpose
api.VMSizeStandardD8sV3: true,
api.VMSizeStandardD16sV3: true,
api.VMSizeStandardD32sV3: true,
// Memory optimized
api.VMSizeStandardE64iV3: true,
api.VMSizeStandardE64isV3: true,
api.VMSizeStandardE80isV4: true,
api.VMSizeStandardE80idsV4: true,
api.VMSizeStandardE104iV5: true,
api.VMSizeStandardE104isV5: true,
api.VMSizeStandardE104idV5: true,
api.VMSizeStandardE104idsV5: true,
// Compute optimized
api.VMSizeStandardF72sV2: true,
// Memory and storage optimized
api.VMSizeStandardGS5: true,
api.VMSizeStandardG5: true,
// Memory and compute optimized
api.VMSizeStandardM128ms: true,
}

var supportedWorkerVMSizes = map[api.VMSize]bool{
// General purpose
api.VMSizeStandardD4asV4: true,
api.VMSizeStandardD8asV4: true,
api.VMSizeStandardD16asV4: true,
api.VMSizeStandardD32asV4: true,
api.VMSizeStandardD4sV3: true,
api.VMSizeStandardD8sV3: true,
api.VMSizeStandardD16sV3: true,
api.VMSizeStandardD32sV3: true,
// Memory optimized
api.VMSizeStandardE4sV3: true,
api.VMSizeStandardE8sV3: true,
api.VMSizeStandardE16sV3: true,
api.VMSizeStandardE32sV3: true,
api.VMSizeStandardE64isV3: true,
api.VMSizeStandardE64iV3: true,
api.VMSizeStandardE80isV4: true,
api.VMSizeStandardE80idsV4: true,
api.VMSizeStandardE104iV5: true,
api.VMSizeStandardE104isV5: true,
api.VMSizeStandardE104idV5: true,
api.VMSizeStandardE104idsV5: true,
// Compute optimized
api.VMSizeStandardF4sV2: true,
api.VMSizeStandardF8sV2: true,
api.VMSizeStandardF16sV2: true,
api.VMSizeStandardF32sV2: true,
api.VMSizeStandardF72sV2: true,
// Memory and storage optimized
api.VMSizeStandardG5: true,
api.VMSizeStandardGS5: true,
// Memory and compute optimized
api.VMSizeStandardM128ms: true,
// Storage optimized
api.VMSizeStandardL4s: true,
api.VMSizeStandardL8s: true,
api.VMSizeStandardL16s: true,
api.VMSizeStandardL32s: true,
api.VMSizeStandardL8sV2: true,
api.VMSizeStandardL16sV2: true,
api.VMSizeStandardL32sV2: true,
api.VMSizeStandardL48sV2: true,
api.VMSizeStandardL64sV2: true,
}

func DiskSizeIsValid(sizeGB int) bool {
return sizeGB >= 128
}

func VMSizeIsValid(vmSize api.VMSize, requiredD2sV3Workers, isMaster bool) bool {
if isMaster {
switch vmSize {
case api.VMSizeStandardD8sV3,
api.VMSizeStandardD16sV3,
api.VMSizeStandardD32sV3,
api.VMSizeStandardE64iV3,
api.VMSizeStandardE64isV3,
api.VMSizeStandardF72sV2,
api.VMSizeStandardGS5,
api.VMSizeStandardG5,
api.VMSizeStandardM128ms:
return true
}
} else {
if requiredD2sV3Workers {
switch vmSize {
case api.VMSizeStandardD2sV3:
return true
}
} else {
switch vmSize {
case api.VMSizeStandardD4asV4,
api.VMSizeStandardD8asV4,
api.VMSizeStandardD16asV4,
api.VMSizeStandardD32asV4,
api.VMSizeStandardD4sV3,
api.VMSizeStandardD8sV3,
api.VMSizeStandardD16sV3,
api.VMSizeStandardD32sV3,
api.VMSizeStandardE4sV3,
api.VMSizeStandardE8sV3,
api.VMSizeStandardE16sV3,
api.VMSizeStandardE32sV3,
api.VMSizeStandardE64iV3,
api.VMSizeStandardE64isV3,
api.VMSizeStandardF4sV2,
api.VMSizeStandardF8sV2,
api.VMSizeStandardF16sV2,
api.VMSizeStandardF32sV2,
api.VMSizeStandardF72sV2,
api.VMSizeStandardG5,
api.VMSizeStandardGS5,
api.VMSizeStandardM128ms,
api.VMSizeStandardL4s,
api.VMSizeStandardL8s,
api.VMSizeStandardL16s,
api.VMSizeStandardL32s,
api.VMSizeStandardL8sV2,
api.VMSizeStandardL16sV2,
api.VMSizeStandardL32sV2,
api.VMSizeStandardL48sV2,
api.VMSizeStandardL64sV2:
return true
}
}
return supportedMasterVMSizes[vmSize]
}

if (supportedWorkerVMSizes[vmSize] && !requiredD2sV3Workers) ||
(requiredD2sV3Workers && vmSize == api.VMSizeStandardD2sV3) {
return true
}

return false
}
Loading

0 comments on commit ababdec

Please sign in to comment.