Fix expired event logic to use 404 instead of 500

It seems this logic was never updated once apiserver started returning
404s for expired (missing) events.

This change corrects it to use a 404 so events will get resent correctly
if they were expired in etcd.
This commit is contained in:
James Ravn 2016-04-01 16:52:43 +01:00
parent 12b0a06be1
commit 5f9ee58de0
2 changed files with 41 additions and 4 deletions

View File

@ -31,6 +31,7 @@ import (
"k8s.io/kubernetes/pkg/watch"
"github.com/golang/glog"
"net/http"
)
const maxTriesPerEvent = 12
@ -153,12 +154,11 @@ func recordToSink(sink EventSink, event *api.Event, eventCorrelator *EventCorrel
func isKeyNotFoundError(err error) bool {
statusErr, _ := err.(*errors.StatusError)
// At the moment the server is returning 500 instead of a more specific
// error. When changing this remember that it should be backward compatible
// with old api servers that may be still returning 500.
if statusErr != nil && statusErr.Status().Code == 500 {
if statusErr != nil && statusErr.Status().Code == http.StatusNotFound {
return true
}
return false
}

View File

@ -27,10 +27,12 @@ import (
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/errors"
_ "k8s.io/kubernetes/pkg/api/install" // To register api.Pod used in tests below
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/client/restclient"
k8sruntime "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/util"
"k8s.io/kubernetes/pkg/util/strategicpatch"
"net/http"
)
type testEventSink struct {
@ -433,6 +435,41 @@ func TestWriteEventError(t *testing.T) {
}
}
func TestUpdateExpiredEvent(t *testing.T) {
eventCorrelator := NewEventCorrelator(util.RealClock{})
randGen := rand.New(rand.NewSource(time.Now().UnixNano()))
var createdEvent *api.Event
sink := &testEventSink{
OnPatch: func(*api.Event, []byte) (*api.Event, error) {
return nil, &errors.StatusError{
ErrStatus: unversioned.Status{
Code: http.StatusNotFound,
Reason: unversioned.StatusReasonNotFound,
}}
},
OnCreate: func(event *api.Event) (*api.Event, error) {
createdEvent = event
return event, nil
},
}
ev := &api.Event{}
ev.ResourceVersion = "updated-resource-version"
ev.Count = 2
recordToSink(sink, ev, eventCorrelator, randGen, 0)
if createdEvent == nil {
t.Error("Event did not get created after patch failed")
return
}
if createdEvent.ResourceVersion != "" {
t.Errorf("Event did not have its resource version cleared, was %s", createdEvent.ResourceVersion)
}
}
func TestLotsOfEvents(t *testing.T) {
recorderCalled := make(chan struct{})
loggerCalled := make(chan struct{})