diff --git a/cmd/podman/containers/pause.go b/cmd/podman/containers/pause.go index 3dd6585958..4b0ae5fe36 100644 --- a/cmd/podman/containers/pause.go +++ b/cmd/podman/containers/pause.go @@ -63,7 +63,7 @@ func pauseFlags(cmd *cobra.Command) { _ = cmd.RegisterFlagCompletionFunc(cidfileFlagName, completion.AutocompleteDefault) filterFlagName := "filter" - flags.StringSliceVarP(&filters, filterFlagName, "f", []string{}, "Filter output based on conditions given") + flags.StringArrayVarP(&filters, filterFlagName, "f", []string{}, "Filter output based on conditions given") _ = cmd.RegisterFlagCompletionFunc(filterFlagName, common.AutocompletePsFilters) if registry.IsRemote() { diff --git a/cmd/podman/containers/ps.go b/cmd/podman/containers/ps.go index 6487f0fe21..05df8faa6e 100644 --- a/cmd/podman/containers/ps.go +++ b/cmd/podman/containers/ps.go @@ -76,7 +76,7 @@ func listFlagSet(cmd *cobra.Command) { flags.BoolVar(&listOpts.External, "external", false, "Show containers in storage not controlled by Podman") filterFlagName := "filter" - flags.StringSliceVarP(&filters, filterFlagName, "f", []string{}, "Filter output based on conditions given") + flags.StringArrayVarP(&filters, filterFlagName, "f", []string{}, "Filter output based on conditions given") _ = cmd.RegisterFlagCompletionFunc(filterFlagName, common.AutocompletePsFilters) formatFlagName := "format" diff --git a/cmd/podman/containers/restart.go b/cmd/podman/containers/restart.go index b4886575a2..83b9cda142 100644 --- a/cmd/podman/containers/restart.go +++ b/cmd/podman/containers/restart.go @@ -66,7 +66,7 @@ func restartFlags(cmd *cobra.Command) { _ = cmd.RegisterFlagCompletionFunc(cidfileFlagName, completion.AutocompleteDefault) filterFlagName := "filter" - flags.StringSliceVarP(&filters, filterFlagName, "f", []string{}, "Filter output based on conditions given") + flags.StringArrayVarP(&filters, filterFlagName, "f", []string{}, "Filter output based on conditions given") _ = cmd.RegisterFlagCompletionFunc(filterFlagName, common.AutocompletePsFilters) timeFlagName := "time" diff --git a/cmd/podman/containers/rm.go b/cmd/podman/containers/rm.go index fcd9935fc6..7bb90d3c60 100644 --- a/cmd/podman/containers/rm.go +++ b/cmd/podman/containers/rm.go @@ -75,7 +75,7 @@ func rmFlags(cmd *cobra.Command) { _ = cmd.RegisterFlagCompletionFunc(cidfileFlagName, completion.AutocompleteDefault) filterFlagName := "filter" - flags.StringSliceVar(&filters, filterFlagName, []string{}, "Filter output based on conditions given") + flags.StringArrayVar(&filters, filterFlagName, []string{}, "Filter output based on conditions given") _ = cmd.RegisterFlagCompletionFunc(filterFlagName, common.AutocompletePsFilters) if !registry.IsRemote() { diff --git a/cmd/podman/containers/start.go b/cmd/podman/containers/start.go index b67a5ae547..1e1f68f72d 100644 --- a/cmd/podman/containers/start.go +++ b/cmd/podman/containers/start.go @@ -61,7 +61,7 @@ func startFlags(cmd *cobra.Command) { flags.BoolVar(&startOptions.SigProxy, "sig-proxy", false, "Proxy received signals to the process (default true if attaching, false otherwise)") filterFlagName := "filter" - flags.StringSliceVarP(&filters, filterFlagName, "f", []string{}, "Filter output based on conditions given") + flags.StringArrayVarP(&filters, filterFlagName, "f", []string{}, "Filter output based on conditions given") _ = cmd.RegisterFlagCompletionFunc(filterFlagName, common.AutocompletePsFilters) flags.BoolVar(&startOptions.All, "all", false, "Start all containers regardless of their state or configuration") diff --git a/cmd/podman/containers/stop.go b/cmd/podman/containers/stop.go index a03f681fbe..2afcfdb2b5 100644 --- a/cmd/podman/containers/stop.go +++ b/cmd/podman/containers/stop.go @@ -71,7 +71,7 @@ func stopFlags(cmd *cobra.Command) { _ = cmd.RegisterFlagCompletionFunc(timeFlagName, completion.AutocompleteNone) filterFlagName := "filter" - flags.StringSliceVarP(&filters, filterFlagName, "f", []string{}, "Filter output based on conditions given") + flags.StringArrayVarP(&filters, filterFlagName, "f", []string{}, "Filter output based on conditions given") _ = cmd.RegisterFlagCompletionFunc(filterFlagName, common.AutocompletePsFilters) if registry.IsRemote() { diff --git a/cmd/podman/containers/unpause.go b/cmd/podman/containers/unpause.go index 00f2294472..68ef8e1f54 100644 --- a/cmd/podman/containers/unpause.go +++ b/cmd/podman/containers/unpause.go @@ -64,7 +64,7 @@ func unpauseFlags(cmd *cobra.Command) { _ = cmd.RegisterFlagCompletionFunc(cidfileFlagName, completion.AutocompleteDefault) filterFlagName := "filter" - flags.StringSliceVarP(&filters, filterFlagName, "f", []string{}, "Filter output based on conditions given") + flags.StringArrayVarP(&filters, filterFlagName, "f", []string{}, "Filter output based on conditions given") _ = cmd.RegisterFlagCompletionFunc(filterFlagName, common.AutocompletePsFilters) if registry.IsRemote() { diff --git a/cmd/podman/images/list.go b/cmd/podman/images/list.go index 1c464d91c6..d8804e8a56 100644 --- a/cmd/podman/images/list.go +++ b/cmd/podman/images/list.go @@ -89,7 +89,7 @@ func imageListFlagSet(cmd *cobra.Command) { flags.BoolVarP(&listOptions.All, "all", "a", false, "Show all images (default hides intermediate images)") filterFlagName := "filter" - flags.StringSliceVarP(&listOptions.Filter, filterFlagName, "f", []string{}, "Filter output based on conditions provided (default [])") + flags.StringArrayVarP(&listOptions.Filter, filterFlagName, "f", []string{}, "Filter output based on conditions provided (default [])") _ = cmd.RegisterFlagCompletionFunc(filterFlagName, common.AutocompleteImageFilters) formatFlagName := "format" diff --git a/cmd/podman/images/search.go b/cmd/podman/images/search.go index 5e41ee1853..f88f8df042 100644 --- a/cmd/podman/images/search.go +++ b/cmd/podman/images/search.go @@ -84,7 +84,7 @@ func searchFlags(cmd *cobra.Command) { flags := cmd.Flags() filterFlagName := "filter" - flags.StringSliceVarP(&searchOptions.Filters, filterFlagName, "f", []string{}, "Filter output based on conditions provided (default [])") + flags.StringArrayVarP(&searchOptions.Filters, filterFlagName, "f", []string{}, "Filter output based on conditions provided (default [])") _ = cmd.RegisterFlagCompletionFunc(filterFlagName, common.AutocompleteImageSearchFilters) formatFlagName := "format" diff --git a/cmd/podman/pods/ps.go b/cmd/podman/pods/ps.go index 405d7cdc03..893058643e 100644 --- a/cmd/podman/pods/ps.go +++ b/cmd/podman/pods/ps.go @@ -53,7 +53,7 @@ func init() { flags.BoolVar(&psInput.CtrStatus, "ctr-status", false, "Display the container status") filterFlagName := "filter" - flags.StringSliceVarP(&inputFilters, filterFlagName, "f", []string{}, "Filter output based on conditions given") + flags.StringArrayVarP(&inputFilters, filterFlagName, "f", []string{}, "Filter output based on conditions given") _ = psCmd.RegisterFlagCompletionFunc(filterFlagName, common.AutocompletePodPsFilters) formatFlagName := "format" diff --git a/cmd/podman/secrets/list.go b/cmd/podman/secrets/list.go index f028442bca..382e0b820f 100644 --- a/cmd/podman/secrets/list.go +++ b/cmd/podman/secrets/list.go @@ -50,7 +50,7 @@ func init() { _ = lsCmd.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteFormat(&entities.SecretInfoReport{})) filterFlagName := "filter" - flags.StringSliceVarP(&listFlag.filter, filterFlagName, "f", []string{}, "Filter secret output") + flags.StringArrayVarP(&listFlag.filter, filterFlagName, "f", []string{}, "Filter secret output") _ = lsCmd.RegisterFlagCompletionFunc(filterFlagName, common.AutocompleteSecretFilters) noHeadingFlagName := "noheading" diff --git a/cmd/podman/volumes/create.go b/cmd/podman/volumes/create.go index f443327a15..cfc2d0bcf9 100644 --- a/cmd/podman/volumes/create.go +++ b/cmd/podman/volumes/create.go @@ -48,7 +48,7 @@ func init() { _ = createCommand.RegisterFlagCompletionFunc(driverFlagName, completion.AutocompleteNone) labelFlagName := "label" - flags.StringSliceVarP(&opts.Label, labelFlagName, "l", []string{}, "Set metadata for a volume (default [])") + flags.StringArrayVarP(&opts.Label, labelFlagName, "l", []string{}, "Set metadata for a volume (default [])") _ = createCommand.RegisterFlagCompletionFunc(labelFlagName, completion.AutocompleteNone) optFlagName := "opt" diff --git a/cmd/podman/volumes/list.go b/cmd/podman/volumes/list.go index 6afb9f66ea..28f0669638 100644 --- a/cmd/podman/volumes/list.go +++ b/cmd/podman/volumes/list.go @@ -51,7 +51,7 @@ func init() { flags := lsCommand.Flags() filterFlagName := "filter" - flags.StringSliceVarP(&cliOpts.Filter, filterFlagName, "f", []string{}, "Filter volume output") + flags.StringArrayVarP(&cliOpts.Filter, filterFlagName, "f", []string{}, "Filter volume output") _ = lsCommand.RegisterFlagCompletionFunc(filterFlagName, common.AutocompleteVolumeFilters) formatFlagName := "format" diff --git a/test/e2e/images_test.go b/test/e2e/images_test.go index 7b10797e15..23e15defb9 100644 --- a/test/e2e/images_test.go +++ b/test/e2e/images_test.go @@ -392,6 +392,16 @@ LABEL "com.example.vendor"="Example Vendor" Expect(output).To(Equal("[]")) }) + It("podman images --filter label=with,comma", func() { + dockerfile := `FROM quay.io/libpod/alpine:latest +` + podmanTest.BuildImageWithLabel(dockerfile, "foobar.com/before:latest", "false", "test=with,comma") + result := podmanTest.Podman([]string{"images", "--filter", "label=test=with,comma"}) + result.WaitWithDefaultTimeout() + Expect(result).Should(Exit(0)) + Expect(result.OutputToStringArray()).To(HaveLen(2)) + }) + It("podman images --filter readonly", func() { dockerfile := `FROM quay.io/libpod/alpine:latest ` diff --git a/test/e2e/pause_test.go b/test/e2e/pause_test.go index c3ec08a6c6..b02d2c1e25 100644 --- a/test/e2e/pause_test.go +++ b/test/e2e/pause_test.go @@ -437,7 +437,7 @@ var _ = Describe("Podman pause", func() { Expect(session1).Should(Exit(0)) cid2 := session1.OutputToString() - session1 = podmanTest.RunTopContainer("") + session1 = podmanTest.RunTopContainerWithArgs("", []string{"--label", "test=with,comma"}) session1.WaitWithDefaultTimeout() Expect(session1).Should(Exit(0)) cid3 := session1.OutputToString() @@ -451,6 +451,16 @@ var _ = Describe("Podman pause", func() { session1.WaitWithDefaultTimeout() Expect(session1).Should(Exit(125)) + session1 = podmanTest.Podman([]string{"pause", "-a", "--filter", "label=test=with,comma"}) + session1.WaitWithDefaultTimeout() + Expect(session1).Should(Exit(0)) + Expect(session1.OutputToString()).To(BeEquivalentTo(cid3)) + + session1 = podmanTest.Podman([]string{"unpause", "-a", "--filter", "label=test=with,comma"}) + session1.WaitWithDefaultTimeout() + Expect(session1).Should(Exit(0)) + Expect(session1.OutputToString()).To(BeEquivalentTo(cid3)) + session1 = podmanTest.Podman([]string{"pause", "-a", "--filter", fmt.Sprintf("id=%swrongid", shortCid3)}) session1.WaitWithDefaultTimeout() Expect(session1).Should(Exit(0)) diff --git a/test/e2e/pod_ps_test.go b/test/e2e/pod_ps_test.go index be58397c6e..dea23ee55f 100644 --- a/test/e2e/pod_ps_test.go +++ b/test/e2e/pod_ps_test.go @@ -87,7 +87,7 @@ var _ = Describe("Podman ps", func() { It("podman pod ps --filter until", func() { name := "mypod" - _, ec, _ := podmanTest.CreatePod(map[string][]string{"--name": {name}}) + _, ec, _ := podmanTest.CreatePod(map[string][]string{"--name": {name}, "--label": {"test=with,comma"}}) Expect(ec).To(Equal(0)) result := podmanTest.Podman([]string{"pod", "ps", "--filter", "until=50"}) @@ -99,6 +99,11 @@ var _ = Describe("Podman ps", func() { result.WaitWithDefaultTimeout() Expect(result).Should(Exit(0)) Expect(result.OutputToString()).To(ContainSubstring(name)) + + result = podmanTest.Podman([]string{"pod", "ps", "--filter", "label=test=with,comma"}) + result.WaitWithDefaultTimeout() + Expect(result).Should(Exit(0)) + Expect(result.OutputToString()).To(ContainSubstring(name)) }) It("podman pod ps filter name regexp", func() { diff --git a/test/e2e/ps_test.go b/test/e2e/ps_test.go index 93deff75e1..a6e322fc3e 100644 --- a/test/e2e/ps_test.go +++ b/test/e2e/ps_test.go @@ -190,6 +190,26 @@ var _ = Describe("Podman ps", func() { Expect(actual).ToNot(ContainSubstring("table")) }) + It("podman ps --filter label=test=with,comma", func() { + ctrAlpha := "first" + container := podmanTest.Podman([]string{"run", "-dt", "--label", "test=with,comma", "--name", ctrAlpha, ALPINE, "top"}) + container.WaitWithDefaultTimeout() + Expect(container).Should(Exit(0)) + + ctrBravo := "second" + containerBravo := podmanTest.Podman([]string{"run", "-dt", "--name", ctrBravo, ALPINE, "top"}) + containerBravo.WaitWithDefaultTimeout() + Expect(containerBravo).Should(Exit(0)) + + result := podmanTest.Podman([]string{"ps", "-a", "--format", "table {{.Names}}", "--filter", "label=test=with,comma"}) + result.WaitWithDefaultTimeout() + result.WaitWithDefaultTimeout() + Expect(result).Should(Exit(0)) + actual := result.OutputToString() + Expect(actual).To(ContainSubstring("first")) + Expect(actual).ToNot(ContainSubstring("table")) + }) + It("podman ps namespace flag", func() { _, ec, _ := podmanTest.RunLsContainer("") Expect(ec).To(Equal(0)) diff --git a/test/e2e/restart_test.go b/test/e2e/restart_test.go index 89bd08448a..7c31f84fb8 100644 --- a/test/e2e/restart_test.go +++ b/test/e2e/restart_test.go @@ -311,7 +311,7 @@ var _ = Describe("Podman restart", func() { Expect(session1).Should(Exit(0)) cid2 := session1.OutputToString() - session1 = podmanTest.RunTopContainer("") + session1 = podmanTest.RunTopContainerWithArgs("", []string{"--label", "test=with,comma"}) session1.WaitWithDefaultTimeout() Expect(session1).Should(Exit(0)) cid3 := session1.OutputToString() @@ -331,6 +331,11 @@ var _ = Describe("Podman restart", func() { Expect(session1).Should(Exit(0)) Expect(session1.OutputToString()).To(BeEquivalentTo(cid3)) + session1 = podmanTest.Podman([]string{"restart", "-a", "--filter", "label=test=with,comma"}) + session1.WaitWithDefaultTimeout() + Expect(session1).Should(Exit(0)) + Expect(session1.OutputToString()).To(BeEquivalentTo(cid3)) + session1 = podmanTest.Podman([]string{"restart", "-f", fmt.Sprintf("id=%s", cid2)}) session1.WaitWithDefaultTimeout() Expect(session1).Should(Exit(0)) diff --git a/test/e2e/rm_test.go b/test/e2e/rm_test.go index d276ed838f..554c458714 100644 --- a/test/e2e/rm_test.go +++ b/test/e2e/rm_test.go @@ -292,6 +292,11 @@ var _ = Describe("Podman rm", func() { cid3 := session1.OutputToString() shortCid3 := cid3[0:5] + session1 = podmanTest.RunTopContainerWithArgs("test4", []string{"--label", "test=with,comma"}) + session1.WaitWithDefaultTimeout() + Expect(session1).Should(Exit(0)) + cid4 := session1.OutputToString() + session1 = podmanTest.Podman([]string{"rm", cid1, "-f", "--filter", "status=running"}) session1.WaitWithDefaultTimeout() Expect(session1).Should(Exit(125)) @@ -311,5 +316,10 @@ var _ = Describe("Podman rm", func() { session1.WaitWithDefaultTimeout() Expect(session1).Should(Exit(0)) Expect(session1.OutputToString()).To(BeEquivalentTo(cid2)) + + session1 = podmanTest.Podman([]string{"rm", "-f", "--filter", "label=test=with,comma"}) + session1.WaitWithDefaultTimeout() + Expect(session1).Should(Exit(0)) + Expect(session1.OutputToString()).To(BeEquivalentTo(cid4)) }) }) diff --git a/test/e2e/secret_test.go b/test/e2e/secret_test.go index 6ec05d938a..f57f62780d 100644 --- a/test/e2e/secret_test.go +++ b/test/e2e/secret_test.go @@ -229,7 +229,7 @@ var _ = Describe("Podman secret", func() { Expect(list.OutputToStringArray()).To(HaveLen(2)) Expect(list.OutputToStringArray()[1]).To(ContainSubstring(secrID2)) - list = podmanTest.Podman([]string{"secret", "ls", "--filter", fmt.Sprintf("name=%s,name=%s", secret1, secret2)}) + list = podmanTest.Podman([]string{"secret", "ls", "--filter", fmt.Sprintf("name=%s", secret1), "--filter", fmt.Sprintf("name=%s", secret2)}) list.WaitWithDefaultTimeout() Expect(list).Should(Exit(0)) Expect(list.OutputToStringArray()).To(HaveLen(3)) diff --git a/test/e2e/start_test.go b/test/e2e/start_test.go index 1f2603b5ac..90df80656e 100644 --- a/test/e2e/start_test.go +++ b/test/e2e/start_test.go @@ -208,6 +208,11 @@ var _ = Describe("Podman start", func() { cid3 := session1.OutputToString() shortCid3 := cid3[0:5] + session1 = podmanTest.Podman([]string{"container", "create", "--label", "test=with,comma", ALPINE}) + session1.WaitWithDefaultTimeout() + Expect(session1).Should(Exit(0)) + cid4 := session1.OutputToString() + session1 = podmanTest.Podman([]string{"start", cid1, "-f", "status=running"}) session1.WaitWithDefaultTimeout() Expect(session1).Should(Exit(0)) @@ -223,6 +228,11 @@ var _ = Describe("Podman start", func() { Expect(session1).Should(Exit(0)) Expect(session1.OutputToString()).To(BeEquivalentTo(cid3)) + session1 = podmanTest.Podman([]string{"start", "--all", "--filter", "label=test=with,comma"}) + session1.WaitWithDefaultTimeout() + Expect(session1).Should(Exit(0)) + Expect(session1.OutputToString()).To(BeEquivalentTo(cid4)) + session1 = podmanTest.Podman([]string{"start", "-f", fmt.Sprintf("id=%s", cid2)}) session1.WaitWithDefaultTimeout() Expect(session1).Should(Exit(0)) diff --git a/test/e2e/stop_test.go b/test/e2e/stop_test.go index d1e6a8edd4..c707444072 100644 --- a/test/e2e/stop_test.go +++ b/test/e2e/stop_test.go @@ -382,6 +382,11 @@ var _ = Describe("Podman stop", func() { cid3 := session1.OutputToString() shortCid3 := cid3[0:5] + session1 = podmanTest.Podman([]string{"container", "create", "--label", "test=with,comma", ALPINE}) + session1.WaitWithDefaultTimeout() + Expect(session1).Should(Exit(0)) + cid4 := session1.OutputToString() + session1 = podmanTest.Podman([]string{"start", "--all"}) session1.WaitWithDefaultTimeout() Expect(session1).Should(Exit(0)) @@ -400,6 +405,11 @@ var _ = Describe("Podman stop", func() { Expect(session1).Should(Exit(0)) Expect(session1.OutputToString()).To(BeEquivalentTo(cid3)) + session1 = podmanTest.Podman([]string{"stop", "-a", "--filter", "label=test=with,comma"}) + session1.WaitWithDefaultTimeout() + Expect(session1).Should(Exit(0)) + Expect(session1.OutputToString()).To(BeEquivalentTo(cid4)) + session1 = podmanTest.Podman([]string{"stop", "-f", fmt.Sprintf("id=%s", cid2)}) session1.WaitWithDefaultTimeout() Expect(session1).Should(Exit(0)) diff --git a/test/e2e/volume_ls_test.go b/test/e2e/volume_ls_test.go index 0d6a9599fe..7601780ada 100644 --- a/test/e2e/volume_ls_test.go +++ b/test/e2e/volume_ls_test.go @@ -26,6 +26,17 @@ var _ = Describe("Podman volume ls", func() { Expect(session.OutputToStringArray()).To(HaveLen(2)) }) + It("podman ls volume filter with comma label", func() { + session := podmanTest.Podman([]string{"volume", "create", "--label", "test=with,comma", "myvol3"}) + session.WaitWithDefaultTimeout() + Expect(session).Should(Exit(0)) + + session = podmanTest.Podman([]string{"volume", "ls", "--filter", "label=test=with,comma"}) + session.WaitWithDefaultTimeout() + Expect(session).Should(Exit(0)) + Expect(session.OutputToStringArray()).To(HaveLen(2)) + }) + It("podman ls volume filter with a key pattern", func() { session := podmanTest.Podman([]string{"volume", "create", "--label", "helloworld=world", "myvol2"}) session.WaitWithDefaultTimeout()