@@ -20,6 +20,7 @@ package commands
2020import (
2121 "errors"
2222 "fmt"
23+ "strings"
2324
2425 "github.com/apache/openwhisk-cli/wski18n"
2526 "github.com/apache/openwhisk-client-go/whisk"
@@ -286,6 +287,26 @@ var triggerDeleteCmd = &cobra.Command{
286287 err = configureFeed (qualifiedName .GetEntityName (), fullFeedName , getParameters (Flags .common .param , false , false ))
287288 if err != nil {
288289 whisk .Debug (whisk .DbgError , "configureFeed(%s, %s) failed: %s\n " , qualifiedName .GetEntityName (), fullFeedName , err )
290+
291+ // If the trigger feed does not exist, it's deleted! This error message will look like
292+ // "could not find trigger /NAMESPACE_ID/TRIGGER_NAME in the database"
293+ // OR if the feed action is not present, there's no way to clean up the feed
294+ // "The requested resource does not exist"
295+ if strings .Contains (err .Error (), "could not find trigger" ) {
296+ whisk .Debug (whisk .DbgWarn , "trigger feed is already deleted for trigger %s\n " , qualifiedName .GetEntityName ())
297+ } else if strings .Contains (err .Error (), "The requested resource does not exist" ) {
298+ whisk .Debug (whisk .DbgWarn , "trigger feed action '%s' does not exist\n " , fullFeedName )
299+ } else {
300+ errStr := wski18n .T ("Unable to delete trigger '{{.name}}': {{.err}}" ,
301+ map [string ]interface {}{"name" : qualifiedName .GetEntityName (), "err" : err })
302+
303+ if ! Flags .common .force {
304+ werr := whisk .MakeWskErrorFromWskError (errors .New (errStr ), err , whisk .EXIT_CODE_ERR_GENERAL , whisk .DISPLAY_MSG , whisk .NO_DISPLAY_USAGE )
305+ return werr
306+ } else {
307+ whisk .Debug (whisk .DbgInfo , "trigger delete is forced despite feed deletion failure\n " )
308+ }
309+ }
289310 }
290311
291312 Flags .common .param = origParams
@@ -370,7 +391,7 @@ func configureFeed(triggerName string, feedName string, parameters interface{})
370391 if err != nil {
371392 whisk .Debug (whisk .DbgError , "Invoke of action '%s' failed: %s\n " , feedName , err )
372393 errStr := wski18n .T (FEED_CONFIGURATION_FAILURE , map [string ]interface {}{"feedname" : feedName , "trigname" : triggerName , "err" : err })
373- err = whisk .MakeWskErrorFromWskError (errors .New (errStr ), err , whisk .EXIT_CODE_ERR_GENERAL , whisk .DISPLAY_MSG , whisk .DISPLAY_USAGE )
394+ err = whisk .MakeWskError (errors .New (errStr ), whisk .EXIT_CODE_ERR_GENERAL , whisk .DISPLAY_MSG , whisk .NO_DISPLAY_USAGE )
374395 } else {
375396 whisk .Debug (whisk .DbgInfo , "Successfully configured trigger feed via feed action '%s'\n " , feedName )
376397 }
@@ -405,6 +426,8 @@ func init() {
405426
406427 triggerGetCmd .Flags ().BoolVarP (& Flags .trigger .summary , "summary" , "s" , false , wski18n .T ("summarize trigger details; parameters with prefix \" *\" are bound" ))
407428
429+ triggerDeleteCmd .Flags ().BoolVarP (& Flags .common .force , "force" , "f" , false , wski18n .T ("force trigger deletion even when feed deletion fails" ))
430+
408431 triggerFireCmd .Flags ().StringSliceVarP (& Flags .common .param , "param" , "p" , []string {}, wski18n .T ("parameter values in `KEY VALUE` format" ))
409432 triggerFireCmd .Flags ().StringVarP (& Flags .common .paramFile , "param-file" , "P" , "" , wski18n .T ("`FILE` containing parameter values in JSON format" ))
410433
@@ -477,6 +500,7 @@ func (t *Trigger) Create(Client *whisk.Client, args []string) error {
477500 printFailedBlockingInvocationResponse (* feedName , false , res , err )
478501
479502 reason := wski18n .T (FEED_CONFIGURATION_FAILURE , map [string ]interface {}{"feedname" : feedName .GetFullQualifiedName (), "err" : err })
503+
480504 errStr := wski18n .T ("Unable to create trigger '{{.name}}': {{.err}}" ,
481505 map [string ]interface {}{"name" : trigger .Name , "err" : reason })
482506 werr := whisk .MakeWskErrorFromWskError (errors .New (errStr ), err , whisk .EXIT_CODE_ERR_GENERAL , whisk .DISPLAY_MSG , whisk .NO_DISPLAY_USAGE )
0 commit comments