From c42a416af0105d6b048428790f7855ca3d4a65d0 Mon Sep 17 00:00:00 2001 From: Rahul Raj Date: Fri, 6 Mar 2026 10:47:55 +0000 Subject: [PATCH] Fix EFA interface count for instances where MaximumNetworkCards exceeds EFA limit --- pkg/cfn/builder/network_interfaces.go | 6 ++- pkg/cfn/builder/network_interfaces_test.go | 44 ++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/pkg/cfn/builder/network_interfaces.go b/pkg/cfn/builder/network_interfaces.go index 21805511da..3f95d4ae24 100644 --- a/pkg/cfn/builder/network_interfaces.go +++ b/pkg/cfn/builder/network_interfaces.go @@ -51,10 +51,14 @@ func buildNetworkInterfaces( var numEFAs = math.MaxFloat64 for _, it := range info.InstanceTypes { networkInfo := it.NetworkInfo - numEFAs = math.Min(float64(aws.ToInt32(networkInfo.MaximumNetworkCards)), numEFAs) if !aws.ToBool(networkInfo.EfaSupported) { return fmt.Errorf("instance type %s does not support EFA", it.InstanceType) } + if networkInfo.EfaInfo != nil && networkInfo.EfaInfo.MaximumEfaInterfaces != nil { + numEFAs = math.Min(float64(aws.ToInt32(networkInfo.EfaInfo.MaximumEfaInterfaces)), numEFAs) + } else { + numEFAs = math.Min(float64(aws.ToInt32(networkInfo.MaximumNetworkCards)), numEFAs) + } } firstNI.InterfaceType = gfnt.NewString("efa") diff --git a/pkg/cfn/builder/network_interfaces_test.go b/pkg/cfn/builder/network_interfaces_test.go index fa2a791c25..7462d2da4a 100644 --- a/pkg/cfn/builder/network_interfaces_test.go +++ b/pkg/cfn/builder/network_interfaces_test.go @@ -142,6 +142,50 @@ func TestBuildNetworkInterfaces(t *testing.T) { expectedNetworkInterfaces: 4, expectedInterfaceType: "efa", }, + { + name: "EFA nodegroup with MaximumEfaInterfaces less than MaximumNetworkCards", + instanceTypes: []string{"p6-b300.48xlarge"}, + efaEnabled: true, + securityGroups: []*gfnt.Value{ + gfnt.NewString("sg-12345"), + }, + mockInstanceTypes: []ec2types.InstanceTypeInfo{ + { + InstanceType: "p6-b300.48xlarge", + NetworkInfo: &ec2types.NetworkInfo{ + MaximumNetworkCards: aws.Int32(17), + EfaSupported: aws.Bool(true), + EfaInfo: &ec2types.EfaInfo{ + MaximumEfaInterfaces: aws.Int32(8), + }, + }, + }, + }, + expectedNetworkInterfaces: 8, + expectedInterfaceType: "efa", + }, + { + name: "EFA nodegroup with EfaInfo present and matching MaximumNetworkCards", + instanceTypes: []string{"p5.48xlarge"}, + efaEnabled: true, + securityGroups: []*gfnt.Value{ + gfnt.NewString("sg-12345"), + }, + mockInstanceTypes: []ec2types.InstanceTypeInfo{ + { + InstanceType: "p5.48xlarge", + NetworkInfo: &ec2types.NetworkInfo{ + MaximumNetworkCards: aws.Int32(32), + EfaSupported: aws.Bool(true), + EfaInfo: &ec2types.EfaInfo{ + MaximumEfaInterfaces: aws.Int32(32), + }, + }, + }, + }, + expectedNetworkInterfaces: 32, + expectedInterfaceType: "efa", + }, { name: "EFA nodegroup with custom EFA security groups (1.32 scenario)", instanceTypes: []string{"c5n.18xlarge"},