Fix system prune warning missing filters from config-file
The warning, printed before runing docker system prune was missing any filter that was set in the configuration file. In addition, the warning prefixes the filters with `label=`, which is no longer accurate, now that the prune command also supports "until" as a filter. Before this change, only the filters set on the command-line were shown, and any filter set in the configuration file was missing; ``` mkdir -p ./test-config echo '{"pruneFilters": ["label!=never=remove-me", "label=remove=me"]}' > test-config/config.json docker --config=./test-config system prune --filter until=24h --filter label=hello-world --filter label!=foo=bar --filter label=bar=baz WARNING! This will remove: - all stopped containers - all networks not used by at least one container - all dangling images - all dangling build cache - Elements to be pruned will be filtered with: - label={"label":{"bar=baz":true,"hello-world":true},"label!":{"foo=bar":true},"until":{"24h":true}} Are you sure you want to continue? [y/N] ``` With this patch applied, both options from the commandline and options set in the configuration file are shown; ``` mkdir -p ./test-config echo '{"pruneFilters": ["label!=never=remove-me", "label=remove=me"]}' > test-config/config.json docker --config=./test-config system prune --filter until=24h --filter label=hello-world --filter label!=foo=bar --filter label=bar=baz WARNING! This will remove: - all stopped containers - all networks not used by at least one container - all dangling images - all dangling build cache - Elements to be pruned will be filtered with: - filter={"label":{"bar=baz":true,"hello-world":true,"remove=me":true},"label!":{"foo=bar":true,"never=remove-me":true},"until":{"24h":true}} ``` Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
parent
80918147ff
commit
4a0218bb11
@ -13,6 +13,7 @@ import (
|
|||||||
"github.com/docker/cli/cli/command/network"
|
"github.com/docker/cli/cli/command/network"
|
||||||
"github.com/docker/cli/cli/command/volume"
|
"github.com/docker/cli/cli/command/volume"
|
||||||
"github.com/docker/cli/opts"
|
"github.com/docker/cli/opts"
|
||||||
|
"github.com/docker/docker/api/types/filters"
|
||||||
"github.com/docker/docker/api/types/versions"
|
"github.com/docker/docker/api/types/versions"
|
||||||
units "github.com/docker/go-units"
|
units "github.com/docker/go-units"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
@ -63,7 +64,7 @@ func runPrune(dockerCli command.Cli, options pruneOptions) error {
|
|||||||
if options.pruneVolumes && options.filter.Value().Contains("until") {
|
if options.pruneVolumes && options.filter.Value().Contains("until") {
|
||||||
return fmt.Errorf(`ERROR: The "until" filter is not supported with "--volumes"`)
|
return fmt.Errorf(`ERROR: The "until" filter is not supported with "--volumes"`)
|
||||||
}
|
}
|
||||||
if !options.force && !command.PromptForConfirmation(dockerCli.In(), dockerCli.Out(), confirmationMessage(options)) {
|
if !options.force && !command.PromptForConfirmation(dockerCli.In(), dockerCli.Out(), confirmationMessage(dockerCli, options)) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
pruneFuncs := []func(dockerCli command.Cli, all bool, filter opts.FilterOpt) (uint64, string, error){
|
pruneFuncs := []func(dockerCli command.Cli, all bool, filter opts.FilterOpt) (uint64, string, error){
|
||||||
@ -96,7 +97,7 @@ func runPrune(dockerCli command.Cli, options pruneOptions) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// confirmationMessage constructs a confirmation message that depends on the cli options.
|
// confirmationMessage constructs a confirmation message that depends on the cli options.
|
||||||
func confirmationMessage(options pruneOptions) string {
|
func confirmationMessage(dockerCli command.Cli, options pruneOptions) string {
|
||||||
t := template.Must(template.New("confirmation message").Parse(confirmationTemplate))
|
t := template.Must(template.New("confirmation message").Parse(confirmationTemplate))
|
||||||
|
|
||||||
warnings := []string{
|
warnings := []string{
|
||||||
@ -118,9 +119,14 @@ func confirmationMessage(options pruneOptions) string {
|
|||||||
warnings = append(warnings, "all dangling build cache")
|
warnings = append(warnings, "all dangling build cache")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if len(options.filter.String()) > 0 {
|
pruneFilters := command.PruneFilters(dockerCli, options.filter.Value())
|
||||||
|
if pruneFilters.Len() > 0 {
|
||||||
|
f, err := filters.ToJSON(pruneFilters)
|
||||||
|
if err != nil {
|
||||||
|
f = "invalid filters"
|
||||||
|
}
|
||||||
warnings = append(warnings, "Elements to be pruned will be filtered with:")
|
warnings = append(warnings, "Elements to be pruned will be filtered with:")
|
||||||
warnings = append(warnings, "label="+options.filter.String())
|
warnings = append(warnings, "filter="+f)
|
||||||
}
|
}
|
||||||
|
|
||||||
var buffer bytes.Buffer
|
var buffer bytes.Buffer
|
||||||
|
@ -3,6 +3,7 @@ package system
|
|||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/docker/cli/cli/config/configfile"
|
||||||
"github.com/docker/cli/internal/test"
|
"github.com/docker/cli/internal/test"
|
||||||
"gotest.tools/assert"
|
"gotest.tools/assert"
|
||||||
is "gotest.tools/assert/cmp"
|
is "gotest.tools/assert/cmp"
|
||||||
@ -11,6 +12,7 @@ import (
|
|||||||
func TestPrunePromptPre131DoesNotIncludeBuildCache(t *testing.T) {
|
func TestPrunePromptPre131DoesNotIncludeBuildCache(t *testing.T) {
|
||||||
cli := test.NewFakeCli(&fakeClient{version: "1.30"})
|
cli := test.NewFakeCli(&fakeClient{version: "1.30"})
|
||||||
cmd := newPruneCommand(cli)
|
cmd := newPruneCommand(cli)
|
||||||
|
cmd.SetArgs([]string{})
|
||||||
assert.NilError(t, cmd.Execute())
|
assert.NilError(t, cmd.Execute())
|
||||||
expected := `WARNING! This will remove:
|
expected := `WARNING! This will remove:
|
||||||
- all stopped containers
|
- all stopped containers
|
||||||
@ -18,5 +20,23 @@ func TestPrunePromptPre131DoesNotIncludeBuildCache(t *testing.T) {
|
|||||||
- all dangling images
|
- all dangling images
|
||||||
Are you sure you want to continue? [y/N] `
|
Are you sure you want to continue? [y/N] `
|
||||||
assert.Check(t, is.Equal(expected, cli.OutBuffer().String()))
|
assert.Check(t, is.Equal(expected, cli.OutBuffer().String()))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPrunePromptFilters(t *testing.T) {
|
||||||
|
cli := test.NewFakeCli(&fakeClient{version: "1.30"})
|
||||||
|
cli.SetConfigFile(&configfile.ConfigFile{
|
||||||
|
PruneFilters: []string{"label!=never=remove-me", "label=remove=me"},
|
||||||
|
})
|
||||||
|
cmd := newPruneCommand(cli)
|
||||||
|
cmd.SetArgs([]string{"--filter", "until=24h", "--filter", "label=hello-world", "--filter", "label!=foo=bar", "--filter", "label=bar=baz"})
|
||||||
|
|
||||||
|
assert.NilError(t, cmd.Execute())
|
||||||
|
expected := `WARNING! This will remove:
|
||||||
|
- all stopped containers
|
||||||
|
- all networks not used by at least one container
|
||||||
|
- all dangling images
|
||||||
|
- Elements to be pruned will be filtered with:
|
||||||
|
- filter={"label":{"bar=baz":true,"hello-world":true,"remove=me":true},"label!":{"foo=bar":true,"never=remove-me":true},"until":{"24h":true}}
|
||||||
|
Are you sure you want to continue? [y/N] `
|
||||||
|
assert.Check(t, is.Equal(expected, cli.OutBuffer().String()))
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user