diff --git a/pkg/fission-cli/cmd/canaryconfig/command.go b/pkg/fission-cli/cmd/canaryconfig/command.go index 782a315e..a479d29e 100644 --- a/pkg/fission-cli/cmd/canaryconfig/command.go +++ b/pkg/fission-cli/cmd/canaryconfig/command.go @@ -65,7 +65,7 @@ func Commands() *cobra.Command { } wrapper.SetFlags(deleteCmd, flag.FlagSet{ Required: []flag.Flag{flag.CanaryName}, - Optional: []flag.Flag{flag.NamespaceCanary}, + Optional: []flag.Flag{flag.NamespaceCanary, flag.IgnoreNotFound}, }) listCmd := &cobra.Command{ diff --git a/pkg/fission-cli/cmd/canaryconfig/delete.go b/pkg/fission-cli/cmd/canaryconfig/delete.go index ea57f343..9d9fa797 100644 --- a/pkg/fission-cli/cmd/canaryconfig/delete.go +++ b/pkg/fission-cli/cmd/canaryconfig/delete.go @@ -25,6 +25,7 @@ import ( "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" + "github.com/fission/fission/pkg/fission-cli/util" ) type DeleteSubCommand struct { @@ -43,6 +44,9 @@ func (opts *DeleteSubCommand) run(input cli.Input) error { err := opts.Client().V1().CanaryConfig().Delete(m) if err != nil { + if input.Bool(flagkey.IgnoreNotFound) && util.IsNotFound(err) { + return nil + } return errors.Wrap(err, "error deleting canary config") } diff --git a/pkg/fission-cli/cmd/environment/command.go b/pkg/fission-cli/cmd/environment/command.go index 4d040bf4..b430206b 100644 --- a/pkg/fission-cli/cmd/environment/command.go +++ b/pkg/fission-cli/cmd/environment/command.go @@ -72,7 +72,7 @@ func Commands() *cobra.Command { } wrapper.SetFlags(deleteCmd, flag.FlagSet{ Required: []flag.Flag{flag.EnvName}, - Optional: []flag.Flag{flag.NamespaceEnvironment}, + Optional: []flag.Flag{flag.NamespaceEnvironment, flag.IgnoreNotFound}, }) listCmd := &cobra.Command{ diff --git a/pkg/fission-cli/cmd/environment/delete.go b/pkg/fission-cli/cmd/environment/delete.go index 00e23085..bc3b4b05 100644 --- a/pkg/fission-cli/cmd/environment/delete.go +++ b/pkg/fission-cli/cmd/environment/delete.go @@ -25,6 +25,7 @@ import ( "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" + "github.com/fission/fission/pkg/fission-cli/util" ) type DeleteSubCommand struct { @@ -43,6 +44,9 @@ func (opts *DeleteSubCommand) do(input cli.Input) error { err := opts.Client().V1().Environment().Delete(m) if err != nil { + if input.Bool(flagkey.IgnoreNotFound) && util.IsNotFound(err) { + return nil + } return errors.Wrap(err, "error deleting environment") } diff --git a/pkg/fission-cli/cmd/function/command.go b/pkg/fission-cli/cmd/function/command.go index b0735ced..a2273db5 100644 --- a/pkg/fission-cli/cmd/function/command.go +++ b/pkg/fission-cli/cmd/function/command.go @@ -110,7 +110,7 @@ func Commands() *cobra.Command { } wrapper.SetFlags(deleteCmd, flag.FlagSet{ Required: []flag.Flag{flag.FnName}, - Optional: []flag.Flag{flag.NamespaceFunction}, + Optional: []flag.Flag{flag.NamespaceFunction, flag.IgnoreNotFound}, }) listCmd := &cobra.Command{ diff --git a/pkg/fission-cli/cmd/function/delete.go b/pkg/fission-cli/cmd/function/delete.go index 3e8bcd30..35b66bfc 100644 --- a/pkg/fission-cli/cmd/function/delete.go +++ b/pkg/fission-cli/cmd/function/delete.go @@ -25,6 +25,7 @@ import ( "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" + "github.com/fission/fission/pkg/fission-cli/util" ) type DeleteSubCommand struct { @@ -43,6 +44,9 @@ func (opts *DeleteSubCommand) do(input cli.Input) error { err := opts.Client().V1().Function().Delete(m) if err != nil { + if input.Bool(flagkey.IgnoreNotFound) && util.IsNotFound(err) { + return nil + } return errors.Wrap(err, fmt.Sprintf("delete function '%v'", m.Name)) } diff --git a/pkg/fission-cli/cmd/httptrigger/command.go b/pkg/fission-cli/cmd/httptrigger/command.go index 006d6a29..7780d358 100644 --- a/pkg/fission-cli/cmd/httptrigger/command.go +++ b/pkg/fission-cli/cmd/httptrigger/command.go @@ -68,7 +68,7 @@ func Commands() *cobra.Command { RunE: wrapper.Wrapper(Delete), } wrapper.SetFlags(deleteCmd, flag.FlagSet{ - Optional: []flag.Flag{flag.HtName, flag.HtFnFilter, flag.NamespaceTrigger}, + Optional: []flag.Flag{flag.HtName, flag.HtFnFilter, flag.NamespaceTrigger, flag.IgnoreNotFound}, }) listCmd := &cobra.Command{ diff --git a/pkg/fission-cli/cmd/httptrigger/delete.go b/pkg/fission-cli/cmd/httptrigger/delete.go index a4a5d857..d734e02b 100644 --- a/pkg/fission-cli/cmd/httptrigger/delete.go +++ b/pkg/fission-cli/cmd/httptrigger/delete.go @@ -26,6 +26,7 @@ import ( "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" + "github.com/fission/fission/pkg/fission-cli/util" "github.com/fission/fission/pkg/utils" ) @@ -94,6 +95,9 @@ func (opts *DeleteSubCommand) run(input cli.Input) error { } if errs.ErrorOrNil() != nil { + if input.Bool(flagkey.IgnoreNotFound) && util.IsNotFound(err) { + return nil + } return errors.Wrap(errs.ErrorOrNil(), "error deleting trigger(s)") } diff --git a/pkg/fission-cli/cmd/kubewatch/command.go b/pkg/fission-cli/cmd/kubewatch/command.go index fe5e3438..0715ffcc 100644 --- a/pkg/fission-cli/cmd/kubewatch/command.go +++ b/pkg/fission-cli/cmd/kubewatch/command.go @@ -44,7 +44,7 @@ func Commands() *cobra.Command { } wrapper.SetFlags(deleteCmd, flag.FlagSet{ Required: []flag.Flag{flag.KwFnName}, - Optional: []flag.Flag{flag.NamespaceTrigger}, + Optional: []flag.Flag{flag.NamespaceTrigger, flag.IgnoreNotFound}, }) listCmd := &cobra.Command{ diff --git a/pkg/fission-cli/cmd/kubewatch/delete.go b/pkg/fission-cli/cmd/kubewatch/delete.go index de8a3664..8f6f8721 100644 --- a/pkg/fission-cli/cmd/kubewatch/delete.go +++ b/pkg/fission-cli/cmd/kubewatch/delete.go @@ -25,6 +25,7 @@ import ( "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" + "github.com/fission/fission/pkg/fission-cli/util" ) type DeleteSubCommand struct { @@ -57,6 +58,9 @@ func (opts *DeleteSubCommand) run(input cli.Input) error { Namespace: opts.namespace, }) if err != nil { + if input.Bool(flagkey.IgnoreNotFound) && util.IsNotFound(err) { + return nil + } return errors.Wrap(err, "error deleting kubewatch") } diff --git a/pkg/fission-cli/cmd/mqtrigger/command.go b/pkg/fission-cli/cmd/mqtrigger/command.go index ad15e91d..f8cbdcc9 100644 --- a/pkg/fission-cli/cmd/mqtrigger/command.go +++ b/pkg/fission-cli/cmd/mqtrigger/command.go @@ -60,7 +60,7 @@ func Commands() *cobra.Command { } wrapper.SetFlags(deleteCmd, flag.FlagSet{ Required: []flag.Flag{flag.MqtName}, - Optional: []flag.Flag{flag.NamespaceTrigger}, + Optional: []flag.Flag{flag.NamespaceTrigger, flag.IgnoreNotFound}, }) listCmd := &cobra.Command{ diff --git a/pkg/fission-cli/cmd/mqtrigger/delete.go b/pkg/fission-cli/cmd/mqtrigger/delete.go index 81650af5..44fe768b 100644 --- a/pkg/fission-cli/cmd/mqtrigger/delete.go +++ b/pkg/fission-cli/cmd/mqtrigger/delete.go @@ -25,6 +25,7 @@ import ( "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" + "github.com/fission/fission/pkg/fission-cli/util" ) type DeleteSubCommand struct { @@ -55,6 +56,9 @@ func (opts *DeleteSubCommand) complete(input cli.Input) error { func (opts *DeleteSubCommand) run(input cli.Input) error { err := opts.Client().V1().MessageQueueTrigger().Delete(opts.metadata) if err != nil { + if input.Bool(flagkey.IgnoreNotFound) && util.IsNotFound(err) { + return nil + } return errors.Wrap(err, "error deleting message queue trigger") } diff --git a/pkg/fission-cli/cmd/package/command.go b/pkg/fission-cli/cmd/package/command.go index d5c8978b..1d7f16b8 100644 --- a/pkg/fission-cli/cmd/package/command.go +++ b/pkg/fission-cli/cmd/package/command.go @@ -74,7 +74,7 @@ func Commands() *cobra.Command { RunE: wrapper.Wrapper(Delete), } wrapper.SetFlags(deleteCmd, flag.FlagSet{ - Optional: []flag.Flag{flag.PkgName, flag.PkgForce, flag.PkgOrphan, flag.NamespacePackage}, + Optional: []flag.Flag{flag.PkgName, flag.PkgForce, flag.PkgOrphan, flag.NamespacePackage, flag.IgnoreNotFound}, }) listCmd := &cobra.Command{ diff --git a/pkg/fission-cli/cmd/package/delete.go b/pkg/fission-cli/cmd/package/delete.go index d68910e2..7becc4a5 100644 --- a/pkg/fission-cli/cmd/package/delete.go +++ b/pkg/fission-cli/cmd/package/delete.go @@ -26,6 +26,7 @@ import ( "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" + "github.com/fission/fission/pkg/fission-cli/util" ) type DeleteSubCommand struct { @@ -68,6 +69,9 @@ func (opts *DeleteSubCommand) run(input cli.Input) error { Name: opts.name, }) if err != nil { + if input.Bool(flagkey.IgnoreNotFound) && util.IsNotFound(err) { + return nil + } return errors.Wrap(err, "find package") } diff --git a/pkg/fission-cli/cmd/timetrigger/command.go b/pkg/fission-cli/cmd/timetrigger/command.go index 4614f3c1..10b34f41 100644 --- a/pkg/fission-cli/cmd/timetrigger/command.go +++ b/pkg/fission-cli/cmd/timetrigger/command.go @@ -53,7 +53,7 @@ func Commands() *cobra.Command { } wrapper.SetFlags(deleteCmd, flag.FlagSet{ Required: []flag.Flag{flag.TtName}, - Optional: []flag.Flag{flag.NamespaceTrigger}, + Optional: []flag.Flag{flag.NamespaceTrigger, flag.IgnoreNotFound}, }) listCmd := &cobra.Command{ diff --git a/pkg/fission-cli/cmd/timetrigger/delete.go b/pkg/fission-cli/cmd/timetrigger/delete.go index dfcbca5d..b366f401 100644 --- a/pkg/fission-cli/cmd/timetrigger/delete.go +++ b/pkg/fission-cli/cmd/timetrigger/delete.go @@ -25,6 +25,7 @@ import ( "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" + "github.com/fission/fission/pkg/fission-cli/util" ) type DeleteSubCommand struct { @@ -43,6 +44,9 @@ func (opts *DeleteSubCommand) do(input cli.Input) error { err := opts.Client().V1().TimeTrigger().Delete(m) if err != nil { + if input.Bool(flagkey.IgnoreNotFound) && util.IsNotFound(err) { + return nil + } return errors.Wrap(err, "error deleting trigger") } diff --git a/pkg/fission-cli/flag/flag.go b/pkg/fission-cli/flag/flag.go index 70e2b0df..70545f9d 100644 --- a/pkg/fission-cli/flag/flag.go +++ b/pkg/fission-cli/flag/flag.go @@ -76,6 +76,8 @@ var ( KubeContext = Flag{Type: String, Name: flagkey.KubeContext, Usage: "Kubernetes context to be used for the execution of Fission commands", DefaultValue: ""} + IgnoreNotFound = Flag{Type: Bool, Name: flagkey.IgnoreNotFound, Usage: "Treat \"resource not found\" as a successful delete.", DefaultValue: false} + Labels = Flag{Type: String, Name: flagkey.Labels, Usage: "Comma separated labels to apply to the function. E.g. --labels=\"environment=dev,application=analytics\""} Annotation = Flag{Type: StringSlice, Name: flagkey.Annotation, Usage: "Annotation to apply to the function. To mention multiple annotations --annotation=\"abc.com/team=dev\" --annotation=\"foo=bar\""} diff --git a/pkg/fission-cli/flag/key/key.go b/pkg/fission-cli/flag/key/key.go index 34f80650..e3c477f2 100644 --- a/pkg/fission-cli/flag/key/key.go +++ b/pkg/fission-cli/flag/key/key.go @@ -29,6 +29,8 @@ const ( Labels = "labels" Annotation = "annotation" + IgnoreNotFound = "ignorenotfound" + NamespaceFunction = "fnNamespace" NamespaceEnvironment = "envNamespace" NamespacePackage = "pkgNamespace" diff --git a/pkg/fission-cli/util/errcheck.go b/pkg/fission-cli/util/errcheck.go new file mode 100644 index 00000000..84fa8fdb --- /dev/null +++ b/pkg/fission-cli/util/errcheck.go @@ -0,0 +1,25 @@ +/* +Copyright 2021 The Fission Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package util + +import ( + "strings" +) + +func IsNotFound(err error) bool { + return strings.HasSuffix(strings.TrimSpace(err.Error()), "not found") +}