Browse code

Implement docker events with standalone client lib.

Signed-off-by: David Calavera <david.calavera@gmail.com>

David Calavera authored on 2015/12/04 04:34:35
Showing 2 changed files
... ...
@@ -1,14 +1,12 @@
1 1
 package client
2 2
 
3 3
 import (
4
-	"net/url"
5
-	"time"
6
-
4
+	"github.com/docker/docker/api/client/lib"
7 5
 	Cli "github.com/docker/docker/cli"
8 6
 	"github.com/docker/docker/opts"
7
+	"github.com/docker/docker/pkg/jsonmessage"
9 8
 	flag "github.com/docker/docker/pkg/mflag"
10 9
 	"github.com/docker/docker/pkg/parsers/filters"
11
-	"github.com/docker/docker/pkg/timeutils"
12 10
 )
13 11
 
14 12
 // CmdEvents prints a live stream of real time events from the server.
... ...
@@ -24,10 +22,7 @@ func (cli *DockerCli) CmdEvents(args ...string) error {
24 24
 
25 25
 	cmd.ParseFlags(args, true)
26 26
 
27
-	var (
28
-		v               = url.Values{}
29
-		eventFilterArgs = filters.NewArgs()
30
-	)
27
+	eventFilterArgs := filters.NewArgs()
31 28
 
32 29
 	// Consolidate all filter flags, and sanity check them early.
33 30
 	// They'll get process in the daemon/server.
... ...
@@ -38,34 +33,18 @@ func (cli *DockerCli) CmdEvents(args ...string) error {
38 38
 			return err
39 39
 		}
40 40
 	}
41
-	ref := time.Now()
42
-	if *since != "" {
43
-		ts, err := timeutils.GetTimestamp(*since, ref)
44
-		if err != nil {
45
-			return err
46
-		}
47
-		v.Set("since", ts)
48
-	}
49
-	if *until != "" {
50
-		ts, err := timeutils.GetTimestamp(*until, ref)
51
-		if err != nil {
52
-			return err
53
-		}
54
-		v.Set("until", ts)
55
-	}
56
-	if eventFilterArgs.Len() > 0 {
57
-		filterJSON, err := filters.ToParam(eventFilterArgs)
58
-		if err != nil {
59
-			return err
60
-		}
61
-		v.Set("filters", filterJSON)
62
-	}
63
-	sopts := &streamOpts{
64
-		rawTerminal: true,
65
-		out:         cli.out,
41
+
42
+	options := lib.EventsOptions{
43
+		Since:   *since,
44
+		Until:   *until,
45
+		Filters: eventFilterArgs,
66 46
 	}
67
-	if _, err := cli.stream("GET", "/events?"+v.Encode(), sopts); err != nil {
47
+
48
+	responseBody, err := cli.client.Events(options)
49
+	if err != nil {
68 50
 		return err
69 51
 	}
70
-	return nil
52
+	defer responseBody.Close()
53
+
54
+	return jsonmessage.DisplayJSONMessagesStream(responseBody, cli.out, cli.outFd, cli.isTerminalOut)
71 55
 }
72 56
new file mode 100644
... ...
@@ -0,0 +1,52 @@
0
+package lib
1
+
2
+import (
3
+	"io"
4
+	"net/url"
5
+	"time"
6
+
7
+	"github.com/docker/docker/pkg/parsers/filters"
8
+	"github.com/docker/docker/pkg/timeutils"
9
+)
10
+
11
+// EventsOptions hold parameters to filter events with.
12
+type EventsOptions struct {
13
+	Since   string
14
+	Until   string
15
+	Filters filters.Args
16
+}
17
+
18
+// Events returns a stream of events in the daemon in a ReadCloser.
19
+// It's up to the caller to close the stream.
20
+func (cli *Client) Events(options EventsOptions) (io.ReadCloser, error) {
21
+	var query url.Values
22
+	ref := time.Now()
23
+
24
+	if options.Since != "" {
25
+		ts, err := timeutils.GetTimestamp(options.Since, ref)
26
+		if err != nil {
27
+			return nil, err
28
+		}
29
+		query.Set("since", ts)
30
+	}
31
+	if options.Until != "" {
32
+		ts, err := timeutils.GetTimestamp(options.Until, ref)
33
+		if err != nil {
34
+			return nil, err
35
+		}
36
+		query.Set("until", ts)
37
+	}
38
+	if options.Filters.Len() > 0 {
39
+		filterJSON, err := filters.ToParam(options.Filters)
40
+		if err != nil {
41
+			return nil, err
42
+		}
43
+		query.Set("filters", filterJSON)
44
+	}
45
+
46
+	serverResponse, err := cli.GET("/events", query, nil)
47
+	if err != nil {
48
+		return nil, err
49
+	}
50
+	return serverResponse.body, nil
51
+}