diff --git a/cmd/podman/secrets/rm.go b/cmd/podman/secrets/rm.go index 3cf23ce3c5..6370304599 100644 --- a/cmd/podman/secrets/rm.go +++ b/cmd/podman/secrets/rm.go @@ -29,6 +29,7 @@ func init() { }) flags := rmCmd.Flags() flags.BoolVarP(&rmOptions.All, "all", "a", false, "Remove all secrets") + flags.BoolVarP(&rmOptions.Ignore, "ignore", "i", false, "Ignore errors when a specified secret is missing") } var ( diff --git a/docs/source/markdown/podman-secret-rm.1.md b/docs/source/markdown/podman-secret-rm.1.md index 5f439987a2..6720dc1c3d 100644 --- a/docs/source/markdown/podman-secret-rm.1.md +++ b/docs/source/markdown/podman-secret-rm.1.md @@ -26,6 +26,9 @@ Remove all existing secrets. Print usage statement. +#### **--ignore**, **-i** +Ignore errors when specified secrets are not present. + ## EXAMPLES ``` diff --git a/pkg/domain/entities/secrets.go b/pkg/domain/entities/secrets.go index 66e1857361..ce3fac8d8e 100644 --- a/pkg/domain/entities/secrets.go +++ b/pkg/domain/entities/secrets.go @@ -34,7 +34,8 @@ type SecretListReport struct { } type SecretRmOptions struct { - All bool + All bool + Ignore bool } type SecretRmReport struct { diff --git a/pkg/domain/infra/abi/secrets.go b/pkg/domain/infra/abi/secrets.go index a3228d0bf0..a61e914d66 100644 --- a/pkg/domain/infra/abi/secrets.go +++ b/pkg/domain/infra/abi/secrets.go @@ -167,10 +167,12 @@ func (ic *ContainerEngine) SecretRm(ctx context.Context, nameOrIDs []string, opt for _, nameOrID := range toRemove { deletedID, err := manager.Delete(nameOrID) if err == nil || strings.Contains(err.Error(), "no such secret") { - reports = append(reports, &entities.SecretRmReport{ - Err: err, - ID: deletedID, - }) + if !options.Ignore { + reports = append(reports, &entities.SecretRmReport{ + Err: err, + ID: deletedID, + }) + } continue } else { return nil, err diff --git a/pkg/domain/infra/tunnel/secrets.go b/pkg/domain/infra/tunnel/secrets.go index d1fd6486ca..4776f65326 100644 --- a/pkg/domain/infra/tunnel/secrets.go +++ b/pkg/domain/infra/tunnel/secrets.go @@ -77,10 +77,12 @@ func (ic *ContainerEngine) SecretRm(ctx context.Context, nameOrIDs []string, opt return nil, err } if errModel.ResponseCode == 404 { - allRm = append(allRm, &entities.SecretRmReport{ - Err: fmt.Errorf("no secret with name or id %q: no such secret ", name), - ID: "", - }) + if !options.Ignore { + allRm = append(allRm, &entities.SecretRmReport{ + Err: fmt.Errorf("no secret with name or id %q: no such secret ", name), + ID: "", + }) + } continue } } diff --git a/test/e2e/secret_test.go b/test/e2e/secret_test.go index c5c9746b91..fdea3694c5 100644 --- a/test/e2e/secret_test.go +++ b/test/e2e/secret_test.go @@ -336,6 +336,18 @@ var _ = Describe("Podman secret", func() { Expect(session.OutputToStringArray()).To(HaveLen(1)) }) + It("podman secret rm --ignore", func() { + remove := podmanTest.Podman([]string{"secret", "rm", "non-existent-secret"}) + remove.WaitWithDefaultTimeout() + Expect(remove).Should(Not(Exit(0))) + Expect(remove.ErrorToString()).To(Equal("Error: no secret with name or id \"non-existent-secret\": no such secret")) + + ignoreRm := podmanTest.Podman([]string{"secret", "rm", "--ignore", "non-existent-secret"}) + ignoreRm.WaitWithDefaultTimeout() + Expect(ignoreRm).Should(Exit(0)) + Expect(ignoreRm.ErrorToString()).To(BeEmpty()) + }) + It("podman secret creates from environment variable", func() { // no env variable set, should fail session := podmanTest.Podman([]string{"secret", "create", "--env", "a", "MYENVVAR"})