check pod name with that in binding object

This commit is contained in:
Di Xu 2019-06-30 20:18:22 +08:00
parent 34cab8f80a
commit 5ed1b8fa29
2 changed files with 32 additions and 12 deletions

View File

@ -148,11 +148,18 @@ func (r *BindingREST) New() runtime.Object {
return &api.Binding{} return &api.Binding{}
} }
var _ = rest.Creater(&BindingREST{}) var _ = rest.NamedCreater(&BindingREST{})
// Create ensures a pod is bound to a specific host. // Create ensures a pod is bound to a specific host.
func (r *BindingREST) Create(ctx context.Context, obj runtime.Object, createValidation rest.ValidateObjectFunc, options *metav1.CreateOptions) (out runtime.Object, err error) { func (r *BindingREST) Create(ctx context.Context, name string, obj runtime.Object, createValidation rest.ValidateObjectFunc, options *metav1.CreateOptions) (out runtime.Object, err error) {
binding := obj.(*api.Binding) binding, ok := obj.(*api.Binding)
if !ok {
return nil, errors.NewBadRequest(fmt.Sprintf("not a Binding object: %#v", obj))
}
if name != binding.Name {
return nil, errors.NewBadRequest("name in URL does not match name in Binding object")
}
// TODO: move me to a binding strategy // TODO: move me to a binding strategy
if errs := validation.ValidatePodBinding(binding); len(errs) != 0 { if errs := validation.ValidatePodBinding(binding); len(errs) != 0 {

View File

@ -587,7 +587,7 @@ func TestEtcdCreate(t *testing.T) {
} }
// Suddenly, a wild scheduler appears: // Suddenly, a wild scheduler appears:
_, err = bindingStorage.Create(ctx, &api.Binding{ _, err = bindingStorage.Create(ctx, "foo", &api.Binding{
ObjectMeta: metav1.ObjectMeta{Namespace: metav1.NamespaceDefault, Name: "foo"}, ObjectMeta: metav1.ObjectMeta{Namespace: metav1.NamespaceDefault, Name: "foo"},
Target: api.ObjectReference{Name: "machine"}, Target: api.ObjectReference{Name: "machine"},
}, rest.ValidateAllObjectFunc, &metav1.CreateOptions{}) }, rest.ValidateAllObjectFunc, &metav1.CreateOptions{})
@ -613,7 +613,7 @@ func TestEtcdCreateBindingNoPod(t *testing.T) {
// - Create (apiserver) // - Create (apiserver)
// - Schedule (scheduler) // - Schedule (scheduler)
// - Delete (apiserver) // - Delete (apiserver)
_, err := bindingStorage.Create(ctx, &api.Binding{ _, err := bindingStorage.Create(ctx, "foo", &api.Binding{
ObjectMeta: metav1.ObjectMeta{Namespace: metav1.NamespaceDefault, Name: "foo"}, ObjectMeta: metav1.ObjectMeta{Namespace: metav1.NamespaceDefault, Name: "foo"},
Target: api.ObjectReference{Name: "machine"}, Target: api.ObjectReference{Name: "machine"},
}, rest.ValidateAllObjectFunc, &metav1.CreateOptions{}) }, rest.ValidateAllObjectFunc, &metav1.CreateOptions{})
@ -657,7 +657,7 @@ func TestEtcdCreateWithContainersNotFound(t *testing.T) {
} }
// Suddenly, a wild scheduler appears: // Suddenly, a wild scheduler appears:
_, err = bindingStorage.Create(ctx, &api.Binding{ _, err = bindingStorage.Create(ctx, "foo", &api.Binding{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Namespace: metav1.NamespaceDefault, Namespace: metav1.NamespaceDefault,
Name: "foo", Name: "foo",
@ -700,12 +700,12 @@ func TestEtcdCreateWithConflict(t *testing.T) {
}, },
Target: api.ObjectReference{Name: "machine"}, Target: api.ObjectReference{Name: "machine"},
} }
_, err = bindingStorage.Create(ctx, &binding, rest.ValidateAllObjectFunc, &metav1.CreateOptions{}) _, err = bindingStorage.Create(ctx, binding.Name, &binding, rest.ValidateAllObjectFunc, &metav1.CreateOptions{})
if err != nil { if err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
_, err = bindingStorage.Create(ctx, &binding, rest.ValidateAllObjectFunc, &metav1.CreateOptions{}) _, err = bindingStorage.Create(ctx, binding.Name, &binding, rest.ValidateAllObjectFunc, &metav1.CreateOptions{})
if err == nil || !errors.IsConflict(err) { if err == nil || !errors.IsConflict(err) {
t.Fatalf("expected resource conflict error, not: %v", err) t.Fatalf("expected resource conflict error, not: %v", err)
} }
@ -722,7 +722,7 @@ func TestEtcdCreateWithExistingContainers(t *testing.T) {
} }
// Suddenly, a wild scheduler appears: // Suddenly, a wild scheduler appears:
_, err = bindingStorage.Create(ctx, &api.Binding{ _, err = bindingStorage.Create(ctx, "foo", &api.Binding{
ObjectMeta: metav1.ObjectMeta{Namespace: metav1.NamespaceDefault, Name: "foo"}, ObjectMeta: metav1.ObjectMeta{Namespace: metav1.NamespaceDefault, Name: "foo"},
Target: api.ObjectReference{Name: "machine"}, Target: api.ObjectReference{Name: "machine"},
}, rest.ValidateAllObjectFunc, &metav1.CreateOptions{}) }, rest.ValidateAllObjectFunc, &metav1.CreateOptions{})
@ -740,8 +740,9 @@ func TestEtcdCreateBinding(t *testing.T) {
ctx := genericapirequest.NewDefaultContext() ctx := genericapirequest.NewDefaultContext()
testCases := map[string]struct { testCases := map[string]struct {
binding api.Binding binding api.Binding
errOK func(error) bool badNameInURL bool
errOK func(error) bool
}{ }{
"noName": { "noName": {
binding: api.Binding{ binding: api.Binding{
@ -750,6 +751,14 @@ func TestEtcdCreateBinding(t *testing.T) {
}, },
errOK: func(err error) bool { return err != nil }, errOK: func(err error) bool { return err != nil },
}, },
"badNameInURL": {
binding: api.Binding{
ObjectMeta: metav1.ObjectMeta{Namespace: metav1.NamespaceDefault, Name: "foo"},
Target: api.ObjectReference{},
},
badNameInURL: true,
errOK: func(err error) bool { return err != nil },
},
"badKind": { "badKind": {
binding: api.Binding{ binding: api.Binding{
ObjectMeta: metav1.ObjectMeta{Namespace: metav1.NamespaceDefault, Name: "foo"}, ObjectMeta: metav1.ObjectMeta{Namespace: metav1.NamespaceDefault, Name: "foo"},
@ -778,7 +787,11 @@ func TestEtcdCreateBinding(t *testing.T) {
if _, err := storage.Create(ctx, validNewPod(), rest.ValidateAllObjectFunc, &metav1.CreateOptions{}); err != nil { if _, err := storage.Create(ctx, validNewPod(), rest.ValidateAllObjectFunc, &metav1.CreateOptions{}); err != nil {
t.Fatalf("%s: unexpected error: %v", k, err) t.Fatalf("%s: unexpected error: %v", k, err)
} }
if _, err := bindingStorage.Create(ctx, &test.binding, rest.ValidateAllObjectFunc, &metav1.CreateOptions{}); !test.errOK(err) { name := test.binding.Name
if test.badNameInURL {
name += "badNameInURL"
}
if _, err := bindingStorage.Create(ctx, name, &test.binding, rest.ValidateAllObjectFunc, &metav1.CreateOptions{}); !test.errOK(err) {
t.Errorf("%s: unexpected error: %v", k, err) t.Errorf("%s: unexpected error: %v", k, err)
} else if err == nil { } else if err == nil {
// If bind succeeded, verify Host field in pod's Spec. // If bind succeeded, verify Host field in pod's Spec.