- Add client debug info to the `docker info` command.
Signed-off-by: David Calavera <david.calavera@gmail.com>
| ... | ... |
@@ -7,6 +7,7 @@ import ( |
| 7 | 7 |
Cli "github.com/docker/docker/cli" |
| 8 | 8 |
"github.com/docker/docker/pkg/ioutils" |
| 9 | 9 |
flag "github.com/docker/docker/pkg/mflag" |
| 10 |
+ "github.com/docker/docker/utils" |
|
| 10 | 11 |
"github.com/docker/go-units" |
| 11 | 12 |
) |
| 12 | 13 |
|
| ... | ... |
@@ -73,8 +74,10 @@ func (cli *DockerCli) CmdInfo(args ...string) error {
|
| 73 | 73 |
ioutils.FprintfIfNotEmpty(cli.out, "Name: %s\n", info.Name) |
| 74 | 74 |
ioutils.FprintfIfNotEmpty(cli.out, "ID: %s\n", info.ID) |
| 75 | 75 |
|
| 76 |
+ fmt.Fprintf(cli.out, "Debug mode (client): %v\n", utils.IsDebugEnabled()) |
|
| 77 |
+ fmt.Fprintf(cli.out, "Debug mode (server): %v\n", info.Debug) |
|
| 78 |
+ |
|
| 76 | 79 |
if info.Debug {
|
| 77 |
- fmt.Fprintf(cli.out, "Debug mode (server): %v\n", info.Debug) |
|
| 78 | 80 |
fmt.Fprintf(cli.out, " File Descriptors: %d\n", info.NFd) |
| 79 | 81 |
fmt.Fprintf(cli.out, " Goroutines: %d\n", info.NGoroutines) |
| 80 | 82 |
fmt.Fprintf(cli.out, " System Time: %s\n", info.SystemTime) |
| 81 | 83 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,23 @@ |
| 0 |
+package main |
|
| 1 |
+ |
|
| 2 |
+import ( |
|
| 3 |
+ "os" |
|
| 4 |
+ "testing" |
|
| 5 |
+ |
|
| 6 |
+ "github.com/Sirupsen/logrus" |
|
| 7 |
+ "github.com/docker/docker/utils" |
|
| 8 |
+) |
|
| 9 |
+ |
|
| 10 |
+func TestClientDebugEnabled(t *testing.T) {
|
|
| 11 |
+ defer utils.DisableDebug() |
|
| 12 |
+ |
|
| 13 |
+ clientFlags.Common.FlagSet.Parse([]string{"-D"})
|
|
| 14 |
+ clientFlags.PostParse() |
|
| 15 |
+ |
|
| 16 |
+ if os.Getenv("DEBUG") != "1" {
|
|
| 17 |
+ t.Fatal("expected debug enabled, got false")
|
|
| 18 |
+ } |
|
| 19 |
+ if logrus.GetLevel() != logrus.DebugLevel {
|
|
| 20 |
+ t.Fatalf("expected logrus debug level, got %v", logrus.GetLevel())
|
|
| 21 |
+ } |
|
| 22 |
+} |
| ... | ... |
@@ -2095,3 +2095,24 @@ func (s *DockerDaemonSuite) TestDaemonStartWithoutColors(c *check.C) {
|
| 2095 | 2095 |
newD.Stop() |
| 2096 | 2096 |
c.Assert(b.String(), check.Not(checker.Contains), infoLog) |
| 2097 | 2097 |
} |
| 2098 |
+ |
|
| 2099 |
+func (s *DockerDaemonSuite) TestDaemonDebugLog(c *check.C) {
|
|
| 2100 |
+ testRequires(c, DaemonIsLinux) |
|
| 2101 |
+ newD := NewDaemon(c) |
|
| 2102 |
+ |
|
| 2103 |
+ debugLog := "\x1b[37mDEBU\x1b" |
|
| 2104 |
+ |
|
| 2105 |
+ p, tty, err := pty.Open() |
|
| 2106 |
+ c.Assert(err, checker.IsNil) |
|
| 2107 |
+ defer func() {
|
|
| 2108 |
+ tty.Close() |
|
| 2109 |
+ p.Close() |
|
| 2110 |
+ }() |
|
| 2111 |
+ |
|
| 2112 |
+ b := bytes.NewBuffer(nil) |
|
| 2113 |
+ go io.Copy(b, p) |
|
| 2114 |
+ |
|
| 2115 |
+ newD.StartWithLogFile(tty, "--debug") |
|
| 2116 |
+ newD.Stop() |
|
| 2117 |
+ c.Assert(b.String(), checker.Contains, debugLog) |
|
| 2118 |
+} |
| ... | ... |
@@ -146,3 +146,22 @@ func (s *DockerSuite) TestInfoDisplaysStoppedContainers(c *check.C) {
|
| 146 | 146 |
c.Assert(out, checker.Contains, fmt.Sprintf(" Paused: %d\n", 0))
|
| 147 | 147 |
c.Assert(out, checker.Contains, fmt.Sprintf(" Stopped: %d\n", 1))
|
| 148 | 148 |
} |
| 149 |
+ |
|
| 150 |
+func (s *DockerSuite) TestInfoDebug(c *check.C) {
|
|
| 151 |
+ testRequires(c, SameHostDaemon, DaemonIsLinux) |
|
| 152 |
+ |
|
| 153 |
+ d := NewDaemon(c) |
|
| 154 |
+ err := d.Start("--debug")
|
|
| 155 |
+ c.Assert(err, checker.IsNil) |
|
| 156 |
+ defer d.Stop() |
|
| 157 |
+ |
|
| 158 |
+ out, err := d.Cmd("--debug", "info")
|
|
| 159 |
+ c.Assert(err, checker.IsNil) |
|
| 160 |
+ c.Assert(out, checker.Contains, "Debug mode (client): true\n") |
|
| 161 |
+ c.Assert(out, checker.Contains, "Debug mode (server): true\n") |
|
| 162 |
+ c.Assert(out, checker.Contains, "File Descriptors") |
|
| 163 |
+ c.Assert(out, checker.Contains, "Goroutines") |
|
| 164 |
+ c.Assert(out, checker.Contains, "System Time") |
|
| 165 |
+ c.Assert(out, checker.Contains, "EventsListeners") |
|
| 166 |
+ c.Assert(out, checker.Contains, "Docker Root Dir") |
|
| 167 |
+} |
| 149 | 168 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,43 @@ |
| 0 |
+package utils |
|
| 1 |
+ |
|
| 2 |
+import ( |
|
| 3 |
+ "os" |
|
| 4 |
+ "testing" |
|
| 5 |
+ |
|
| 6 |
+ "github.com/Sirupsen/logrus" |
|
| 7 |
+) |
|
| 8 |
+ |
|
| 9 |
+func TestEnableDebug(t *testing.T) {
|
|
| 10 |
+ defer func() {
|
|
| 11 |
+ os.Setenv("DEBUG", "")
|
|
| 12 |
+ logrus.SetLevel(logrus.InfoLevel) |
|
| 13 |
+ }() |
|
| 14 |
+ EnableDebug() |
|
| 15 |
+ if os.Getenv("DEBUG") != "1" {
|
|
| 16 |
+ t.Fatalf("expected DEBUG=1, got %s\n", os.Getenv("DEBUG"))
|
|
| 17 |
+ } |
|
| 18 |
+ if logrus.GetLevel() != logrus.DebugLevel {
|
|
| 19 |
+ t.Fatalf("expected log level %v, got %v\n", logrus.DebugLevel, logrus.GetLevel())
|
|
| 20 |
+ } |
|
| 21 |
+} |
|
| 22 |
+ |
|
| 23 |
+func TestDisableDebug(t *testing.T) {
|
|
| 24 |
+ DisableDebug() |
|
| 25 |
+ if os.Getenv("DEBUG") != "" {
|
|
| 26 |
+ t.Fatalf("expected DEBUG=\"\", got %s\n", os.Getenv("DEBUG"))
|
|
| 27 |
+ } |
|
| 28 |
+ if logrus.GetLevel() != logrus.InfoLevel {
|
|
| 29 |
+ t.Fatalf("expected log level %v, got %v\n", logrus.InfoLevel, logrus.GetLevel())
|
|
| 30 |
+ } |
|
| 31 |
+} |
|
| 32 |
+ |
|
| 33 |
+func TestDebugEnabled(t *testing.T) {
|
|
| 34 |
+ EnableDebug() |
|
| 35 |
+ if !IsDebugEnabled() {
|
|
| 36 |
+ t.Fatal("expected debug enabled, got false")
|
|
| 37 |
+ } |
|
| 38 |
+ DisableDebug() |
|
| 39 |
+ if IsDebugEnabled() {
|
|
| 40 |
+ t.Fatal("expected debug disabled, got true")
|
|
| 41 |
+ } |
|
| 42 |
+} |