Merge pull request #10568 from LK4D4/logging_drivers

Logging drivers
This commit is contained in:
Arnaud Porterie
2015-03-17 09:45:58 -07:00
23 changed files with 615 additions and 50 deletions
+166
View File
@@ -11,6 +11,7 @@ import (
"path/filepath"
"strings"
"testing"
"time"
"github.com/docker/libtrust"
)
@@ -560,3 +561,168 @@ func TestDaemonRestartRenameContainer(t *testing.T) {
logDone("daemon - rename persists through daemon restart")
}
func TestDaemonLoggingDriverDefault(t *testing.T) {
d := NewDaemon(t)
if err := d.StartWithBusybox(); err != nil {
t.Fatal(err)
}
defer d.Stop()
out, err := d.Cmd("run", "-d", "busybox", "echo", "testline")
if err != nil {
t.Fatal(out, err)
}
id := strings.TrimSpace(out)
if out, err := d.Cmd("wait", id); err != nil {
t.Fatal(out, err)
}
logPath := filepath.Join(d.folder, "graph", "containers", id, id+"-json.log")
if _, err := os.Stat(logPath); err != nil {
t.Fatal(err)
}
f, err := os.Open(logPath)
if err != nil {
t.Fatal(err)
}
var res struct {
Log string `json:log`
Stream string `json:stream`
Time time.Time `json:time`
}
if err := json.NewDecoder(f).Decode(&res); err != nil {
t.Fatal(err)
}
if res.Log != "testline\n" {
t.Fatalf("Unexpected log line: %q, expected: %q", res.Log, "testline\n")
}
if res.Stream != "stdout" {
t.Fatalf("Unexpected stream: %q, expected: %q", res.Stream, "stdout")
}
if !time.Now().After(res.Time) {
t.Fatalf("Log time %v in future", res.Time)
}
logDone("daemon - default 'json-file' logging driver")
}
func TestDaemonLoggingDriverDefaultOverride(t *testing.T) {
d := NewDaemon(t)
if err := d.StartWithBusybox(); err != nil {
t.Fatal(err)
}
defer d.Stop()
out, err := d.Cmd("run", "-d", "--log-driver=none", "busybox", "echo", "testline")
if err != nil {
t.Fatal(out, err)
}
id := strings.TrimSpace(out)
if out, err := d.Cmd("wait", id); err != nil {
t.Fatal(out, err)
}
logPath := filepath.Join(d.folder, "graph", "containers", id, id+"-json.log")
if _, err := os.Stat(logPath); err == nil || !os.IsNotExist(err) {
t.Fatalf("%s shouldn't exits, error on Stat: %s", logPath, err)
}
logDone("daemon - default logging driver override in run")
}
func TestDaemonLoggingDriverNone(t *testing.T) {
d := NewDaemon(t)
if err := d.StartWithBusybox("--log-driver=none"); err != nil {
t.Fatal(err)
}
defer d.Stop()
out, err := d.Cmd("run", "-d", "busybox", "echo", "testline")
if err != nil {
t.Fatal(out, err)
}
id := strings.TrimSpace(out)
if out, err := d.Cmd("wait", id); err != nil {
t.Fatal(out, err)
}
logPath := filepath.Join(d.folder, "graph", "containers", id, id+"-json.log")
if _, err := os.Stat(logPath); err == nil || !os.IsNotExist(err) {
t.Fatalf("%s shouldn't exits, error on Stat: %s", logPath, err)
}
logDone("daemon - 'none' logging driver")
}
func TestDaemonLoggingDriverNoneOverride(t *testing.T) {
d := NewDaemon(t)
if err := d.StartWithBusybox("--log-driver=none"); err != nil {
t.Fatal(err)
}
defer d.Stop()
out, err := d.Cmd("run", "-d", "--log-driver=json-file", "busybox", "echo", "testline")
if err != nil {
t.Fatal(out, err)
}
id := strings.TrimSpace(out)
if out, err := d.Cmd("wait", id); err != nil {
t.Fatal(out, err)
}
logPath := filepath.Join(d.folder, "graph", "containers", id, id+"-json.log")
if _, err := os.Stat(logPath); err != nil {
t.Fatal(err)
}
f, err := os.Open(logPath)
if err != nil {
t.Fatal(err)
}
var res struct {
Log string `json:log`
Stream string `json:stream`
Time time.Time `json:time`
}
if err := json.NewDecoder(f).Decode(&res); err != nil {
t.Fatal(err)
}
if res.Log != "testline\n" {
t.Fatalf("Unexpected log line: %q, expected: %q", res.Log, "testline\n")
}
if res.Stream != "stdout" {
t.Fatalf("Unexpected stream: %q, expected: %q", res.Stream, "stdout")
}
if !time.Now().After(res.Time) {
t.Fatalf("Log time %v in future", res.Time)
}
logDone("daemon - 'none' logging driver override in run")
}
func TestDaemonLoggingDriverNoneLogsError(t *testing.T) {
d := NewDaemon(t)
if err := d.StartWithBusybox("--log-driver=none"); err != nil {
t.Fatal(err)
}
defer d.Stop()
out, err := d.Cmd("run", "-d", "busybox", "echo", "testline")
if err != nil {
t.Fatal(out, err)
}
id := strings.TrimSpace(out)
out, err = d.Cmd("logs", id)
if err == nil {
t.Fatalf("Logs should fail with \"none\" driver")
}
if !strings.Contains(out, `\"logs\" command is supported only for \"json-file\" logging driver`) {
t.Fatalf("There should be error about non-json-file driver, got %s", out)
}
logDone("daemon - logs not available for non-json-file drivers")
}