Skip to content

Commit 7fb2c36

Browse files
add tests
1 parent f0fab1f commit 7fb2c36

File tree

3 files changed

+206
-101
lines changed

3 files changed

+206
-101
lines changed

commands/commands.go

-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ package commands
1919

2020
import (
2121
"errors"
22-
"fmt"
2322
"net/http"
2423
"os"
2524
"runtime"
@@ -187,7 +186,6 @@ func parseArgs(args []string) ([]string, []string, []string, []string, []string,
187186
return nil, nil, nil, nil, nil, whiskErr
188187
}
189188
} else if args[i] == "-a" || args[i] == "--annotation" {
190-
fmt.Println("4")
191189
annotArgs, args, whiskErr = getKeyValueArgs(args, i, annotArgs)
192190
if whiskErr != nil {
193191
whisk.Debug(whisk.DbgError, "getKeyValueArgs(%#v, %d) failed: %s\n", args, i, whiskErr)

commands/trigger.go

+164-99
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ package commands
2020
import (
2121
"errors"
2222
"fmt"
23-
"os"
2423

2524
"github.com/apache/openwhisk-cli/wski18n"
2625
"github.com/apache/openwhisk-client-go/whisk"
@@ -398,13 +397,15 @@ func init() {
398397
triggerCreateCmd.Flags().StringSliceVarP(&Flags.common.param, "param", "p", []string{}, wski18n.T("parameter values in `KEY VALUE` format"))
399398
triggerCreateCmd.Flags().StringVarP(&Flags.common.paramFile, "param-file", "P", "", wski18n.T("`FILE` containing parameter values in JSON format"))
400399
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"))
402402

403403
triggerUpdateCmd.Flags().StringSliceVarP(&Flags.common.annotation, "annotation", "a", []string{}, wski18n.T("annotation values in `KEY VALUE` format"))
404404
triggerUpdateCmd.Flags().StringVarP(&Flags.common.annotFile, "annotation-file", "A", "", wski18n.T("`FILE` containing annotation values in JSON format"))
405405
triggerUpdateCmd.Flags().StringSliceVarP(&Flags.common.param, "param", "p", []string{}, wski18n.T("parameter values in `KEY VALUE` format"))
406406
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"))
408409

409410
triggerGetCmd.Flags().BoolVarP(&Flags.trigger.summary, "summary", "s", false, wski18n.T("summarize trigger details; parameters with prefix \"*\" are bound"))
410411

@@ -429,43 +430,37 @@ type Trigger struct {
429430
}
430431

431432
func (t *Trigger) Create(Client *whisk.Client, args []string) error {
432-
433433
if whiskErr := CheckArgs(args, 1, 1, "Trigger create",
434434
wski18n.T("A trigger name is required.")); whiskErr != nil {
435435
return whiskErr
436436
}
437437

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+
}
442446

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+
}
445451

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
448454

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)
455457

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()))
468462
}
463+
annotations := getParameters(annotationArray, true, true)
469464

470465
// the feed receives all the parameters that are specified on the command line so we merge
471466
// the feed lifecycle parameters with the command line ones
@@ -518,16 +513,38 @@ func (t *Trigger) Create(Client *whisk.Client, args []string) error {
518513
map[string]interface{}{"ok": color.GreenString("ok:"), "name": boldString(trigger.Name)}))
519514
return nil
520515
}
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)
521535

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)
525542

543+
//if trigger contains no feed but user tries to update feed parameter, then we issue error.
526544
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)
531548
}
532549

533550
triggerParams := getParameters(Flags.trigger.triggerParam, true, false)
@@ -573,64 +590,32 @@ func (t *Trigger) Create(Client *whisk.Client, args []string) error {
573590
fmt.Fprintf(color.Output,
574591
wski18n.T("{{.ok}} created trigger {{.name}}\n",
575592
map[string]interface{}{"ok": color.GreenString("ok:"), "name": boldString(trigger.Name)}))
593+
576594
return nil
577595
}
578596

579597
func (t *Trigger) Update(Client *whisk.Client, args []string) error {
580-
var err error
581-
var fullFeedName string
582-
var qualifiedName = new(QualifiedName)
583-
584598
if whiskErr := CheckArgs(args, 1, 1, "Trigger update",
585599
wski18n.T("A trigger name is required.")); whiskErr != nil {
586600
return whiskErr
587601
}
588602

603+
var err error
604+
var fullFeedName string
605+
var qualifiedName = new(QualifiedName)
606+
589607
if qualifiedName, err = NewQualifiedName(args[0]); err != nil {
590608
return NewQualifiedNameError(args[0], err)
591609
}
592610

593611
Client.Namespace = qualifiedName.GetNamespace()
594612

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-
630613
retTrigger, httpResp, err := Client.Triggers.Get(qualifiedName.GetEntityName())
631-
632614
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+
}
634619
return nil
635620
} else if err != nil {
636621
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 {
640625
return werr
641626
}
642627

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+
}
647636

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+
}
653649

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+
}
656659

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")
666669
}
667670

668671
if len(fullFeedName) > 0 {
@@ -698,8 +701,54 @@ func (t *Trigger) Update(Client *whisk.Client, args []string) error {
698701

699702
return nil
700703
}
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+
}
701751

702-
trigger.Parameters = triggerParameters.(whisk.KeyValueArr)
703752
_, _, err = Client.Triggers.Insert(trigger, true)
704753
if err != nil {
705754
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 {
748797
func feedParameterChanged(triggerParam []string) bool {
749798
return len(triggerParam) > 0
750799
}
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

Comments
 (0)