diff --git a/pkg/compute/guestdrivers/azure.go b/pkg/compute/guestdrivers/azure.go index febce10f5e..a688250033 100644 --- a/pkg/compute/guestdrivers/azure.go +++ b/pkg/compute/guestdrivers/azure.go @@ -17,6 +17,7 @@ package guestdrivers import ( "context" "fmt" + "strings" "yunion.io/x/jsonutils" "yunion.io/x/pkg/errors" @@ -160,6 +161,37 @@ func (self *SAzureGuestDriver) ValidateCreateData(ctx context.Context, userCred if !find { return nil, httperrors.NewResourceNotFoundError("failed to find subformat vhd for image %s, please append 'vhd' for glance options(target_image_formats)", image.Name) } + } else { + if len(input.InstanceType) > 0 { + if image.UEFI.IsFalse() { + if strings.HasPrefix(input.InstanceType, "Standard_M") && strings.HasSuffix(input.InstanceType, "v2") { + return nil, httperrors.NewNotSupportedError("Azure Mv2-series instance sku only support UEFI image") + } + } else { + // https://docs.microsoft.com/en-us/azure/virtual-machines/windows/generation-2 + if !(strings.HasPrefix(input.InstanceType, "Standard_B") || // B-series + (strings.HasPrefix(input.InstanceType, "Standard_DC") && strings.HasSuffix(input.InstanceType, "s_v2") || input.InstanceType == "Standard_DC8_v2") || // DCsv2-series + (strings.HasPrefix(input.InstanceType, "Standard_DS") && strings.HasSuffix(input.InstanceType, "v2")) || // DSv2-series + (strings.HasPrefix(input.InstanceType, "Standard_DS") && strings.HasSuffix(input.InstanceType, "s_v3")) || // Dsv3-series + (strings.HasPrefix(input.InstanceType, "Standard_D") && strings.HasSuffix(input.InstanceType, "as_v4")) || // Dasv4-series + (strings.HasPrefix(input.InstanceType, "Standard_E") && strings.HasSuffix(input.InstanceType, "s_v3")) || // Esv3-series + (strings.HasPrefix(input.InstanceType, "Standard_E") && strings.HasSuffix(input.InstanceType, "as_v4")) || // Easv4-series + (strings.HasPrefix(input.InstanceType, "Standard_F") && strings.HasSuffix(input.InstanceType, "s_v2")) || // Fsv2-series + (strings.HasPrefix(input.InstanceType, "Standard_GS")) || // GS-series + (strings.HasPrefix(input.InstanceType, "Standard_HB")) || // HB-series + (strings.HasPrefix(input.InstanceType, "Standard_HC")) || // HC-series + (strings.HasPrefix(input.InstanceType, "Standard_L") && strings.HasSuffix(input.InstanceType, "s")) || // Ls-series + (strings.HasPrefix(input.InstanceType, "Standard_L") && strings.HasSuffix(input.InstanceType, "s_v2")) || // Ls-series + (strings.HasPrefix(input.InstanceType, "Standard_M")) || // M-series + (strings.HasPrefix(input.InstanceType, "Standard_M") && strings.HasSuffix(input.InstanceType, "s_v2")) || // Mv2-series + (strings.HasPrefix(input.InstanceType, "Standard_NC") && strings.HasSuffix(input.InstanceType, "s_v2")) || // NCv2-series + (strings.HasPrefix(input.InstanceType, "Standard_NC") && strings.HasSuffix(input.InstanceType, "s_v3")) || // NCv3-series + (strings.HasPrefix(input.InstanceType, "Standard_ND")) || // ND-series + (strings.HasPrefix(input.InstanceType, "Standard_NV") && strings.HasSuffix(input.InstanceType, "s_v3"))) { // NVv3-series + return nil, httperrors.NewUnsupportOperationError("Azure UEFI image %s not support this instance sku", image.Name) + } + } + } } } return input, nil diff --git a/pkg/multicloud/azure/image.go b/pkg/multicloud/azure/image.go index d25058d8ec..8bf9c528b6 100644 --- a/pkg/multicloud/azure/image.go +++ b/pkg/multicloud/azure/image.go @@ -328,6 +328,7 @@ func (self *SRegion) getOfferedImages(publishersFilter []string, offersFilter [] image.ImageType = imageType image.Properties.StorageProfile.OsDisk.DiskSizeGB = int32(_image.Properties.OsDiskImage.SizeInGb) image.Properties.StorageProfile.OsDisk.OsType = _image.Properties.OsDiskImage.OperatingSystem + image.Properties.HyperVGeneration = _image.Properties.HyperVGeneration images = append(images, image) } } @@ -447,8 +448,9 @@ type SOsDiskImage struct { } type SAzureImageResourceProperties struct { - ReplicaType string `json:"replicaType"` - OsDiskImage SOsDiskImage `json:"osDiskImage"` + ReplicaType string `json:"replicaType"` + OsDiskImage SOsDiskImage `json:"osDiskImage"` + HyperVGeneration string `json:"hyperVGeneration,omitempty"` } type SAzureImageResource struct { @@ -587,6 +589,7 @@ func (region *SRegion) getOfferedImage(offerId string) (SImage, error) { if err == nil { image.Properties.StorageProfile.OsDisk.DiskSizeGB = int32(_image.Properties.OsDiskImage.SizeInGb) image.Properties.StorageProfile.OsDisk.OperatingSystem = _image.Properties.OsDiskImage.OperatingSystem + image.Properties.HyperVGeneration = _image.Properties.HyperVGeneration } return image, nil }