Skip to content

Commit ad52ff6

Browse files
committed
fix(amifamily) remove HTTPProtocolIPv6 by default for unsupported regions
1 parent 502e393 commit ad52ff6

File tree

6 files changed

+86
-7
lines changed

6 files changed

+86
-7
lines changed

hack/tools/launchtemplate_counter/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ func main() {
139139
})
140140
fmt.Printf("Got %d instance types after filtering\n", len(instanceTypes))
141141

142-
resolver := amifamily.NewDefaultResolver()
142+
resolver := amifamily.NewDefaultResolver(region)
143143
launchTemplates, err := resolver.Resolve(nodeClass, &karpv1.NodeClaim{}, lo.Slice(instanceTypes, 0, 60), karpv1.CapacityTypeOnDemand, &amifamily.Options{InstanceStorePolicy: lo.ToPtr(v1.InstanceStorePolicyRAID0)})
144144

145145
if err != nil {

kwok/operator/operator.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ func NewOperator(ctx context.Context, operator *operator.Operator) (context.Cont
139139
lo.Must0(versionProvider.UpdateVersion(ctx))
140140
ssmProvider := ssmp.NewDefaultProvider(ssm.NewFromConfig(cfg), ssmCache)
141141
amiProvider := amifamily.NewDefaultProvider(operator.Clock, versionProvider, ssmProvider, ec2api, cache.New(awscache.DefaultTTL, awscache.DefaultCleanupInterval))
142-
amiResolver := amifamily.NewDefaultResolver()
142+
amiResolver := amifamily.NewDefaultResolver(cfg.Region)
143143
launchTemplateProvider := launchtemplate.NewDefaultProvider(
144144
ctx,
145145
cache.New(awscache.DefaultTTL, awscache.DefaultCleanupInterval),

pkg/operator/operator.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ func NewOperator(ctx context.Context, operator *operator.Operator) (context.Cont
145145
lo.Must0(versionProvider.UpdateVersion(ctx))
146146
ssmProvider := ssmp.NewDefaultProvider(ssm.NewFromConfig(cfg), ssmCache)
147147
amiProvider := amifamily.NewDefaultProvider(operator.Clock, versionProvider, ssmProvider, ec2api, cache.New(awscache.DefaultTTL, awscache.DefaultCleanupInterval))
148-
amiResolver := amifamily.NewDefaultResolver()
148+
amiResolver := amifamily.NewDefaultResolver(cfg.Region)
149149
launchTemplateProvider := launchtemplate.NewDefaultProvider(
150150
ctx,
151151
cache.New(awscache.DefaultTTL, awscache.DefaultCleanupInterval),

pkg/providers/amifamily/resolver.go

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"github.com/samber/lo"
2626
corev1 "k8s.io/api/core/v1"
2727
"k8s.io/apimachinery/pkg/api/resource"
28+
"k8s.io/apimachinery/pkg/util/sets"
2829

2930
karpv1 "sigs.k8s.io/karpenter/pkg/apis/v1"
3031

@@ -47,7 +48,9 @@ type Resolver interface {
4748
}
4849

4950
// DefaultResolver is able to fill-in dynamic launch template parameters
50-
type DefaultResolver struct{}
51+
type DefaultResolver struct {
52+
region string
53+
}
5154

5255
// Options define the static launch template parameters
5356
type Options struct {
@@ -117,8 +120,10 @@ func (d DefaultFamily) FeatureFlags() FeatureFlags {
117120
}
118121

119122
// NewDefaultResolver constructs a new launch template DefaultResolver
120-
func NewDefaultResolver() *DefaultResolver {
121-
return &DefaultResolver{}
123+
func NewDefaultResolver(region string) *DefaultResolver {
124+
return &DefaultResolver{
125+
region: region,
126+
}
122127
}
123128

124129
// Resolve generates launch templates using the static options and dynamically generates launch template parameters.
@@ -270,6 +275,15 @@ func (r DefaultResolver) resolveLaunchTemplates(
270275
if len(capacityReservationIDs) == 0 {
271276
capacityReservationIDs = append(capacityReservationIDs, "")
272277
}
278+
httpProtocolUnsupportedRegions := sets.New[string](
279+
"eu-isoe-west-1",
280+
"us-iso-east-1",
281+
"us-iso-west-1",
282+
"us-isob-east-1",
283+
"us-isob-west-1",
284+
"us-isof-south-1",
285+
"us-isof-east-1",
286+
)
273287
return lo.Map(capacityReservationIDs, func(id string, _ int) *LaunchTemplate {
274288
resolved := &LaunchTemplate{
275289
Options: options,
@@ -298,6 +312,9 @@ func (r DefaultResolver) resolveLaunchTemplates(
298312
if resolved.MetadataOptions == nil {
299313
resolved.MetadataOptions = amiFamily.DefaultMetadataOptions()
300314
}
315+
if httpProtocolUnsupportedRegions.Has(r.region) {
316+
resolved.MetadataOptions.HTTPProtocolIPv6 = nil
317+
}
301318
return resolved
302319
})
303320
}

pkg/providers/amifamily/suite_test.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,18 @@ import (
3535
"github.com/samber/lo"
3636
corev1 "k8s.io/api/core/v1"
3737

38+
"github.com/awslabs/operatorpkg/object"
39+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3840
karpv1 "sigs.k8s.io/karpenter/pkg/apis/v1"
41+
corecloudprovider "sigs.k8s.io/karpenter/pkg/cloudprovider"
42+
corecloudfake "sigs.k8s.io/karpenter/pkg/cloudprovider/fake"
3943
coreoptions "sigs.k8s.io/karpenter/pkg/operator/options"
4044
"sigs.k8s.io/karpenter/pkg/scheduling"
4145
coretest "sigs.k8s.io/karpenter/pkg/test"
4246

4347
"github.com/aws/karpenter-provider-aws/pkg/apis"
4448
v1 "github.com/aws/karpenter-provider-aws/pkg/apis/v1"
49+
"github.com/aws/karpenter-provider-aws/pkg/fake"
4550
"github.com/aws/karpenter-provider-aws/pkg/operator/options"
4651
"github.com/aws/karpenter-provider-aws/pkg/providers/amifamily"
4752
"github.com/aws/karpenter-provider-aws/pkg/test"
@@ -51,6 +56,9 @@ var ctx context.Context
5156
var env *coretest.Environment
5257
var awsEnv *test.Environment
5358
var nodeClass *v1.EC2NodeClass
59+
var nodePool *karpv1.NodePool
60+
var nodeClaim *karpv1.NodeClaim
61+
var instanceTypes []*corecloudprovider.InstanceType
5462

5563
func TestAWS(t *testing.T) {
5664
ctx = TestContextWithLogger(t)
@@ -929,6 +937,60 @@ var _ = Describe("AMIProvider", func() {
929937
})
930938
})
931939

940+
var _ = Describe("AMIResolver", func() {
941+
BeforeEach(func() {
942+
nodeClass = test.EC2NodeClass()
943+
nodePool = coretest.NodePool(karpv1.NodePool{
944+
Spec: karpv1.NodePoolSpec{
945+
Template: karpv1.NodeClaimTemplate{
946+
Spec: karpv1.NodeClaimTemplateSpec{
947+
NodeClassRef: &karpv1.NodeClassReference{
948+
Group: object.GVK(nodeClass).Group,
949+
Kind: object.GVK(nodeClass).Kind,
950+
Name: nodeClass.Name,
951+
},
952+
},
953+
},
954+
},
955+
})
956+
nodeClaim = coretest.NodeClaim(karpv1.NodeClaim{
957+
ObjectMeta: metav1.ObjectMeta{
958+
Labels: map[string]string{
959+
karpv1.NodePoolLabelKey: nodePool.Name,
960+
},
961+
},
962+
Spec: karpv1.NodeClaimSpec{
963+
NodeClassRef: &karpv1.NodeClassReference{
964+
Group: object.GVK(nodeClass).Group,
965+
Kind: object.GVK(nodeClass).Kind,
966+
Name: nodeClass.Name,
967+
},
968+
},
969+
})
970+
instanceTypes = []*corecloudprovider.InstanceType{
971+
corecloudfake.NewInstanceType(corecloudfake.InstanceTypeOptions{Name: "t3.medium"}),
972+
corecloudfake.NewInstanceType(corecloudfake.InstanceTypeOptions{Name: "m5.large"}),
973+
}
974+
})
975+
DescribeTable(
976+
"should set launch template metadata options correctly per region",
977+
func(region string, expect *string) {
978+
amiResolver := amifamily.NewDefaultResolver(region)
979+
launchTemplates, err := amiResolver.Resolve(nodeClass, nodeClaim, instanceTypes, karpv1.CapacityTypeOnDemand, &amifamily.Options{ClusterName: "test"})
980+
Expect(err).ToNot(HaveOccurred())
981+
Expect(launchTemplates).To(HaveLen(1))
982+
lo.ForEach(launchTemplates, func(launchTemplate *amifamily.LaunchTemplate, _ int) {
983+
Expect(launchTemplate.MetadataOptions.HTTPProtocolIPv6).To(Equal(expect))
984+
})
985+
},
986+
Entry("should be disabled for supported regions", fake.DefaultRegion, lo.ToPtr("disabled")),
987+
Entry("should be nil for isoe", "eu-isoe-west-1", nil),
988+
Entry("should be nil for iso", "us-iso-east-1", nil),
989+
Entry("should be nil for isob", "us-isob-east-1", nil),
990+
Entry("should be nil for isof", "us-isof-south-1", nil),
991+
)
992+
})
993+
932994
func ExpectConsistsOfAMIQueries(expected, actual []amifamily.DescribeImageQuery) {
933995
GinkgoHelper()
934996
Expect(actual).To(HaveLen(len(expected)))

pkg/test/environment.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ func NewEnvironment(ctx context.Context, env *coretest.Environment) *Environment
145145
instanceProfileProvider := instanceprofile.NewDefaultProvider(iamapi, instanceProfileCache, protectedProfilesCache, fake.DefaultRegion)
146146
ssmProvider := ssmp.NewDefaultProvider(ssmapi, ssmCache)
147147
amiProvider := amifamily.NewDefaultProvider(clock, versionProvider, ssmProvider, ec2api, ec2Cache)
148-
amiResolver := amifamily.NewDefaultResolver()
148+
amiResolver := amifamily.NewDefaultResolver(fake.DefaultRegion)
149149
instanceTypesResolver := instancetype.NewDefaultResolver(fake.DefaultRegion)
150150
capacityReservationProvider := capacityreservation.NewProvider(ec2api, clock, capacityReservationCache, capacityReservationAvailabilityCache)
151151
instanceTypesProvider := instancetype.NewDefaultProvider(instanceTypeCache, offeringCache, discoveredCapacityCache, ec2api, subnetProvider, pricingProvider, capacityReservationProvider, unavailableOfferingsCache, instanceTypesResolver)

0 commit comments

Comments
 (0)