mirror of https://github.com/docker/docs.git
add tests for events
This commit is contained in:
parent
0872d4f549
commit
f7fed9a7bd
20
api/api.go
20
api/api.go
|
@ -4,7 +4,6 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
@ -221,17 +220,15 @@ func deleteContainer(c *context, w http.ResponseWriter, r *http.Request) {
|
||||||
|
|
||||||
// GET /events
|
// GET /events
|
||||||
func getEvents(c *context, w http.ResponseWriter, r *http.Request) {
|
func getEvents(c *context, w http.ResponseWriter, r *http.Request) {
|
||||||
c.eventsHandler.Lock()
|
c.eventsHandler.Add(r.RemoteAddr, w)
|
||||||
c.eventsHandler.ws[r.RemoteAddr] = w
|
|
||||||
c.eventsHandler.cs[r.RemoteAddr] = make(chan struct{})
|
|
||||||
c.eventsHandler.Unlock()
|
|
||||||
w.Header().Set("Content-Type", "application/json")
|
w.Header().Set("Content-Type", "application/json")
|
||||||
|
|
||||||
if f, ok := w.(http.Flusher); ok {
|
if f, ok := w.(http.Flusher); ok {
|
||||||
f.Flush()
|
f.Flush()
|
||||||
}
|
}
|
||||||
|
|
||||||
<-c.eventsHandler.cs[r.RemoteAddr]
|
c.eventsHandler.Wait(r.RemoteAddr)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GET /_ping
|
// GET /_ping
|
||||||
|
@ -351,13 +348,10 @@ func createRouter(c *context, enableCors bool) (*mux.Router, error) {
|
||||||
|
|
||||||
func ListenAndServe(c *cluster.Cluster, s *scheduler.Scheduler, addr, version string) error {
|
func ListenAndServe(c *cluster.Cluster, s *scheduler.Scheduler, addr, version string) error {
|
||||||
context := &context{
|
context := &context{
|
||||||
cluster: c,
|
cluster: c,
|
||||||
scheduler: s,
|
scheduler: s,
|
||||||
version: version,
|
version: version,
|
||||||
eventsHandler: &eventsHandler{
|
eventsHandler: NewEventsHandler(),
|
||||||
ws: make(map[string]io.Writer),
|
|
||||||
cs: make(map[string]chan struct{}),
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
c.Events(context.eventsHandler)
|
c.Events(context.eventsHandler)
|
||||||
r, err := createRouter(context, false)
|
r, err := createRouter(context, false)
|
||||||
|
|
|
@ -15,6 +15,24 @@ type eventsHandler struct {
|
||||||
cs map[string]chan struct{}
|
cs map[string]chan struct{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func NewEventsHandler() *eventsHandler {
|
||||||
|
return &eventsHandler{
|
||||||
|
ws: make(map[string]io.Writer),
|
||||||
|
cs: make(map[string]chan struct{}),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (eh *eventsHandler) Add(remoteAddr string, w io.Writer) {
|
||||||
|
eh.Lock()
|
||||||
|
eh.ws[remoteAddr] = w
|
||||||
|
eh.cs[remoteAddr] = make(chan struct{})
|
||||||
|
eh.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (eh *eventsHandler) Wait(remoteAddr string) {
|
||||||
|
<-eh.cs[remoteAddr]
|
||||||
|
}
|
||||||
|
|
||||||
func (eh *eventsHandler) Handle(e *cluster.Event) error {
|
func (eh *eventsHandler) Handle(e *cluster.Event) error {
|
||||||
eh.RLock()
|
eh.RLock()
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
package api
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/docker/swarm/cluster"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
type FakeWriter struct {
|
||||||
|
Tmp []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fw *FakeWriter) Write(p []byte) (n int, err error) {
|
||||||
|
fw.Tmp = append(fw.Tmp, p...)
|
||||||
|
return len(p), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestHandle(t *testing.T) {
|
||||||
|
eh := NewEventsHandler()
|
||||||
|
assert.Equal(t, eh.Size(), 0)
|
||||||
|
|
||||||
|
fw := &FakeWriter{Tmp: []byte{}}
|
||||||
|
eh.Add("test", fw)
|
||||||
|
|
||||||
|
assert.Equal(t, eh.Size(), 1)
|
||||||
|
|
||||||
|
event := &cluster.Event{
|
||||||
|
NodeName: "node_name",
|
||||||
|
NodeID: "node_id",
|
||||||
|
NodeAddr: "node_addr",
|
||||||
|
NodeIP: "node_ip",
|
||||||
|
}
|
||||||
|
event.Event.Status = "status"
|
||||||
|
event.Event.Id = "id"
|
||||||
|
event.Event.From = "from"
|
||||||
|
event.Event.Time = 0
|
||||||
|
|
||||||
|
assert.NoError(t, eh.Handle(event))
|
||||||
|
|
||||||
|
str := fmt.Sprintf("{%q:%q,%q:%q,%q:%q,%q:%d,%q:%q,%q:%q,%q:%q,%q:%q}",
|
||||||
|
"status", "status",
|
||||||
|
"id", "id",
|
||||||
|
"from", "from node:node_name",
|
||||||
|
"time", 0,
|
||||||
|
"node_name", "node_name",
|
||||||
|
"node_id", "node_id",
|
||||||
|
"node_addr", "node_addr",
|
||||||
|
"node_ip", "node_ip")
|
||||||
|
|
||||||
|
assert.Equal(t, str, string(fw.Tmp))
|
||||||
|
}
|
Loading…
Reference in New Issue