pkg/armhelpers/support_validator.go (103 lines of code) (raw):
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
package armhelpers
import (
"context"
"fmt"
"github.com/Azure/aks-engine-azurestack/pkg/api"
"github.com/pkg/errors"
log "github.com/sirupsen/logrus"
)
type validationResult struct {
image api.AzureOSImageConfig
errorData error
}
// ValidateRequiredImages checks that the OS images required by both
// master and agent pools are available on the target cloud
func ValidateRequiredImages(ctx context.Context, location string, p *api.Properties, client AKSEngineClient) error {
if fetcher, ok := client.(VMImageFetcher); ok {
missingImages := make(map[api.Distro]validationResult)
for distro, i := range requiredImages(p) {
log.Debugln(fmt.Sprintf("Validate OS image is available on the target cloud: %s, %s, %s, %s", i.ImagePublisher, i.ImageOffer, i.ImageSku, i.ImageVersion))
if i.ImageVersion == "latest" {
list, err := fetcher.ListVirtualMachineImages(ctx, location, i.ImagePublisher, i.ImageOffer, i.ImageSku)
if err != nil || len(list) == 0 {
missingImages[distro] = validationResult{
image: i,
errorData: err,
}
}
} else {
if _, err := fetcher.GetVirtualMachineImage(ctx, location, i.ImagePublisher, i.ImageOffer, i.ImageSku, i.ImageVersion); err != nil {
missingImages[distro] = validationResult{
image: i,
errorData: err,
}
}
}
}
if len(missingImages) == 0 {
return nil
}
return printErrorIfAny(missingImages)
}
return errors.New("parameter client is not a VMImageFetcher")
}
func requiredImages(p *api.Properties) map[api.Distro]api.AzureOSImageConfig {
images := make(map[api.Distro]api.AzureOSImageConfig)
images[p.MasterProfile.Distro] = toImageConfig(p.MasterProfile.Distro)
for _, app := range p.AgentPoolProfiles {
if app.OSType == api.Windows {
images[app.Distro] = toImageConfigWindows(p.WindowsProfile)
} else {
images[app.Distro] = toImageConfig(app.Distro)
}
}
return images
}
func printErrorIfAny(missingImages map[api.Distro]validationResult) error {
for _, value := range missingImages {
i := value.image
log.Errorf("error: %+v", value.errorData)
log.Errorf("Image Publisher: %s, Offer: %s, SKU: %s, Version: %s", i.ImagePublisher, i.ImageOffer, i.ImageSku, i.ImageVersion)
}
return errors.New("some VM images are missing on the target cloud")
}
func toImageConfig(distro api.Distro) api.AzureOSImageConfig {
if distro == "" {
return api.Ubuntu1604OSImageConfig
}
switch distro {
case api.Ubuntu:
return api.Ubuntu1604OSImageConfig
case api.Ubuntu1804:
return api.Ubuntu1804OSImageConfig
case api.Ubuntu1804Gen2:
return api.Ubuntu1804Gen2OSImageConfig
case api.Ubuntu2004:
return api.Ubuntu2004OSImageConfig
case api.Ubuntu2204:
return api.Ubuntu2204OSImageConfig
case api.Flatcar:
return api.FlatcarImageConfig
case api.AKSUbuntu1604:
return api.AKSUbuntu1604OSImageConfig
case api.AKSUbuntu1804:
return api.AKSUbuntu1804OSImageConfig
case api.AKSUbuntu2004:
return api.AKSUbuntu2004OSImageConfig
case api.AKSUbuntu2204:
return api.AKSUbuntu2204OSImageConfig
case api.ACC1604:
return api.ACC1604OSImageConfig
default:
return api.Ubuntu1604OSImageConfig
}
}
func toImageConfigWindows(profile *api.WindowsProfile) api.AzureOSImageConfig {
if profile != nil {
return api.AzureOSImageConfig{
ImageOffer: profile.WindowsOffer,
ImageSku: profile.WindowsSku,
ImagePublisher: profile.WindowsPublisher,
ImageVersion: profile.ImageVersion,
}
}
return api.AKSWindowsServer2019ContainerDOSImageConfig
}