clarify resource conflict status, rebase to master
remove ResourceConflict, replace usage with Conflict
This commit is contained in:
James DeFelice
2015-03-03 23:19:17 +00:00
parent a8f0139186
commit 20eb3c49c5
2 changed files with 64 additions and 11 deletions

View File

@@ -148,15 +148,15 @@ func (r *BindingREST) Create(ctx api.Context, obj runtime.Object) (out runtime.O
if len(binding.Target.Name) == 0 { if len(binding.Target.Name) == 0 {
return nil, errors.NewInvalid("binding", binding.Name, errors.ValidationErrorList{errors.NewFieldRequired("to.name", binding.Target.Name)}) return nil, errors.NewInvalid("binding", binding.Name, errors.ValidationErrorList{errors.NewFieldRequired("to.name", binding.Target.Name)})
} }
err = r.assignPod(ctx, binding.Name, binding.Target.Name) err = r.assignPod(ctx, binding.Name, binding.Target.Name, binding.Annotations)
err = etcderr.InterpretCreateError(err, "binding", "")
out = &api.Status{Status: api.StatusSuccess} out = &api.Status{Status: api.StatusSuccess}
return return
} }
// setPodHostTo sets the given pod's host to 'machine' iff it was previously 'oldMachine'. // setPodHostAndAnnotations sets the given pod's host to 'machine' iff it was previously 'oldMachine' and merges
// the provided annotations with those of the pod.
// Returns the current state of the pod, or an error. // Returns the current state of the pod, or an error.
func (r *BindingREST) setPodHostTo(ctx api.Context, podID, oldMachine, machine string) (finalPod *api.Pod, err error) { func (r *BindingREST) setPodHostAndAnnotations(ctx api.Context, podID, oldMachine, machine string, annotations map[string]string) (finalPod *api.Pod, err error) {
podKey, err := r.store.KeyFunc(ctx, podID) podKey, err := r.store.KeyFunc(ctx, podID)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -171,6 +171,12 @@ func (r *BindingREST) setPodHostTo(ctx api.Context, podID, oldMachine, machine s
} }
pod.Spec.Host = machine pod.Spec.Host = machine
pod.Status.Host = machine pod.Status.Host = machine
if pod.Annotations == nil {
pod.Annotations = make(map[string]string)
}
for k, v := range annotations {
pod.Annotations[k] = v
}
finalPod = pod finalPod = pod
return pod, nil return pod, nil
}) })
@@ -178,12 +184,15 @@ func (r *BindingREST) setPodHostTo(ctx api.Context, podID, oldMachine, machine s
} }
// assignPod assigns the given pod to the given machine. // assignPod assigns the given pod to the given machine.
func (r *BindingREST) assignPod(ctx api.Context, podID string, machine string) error { func (r *BindingREST) assignPod(ctx api.Context, podID string, machine string, annotations map[string]string) (err error) {
_, err := r.setPodHostTo(ctx, podID, "", machine) if _, err = r.setPodHostAndAnnotations(ctx, podID, "", machine, annotations); err != nil {
if err != nil { err = etcderr.InterpretGetError(err, "pod", podID)
return err err = etcderr.InterpretUpdateError(err, "pod", podID)
if _, ok := err.(*errors.StatusError); !ok {
err = errors.NewConflict("binding", podID, err)
} }
return err }
return
} }
type podLifecycle struct{} type podLifecycle struct{}

View File

@@ -894,7 +894,11 @@ func TestEtcdCreateWithContainersNotFound(t *testing.T) {
// Suddenly, a wild scheduler appears: // Suddenly, a wild scheduler appears:
_, err = bindingRegistry.Create(ctx, &api.Binding{ _, err = bindingRegistry.Create(ctx, &api.Binding{
ObjectMeta: api.ObjectMeta{Namespace: api.NamespaceDefault, Name: "foo"}, ObjectMeta: api.ObjectMeta{
Namespace: api.NamespaceDefault,
Name: "foo",
Annotations: map[string]string{"label1": "value1"},
},
Target: api.ObjectReference{Name: "machine"}, Target: api.ObjectReference{Name: "machine"},
}) })
if err != nil { if err != nil {
@@ -914,6 +918,46 @@ func TestEtcdCreateWithContainersNotFound(t *testing.T) {
if pod.Name != "foo" { if pod.Name != "foo" {
t.Errorf("Unexpected pod: %#v %s", pod, resp.Node.Value) t.Errorf("Unexpected pod: %#v %s", pod, resp.Node.Value)
} }
if !(pod.Annotations != nil && pod.Annotations["label1"] == "value1") {
t.Fatalf("Pod annotations don't match the expected: %v", pod.Annotations)
}
}
func TestEtcdCreateWithConflict(t *testing.T) {
registry, bindingRegistry, _, fakeClient, _ := newStorage(t)
ctx := api.NewDefaultContext()
fakeClient.TestIndex = true
key, _ := registry.store.KeyFunc(ctx, "foo")
fakeClient.Data[key] = tools.EtcdResponseWithError{
R: &etcd.Response{
Node: nil,
},
E: tools.EtcdErrorNotFound,
}
_, err := registry.Create(ctx, validNewPod())
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
// Suddenly, a wild scheduler appears:
binding := api.Binding{
ObjectMeta: api.ObjectMeta{
Namespace: api.NamespaceDefault,
Name: "foo",
Annotations: map[string]string{"label1": "value1"},
},
Target: api.ObjectReference{Name: "machine"},
}
_, err = bindingRegistry.Create(ctx, &binding)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
_, err = bindingRegistry.Create(ctx, &binding)
if err == nil || !errors.IsConflict(err) {
t.Fatalf("expected resource conflict error, not: %v", err)
}
} }
func TestEtcdCreateWithExistingContainers(t *testing.T) { func TestEtcdCreateWithExistingContainers(t *testing.T) {