Skip to content

Commit 716344f

Browse files
authored
Merge pull request kubernetes#76849 from liggitt/crd_webhook_integration_tests
Fix scale and rollback subresources with admission webhooks, add integration tests
2 parents dc39539 + 69042da commit 716344f

File tree

20 files changed

+1353
-83
lines changed

20 files changed

+1353
-83
lines changed

pkg/registry/apps/deployment/storage/storage.go

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -158,24 +158,27 @@ func (r *RollbackREST) New() runtime.Object {
158158
return &apps.DeploymentRollback{}
159159
}
160160

161-
var _ = rest.Creater(&RollbackREST{})
161+
var _ = rest.NamedCreater(&RollbackREST{})
162162

163-
func (r *RollbackREST) Create(ctx context.Context, obj runtime.Object, createValidation rest.ValidateObjectFunc, options *metav1.CreateOptions) (runtime.Object, error) {
163+
func (r *RollbackREST) Create(ctx context.Context, name string, obj runtime.Object, createValidation rest.ValidateObjectFunc, options *metav1.CreateOptions) (runtime.Object, error) {
164164
rollback, ok := obj.(*apps.DeploymentRollback)
165165
if !ok {
166166
return nil, errors.NewBadRequest(fmt.Sprintf("not a DeploymentRollback: %#v", obj))
167167
}
168168

169+
if errs := appsvalidation.ValidateDeploymentRollback(rollback); len(errs) != 0 {
170+
return nil, errors.NewInvalid(apps.Kind("DeploymentRollback"), rollback.Name, errs)
171+
}
172+
if name != rollback.Name {
173+
return nil, errors.NewBadRequest("name in URL does not match name in DeploymentRollback object")
174+
}
175+
169176
if createValidation != nil {
170177
if err := createValidation(obj.DeepCopyObject()); err != nil {
171178
return nil, err
172179
}
173180
}
174181

175-
if errs := appsvalidation.ValidateDeploymentRollback(rollback); len(errs) != 0 {
176-
return nil, errors.NewInvalid(apps.Kind("DeploymentRollback"), rollback.Name, errs)
177-
}
178-
179182
// Update the Deployment with information in DeploymentRollback to trigger rollback
180183
err := r.rollbackDeployment(ctx, rollback.Name, &rollback.RollbackTo, rollback.UpdatedAnnotations, dryrun.IsDryRun(options.DryRun))
181184
if err != nil {
@@ -293,7 +296,15 @@ func (r *ScaleREST) Update(ctx context.Context, name string, objInfo rest.Update
293296

294297
deployment.Spec.Replicas = scale.Spec.Replicas
295298
deployment.ResourceVersion = scale.ResourceVersion
296-
obj, _, err = r.store.Update(ctx, deployment.Name, rest.DefaultUpdatedObjectInfo(deployment), createValidation, updateValidation, false, options)
299+
obj, _, err = r.store.Update(
300+
ctx,
301+
deployment.Name,
302+
rest.DefaultUpdatedObjectInfo(deployment),
303+
toScaleCreateValidation(createValidation),
304+
toScaleUpdateValidation(updateValidation),
305+
false,
306+
options,
307+
)
297308
if err != nil {
298309
return nil, false, err
299310
}
@@ -305,6 +316,30 @@ func (r *ScaleREST) Update(ctx context.Context, name string, objInfo rest.Update
305316
return newScale, false, nil
306317
}
307318

319+
func toScaleCreateValidation(f rest.ValidateObjectFunc) rest.ValidateObjectFunc {
320+
return func(obj runtime.Object) error {
321+
scale, err := scaleFromDeployment(obj.(*apps.Deployment))
322+
if err != nil {
323+
return err
324+
}
325+
return f(scale)
326+
}
327+
}
328+
329+
func toScaleUpdateValidation(f rest.ValidateObjectUpdateFunc) rest.ValidateObjectUpdateFunc {
330+
return func(obj, old runtime.Object) error {
331+
newScale, err := scaleFromDeployment(obj.(*apps.Deployment))
332+
if err != nil {
333+
return err
334+
}
335+
oldScale, err := scaleFromDeployment(old.(*apps.Deployment))
336+
if err != nil {
337+
return err
338+
}
339+
return f(newScale, oldScale)
340+
}
341+
}
342+
308343
// scaleFromDeployment returns a scale subresource for a deployment.
309344
func scaleFromDeployment(deployment *apps.Deployment) (*autoscaling.Scale, error) {
310345
selector, err := metav1.LabelSelectorAsSelector(deployment.Spec.Selector)

pkg/registry/apps/deployment/storage/storage_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@ func TestEtcdCreateDeploymentRollback(t *testing.T) {
351351
if _, err := storage.Deployment.Create(ctx, validNewDeployment(), rest.ValidateAllObjectFunc, &metav1.CreateOptions{}); err != nil {
352352
t.Fatalf("%s: unexpected error: %v", k, err)
353353
}
354-
rollbackRespStatus, err := rollbackStorage.Create(ctx, &test.rollback, rest.ValidateAllObjectFunc, &metav1.CreateOptions{})
354+
rollbackRespStatus, err := rollbackStorage.Create(ctx, test.rollback.Name, &test.rollback, rest.ValidateAllObjectFunc, &metav1.CreateOptions{})
355355
if !test.errOK(err) {
356356
t.Errorf("%s: unexpected error: %v", k, err)
357357
} else if err == nil {
@@ -392,7 +392,7 @@ func TestCreateDeploymentRollbackValidation(t *testing.T) {
392392

393393
validationError := fmt.Errorf("admission deny")
394394
alwaysDenyValidationFunc := func(obj runtime.Object) error { return validationError }
395-
_, err := rollbackStorage.Create(ctx, &rollback, alwaysDenyValidationFunc, &metav1.CreateOptions{})
395+
_, err := rollbackStorage.Create(ctx, rollback.Name, &rollback, alwaysDenyValidationFunc, &metav1.CreateOptions{})
396396

397397
if err == nil || validationError != err {
398398
t.Errorf("expected: %v, got: %v", validationError, err)
@@ -411,7 +411,7 @@ func TestEtcdCreateDeploymentRollbackNoDeployment(t *testing.T) {
411411
rollbackStorage := storage.Rollback
412412
ctx := genericapirequest.WithNamespace(genericapirequest.NewContext(), namespace)
413413

414-
_, err := rollbackStorage.Create(ctx, &apps.DeploymentRollback{
414+
_, err := rollbackStorage.Create(ctx, name, &apps.DeploymentRollback{
415415
Name: name,
416416
UpdatedAnnotations: map[string]string{},
417417
RollbackTo: apps.RollbackConfig{Revision: 1},

pkg/registry/apps/replicaset/storage/storage.go

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,15 @@ func (r *ScaleREST) Update(ctx context.Context, name string, objInfo rest.Update
201201

202202
rs.Spec.Replicas = scale.Spec.Replicas
203203
rs.ResourceVersion = scale.ResourceVersion
204-
obj, _, err = r.store.Update(ctx, rs.Name, rest.DefaultUpdatedObjectInfo(rs), createValidation, updateValidation, false, options)
204+
obj, _, err = r.store.Update(
205+
ctx,
206+
rs.Name,
207+
rest.DefaultUpdatedObjectInfo(rs),
208+
toScaleCreateValidation(createValidation),
209+
toScaleUpdateValidation(updateValidation),
210+
false,
211+
options,
212+
)
205213
if err != nil {
206214
return nil, false, err
207215
}
@@ -213,6 +221,30 @@ func (r *ScaleREST) Update(ctx context.Context, name string, objInfo rest.Update
213221
return newScale, false, err
214222
}
215223

224+
func toScaleCreateValidation(f rest.ValidateObjectFunc) rest.ValidateObjectFunc {
225+
return func(obj runtime.Object) error {
226+
scale, err := scaleFromReplicaSet(obj.(*apps.ReplicaSet))
227+
if err != nil {
228+
return err
229+
}
230+
return f(scale)
231+
}
232+
}
233+
234+
func toScaleUpdateValidation(f rest.ValidateObjectUpdateFunc) rest.ValidateObjectUpdateFunc {
235+
return func(obj, old runtime.Object) error {
236+
newScale, err := scaleFromReplicaSet(obj.(*apps.ReplicaSet))
237+
if err != nil {
238+
return err
239+
}
240+
oldScale, err := scaleFromReplicaSet(old.(*apps.ReplicaSet))
241+
if err != nil {
242+
return err
243+
}
244+
return f(newScale, oldScale)
245+
}
246+
}
247+
216248
// scaleFromReplicaSet returns a scale subresource for a replica set.
217249
func scaleFromReplicaSet(rs *apps.ReplicaSet) (*autoscaling.Scale, error) {
218250
selector, err := metav1.LabelSelectorAsSelector(rs.Spec.Selector)

pkg/registry/apps/statefulset/storage/storage.go

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,15 @@ func (r *ScaleREST) Update(ctx context.Context, name string, objInfo rest.Update
188188

189189
ss.Spec.Replicas = scale.Spec.Replicas
190190
ss.ResourceVersion = scale.ResourceVersion
191-
obj, _, err = r.store.Update(ctx, ss.Name, rest.DefaultUpdatedObjectInfo(ss), createValidation, updateValidation, false, options)
191+
obj, _, err = r.store.Update(
192+
ctx,
193+
ss.Name,
194+
rest.DefaultUpdatedObjectInfo(ss),
195+
toScaleCreateValidation(createValidation),
196+
toScaleUpdateValidation(updateValidation),
197+
false,
198+
options,
199+
)
192200
if err != nil {
193201
return nil, false, err
194202
}
@@ -200,6 +208,30 @@ func (r *ScaleREST) Update(ctx context.Context, name string, objInfo rest.Update
200208
return newScale, false, err
201209
}
202210

211+
func toScaleCreateValidation(f rest.ValidateObjectFunc) rest.ValidateObjectFunc {
212+
return func(obj runtime.Object) error {
213+
scale, err := scaleFromStatefulSet(obj.(*apps.StatefulSet))
214+
if err != nil {
215+
return err
216+
}
217+
return f(scale)
218+
}
219+
}
220+
221+
func toScaleUpdateValidation(f rest.ValidateObjectUpdateFunc) rest.ValidateObjectUpdateFunc {
222+
return func(obj, old runtime.Object) error {
223+
newScale, err := scaleFromStatefulSet(obj.(*apps.StatefulSet))
224+
if err != nil {
225+
return err
226+
}
227+
oldScale, err := scaleFromStatefulSet(old.(*apps.StatefulSet))
228+
if err != nil {
229+
return err
230+
}
231+
return f(newScale, oldScale)
232+
}
233+
}
234+
203235
// scaleFromStatefulSet returns a scale subresource for a statefulset.
204236
func scaleFromStatefulSet(ss *apps.StatefulSet) (*autoscaling.Scale, error) {
205237
selector, err := metav1.LabelSelectorAsSelector(ss.Spec.Selector)

pkg/registry/core/replicationcontroller/storage/storage.go

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,14 +183,37 @@ func (r *ScaleREST) Update(ctx context.Context, name string, objInfo rest.Update
183183

184184
rc.Spec.Replicas = scale.Spec.Replicas
185185
rc.ResourceVersion = scale.ResourceVersion
186-
obj, _, err = r.store.Update(ctx, rc.Name, rest.DefaultUpdatedObjectInfo(rc), createValidation, updateValidation, false, options)
186+
obj, _, err = r.store.Update(
187+
ctx,
188+
rc.Name,
189+
rest.DefaultUpdatedObjectInfo(rc),
190+
toScaleCreateValidation(createValidation),
191+
toScaleUpdateValidation(updateValidation),
192+
false,
193+
options,
194+
)
187195
if err != nil {
188196
return nil, false, err
189197
}
190198
rc = obj.(*api.ReplicationController)
191199
return scaleFromRC(rc), false, nil
192200
}
193201

202+
func toScaleCreateValidation(f rest.ValidateObjectFunc) rest.ValidateObjectFunc {
203+
return func(obj runtime.Object) error {
204+
return f(scaleFromRC(obj.(*api.ReplicationController)))
205+
}
206+
}
207+
208+
func toScaleUpdateValidation(f rest.ValidateObjectUpdateFunc) rest.ValidateObjectUpdateFunc {
209+
return func(obj, old runtime.Object) error {
210+
return f(
211+
scaleFromRC(obj.(*api.ReplicationController)),
212+
scaleFromRC(old.(*api.ReplicationController)),
213+
)
214+
}
215+
}
216+
194217
// scaleFromRC returns a scale subresource for a replication controller.
195218
func scaleFromRC(rc *api.ReplicationController) *autoscaling.Scale {
196219
return &autoscaling.Scale{

pkg/registry/extensions/controller/storage/storage.go

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,14 +95,37 @@ func (r *ScaleREST) Update(ctx context.Context, name string, objInfo rest.Update
9595

9696
rc.Spec.Replicas = scale.Spec.Replicas
9797
rc.ResourceVersion = scale.ResourceVersion
98-
obj, _, err = r.store.Update(ctx, rc.Name, rest.DefaultUpdatedObjectInfo(rc), createValidation, updateValidation, false, options)
98+
obj, _, err = r.store.Update(
99+
ctx,
100+
rc.Name,
101+
rest.DefaultUpdatedObjectInfo(rc),
102+
toScaleCreateValidation(createValidation),
103+
toScaleUpdateValidation(updateValidation),
104+
false,
105+
options,
106+
)
99107
if err != nil {
100108
return nil, false, errors.NewConflict(extensions.Resource("replicationcontrollers/scale"), scale.Name, err)
101109
}
102110
rc = obj.(*api.ReplicationController)
103111
return scaleFromRC(rc), false, nil
104112
}
105113

114+
func toScaleCreateValidation(f rest.ValidateObjectFunc) rest.ValidateObjectFunc {
115+
return func(obj runtime.Object) error {
116+
return f(scaleFromRC(obj.(*api.ReplicationController)))
117+
}
118+
}
119+
120+
func toScaleUpdateValidation(f rest.ValidateObjectUpdateFunc) rest.ValidateObjectUpdateFunc {
121+
return func(obj, old runtime.Object) error {
122+
return f(
123+
scaleFromRC(obj.(*api.ReplicationController)),
124+
scaleFromRC(old.(*api.ReplicationController)),
125+
)
126+
}
127+
}
128+
106129
// scaleFromRC returns a scale subresource for a replication controller.
107130
func scaleFromRC(rc *api.ReplicationController) *autoscaling.Scale {
108131
return &autoscaling.Scale{

pkg/registry/rbac/rest/storage_rbac.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -190,9 +190,9 @@ func (p *PolicyData) EnsureRBACPolicy() genericapiserver.PostStartHookFunc {
190190
case result.Protected && result.Operation != reconciliation.ReconcileNone:
191191
klog.Warningf("skipped reconcile-protected clusterrole.%s/%s with missing permissions: %v", rbac.GroupName, clusterRole.Name, result.MissingRules)
192192
case result.Operation == reconciliation.ReconcileUpdate:
193-
klog.Infof("updated clusterrole.%s/%s with additional permissions: %v", rbac.GroupName, clusterRole.Name, result.MissingRules)
193+
klog.V(2).Infof("updated clusterrole.%s/%s with additional permissions: %v", rbac.GroupName, clusterRole.Name, result.MissingRules)
194194
case result.Operation == reconciliation.ReconcileCreate:
195-
klog.Infof("created clusterrole.%s/%s", rbac.GroupName, clusterRole.Name)
195+
klog.V(2).Infof("created clusterrole.%s/%s", rbac.GroupName, clusterRole.Name)
196196
}
197197
return nil
198198
})
@@ -218,11 +218,11 @@ func (p *PolicyData) EnsureRBACPolicy() genericapiserver.PostStartHookFunc {
218218
case result.Protected && result.Operation != reconciliation.ReconcileNone:
219219
klog.Warningf("skipped reconcile-protected clusterrolebinding.%s/%s with missing subjects: %v", rbac.GroupName, clusterRoleBinding.Name, result.MissingSubjects)
220220
case result.Operation == reconciliation.ReconcileUpdate:
221-
klog.Infof("updated clusterrolebinding.%s/%s with additional subjects: %v", rbac.GroupName, clusterRoleBinding.Name, result.MissingSubjects)
221+
klog.V(2).Infof("updated clusterrolebinding.%s/%s with additional subjects: %v", rbac.GroupName, clusterRoleBinding.Name, result.MissingSubjects)
222222
case result.Operation == reconciliation.ReconcileCreate:
223-
klog.Infof("created clusterrolebinding.%s/%s", rbac.GroupName, clusterRoleBinding.Name)
223+
klog.V(2).Infof("created clusterrolebinding.%s/%s", rbac.GroupName, clusterRoleBinding.Name)
224224
case result.Operation == reconciliation.ReconcileRecreate:
225-
klog.Infof("recreated clusterrolebinding.%s/%s", rbac.GroupName, clusterRoleBinding.Name)
225+
klog.V(2).Infof("recreated clusterrolebinding.%s/%s", rbac.GroupName, clusterRoleBinding.Name)
226226
}
227227
return nil
228228
})
@@ -249,9 +249,9 @@ func (p *PolicyData) EnsureRBACPolicy() genericapiserver.PostStartHookFunc {
249249
case result.Protected && result.Operation != reconciliation.ReconcileNone:
250250
klog.Warningf("skipped reconcile-protected role.%s/%s in %v with missing permissions: %v", rbac.GroupName, role.Name, namespace, result.MissingRules)
251251
case result.Operation == reconciliation.ReconcileUpdate:
252-
klog.Infof("updated role.%s/%s in %v with additional permissions: %v", rbac.GroupName, role.Name, namespace, result.MissingRules)
252+
klog.V(2).Infof("updated role.%s/%s in %v with additional permissions: %v", rbac.GroupName, role.Name, namespace, result.MissingRules)
253253
case result.Operation == reconciliation.ReconcileCreate:
254-
klog.Infof("created role.%s/%s in %v", rbac.GroupName, role.Name, namespace)
254+
klog.V(2).Infof("created role.%s/%s in %v", rbac.GroupName, role.Name, namespace)
255255
}
256256
return nil
257257
})
@@ -279,11 +279,11 @@ func (p *PolicyData) EnsureRBACPolicy() genericapiserver.PostStartHookFunc {
279279
case result.Protected && result.Operation != reconciliation.ReconcileNone:
280280
klog.Warningf("skipped reconcile-protected rolebinding.%s/%s in %v with missing subjects: %v", rbac.GroupName, roleBinding.Name, namespace, result.MissingSubjects)
281281
case result.Operation == reconciliation.ReconcileUpdate:
282-
klog.Infof("updated rolebinding.%s/%s in %v with additional subjects: %v", rbac.GroupName, roleBinding.Name, namespace, result.MissingSubjects)
282+
klog.V(2).Infof("updated rolebinding.%s/%s in %v with additional subjects: %v", rbac.GroupName, roleBinding.Name, namespace, result.MissingSubjects)
283283
case result.Operation == reconciliation.ReconcileCreate:
284-
klog.Infof("created rolebinding.%s/%s in %v", rbac.GroupName, roleBinding.Name, namespace)
284+
klog.V(2).Infof("created rolebinding.%s/%s in %v", rbac.GroupName, roleBinding.Name, namespace)
285285
case result.Operation == reconciliation.ReconcileRecreate:
286-
klog.Infof("recreated rolebinding.%s/%s in %v", rbac.GroupName, roleBinding.Name, namespace)
286+
klog.V(2).Infof("recreated rolebinding.%s/%s in %v", rbac.GroupName, roleBinding.Name, namespace)
287287
}
288288
return nil
289289
})

staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion/BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ go_library(
1212
importpath = "k8s.io/apiextensions-apiserver/pkg/apiserver/conversion",
1313
visibility = ["//visibility:public"],
1414
deps = [
15+
"//staging/src/k8s.io/api/autoscaling/v1:go_default_library",
1516
"//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library",
1617
"//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library",
1718
"//staging/src/k8s.io/apiextensions-apiserver/pkg/features:go_default_library",
@@ -22,6 +23,7 @@ go_library(
2223
"//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library",
2324
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
2425
"//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library",
26+
"//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library",
2527
"//staging/src/k8s.io/client-go/rest:go_default_library",
2628
"//vendor/github.com/prometheus/client_golang/prometheus:go_default_library",
2729
],

0 commit comments

Comments
 (0)