github.com/kim0/docker@v0.6.2-0.20161130212042-4addda3f07e7/client/events.go (about) 1 package client 2 3 import ( 4 "encoding/json" 5 "net/url" 6 "time" 7 8 "golang.org/x/net/context" 9 10 "github.com/docker/docker/api/types" 11 "github.com/docker/docker/api/types/events" 12 "github.com/docker/docker/api/types/filters" 13 timetypes "github.com/docker/docker/api/types/time" 14 ) 15 16 // Events returns a stream of events in the daemon. It's up to the caller to close the stream 17 // by cancelling the context. Once the stream has been completely read an io.EOF error will 18 // be sent over the error channel. If an error is sent all processing will be stopped. It's up 19 // to the caller to reopen the stream in the event of an error by reinvoking this method. 20 func (cli *Client) Events(ctx context.Context, options types.EventsOptions) (<-chan events.Message, <-chan error) { 21 22 messages := make(chan events.Message) 23 errs := make(chan error, 1) 24 25 go func() { 26 defer close(errs) 27 28 query, err := buildEventsQueryParams(cli.version, options) 29 if err != nil { 30 errs <- err 31 return 32 } 33 34 resp, err := cli.get(ctx, "/events", query, nil) 35 if err != nil { 36 errs <- err 37 return 38 } 39 defer resp.body.Close() 40 41 decoder := json.NewDecoder(resp.body) 42 43 for { 44 select { 45 case <-ctx.Done(): 46 errs <- ctx.Err() 47 return 48 default: 49 var event events.Message 50 if err := decoder.Decode(&event); err != nil { 51 errs <- err 52 return 53 } 54 55 select { 56 case messages <- event: 57 case <-ctx.Done(): 58 errs <- ctx.Err() 59 return 60 } 61 } 62 } 63 }() 64 65 return messages, errs 66 } 67 68 func buildEventsQueryParams(cliVersion string, options types.EventsOptions) (url.Values, error) { 69 query := url.Values{} 70 ref := time.Now() 71 72 if options.Since != "" { 73 ts, err := timetypes.GetTimestamp(options.Since, ref) 74 if err != nil { 75 return nil, err 76 } 77 query.Set("since", ts) 78 } 79 80 if options.Until != "" { 81 ts, err := timetypes.GetTimestamp(options.Until, ref) 82 if err != nil { 83 return nil, err 84 } 85 query.Set("until", ts) 86 } 87 88 if options.Filters.Len() > 0 { 89 filterJSON, err := filters.ToParamWithVersion(cliVersion, options.Filters) 90 if err != nil { 91 return nil, err 92 } 93 query.Set("filters", filterJSON) 94 } 95 96 return query, nil 97 }