@@ -20,7 +20,6 @@ package commands
20
20
import (
21
21
"errors"
22
22
"fmt"
23
- "os"
24
23
25
24
"github.com/apache/openwhisk-cli/wski18n"
26
25
"github.com/apache/openwhisk-client-go/whisk"
@@ -398,13 +397,15 @@ func init() {
398
397
triggerCreateCmd .Flags ().StringSliceVarP (& Flags .common .param , "param" , "p" , []string {}, wski18n .T ("parameter values in `KEY VALUE` format" ))
399
398
triggerCreateCmd .Flags ().StringVarP (& Flags .common .paramFile , "param-file" , "P" , "" , wski18n .T ("`FILE` containing parameter values in JSON format" ))
400
399
triggerCreateCmd .Flags ().StringVarP (& Flags .common .feed , "feed" , "f" , "" , wski18n .T ("trigger feed `ACTION_NAME`" ))
401
- triggerCreateCmd .Flags ().StringSliceVarP (& Flags .trigger .feedParam , "feed-param" , "F" , []string {}, wski18n .T ("parameter values in `KEY VALUE` format" ))
400
+ triggerCreateCmd .Flags ().StringSliceVarP (& Flags .trigger .feedParam , "feed-param" , "F" , []string {}, wski18n .T ("feed parameter values in `KEY VALUE` format" ))
401
+ triggerCreateCmd .Flags ().StringSliceVarP (& Flags .trigger .triggerParam , "trigger-param" , "T" , []string {}, wski18n .T ("trigger parameter values in `KEY VALUE` format" ))
402
402
403
403
triggerUpdateCmd .Flags ().StringSliceVarP (& Flags .common .annotation , "annotation" , "a" , []string {}, wski18n .T ("annotation values in `KEY VALUE` format" ))
404
404
triggerUpdateCmd .Flags ().StringVarP (& Flags .common .annotFile , "annotation-file" , "A" , "" , wski18n .T ("`FILE` containing annotation values in JSON format" ))
405
405
triggerUpdateCmd .Flags ().StringSliceVarP (& Flags .common .param , "param" , "p" , []string {}, wski18n .T ("parameter values in `KEY VALUE` format" ))
406
406
triggerUpdateCmd .Flags ().StringVarP (& Flags .common .paramFile , "param-file" , "P" , "" , wski18n .T ("`FILE` containing parameter values in JSON format" ))
407
- triggerUpdateCmd .Flags ().StringSliceVarP (& Flags .trigger .feedParam , "feed-param" , "F" , []string {}, wski18n .T ("parameter values in `KEY VALUE` format" ))
407
+ triggerUpdateCmd .Flags ().StringSliceVarP (& Flags .trigger .feedParam , "feed-param" , "F" , []string {}, wski18n .T ("feed parameter values in `KEY VALUE` format" ))
408
+ triggerUpdateCmd .Flags ().StringSliceVarP (& Flags .trigger .triggerParam , "trigger-param" , "T" , []string {}, wski18n .T ("trigger parameter values in `KEY VALUE` format" ))
408
409
409
410
triggerGetCmd .Flags ().BoolVarP (& Flags .trigger .summary , "summary" , "s" , false , wski18n .T ("summarize trigger details; parameters with prefix \" *\" are bound" ))
410
411
@@ -429,43 +430,37 @@ type Trigger struct {
429
430
}
430
431
431
432
func (t * Trigger ) Create (Client * whisk.Client , args []string ) error {
432
-
433
433
if whiskErr := CheckArgs (args , 1 , 1 , "Trigger create" ,
434
434
wski18n .T ("A trigger name is required." )); whiskErr != nil {
435
435
return whiskErr
436
436
}
437
437
438
- triggerName , err := NewQualifiedName (args [0 ])
439
- if err != nil {
440
- return NewQualifiedNameError (args [0 ], err )
441
- }
438
+ //1. if the command line arguments user provides contains only --param flags
439
+ //2. if the command line arguments user provides contains no --param flags at all
440
+ //we should process the trigger create command in the old way.
441
+ if userIndicatesToUseOldTriggerCommand () {
442
+ triggerName , err := NewQualifiedName (args [0 ])
443
+ if err != nil {
444
+ return NewQualifiedNameError (args [0 ], err )
445
+ }
442
446
443
- annotationArray := Flags .common .annotation
444
- authToken := Client .Config .AuthToken
447
+ //if user also issued new trigger command then we stop execution
448
+ if triggerUsageErr := userIssuedNewTriggerCmd (); triggerUsageErr != nil {
449
+ return triggerUsageErr
450
+ }
445
451
446
- // if a feed is specified, create additional parameters which must be passed to the feed
447
- feedQualifiedName , additionalFeedParams := feedParameters ( Flags . common . feed , FEED_CREATE , triggerName , authToken )
452
+ annotationArray := Flags . common . annotation
453
+ authToken := Client . Config . AuthToken
448
454
449
- // if a feed is specified, add feed annotation the annotations declared on the command line
450
- // TODO: add test to ensure that generated annotation has precedence
451
- if feedQualifiedName != nil {
452
- annotationArray = append (annotationArray , getFormattedJSON ("feed" , feedQualifiedName .GetFullQualifiedName ()))
453
- }
454
- annotations := getParameters (annotationArray , true , true )
455
+ // if a feed is specified, create additional parameters which must be passed to the feed
456
+ feedQualifiedName , additionalFeedParams := feedParameters (Flags .common .feed , FEED_CREATE , triggerName , authToken )
455
457
456
- //simplestTrigger indicates user are creating a trigger without any feed or parameters
457
- simplestTrigger := len (Flags .trigger .feedParam ) == 0 && len (Flags .common .param ) == 0 && len (Flags .trigger .triggerParam ) == 0
458
-
459
- //if users are 1. creating a trigger without any feed or parameters
460
- // 2. creating a trigger using --param flag
461
- //then we use the old way to create the trigger.
462
- if len (Flags .common .param ) > 0 || simplestTrigger {
463
- if len (Flags .trigger .feedParam ) > 0 || len (Flags .trigger .triggerParam ) > 0 {
464
- whisk .Debug (whisk .DbgError , "User tries to mix use of --param with --feed-param and --trigger-param" )
465
- errMsg := fmt .Sprintf ("Incorrect usage. Cannot combine --feed-param or --trigger-param flag with --param flag\n " )
466
- fmt .Fprintf (os .Stderr , "%s%s" , color .RedString ("error: " ), errors .New (errMsg ))
467
- return nil
458
+ // if a feed is specified, add feed annotation the annotations declared on the command line
459
+ // TODO: add test to ensure that generated annotation has precedence
460
+ if feedQualifiedName != nil {
461
+ annotationArray = append (annotationArray , getFormattedJSON ("feed" , feedQualifiedName .GetFullQualifiedName ()))
468
462
}
463
+ annotations := getParameters (annotationArray , true , true )
469
464
470
465
// the feed receives all the parameters that are specified on the command line so we merge
471
466
// the feed lifecycle parameters with the command line ones
@@ -518,16 +513,38 @@ func (t *Trigger) Create(Client *whisk.Client, args []string) error {
518
513
map [string ]interface {}{"ok" : color .GreenString ("ok:" ), "name" : boldString (trigger .Name )}))
519
514
return nil
520
515
}
516
+ //1. if user's input command line argument contains either --feed-param or --trigger-param
517
+ //2. if user's input command line argument contains both --feed-param and --trigger-param
518
+ //then we process trigger create command in a different way
519
+ return CreateExtendedVersion (Client , args )
520
+ }
521
+
522
+ //CreateExtendedVersion only executes when users indicate to create triggers with --feed-param
523
+ //or --trigger-param flags.
524
+ func CreateExtendedVersion (Client * whisk.Client , args []string ) error {
525
+ triggerName , err := NewQualifiedName (args [0 ])
526
+ if err != nil {
527
+ return NewQualifiedNameError (args [0 ], err )
528
+ }
529
+
530
+ annotationArray := Flags .common .annotation
531
+ authToken := Client .Config .AuthToken
532
+
533
+ // if a feed is specified, create additional parameters which must be passed to the feed
534
+ feedQualifiedName , additionalFeedParams := feedParameters (Flags .common .feed , FEED_CREATE , triggerName , authToken )
521
535
522
- //if users are using either --feed-param or --trigger-param flag,
523
- //then we know the users are trying to separate trigger and feed params and
524
- //we use the enhanced way to create trigger
536
+ // if a feed is specified, add feed annotation the annotations declared on the command line
537
+ // TODO: add test to ensure that generated annotation has precedence
538
+ if feedQualifiedName != nil {
539
+ annotationArray = append (annotationArray , getFormattedJSON ("feed" , feedQualifiedName .GetFullQualifiedName ()))
540
+ }
541
+ annotations := getParameters (annotationArray , true , true )
525
542
543
+ //if trigger contains no feed but user tries to update feed parameter, then we issue error.
526
544
if feedQualifiedName == nil && len (Flags .trigger .feedParam ) > 0 {
527
- //trigger without feed names cannot have a feed param
528
- errMsg := fmt .Sprintf ("Incorrect usage. trigger without a feed cannot have feed parameters. \n " )
529
- fmt .Fprintf (os .Stderr , "%s%s" , color .RedString ("error: " ), errors .New (errMsg ))
530
- return nil
545
+ whisk .Debug (whisk .DbgError , "Incorrect usage. trigger without a feed cannot have feed parameters." )
546
+ errStr := wski18n .T ("Incorrect usage. trigger without a feed cannot have feed parameters." )
547
+ return whisk .MakeWskError (errors .New (errStr ), whisk .NOT_ALLOWED , whisk .DISPLAY_MSG , whisk .NO_DISPLAY_USAGE )
531
548
}
532
549
533
550
triggerParams := getParameters (Flags .trigger .triggerParam , true , false )
@@ -573,64 +590,32 @@ func (t *Trigger) Create(Client *whisk.Client, args []string) error {
573
590
fmt .Fprintf (color .Output ,
574
591
wski18n .T ("{{.ok}} created trigger {{.name}}\n " ,
575
592
map [string ]interface {}{"ok" : color .GreenString ("ok:" ), "name" : boldString (trigger .Name )}))
593
+
576
594
return nil
577
595
}
578
596
579
597
func (t * Trigger ) Update (Client * whisk.Client , args []string ) error {
580
- var err error
581
- var fullFeedName string
582
- var qualifiedName = new (QualifiedName )
583
-
584
598
if whiskErr := CheckArgs (args , 1 , 1 , "Trigger update" ,
585
599
wski18n .T ("A trigger name is required." )); whiskErr != nil {
586
600
return whiskErr
587
601
}
588
602
603
+ var err error
604
+ var fullFeedName string
605
+ var qualifiedName = new (QualifiedName )
606
+
589
607
if qualifiedName , err = NewQualifiedName (args [0 ]); err != nil {
590
608
return NewQualifiedNameError (args [0 ], err )
591
609
}
592
610
593
611
Client .Namespace = qualifiedName .GetNamespace ()
594
612
595
- // Convert the trigger's list of default parameters from a string into []KeyValue
596
- // The 1 or more --param arguments have all been combined into a single []string
597
- // e.g. --p arg1,arg2 --p arg3,arg4 -> [arg1, arg2, arg3, arg4]
598
-
599
- whisk .Debug (whisk .DbgInfo , "Parsing parameters: %#v\n " , Flags .common .param )
600
- parameters , err := getJSONFromStrings (Flags .common .param , true )
601
- if err != nil {
602
- whisk .Debug (whisk .DbgError , "getJSONFromStrings(%#v, true) failed: %s\n " , Flags .common .param , err )
603
- errStr := wski18n .T ("Invalid parameter argument '{{.param}}': {{.err}}" ,
604
- map [string ]interface {}{"param" : fmt .Sprintf ("%#v" , Flags .common .param ), "err" : err })
605
- werr := whisk .MakeWskErrorFromWskError (errors .New (errStr ), err , whisk .EXIT_CODE_ERR_GENERAL , whisk .DISPLAY_MSG , whisk .DISPLAY_USAGE )
606
- return werr
607
- }
608
-
609
- whisk .Debug (whisk .DbgInfo , "Parsing parameters: %#v\n " , Flags .trigger .triggerParam )
610
- triggerParameters , err := getJSONFromStrings (Flags .trigger .triggerParam , true )
611
- if err != nil {
612
- whisk .Debug (whisk .DbgError , "getJSONFromStrings(%#v, true) failed: %s\n " , Flags .common .param , err )
613
- errStr := wski18n .T ("Invalid parameter argument '{{.param}}': {{.err}}" ,
614
- map [string ]interface {}{"param" : fmt .Sprintf ("%#v" , Flags .common .param ), "err" : err })
615
- werr := whisk .MakeWskErrorFromWskError (errors .New (errStr ), err , whisk .EXIT_CODE_ERR_GENERAL , whisk .DISPLAY_MSG , whisk .DISPLAY_USAGE )
616
- return werr
617
- }
618
-
619
- whisk .Debug (whisk .DbgInfo , "Parsing annotations: %#v\n " , Flags .common .annotation )
620
- annotations , err := getJSONFromStrings (Flags .common .annotation , true )
621
-
622
- if err != nil {
623
- whisk .Debug (whisk .DbgError , "getJSONFromStrings(%#v, true) failed: %s\n " , Flags .common .annotation , err )
624
- errStr := wski18n .T ("Invalid annotation argument '{{.annotation}}': {{.err}}" ,
625
- map [string ]interface {}{"annotation" : fmt .Sprintf ("%#v" , Flags .common .annotation ), "err" : err })
626
- werr := whisk .MakeWskErrorFromWskError (errors .New (errStr ), err , whisk .EXIT_CODE_ERR_GENERAL , whisk .DISPLAY_MSG , whisk .DISPLAY_USAGE )
627
- return werr
628
- }
629
-
630
613
retTrigger , httpResp , err := Client .Triggers .Get (qualifiedName .GetEntityName ())
631
-
632
614
if err != nil && httpResp .StatusCode == 404 {
633
- t .Create (Client , args )
615
+ triggerCreateErr := t .Create (Client , args )
616
+ if triggerCreateErr != nil {
617
+ return triggerCreateErr
618
+ }
634
619
return nil
635
620
} else if err != nil {
636
621
whisk .Debug (whisk .DbgError , "Client.Triggers.Get(%s) failed: %s\n " , qualifiedName .GetEntityName (), err )
@@ -640,29 +625,47 @@ func (t *Trigger) Update(Client *whisk.Client, args []string) error {
640
625
return werr
641
626
}
642
627
643
- // Get full feed name from trigger get request as it is needed to get the feed
644
- if retTrigger != nil && retTrigger .Annotations != nil {
645
- fullFeedName = getValueString (retTrigger .Annotations , "feed" )
646
- }
628
+ //1. if the command line arguments user provides contains only --param flags
629
+ //2. if the command line arguments user provides contains no --param flags at all
630
+ //we should process the trigger update command in the old way.
631
+ if userIndicatesToUseOldTriggerCommand () {
632
+ //if user also issued new trigger command then we stop execution
633
+ if triggerUsageErr := userIssuedNewTriggerCmd (); triggerUsageErr != nil {
634
+ return triggerUsageErr
635
+ }
647
636
648
- trigger := & whisk.Trigger {
649
- Name : qualifiedName .GetEntityName (),
650
- Parameters : parameters .(whisk.KeyValueArr ),
651
- Annotations : annotations .(whisk.KeyValueArr ),
652
- }
637
+ // Convert the trigger's list of default parameters from a string into []KeyValue
638
+ // The 1 or more --param arguments have all been combined into a single []string
639
+ // e.g. --p arg1,arg2 --p arg3,arg4 -> [arg1, arg2, arg3, arg4]
640
+ whisk .Debug (whisk .DbgInfo , "Parsing parameters: %#v\n " , Flags .common .param )
641
+ parameters , err := getJSONFromStrings (Flags .common .param , true )
642
+ if err != nil {
643
+ whisk .Debug (whisk .DbgError , "getJSONFromStrings(%#v, true) failed: %s\n " , Flags .common .param , err )
644
+ errStr := wski18n .T ("Invalid parameter argument '{{.param}}': {{.err}}" ,
645
+ map [string ]interface {}{"param" : fmt .Sprintf ("%#v" , Flags .common .param ), "err" : err })
646
+ werr := whisk .MakeWskErrorFromWskError (errors .New (errStr ), err , whisk .EXIT_CODE_ERR_GENERAL , whisk .DISPLAY_MSG , whisk .DISPLAY_USAGE )
647
+ return werr
648
+ }
653
649
654
- //simplestTrigger indicates user are updating a trigger without any feed or parameters
655
- simplestTrigger := len (Flags .trigger .feedParam ) == 0 && len (Flags .common .param ) == 0 && len (Flags .trigger .triggerParam ) == 0
650
+ whisk .Debug (whisk .DbgInfo , "Parsing annotations: %#v\n " , Flags .common .annotation )
651
+ annotations , err := getJSONFromStrings (Flags .common .annotation , true )
652
+ if err != nil {
653
+ whisk .Debug (whisk .DbgError , "getJSONFromStrings(%#v, true) failed: %s\n " , Flags .common .annotation , err )
654
+ errStr := wski18n .T ("Invalid annotation argument '{{.annotation}}': {{.err}}" ,
655
+ map [string ]interface {}{"annotation" : fmt .Sprintf ("%#v" , Flags .common .annotation ), "err" : err })
656
+ werr := whisk .MakeWskErrorFromWskError (errors .New (errStr ), err , whisk .EXIT_CODE_ERR_GENERAL , whisk .DISPLAY_MSG , whisk .DISPLAY_USAGE )
657
+ return werr
658
+ }
656
659
657
- //if users are 1. creating a trigger without any feed or parameters
658
- // 2. creating a trigger using --param flag
659
- //then we use the old way to create the trigger.
660
- if len ( Flags . common . param ) > 0 || simplestTrigger {
661
- if len ( Flags . trigger . feedParam ) > 0 || len ( Flags . trigger . triggerParam ) > 0 {
662
- whisk . Debug ( whisk . DbgError , "User tries to mix use of --param with --feed-param and --trigger-param" )
663
- errMsg := fmt . Sprintf ( "Incorrect usage. Cannot combine --feed-param or --trigger-param flag with --param flag \n " )
664
- fmt . Fprintf ( os . Stderr , "%s%s" , color . RedString ( "error: " ), errors . New ( errMsg ))
665
- return nil
660
+ trigger := & whisk. Trigger {
661
+ Name : qualifiedName . GetEntityName (),
662
+ Parameters : parameters .(whisk. KeyValueArr ),
663
+ Annotations : annotations .(whisk. KeyValueArr ),
664
+ }
665
+
666
+ // Get full feed name from trigger get request as it is needed to get the feed
667
+ if retTrigger != nil && retTrigger . Annotations != nil {
668
+ fullFeedName = getValueString ( retTrigger . Annotations , "feed" )
666
669
}
667
670
668
671
if len (fullFeedName ) > 0 {
@@ -698,8 +701,54 @@ func (t *Trigger) Update(Client *whisk.Client, args []string) error {
698
701
699
702
return nil
700
703
}
704
+ //1. if user's input command line argument contains either --feed-param or --trigger-param
705
+ //2. if user's input command line argument contains both --feed-param and --trigger-param
706
+ //then we process trigger update command in a different way
707
+ return UpdateExtendedVersion (Client , args , retTrigger )
708
+ }
709
+
710
+ //UpdateExtendedVersion only executes when users indicate to update triggers with --feed-param
711
+ //or --trigger-param flags.
712
+ func UpdateExtendedVersion (Client * whisk.Client , args []string , retTrigger * whisk.Trigger ) error {
713
+ var fullFeedName string
714
+ var qualifiedName = new (QualifiedName )
715
+ var err error
716
+
717
+ if qualifiedName , err = NewQualifiedName (args [0 ]); err != nil {
718
+ return NewQualifiedNameError (args [0 ], err )
719
+ }
720
+
721
+ whisk .Debug (whisk .DbgInfo , "Parsing parameters: %#v\n " , Flags .trigger .triggerParam )
722
+ triggerParameters , err := getJSONFromStrings (Flags .trigger .triggerParam , true )
723
+ if err != nil {
724
+ whisk .Debug (whisk .DbgError , "getJSONFromStrings(%#v, true) failed: %s\n " , Flags .common .param , err )
725
+ errStr := wski18n .T ("Invalid parameter argument '{{.param}}': {{.err}}" ,
726
+ map [string ]interface {}{"param" : fmt .Sprintf ("%#v" , Flags .common .param ), "err" : err })
727
+ werr := whisk .MakeWskErrorFromWskError (errors .New (errStr ), err , whisk .EXIT_CODE_ERR_GENERAL , whisk .DISPLAY_MSG , whisk .DISPLAY_USAGE )
728
+ return werr
729
+ }
730
+
731
+ whisk .Debug (whisk .DbgInfo , "Parsing annotations: %#v\n " , Flags .common .annotation )
732
+ annotations , err := getJSONFromStrings (Flags .common .annotation , true )
733
+ if err != nil {
734
+ whisk .Debug (whisk .DbgError , "getJSONFromStrings(%#v, true) failed: %s\n " , Flags .common .annotation , err )
735
+ errStr := wski18n .T ("Invalid annotation argument '{{.annotation}}': {{.err}}" ,
736
+ map [string ]interface {}{"annotation" : fmt .Sprintf ("%#v" , Flags .common .annotation ), "err" : err })
737
+ werr := whisk .MakeWskErrorFromWskError (errors .New (errStr ), err , whisk .EXIT_CODE_ERR_GENERAL , whisk .DISPLAY_MSG , whisk .DISPLAY_USAGE )
738
+ return werr
739
+ }
740
+
741
+ trigger := & whisk.Trigger {
742
+ Name : qualifiedName .GetEntityName (),
743
+ Parameters : triggerParameters .(whisk.KeyValueArr ),
744
+ Annotations : annotations .(whisk.KeyValueArr ),
745
+ }
746
+
747
+ // Get full feed name from trigger get request as it is needed to get the feed
748
+ if retTrigger != nil && retTrigger .Annotations != nil {
749
+ fullFeedName = getValueString (retTrigger .Annotations , "feed" )
750
+ }
701
751
702
- trigger .Parameters = triggerParameters .(whisk.KeyValueArr )
703
752
_ , _ , err = Client .Triggers .Insert (trigger , true )
704
753
if err != nil {
705
754
whisk .Debug (whisk .DbgError , "Client.Triggers.Insert(%+v,true) failed: %s\n " , trigger , err )
@@ -748,3 +797,19 @@ func (t *Trigger) Update(Client *whisk.Client, args []string) error {
748
797
func feedParameterChanged (triggerParam []string ) bool {
749
798
return len (triggerParam ) > 0
750
799
}
800
+
801
+ //if users are 1. creating a trigger without any feed or parameters
802
+ // 2. creating a trigger using --param flag
803
+ //then we use the old way to create the trigger.
804
+ func userIndicatesToUseOldTriggerCommand () bool {
805
+ return len (Flags .common .param ) > 0 || (len (Flags .trigger .feedParam ) == 0 && len (Flags .common .param ) == 0 && len (Flags .trigger .triggerParam ) == 0 )
806
+ }
807
+
808
+ func userIssuedNewTriggerCmd () error {
809
+ if len (Flags .trigger .feedParam ) > 0 || len (Flags .trigger .triggerParam ) > 0 {
810
+ whisk .Debug (whisk .DbgError , "User tries to mix use of --param with --feed-param and --trigger-param" )
811
+ errStr := wski18n .T ("Incorrect usage. Cannot combine --feed-param or --trigger-param flag with --param flag" )
812
+ return whisk .MakeWskError (errors .New (errStr ), whisk .NOT_ALLOWED , whisk .DISPLAY_MSG , whisk .NO_DISPLAY_USAGE )
813
+ }
814
+ return nil
815
+ }
0 commit comments