diff --git a/pkg/registry/apps/deployment/storage/storage.go b/pkg/registry/apps/deployment/storage/storage.go index e7875d65cbd..672e50e9560 100644 --- a/pkg/registry/apps/deployment/storage/storage.go +++ b/pkg/registry/apps/deployment/storage/storage.go @@ -158,24 +158,27 @@ func (r *RollbackREST) New() runtime.Object { return &apps.DeploymentRollback{} } -var _ = rest.Creater(&RollbackREST{}) +var _ = rest.NamedCreater(&RollbackREST{}) -func (r *RollbackREST) Create(ctx context.Context, obj runtime.Object, createValidation rest.ValidateObjectFunc, options *metav1.CreateOptions) (runtime.Object, error) { +func (r *RollbackREST) Create(ctx context.Context, name string, obj runtime.Object, createValidation rest.ValidateObjectFunc, options *metav1.CreateOptions) (runtime.Object, error) { rollback, ok := obj.(*apps.DeploymentRollback) if !ok { return nil, errors.NewBadRequest(fmt.Sprintf("not a DeploymentRollback: %#v", obj)) } + if errs := appsvalidation.ValidateDeploymentRollback(rollback); len(errs) != 0 { + return nil, errors.NewInvalid(apps.Kind("DeploymentRollback"), rollback.Name, errs) + } + if name != rollback.Name { + return nil, errors.NewBadRequest("name in URL does not match name in DeploymentRollback object") + } + if createValidation != nil { if err := createValidation(obj.DeepCopyObject()); err != nil { return nil, err } } - if errs := appsvalidation.ValidateDeploymentRollback(rollback); len(errs) != 0 { - return nil, errors.NewInvalid(apps.Kind("DeploymentRollback"), rollback.Name, errs) - } - // Update the Deployment with information in DeploymentRollback to trigger rollback err := r.rollbackDeployment(ctx, rollback.Name, &rollback.RollbackTo, rollback.UpdatedAnnotations, dryrun.IsDryRun(options.DryRun)) if err != nil { diff --git a/pkg/registry/apps/deployment/storage/storage_test.go b/pkg/registry/apps/deployment/storage/storage_test.go index 53f761bc66d..9c77aee1da9 100644 --- a/pkg/registry/apps/deployment/storage/storage_test.go +++ b/pkg/registry/apps/deployment/storage/storage_test.go @@ -351,7 +351,7 @@ func TestEtcdCreateDeploymentRollback(t *testing.T) { if _, err := storage.Deployment.Create(ctx, validNewDeployment(), rest.ValidateAllObjectFunc, &metav1.CreateOptions{}); err != nil { t.Fatalf("%s: unexpected error: %v", k, err) } - rollbackRespStatus, err := rollbackStorage.Create(ctx, &test.rollback, rest.ValidateAllObjectFunc, &metav1.CreateOptions{}) + rollbackRespStatus, err := rollbackStorage.Create(ctx, test.rollback.Name, &test.rollback, rest.ValidateAllObjectFunc, &metav1.CreateOptions{}) if !test.errOK(err) { t.Errorf("%s: unexpected error: %v", k, err) } else if err == nil { @@ -392,7 +392,7 @@ func TestCreateDeploymentRollbackValidation(t *testing.T) { validationError := fmt.Errorf("admission deny") alwaysDenyValidationFunc := func(obj runtime.Object) error { return validationError } - _, err := rollbackStorage.Create(ctx, &rollback, alwaysDenyValidationFunc, &metav1.CreateOptions{}) + _, err := rollbackStorage.Create(ctx, rollback.Name, &rollback, alwaysDenyValidationFunc, &metav1.CreateOptions{}) if err == nil || validationError != err { t.Errorf("expected: %v, got: %v", validationError, err) @@ -411,7 +411,7 @@ func TestEtcdCreateDeploymentRollbackNoDeployment(t *testing.T) { rollbackStorage := storage.Rollback ctx := genericapirequest.WithNamespace(genericapirequest.NewContext(), namespace) - _, err := rollbackStorage.Create(ctx, &apps.DeploymentRollback{ + _, err := rollbackStorage.Create(ctx, name, &apps.DeploymentRollback{ Name: name, UpdatedAnnotations: map[string]string{}, RollbackTo: apps.RollbackConfig{Revision: 1},