Skip to content

Commit 176d4de

Browse files
committed
feat: add new on-demand allocation strategy
This commit adds a new on-demand allocation strategy: lowest-price.
1 parent c6d2f0d commit 176d4de

File tree

5 files changed

+70
-5
lines changed

5 files changed

+70
-5
lines changed

config/crd/bases/infrastructure.cluster.x-k8s.io_awsmachinepools.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -731,6 +731,7 @@ spec:
731731
instance types to fulfill On-Demand capacity.
732732
enum:
733733
- prioritized
734+
- lowest-price
734735
type: string
735736
onDemandBaseCapacity:
736737
default: 0

exp/api/v1beta2/types.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,11 @@ var (
137137
// OnDemandAllocationStrategyPrioritized uses the order of instance type overrides
138138
// for the LaunchTemplate to define the launch priority of each instance type.
139139
OnDemandAllocationStrategyPrioritized = OnDemandAllocationStrategy("prioritized")
140+
141+
// OnDemandAllocationStrategyLowestPrice will make the Auto Scaling group launch
142+
// instances using the On-Demand pools with the lowest price, and evenly allocates
143+
// your instances across the On-Demand pools that you specify.
144+
OnDemandAllocationStrategyLowestPrice = OnDemandAllocationStrategy("lowest-price")
140145
)
141146

