Skip to content

Commit 705ab7e

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

File tree

6 files changed

+88
-7
lines changed

6 files changed

+88
-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: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,9 @@ type Resolver interface {
4747
}
4848

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

5254
// Options define the static launch template parameters
5355
type Options struct {
@@ -117,8 +119,10 @@ func (d DefaultFamily) FeatureFlags() FeatureFlags {
117119
}
118120

119121
// NewDefaultResolver constructs a new launch template DefaultResolver
120-
func NewDefaultResolver() *DefaultResolver {
121-
return &DefaultResolver{}
122+
func NewDefaultResolver(region string) *DefaultResolver {
123+
return &DefaultResolver{
124+
region: region,
125+
}
122126
}
123127

124128
// Resolve generates launch templates using the static options and dynamically generates launch template parameters.
@@ -230,6 +234,18 @@ func (r DefaultResolver) defaultClusterDNS(opts *Options, kubeletConfig *v1.Kube
230234
return newKubeletConfig
231235
}
232236

237+
var httpProtocolUnsupportedRegions = map[string]struct {
238+
HttpProtocolUnsupported bool
239+
}{
240+
"eu-isoe-west-1": {HttpProtocolUnsupported: true},
241+
"us-iso-east-1": {HttpProtocolUnsupported: true},
242+
"us-iso-west-1": {HttpProtocolUnsupported: true},
243+
"us-isob-east-1": {HttpProtocolUnsupported: true},
244+
"us-isob-west-1": {HttpProtocolUnsupported: true},
245+
"us-isof-south-1": {HttpProtocolUnsupported: true},
246+
"us-isof-east-1": {HttpProtocolUnsupported: true},
247+
}
248+
233249
func (r DefaultResolver) resolveLaunchTemplates(
234250
nodeClass *v1.EC2NodeClass,
235251
nodeClaim *karpv1.NodeClaim,
@@ -298,6 +314,9 @@ func (r DefaultResolver) resolveLaunchTemplates(
298314
if resolved.MetadataOptions == nil {
299315
resolved.MetadataOptions = amiFamily.DefaultMetadataOptions()
300316
}
317+
if httpProtocolUnsupported, ok := httpProtocolUnsupportedRegions[r.region]; ok && httpProtocolUnsupported.HttpProtocolUnsupported {
318+
resolved.MetadataOptions.HTTPProtocolIPv6 = nil
319+
}
301320
return resolved
302321
})
303322
}

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)