github.com/chenchun/docker@v1.3.2-0.20150629222414-20467faf132b/api/client/events.go (about)

     1  package client
     2  
     3  import (
     4  	"net/url"
     5  	"time"
     6  
     7  	"github.com/docker/docker/opts"
     8  	flag "github.com/docker/docker/pkg/mflag"
     9  	"github.com/docker/docker/pkg/parsers/filters"
    10  	"github.com/docker/docker/pkg/timeutils"
    11  )
    12  
    13  // CmdEvents prints a live stream of real time events from the server.
    14  //
    15  // Usage: docker events [OPTIONS]
    16  func (cli *DockerCli) CmdEvents(args ...string) error {
    17  	cmd := cli.Subcmd("events", nil, "Get real time events from the server", true)
    18  	since := cmd.String([]string{"#since", "-since"}, "", "Show all events created since timestamp")
    19  	until := cmd.String([]string{"-until"}, "", "Stream events until this timestamp")
    20  	flFilter := opts.NewListOpts(nil)
    21  	cmd.Var(&flFilter, []string{"f", "-filter"}, "Filter output based on conditions provided")
    22  	cmd.Require(flag.Exact, 0)
    23  
    24  	cmd.ParseFlags(args, true)
    25  
    26  	var (
    27  		v               = url.Values{}
    28  		eventFilterArgs = filters.Args{}
    29  	)
    30  
    31  	// Consolidate all filter flags, and sanity check them early.
    32  	// They'll get process in the daemon/server.
    33  	for _, f := range flFilter.GetAll() {
    34  		var err error
    35  		eventFilterArgs, err = filters.ParseFlag(f, eventFilterArgs)
    36  		if err != nil {
    37  			return err
    38  		}
    39  	}
    40  	ref := time.Now()
    41  	if *since != "" {
    42  		v.Set("since", timeutils.GetTimestamp(*since, ref))
    43  	}
    44  	if *until != "" {
    45  		v.Set("until", timeutils.GetTimestamp(*until, ref))
    46  	}
    47  	if len(eventFilterArgs) > 0 {
    48  		filterJSON, err := filters.ToParam(eventFilterArgs)
    49  		if err != nil {
    50  			return err
    51  		}
    52  		v.Set("filters", filterJSON)
    53  	}
    54  	sopts := &streamOpts{
    55  		rawTerminal: true,
    56  		out:         cli.out,
    57  	}
    58  	if _, err := cli.stream("GET", "/events?"+v.Encode(), sopts); err != nil {
    59  		return err
    60  	}
    61  	return nil
    62  }