mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
filter events by container name,id or partial id
Addresses #10645 Signed-off-by: Srini Brahmaroutu <srbrahma@us.ibm.com>
This commit is contained in:
parent
cfe5767045
commit
e0fa577378
3 changed files with 127 additions and 2 deletions
|
@ -988,6 +988,12 @@ You'll need two shells for this example.
|
||||||
$ sudo docker events --filter 'container=7805c1d35632' --filter 'event=stop'
|
$ sudo docker events --filter 'container=7805c1d35632' --filter 'event=stop'
|
||||||
2014-09-03T15:49:29.999999999Z07:00 7805c1d35632: (from redis:2.8) stop
|
2014-09-03T15:49:29.999999999Z07:00 7805c1d35632: (from redis:2.8) stop
|
||||||
|
|
||||||
|
$ sudo docker events --filter 'container=container_1' --filter 'container=container_2'
|
||||||
|
2014-09-03T15:49:29.999999999Z07:00 4386fb97867d: (from ubuntu-1:14.04) die
|
||||||
|
2014-05-10T17:42:14.999999999Z07:00 4386fb97867d: (from ubuntu-1:14.04) stop
|
||||||
|
2014-05-10T17:42:14.999999999Z07:00 7805c1d35632: (from redis:2.8) die
|
||||||
|
2014-09-03T15:49:29.999999999Z07:00 7805c1d35632: (from redis:2.8) stop
|
||||||
|
|
||||||
## exec
|
## exec
|
||||||
|
|
||||||
Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
|
Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
package events
|
package events
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"io"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
@ -123,7 +125,13 @@ func writeEvent(job *engine.Job, event *utils.JSONMessage, eventFilters filters.
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
if isFiltered(event.Status, eventFilters["event"]) || isFiltered(event.From, eventFilters["image"]) || isFiltered(event.ID, eventFilters["container"]) {
|
//incoming container filter can be name,id or partial id, convert and replace as a full container id
|
||||||
|
for i, cn := range eventFilters["container"] {
|
||||||
|
eventFilters["container"][i] = GetContainerId(job.Eng, cn)
|
||||||
|
}
|
||||||
|
|
||||||
|
if isFiltered(event.Status, eventFilters["event"]) || isFiltered(event.From, eventFilters["image"]) ||
|
||||||
|
isFiltered(event.ID, eventFilters["container"]) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -203,3 +211,20 @@ func (e *Events) unsubscribe(l listener) bool {
|
||||||
e.mu.Unlock()
|
e.mu.Unlock()
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetContainerId(eng *engine.Engine, name string) string {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
job := eng.Job("container_inspect", name)
|
||||||
|
|
||||||
|
var outStream io.Writer
|
||||||
|
|
||||||
|
outStream = &buf
|
||||||
|
job.Stdout.Set(outStream)
|
||||||
|
|
||||||
|
if err := job.Run(); err != nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
var out struct{ ID string }
|
||||||
|
json.NewDecoder(&buf).Decode(&out)
|
||||||
|
return out.ID
|
||||||
|
}
|
||||||
|
|
|
@ -258,6 +258,7 @@ func TestEventsFilterImageName(t *testing.T) {
|
||||||
t.Fatal(out, err)
|
t.Fatal(out, err)
|
||||||
}
|
}
|
||||||
container1 := stripTrailingCharacters(out)
|
container1 := stripTrailingCharacters(out)
|
||||||
|
|
||||||
out, _, err = runCommandWithOutput(exec.Command(dockerBinary, "run", "--name", "container_2", "-d", "busybox", "true"))
|
out, _, err = runCommandWithOutput(exec.Command(dockerBinary, "run", "--name", "container_2", "-d", "busybox", "true"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(out, err)
|
t.Fatal(out, err)
|
||||||
|
@ -290,5 +291,98 @@ func TestEventsFilterImageName(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
logDone("events - filters using image")
|
logDone("events - filters using image")
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestEventsFilterContainerID(t *testing.T) {
|
||||||
|
since := time.Now().Unix()
|
||||||
|
defer deleteAllContainers()
|
||||||
|
|
||||||
|
out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "run", "-d", "busybox", "true"))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(out, err)
|
||||||
|
}
|
||||||
|
container1 := stripTrailingCharacters(out)
|
||||||
|
|
||||||
|
out, _, err = runCommandWithOutput(exec.Command(dockerBinary, "run", "-d", "busybox", "true"))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(out, err)
|
||||||
|
}
|
||||||
|
container2 := stripTrailingCharacters(out)
|
||||||
|
|
||||||
|
for _, s := range []string{container1, container2, container1[:12], container2[:12]} {
|
||||||
|
eventsCmd := exec.Command(dockerBinary, "events", fmt.Sprintf("--since=%d", since), fmt.Sprintf("--until=%d", time.Now().Unix()), "--filter", fmt.Sprintf("container=%s", s))
|
||||||
|
out, _, err := runCommandWithOutput(eventsCmd)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Failed to get events, error: %s(%s)", err, out)
|
||||||
|
}
|
||||||
|
events := strings.Split(out, "\n")
|
||||||
|
events = events[:len(events)-1]
|
||||||
|
if len(events) == 0 || len(events) > 3 {
|
||||||
|
t.Fatalf("Expected 3 events, got %d: %v", len(events), events)
|
||||||
|
}
|
||||||
|
createEvent := strings.Fields(events[0])
|
||||||
|
if createEvent[len(createEvent)-1] != "create" {
|
||||||
|
t.Fatalf("first event should be create, not %#v", createEvent)
|
||||||
|
}
|
||||||
|
if len(events) > 1 {
|
||||||
|
startEvent := strings.Fields(events[1])
|
||||||
|
if startEvent[len(startEvent)-1] != "start" {
|
||||||
|
t.Fatalf("second event should be start, not %#v", startEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(events) == 3 {
|
||||||
|
dieEvent := strings.Fields(events[len(events)-1])
|
||||||
|
if dieEvent[len(dieEvent)-1] != "die" {
|
||||||
|
t.Fatalf("event should be die, not %#v", dieEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
logDone("events - filters using container id")
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestEventsFilterContainerName(t *testing.T) {
|
||||||
|
since := time.Now().Unix()
|
||||||
|
defer deleteAllContainers()
|
||||||
|
|
||||||
|
_, _, err := runCommandWithOutput(exec.Command(dockerBinary, "run", "--name", "container_1", "busybox", "true"))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, _, err = runCommandWithOutput(exec.Command(dockerBinary, "run", "--name", "container_2", "busybox", "true"))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, s := range []string{"container_1", "container_2"} {
|
||||||
|
eventsCmd := exec.Command(dockerBinary, "events", fmt.Sprintf("--since=%d", since), fmt.Sprintf("--until=%d", time.Now().Unix()), "--filter", fmt.Sprintf("container=%s", s))
|
||||||
|
out, _, err := runCommandWithOutput(eventsCmd)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Failed to get events, error : %s(%s)", err, out)
|
||||||
|
}
|
||||||
|
events := strings.Split(out, "\n")
|
||||||
|
events = events[:len(events)-1]
|
||||||
|
if len(events) == 0 || len(events) > 3 {
|
||||||
|
t.Fatalf("Expected 3 events, got %d: %v", len(events), events)
|
||||||
|
}
|
||||||
|
createEvent := strings.Fields(events[0])
|
||||||
|
if createEvent[len(createEvent)-1] != "create" {
|
||||||
|
t.Fatalf("first event should be create, not %#v", createEvent)
|
||||||
|
}
|
||||||
|
if len(events) > 1 {
|
||||||
|
startEvent := strings.Fields(events[1])
|
||||||
|
if startEvent[len(startEvent)-1] != "start" {
|
||||||
|
t.Fatalf("second event should be start, not %#v", startEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(events) == 3 {
|
||||||
|
dieEvent := strings.Fields(events[len(events)-1])
|
||||||
|
if dieEvent[len(dieEvent)-1] != "die" {
|
||||||
|
t.Fatalf("event should be die, not %#v", dieEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
logDone("events - filters using container name")
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue