Skip to content

Commit 6826a1b

Browse files
authored
Don't validate autoscaling annotations where they're not allowed (#10847)
1 parent b039ea5 commit 6826a1b

8 files changed

+47
-26
lines changed

Diff for: pkg/apis/autoscaling/v1alpha1/metric_validation.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import (
2626

2727
// Validate validates the entire Metric.
2828
func (m *Metric) Validate(ctx context.Context) *apis.FieldError {
29-
return serving.ValidateObjectMetadata(ctx, m.GetObjectMeta()).ViaField("metadata").
29+
return serving.ValidateObjectMetadata(ctx, m.GetObjectMeta(), true).ViaField("metadata").
3030
Also(m.Spec.Validate(apis.WithinSpec(ctx)).ViaField("spec"))
3131
}
3232

Diff for: pkg/apis/autoscaling/v1alpha1/pa_validation.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import (
2626

2727
// Validate implements apis.Validatable interface.
2828
func (pa *PodAutoscaler) Validate(ctx context.Context) *apis.FieldError {
29-
return serving.ValidateObjectMetadata(ctx, pa.GetObjectMeta()).ViaField("metadata").
29+
return serving.ValidateObjectMetadata(ctx, pa.GetObjectMeta(), true).ViaField("metadata").
3030
Also(pa.Spec.Validate(apis.WithinSpec(ctx)).ViaField("spec"))
3131
}
3232

Diff for: pkg/apis/serving/metadata_validation.go

+14-5
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,21 @@ import (
3030
"knative.dev/serving/pkg/apis/config"
3131
)
3232

33-
// ValidateObjectMetadata validates that `metadata` stanza of the
33+
// ValidateObjectMetadata validates that the `metadata` stanza of the
3434
// resources is correct.
35-
func ValidateObjectMetadata(ctx context.Context, meta metav1.Object) *apis.FieldError {
36-
return apis.ValidateObjectMetadata(meta).
37-
Also(autoscaling.ValidateAnnotations(ctx, config.FromContextOrDefaults(ctx).Autoscaler, meta.GetAnnotations()).
38-
ViaField("annotations"))
35+
// If `allowAutoscalingAnnotations` is true autoscaling annotations, if
36+
// present, are validated. If `allowAutoscalingAnnotations` is false
37+
// autoscaling annotations are validated not to be present.
38+
func ValidateObjectMetadata(ctx context.Context, meta metav1.Object, allowAutoscalingAnnotations bool) *apis.FieldError {
39+
errs := apis.ValidateObjectMetadata(meta)
40+
41+
if allowAutoscalingAnnotations {
42+
errs = errs.Also(autoscaling.ValidateAnnotations(ctx, config.FromContextOrDefaults(ctx).Autoscaler, meta.GetAnnotations()).ViaField("annotations"))
43+
} else {
44+
errs = errs.Also(ValidateHasNoAutoscalingAnnotation(meta.GetAnnotations()).ViaField("annotations"))
45+
}
46+
47+
return errs
3948
}
4049

4150
// ValidateRolloutDurationAnnotation validates the rollout duration annotation.

Diff for: pkg/apis/serving/metadata_validation_test.go

+27-12
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,11 @@ import (
3535

3636
func TestValidateObjectMetadata(t *testing.T) {
3737
cases := []struct {
38-
name string
39-
objectMeta metav1.Object
40-
ctx context.Context
41-
expectErr *apis.FieldError
38+
name string
39+
objectMeta metav1.Object
40+
allowAutoscaling bool
41+
ctx context.Context
42+
expectErr *apis.FieldError
4243
}{{
4344
name: "invalid name - dots",
4445
objectMeta: &metav1.ObjectMeta{
@@ -150,8 +151,9 @@ func TestValidateObjectMetadata(t *testing.T) {
150151
},
151152
},
152153
}, {
153-
name: "revision initial scale not parseable",
154-
ctx: config.ToContext(context.Background(), &config.Config{Autoscaler: &autoscalerconfig.Config{AllowZeroInitialScale: true}}),
154+
name: "revision initial scale not parseable",
155+
ctx: config.ToContext(context.Background(), &config.Config{Autoscaler: &autoscalerconfig.Config{AllowZeroInitialScale: true}}),
156+
allowAutoscaling: true,
155157
objectMeta: &metav1.ObjectMeta{
156158
GenerateName: "some-name",
157159
Annotations: map[string]string{
@@ -160,8 +162,9 @@ func TestValidateObjectMetadata(t *testing.T) {
160162
},
161163
expectErr: apis.ErrInvalidValue("invalid", "annotations."+autoscaling.InitialScaleAnnotationKey),
162164
}, {
163-
name: "negative revision initial scale",
164-
ctx: config.ToContext(context.Background(), &config.Config{Autoscaler: &autoscalerconfig.Config{AllowZeroInitialScale: true}}),
165+
name: "negative revision initial scale",
166+
ctx: config.ToContext(context.Background(), &config.Config{Autoscaler: &autoscalerconfig.Config{AllowZeroInitialScale: true}}),
167+
allowAutoscaling: true,
165168
objectMeta: &metav1.ObjectMeta{
166169
GenerateName: "some-name",
167170
Annotations: map[string]string{
@@ -170,31 +173,43 @@ func TestValidateObjectMetadata(t *testing.T) {
170173
},
171174
expectErr: apis.ErrInvalidValue("-2", "annotations."+autoscaling.InitialScaleAnnotationKey),
172175
}, {
173-
name: "cluster allows zero revision initial scale",
174-
ctx: config.ToContext(context.Background(), &config.Config{Autoscaler: &autoscalerconfig.Config{AllowZeroInitialScale: true}}),
176+
name: "cluster allows zero revision initial scale",
177+
ctx: config.ToContext(context.Background(), &config.Config{Autoscaler: &autoscalerconfig.Config{AllowZeroInitialScale: true}}),
178+
allowAutoscaling: true,
175179
objectMeta: &metav1.ObjectMeta{
176180
GenerateName: "some-name",
177181
Annotations: map[string]string{
178182
autoscaling.InitialScaleAnnotationKey: "0",
179183
},
180184
},
181185
}, {
182-
name: "cluster does not allows zero revision initial scale",
186+
name: "cluster does not allow zero revision initial scale",
187+
allowAutoscaling: true,
183188
objectMeta: &metav1.ObjectMeta{
184189
GenerateName: "some-name",
185190
Annotations: map[string]string{
186191
autoscaling.InitialScaleAnnotationKey: "0",
187192
},
188193
},
189194
expectErr: apis.ErrInvalidValue("0", "annotations."+autoscaling.InitialScaleAnnotationKey),
195+
}, {
196+
name: "autoscaling annotations on a resource that doesn't allow them",
197+
allowAutoscaling: false,
198+
objectMeta: &metav1.ObjectMeta{
199+
GenerateName: "some-name",
200+
Annotations: map[string]string{
201+
autoscaling.InitialScaleAnnotationKey: "0",
202+
},
203+
},
204+
expectErr: apis.ErrInvalidKeyName(autoscaling.InitialScaleAnnotationKey, "annotations", `autoscaling annotations must be put under "spec.template.metadata.annotations" to work`),
190205
}}
191206

192207
for _, c := range cases {
193208
t.Run(c.name, func(t *testing.T) {
194209
if c.ctx == nil {
195210
c.ctx = config.ToContext(context.Background(), &config.Config{Autoscaler: &autoscalerconfig.Config{AllowZeroInitialScale: false}})
196211
}
197-
err := ValidateObjectMetadata(c.ctx, c.objectMeta)
212+
err := ValidateObjectMetadata(c.ctx, c.objectMeta, c.allowAutoscaling)
198213
if got, want := err.Error(), c.expectErr.Error(); got != want {
199214
t.Errorf("\nGot: %q\nwant: %q", got, want)
200215
}

Diff for: pkg/apis/serving/v1/configuration_validation.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,8 @@ func (c *Configuration) Validate(ctx context.Context) (errs *apis.FieldError) {
3131
// have changed (i.e. due to config-defaults changes), we elide the metadata and
3232
// spec validation.
3333
if !apis.IsInStatusUpdate(ctx) {
34-
errs = errs.Also(serving.ValidateObjectMetadata(ctx, c.GetObjectMeta()))
34+
errs = errs.Also(serving.ValidateObjectMetadata(ctx, c.GetObjectMeta(), false))
3535
errs = errs.Also(c.validateLabels().ViaField("labels"))
36-
errs = errs.Also(serving.ValidateHasNoAutoscalingAnnotation(c.GetAnnotations()).ViaField("annotations"))
3736
errs = errs.ViaField("metadata")
3837

3938
ctx = apis.WithinParent(ctx, c.ObjectMeta)

Diff for: pkg/apis/serving/v1/revision_validation.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import (
3232

3333
// Validate ensures Revision is properly configured.
3434
func (r *Revision) Validate(ctx context.Context) *apis.FieldError {
35-
errs := serving.ValidateObjectMetadata(ctx, r.GetObjectMeta()).Also(
35+
errs := serving.ValidateObjectMetadata(ctx, r.GetObjectMeta(), true).Also(
3636
r.ValidateLabels().ViaField("labels")).ViaField("metadata")
3737
errs = errs.Also(r.Status.Validate(apis.WithinStatus(ctx)).ViaField("status"))
3838

Diff for: pkg/apis/serving/v1/route_validation.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import (
2828

2929
// Validate makes sure that Route is properly configured.
3030
func (r *Route) Validate(ctx context.Context) *apis.FieldError {
31-
errs := serving.ValidateObjectMetadata(ctx, r.GetObjectMeta()).Also(
31+
errs := serving.ValidateObjectMetadata(ctx, r.GetObjectMeta(), false).Also(
3232
r.validateLabels().ViaField("labels"))
3333
errs = errs.Also(serving.ValidateRolloutDurationAnnotation(
3434
r.GetAnnotations()).ViaField("annotations"))

Diff for: pkg/apis/serving/v1/service_validation.go

+1-3
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,10 @@ func (s *Service) Validate(ctx context.Context) (errs *apis.FieldError) {
3131
// have changed (i.e. due to config-defaults changes), we elide the metadata and
3232
// spec validation.
3333
if !apis.IsInStatusUpdate(ctx) {
34-
errs = errs.Also(serving.ValidateObjectMetadata(ctx, s.GetObjectMeta()))
34+
errs = errs.Also(serving.ValidateObjectMetadata(ctx, s.GetObjectMeta(), false))
3535
errs = errs.Also(s.validateLabels().ViaField("labels"))
3636
errs = errs.Also(serving.ValidateRolloutDurationAnnotation(
3737
s.GetAnnotations()).ViaField("annotations"))
38-
errs = errs.Also(serving.ValidateHasNoAutoscalingAnnotation(
39-
s.GetAnnotations()).ViaField("annotations"))
4038
errs = errs.ViaField("metadata")
4139

4240
ctx = apis.WithinParent(ctx, s.ObjectMeta)

0 commit comments

Comments
 (0)