diff --git a/pkg/api/validation/validation.go b/pkg/api/validation/validation.go index 1d6905523ff..334f43afb2b 100644 --- a/pkg/api/validation/validation.go +++ b/pkg/api/validation/validation.go @@ -1224,6 +1224,22 @@ func ValidatePodStatusUpdate(newPod, oldPod *api.Pod) field.ErrorList { return allErrs } +// ValidatePodBinding tests if required fields in the pod binding are legal. +func ValidatePodBinding(binding *api.Binding) field.ErrorList { + allErrs := field.ErrorList{} + + if len(binding.Target.Kind) != 0 && binding.Target.Kind != "Node" { + // TODO: When validation becomes versioned, this gets more complicated. + allErrs = append(allErrs, field.NotSupported(field.NewPath("target", "kind"), binding.Target.Kind, []string{"Node", ""})) + } + if len(binding.Target.Name) == 0 { + // TODO: When validation becomes versioned, this gets more complicated. + allErrs = append(allErrs, field.Required(field.NewPath("target", "name"))) + } + + return allErrs +} + // ValidatePodTemplate tests if required fields in the pod template are set. func ValidatePodTemplate(pod *api.PodTemplate) field.ErrorList { allErrs := ValidateObjectMeta(&pod.ObjectMeta, true, ValidatePodName, field.NewPath("metadata")) diff --git a/pkg/registry/pod/etcd/etcd.go b/pkg/registry/pod/etcd/etcd.go index 90e799f870e..93f5e38f870 100644 --- a/pkg/registry/pod/etcd/etcd.go +++ b/pkg/registry/pod/etcd/etcd.go @@ -26,6 +26,7 @@ import ( etcderr "k8s.io/kubernetes/pkg/api/errors/etcd" "k8s.io/kubernetes/pkg/api/rest" "k8s.io/kubernetes/pkg/api/unversioned" + "k8s.io/kubernetes/pkg/api/validation" "k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/kubelet/client" "k8s.io/kubernetes/pkg/labels" @@ -35,7 +36,6 @@ import ( podrest "k8s.io/kubernetes/pkg/registry/pod/rest" "k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/storage" - "k8s.io/kubernetes/pkg/util/validation/field" ) // PodStorage includes storage for pods and all sub resources @@ -93,8 +93,8 @@ func NewStorage( Storage: storageInterface, } - statusStore := *store + statusStore := *store statusStore.UpdateStrategy = pod.StatusStrategy return PodStorage{ @@ -132,15 +132,12 @@ var _ = rest.Creater(&BindingREST{}) // Create ensures a pod is bound to a specific host. func (r *BindingREST) Create(ctx api.Context, obj runtime.Object) (out runtime.Object, err error) { binding := obj.(*api.Binding) + // TODO: move me to a binding strategy - if len(binding.Target.Kind) != 0 && binding.Target.Kind != "Node" { - // TODO: When validation becomes versioned, this gets more complicated. - return nil, errors.NewInvalid("binding", binding.Name, field.ErrorList{field.NotSupported(field.NewPath("target", "kind"), binding.Target.Kind, []string{"Node", ""})}) - } - if len(binding.Target.Name) == 0 { - // TODO: When validation becomes versioned, this gets more complicated. - return nil, errors.NewInvalid("binding", binding.Name, field.ErrorList{field.Required(field.NewPath("target", "name"))}) + if errs := validation.ValidatePodBinding(binding); len(errs) != 0 { + return nil, errs.ToAggregate() } + err = r.assignPod(ctx, binding.Name, binding.Target.Name, binding.Annotations) out = &unversioned.Status{Status: unversioned.StatusSuccess} return diff --git a/pkg/registry/pod/etcd/etcd_test.go b/pkg/registry/pod/etcd/etcd_test.go index 5849c755e71..f387b0f647c 100644 --- a/pkg/registry/pod/etcd/etcd_test.go +++ b/pkg/registry/pod/etcd/etcd_test.go @@ -482,14 +482,14 @@ func TestEtcdCreateBinding(t *testing.T) { ObjectMeta: api.ObjectMeta{Namespace: api.NamespaceDefault, Name: "foo"}, Target: api.ObjectReference{}, }, - errOK: func(err error) bool { return errors.IsInvalid(err) }, + errOK: func(err error) bool { return err != nil }, }, "badKind": { binding: api.Binding{ ObjectMeta: api.ObjectMeta{Namespace: api.NamespaceDefault, Name: "foo"}, Target: api.ObjectReference{Name: "machine1", Kind: "unknown"}, }, - errOK: func(err error) bool { return errors.IsInvalid(err) }, + errOK: func(err error) bool { return err != nil }, }, "emptyKind": { binding: api.Binding{