Use warnings provided by daemon

Warnings are now generated by the daemon, and returned as
part of the /info API response.

If warnings are returned by the daemon; use those instead
of generating them locally.

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
Sebastiaan van Stijn 2018-07-19 19:45:04 +02:00
parent 7da71329bc
commit 3c27ce21c9
No known key found for this signature in database
GPG Key ID: 76698F39D527CE8C
2 changed files with 99 additions and 48 deletions

View File

@ -206,45 +206,7 @@ func prettyPrintInfo(dockerCli command.Cli, info types.Info) error {
fmt.Fprintln(dockerCli.Out(), "Live Restore Enabled:", info.LiveRestoreEnabled) fmt.Fprintln(dockerCli.Out(), "Live Restore Enabled:", info.LiveRestoreEnabled)
fmt.Fprint(dockerCli.Out(), "\n") fmt.Fprint(dockerCli.Out(), "\n")
// Only output these warnings if the server does not support these features printWarnings(dockerCli, info)
if info.OSType != "windows" {
printStorageDriverWarnings(dockerCli, info)
if !info.MemoryLimit {
fmt.Fprintln(dockerCli.Err(), "WARNING: No memory limit support")
}
if !info.SwapLimit {
fmt.Fprintln(dockerCli.Err(), "WARNING: No swap limit support")
}
if !info.KernelMemory {
fmt.Fprintln(dockerCli.Err(), "WARNING: No kernel memory limit support")
}
if !info.OomKillDisable {
fmt.Fprintln(dockerCli.Err(), "WARNING: No oom kill disable support")
}
if !info.CPUCfsQuota {
fmt.Fprintln(dockerCli.Err(), "WARNING: No cpu cfs quota support")
}
if !info.CPUCfsPeriod {
fmt.Fprintln(dockerCli.Err(), "WARNING: No cpu cfs period support")
}
if !info.CPUShares {
fmt.Fprintln(dockerCli.Err(), "WARNING: No cpu shares support")
}
if !info.CPUSet {
fmt.Fprintln(dockerCli.Err(), "WARNING: No cpuset support")
}
if !info.IPv4Forwarding {
fmt.Fprintln(dockerCli.Err(), "WARNING: IPv4 forwarding is disabled")
}
if !info.BridgeNfIptables {
fmt.Fprintln(dockerCli.Err(), "WARNING: bridge-nf-call-iptables is disabled")
}
if !info.BridgeNfIP6tables {
fmt.Fprintln(dockerCli.Err(), "WARNING: bridge-nf-call-ip6tables is disabled")
}
}
return nil return nil
} }
@ -315,11 +277,73 @@ func printSwarmInfo(dockerCli command.Cli, info types.Info) {
} }
} }
func printWarnings(dockerCli command.Cli, info types.Info) {
if len(info.Warnings) > 0 {
fmt.Fprintln(dockerCli.Err(), strings.Join(info.Warnings, "\n"))
return
}
// daemon didn't return warnings. Fallback to old behavior
printStorageDriverWarnings(dockerCli, info)
printWarningsLegacy(dockerCli, info)
}
// printWarningsLegacy generates warnings based on information returned by the daemon.
// DEPRECATED: warnings are now generated by the daemon, and returned in
// info.Warnings. This function is used to provide backward compatibility with
// daemons that do not provide these warnings. No new warnings should be added
// here.
func printWarningsLegacy(dockerCli command.Cli, info types.Info) {
if info.OSType == "windows" {
return
}
if !info.MemoryLimit {
fmt.Fprintln(dockerCli.Err(), "WARNING: No memory limit support")
}
if !info.SwapLimit {
fmt.Fprintln(dockerCli.Err(), "WARNING: No swap limit support")
}
if !info.KernelMemory {
fmt.Fprintln(dockerCli.Err(), "WARNING: No kernel memory limit support")
}
if !info.OomKillDisable {
fmt.Fprintln(dockerCli.Err(), "WARNING: No oom kill disable support")
}
if !info.CPUCfsQuota {
fmt.Fprintln(dockerCli.Err(), "WARNING: No cpu cfs quota support")
}
if !info.CPUCfsPeriod {
fmt.Fprintln(dockerCli.Err(), "WARNING: No cpu cfs period support")
}
if !info.CPUShares {
fmt.Fprintln(dockerCli.Err(), "WARNING: No cpu shares support")
}
if !info.CPUSet {
fmt.Fprintln(dockerCli.Err(), "WARNING: No cpuset support")
}
if !info.IPv4Forwarding {
fmt.Fprintln(dockerCli.Err(), "WARNING: IPv4 forwarding is disabled")
}
if !info.BridgeNfIptables {
fmt.Fprintln(dockerCli.Err(), "WARNING: bridge-nf-call-iptables is disabled")
}
if !info.BridgeNfIP6tables {
fmt.Fprintln(dockerCli.Err(), "WARNING: bridge-nf-call-ip6tables is disabled")
}
}
// printStorageDriverWarnings generates warnings based on storage-driver information
// returned by the daemon.
// DEPRECATED: warnings are now generated by the daemon, and returned in
// info.Warnings. This function is used to provide backward compatibility with
// daemons that do not provide these warnings. No new warnings should be added
// here.
func printStorageDriverWarnings(dockerCli command.Cli, info types.Info) { func printStorageDriverWarnings(dockerCli command.Cli, info types.Info) {
if info.OSType == "windows" {
return
}
if info.DriverStatus == nil { if info.DriverStatus == nil {
return return
} }
for _, pair := range info.DriverStatus { for _, pair := range info.DriverStatus {
if pair[0] == "Data loop file" { if pair[0] == "Data loop file" {
fmt.Fprintf(dockerCli.Err(), "WARNING: %s: usage of loopback devices is "+ fmt.Fprintf(dockerCli.Err(), "WARNING: %s: usage of loopback devices is "+

View File

@ -207,32 +207,59 @@ func TestPrettyPrintInfo(t *testing.T) {
infoWithWarningsLinux.BridgeNfIptables = false infoWithWarningsLinux.BridgeNfIptables = false
infoWithWarningsLinux.BridgeNfIP6tables = false infoWithWarningsLinux.BridgeNfIP6tables = false
sampleInfoDaemonWarnings := sampleInfoNoSwarm
sampleInfoDaemonWarnings.Warnings = []string{
"WARNING: No memory limit support",
"WARNING: No swap limit support",
"WARNING: No kernel memory limit support",
"WARNING: No oom kill disable support",
"WARNING: No cpu cfs quota support",
"WARNING: No cpu cfs period support",
"WARNING: No cpu shares support",
"WARNING: No cpuset support",
"WARNING: IPv4 forwarding is disabled",
"WARNING: bridge-nf-call-iptables is disabled",
"WARNING: bridge-nf-call-ip6tables is disabled",
}
for _, tc := range []struct { for _, tc := range []struct {
doc string
dockerInfo types.Info dockerInfo types.Info
expectedGolden string expectedGolden string
warningsGolden string warningsGolden string
}{ }{
{ {
doc: "info without swarm",
dockerInfo: sampleInfoNoSwarm, dockerInfo: sampleInfoNoSwarm,
expectedGolden: "docker-info-no-swarm", expectedGolden: "docker-info-no-swarm",
}, },
{ {
doc: "info with swarm",
dockerInfo: infoWithSwarm, dockerInfo: infoWithSwarm,
expectedGolden: "docker-info-with-swarm", expectedGolden: "docker-info-with-swarm",
}, },
{ {
doc: "info with legacy warnings",
dockerInfo: infoWithWarningsLinux, dockerInfo: infoWithWarningsLinux,
expectedGolden: "docker-info-no-swarm", expectedGolden: "docker-info-no-swarm",
warningsGolden: "docker-info-warnings", warningsGolden: "docker-info-warnings",
}, },
{
doc: "info with daemon warnings",
dockerInfo: sampleInfoDaemonWarnings,
expectedGolden: "docker-info-no-swarm",
warningsGolden: "docker-info-warnings",
},
} { } {
cli := test.NewFakeCli(&fakeClient{}) t.Run(tc.doc, func(t *testing.T) {
assert.NilError(t, prettyPrintInfo(cli, tc.dockerInfo)) cli := test.NewFakeCli(&fakeClient{})
golden.Assert(t, cli.OutBuffer().String(), tc.expectedGolden+".golden") assert.NilError(t, prettyPrintInfo(cli, tc.dockerInfo))
if tc.warningsGolden != "" { golden.Assert(t, cli.OutBuffer().String(), tc.expectedGolden+".golden")
golden.Assert(t, cli.ErrBuffer().String(), tc.warningsGolden+".golden") if tc.warningsGolden != "" {
} else { golden.Assert(t, cli.ErrBuffer().String(), tc.warningsGolden+".golden")
assert.Check(t, is.Equal("", cli.ErrBuffer().String())) } else {
} assert.Check(t, is.Equal("", cli.ErrBuffer().String()))
}
})
} }
} }