diff --git a/Makefile-az.mk b/Makefile-az.mk index 7a6b41c25e..b66961beeb 100755 --- a/Makefile-az.mk +++ b/Makefile-az.mk @@ -477,5 +477,5 @@ az-swagger-generate-clients: az-swagger-generate-clients-raw az-codegen-nodeimageversions: ## List node image versions (to be used in fake/nodeimageversionsapi.go) az rest --method get \ - --url "/subscriptions/$(AZURE_SUBSCRIPTION_ID)/providers/Microsoft.ContainerService/locations/$(AZURE_LOCATION)/nodeImageVersions?api-version=2024-04-02-preview" \ - | jq -r '.values[] | "{\n\tFullName: \"\(.fullName)\",\n\tOS: \"\(.os)\",\n\tSKU: \"\(.sku)\",\n\tVersion: \"\(.version)\",\n},"' + --url "/subscriptions/$(AZURE_SUBSCRIPTION_ID)/providers/Microsoft.ContainerService/locations/$(AZURE_LOCATION)/nodeImageVersions?api-version=2025-10-02-preview" \ + | jq -r '.value[] | "{\n\tFullName: \"\(.fullName)\",\n\tOS: \"\(.os)\",\n\tSKU: \"\(.sku)\",\n\tVersion: \"\(.version)\",\n},"' diff --git a/pkg/fake/nodeimageversionsapi.go b/pkg/fake/nodeimageversionsapi.go index ac883146a4..6792502afa 100644 --- a/pkg/fake/nodeimageversionsapi.go +++ b/pkg/fake/nodeimageversionsapi.go @@ -19,14 +19,16 @@ package fake import ( "context" + "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservice/armcontainerservice/v8" "github.com/Azure/karpenter-provider-azure/pkg/providers/imagefamily" "github.com/Azure/karpenter-provider-azure/pkg/providers/imagefamily/types" + "github.com/samber/lo" ) type NodeImageVersionsAPI struct { // OverrideNodeImageVersions allows tests to override the default static data // When nil, the default NodeImageVersions slice is used - OverrideNodeImageVersions []types.NodeImageVersion + OverrideNodeImageVersions []*armcontainerservice.NodeImageVersion // Error allows tests to simulate API errors. // If Error is set to non-nil, it will take precedence over other fake data Error error @@ -37,390 +39,342 @@ var _ types.NodeImageVersionsAPI = &NodeImageVersionsAPI{} // Note: use "make az-codegen-nodeimageversions" to generate data for this file // (will require update of some tests that use this data) var ( - nodeImageVersions = []types.NodeImageVersion{ + nodeImageVersionsSnapshotData = []*armcontainerservice.NodeImageVersion{ { - FullName: "AKSAzureLinux-V2fips-202505.27.0", - OS: "AKSAzureLinux", - SKU: "V2fips", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSCBLMariner-V2fips-202512.18.0"), + OS: lo.ToPtr("AKSCBLMariner"), + SKU: lo.ToPtr("V2fips"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSAzureLinux-V2gen2fips-202505.27.0", - OS: "AKSAzureLinux", - SKU: "V2gen2fips", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSFlatcar-flatcargen2arm64-202512.18.0"), + OS: lo.ToPtr("AKSFlatcar"), + SKU: lo.ToPtr("flatcargen2arm64"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSAzureLinux-V3fips-202505.27.0", - OS: "AKSAzureLinux", - SKU: "V3fips", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSUbuntuEdgeZone-2204gen2containerd-202512.18.0"), + OS: lo.ToPtr("AKSUbuntuEdgeZone"), + SKU: lo.ToPtr("2204gen2containerd"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSUbuntu-1604-2021.11.06", - OS: "AKSUbuntu", - SKU: "1604", - Version: "2021.11.06", + FullName: lo.ToPtr("AKSAzureLinux-V3katagen2-202512.18.0"), + OS: lo.ToPtr("AKSAzureLinux"), + SKU: lo.ToPtr("V3katagen2"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSUbuntu-2404gen2containerd-202505.27.0", - OS: "AKSUbuntu", - SKU: "2404gen2containerd", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSAzureLinux-OSGuardV3gen2fipsTL-202512.18.0"), + OS: lo.ToPtr("AKSAzureLinux"), + SKU: lo.ToPtr("OSGuardV3gen2fipsTL"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSUbuntu-1804gen2fipscontainerd-202505.27.0", - OS: "AKSUbuntu", - SKU: "1804gen2fipscontainerd", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSCBLMariner-V2gen2-202512.18.0"), + OS: lo.ToPtr("AKSCBLMariner"), + SKU: lo.ToPtr("V2gen2"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSUbuntu-2004gen2fipscontainerd-202505.27.0", - OS: "AKSUbuntu", - SKU: "2004gen2fipscontainerd", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSUbuntu-2204gen2TLcontainerd-202512.18.0"), + OS: lo.ToPtr("AKSUbuntu"), + SKU: lo.ToPtr("2204gen2TLcontainerd"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSAzureLinux-V2-202505.27.0", - OS: "AKSAzureLinux", - SKU: "V2", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSUbuntuEdgeZone-2204containerd-202512.18.0"), + OS: lo.ToPtr("AKSUbuntuEdgeZone"), + SKU: lo.ToPtr("2204containerd"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSUbuntuEdgeZone-1804containerd-202505.27.0", - OS: "AKSUbuntuEdgeZone", - SKU: "1804containerd", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSUbuntu-2204minimalcontainerd-202401.12.0"), + OS: lo.ToPtr("AKSUbuntu"), + SKU: lo.ToPtr("2204minimalcontainerd"), + Version: lo.ToPtr("202401.12.0"), }, { - FullName: "AKSUbuntuEdgeZone-2204gen2containerd-202505.27.0", - OS: "AKSUbuntuEdgeZone", - SKU: "2204gen2containerd", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSWindows-2022-containerd-20348.4529.251212"), + OS: lo.ToPtr("AKSWindows"), + SKU: lo.ToPtr("windows-2022-containerd"), + Version: lo.ToPtr("20348.4529.251212"), }, { - FullName: "AKSUbuntu-2004gen2CVMcontainerd-202505.27.0", - OS: "AKSUbuntu", - SKU: "2004gen2CVMcontainerd", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSAzureLinux-V2gen2-202512.18.0"), + OS: lo.ToPtr("AKSAzureLinux"), + SKU: lo.ToPtr("V2gen2"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSAzureLinux-V2gen2TL-202505.27.0", - OS: "AKSAzureLinux", - SKU: "V2gen2TL", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSUbuntu-2404gen2arm64containerd-202512.18.0"), + OS: lo.ToPtr("AKSUbuntu"), + SKU: lo.ToPtr("2404gen2arm64containerd"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSUbuntu-1804containerd-202505.27.0", - OS: "AKSUbuntu", - SKU: "1804containerd", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSUbuntu-2404gen2arm64gb200containerd-202512.18.0"), + OS: lo.ToPtr("AKSUbuntu"), + SKU: lo.ToPtr("2404gen2arm64gb200containerd"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSUbuntu-2204containerd-202505.27.0", - OS: "AKSUbuntu", - SKU: "2204containerd", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSUbuntu-2204gen2minimalcontainerd-202401.12.0"), + OS: lo.ToPtr("AKSUbuntu"), + SKU: lo.ToPtr("2204gen2minimalcontainerd"), + Version: lo.ToPtr("202401.12.0"), }, { - FullName: "AKSUbuntu-2404containerd-202505.27.0", - OS: "AKSUbuntu", - SKU: "2404containerd", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSAzureLinux-V2gen2fips-202512.18.0"), + OS: lo.ToPtr("AKSAzureLinux"), + SKU: lo.ToPtr("V2gen2fips"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSWindows-2019-17763.2019.221114", - OS: "AKSWindows", - SKU: "windows-2019", - Version: "17763.2019.221114", + FullName: lo.ToPtr("AKSAzureLinux-V3-202512.18.0"), + OS: lo.ToPtr("AKSAzureLinux"), + SKU: lo.ToPtr("V3"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSAzureLinux-V2gen2-202505.27.0", - OS: "AKSAzureLinux", - SKU: "V2gen2", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSAzureLinux-V3gen2arm64fips-202512.18.0"), + OS: lo.ToPtr("AKSAzureLinux"), + SKU: lo.ToPtr("V3gen2arm64fips"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSWindows-2019-containerd-17763.7314.250518", - OS: "AKSWindows", - SKU: "windows-2019-containerd", - Version: "17763.7314.250518", + FullName: lo.ToPtr("AKSCBLMariner-V1-202308.28.0"), + OS: lo.ToPtr("AKSCBLMariner"), + SKU: lo.ToPtr("V1"), + Version: lo.ToPtr("202308.28.0"), }, { - FullName: "AKSCBLMariner-V2gen2arm64-202505.27.0", - OS: "AKSCBLMariner", - SKU: "V2gen2arm64", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSCBLMariner-V2gen2arm64-202512.18.0"), + OS: lo.ToPtr("AKSCBLMariner"), + SKU: lo.ToPtr("V2gen2arm64"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSCBLMariner-V2katagen2-202505.27.0", - OS: "AKSCBLMariner", - SKU: "V2katagen2", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSUbuntu-2004gen2fipscontainerd-202512.18.0"), + OS: lo.ToPtr("AKSUbuntu"), + SKU: lo.ToPtr("2004gen2fipscontainerd"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSUbuntu-1804gpu-2022.08.29", - OS: "AKSUbuntu", - SKU: "1804gpu", - Version: "2022.08.29", + FullName: lo.ToPtr("AKSUbuntu-2204fipscontainerd-202404.09.0"), + OS: lo.ToPtr("AKSUbuntu"), + SKU: lo.ToPtr("2204fipscontainerd"), + Version: lo.ToPtr("202404.09.0"), }, { - FullName: "AKSUbuntu-1804gen2gpu-2022.08.29", - OS: "AKSUbuntu", - SKU: "1804gen2gpu", - Version: "2022.08.29", + FullName: lo.ToPtr("AKSWindows-2025-26100.7462.251212"), + OS: lo.ToPtr("AKSWindows"), + SKU: lo.ToPtr("windows-2025"), + Version: lo.ToPtr("26100.7462.251212"), }, { - FullName: "AKSAzureLinux-V3-202505.27.0", - OS: "AKSAzureLinux", - SKU: "V3", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSAzureLinux-V2katagen2-202509.05.0"), + OS: lo.ToPtr("AKSAzureLinux"), + SKU: lo.ToPtr("V2katagen2"), + Version: lo.ToPtr("202509.05.0"), }, { - FullName: "AKSAzureLinux-V3gen2-202505.27.0", - OS: "AKSAzureLinux", - SKU: "V3gen2", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSAzureLinux-V3gen2TL-202512.18.0"), + OS: lo.ToPtr("AKSAzureLinux"), + SKU: lo.ToPtr("V3gen2TL"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSCBLMariner-V2gen2-202505.27.0", - OS: "AKSCBLMariner", - SKU: "V2gen2", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSCBLMariner-V2katagen2-202509.05.0"), + OS: lo.ToPtr("AKSCBLMariner"), + SKU: lo.ToPtr("V2katagen2"), + Version: lo.ToPtr("202509.05.0"), }, { - FullName: "AKSWindows-2022-containerd-gen2-20348.3692.250518", - OS: "AKSWindows", - SKU: "windows-2022-containerd-gen2", - Version: "20348.3692.250518", + FullName: lo.ToPtr("AKSCBLMariner-V2gen2TL-202512.18.0"), + OS: lo.ToPtr("AKSCBLMariner"), + SKU: lo.ToPtr("V2gen2TL"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSAzureLinux-V3gen2arm64fips-202505.27.0", - OS: "AKSAzureLinux", - SKU: "V3gen2arm64fips", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSUbuntu-2404containerd-202512.18.0"), + OS: lo.ToPtr("AKSUbuntu"), + SKU: lo.ToPtr("2404containerd"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSUbuntu-2204gen2arm64containerd-202505.27.0", - OS: "AKSUbuntu", - SKU: "2204gen2arm64containerd", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSUbuntu-2404gen2CVMcontainerd-202512.18.0"), + OS: lo.ToPtr("AKSUbuntu"), + SKU: lo.ToPtr("2404gen2CVMcontainerd"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSWindows-2025-26100.4061.250518", - OS: "AKSWindows", - SKU: "windows-2025", - Version: "26100.4061.250518", + FullName: lo.ToPtr("AKSUbuntu-2004fipscontainerd-202512.18.0"), + OS: lo.ToPtr("AKSUbuntu"), + SKU: lo.ToPtr("2004fipscontainerd"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSWindows-23H2-gen2-25398.1611.250518", - OS: "AKSWindows", - SKU: "windows-23H2-gen2", - Version: "25398.1611.250518", + FullName: lo.ToPtr("AKSWindows-2022-containerd-gen2-20348.4529.251212"), + OS: lo.ToPtr("AKSWindows"), + SKU: lo.ToPtr("windows-2022-containerd-gen2"), + Version: lo.ToPtr("20348.4529.251212"), }, { - FullName: "AKSAzureLinux-V3gen2TL-202505.27.0", - OS: "AKSAzureLinux", - SKU: "V3gen2TL", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSAzureLinux-V2gen2arm64-202512.18.0"), + OS: lo.ToPtr("AKSAzureLinux"), + SKU: lo.ToPtr("V2gen2arm64"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSUbuntu-2204gen2TLcontainerd-202505.27.0", - OS: "AKSUbuntu", - SKU: "2204gen2TLcontainerd", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSAzureLinux-V2fips-202512.18.0"), + OS: lo.ToPtr("AKSAzureLinux"), + SKU: lo.ToPtr("V2fips"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSUbuntu-2404gen2CVMcontainerd-202505.27.0", - OS: "AKSUbuntu", - SKU: "2404gen2CVMcontainerd", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSAzureLinux-V3gen2CVM-202512.18.0"), + OS: lo.ToPtr("AKSAzureLinux"), + SKU: lo.ToPtr("V3gen2CVM"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSUbuntu-2204gen2containerd-2022.10.03", - OS: "AKSUbuntu", - SKU: "2204gen2containerd", - Version: "2022.10.03", + FullName: lo.ToPtr("AKSUbuntu-2204gen2arm64containerd-202512.18.0"), + OS: lo.ToPtr("AKSUbuntu"), + SKU: lo.ToPtr("2204gen2arm64containerd"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSUbuntu-2204gen2fipscontainerd-202404.09.0", - OS: "AKSUbuntu", - SKU: "2204gen2fipscontainerd", - Version: "202404.09.0", + FullName: lo.ToPtr("AKSUbuntu-2204containerd-202512.18.0"), + OS: lo.ToPtr("AKSUbuntu"), + SKU: lo.ToPtr("2204containerd"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSAzureLinux-V3gen2arm64-202505.27.0", - OS: "AKSAzureLinux", - SKU: "V3gen2arm64", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSUbuntu-2404gen2TLcontainerd-202512.18.0"), + OS: lo.ToPtr("AKSUbuntu"), + SKU: lo.ToPtr("2404gen2TLcontainerd"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSAzureLinux-V3gen2fips-202505.27.0", - OS: "AKSAzureLinux", - SKU: "V3gen2fips", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSUbuntu-2204gen2fipscontainerd-202404.09.0"), + OS: lo.ToPtr("AKSUbuntu"), + SKU: lo.ToPtr("2204gen2fipscontainerd"), + Version: lo.ToPtr("202404.09.0"), }, { - FullName: "AKSCBLMariner-V2fips-202505.27.0", - OS: "AKSCBLMariner", - SKU: "V2fips", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSWindows-2019-containerd-17763.8146.251212"), + OS: lo.ToPtr("AKSWindows"), + SKU: lo.ToPtr("windows-2019-containerd"), + Version: lo.ToPtr("17763.8146.251212"), }, { - FullName: "AKSCBLMariner-V2gen2TL-202505.27.0", - OS: "AKSCBLMariner", - SKU: "V2gen2TL", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSAzureLinux-V2-202512.18.0"), + OS: lo.ToPtr("AKSAzureLinux"), + SKU: lo.ToPtr("V2"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSUbuntu-1804-2022.08.29", - OS: "AKSUbuntu", - SKU: "1804", - Version: "2022.08.29", + FullName: lo.ToPtr("AKSAzureLinux-V3fips-202512.18.0"), + OS: lo.ToPtr("AKSAzureLinux"), + SKU: lo.ToPtr("V3fips"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSUbuntu-2204fipscontainerd-202404.09.0", - OS: "AKSUbuntu", - SKU: "2204fipscontainerd", - Version: "202404.09.0", + FullName: lo.ToPtr("AKSAzureLinux-V3gen2-202512.18.0"), + OS: lo.ToPtr("AKSAzureLinux"), + SKU: lo.ToPtr("V3gen2"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSWindows-23H2-25398.1611.250518", - OS: "AKSWindows", - SKU: "windows-23H2", - Version: "25398.1611.250518", + FullName: lo.ToPtr("AKSCBLMariner-V2-202512.18.0"), + OS: lo.ToPtr("AKSCBLMariner"), + SKU: lo.ToPtr("V2"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSAzureLinux-V3gen2CVM-202505.27.0", - OS: "AKSAzureLinux", - SKU: "V3gen2CVM", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSUbuntu-2204gen2containerd-202512.18.0"), + OS: lo.ToPtr("AKSUbuntu"), + SKU: lo.ToPtr("2204gen2containerd"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSUbuntu-1804gen2containerd-202505.27.0", - OS: "AKSUbuntu", - SKU: "1804gen2containerd", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSUbuntu-2204gen2containerd-2022.10.03"), + OS: lo.ToPtr("AKSUbuntu"), + SKU: lo.ToPtr("2204gen2containerd"), + Version: lo.ToPtr("2022.10.03"), }, { - FullName: "AKSUbuntu-2204minimalcontainerd-202401.12.0", - OS: "AKSUbuntu", - SKU: "2204minimalcontainerd", - Version: "202401.12.0", + FullName: lo.ToPtr("AKSWindows-23H2-25398.2025.251212"), + OS: lo.ToPtr("AKSWindows"), + SKU: lo.ToPtr("windows-23H2"), + Version: lo.ToPtr("25398.2025.251212"), }, { - FullName: "AKSCBLMariner-V2gen2fips-202505.27.0", - OS: "AKSCBLMariner", - SKU: "V2gen2fips", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSWindows-23H2-gen2-25398.2025.251212"), + OS: lo.ToPtr("AKSWindows"), + SKU: lo.ToPtr("windows-23H2-gen2"), + Version: lo.ToPtr("25398.2025.251212"), }, { - FullName: "AKSUbuntu-2404gen2TLcontainerd-202505.27.0", - OS: "AKSUbuntu", - SKU: "2404gen2TLcontainerd", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSFlatcar-flatcargen2-202512.18.0"), + OS: lo.ToPtr("AKSFlatcar"), + SKU: lo.ToPtr("flatcargen2"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSUbuntuEdgeZone-1804gen2containerd-202505.27.0", - OS: "AKSUbuntuEdgeZone", - SKU: "1804gen2containerd", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSAzureLinux-V3gen2arm64-202512.18.0"), + OS: lo.ToPtr("AKSAzureLinux"), + SKU: lo.ToPtr("V3gen2arm64"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSUbuntu-1804gen2gpucontainerd-202501.05.0", - OS: "AKSUbuntu", - SKU: "1804gen2gpucontainerd", - Version: "202501.05.0", + FullName: lo.ToPtr("AKSCBLMariner-V2gen2fips-202512.18.0"), + OS: lo.ToPtr("AKSCBLMariner"), + SKU: lo.ToPtr("V2gen2fips"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSWindows-2022-containerd-20348.3692.250518", - OS: "AKSWindows", - SKU: "windows-2022-containerd", - Version: "20348.3692.250518", + FullName: lo.ToPtr("AKSCBLMariner-V2katagen2TL-2022.12.15"), + OS: lo.ToPtr("AKSCBLMariner"), + SKU: lo.ToPtr("V2katagen2TL"), + Version: lo.ToPtr("2022.12.15"), }, { - FullName: "AKSUbuntu-2404gen2arm64containerd-202505.27.0", - OS: "AKSUbuntu", - SKU: "2404gen2arm64containerd", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSUbuntu-2004gen2CVMcontainerd-202512.18.0"), + OS: lo.ToPtr("AKSUbuntu"), + SKU: lo.ToPtr("2004gen2CVMcontainerd"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSUbuntu-1804fipscontainerd-202505.27.0", - OS: "AKSUbuntu", - SKU: "1804fipscontainerd", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSUbuntu-2404gen2containerd-202512.18.0"), + OS: lo.ToPtr("AKSUbuntu"), + SKU: lo.ToPtr("2404gen2containerd"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSCBLMariner-V1-202308.28.0", - OS: "AKSCBLMariner", - SKU: "V1", - Version: "202308.28.0", + FullName: lo.ToPtr("AKSWindows-2019-17763.2019.221114"), + OS: lo.ToPtr("AKSWindows"), + SKU: lo.ToPtr("windows-2019"), + Version: lo.ToPtr("17763.2019.221114"), }, { - FullName: "AKSUbuntu-2004fipscontainerd-202505.27.0", - OS: "AKSUbuntu", - SKU: "2004fipscontainerd", - Version: "202505.27.0", + FullName: lo.ToPtr("AKSWindows-2025-gen2-26100.7462.251212"), + OS: lo.ToPtr("AKSWindows"), + SKU: lo.ToPtr("windows-2025-gen2"), + Version: lo.ToPtr("26100.7462.251212"), }, { - FullName: "AKSWindows-2025-gen2-26100.4061.250518", - OS: "AKSWindows", - SKU: "windows-2025-gen2", - Version: "26100.4061.250518", + FullName: lo.ToPtr("AKSAzureLinux-V2gen2TL-202512.18.0"), + OS: lo.ToPtr("AKSAzureLinux"), + SKU: lo.ToPtr("V2gen2TL"), + Version: lo.ToPtr("202512.18.0"), }, { - FullName: "AKSUbuntu-2204gen2containerd-202505.27.0", - OS: "AKSUbuntu", - SKU: "2204gen2containerd", - Version: "202505.27.0", - }, - { - FullName: "AKSAzureLinux-V2katagen2-202505.27.0", - OS: "AKSAzureLinux", - SKU: "V2katagen2", - Version: "202505.27.0", - }, - { - FullName: "AKSCBLMariner-V2-202505.27.0", - OS: "AKSCBLMariner", - SKU: "V2", - Version: "202505.27.0", - }, - { - FullName: "AKSUbuntu-1804gpucontainerd-202501.05.0", - OS: "AKSUbuntu", - SKU: "1804gpucontainerd", - Version: "202501.05.0", - }, - { - FullName: "AKSUbuntu-2204gen2minimalcontainerd-202401.12.0", - OS: "AKSUbuntu", - SKU: "2204gen2minimalcontainerd", - Version: "202401.12.0", - }, - { - FullName: "AKSAzureLinux-V2gen2arm64-202505.27.0", - OS: "AKSAzureLinux", - SKU: "V2gen2arm64", - Version: "202505.27.0", - }, - { - FullName: "AKSUbuntuEdgeZone-2204containerd-202505.27.0", - OS: "AKSUbuntuEdgeZone", - SKU: "2204containerd", - Version: "202505.27.0", - }, - { - FullName: "AKSUbuntu-1804gen2-2022.08.29", - OS: "AKSUbuntu", - SKU: "1804gen2", - Version: "2022.08.29", - }, - { - FullName: "AKSCBLMariner-V2katagen2TL-2022.12.15", - OS: "AKSCBLMariner", - SKU: "V2katagen2TL", - Version: "2022.12.15", + FullName: lo.ToPtr("AKSAzureLinux-V3gen2fips-202512.18.0"), + OS: lo.ToPtr("AKSAzureLinux"), + SKU: lo.ToPtr("V3gen2fips"), + Version: lo.ToPtr("202512.18.0"), }, } ) @@ -430,19 +384,17 @@ func (n *NodeImageVersionsAPI) Reset() { n.Error = nil } -func (n *NodeImageVersionsAPI) List(_ context.Context, _, _ string) (types.NodeImageVersionsResponse, error) { +func (n *NodeImageVersionsAPI) List(_ context.Context, _ string) ([]*armcontainerservice.NodeImageVersion, error) { // Error takes precedence over other fake data if n.Error != nil { - return types.NodeImageVersionsResponse{}, n.Error + return nil, n.Error } // Use override data if provided, otherwise use default static data - dataToUse := nodeImageVersions + dataToUse := nodeImageVersionsSnapshotData if n.OverrideNodeImageVersions != nil { dataToUse = n.OverrideNodeImageVersions } - return types.NodeImageVersionsResponse{ - Values: imagefamily.FilteredNodeImages(dataToUse), - }, nil + return imagefamily.FilteredNodeImages(dataToUse), nil } diff --git a/pkg/fake/nodeimageversionsapi_test.go b/pkg/fake/nodeimageversionsapi_test.go index 728e4807d8..66b444a405 100644 --- a/pkg/fake/nodeimageversionsapi_test.go +++ b/pkg/fake/nodeimageversionsapi_test.go @@ -21,16 +21,17 @@ import ( "testing" "github.com/Azure/karpenter-provider-azure/pkg/providers/imagefamily" + "github.com/samber/lo" "github.com/stretchr/testify/assert" ) func TestFilteredNodeImagesGalleryFilter(t *testing.T) { nodeImageVersionAPI := NodeImageVersionsAPI{} - nodeImageVersions, _ := nodeImageVersionAPI.List(context.TODO(), "", "") - filteredNodeImages := imagefamily.FilteredNodeImages(nodeImageVersions.Values) + nodeImageVersions, _ := nodeImageVersionAPI.List(context.TODO(), "") + filteredNodeImages := imagefamily.FilteredNodeImages(nodeImageVersions) for _, val := range filteredNodeImages { - assert.NotEqual(t, val.OS, "AKSWindows") - assert.NotEqual(t, val.OS, "AKSUbuntuEdgeZone") + assert.NotEqual(t, lo.FromPtr(val.OS), "AKSWindows") + assert.NotEqual(t, lo.FromPtr(val.OS), "AKSUbuntuEdgeZone") } } @@ -60,13 +61,13 @@ func TestFilteredNodeImagesGalleryFilter(t *testing.T) { // duplicate entries for os + sku matchings. // This test validates we simply ignore the legacy distros and take in the latest Version. func TestFilteredNodeImagesMinimalUbuntuEdgeCase(t *testing.T) { - filteredNodeImages := imagefamily.FilteredNodeImages(nodeImageVersions) + filteredNodeImages := imagefamily.FilteredNodeImages(nodeImageVersionsSnapshotData) - expectedVersion := "202505.27.0" + expectedVersion := "202512.18.0" found := false for _, val := range filteredNodeImages { - if val.SKU == "2204gen2containerd" && val.Version == expectedVersion { + if lo.FromPtr(val.SKU) == "2204gen2containerd" && lo.FromPtr(val.Version) == expectedVersion { found = true break } @@ -82,14 +83,14 @@ func TestFilteredNodeImagesMinimalUbuntuEdgeCase(t *testing.T) { // the fake imports the same clientside filtering so we need to assert that behavior is the same func TestFilteredNodeImageVersionsFromProviderList(t *testing.T) { nodeImageVersionsAPI := NodeImageVersionsAPI{} - filteredNodeImages, err := nodeImageVersionsAPI.List(context.TODO(), "", "") + filteredNodeImages, err := nodeImageVersionsAPI.List(context.TODO(), "") assert.Nil(t, err) - expectedVersion := "202505.27.0" + expectedVersion := "202512.18.0" found := false - for _, val := range filteredNodeImages.Values { - if val.SKU == "2204gen2containerd" && val.Version == expectedVersion { + for _, val := range filteredNodeImages { + if lo.FromPtr(val.SKU) == "2204gen2containerd" && lo.FromPtr(val.Version) == expectedVersion && lo.FromPtr(val.OS) == "AKSUbuntu" { found = true break } diff --git a/pkg/providers/imagefamily/nodeimage.go b/pkg/providers/imagefamily/nodeimage.go index bf2e42afc3..e33bc4e920 100644 --- a/pkg/providers/imagefamily/nodeimage.go +++ b/pkg/providers/imagefamily/nodeimage.go @@ -22,6 +22,7 @@ import ( "time" "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v7" + "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservice/armcontainerservice/v8" "github.com/Azure/karpenter-provider-azure/pkg/apis/v1beta1" "github.com/Azure/karpenter-provider-azure/pkg/operator/options" types "github.com/Azure/karpenter-provider-azure/pkg/providers/imagefamily/types" @@ -122,16 +123,16 @@ func (p *provider) List(ctx context.Context, nodeClass *v1beta1.AKSNodeClass) ([ func (p *provider) listSIG(ctx context.Context, supportedImages []types.DefaultImageOutput) ([]NodeImage, error) { nodeImages := []NodeImage{} - retrievedLatestImages, err := p.nodeImageVersions.List(ctx, p.location, p.subscription) + retrievedLatestImages, err := p.nodeImageVersions.List(ctx, p.location) if err != nil { return nil, err } for _, supportedImage := range supportedImages { - var nextImage *types.NodeImageVersion - for _, retrievedLatestImage := range retrievedLatestImages.Values { - if supportedImage.ImageDefinition == retrievedLatestImage.SKU { - nextImage = &retrievedLatestImage + var nextImage *armcontainerservice.NodeImageVersion + for _, retrievedLatestImage := range retrievedLatestImages { + if supportedImage.ImageDefinition == lo.FromPtr(retrievedLatestImage.SKU) { + nextImage = retrievedLatestImage break } } @@ -139,7 +140,7 @@ func (p *provider) listSIG(ctx context.Context, supportedImages []types.DefaultI // Unable to find given image version continue } - imageID := BuildImageIDSIG(options.FromContext(ctx).SIGSubscriptionID, supportedImage.GalleryResourceGroup, supportedImage.GalleryName, supportedImage.ImageDefinition, nextImage.Version) + imageID := BuildImageIDSIG(options.FromContext(ctx).SIGSubscriptionID, supportedImage.GalleryResourceGroup, supportedImage.GalleryName, supportedImage.ImageDefinition, lo.FromPtr(nextImage.Version)) nodeImages = append(nodeImages, NodeImage{ ID: imageID, diff --git a/pkg/providers/imagefamily/nodeimage_test.go b/pkg/providers/imagefamily/nodeimage_test.go index 511724c6cf..54e9fb116c 100644 --- a/pkg/providers/imagefamily/nodeimage_test.go +++ b/pkg/providers/imagefamily/nodeimage_test.go @@ -44,7 +44,7 @@ const ( cigImageVersion = "202505.27.0" laterCIGImageVersion = "202605.27.0" - sigImageVersion = "202505.27.0" + sigImageVersion = "202512.18.0" // Updated to match fake data versions ) func renderExpectedCIGNodeImages( diff --git a/pkg/providers/imagefamily/nodeimageversionsclient.go b/pkg/providers/imagefamily/nodeimageversionsclient.go index a4e8ddf680..a6652db570 100644 --- a/pkg/providers/imagefamily/nodeimageversionsclient.go +++ b/pkg/providers/imagefamily/nodeimageversionsclient.go @@ -18,93 +18,73 @@ package imagefamily import ( "context" - "encoding/json" - "fmt" - "net/http" "strconv" "strings" "github.com/Azure/azure-sdk-for-go/sdk/azcore" - "github.com/Azure/azure-sdk-for-go/sdk/azcore/cloud" - "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" - "github.com/Azure/karpenter-provider-azure/pkg/auth" - types "github.com/Azure/karpenter-provider-azure/pkg/providers/imagefamily/types" + "github.com/Azure/azure-sdk-for-go/sdk/azcore/arm" + "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservice/armcontainerservice/v8" + "github.com/samber/lo" ) type NodeImageVersionsClient struct { - cred azcore.TokenCredential - cloud cloud.Configuration + client *armcontainerservice.Client } -func NewNodeImageVersionsClient(cred azcore.TokenCredential, cloud cloud.Configuration) *NodeImageVersionsClient { - return &NodeImageVersionsClient{ - cred: cred, - cloud: cloud, - } -} - -func (l *NodeImageVersionsClient) List(ctx context.Context, location, subscription string) (types.NodeImageVersionsResponse, error) { - resourceManagerConfig := l.cloud.Services[cloud.ResourceManager] - - resourceURL := fmt.Sprintf( - "%s/subscriptions/%s/providers/Microsoft.ContainerService/locations/%s/nodeImageVersions?api-version=%s", - resourceManagerConfig.Endpoint, subscription, location, "2024-04-02-preview", - ) - - token, err := l.cred.GetToken(ctx, policy.TokenRequestOptions{ - Scopes: []string{auth.TokenScope(l.cloud)}, - }) - if err != nil { - return types.NodeImageVersionsResponse{}, err - } - - req, err := http.NewRequestWithContext(context.Background(), "GET", resourceURL, nil) +func NewNodeImageVersionsClient(subscriptionID string, cred azcore.TokenCredential, opts *arm.ClientOptions) (*NodeImageVersionsClient, error) { + client, err := armcontainerservice.NewClient(subscriptionID, cred, opts) if err != nil { - return types.NodeImageVersionsResponse{}, err + return nil, err } + return &NodeImageVersionsClient{ + client: client, + }, nil +} - req.Header.Set("Authorization", "Bearer "+token.Token) - req.Header.Set("Content-Type", "application/json") +func (l *NodeImageVersionsClient) List(ctx context.Context, location string) ([]*armcontainerservice.NodeImageVersion, error) { + pager := l.client.NewListNodeImageVersionsPager(location, nil) - client := &http.Client{} - resp, err := client.Do(req) - if err != nil { - return types.NodeImageVersionsResponse{}, err - } - defer resp.Body.Close() + var allVersions []*armcontainerservice.NodeImageVersion + for pager.More() { + page, err := pager.NextPage(ctx) + if err != nil { + return nil, err + } - var response types.NodeImageVersionsResponse - decoder := json.NewDecoder(resp.Body) - err = decoder.Decode(&response) - if err != nil { - return types.NodeImageVersionsResponse{}, err + allVersions = append(allVersions, page.Value...) } - response.Values = FilteredNodeImages(response.Values) - return response, nil + return FilteredNodeImages(allVersions), nil } // FilteredNodeImages filters on two conditions // 1. The image is the latest version for the given OS and SKU // 2. the image belongs to a supported gallery(AKS Ubuntu or Azure Linux) -func FilteredNodeImages(nodeImageVersions []types.NodeImageVersion) []types.NodeImageVersion { - latestImages := make(map[string]types.NodeImageVersion) +func FilteredNodeImages(nodeImageVersions []*armcontainerservice.NodeImageVersion) []*armcontainerservice.NodeImageVersion { + latestImages := make(map[string]*armcontainerservice.NodeImageVersion) for _, image := range nodeImageVersions { + if image == nil { + continue + } + os := lo.FromPtr(image.OS) + sku := lo.FromPtr(image.SKU) + version := lo.FromPtr(image.Version) + // Skip the galleries that Karpenter does not support - if image.OS != AKSUbuntuGalleryName && image.OS != AKSAzureLinuxGalleryName { + if os != AKSUbuntuGalleryName && os != AKSAzureLinuxGalleryName { continue } - key := image.OS + "-" + image.SKU + key := os + "-" + sku currentLatest, exists := latestImages[key] - if !exists || isNewerVersion(image.Version, currentLatest.Version) { + if !exists || isNewerVersion(version, lo.FromPtr(currentLatest.Version)) { latestImages[key] = image } } - var filteredImages []types.NodeImageVersion + var filteredImages []*armcontainerservice.NodeImageVersion for _, image := range latestImages { filteredImages = append(filteredImages, image) } diff --git a/pkg/providers/imagefamily/types/types.go b/pkg/providers/imagefamily/types/types.go index e6eb2c02ba..1be63053da 100644 --- a/pkg/providers/imagefamily/types/types.go +++ b/pkg/providers/imagefamily/types/types.go @@ -22,6 +22,7 @@ import ( "github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime" armcomputev5 "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v7" + "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservice/armcontainerservice/v8" "github.com/Azure/karpenter-provider-azure/pkg/provisionclients/models" "sigs.k8s.io/karpenter/pkg/scheduling" ) @@ -58,19 +59,8 @@ type CommunityGalleryImageVersionsAPI interface { NewListPager(location string, publicGalleryName string, galleryImageName string, options *armcomputev5.CommunityGalleryImageVersionsClientListOptions) *runtime.Pager[armcomputev5.CommunityGalleryImageVersionsClientListResponse] } -type NodeImageVersion struct { - FullName string `json:"fullName"` - OS string `json:"os"` - SKU string `json:"sku"` - Version string `json:"version"` -} - -type NodeImageVersionsResponse struct { - Values []NodeImageVersion `json:"values"` -} - type NodeImageVersionsAPI interface { - List(ctx context.Context, location, subscription string) (NodeImageVersionsResponse, error) + List(ctx context.Context, location string) ([]*armcontainerservice.NodeImageVersion, error) } // NodeBootstrappingAPI defines the interface for retrieving node bootstrapping data diff --git a/pkg/providers/instance/azure_client.go b/pkg/providers/instance/azure_client.go index 877e4b8799..a754f415b8 100644 --- a/pkg/providers/instance/azure_client.go +++ b/pkg/providers/instance/azure_client.go @@ -181,7 +181,10 @@ func NewAZClient(ctx context.Context, cfg *auth.Config, env *auth.Environment, c return nil, err } - nodeImageVersionsClient := imagefamily.NewNodeImageVersionsClient(cred, opts.Cloud) + nodeImageVersionsClient, err := imagefamily.NewNodeImageVersionsClient(cfg.SubscriptionID, cred, opts) + if err != nil { + return nil, err + } loadBalancersClient, err := armnetwork.NewLoadBalancersClient(cfg.SubscriptionID, cred, opts) if err != nil {