pkg/agent/datamodel/sig_config.go (906 lines of code) (raw):

package datamodel import ( _ "embed" "encoding/json" "fmt" "strings" ) const ( AzurePublicCloudSigTenantID string = "33e01921-4d64-4f8c-a055-5bdaffd5e33d" // AME Tenant AzurePublicCloudSigSubscription string = "109a5e88-712a-48ae-9078-9ca8b3c81345" // AKS VHD ) // SIGAzureEnvironmentSpecConfig is the overall configuration differences in different cloud environments. /* TODO(tonyxu) merge this with AzureEnvironmentSpecConfig from aks-engine(pkg/api/azenvtypes.go) once it's moved into AKS RP. */ type SIGAzureEnvironmentSpecConfig struct { CloudName string `json:"cloudName,omitempty"` SigTenantID string `json:"sigTenantID,omitempty"` SubscriptionID string `json:"subscriptionID,omitempty"` SigUbuntuImageConfig map[Distro]SigImageConfig `json:"sigUbuntuImageConfig,omitempty"` SigCBLMarinerImageConfig map[Distro]SigImageConfig `json:"sigCBLMarinerImageConfig,omitempty"` SigAzureLinuxImageConfig map[Distro]SigImageConfig `json:"sigAzureLinuxImageConfig,omitempty"` SigWindowsImageConfig map[Distro]SigImageConfig `json:"sigWindowsImageConfig,omitempty"` SigUbuntuEdgeZoneImageConfig map[Distro]SigImageConfig `json:"sigUbuntuEdgeZoneImageConfig,omitempty"` // TODO(adadilli) add PIR constants as well } // EnvironmentInfo represents the set of required fields to determine specifics // about the customer's environment. This info will be used in baker APIs to // return the correct SIG image config. type EnvironmentInfo struct { // SubscriptionID is the customer's subscription ID. SubscriptionID string // TenantID is the customer's tenant ID. TenantID string // Region is the customer's region (e.g. eastus). Region string } // SIGConfig is used to hold configuration parameters to access AKS VHDs stored in a SIG. type SIGConfig struct { TenantID string `json:"tenantID"` SubscriptionID string `json:"subscriptionID"` Galleries map[string]SIGGalleryConfig `json:"galleries"` } type SIGGalleryConfig struct { GalleryName string `json:"galleryName"` ResourceGroup string `json:"resourceGroup"` } type SigImageConfigOpt func(*SigImageConfig) func GetCloudTargetEnv(location string) string { loc := strings.ToLower(strings.Join(strings.Fields(location), "")) switch { case strings.HasPrefix(loc, "china"): return AzureChinaCloud case loc == "germanynortheast" || loc == "germanycentral": return AzureGermanCloud case strings.HasPrefix(loc, "usgov") || strings.HasPrefix(loc, "usdod"): return AzureUSGovernmentCloud case strings.HasPrefix(strings.ToLower(loc), "usnat"): return USNatCloud case strings.HasPrefix(strings.ToLower(loc), "ussec"): return USSecCloud default: return AzurePublicCloud } } /* AvailableUbuntu1804Distros : TODO(amaheshwari): these vars are not consumed by Agentbaker but by RP. do a cleanup to remove these after 20.04 work. */ //nolint:gochecknoglobals var AvailableUbuntu1804Distros = []Distro{ AKSUbuntu1804, AKSUbuntu1804Gen2, AKSUbuntuGPU1804, AKSUbuntuGPU1804Gen2, AKSUbuntuContainerd1804, AKSUbuntuContainerd1804Gen2, AKSUbuntuGPUContainerd1804, AKSUbuntuGPUContainerd1804Gen2, AKSUbuntuFipsContainerd1804, AKSUbuntuFipsContainerd1804Gen2, AKSUbuntuEdgeZoneContainerd1804, AKSUbuntuEdgeZoneContainerd1804Gen2, } //nolint:gochecknoglobals var AvailableUbuntu2004Distros = []Distro{ AKSUbuntuContainerd2004CVMGen2, AKSUbuntuFipsContainerd2004, AKSUbuntuFipsContainerd2004Gen2, } //nolint:gochecknoglobals var AvailableUbuntu2204Distros = []Distro{ AKSUbuntuContainerd2204, AKSUbuntuContainerd2204Gen2, AKSUbuntuArm64Containerd2204Gen2, AKSUbuntuContainerd2204TLGen2, AKSUbuntuEdgeZoneContainerd2204, AKSUbuntuEdgeZoneContainerd2204Gen2, AKSUbuntuMinimalContainerd2204, AKSUbuntuMinimalContainerd2204Gen2, AKSUbuntuFipsContainerd2204, AKSUbuntuFipsContainerd2204Gen2, } //nolint:gochecknoglobals var AvailableUbuntu2404Distros = []Distro{ AKSUbuntuContainerd2404, AKSUbuntuContainerd2404Gen2, AKSUbuntuArm64Containerd2404Gen2, AKSUbuntuContainerd2404CVMGen2, AKSUbuntuContainerd2404TLGen2, } //nolint:gochecknoglobals var AvailableContainerdDistros = []Distro{ AKSUbuntuContainerd1804, AKSUbuntuContainerd1804Gen2, AKSUbuntuGPUContainerd1804, AKSUbuntuGPUContainerd1804Gen2, AKSUbuntuFipsContainerd1804, AKSUbuntuFipsContainerd1804Gen2, AKSUbuntuFipsContainerd2004, AKSUbuntuFipsContainerd2004Gen2, AKSUbuntuFipsContainerd2204, AKSUbuntuFipsContainerd2204Gen2, AKSUbuntuEdgeZoneContainerd1804, AKSUbuntuEdgeZoneContainerd1804Gen2, AKSCBLMarinerV1, AKSCBLMarinerV2, AKSAzureLinuxV2, AKSAzureLinuxV3, AKSCBLMarinerV2Gen2, AKSAzureLinuxV2Gen2, AKSAzureLinuxV3Gen2, AKSCBLMarinerV2FIPS, AKSAzureLinuxV2FIPS, AKSAzureLinuxV3FIPS, AKSCBLMarinerV2Gen2FIPS, AKSAzureLinuxV2Gen2FIPS, AKSAzureLinuxV3Gen2FIPS, AKSCBLMarinerV2Gen2Kata, AKSAzureLinuxV2Gen2Kata, AKSCBLMarinerV2Gen2TL, AKSAzureLinuxV2Gen2TL, AKSAzureLinuxV3Gen2TL, AKSCBLMarinerV2KataGen2TL, AKSUbuntuArm64Containerd2204Gen2, AKSUbuntuArm64Containerd2404Gen2, AKSUbuntuContainerd2404CVMGen2, AKSCBLMarinerV2Arm64Gen2, AKSAzureLinuxV2Arm64Gen2, AKSAzureLinuxV3Arm64Gen2, AKSAzureLinuxV3Arm64Gen2FIPS, AKSUbuntuContainerd2204, AKSUbuntuContainerd2204Gen2, AKSUbuntuContainerd2004CVMGen2, AKSUbuntuContainerd2204TLGen2, AKSUbuntuEdgeZoneContainerd2204, AKSUbuntuEdgeZoneContainerd2204Gen2, AKSUbuntuMinimalContainerd2204, AKSUbuntuMinimalContainerd2204Gen2, AKSUbuntuContainerd2404, AKSUbuntuContainerd2404Gen2, AKSAzureLinuxV3CVMGen2, AKSUbuntuContainerd2404TLGen2, } //nolint:gochecknoglobals var AvailableGPUDistros = []Distro{ AKSUbuntuGPU1804, AKSUbuntuGPU1804Gen2, AKSUbuntuGPUContainerd1804, AKSUbuntuGPUContainerd1804Gen2, } //nolint:gochecknoglobals var AvailableGen2Distros = []Distro{ AKSUbuntu1804Gen2, AKSUbuntuGPU1804Gen2, AKSUbuntuContainerd1804Gen2, AKSUbuntuGPUContainerd1804Gen2, AKSUbuntuFipsContainerd1804Gen2, AKSUbuntuFipsContainerd2004Gen2, AKSUbuntuFipsContainerd2204Gen2, AKSUbuntuEdgeZoneContainerd1804Gen2, AKSUbuntuArm64Containerd2204Gen2, AKSUbuntuArm64Containerd2404Gen2, AKSUbuntuContainerd2404CVMGen2, AKSUbuntuContainerd2204Gen2, AKSUbuntuContainerd2004CVMGen2, AKSUbuntuContainerd2204TLGen2, AKSUbuntuEdgeZoneContainerd2204Gen2, AKSUbuntuMinimalContainerd2204Gen2, AKSUbuntuContainerd2404Gen2, AKSUbuntuContainerd2404TLGen2, AKSCBLMarinerV2Gen2, AKSAzureLinuxV2Gen2, AKSAzureLinuxV3Gen2, AKSCBLMarinerV2Gen2FIPS, AKSAzureLinuxV2Gen2FIPS, AKSAzureLinuxV3Gen2FIPS, AKSCBLMarinerV2Gen2Kata, AKSAzureLinuxV2Gen2Kata, AKSCBLMarinerV2Gen2TL, AKSAzureLinuxV2Gen2TL, AKSAzureLinuxV3Gen2TL, AKSCBLMarinerV2KataGen2TL, AKSCBLMarinerV2Arm64Gen2, AKSAzureLinuxV2Arm64Gen2, AKSAzureLinuxV3Arm64Gen2, AKSAzureLinuxV3Arm64Gen2FIPS, AKSAzureLinuxV3CVMGen2, } //nolint:gochecknoglobals var AvailableAzureLinuxDistros = []Distro{ AKSCBLMarinerV1, AKSCBLMarinerV2, AKSAzureLinuxV2, AKSAzureLinuxV3, AKSCBLMarinerV2Gen2, AKSAzureLinuxV2Gen2, AKSAzureLinuxV3Gen2, AKSCBLMarinerV2FIPS, AKSAzureLinuxV2FIPS, AKSAzureLinuxV3FIPS, AKSCBLMarinerV2Gen2FIPS, AKSAzureLinuxV2Gen2FIPS, AKSAzureLinuxV3Gen2FIPS, AKSCBLMarinerV2Gen2Kata, AKSAzureLinuxV2Gen2Kata, AKSCBLMarinerV2Arm64Gen2, AKSAzureLinuxV2Arm64Gen2, AKSAzureLinuxV3Arm64Gen2, AKSAzureLinuxV3Arm64Gen2FIPS, AKSCBLMarinerV2Gen2TL, AKSAzureLinuxV2Gen2TL, AKSAzureLinuxV3Gen2TL, AKSCBLMarinerV2KataGen2TL, AKSAzureLinuxV3CVMGen2, } //nolint:gochecknoglobals var AvailableAzureLinuxCgroupV2Distros = []Distro{ AKSAzureLinuxV2, AKSAzureLinuxV3, AKSAzureLinuxV2Gen2, AKSAzureLinuxV3Gen2, AKSAzureLinuxV2FIPS, AKSAzureLinuxV3FIPS, AKSAzureLinuxV2Gen2FIPS, AKSAzureLinuxV3Gen2FIPS, AKSAzureLinuxV2Gen2Kata, AKSAzureLinuxV2Arm64Gen2, AKSAzureLinuxV3Arm64Gen2, AKSAzureLinuxV3Arm64Gen2FIPS, AKSAzureLinuxV2Gen2TL, AKSAzureLinuxV3Gen2TL, AKSAzureLinuxV3CVMGen2, } // IsContainerdSKU returns true if distro type is containerd-enabled. func (d Distro) IsContainerdDistro() bool { for _, distro := range AvailableContainerdDistros { if d == distro { return true } } return false } func (d Distro) IsGPUDistro() bool { for _, distro := range AvailableGPUDistros { if d == distro { return true } } return false } func (d Distro) IsGen2Distro() bool { for _, distro := range AvailableGen2Distros { if d == distro { return true } } return false } func (d Distro) IsAzureLinuxDistro() bool { for _, distro := range AvailableAzureLinuxDistros { if d == distro { return true } } return false } func (d Distro) IsWindowsSIGDistro() bool { for _, distro := range AvailableWindowsSIGDistros { if d == distro { return true } } return false } func (d Distro) IsWindowsPIRDistro() bool { for _, distro := range AvailableWindowsPIRDistros { if d == distro { return true } } return false } func (d Distro) IsWindowsDistro() bool { return d.IsWindowsSIGDistro() || d.IsWindowsPIRDistro() } // SigImageConfigTemplate represents the SIG image configuration template. type SigImageConfigTemplate struct { ResourceGroup string Gallery string Definition string Version string } // SigImageConfig represents the SIG image configuration. type SigImageConfig struct { SigImageConfigTemplate SubscriptionID string } // WithOptions converts a SigImageConfigTemplate to SigImageConfig instance via function opts. func (template SigImageConfigTemplate) WithOptions(options ...SigImageConfigOpt) SigImageConfig { config := &SigImageConfig{ SigImageConfigTemplate: template, } for _, opt := range options { opt(config) } return *config } //nolint:gochecknoglobals var AvailableWindowsSIGDistros = []Distro{ AKSWindows2019, AKSWindows2019Containerd, AKSWindows2022Containerd, AKSWindows2022ContainerdGen2, AKSWindows23H2, AKSWindows23H2Gen2, AKSWindows2025, AKSWindows2025Gen2, CustomizedWindowsOSImage, } //nolint:gochecknoglobals var AvailableWindowsPIRDistros = []Distro{ AKSWindows2019PIR, } // SIG const. const ( AKSSIGImagePublisher string = "microsoft-aks" AKSWindowsGalleryName string = "AKSWindows" AKSWindowsResourceGroup string = "AKS-Windows" AKSUbuntuGalleryName string = "AKSUbuntu" AKSUbuntuResourceGroup string = "AKS-Ubuntu" AKSCBLMarinerGalleryName string = "AKSCBLMariner" AKSCBLMarinerResourceGroup string = "AKS-CBLMariner" AKSAzureLinuxGalleryName string = "AKSAzureLinux" AKSAzureLinuxResourceGroup string = "AKS-AzureLinux" AKSUbuntuEdgeZoneGalleryName string = "AKSUbuntuEdgeZone" AKSUbuntuEdgeZoneResourceGroup string = "AKS-Ubuntu-EdgeZone" ) const ( // DO NOT MODIFY: used for freezing linux images with docker. FrozenLinuxSIGImageVersionForDocker string = "2022.08.29" // DO NOT MODIFY: used for freezing linux images for Egress test. FrozenLinuxSIGImageVersionForEgressTest string = "2022.10.03" // CBLMarinerV1 pinned to the last image build as Mariner 1.0 is out // of support and image builds have stopped. FrozenCBLMarinerV1SIGImageVersionForDeprecation string = "202308.28.0" // DO NOT MODIFY: 1804GPUContainerd Gen1 & Gen2 pinned to the last image build as // GPU Dedicated preview image is being deprecated and image builds have stopped. Frozen1804GPUContainerdSIGImageVersionForDeprecation string = "202501.05.0" Frozen1804Gen2GPUContainerdSIGImageVersionForDeprecation string = "202501.05.0" // DO NOT MODIFY: used for freezing MarinerV2KataGen2TL. FrozenCBLMarinerV2KataGen2TLSIGImageVersion = "2022.12.15" // We do not use AKS Windows image versions in AgentBaker. These fake values are only used for unit tests. Windows2019SIGImageVersion string = "17763.2019.221114" Windows2022SIGImageVersion string = "20348.2022.221114" Windows23H2SIGImageVersion string = "25398.2022.221114" Windows2025SIGImageVersion string = "26100.2025.221114" ) type sigVersion struct { Version string `json:"version"` } //go:embed linux_sig_version.json var linuxSIGVersionJSONContent []byte //nolint:gochecknoglobals var LinuxSIGImageVersion = mustGetSIGVersionFromJSONContent(linuxSIGVersionJSONContent) // mustGetSIGVersionFromJSONContent returns the SIG image version from within the specified SON content string. // This is used to populate LinuxSIGImageVersion from linux_sig_version.json. func mustGetSIGVersionFromJSONContent(contents []byte) string { if len(contents) == 0 { panic("linux_sig_Version.json content is empty") } var v sigVersion if err := json.Unmarshal(contents, &v); err != nil { panic(err) } return v.Version } // SIG config Template. // //nolint:gochecknoglobals var ( SIGUbuntu1604ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSUbuntuResourceGroup, Gallery: AKSUbuntuGalleryName, Definition: "1604", Version: "2021.11.06", } SIGUbuntu1804ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSUbuntuResourceGroup, Gallery: AKSUbuntuGalleryName, Definition: "1804", Version: FrozenLinuxSIGImageVersionForDocker, } SIGUbuntu1804Gen2ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSUbuntuResourceGroup, Gallery: AKSUbuntuGalleryName, Definition: "1804gen2", Version: FrozenLinuxSIGImageVersionForDocker, } SIGUbuntuGPU1804ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSUbuntuResourceGroup, Gallery: AKSUbuntuGalleryName, Definition: "1804gpu", Version: FrozenLinuxSIGImageVersionForDocker, } SIGUbuntuGPU1804Gen2ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSUbuntuResourceGroup, Gallery: AKSUbuntuGalleryName, Definition: "1804gen2gpu", Version: FrozenLinuxSIGImageVersionForDocker, } SIGUbuntuContainerd1804ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSUbuntuResourceGroup, Gallery: AKSUbuntuGalleryName, Definition: "1804containerd", Version: LinuxSIGImageVersion, } SIGUbuntuContainerd1804Gen2ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSUbuntuResourceGroup, Gallery: AKSUbuntuGalleryName, Definition: "1804gen2containerd", Version: LinuxSIGImageVersion, } SIGUbuntuGPUContainerd1804ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSUbuntuResourceGroup, Gallery: AKSUbuntuGalleryName, Definition: "1804gpucontainerd", Version: Frozen1804GPUContainerdSIGImageVersionForDeprecation, } SIGUbuntuGPUContainerd1804Gen2ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSUbuntuResourceGroup, Gallery: AKSUbuntuGalleryName, Definition: "1804gen2gpucontainerd", Version: Frozen1804Gen2GPUContainerdSIGImageVersionForDeprecation, } SIGUbuntuFipsContainerd1804ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSUbuntuResourceGroup, Gallery: AKSUbuntuGalleryName, Definition: "1804fipscontainerd", Version: LinuxSIGImageVersion, } // not a typo, this image was generated on 2021.05.20 UTC and assigned this version. SIGUbuntuFipsContainerd1804Gen2ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSUbuntuResourceGroup, Gallery: AKSUbuntuGalleryName, Definition: "1804gen2fipscontainerd", Version: LinuxSIGImageVersion, } SIGUbuntuFipsContainerd2004ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSUbuntuResourceGroup, Gallery: AKSUbuntuGalleryName, Definition: "2004fipscontainerd", Version: LinuxSIGImageVersion, } // not a typo, this image was generated on 2021.05.20 UTC and assigned this version. SIGUbuntuFipsContainerd2004Gen2ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSUbuntuResourceGroup, Gallery: AKSUbuntuGalleryName, Definition: "2004gen2fipscontainerd", Version: LinuxSIGImageVersion, } SIGUbuntuFipsContainerd2204ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSUbuntuResourceGroup, Gallery: AKSUbuntuGalleryName, Definition: "2204fipscontainerd", Version: "202404.09.0", // TODO(artunduman): Update version when the image is ready } SIGUbuntuFipsContainerd2204Gen2ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSUbuntuResourceGroup, Gallery: AKSUbuntuGalleryName, Definition: "2204gen2fipscontainerd", Version: "202404.09.0", // TODO(artunduman): Update version when the image is ready } SIGUbuntuArm64Containerd2204Gen2ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSUbuntuResourceGroup, Gallery: AKSUbuntuGalleryName, Definition: "2204gen2arm64containerd", Version: LinuxSIGImageVersion, } SIGUbuntuArm64Containerd2404Gen2ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSUbuntuResourceGroup, Gallery: AKSUbuntuGalleryName, Definition: "2404gen2arm64containerd", Version: LinuxSIGImageVersion, } SIGUbuntuContainerd2404CVMGen2ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSUbuntuResourceGroup, Gallery: AKSUbuntuGalleryName, Definition: "2404gen2CVMcontainerd", Version: LinuxSIGImageVersion, } SIGUbuntuContainerd2204ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSUbuntuResourceGroup, Gallery: AKSUbuntuGalleryName, Definition: "2204containerd", Version: LinuxSIGImageVersion, } SIGUbuntuContainerd2204Gen2ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSUbuntuResourceGroup, Gallery: AKSUbuntuGalleryName, Definition: "2204gen2containerd", Version: LinuxSIGImageVersion, } SIGUbuntuContainerd2204TLGen2ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSUbuntuResourceGroup, Gallery: AKSUbuntuGalleryName, Definition: "2204gen2TLcontainerd", Version: LinuxSIGImageVersion, } SIGUbuntuContainerd2004CVMGen2ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSUbuntuResourceGroup, Gallery: AKSUbuntuGalleryName, Definition: "2004gen2CVMcontainerd", Version: LinuxSIGImageVersion, } SIGUbuntuMinimalContainerd2204ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSUbuntuResourceGroup, Gallery: AKSUbuntuGalleryName, Definition: "2204minimalcontainerd", Version: "202401.12.0", } SIGUbuntuMinimalContainerd2204Gen2ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSUbuntuResourceGroup, Gallery: AKSUbuntuGalleryName, Definition: "2204gen2minimalcontainerd", Version: "202401.12.0", } SIGUbuntuEgressContainerd2204Gen2ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSUbuntuResourceGroup, Gallery: AKSUbuntuGalleryName, Definition: "2204gen2containerd", Version: FrozenLinuxSIGImageVersionForEgressTest, } SIGUbuntuContainerd2404ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSUbuntuResourceGroup, Gallery: AKSUbuntuGalleryName, Definition: "2404containerd", Version: LinuxSIGImageVersion, } SIGUbuntuContainerd2404Gen2ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSUbuntuResourceGroup, Gallery: AKSUbuntuGalleryName, Definition: "2404gen2containerd", Version: LinuxSIGImageVersion, } SIGUbuntuContainerd2404TLGen2ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSUbuntuResourceGroup, Gallery: AKSUbuntuGalleryName, Definition: "2404gen2TLcontainerd", Version: LinuxSIGImageVersion, } SIGCBLMarinerV1ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSCBLMarinerResourceGroup, Gallery: AKSCBLMarinerGalleryName, Definition: "V1", Version: FrozenCBLMarinerV1SIGImageVersionForDeprecation, } SIGCBLMarinerV2Gen1ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSCBLMarinerResourceGroup, Gallery: AKSCBLMarinerGalleryName, Definition: "V2", Version: LinuxSIGImageVersion, } SIGAzureLinuxV2Gen1ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSAzureLinuxResourceGroup, Gallery: AKSAzureLinuxGalleryName, Definition: "V2", Version: LinuxSIGImageVersion, } SIGAzureLinuxV3Gen1ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSAzureLinuxResourceGroup, Gallery: AKSAzureLinuxGalleryName, Definition: "V3", Version: LinuxSIGImageVersion, } SIGCBLMarinerV2Gen2ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSCBLMarinerResourceGroup, Gallery: AKSCBLMarinerGalleryName, Definition: "V2gen2", Version: LinuxSIGImageVersion, } SIGAzureLinuxV2Gen2ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSAzureLinuxResourceGroup, Gallery: AKSAzureLinuxGalleryName, Definition: "V2gen2", Version: LinuxSIGImageVersion, } SIGAzureLinuxV3Gen2ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSAzureLinuxResourceGroup, Gallery: AKSAzureLinuxGalleryName, Definition: "V3gen2", Version: LinuxSIGImageVersion, } SIGCBLMarinerV2Gen1FIPSImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSCBLMarinerResourceGroup, Gallery: AKSCBLMarinerGalleryName, Definition: "V2fips", Version: LinuxSIGImageVersion, } SIGAzureLinuxV2Gen1FIPSImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSAzureLinuxResourceGroup, Gallery: AKSAzureLinuxGalleryName, Definition: "V2fips", Version: LinuxSIGImageVersion, } SIGAzureLinuxV3Gen1FIPSImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSAzureLinuxResourceGroup, Gallery: AKSAzureLinuxGalleryName, Definition: "V3fips", Version: LinuxSIGImageVersion, } SIGCBLMarinerV2Gen2FIPSImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSCBLMarinerResourceGroup, Gallery: AKSCBLMarinerGalleryName, Definition: "V2gen2fips", Version: LinuxSIGImageVersion, } SIGAzureLinuxV2Gen2FIPSImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSAzureLinuxResourceGroup, Gallery: AKSAzureLinuxGalleryName, Definition: "V2gen2fips", Version: LinuxSIGImageVersion, } SIGAzureLinuxV3Gen2FIPSImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSAzureLinuxResourceGroup, Gallery: AKSAzureLinuxGalleryName, Definition: "V3gen2fips", Version: LinuxSIGImageVersion, } SIGAzureLinuxV3Arm64Gen2FIPSImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSAzureLinuxResourceGroup, Gallery: AKSAzureLinuxGalleryName, Definition: "V3gen2arm64fips", Version: LinuxSIGImageVersion, } SIGCBLMarinerV2KataImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSCBLMarinerResourceGroup, Gallery: AKSCBLMarinerGalleryName, Definition: "V2katagen2", Version: LinuxSIGImageVersion, } SIGAzureLinuxV2KataImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSAzureLinuxResourceGroup, Gallery: AKSAzureLinuxGalleryName, Definition: "V2katagen2", Version: LinuxSIGImageVersion, } SIGCBLMarinerV2Arm64ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSCBLMarinerResourceGroup, Gallery: AKSCBLMarinerGalleryName, Definition: "V2gen2arm64", Version: LinuxSIGImageVersion, } SIGAzureLinuxV2Arm64ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSAzureLinuxResourceGroup, Gallery: AKSAzureLinuxGalleryName, Definition: "V2gen2arm64", Version: LinuxSIGImageVersion, } SIGAzureLinuxV3Arm64ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSAzureLinuxResourceGroup, Gallery: AKSAzureLinuxGalleryName, Definition: "V3gen2arm64", Version: LinuxSIGImageVersion, } SIGCBLMarinerV2TLImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSCBLMarinerResourceGroup, Gallery: AKSCBLMarinerGalleryName, Definition: "V2gen2TL", Version: LinuxSIGImageVersion, } SIGAzureLinuxV2TLImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSAzureLinuxResourceGroup, Gallery: AKSAzureLinuxGalleryName, Definition: "V2gen2TL", Version: LinuxSIGImageVersion, } SIGAzureLinuxV3TLImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSAzureLinuxResourceGroup, Gallery: AKSAzureLinuxGalleryName, Definition: "V3gen2TL", Version: LinuxSIGImageVersion, } SIGCBLMarinerV2KataGen2TLImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSCBLMarinerResourceGroup, Gallery: AKSCBLMarinerGalleryName, Definition: "V2katagen2TL", Version: FrozenCBLMarinerV2KataGen2TLSIGImageVersion, } SIGWindows2019ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSWindowsResourceGroup, Gallery: AKSWindowsGalleryName, Definition: "windows-2019", Version: Windows2019SIGImageVersion, } SIGWindows2019ContainerdImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSWindowsResourceGroup, Gallery: AKSWindowsGalleryName, Definition: "windows-2019-containerd", Version: Windows2019SIGImageVersion, } SIGWindows2022ContainerdImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSWindowsResourceGroup, Gallery: AKSWindowsGalleryName, Definition: "windows-2022-containerd", Version: Windows2022SIGImageVersion, } SIGWindows2022ContainerdGen2ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSWindowsResourceGroup, Gallery: AKSWindowsGalleryName, Definition: "windows-2022-containerd-gen2", Version: Windows2022SIGImageVersion, } SIGWindows23H2ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSWindowsResourceGroup, Gallery: AKSWindowsGalleryName, Definition: "windows-23H2", Version: Windows23H2SIGImageVersion, } SIGWindows23H2Gen2ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSWindowsResourceGroup, Gallery: AKSWindowsGalleryName, Definition: "windows-23H2-gen2", Version: Windows23H2SIGImageVersion, } SIGAzureLinuxV3CVMGen2ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSAzureLinuxResourceGroup, Gallery: AKSAzureLinuxGalleryName, Definition: "V3gen2CVM", Version: LinuxSIGImageVersion, } SIGWindows2025ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSWindowsResourceGroup, Gallery: AKSWindowsGalleryName, Definition: "windows-2025", Version: Windows2025SIGImageVersion, } SIGWindows2025Gen2ImageConfigTemplate = SigImageConfigTemplate{ ResourceGroup: AKSWindowsResourceGroup, Gallery: AKSWindowsGalleryName, Definition: "windows-2025-gen2", Version: Windows2025SIGImageVersion, } ) // GetMaintainedLinuxSIGImageConfigMap returns a set of Distro -> SigImageConfig mappings // for ALL Linux distros that are currently built and maintained by AKS Node SIG (Version == LinuxSIGImageVersion). // Note that each distro's SigImageConfig SubscriptionID field will be empty. // This can be used downstream to make sure that all expected images have been properly replicated. func GetMaintainedLinuxSIGImageConfigMap() map[Distro]SigImageConfig { // no opts means subscriptionID will be empty in the corresponding image configs imageConfigMaps := []map[Distro]SigImageConfig{ getSigUbuntuImageConfigMapWithOpts(), getSigCBLMarinerImageConfigMapWithOpts(), getSigAzureLinuxImageConfigMapWithOpts(), } maintained := map[Distro]SigImageConfig{} for _, m := range imageConfigMaps { for distro, config := range m { if config.Version == LinuxSIGImageVersion { maintained[distro] = config } } } return maintained } func getSigUbuntuImageConfigMapWithOpts(opts ...SigImageConfigOpt) map[Distro]SigImageConfig { return map[Distro]SigImageConfig{ AKSUbuntu1604: SIGUbuntu1604ImageConfigTemplate.WithOptions(opts...), AKSUbuntu1804: SIGUbuntu1804ImageConfigTemplate.WithOptions(opts...), AKSUbuntu1804Gen2: SIGUbuntu1804Gen2ImageConfigTemplate.WithOptions(opts...), AKSUbuntuGPU1804: SIGUbuntuGPU1804ImageConfigTemplate.WithOptions(opts...), AKSUbuntuGPU1804Gen2: SIGUbuntuGPU1804Gen2ImageConfigTemplate.WithOptions(opts...), AKSUbuntuContainerd1804: SIGUbuntuContainerd1804ImageConfigTemplate.WithOptions(opts...), AKSUbuntuContainerd1804Gen2: SIGUbuntuContainerd1804Gen2ImageConfigTemplate.WithOptions(opts...), AKSUbuntuGPUContainerd1804: SIGUbuntuGPUContainerd1804ImageConfigTemplate.WithOptions(opts...), AKSUbuntuGPUContainerd1804Gen2: SIGUbuntuGPUContainerd1804Gen2ImageConfigTemplate.WithOptions(opts...), AKSUbuntuFipsContainerd1804: SIGUbuntuFipsContainerd1804ImageConfigTemplate.WithOptions(opts...), AKSUbuntuFipsContainerd1804Gen2: SIGUbuntuFipsContainerd1804Gen2ImageConfigTemplate.WithOptions(opts...), AKSUbuntuFipsContainerd2004: SIGUbuntuFipsContainerd2004ImageConfigTemplate.WithOptions(opts...), AKSUbuntuFipsContainerd2004Gen2: SIGUbuntuFipsContainerd2004Gen2ImageConfigTemplate.WithOptions(opts...), AKSUbuntuFipsContainerd2204: SIGUbuntuFipsContainerd2204ImageConfigTemplate.WithOptions(opts...), AKSUbuntuFipsContainerd2204Gen2: SIGUbuntuFipsContainerd2204Gen2ImageConfigTemplate.WithOptions(opts...), AKSUbuntuContainerd2204: SIGUbuntuContainerd2204ImageConfigTemplate.WithOptions(opts...), AKSUbuntuContainerd2204Gen2: SIGUbuntuContainerd2204Gen2ImageConfigTemplate.WithOptions(opts...), AKSUbuntuContainerd2004CVMGen2: SIGUbuntuContainerd2004CVMGen2ImageConfigTemplate.WithOptions(opts...), AKSUbuntuArm64Containerd2204Gen2: SIGUbuntuArm64Containerd2204Gen2ImageConfigTemplate.WithOptions(opts...), AKSUbuntuArm64Containerd2404Gen2: SIGUbuntuArm64Containerd2404Gen2ImageConfigTemplate.WithOptions(opts...), AKSUbuntuContainerd2404CVMGen2: SIGUbuntuContainerd2404CVMGen2ImageConfigTemplate.WithOptions(opts...), AKSUbuntuContainerd2204TLGen2: SIGUbuntuContainerd2204TLGen2ImageConfigTemplate.WithOptions(opts...), AKSUbuntuMinimalContainerd2204: SIGUbuntuMinimalContainerd2204ImageConfigTemplate.WithOptions(opts...), AKSUbuntuMinimalContainerd2204Gen2: SIGUbuntuMinimalContainerd2204Gen2ImageConfigTemplate.WithOptions(opts...), AKSUbuntuEgressContainerd2204Gen2: SIGUbuntuEgressContainerd2204Gen2ImageConfigTemplate.WithOptions(opts...), AKSUbuntuContainerd2404: SIGUbuntuContainerd2404ImageConfigTemplate.WithOptions(opts...), AKSUbuntuContainerd2404Gen2: SIGUbuntuContainerd2404Gen2ImageConfigTemplate.WithOptions(opts...), AKSUbuntuContainerd2404TLGen2: SIGUbuntuContainerd2404TLGen2ImageConfigTemplate.WithOptions(opts...), } } func getSigCBLMarinerImageConfigMapWithOpts(opts ...SigImageConfigOpt) map[Distro]SigImageConfig { return map[Distro]SigImageConfig{ AKSCBLMarinerV1: SIGCBLMarinerV1ImageConfigTemplate.WithOptions(opts...), AKSCBLMarinerV2: SIGCBLMarinerV2Gen1ImageConfigTemplate.WithOptions(opts...), AKSCBLMarinerV2Gen2: SIGCBLMarinerV2Gen2ImageConfigTemplate.WithOptions(opts...), AKSCBLMarinerV2FIPS: SIGCBLMarinerV2Gen1FIPSImageConfigTemplate.WithOptions(opts...), AKSCBLMarinerV2Gen2FIPS: SIGCBLMarinerV2Gen2FIPSImageConfigTemplate.WithOptions(opts...), AKSCBLMarinerV2Gen2Kata: SIGCBLMarinerV2KataImageConfigTemplate.WithOptions(opts...), AKSCBLMarinerV2Arm64Gen2: SIGCBLMarinerV2Arm64ImageConfigTemplate.WithOptions(opts...), AKSCBLMarinerV2Gen2TL: SIGCBLMarinerV2TLImageConfigTemplate.WithOptions(opts...), AKSCBLMarinerV2KataGen2TL: SIGCBLMarinerV2KataGen2TLImageConfigTemplate.WithOptions(opts...), } } func getSigAzureLinuxImageConfigMapWithOpts(opts ...SigImageConfigOpt) map[Distro]SigImageConfig { return map[Distro]SigImageConfig{ AKSAzureLinuxV2: SIGAzureLinuxV2Gen1ImageConfigTemplate.WithOptions(opts...), AKSAzureLinuxV3: SIGAzureLinuxV3Gen1ImageConfigTemplate.WithOptions(opts...), AKSAzureLinuxV2Gen2: SIGAzureLinuxV2Gen2ImageConfigTemplate.WithOptions(opts...), AKSAzureLinuxV3Gen2: SIGAzureLinuxV3Gen2ImageConfigTemplate.WithOptions(opts...), AKSAzureLinuxV2FIPS: SIGAzureLinuxV2Gen1FIPSImageConfigTemplate.WithOptions(opts...), AKSAzureLinuxV3FIPS: SIGAzureLinuxV3Gen1FIPSImageConfigTemplate.WithOptions(opts...), AKSAzureLinuxV2Gen2FIPS: SIGAzureLinuxV2Gen2FIPSImageConfigTemplate.WithOptions(opts...), AKSAzureLinuxV3Gen2FIPS: SIGAzureLinuxV3Gen2FIPSImageConfigTemplate.WithOptions(opts...), AKSAzureLinuxV2Gen2Kata: SIGAzureLinuxV2KataImageConfigTemplate.WithOptions(opts...), AKSAzureLinuxV2Arm64Gen2: SIGAzureLinuxV2Arm64ImageConfigTemplate.WithOptions(opts...), AKSAzureLinuxV3Arm64Gen2: SIGAzureLinuxV3Arm64ImageConfigTemplate.WithOptions(opts...), AKSAzureLinuxV3Arm64Gen2FIPS: SIGAzureLinuxV3Arm64Gen2FIPSImageConfigTemplate.WithOptions(opts...), AKSAzureLinuxV2Gen2TL: SIGAzureLinuxV2TLImageConfigTemplate.WithOptions(opts...), AKSAzureLinuxV3Gen2TL: SIGAzureLinuxV3TLImageConfigTemplate.WithOptions(opts...), AKSAzureLinuxV3CVMGen2: SIGAzureLinuxV3CVMGen2ImageConfigTemplate.WithOptions(opts...), } } func getSigWindowsImageConfigMapWithOpts(opts ...SigImageConfigOpt) map[Distro]SigImageConfig { return map[Distro]SigImageConfig{ AKSWindows2019: SIGWindows2019ImageConfigTemplate.WithOptions(opts...), AKSWindows2019Containerd: SIGWindows2019ContainerdImageConfigTemplate.WithOptions(opts...), AKSWindows2022Containerd: SIGWindows2022ContainerdImageConfigTemplate.WithOptions(opts...), AKSWindows2022ContainerdGen2: SIGWindows2022ContainerdGen2ImageConfigTemplate.WithOptions(opts...), AKSWindows23H2: SIGWindows23H2ImageConfigTemplate.WithOptions(opts...), AKSWindows23H2Gen2: SIGWindows23H2Gen2ImageConfigTemplate.WithOptions(opts...), AKSWindows2025: SIGWindows2025ImageConfigTemplate.WithOptions(opts...), AKSWindows2025Gen2: SIGWindows2025Gen2ImageConfigTemplate.WithOptions(opts...), } } func getSigUbuntuEdgeZoneImageConfigMapWithOpts(opts ...SigImageConfigOpt) map[Distro]SigImageConfig { // This image is using a specific resource group and gallery name for edge zone scenario. sigUbuntuEdgeZoneContainerd1804ImageConfigTemplate := SigImageConfigTemplate{ ResourceGroup: AKSUbuntuEdgeZoneResourceGroup, Gallery: AKSUbuntuEdgeZoneGalleryName, Definition: "1804containerd", Version: LinuxSIGImageVersion, } // This image is using a specific resource group and gallery name for edge zone scenario. sigUbuntuEdgeZoneContainerd1804Gen2ImageConfigTemplate := SigImageConfigTemplate{ ResourceGroup: AKSUbuntuEdgeZoneResourceGroup, Gallery: AKSUbuntuEdgeZoneGalleryName, Definition: "1804gen2containerd", Version: LinuxSIGImageVersion, } // This image is using a specific resource group and gallery name for edge zone scenario. sigUbuntuEdgeZoneContainerd2204ImageConfigTemplate := SigImageConfigTemplate{ ResourceGroup: AKSUbuntuEdgeZoneResourceGroup, Gallery: AKSUbuntuEdgeZoneGalleryName, Definition: "2204containerd", Version: LinuxSIGImageVersion, } // This image is using a specific resource group and gallery name for edge zone scenario. sigUbuntuEdgeZoneContainerd2204Gen2ImageConfigTemplate := SigImageConfigTemplate{ ResourceGroup: AKSUbuntuEdgeZoneResourceGroup, Gallery: AKSUbuntuEdgeZoneGalleryName, Definition: "2204gen2containerd", Version: LinuxSIGImageVersion, } return map[Distro]SigImageConfig{ AKSUbuntuEdgeZoneContainerd1804: sigUbuntuEdgeZoneContainerd1804ImageConfigTemplate.WithOptions(opts...), AKSUbuntuEdgeZoneContainerd1804Gen2: sigUbuntuEdgeZoneContainerd1804Gen2ImageConfigTemplate.WithOptions(opts...), AKSUbuntuEdgeZoneContainerd2204: sigUbuntuEdgeZoneContainerd2204ImageConfigTemplate.WithOptions(opts...), AKSUbuntuEdgeZoneContainerd2204Gen2: sigUbuntuEdgeZoneContainerd2204Gen2ImageConfigTemplate.WithOptions(opts...), } } // GetSIGAzureCloudSpecConfig get cloud specific sig config. func GetSIGAzureCloudSpecConfig(sigConfig SIGConfig, region string) (SIGAzureEnvironmentSpecConfig, error) { if sigConfig.Galleries == nil || strings.EqualFold(sigConfig.SubscriptionID, "") || strings.EqualFold(sigConfig.TenantID, "") { return SIGAzureEnvironmentSpecConfig{}, fmt.Errorf("acsConfig.rpConfig.sigConfig missing expected values - cannot generate sig env config") } c := new(SIGAzureEnvironmentSpecConfig) c.SigTenantID = sigConfig.TenantID c.SubscriptionID = sigConfig.SubscriptionID c.CloudName = GetCloudTargetEnv(region) fromACSUbuntu, err := withACSSIGConfig(sigConfig, "AKSUbuntu") if err != nil { return SIGAzureEnvironmentSpecConfig{}, fmt.Errorf("unexpected error while constructing env-aware sig configuration for AKSUbuntu: %w", err) } c.SigUbuntuImageConfig = getSigUbuntuImageConfigMapWithOpts(fromACSUbuntu) fromACSCBLMariner, err := withACSSIGConfig(sigConfig, "AKSCBLMariner") if err != nil { return SIGAzureEnvironmentSpecConfig{}, fmt.Errorf("unexpected error while constructing env-aware sig configuration for AKSCBLMariner: %w", err) } c.SigCBLMarinerImageConfig = getSigCBLMarinerImageConfigMapWithOpts(fromACSCBLMariner) fromACSAzureLinux, err := withACSSIGConfig(sigConfig, "AKSAzureLinux") if err != nil { return SIGAzureEnvironmentSpecConfig{}, fmt.Errorf("unexpected error while constructing env-aware sig configuration for AKSAzureLinux: %w", err) } c.SigAzureLinuxImageConfig = getSigAzureLinuxImageConfigMapWithOpts(fromACSAzureLinux) fromACSWindows, err := withACSSIGConfig(sigConfig, "AKSWindows") if err != nil { return SIGAzureEnvironmentSpecConfig{}, fmt.Errorf("unexpected error while constructing env-aware sig configuration for Windows: %w", err) } c.SigWindowsImageConfig = getSigWindowsImageConfigMapWithOpts(fromACSWindows) fromACSUbuntuEdgeZone := withEdgeZoneConfig(sigConfig) c.SigUbuntuEdgeZoneImageConfig = getSigUbuntuEdgeZoneImageConfigMapWithOpts(fromACSUbuntuEdgeZone) return *c, nil } /* GetAzurePublicSIGConfigForTest returns a statically defined sigconfig. This should only be used for unit tests and e2es. */ func GetAzurePublicSIGConfigForTest() SIGAzureEnvironmentSpecConfig { return SIGAzureEnvironmentSpecConfig{ CloudName: AzurePublicCloud, SigTenantID: AzurePublicCloudSigTenantID, SubscriptionID: AzurePublicCloudSigSubscription, SigUbuntuImageConfig: getSigUbuntuImageConfigMapWithOpts(withSubscription(AzurePublicCloudSigSubscription)), SigCBLMarinerImageConfig: getSigCBLMarinerImageConfigMapWithOpts(withSubscription(AzurePublicCloudSigSubscription)), SigAzureLinuxImageConfig: getSigAzureLinuxImageConfigMapWithOpts(withSubscription(AzurePublicCloudSigSubscription)), SigWindowsImageConfig: getSigWindowsImageConfigMapWithOpts(withSubscription(AzurePublicCloudSigSubscription)), SigUbuntuEdgeZoneImageConfig: getSigUbuntuEdgeZoneImageConfigMapWithOpts(withSubscription(AzurePublicCloudSigSubscription)), } } func withACSSIGConfig(acsSigConfig SIGConfig, osSKU string) (SigImageConfigOpt, error) { gallery, k := acsSigConfig.Galleries[osSKU] if !k { return nil, fmt.Errorf("sig gallery configuration for %s not found", osSKU) } return func(c *SigImageConfig) { c.Gallery = gallery.GalleryName c.SubscriptionID = acsSigConfig.SubscriptionID c.ResourceGroup = gallery.ResourceGroup }, nil } func withEdgeZoneConfig(acsSigConfig SIGConfig) SigImageConfigOpt { return func(c *SigImageConfig) { c.Gallery = AKSUbuntuEdgeZoneGalleryName c.SubscriptionID = acsSigConfig.SubscriptionID c.ResourceGroup = AKSUbuntuEdgeZoneResourceGroup } } //nolint:unparam //subscriptionID only receives AzurePublicCloudSigSubscription func withSubscription(subscriptionID string) SigImageConfigOpt { return func(c *SigImageConfig) { c.SubscriptionID = subscriptionID } }