Skip to content

Commit 6dbf59c

Browse files
committed
FleetAutoscaler can be targeted at Non Existent Fleets
This removes some previous restrictions with the FleetAutoscaler, as well as cleaning up a couple of items. - FleetAutoscalers can now have a Fleet target that doesn't exit. - If the target doesn't exist, this will be recorded as a warning event of type `FailedGetFleet`, as it allows a human readable message, as well as give us data on how often this occurs, and it is readable by stat/alerting packages. - FleetAutoscalers can now have their Fleet target edited. This means that FleetAutoscalers can be transitioned from one Fleet to another. This may be useful in scenarios like red-green deployments, or if you wish to temporarily disable an Autoscaler, but not delete it. - `FleetAutoscaler.Status.ScalingLimited` has an added Event, as it allows a human readable message, as well as give us data on how often this occurs, and it is readable by stat/alerting packages. Closes agones-dev#406
1 parent 63cd0a4 commit 6dbf59c

7 files changed

Lines changed: 127 additions & 341 deletions

File tree

install/helm/agones/templates/admissionregistration.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@ webhooks:
8686
- "gameservers"
8787
- "fleets"
8888
- "fleetallocations"
89-
- "fleetautoscalers"
9089
apiVersions:
9190
- "v1alpha1"
9291
operations:

install/yaml/install.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -925,7 +925,6 @@ webhooks:
925925
- "gameservers"
926926
- "fleets"
927927
- "fleetallocations"
928-
- "fleetautoscalers"
929928
apiVersions:
930929
- "v1alpha1"
931930
operations:

pkg/apis/stable/v1alpha1/fleetautoscaler.go

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -114,29 +114,16 @@ type FleetAutoscalerStatus struct {
114114
ScalingLimited bool `json:"scalingLimited"`
115115
}
116116

