Merge pull request #569 from kateknister/apiBranch
Added streaming to api
This commit is contained in:
commit
4d9cdc0426
@ -17,6 +17,7 @@ package api
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
@ -50,7 +51,6 @@ func RegisterHandlers(m manager.Manager) error {
|
|||||||
http.Error(w, err.Error(), 500)
|
http.Error(w, err.Error(), 500)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -115,7 +115,9 @@ func handleRequest(supportedApiVersions map[string]ApiVersion, m manager.Manager
|
|||||||
if len(requestArgs) > 0 && requestArgs[0] == "" {
|
if len(requestArgs) > 0 && requestArgs[0] == "" {
|
||||||
requestArgs = requestArgs[1:]
|
requestArgs = requestArgs[1:]
|
||||||
}
|
}
|
||||||
|
|
||||||
return versionHandler.HandleRequest(requestType, requestArgs, m, w, r)
|
return versionHandler.HandleRequest(requestType, requestArgs, m, w, r)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func writeResult(res interface{}, w http.ResponseWriter) error {
|
func writeResult(res interface{}, w http.ResponseWriter) error {
|
||||||
@ -130,6 +132,36 @@ func writeResult(res interface{}, w http.ResponseWriter) error {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func streamResults(results chan *events.Event, w http.ResponseWriter, r *http.Request) error {
|
||||||
|
cn, ok := w.(http.CloseNotifier)
|
||||||
|
if !ok {
|
||||||
|
return errors.New("could not access http.CloseNotifier")
|
||||||
|
}
|
||||||
|
flusher, ok := w.(http.Flusher)
|
||||||
|
if !ok {
|
||||||
|
return errors.New("could not access http.Flusher")
|
||||||
|
}
|
||||||
|
|
||||||
|
w.Header().Set("Transfer-Encoding", "chunked")
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
flusher.Flush()
|
||||||
|
|
||||||
|
enc := json.NewEncoder(w)
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-cn.CloseNotify():
|
||||||
|
glog.Infof("Client stopped listening")
|
||||||
|
return nil
|
||||||
|
case ev := <-results:
|
||||||
|
err := enc.Encode(ev)
|
||||||
|
if err != nil {
|
||||||
|
glog.Errorf("error encoding message %+v for result stream: %v", ev, err)
|
||||||
|
}
|
||||||
|
flusher.Flush()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func getContainerInfoRequest(body io.ReadCloser) (*info.ContainerInfoRequest, error) {
|
func getContainerInfoRequest(body io.ReadCloser) (*info.ContainerInfoRequest, error) {
|
||||||
var query info.ContainerInfoRequest
|
var query info.ContainerInfoRequest
|
||||||
|
|
||||||
|
@ -262,30 +262,19 @@ func (self *version1_3) HandleRequest(requestType string, request []string, m ma
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
glog.V(2).Infof("Api - Events(%v)", query)
|
glog.V(2).Infof("Api - Events(%v)", query)
|
||||||
|
|
||||||
if eventsFromAllTime {
|
if eventsFromAllTime {
|
||||||
allEvents, err := m.GetPastEvents(query)
|
pastEvents, err := m.GetPastEvents(query)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return writeResult(allEvents, w)
|
return writeResult(pastEvents, w)
|
||||||
} else {
|
|
||||||
// every time URL is entered to watch, a channel is created here
|
|
||||||
eventChannel := make(chan *events.Event, 10)
|
|
||||||
err = m.WatchForEvents(query, eventChannel)
|
|
||||||
|
|
||||||
defer close(eventChannel)
|
|
||||||
currentEventSet := make(events.EventSlice, 0)
|
|
||||||
for ev := range eventChannel {
|
|
||||||
// todo: implement write-as-received writeResult method
|
|
||||||
currentEventSet = append(currentEventSet, ev)
|
|
||||||
err = writeResult(currentEventSet, w)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nil
|
eventsChannel := make(chan *events.Event, 10)
|
||||||
|
err = m.WatchForEvents(query, eventsChannel)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return streamResults(eventsChannel, w, r)
|
||||||
default:
|
default:
|
||||||
return self.baseVersion.HandleRequest(requestType, request, m, w, r)
|
return self.baseVersion.HandleRequest(requestType, request, m, w, r)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user