浏览代码

Implement docker events with standalone client lib.

Signed-off-by: David Calavera <david.calavera@gmail.com>
David Calavera 9 年之前
父节点
当前提交
11c4cc9dde
共有 2 个文件被更改,包括 66 次插入35 次删除
  1. 14 35
      api/client/events.go
  2. 52 0
      api/client/lib/events.go

+ 14 - 35
api/client/events.go

@@ -1,14 +1,12 @@
 package client
 
 import (
-	"net/url"
-	"time"
-
+	"github.com/docker/docker/api/client/lib"
 	Cli "github.com/docker/docker/cli"
 	"github.com/docker/docker/opts"
+	"github.com/docker/docker/pkg/jsonmessage"
 	flag "github.com/docker/docker/pkg/mflag"
 	"github.com/docker/docker/pkg/parsers/filters"
-	"github.com/docker/docker/pkg/timeutils"
 )
 
 // CmdEvents prints a live stream of real time events from the server.
@@ -24,10 +22,7 @@ func (cli *DockerCli) CmdEvents(args ...string) error {
 
 	cmd.ParseFlags(args, true)
 
-	var (
-		v               = url.Values{}
-		eventFilterArgs = filters.NewArgs()
-	)
+	eventFilterArgs := filters.NewArgs()
 
 	// Consolidate all filter flags, and sanity check them early.
 	// They'll get process in the daemon/server.
@@ -38,34 +33,18 @@ func (cli *DockerCli) CmdEvents(args ...string) error {
 			return err
 		}
 	}
-	ref := time.Now()
-	if *since != "" {
-		ts, err := timeutils.GetTimestamp(*since, ref)
-		if err != nil {
-			return err
-		}
-		v.Set("since", ts)
-	}
-	if *until != "" {
-		ts, err := timeutils.GetTimestamp(*until, ref)
-		if err != nil {
-			return err
-		}
-		v.Set("until", ts)
-	}
-	if eventFilterArgs.Len() > 0 {
-		filterJSON, err := filters.ToParam(eventFilterArgs)
-		if err != nil {
-			return err
-		}
-		v.Set("filters", filterJSON)
-	}
-	sopts := &streamOpts{
-		rawTerminal: true,
-		out:         cli.out,
+
+	options := lib.EventsOptions{
+		Since:   *since,
+		Until:   *until,
+		Filters: eventFilterArgs,
 	}
-	if _, err := cli.stream("GET", "/events?"+v.Encode(), sopts); err != nil {
+
+	responseBody, err := cli.client.Events(options)
+	if err != nil {
 		return err
 	}
-	return nil
+	defer responseBody.Close()
+
+	return jsonmessage.DisplayJSONMessagesStream(responseBody, cli.out, cli.outFd, cli.isTerminalOut)
 }

+ 52 - 0
api/client/lib/events.go

@@ -0,0 +1,52 @@
+package lib
+
+import (
+	"io"
+	"net/url"
+	"time"
+
+	"github.com/docker/docker/pkg/parsers/filters"
+	"github.com/docker/docker/pkg/timeutils"
+)
+
+// EventsOptions hold parameters to filter events with.
+type EventsOptions struct {
+	Since   string
+	Until   string
+	Filters filters.Args
+}
+
+// Events returns a stream of events in the daemon in a ReadCloser.
+// It's up to the caller to close the stream.
+func (cli *Client) Events(options EventsOptions) (io.ReadCloser, error) {
+	var query url.Values
+	ref := time.Now()
+
+	if options.Since != "" {
+		ts, err := timeutils.GetTimestamp(options.Since, ref)
+		if err != nil {
+			return nil, err
+		}
+		query.Set("since", ts)
+	}
+	if options.Until != "" {
+		ts, err := timeutils.GetTimestamp(options.Until, ref)
+		if err != nil {
+			return nil, err
+		}
+		query.Set("until", ts)
+	}
+	if options.Filters.Len() > 0 {
+		filterJSON, err := filters.ToParam(options.Filters)
+		if err != nil {
+			return nil, err
+		}
+		query.Set("filters", filterJSON)
+	}
+
+	serverResponse, err := cli.GET("/events", query, nil)
+	if err != nil {
+		return nil, err
+	}
+	return serverResponse.body, nil
+}