117-
// ValidateUpdate validates when an update occurs
118-
func (fas *FleetAutoscaler) ValidateUpdate(new *FleetAutoscaler, causes []metav1.StatusCause) []metav1.StatusCause {
119-
if fas.Spec.FleetName != new.Spec.FleetName {
120-
causes = append(causes, metav1.StatusCause{
121-
Type: metav1.CauseTypeFieldValueInvalid,
122-
Field: "fleetName",
123-
Message: "fleetName cannot be updated",
124-
})
125-
}
126-
127-
return new.ValidateAutoScalingSettings(causes)
128-
}
129-
130-
// ValidateAutoScalingSettings validates the FleetAutoscaler scaling settings
131-
func (fas *FleetAutoscaler) ValidateAutoScalingSettings(causes []metav1.StatusCause) []metav1.StatusCause {
117+
// Validate validates the FleetAutoscaler scaling settings
118+
func (fas *FleetAutoscaler) Validate(causes []metav1.StatusCause) []metav1.StatusCause {
132119
if fas.Spec.Policy.Type == BufferPolicyType {
133-
causes = fas.Spec.Policy.Buffer.ValidateAutoScalingBufferPolicy(causes)
120+
causes = fas.Spec.Policy.Buffer.ValidateBufferPolicy(causes)
134121
}
135122
return causes
136123
}
137124

138-
// ValidateAutoScalingBufferPolicy validates the FleetAutoscaler Buffer policy settings
139-
func (b *BufferPolicy) ValidateAutoScalingBufferPolicy(causes []metav1.StatusCause) []metav1.StatusCause {
125+
// ValidateBufferPolicy validates the FleetAutoscaler Buffer policy settings
126+
func (b *BufferPolicy) ValidateBufferPolicy(causes []metav1.StatusCause) []metav1.StatusCause {
140127
if b == nil {
141128
return append(causes, metav1.StatusCause{
142129
Type: metav1.CauseTypeFieldValueInvalid,

pkg/apis/stable/v1alpha1/fleetautoscaler_test.go

Lines changed: 36 additions & 152 deletions
Original file line numberDiff line numberDiff line change
@@ -25,209 +25,93 @@ import (
2525
func TestFleetAutoscalerValidateUpdate(t *testing.T) {
2626
t.Parallel()
2727

28-
t.Run("same fleet name", func(t *testing.T) {
29-
30-
fas := &FleetAutoscaler{
31-
ObjectMeta: metav1.ObjectMeta{Name: "test"},
32-
Spec: FleetAutoscalerSpec{
33-
FleetName: "testing",
34-
Policy: FleetAutoscalerPolicy{
35-
Type: BufferPolicyType,
36-
Buffer: &BufferPolicy{
37-
BufferSize: intstr.FromInt(1),
38-
MaxReplicas: 10,
39-
},
40-
},
41-
},
42-
}
43-
44-
causes := fas.ValidateUpdate(fas.DeepCopy(), nil)
45-
assert.Len(t, causes, 0)
46-
})
47-
48-
t.Run("different fleet name", func(t *testing.T) {
49-
50-
fas := &FleetAutoscaler{
51-
ObjectMeta: metav1.ObjectMeta{Name: "test"},
52-
Spec: FleetAutoscalerSpec{
53-
FleetName: "testing",
54-
Policy: FleetAutoscalerPolicy{
55-
Type: BufferPolicyType,
56-
Buffer: &BufferPolicy{
57-
BufferSize: intstr.FromInt(1),
58-
MaxReplicas: 10,
59-
},
60-
},
61-
},
62-
}
63-
fasCopy := fas.DeepCopy()
64-
fasCopy.Spec.FleetName = "notthesame"
65-
66-
causes := fas.ValidateUpdate(fasCopy, nil)
67-
68-
assert.Len(t, causes, 1)
69-
assert.Equal(t, "fleetName", causes[0].Field)
70-
})
71-
7228
t.Run("bad buffer size", func(t *testing.T) {
73-
74-
fas := &FleetAutoscaler{
75-
ObjectMeta: metav1.ObjectMeta{Name: "test"},
76-
Spec: FleetAutoscalerSpec{
77-
FleetName: "testing",
78-
Policy: FleetAutoscalerPolicy{
79-
Type: BufferPolicyType,
80-
Buffer: &BufferPolicy{
81-
BufferSize: intstr.FromInt(1),
82-
MaxReplicas: 10,
83-
},
84-
},
85-
},
86-
}
87-
88-
fasCopy := fas.DeepCopy()
89-
fasCopy.Spec.Policy.Buffer.BufferSize = intstr.FromInt(0)
90-
91-
causes := fas.ValidateUpdate(fasCopy, nil)
29+
fas := defaultFixture()
30+
fas.Spec.Policy.Buffer.BufferSize = intstr.FromInt(0)
31+
causes := fas.Validate(nil)
9232

9333
assert.Len(t, causes, 1)
9434
assert.Equal(t, "bufferSize", causes[0].Field)
9535
})
9636

9737
t.Run("bad min replicas", func(t *testing.T) {
9838

99-
fas := &FleetAutoscaler{
100-
ObjectMeta: metav1.ObjectMeta{Name: "test"},
101-
Spec: FleetAutoscalerSpec{
102-
FleetName: "testing",
103-
Policy: FleetAutoscalerPolicy{
104-
Type: BufferPolicyType,
105-
Buffer: &BufferPolicy{
106-
BufferSize: intstr.FromInt(5),
107-
MaxReplicas: 10,
108-
},
109-
},
110-
},
111-
}
112-
113-
fasCopy := fas.DeepCopy()
114-
fasCopy.Spec.Policy.Buffer.MinReplicas = 2
39+
fas := defaultFixture()
40+
fas.Spec.Policy.Buffer.MinReplicas = 2
11541

116-
causes := fas.ValidateUpdate(fasCopy, nil)
42+
causes := fas.Validate(nil)
11743

11844
assert.Len(t, causes, 1)
11945
assert.Equal(t, "minReplicas", causes[0].Field)
12046
})
12147

12248
t.Run("bad max replicas", func(t *testing.T) {
123-
124-
fas := &FleetAutoscaler{
125-
ObjectMeta: metav1.ObjectMeta{Name: "test"},
126-
Spec: FleetAutoscalerSpec{
127-
FleetName: "testing",
128-
Policy: FleetAutoscalerPolicy{
129-
Type: BufferPolicyType,
130-
Buffer: &BufferPolicy{
131-
BufferSize: intstr.FromInt(5),
132-
MaxReplicas: 10,
133-
},
134-
},
135-
},
136-
}
137-
138-
fasCopy := fas.DeepCopy()
139-
fasCopy.Spec.Policy.Buffer.MaxReplicas = 2
140-
causes := fas.ValidateUpdate(fasCopy, nil)
49+
fas := defaultFixture()
50+
fas.Spec.Policy.Buffer.MaxReplicas = 2
51+
causes := fas.Validate(nil)
14152

14253
assert.Len(t, causes, 1)
14354
assert.Equal(t, "maxReplicas", causes[0].Field)
14455
})
14556

14657
t.Run("minReplicas > maxReplicas", func(t *testing.T) {
147-
148-
fas := &FleetAutoscaler{
149-
ObjectMeta: metav1.ObjectMeta{Name: "test"},
150-
Spec: FleetAutoscalerSpec{
151-
FleetName: "testing",
152-
Policy: FleetAutoscalerPolicy{
153-
Type: BufferPolicyType,
154-
Buffer: &BufferPolicy{
155-
BufferSize: intstr.FromInt(5),
156-
MaxReplicas: 10,
157-
},
158-
},
159-
},
160-
}
161-
162-
fasCopy := fas.DeepCopy()
163-
fasCopy.Spec.Policy.Buffer.MinReplicas = 20
164-
causes := fas.ValidateUpdate(fasCopy, nil)
58+
fas := defaultFixture()
59+
fas.Spec.Policy.Buffer.MinReplicas = 20
60+
causes := fas.Validate(nil)
16561

16662
assert.Len(t, causes, 1)
16763
assert.Equal(t, "minReplicas", causes[0].Field)
16864
})
16965

17066
t.Run("bufferSize good percent", func(t *testing.T) {
171-
172-
fas := &FleetAutoscaler{
173-
ObjectMeta: metav1.ObjectMeta{Name: "test"},
174-
Spec: FleetAutoscalerSpec{
175-
FleetName: "testing",
176-
Policy: FleetAutoscalerPolicy{
177-
Type: BufferPolicyType,
178-
Buffer: &BufferPolicy{
179-
BufferSize: intstr.FromInt(5),
180-
MaxReplicas: 10,
181-
},
182-
},
183-
},
184-
}
185-
186-
fasCopy := fas.DeepCopy()
187-
fasCopy.Spec.Policy.Buffer.BufferSize = intstr.FromString("20%")
188-
causes := fas.ValidateUpdate(fasCopy, nil)
67+
fas := defaultFixture()
68+
fas.Spec.Policy.Buffer.BufferSize = intstr.FromString("20%")
69+
causes := fas.Validate(nil)
18970

19071
assert.Len(t, causes, 0)
19172
})
19273

19374
t.Run("bufferSize bad percent", func(t *testing.T) {
194-
195-
fas := &FleetAutoscaler{
196-
ObjectMeta: metav1.ObjectMeta{Name: "test"},
197-
Spec: FleetAutoscalerSpec{
198-
FleetName: "testing",
199-
Policy: FleetAutoscalerPolicy{
200-
Type: BufferPolicyType,
201-
Buffer: &BufferPolicy{
202-
BufferSize: intstr.FromInt(5),
203-
MaxReplicas: 10,
204-
},
205-
},
206-
},
207-
}
75+
fas := defaultFixture()
20876

20977
fasCopy := fas.DeepCopy()
21078
fasCopy.Spec.Policy.Buffer.BufferSize = intstr.FromString("120%")
211-
causes := fas.ValidateUpdate(fasCopy, nil)
79+
causes := fasCopy.Validate(nil)
21280
assert.Len(t, causes, 1)
21381
assert.Equal(t, "bufferSize", causes[0].Field)
21482

21583
fasCopy = fas.DeepCopy()
21684
fasCopy.Spec.Policy.Buffer.BufferSize = intstr.FromString("0%")
217-
causes = fas.ValidateUpdate(fasCopy, nil)
85+
causes = fasCopy.Validate(nil)
21886
assert.Len(t, causes, 1)
21987
assert.Equal(t, "bufferSize", causes[0].Field)
22088

22189
fasCopy = fas.DeepCopy()
22290
fasCopy.Spec.Policy.Buffer.BufferSize = intstr.FromString("-10%")
223-
causes = fas.ValidateUpdate(fasCopy, nil)
91+
causes = fasCopy.Validate(nil)
22492
assert.Len(t, causes, 1)
22593
assert.Equal(t, "bufferSize", causes[0].Field)
22694
fasCopy = fas.DeepCopy()
22795

22896
fasCopy.Spec.Policy.Buffer.BufferSize = intstr.FromString("notgood")
229-
causes = fas.ValidateUpdate(fasCopy, nil)
97+
causes = fasCopy.Validate(nil)
23098
assert.Len(t, causes, 1)
23199
assert.Equal(t, "bufferSize", causes[0].Field)
232100
})
233101
}
102+
103+
func defaultFixture() *FleetAutoscaler {
104+
return &FleetAutoscaler{
105+
ObjectMeta: metav1.ObjectMeta{Name: "test"},
106+
Spec: FleetAutoscalerSpec{
107+
FleetName: "testing",
108+
Policy: FleetAutoscalerPolicy{
109+
Type: BufferPolicyType,
110+
Buffer: &BufferPolicy{
111+
BufferSize: intstr.FromInt(5),
112+
MaxReplicas: 10,
113+
},
114+
},
115+
},
116+
}
117+
}

0 commit comments

Comments
 (0)