diff --git a/test/e2e/fleetautoscaler_test.go b/test/e2e/fleetautoscaler_test.go index eee64c392d..8ed0c26931 100644 --- a/test/e2e/fleetautoscaler_test.go +++ b/test/e2e/fleetautoscaler_test.go @@ -816,7 +816,7 @@ func TestCounterAutoscaler(t *testing.T) { counterFas := func(f func(fap *autoscalingv1.FleetAutoscalerPolicy)) *autoscalingv1.FleetAutoscaler { fas := autoscalingv1.FleetAutoscaler{ - ObjectMeta: metav1.ObjectMeta{Name: flt.ObjectMeta.Name + "-autoscaler", Namespace: framework.Namespace}, + ObjectMeta: metav1.ObjectMeta{Name: flt.ObjectMeta.Name + "-counter-autoscaler", Namespace: framework.Namespace}, Spec: autoscalingv1.FleetAutoscalerSpec{ FleetName: flt.ObjectMeta.Name, Policy: autoscalingv1.FleetAutoscalerPolicy{ @@ -1014,7 +1014,7 @@ func TestCounterAutoscalerAllocated(t *testing.T) { }) counterFas := &autoscalingv1.FleetAutoscaler{ - ObjectMeta: metav1.ObjectMeta{Name: flt.ObjectMeta.Name + "-autoscaler", Namespace: framework.Namespace}, + ObjectMeta: metav1.ObjectMeta{Name: flt.ObjectMeta.Name + "-counter-autoscaler", Namespace: framework.Namespace}, Spec: autoscalingv1.FleetAutoscalerSpec{ FleetName: flt.ObjectMeta.Name, Policy: autoscalingv1.FleetAutoscalerPolicy{ @@ -1040,3 +1040,135 @@ func TestCounterAutoscalerAllocated(t *testing.T) { }) } } + +func TestListAutoscaler(t *testing.T) { + if !runtime.FeatureEnabled(runtime.FeatureCountsAndLists) { + t.SkipNow() + } + t.Parallel() + + ctx := context.Background() + client := framework.AgonesClient.AgonesV1() + log := e2e.TestLogger(t) + + flt := defaultFleet(framework.Namespace) + flt.Spec.Template.Spec.Lists = map[string]agonesv1.ListStatus{ + "games": { + Values: []string{"game1", "game2", "game3"}, // AggregateCount 9 + Capacity: 5, // AggregateCapacity 15 + }, + } + + flt, err := client.Fleets(framework.Namespace).Create(ctx, flt.DeepCopy(), metav1.CreateOptions{}) + require.NoError(t, err) + defer client.Fleets(framework.Namespace).Delete(ctx, flt.ObjectMeta.Name, metav1.DeleteOptions{}) // nolint:errcheck + framework.AssertFleetCondition(t, flt, e2e.FleetReadyCount(flt.Spec.Replicas)) + + fleetautoscalers := framework.AgonesClient.AutoscalingV1().FleetAutoscalers(framework.Namespace) + + listFas := func(f func(fap *autoscalingv1.FleetAutoscalerPolicy)) *autoscalingv1.FleetAutoscaler { + fas := autoscalingv1.FleetAutoscaler{ + ObjectMeta: metav1.ObjectMeta{Name: flt.ObjectMeta.Name + "-list-autoscaler", Namespace: framework.Namespace}, + Spec: autoscalingv1.FleetAutoscalerSpec{ + FleetName: flt.ObjectMeta.Name, + Policy: autoscalingv1.FleetAutoscalerPolicy{ + Type: autoscalingv1.ListPolicyType, + }, + Sync: &autoscalingv1.FleetAutoscalerSync{ + Type: autoscalingv1.FixedIntervalSyncType, + FixedInterval: autoscalingv1.FixedIntervalSync{ + Seconds: 1, + }, + }, + }, + } + f(&fas.Spec.Policy) + return &fas + } + testCases := map[string]struct { + fas *autoscalingv1.FleetAutoscaler + wantFasErr bool + wantReplicas int32 + }{ + "Scale Down to Minimum 1 Replica": { + fas: listFas(func(fap *autoscalingv1.FleetAutoscalerPolicy) { + fap.List = &autoscalingv1.ListPolicy{ + Key: "games", + BufferSize: intstr.FromInt(2), + MinCapacity: 0, + MaxCapacity: 3, + } + }), + wantFasErr: false, + wantReplicas: 1, // Count:3 Capacity:5 + }, + "Scale Down to Buffer": { + fas: listFas(func(fap *autoscalingv1.FleetAutoscalerPolicy) { + fap.List = &autoscalingv1.ListPolicy{ + Key: "games", + BufferSize: intstr.FromInt(3), + MinCapacity: 0, + MaxCapacity: 5, + } + }), + wantFasErr: false, + wantReplicas: 2, // Count:6 Capacity:10 + }, + "Scale Up to MinCapacity": { + fas: listFas(func(fap *autoscalingv1.FleetAutoscalerPolicy) { + fap.List = &autoscalingv1.ListPolicy{ + Key: "games", + BufferSize: intstr.FromInt(3), + MinCapacity: 16, + MaxCapacity: 100, + } + }), + wantFasErr: false, + wantReplicas: 4, // Count:12 Capacity:20 + }, + "Scale Down to MinCapacity": { + fas: listFas(func(fap *autoscalingv1.FleetAutoscalerPolicy) { + fap.List = &autoscalingv1.ListPolicy{ + Key: "games", + BufferSize: intstr.FromInt(1), + MinCapacity: 10, + MaxCapacity: 100, + } + }), + wantFasErr: false, + wantReplicas: 2, // Count:6 Capacity:10 + }, + "MinCapacity Less Than Buffer Invalid": { + fas: listFas(func(fap *autoscalingv1.FleetAutoscalerPolicy) { + fap.List = &autoscalingv1.ListPolicy{ + Key: "games", + BufferSize: intstr.FromInt(15), + MinCapacity: 5, + MaxCapacity: 25, + } + }), + wantFasErr: true, + wantReplicas: 5, // Count:15 Capacity:25 + }, + } + for name, testCase := range testCases { + t.Run(name, func(t *testing.T) { + + fas, err := fleetautoscalers.Create(ctx, testCase.fas, metav1.CreateOptions{}) + if testCase.wantFasErr { + assert.Error(t, err) + return + } + assert.NoError(t, err) + + log.Print("FAS: ", fas) + + framework.AssertFleetCondition(t, flt, e2e.FleetReadyCount(testCase.wantReplicas)) + fleetautoscalers.Delete(ctx, fas.ObjectMeta.Name, metav1.DeleteOptions{}) // nolint:errcheck + + // Return to starting 3 replicas + framework.ScaleFleet(t, log, flt, 3) + framework.AssertFleetCondition(t, flt, e2e.FleetReadyCount(3)) + }) + } +}