Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions pkg/provider/azure/action/windows/windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ func (r *WindowsRequest) deployer(ctx *pulumi.Context) error {
AdminUsername: r.AdminUsername,
AdminPasswd: adminPasswd,
SpotPrice: spotPrice,
Location: rgLocation,
}
vm, err := vmr.Create(ctx)
if err != nil {
Expand Down
54 changes: 54 additions & 0 deletions pkg/provider/azure/data/images.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,3 +54,57 @@ func IsImageOffered(req ImageRequest) bool {
}
return true
}

func SkuG2Support(location string, publisher string, offer string, sku string) (string, error) {
cred, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
return "", err
}
subscriptionId := os.Getenv("AZURE_SUBSCRIPTION_ID")

clientFactory, err := armcompute.NewClientFactory(subscriptionId, cred, nil)
if err != nil {
return "", err
}
imagesClient := clientFactory.NewVirtualMachineImagesClient()
if ! verify_g2(imagesClient, location, publisher, offer, sku) {
finalSKU, err := get_g2_sku(imagesClient, location, publisher, offer, sku)
if err == nil && finalSKU != "" {
if verify_g2(imagesClient, location, publisher, offer, finalSKU) {
fmt.Printf("%s is g1, Using SKU %s\n", sku, finalSKU)
return finalSKU, nil
}
}
} else {
return sku, nil
}
return "", fmt.Errorf("the SKU %s is not support for G2", sku)
}

func verify_g2(imagesClient *armcompute.VirtualMachineImagesClient, location string, publisher string, offer string, sku string) bool {
// List available image versions
resp, err := imagesClient.List(context.Background(),location, publisher, offer, sku, nil)
if err != nil {
return false
}

image := resp.VirtualMachineImageResourceArray[0]
version := *image.Name
resps, _ := imagesClient.Get(context.Background(),location, publisher, offer, sku, version, nil)
info := resps.VirtualMachineImage
generation := *info.Properties.HyperVGeneration
return generation == "V2"
}

func get_g2_sku(imagesClient *armcompute.VirtualMachineImagesClient, location string, publisher string, offer string, originSKU string) (string, error) {
resp, err := imagesClient.ListSKUs(context.Background(),location, publisher, offer, nil)
if err != nil {
return "", err
}
for _, sku := range resp.VirtualMachineImageResourceArray {
if strings.HasPrefix(*sku.Name, originSKU+"-") {
return *sku.Name, nil
}
}
return "", nil
}
8 changes: 7 additions & 1 deletion pkg/provider/azure/module/virtual-machine/virtual-machine.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"github.com/pulumi/pulumi-tls/sdk/v5/go/tls"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
maptContext "github.com/redhat-developer/mapt/pkg/manager/context"
"github.com/redhat-developer/mapt/pkg/provider/azure/data"
"github.com/redhat-developer/mapt/pkg/util/logging"
resourcesUtil "github.com/redhat-developer/mapt/pkg/util/resources"
)
Expand Down Expand Up @@ -38,6 +39,7 @@ type VirtualMachineRequest struct {
AdminPasswd *random.RandomPassword
// Linux optional
Userdata string
Location string
}

// Create virtual machine based on request + export to context
Expand All @@ -48,10 +50,14 @@ func (r *VirtualMachineRequest) Create(ctx *pulumi.Context) (*compute.VirtualMac
imageReferenceArgs = compute.ImageReferenceArgs{
CommunityGalleryImageId: pulumi.String(r.ImageID)}
} else {
finalSku, err := data.SkuG2Support(r.Location, r.Publisher, r.Offer, r.Sku)
if err != nil {
return nil, err
}
imageReferenceArgs = compute.ImageReferenceArgs{
Publisher: pulumi.String(r.Publisher),
Offer: pulumi.String(r.Offer),
Sku: pulumi.String(r.Sku),
Sku: pulumi.String(finalSku),
Version: pulumi.String("latest"),
}
}
Expand Down