From 5e6405334c3d0422b5ec7cd09ef9c58d8f558dba Mon Sep 17 00:00:00 2001 From: Jakub Guzik Date: Wed, 12 May 2021 00:39:01 +0200 Subject: Add support for cli network prune --filter flag Signed-off-by: Jakub Guzik --- cmd/podman/networks/prune.go | 16 ++++++--- docs/source/markdown/podman-network-ls.1.md | 2 +- docs/source/markdown/podman-network-prune.1.md | 14 ++++++++ test/e2e/network_test.go | 46 ++++++++++++++++++++++++++ 4 files changed, 73 insertions(+), 5 deletions(-) diff --git a/cmd/podman/networks/prune.go b/cmd/podman/networks/prune.go index ebba06db5..bcc55f0f4 100644 --- a/cmd/podman/networks/prune.go +++ b/cmd/podman/networks/prune.go @@ -6,6 +6,7 @@ import ( "os" "strings" + "github.com/containers/common/pkg/completion" "github.com/containers/podman/v3/cmd/podman/common" "github.com/containers/podman/v3/cmd/podman/registry" "github.com/containers/podman/v3/cmd/podman/utils" @@ -31,12 +32,14 @@ var ( var ( networkPruneOptions entities.NetworkPruneOptions force bool + filter = []string{} ) -func networkPruneFlags(flags *pflag.FlagSet) { - //TODO: Not implemented but for future reference - //flags.StringSliceVar(&networkPruneOptions.Filters,"filters", []string{}, "provide filter values (e.g. 'until=')") +func networkPruneFlags(cmd *cobra.Command, flags *pflag.FlagSet) { flags.BoolVarP(&force, "force", "f", false, "do not prompt for confirmation") + filterFlagName := "filter" + flags.StringArrayVar(&filter, filterFlagName, []string{}, "Provide filter values (e.g. 'label==')") + _ = cmd.RegisterFlagCompletionFunc(filterFlagName, completion.AutocompleteNone) } func init() { @@ -46,12 +49,13 @@ func init() { Parent: networkCmd, }) flags := networkPruneCommand.Flags() - networkPruneFlags(flags) + networkPruneFlags(networkPruneCommand, flags) } func networkPrune(cmd *cobra.Command, _ []string) error { var ( errs utils.OutputErrors + err error ) if !force { reader := bufio.NewReader(os.Stdin) @@ -65,6 +69,10 @@ func networkPrune(cmd *cobra.Command, _ []string) error { return nil } } + networkPruneOptions.Filters, err = common.ParseFilters(filter) + if err != nil { + return err + } responses, err := registry.ContainerEngine().NetworkPrune(registry.Context(), networkPruneOptions) if err != nil { setExitCode(err) diff --git a/docs/source/markdown/podman-network-ls.1.md b/docs/source/markdown/podman-network-ls.1.md index a5c6ff0c0..b7fd13ec6 100644 --- a/docs/source/markdown/podman-network-ls.1.md +++ b/docs/source/markdown/podman-network-ls.1.md @@ -13,7 +13,7 @@ Displays a list of existing podman networks. #### **--filter**, **-f** Filter output based on conditions given. -Multiple filters can be given with multiple uses of the --filter flag. +Multiple filters can be given with multiple uses of the --filter option. Filters with the same key work inclusive with the only exception being `label` which is exclusive. Filters with different keys always work exclusive. diff --git a/docs/source/markdown/podman-network-prune.1.md b/docs/source/markdown/podman-network-prune.1.md index af0a7295d..e18ffaaea 100644 --- a/docs/source/markdown/podman-network-prune.1.md +++ b/docs/source/markdown/podman-network-prune.1.md @@ -16,6 +16,20 @@ the so-called default network which goes by the name of *podman*. Do not prompt for confirmation +#### **--filter** + +Filter output based on conditions given. +Multiple filters can be given with multiple uses of the --filter option. +Filters with the same key work inclusive with the only exception being +`label` which is exclusive. Filters with different keys always work exclusive. + +Valid filters are listed below: + +| **Filter** | **Description** | +| ---------- | ------------------------------------------------------------------------------------- | +| label | [Key] or [Key=Value] Label assigned to a network | +| until | only remove networks created before given timestamp | + ## EXAMPLE Prune networks diff --git a/test/e2e/network_test.go b/test/e2e/network_test.go index ff2e1eb66..6f28d7e19 100644 --- a/test/e2e/network_test.go +++ b/test/e2e/network_test.go @@ -584,6 +584,52 @@ var _ = Describe("Podman network", func() { Expect(nc.ExitCode()).To(Equal(0)) }) + It("podman network prune --filter", func() { + net1 := "macvlan" + stringid.GenerateNonCryptoID() + "net1" + + nc := podmanTest.Podman([]string{"network", "create", net1}) + nc.WaitWithDefaultTimeout() + defer podmanTest.removeCNINetwork(net1) + Expect(nc.ExitCode()).To(Equal(0)) + + list := podmanTest.Podman([]string{"network", "ls", "--format", "{{.Name}}"}) + list.WaitWithDefaultTimeout() + Expect(list.ExitCode()).To(BeZero()) + + Expect(StringInSlice(net1, list.OutputToStringArray())).To(BeTrue()) + if !isRootless() { + Expect(StringInSlice("podman", list.OutputToStringArray())).To(BeTrue()) + } + + // -f needed only to skip y/n question + prune := podmanTest.Podman([]string{"network", "prune", "-f", "--filter", "until=50"}) + prune.WaitWithDefaultTimeout() + Expect(prune.ExitCode()).To(BeZero()) + + listAgain := podmanTest.Podman([]string{"network", "ls", "--format", "{{.Name}}"}) + listAgain.WaitWithDefaultTimeout() + Expect(listAgain.ExitCode()).To(BeZero()) + + Expect(StringInSlice(net1, listAgain.OutputToStringArray())).To(BeTrue()) + if !isRootless() { + Expect(StringInSlice("podman", list.OutputToStringArray())).To(BeTrue()) + } + + // -f needed only to skip y/n question + prune = podmanTest.Podman([]string{"network", "prune", "-f", "--filter", "until=5000000000000"}) + prune.WaitWithDefaultTimeout() + Expect(prune.ExitCode()).To(BeZero()) + + listAgain = podmanTest.Podman([]string{"network", "ls", "--format", "{{.Name}}"}) + listAgain.WaitWithDefaultTimeout() + Expect(listAgain.ExitCode()).To(BeZero()) + + Expect(StringInSlice(net1, listAgain.OutputToStringArray())).To(BeFalse()) + if !isRootless() { + Expect(StringInSlice("podman", list.OutputToStringArray())).To(BeTrue()) + } + }) + It("podman network prune", func() { // Create two networks // Check they are there -- cgit v1.2.3-54-g00ecf