Skip to content
Closed
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 go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ require (
github.com/clarketm/json v1.17.1
github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf
github.com/coreos/ignition/v2 v2.25.1
github.com/coreos/stream-metadata-go v0.4.11
github.com/distribution/reference v0.6.0
github.com/docker/distribution v2.8.3+incompatible
github.com/elazarl/goproxy v1.7.2
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,8 @@ github.com/coreos/go-systemd/v22 v22.6.0 h1:aGVa/v8B7hpb0TKl0MWoAavPDmHvobFe5R5z
github.com/coreos/go-systemd/v22 v22.6.0/go.mod h1:iG+pp635Fo7ZmV/j14KUcmEyWF+0X7Lua8rrTWzYgWU=
github.com/coreos/ignition/v2 v2.25.1 h1:mrXOVwb4ZPlLG1tIki5em604Yiz5oRFlWkISrEYpHds=
github.com/coreos/ignition/v2 v2.25.1/go.mod h1:Px9MZK4oLhMUM3QMzzRhKbHowc5Hkf+VUu67i0gmsNw=
github.com/coreos/stream-metadata-go v0.4.11 h1:sQQOpI+v/eTyYO76r7jJeCmqZcm1oQYKdwirFJ7f0M0=
github.com/coreos/stream-metadata-go v0.4.11/go.mod h1:dTE8UEFgyUcrbdUg7vGT3uIP7S8a1IwUlmWLKlOp8G8=
github.com/coreos/vcontext v0.0.0-20231102161604-685dc7299dc5 h1:sMZSC2BW5LKCdvNbfN12SbKrNvtLBUNjfHZmMvI2ItY=
github.com/coreos/vcontext v0.0.0-20231102161604-685dc7299dc5/go.mod h1:Salmysdw7DAVuobBW/LwsKKgpyCPHUhjyJoMJD+ZJiI=
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
Expand Down
8 changes: 5 additions & 3 deletions hypershift-operator/controllers/nodepool/aws.go
Original file line number Diff line number Diff line change
Expand Up @@ -437,12 +437,14 @@ func getWindowsAMI(region string, specifiedArch string, releaseImage *releaseinf
}

// Access the rhel-coreos-extensions aws-winli data
winliData := archData.RHCOS.AWSWinLi
if winliData.Regions == nil {
if archData.RHELCoreOSExtensions == nil {
return "", fmt.Errorf("no rhel-coreos-extensions data found in release image metadata")
}
if archData.RHELCoreOSExtensions.AwsWinLi == nil || archData.RHELCoreOSExtensions.AwsWinLi.Regions == nil {
return "", fmt.Errorf("no aws-winli regions data found in release image metadata")
}

regionData, exists := winliData.Regions[region]
regionData, exists := archData.RHELCoreOSExtensions.AwsWinLi.Regions[region]
if !exists {
return "", fmt.Errorf("no Windows AMI found for region %s in release image metadata", region)
}
Expand Down
112 changes: 76 additions & 36 deletions hypershift-operator/controllers/nodepool/aws_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/client/fake"

"github.com/coreos/stream-metadata-go/stream"
"github.com/coreos/stream-metadata-go/stream/rhcos"
"github.com/google/go-cmp/cmp"
)

Expand Down Expand Up @@ -269,12 +271,12 @@ func TestAWSMachineTemplateSpec(t *testing.T) {
Name: "4.17.0",
},
},
StreamMetadata: &releaseinfo.CoreOSStreamMetadata{
Architectures: map[string]releaseinfo.CoreOSArchitecture{
StreamMetadata: &stream.Stream{
Architectures: map[string]stream.Arch{
"x86_64": {
RHCOS: releaseinfo.CoreRHCOSImage{
AWSWinLi: releaseinfo.CoreAWSWinLi{
Regions: map[string]releaseinfo.CoreAWSWinLiRegion{
RHELCoreOSExtensions: &rhcos.Extensions{
AwsWinLi: &rhcos.ReplicatedImage{
Regions: map[string]rhcos.SingleImage{
"us-east-1": {
Release: "418.94.202410090804-0",
Image: "ami-0abcdef1234567890",
Expand Down Expand Up @@ -707,12 +709,50 @@ func TestGetWindowsAMI(t *testing.T) {
Name: "4.17.0",
},
},
StreamMetadata: &releaseinfo.CoreOSStreamMetadata{
Architectures: map[string]releaseinfo.CoreOSArchitecture{},
StreamMetadata: &stream.Stream{
Architectures: map[string]stream.Arch{},
},
},
expectedError: "couldn't find OS metadata for architecture \"amd64\"",
},
{
name: "When RHELCoreOSExtensions is nil, it should return error",
region: "us-east-1",
arch: hyperv1.ArchitectureAMD64,
releaseImage: &releaseinfo.ReleaseImage{
ImageStream: &v1.ImageStream{
ObjectMeta: metav1.ObjectMeta{
Name: "4.17.0",
},
},
StreamMetadata: &stream.Stream{
Architectures: map[string]stream.Arch{
"x86_64": {},
},
},
},
expectedError: "no rhel-coreos-extensions data found in release image metadata",
},
{
name: "When AwsWinLi is nil, it should return error",
region: "us-east-1",
arch: hyperv1.ArchitectureAMD64,
releaseImage: &releaseinfo.ReleaseImage{
ImageStream: &v1.ImageStream{
ObjectMeta: metav1.ObjectMeta{
Name: "4.17.0",
},
},
StreamMetadata: &stream.Stream{
Architectures: map[string]stream.Arch{
"x86_64": {
RHELCoreOSExtensions: &rhcos.Extensions{},
},
},
},
},
expectedError: "no aws-winli regions data found in release image metadata",
},
{
name: "no aws-winli regions data",
region: "us-east-1",
Expand All @@ -723,11 +763,11 @@ func TestGetWindowsAMI(t *testing.T) {
Name: "4.17.0",
},
},
StreamMetadata: &releaseinfo.CoreOSStreamMetadata{
Architectures: map[string]releaseinfo.CoreOSArchitecture{
StreamMetadata: &stream.Stream{
Architectures: map[string]stream.Arch{
"x86_64": {
RHCOS: releaseinfo.CoreRHCOSImage{
AWSWinLi: releaseinfo.CoreAWSWinLi{
RHELCoreOSExtensions: &rhcos.Extensions{
AwsWinLi: &rhcos.ReplicatedImage{
Regions: nil,
},
},
Expand All @@ -747,12 +787,12 @@ func TestGetWindowsAMI(t *testing.T) {
Name: "4.17.0",
},
},
StreamMetadata: &releaseinfo.CoreOSStreamMetadata{
Architectures: map[string]releaseinfo.CoreOSArchitecture{
StreamMetadata: &stream.Stream{
Architectures: map[string]stream.Arch{
"x86_64": {
RHCOS: releaseinfo.CoreRHCOSImage{
AWSWinLi: releaseinfo.CoreAWSWinLi{
Regions: map[string]releaseinfo.CoreAWSWinLiRegion{
RHELCoreOSExtensions: &rhcos.Extensions{
AwsWinLi: &rhcos.ReplicatedImage{
Regions: map[string]rhcos.SingleImage{
"us-east-1": {
Release: "418.94.202410090804-0",
Image: "ami-testimage",
Expand All @@ -776,12 +816,12 @@ func TestGetWindowsAMI(t *testing.T) {
Name: "4.17.0",
},
},
StreamMetadata: &releaseinfo.CoreOSStreamMetadata{
Architectures: map[string]releaseinfo.CoreOSArchitecture{
StreamMetadata: &stream.Stream{
Architectures: map[string]stream.Arch{
"x86_64": {
RHCOS: releaseinfo.CoreRHCOSImage{
AWSWinLi: releaseinfo.CoreAWSWinLi{
Regions: map[string]releaseinfo.CoreAWSWinLiRegion{
RHELCoreOSExtensions: &rhcos.Extensions{
AwsWinLi: &rhcos.ReplicatedImage{
Regions: map[string]rhcos.SingleImage{
"us-east-1": {
Release: "418.94.202410090804-0",
Image: "",
Expand All @@ -805,12 +845,12 @@ func TestGetWindowsAMI(t *testing.T) {
Name: "4.17.0",
},
},
StreamMetadata: &releaseinfo.CoreOSStreamMetadata{
Architectures: map[string]releaseinfo.CoreOSArchitecture{
StreamMetadata: &stream.Stream{
Architectures: map[string]stream.Arch{
"x86_64": {
RHCOS: releaseinfo.CoreRHCOSImage{
AWSWinLi: releaseinfo.CoreAWSWinLi{
Regions: map[string]releaseinfo.CoreAWSWinLiRegion{
RHELCoreOSExtensions: &rhcos.Extensions{
AwsWinLi: &rhcos.ReplicatedImage{
Regions: map[string]rhcos.SingleImage{
"us-east-1": {
Release: "418.94.202410090804-0",
Image: "ami-0abcdef1234567890",
Expand Down Expand Up @@ -838,12 +878,12 @@ func TestGetWindowsAMI(t *testing.T) {
Name: "4.17.0",
},
},
StreamMetadata: &releaseinfo.CoreOSStreamMetadata{
Architectures: map[string]releaseinfo.CoreOSArchitecture{
StreamMetadata: &stream.Stream{
Architectures: map[string]stream.Arch{
"x86_64": {
RHCOS: releaseinfo.CoreRHCOSImage{
AWSWinLi: releaseinfo.CoreAWSWinLi{
Regions: map[string]releaseinfo.CoreAWSWinLiRegion{
RHELCoreOSExtensions: &rhcos.Extensions{
AwsWinLi: &rhcos.ReplicatedImage{
Regions: map[string]rhcos.SingleImage{
"us-east-1": {
Release: "418.94.202410090804-0",
Image: "ami-0abcdef1234567890",
Expand Down Expand Up @@ -1048,12 +1088,12 @@ func TestResolveAWSAMI(t *testing.T) {
ImageStream: &v1.ImageStream{
ObjectMeta: metav1.ObjectMeta{Name: "4.17.0"},
},
StreamMetadata: &releaseinfo.CoreOSStreamMetadata{
Architectures: map[string]releaseinfo.CoreOSArchitecture{
StreamMetadata: &stream.Stream{
Architectures: map[string]stream.Arch{
"x86_64": {
RHCOS: releaseinfo.CoreRHCOSImage{
AWSWinLi: releaseinfo.CoreAWSWinLi{
Regions: map[string]releaseinfo.CoreAWSWinLiRegion{
RHELCoreOSExtensions: &rhcos.Extensions{
AwsWinLi: &rhcos.ReplicatedImage{
Regions: map[string]rhcos.SingleImage{
"us-east-1": {
Release: "418.94.202410090804-0",
Image: "ami-windows-us-east-1",
Expand Down
32 changes: 19 additions & 13 deletions hypershift-operator/controllers/nodepool/azure.go
Original file line number Diff line number Diff line change
Expand Up @@ -133,33 +133,39 @@ func getAzureMarketplaceMetadata(releaseImage *releaseinfo.ReleaseImage, arch st
// Extract marketplace metadata from the RHCOS extensions
// Structure: .architectures.<arch>.rhel-coreos-extensions.marketplace.azure.no-purchase-plan
// Check for nil safety before accessing nested fields
if archData.RHCOS.Marketplace.Azure.NoPurchasePlan.HyperVGen1 == nil &&
archData.RHCOS.Marketplace.Azure.NoPurchasePlan.HyperVGen2 == nil {
if archData.RHELCoreOSExtensions == nil ||
archData.RHELCoreOSExtensions.Marketplace == nil ||
archData.RHELCoreOSExtensions.Marketplace.Azure == nil ||
archData.RHELCoreOSExtensions.Marketplace.Azure.NoPurchasePlan == nil {
return nil, nil // No marketplace data available
}

azureMarketplace := archData.RHELCoreOSExtensions.Marketplace.Azure.NoPurchasePlan
if azureMarketplace.Gen1 == nil && azureMarketplace.Gen2 == nil {
return nil, nil // No marketplace data available
}
azureMarketplace := archData.RHCOS.Marketplace.Azure.NoPurchasePlan

// Convert from release info format to our internal format
result := &azureMarketplaceMetadata{
NoPurchasePlan: &azureMarketplaceImageInfo{},
}

if azureMarketplace.HyperVGen1 != nil {
if azureMarketplace.Gen1 != nil {
result.NoPurchasePlan.HyperVGen1 = &hyperv1.AzureMarketplaceImage{
Publisher: azureMarketplace.HyperVGen1.Publisher,
Offer: azureMarketplace.HyperVGen1.Offer,
SKU: azureMarketplace.HyperVGen1.SKU,
Version: azureMarketplace.HyperVGen1.Version,
Publisher: azureMarketplace.Gen1.Publisher,
Offer: azureMarketplace.Gen1.Offer,
SKU: azureMarketplace.Gen1.SKU,
Version: azureMarketplace.Gen1.Version,
ImageGeneration: ptr.To(hyperv1.Gen1),
}
}

if azureMarketplace.HyperVGen2 != nil {
if azureMarketplace.Gen2 != nil {
result.NoPurchasePlan.HyperVGen2 = &hyperv1.AzureMarketplaceImage{
Publisher: azureMarketplace.HyperVGen2.Publisher,
Offer: azureMarketplace.HyperVGen2.Offer,
SKU: azureMarketplace.HyperVGen2.SKU,
Version: azureMarketplace.HyperVGen2.Version,
Publisher: azureMarketplace.Gen2.Publisher,
Offer: azureMarketplace.Gen2.Offer,
SKU: azureMarketplace.Gen2.SKU,
Version: azureMarketplace.Gen2.Version,
ImageGeneration: ptr.To(hyperv1.Gen2),
}
}
Expand Down
55 changes: 43 additions & 12 deletions hypershift-operator/controllers/nodepool/azure_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ import (

capiazure "sigs.k8s.io/cluster-api-provider-azure/api/v1beta1"
clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta1"

"github.com/coreos/stream-metadata-go/stream"
"github.com/coreos/stream-metadata-go/stream/rhcos"
)

func TestAzureMachineTemplateSpec(t *testing.T) {
Expand Down Expand Up @@ -946,6 +949,34 @@ func TestDefaultAzureNodePoolImage(t *testing.T) {
expectedImageType: "",
expectedMarketplaceImage: nil,
},
{
name: "skip defaulting when RHELCoreOSExtensions is nil",
nodePool: &hyperv1.NodePool{
Spec: hyperv1.NodePoolSpec{
Arch: hyperv1.ArchitectureAMD64,
Platform: hyperv1.NodePoolPlatform{
Type: hyperv1.AzurePlatform,
Azure: &hyperv1.AzureNodePoolPlatform{
Image: hyperv1.AzureVMImage{},
},
},
},
},
releaseImage: &releaseinfo.ReleaseImage{
ImageStream: &imageapi.ImageStream{
ObjectMeta: metav1.ObjectMeta{Name: "4.20.0"},
},
StreamMetadata: &stream.Stream{
Architectures: map[string]stream.Arch{
"x86_64": {
Images: stream.Images{},
},
},
},
},
expectedImageType: "",
expectedMarketplaceImage: nil,
},
{
name: "skip defaulting when no marketplace metadata available",
nodePool: &hyperv1.NodePool{
Expand Down Expand Up @@ -1113,28 +1144,28 @@ func TestDefaultAzureNodePoolImage(t *testing.T) {

// createMockReleaseImage creates a mock release image for testing
func createMockReleaseImage(version string, hasMarketplaceMetadata bool) *releaseinfo.ReleaseImage {
architecture := releaseinfo.CoreOSArchitecture{
Artifacts: map[string]releaseinfo.CoreOSArtifact{},
Images: releaseinfo.CoreOSImages{},
RHCOS: releaseinfo.CoreRHCOSImage{
AzureDisk: releaseinfo.CoreAzureDisk{
architecture := stream.Arch{
Artifacts: map[string]stream.PlatformArtifacts{},
Images: stream.Images{},
RHELCoreOSExtensions: &rhcos.Extensions{
AzureDisk: &rhcos.AzureDisk{
Release: "9.6.20250701-0",
URL: "https://rhcos.blob.core.windows.net/imagebucket/rhcos-9.6.20250701-0-azure.x86_64.vhd",
},
},
}

if hasMarketplaceMetadata {
architecture.RHCOS.Marketplace = releaseinfo.CoreMarketplace{
Azure: releaseinfo.CoreAzureMarketplace{
NoPurchasePlan: releaseinfo.CoreAzureMarketplaceNoPurchasePlan{
HyperVGen1: &releaseinfo.CoreAzureMarketplaceImage{
architecture.RHELCoreOSExtensions.Marketplace = &rhcos.Marketplace{
Azure: &rhcos.AzureMarketplace{
NoPurchasePlan: &rhcos.AzureMarketplaceImages{
Gen1: &rhcos.AzureMarketplaceImage{
Publisher: "azureopenshift",
Offer: "aro4",
SKU: "aro_419",
Version: "419.6.20250523",
},
HyperVGen2: &releaseinfo.CoreAzureMarketplaceImage{
Gen2: &rhcos.AzureMarketplaceImage{
Publisher: "azureopenshift",
Offer: "aro4",
SKU: "419-v2",
Expand All @@ -1145,12 +1176,12 @@ func createMockReleaseImage(version string, hasMarketplaceMetadata bool) *releas
}
}

architectures := map[string]releaseinfo.CoreOSArchitecture{
architectures := map[string]stream.Arch{
"x86_64": architecture,
"aarch64": architecture, // ARM64 uses the same marketplace metadata
}

streamMetadata := &releaseinfo.CoreOSStreamMetadata{
streamMetadata := &stream.Stream{
Stream: "test-stream",
Architectures: architectures,
}
Expand Down
Loading