Browse code

Add logdrivers to /info

This is required for swarmkit to be able to filter based on log driver.

Signed-off-by: Brian Goff <cpuguy83@gmail.com>

Brian Goff authored on 2017/04/12 06:21:21
Showing 6 changed files
... ...
@@ -238,6 +238,8 @@ type PluginsInfo struct {
238 238
 	Network []string
239 239
 	// List of Authorization plugins registered
240 240
 	Authorization []string
241
+	// List of Log plugins registered
242
+	Log []string
241 243
 }
242 244
 
243 245
 // ExecStartCheck is a temp struct used by execStart
... ...
@@ -90,6 +90,10 @@ func prettyPrintInfo(dockerCli *command.DockerCli, info types.Info) error {
90 90
 		fmt.Fprintf(dockerCli.Out(), "\n")
91 91
 	}
92 92
 
93
+	fmt.Fprintf(dockerCli.Out(), " Log:")
94
+	fmt.Fprintf(dockerCli.Out(), " %s", strings.Join(info.Plugins.Log, " "))
95
+	fmt.Fprintf(dockerCli.Out(), "\n")
96
+
93 97
 	fmt.Fprintf(dockerCli.Out(), "Swarm: %v\n", info.Swarm.LocalNodeState)
94 98
 	if info.Swarm.LocalNodeState != swarm.LocalNodeStateInactive && info.Swarm.LocalNodeState != swarm.LocalNodeStateLocked {
95 99
 		fmt.Fprintf(dockerCli.Out(), " NodeID: %s\n", info.Swarm.NodeID)
... ...
@@ -52,6 +52,7 @@ func (e *executor) Describe(ctx context.Context) (*api.NodeDescription, error) {
52 52
 	// the plugin list by default.
53 53
 	addPlugins("Network", append([]string{"overlay"}, info.Plugins.Network...))
54 54
 	addPlugins("Authorization", info.Plugins.Authorization)
55
+	addPlugins("Log", info.Plugins.Log)
55 56
 
56 57
 	// add v2 plugins
57 58
 	v2Plugins, err := e.backend.PluginManager().List(filters.NewArgs())
... ...
@@ -62,11 +63,15 @@ func (e *executor) Describe(ctx context.Context) (*api.NodeDescription, error) {
62 62
 					continue
63 63
 				}
64 64
 				plgnTyp := typ.Capability
65
-				if typ.Capability == "volumedriver" {
65
+				switch typ.Capability {
66
+				case "volumedriver":
66 67
 					plgnTyp = "Volume"
67
-				} else if typ.Capability == "networkdriver" {
68
+				case "networkdriver":
68 69
 					plgnTyp = "Network"
70
+				case "logdriver":
71
+					plgnTyp = "Log"
69 72
 				}
73
+
70 74
 				plugins[api.PluginDescription{
71 75
 					Type: plgnTyp,
72 76
 					Name: plgn.Name,
... ...
@@ -12,6 +12,7 @@ import (
12 12
 	"github.com/docker/docker/api/types"
13 13
 	"github.com/docker/docker/cli/debug"
14 14
 	"github.com/docker/docker/container"
15
+	"github.com/docker/docker/daemon/logger"
15 16
 	"github.com/docker/docker/dockerversion"
16 17
 	"github.com/docker/docker/pkg/fileutils"
17 18
 	"github.com/docker/docker/pkg/parsers/kernel"
... ...
@@ -175,6 +176,7 @@ func (daemon *Daemon) showPluginsInfo() types.PluginsInfo {
175 175
 	pluginsInfo.Volume = volumedrivers.GetDriverList()
176 176
 	pluginsInfo.Network = daemon.GetNetworkDriverList()
177 177
 	pluginsInfo.Authorization = daemon.configStore.GetAuthorizationPlugins()
178
+	pluginsInfo.Log = logger.ListDrivers()
178 179
 
179 180
 	return pluginsInfo
180 181
 }
... ...
@@ -2,6 +2,7 @@ package logger
2 2
 
3 3
 import (
4 4
 	"fmt"
5
+	"sort"
5 6
 	"sync"
6 7
 
7 8
 	containertypes "github.com/docker/docker/api/types/container"
... ...
@@ -23,6 +24,22 @@ type logdriverFactory struct {
23 23
 	m            sync.Mutex
24 24
 }
25 25
 
26
+func (lf *logdriverFactory) list() []string {
27
+	ls := make([]string, 0, len(lf.registry))
28
+	lf.m.Lock()
29
+	for name := range lf.registry {
30
+		ls = append(ls, name)
31
+	}
32
+	lf.m.Unlock()
33
+	sort.Strings(ls)
34
+	return ls
35
+}
36
+
37
+// ListDrivers gets the list of registered log driver names
38
+func ListDrivers() []string {
39
+	return factory.list()
40
+}
41
+
26 42
 func (lf *logdriverFactory) register(name string, c Creator) error {
27 43
 	if lf.driverRegistered(name) {
28 44
 		return fmt.Errorf("logger: log driver named '%s' is already registered", name)
... ...
@@ -1,9 +1,13 @@
1 1
 package main
2 2
 
3 3
 import (
4
+	"encoding/json"
5
+	"net/http"
4 6
 	"strings"
5 7
 
8
+	"github.com/docker/docker/api/types"
6 9
 	"github.com/docker/docker/integration-cli/checker"
10
+	"github.com/docker/docker/integration-cli/request"
7 11
 	"github.com/go-check/check"
8 12
 )
9 13
 
... ...
@@ -25,3 +29,21 @@ func (s *DockerSuite) TestPluginLogDriver(c *check.C) {
25 25
 	dockerCmd(c, "plugin", "disable", pluginName)
26 26
 	dockerCmd(c, "plugin", "rm", pluginName)
27 27
 }
28
+
29
+// Make sure log drivers are listed in info, and v2 plugins are not.
30
+func (s *DockerSuite) TestPluginLogDriverInfoList(c *check.C) {
31
+	testRequires(c, IsAmd64, DaemonIsLinux)
32
+	pluginName := "cpuguy83/docker-logdriver-test"
33
+
34
+	dockerCmd(c, "plugin", "install", pluginName)
35
+	status, body, err := request.SockRequest("GET", "/info", nil, daemonHost())
36
+	c.Assert(status, checker.Equals, http.StatusOK)
37
+	c.Assert(err, checker.IsNil)
38
+
39
+	var info types.Info
40
+	err = json.Unmarshal(body, &info)
41
+	c.Assert(err, checker.IsNil)
42
+	drivers := strings.Join(info.Plugins.Log, " ")
43
+	c.Assert(drivers, checker.Contains, "json-file")
44
+	c.Assert(drivers, checker.Not(checker.Contains), pluginName)
45
+}