142147
// SpotAllocationStrategy indicates how to allocate instances across Spot Instance pools.
@@ -165,7 +170,7 @@ var (
165170

166171
// InstancesDistribution to configure distribution of On-Demand Instances and Spot Instances.
167172
type InstancesDistribution struct {
168-
// +kubebuilder:validation:Enum=prioritized
173+
// +kubebuilder:validation:Enum=prioritized;lowest-price
169174
// +kubebuilder:default=prioritized
170175
OnDemandAllocationStrategy OnDemandAllocationStrategy `json:"onDemandAllocationStrategy,omitempty"`
171176

exp/controllers/awsmachinepool_controller_test.go

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,20 @@ func TestAWSMachinePoolReconciler(t *testing.T) {
8282
},
8383
Spec: expinfrav1.AWSMachinePoolSpec{
8484
MinSize: int32(0),
85-
MaxSize: int32(1),
85+
MaxSize: int32(100),
86+
MixedInstancesPolicy: &expinfrav1.MixedInstancesPolicy{
87+
InstancesDistribution: &expinfrav1.InstancesDistribution{
88+
OnDemandAllocationStrategy: expinfrav1.OnDemandAllocationStrategyPrioritized,
89+
SpotAllocationStrategy: expinfrav1.SpotAllocationStrategyCapacityOptimized,
90+
OnDemandBaseCapacity: aws.Int64(0),
91+
OnDemandPercentageAboveBaseCapacity: aws.Int64(100),
92+
},
93+
Overrides: []expinfrav1.Overrides{
94+
{
95+
InstanceType: "m6a.32xlarge",
96+
},
97+
},
98+
},
8699
},
87100
}
88101

@@ -383,7 +396,20 @@ func TestAWSMachinePoolReconciler(t *testing.T) {
383396

384397
asg := expinfrav1.AutoScalingGroup{
385398
MinSize: int32(0),
386-
MaxSize: int32(1),
399+
MaxSize: int32(100),
400+
MixedInstancesPolicy: &expinfrav1.MixedInstancesPolicy{
401+
InstancesDistribution: &expinfrav1.InstancesDistribution{
402+
OnDemandAllocationStrategy: expinfrav1.OnDemandAllocationStrategyPrioritized,
403+
SpotAllocationStrategy: expinfrav1.SpotAllocationStrategyCapacityOptimized,
404+
OnDemandBaseCapacity: aws.Int64(0),
405+
OnDemandPercentageAboveBaseCapacity: aws.Int64(100),
406+
},
407+
Overrides: []expinfrav1.Overrides{
408+
{
409+
InstanceType: "m6a.32xlarge",
410+
},
411+
},
412+
},
387413
Subnets: []string{"subnet1", "subnet2"}}
388414
ec2Svc.EXPECT().ReconcileLaunchTemplate(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil)
389415
ec2Svc.EXPECT().ReconcileTags(gomock.Any(), gomock.Any()).Return(nil)
@@ -401,7 +427,7 @@ func TestAWSMachinePoolReconciler(t *testing.T) {
401427

402428
asg := expinfrav1.AutoScalingGroup{
403429
MinSize: int32(0),
404-
MaxSize: int32(1),
430+
MaxSize: int32(100),
405431
Subnets: []string{"subnet1", "subnet2"}}
406432
ec2Svc.EXPECT().ReconcileLaunchTemplate(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil)
407433
ec2Svc.EXPECT().ReconcileTags(gomock.Any(), gomock.Any()).Return(nil)

pkg/cloud/services/autoscaling/autoscalinggroup.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,13 @@ func (s *Service) SDKToAutoScalingGroup(v *autoscaling.Group) (*expinfrav1.AutoS
6565
}
6666

6767
onDemandAllocationStrategy := aws.StringValue(v.MixedInstancesPolicy.InstancesDistribution.OnDemandAllocationStrategy)
68-
if onDemandAllocationStrategy == string(expinfrav1.OnDemandAllocationStrategyPrioritized) {
68+
switch onDemandAllocationStrategy {
69+
case string(expinfrav1.OnDemandAllocationStrategyPrioritized):
6970
i.MixedInstancesPolicy.InstancesDistribution.OnDemandAllocationStrategy = expinfrav1.OnDemandAllocationStrategyPrioritized
71+
case string(expinfrav1.OnDemandAllocationStrategyLowestPrice):
72+
i.MixedInstancesPolicy.InstancesDistribution.OnDemandAllocationStrategy = expinfrav1.OnDemandAllocationStrategyLowestPrice
73+
default:
74+
return nil, fmt.Errorf("unsupported on-demand allocation strategy: %s", onDemandAllocationStrategy)
7075
}
7176

7277
spotAllocationStrategy := aws.StringValue(v.MixedInstancesPolicy.InstancesDistribution.SpotAllocationStrategy)

pkg/cloud/services/autoscaling/autoscalinggroup_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,34 @@ func TestServiceSDKToAutoScalingGroup(t *testing.T) {
302302
},
303303
wantErr: false,
304304
},
305+
{
306+
name: "invalid input - incorrect on-demand allocation strategy",
307+
input: &autoscaling.Group{
308+
AutoScalingGroupARN: aws.String("test-id"),
309+
AutoScalingGroupName: aws.String("test-name"),
310+
DesiredCapacity: aws.Int64(1234),
311+
MaxSize: aws.Int64(1234),
312+
MinSize: aws.Int64(1234),
313+
CapacityRebalance: aws.Bool(true),
314+
MixedInstancesPolicy: &autoscaling.MixedInstancesPolicy{
315+
InstancesDistribution: &autoscaling.InstancesDistribution{
316+
OnDemandAllocationStrategy: aws.String("prioritized"),
317+
OnDemandBaseCapacity: aws.Int64(1234),
318+
OnDemandPercentageAboveBaseCapacity: aws.Int64(1234),
319+
SpotAllocationStrategy: aws.String("INVALIDONDEMANDALLOCATIONSTRATEGY"),
320+
},
321+
LaunchTemplate: &autoscaling.LaunchTemplate{
322+
Overrides: []*autoscaling.LaunchTemplateOverrides{
323+
{
324+
InstanceType: aws.String("t2.medium"),
325+
WeightedCapacity: aws.String("test-weighted-cap"),
326+
},
327+
},
328+
},
329+
},
330+
},
331+
wantErr: true,
332+
},
305333
{
306334
name: "invalid input - incorrect spot allocation strategy",
307335
input: &autoscaling.Group{

0 commit comments

Comments
 (0)