This is an automated email from the ASF dual-hosted git repository.

dubeejw pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-openwhisk-cli.git


The following commit(s) were added to refs/heads/master by this push:
     new 0e7e180  Create triggers on update if do not exist (#353)
0e7e180 is described below

commit 0e7e1807a152fee221937e14ada859213033c72a
Author: Vadim Raskin <[email protected]>
AuthorDate: Tue Jan 29 16:33:36 2019 +0100

    Create triggers on update if do not exist (#353)
    
    * Create triggers on update if do not exist
    
    * Integrate unit tests into gradle build, refactor tests
    
    * Apply go fmt
    
    * Bump go client submodule, address review comments from James
    
    * Add licence headers
    
    * Download transitive dependencies for ginkgo and gomega
    
    * Tinker with go dependencies
    
    * Bump gogradle version
    
    * Hard code required transitive dependencies for ginkgo and gomega
    
    * Pin dependency version
---
 build.gradle                    |  10 +-
 commands/commands_suite_test.go |  30 ++++
 commands/trigger.go             | 352 +++++++++++++++++++++-------------------
 commands/trigger_test.go        |  82 ++++++++++
 4 files changed, 306 insertions(+), 168 deletions(-)

diff --git a/build.gradle b/build.gradle
index a75669d..0dd5ffd 100644
--- a/build.gradle
+++ b/build.gradle
@@ -26,7 +26,7 @@ buildscript {
 }
 
 plugins {
-    id 'com.github.blindpirate.gogradle' version '0.8.1'
+    id 'com.github.blindpirate.gogradle' version '0.10'
 }
 
 subprojects {
@@ -65,6 +65,14 @@ dependencies {
         test name:'github.com/cpuguy83/go-md2man/md2man', 
version:'1d903dcb749992f3741d744c0f8376b4bd7eb3e1', transitive:false //, 
tag:'v1.0.7'
         test name:'github.com/davecgh/go-spew/spew', 
version:'346938d642f2ec3594ed81d874461961cd0faa76', transitive:false //, 
tag:'v1.1.0'
         test name:'github.com/pmezard/go-difflib/difflib', 
version:'792786c7400a136282c1664665ae0a8db921c6c2', transitive:false
+
+        test name:'github.com/onsi/ginkgo', 
version:'00054c0bb96fc880d4e0be1b90937fad438c5290', transitive: false
+        test name:'github.com/hpcloud/tail',version: 
'a1dbeea552b7c8df4b542c66073e393de198a800', transitive: false
+        test name:'gopkg.in/tomb.v1', 
version:'c131134a1947e9afd9cecfe11f4c6dff0732ae58', transitive: false
+        test name:'gopkg.in/fsnotify/fsnotify.v1', 
version:'7be54206639f256967dd82fa767397ba5f8f48f5', transitive: false
+        test name:'github.com/onsi/gomega', 
version:'c893efa28eb45626cdaa76c9f653b62488858837', transitive: false
+        test name:'golang.org/x/net/html', 
version:'b68f30494add4df6bd8ef5e82803f308e7f7c59c', transitive: false
+        test name:'golang.org/x/text', 
version:'ece95c760240037f89ebcbdd7155ac8cb52e38fa', transitive: false
     }
 }
 
diff --git a/commands/commands_suite_test.go b/commands/commands_suite_test.go
new file mode 100644
index 0000000..7dc7af2
--- /dev/null
+++ b/commands/commands_suite_test.go
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 commands
+
+import (
+       . "github.com/onsi/ginkgo"
+       . "github.com/onsi/gomega"
+
+       "testing"
+)
+
+func TestCommands(t *testing.T) {
+       RegisterFailHandler(Fail)
+       RunSpecs(t, "Commands Suite")
+}
diff --git a/commands/trigger.go b/commands/trigger.go
index 28e06f8..4eca96b 100644
--- a/commands/trigger.go
+++ b/commands/trigger.go
@@ -42,6 +42,8 @@ var triggerCmd = &cobra.Command{
        Short: wski18n.T("work with triggers"),
 }
 
+var trigger = Trigger{}
+
 /**
  * Constructs the parameters to pass to the feed, consisting of the event 
type, trigger name, and subject key.
  *
@@ -75,7 +77,7 @@ func feedParameters(feed string, lifecycle string, trigger 
*QualifiedName, authK
  *
  * NOTE: this function will exit in case of a processing error since it 
indicates a problem parsing parameters.
  */
-func createOrUpdate(fqn *QualifiedName, trigger *whisk.Trigger, overwrite 
bool) {
+func createOrUpdate(Client *whisk.Client, fqn *QualifiedName, trigger 
*whisk.Trigger, overwrite bool) {
        // TODO get rid of these global modifiers
        Client.Namespace = fqn.GetNamespace()
        _, _, err := Client.Triggers.Insert(trigger, overwrite)
@@ -145,80 +147,7 @@ var triggerCreateCmd = &cobra.Command{
        SilenceErrors: true,
        PreRunE:       SetupClientConfig,
        RunE: func(cmd *cobra.Command, args []string) error {
-               if whiskErr := CheckArgs(args, 1, 1, "Trigger create",
-                       wski18n.T("A trigger name is required.")); whiskErr != 
nil {
-                       return whiskErr
-               }
-
-               triggerName, err := NewQualifiedName(args[0])
-               if err != nil {
-                       return NewQualifiedNameError(args[0], err)
-               }
-
-               paramArray := Flags.common.param
-               annotationArray := Flags.common.annotation
-               feedParam := Flags.common.feed
-               authToken := Client.Config.AuthToken
-
-               // if a feed is specified, create additional parameters which 
must be passed to the feed
-               feedName, feedParams := feedParameters(feedParam, FEED_CREATE, 
triggerName, authToken)
-               // the feed receives all the paramaters that are specified on 
the command line so we merge
-               // the feed lifecycle parameters with the command line ones
-               parameters := getParameters(append(paramArray, feedParams...), 
feedName == nil, false)
-
-               // if a feed is specified, add feed annotation the annotations 
declared on the command line
-               // TODO: add test to ensure that generated annotation has 
precedence
-               if feedName != nil {
-                       annotationArray = append(annotationArray, 
getFormattedJSON("feed", feedName.GetFullQualifiedName()))
-               }
-               annotations := getParameters(annotationArray, true, true)
-
-               trigger := &whisk.Trigger{
-                       Name:        triggerName.GetEntityName(),
-                       Annotations: annotations.(whisk.KeyValueArr),
-               }
-
-               if feedName == nil {
-                       // parameters are only attached to the trigger in there 
is no feed, otherwise
-                       // parameters are passed to the feed instead
-                       trigger.Parameters = parameters.(whisk.KeyValueArr)
-               }
-
-               createOrUpdate(triggerName, trigger, false)
-
-               // Invoke the specified feed action to configure the trigger 
feed
-               if feedName != nil {
-                       res, err := invokeAction(*feedName, parameters, true, 
false)
-                       if err != nil {
-                               whisk.Debug(whisk.DbgError, "Failed configuring 
feed '%s' failed: %s\n", feedName.GetFullQualifiedName(), err)
-
-                               // TODO: should we do this at all? Keeping for 
now.
-                               
printFailedBlockingInvocationResponse(*feedName, false, res, err)
-
-                               reason := wski18n.T(FEED_CONFIGURATION_FAILURE, 
map[string]interface{}{"feedname": feedName.GetFullQualifiedName(), "err": err})
-                               errStr := wski18n.T("Unable to create trigger 
'{{.name}}': {{.err}}",
-                                       map[string]interface{}{"name": 
trigger.Name, "err": reason})
-                               werr := 
whisk.MakeWskErrorFromWskError(errors.New(errStr), err, 
whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
-
-                               // Delete trigger that was created for this feed
-                               err = deleteTrigger(triggerName.GetEntityName())
-                               if err != nil {
-                                       whisk.Debug(whisk.DbgWarn, "Ignoring 
deleteTrigger(%s) failure: %s\n", triggerName.GetEntityName(), err)
-                               }
-
-                               return werr
-                       } else {
-                               whisk.Debug(whisk.DbgInfo, "Successfully 
configured trigger feed via feed action '%s'\n", feedName)
-
-                               // preserve existing behavior where output of 
feed activation is emitted to console
-                               printInvocationMsg(*feedName, true, true, res, 
color.Output)
-                       }
-               }
-
-               fmt.Fprintf(color.Output,
-                       wski18n.T("{{.ok}} created trigger {{.name}}\n",
-                               map[string]interface{}{"ok": 
color.GreenString("ok:"), "name": boldString(trigger.Name)}))
-               return nil
+               return trigger.Create(Client, args)
        },
 }
 
@@ -229,98 +158,7 @@ var triggerUpdateCmd = &cobra.Command{
        SilenceErrors: true,
        PreRunE:       SetupClientConfig,
        RunE: func(cmd *cobra.Command, args []string) error {
-               var err error
-               var fullFeedName string
-               var qualifiedName = new(QualifiedName)
-
-               if whiskErr := CheckArgs(args, 1, 1, "Trigger update",
-                       wski18n.T("A trigger name is required.")); whiskErr != 
nil {
-                       return whiskErr
-               }
-
-               if qualifiedName, err = NewQualifiedName(args[0]); err != nil {
-                       return NewQualifiedNameError(args[0], err)
-               }
-
-               Client.Namespace = qualifiedName.GetNamespace()
-
-               // Convert the trigger's list of default parameters from a 
string into []KeyValue
-               // The 1 or more --param arguments have all been combined into 
a single []string
-               // e.g.   --p arg1,arg2 --p arg3,arg4   ->  [arg1, arg2, arg3, 
arg4]
-
-               whisk.Debug(whisk.DbgInfo, "Parsing parameters: %#v\n", 
Flags.common.param)
-               parameters, err := getJSONFromStrings(Flags.common.param, true)
-
-               if err != nil {
-                       whisk.Debug(whisk.DbgError, "getJSONFromStrings(%#v, 
true) failed: %s\n", Flags.common.param, err)
-                       errStr := wski18n.T("Invalid parameter argument 
'{{.param}}': {{.err}}",
-                               map[string]interface{}{"param": 
fmt.Sprintf("%#v", Flags.common.param), "err": err})
-                       werr := 
whisk.MakeWskErrorFromWskError(errors.New(errStr), err, 
whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.DISPLAY_USAGE)
-                       return werr
-               }
-
-               whisk.Debug(whisk.DbgInfo, "Parsing annotations: %#v\n", 
Flags.common.annotation)
-               annotations, err := getJSONFromStrings(Flags.common.annotation, 
true)
-
-               if err != nil {
-                       whisk.Debug(whisk.DbgError, "getJSONFromStrings(%#v, 
true) failed: %s\n", Flags.common.annotation, err)
-                       errStr := wski18n.T("Invalid annotation argument 
'{{.annotation}}': {{.err}}",
-                               map[string]interface{}{"annotation": 
fmt.Sprintf("%#v", Flags.common.annotation), "err": err})
-                       werr := 
whisk.MakeWskErrorFromWskError(errors.New(errStr), err, 
whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.DISPLAY_USAGE)
-                       return werr
-               }
-
-               retTrigger, _, err := 
Client.Triggers.Get(qualifiedName.GetEntityName())
-               if err != nil {
-                       whisk.Debug(whisk.DbgError, "Client.Triggers.Get(%s) 
failed: %s\n", qualifiedName.GetEntityName(), err)
-                       errStr := wski18n.T("Unable to get trigger '{{.name}}': 
{{.err}}",
-                               map[string]interface{}{"name": 
qualifiedName.GetEntityName(), "err": err})
-                       werr := 
whisk.MakeWskErrorFromWskError(errors.New(errStr), err, 
whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
-                       return werr
-               }
-
-               // Get full feed name from trigger get request as it is needed 
to get the feed
-               if retTrigger != nil && retTrigger.Annotations != nil {
-                       fullFeedName = getValueString(retTrigger.Annotations, 
"feed")
-               }
-
-               if len(fullFeedName) > 0 {
-                       fullTriggerName := fmt.Sprintf("/%s/%s", 
qualifiedName.GetNamespace(), qualifiedName.GetEntityName())
-                       Flags.common.param = append(Flags.common.param, 
getFormattedJSON(FEED_LIFECYCLE_EVENT, FEED_UPDATE))
-                       Flags.common.param = append(Flags.common.param, 
getFormattedJSON(FEED_TRIGGER_NAME, fullTriggerName))
-                       Flags.common.param = append(Flags.common.param, 
getFormattedJSON(FEED_AUTH_KEY, Client.Config.AuthToken))
-
-                       // Invoke the specified feed action to configure the 
trigger feed
-                       err = configureFeed(qualifiedName.GetEntityName(), 
fullFeedName, getParameters(Flags.common.param, false, false))
-                       if err != nil {
-                               whisk.Debug(whisk.DbgError, "configureFeed(%s, 
%s) failed: %s\n", qualifiedName.GetEntityName(), Flags.common.feed,
-                                       err)
-                               errStr := wski18n.T("Unable to create trigger 
'{{.name}}': {{.err}}",
-                                       map[string]interface{}{"name": 
qualifiedName.GetEntityName(), "err": err})
-                               werr := 
whisk.MakeWskErrorFromWskError(errors.New(errStr), err, 
whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
-                               return werr
-                       }
-               } else {
-                       trigger := &whisk.Trigger{
-                               Name:        qualifiedName.GetEntityName(),
-                               Parameters:  parameters.(whisk.KeyValueArr),
-                               Annotations: annotations.(whisk.KeyValueArr),
-                       }
-
-                       _, _, err = Client.Triggers.Insert(trigger, true)
-                       if err != nil {
-                               whisk.Debug(whisk.DbgError, 
"Client.Triggers.Insert(%+v,true) failed: %s\n", trigger, err)
-                               errStr := wski18n.T("Unable to update trigger 
'{{.name}}': {{.err}}",
-                                       map[string]interface{}{"name": 
trigger.Name, "err": err})
-                               werr := 
whisk.MakeWskErrorFromWskError(errors.New(errStr), err, 
whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
-                               return werr
-                       }
-               }
-
-               fmt.Fprintf(color.Output,
-                       wski18n.T("{{.ok}} updated trigger {{.name}}\n",
-                               map[string]interface{}{"ok": 
color.GreenString("ok:"), "name": boldString(qualifiedName.GetEntityName())}))
-               return nil
+               return trigger.Update(Client, args)
        },
 }
 
@@ -583,3 +421,183 @@ func init() {
                triggerListCmd,
        )
 }
+
+type Trigger struct {
+}
+
+func (t *Trigger) Create(Client *whisk.Client, args []string) error {
+       if whiskErr := CheckArgs(args, 1, 1, "Trigger create",
+               wski18n.T("A trigger name is required.")); whiskErr != nil {
+               return whiskErr
+       }
+
+       triggerName, err := NewQualifiedName(args[0])
+       if err != nil {
+               return NewQualifiedNameError(args[0], err)
+       }
+
+       paramArray := Flags.common.param
+       annotationArray := Flags.common.annotation
+       feedParam := Flags.common.feed
+       authToken := Client.Config.AuthToken
+
+       // if a feed is specified, create additional parameters which must be 
passed to the feed
+       feedName, feedParams := feedParameters(feedParam, FEED_CREATE, 
triggerName, authToken)
+       // the feed receives all the paramaters that are specified on the 
command line so we merge
+       // the feed lifecycle parameters with the command line ones
+       parameters := getParameters(append(paramArray, feedParams...), feedName 
== nil, false)
+
+       // if a feed is specified, add feed annotation the annotations declared 
on the command line
+       // TODO: add test to ensure that generated annotation has precedence
+       if feedName != nil {
+               annotationArray = append(annotationArray, 
getFormattedJSON("feed", feedName.GetFullQualifiedName()))
+       }
+       annotations := getParameters(annotationArray, true, true)
+
+       trigger := &whisk.Trigger{
+               Name:        triggerName.GetEntityName(),
+               Annotations: annotations.(whisk.KeyValueArr),
+       }
+
+       if feedName == nil {
+               // parameters are only attached to the trigger in there is no 
feed, otherwise
+               // parameters are passed to the feed instead
+               trigger.Parameters = parameters.(whisk.KeyValueArr)
+       }
+
+       createOrUpdate(Client, triggerName, trigger, false)
+
+       // Invoke the specified feed action to configure the trigger feed
+       if feedName != nil {
+               res, err := invokeAction(*feedName, parameters, true, false)
+               if err != nil {
+                       whisk.Debug(whisk.DbgError, "Failed configuring feed 
'%s' failed: %s\n", feedName.GetFullQualifiedName(), err)
+
+                       // TODO: should we do this at all? Keeping for now.
+                       printFailedBlockingInvocationResponse(*feedName, false, 
res, err)
+
+                       reason := wski18n.T(FEED_CONFIGURATION_FAILURE, 
map[string]interface{}{"feedname": feedName.GetFullQualifiedName(), "err": err})
+                       errStr := wski18n.T("Unable to create trigger 
'{{.name}}': {{.err}}",
+                               map[string]interface{}{"name": trigger.Name, 
"err": reason})
+                       werr := 
whisk.MakeWskErrorFromWskError(errors.New(errStr), err, 
whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
+
+                       // Delete trigger that was created for this feed
+                       err = deleteTrigger(triggerName.GetEntityName())
+                       if err != nil {
+                               whisk.Debug(whisk.DbgWarn, "Ignoring 
deleteTrigger(%s) failure: %s\n", triggerName.GetEntityName(), err)
+                       }
+
+                       return werr
+               } else {
+                       whisk.Debug(whisk.DbgInfo, "Successfully configured 
trigger feed via feed action '%s'\n", feedName)
+
+                       // preserve existing behavior where output of feed 
activation is emitted to console
+                       printInvocationMsg(*feedName, true, true, res, 
color.Output)
+               }
+       }
+
+       fmt.Fprintf(color.Output,
+               wski18n.T("{{.ok}} created trigger {{.name}}\n",
+                       map[string]interface{}{"ok": color.GreenString("ok:"), 
"name": boldString(trigger.Name)}))
+       return nil
+}
+
+func (t *Trigger) Update(Client *whisk.Client, args []string) error {
+       var err error
+       var fullFeedName string
+       var qualifiedName = new(QualifiedName)
+
+       if whiskErr := CheckArgs(args, 1, 1, "Trigger update",
+               wski18n.T("A trigger name is required.")); whiskErr != nil {
+               return whiskErr
+       }
+
+       if qualifiedName, err = NewQualifiedName(args[0]); err != nil {
+               return NewQualifiedNameError(args[0], err)
+       }
+
+       Client.Namespace = qualifiedName.GetNamespace()
+
+       // Convert the trigger's list of default parameters from a string into 
[]KeyValue
+       // The 1 or more --param arguments have all been combined into a single 
[]string
+       // e.g.   --p arg1,arg2 --p arg3,arg4   ->  [arg1, arg2, arg3, arg4]
+
+       whisk.Debug(whisk.DbgInfo, "Parsing parameters: %#v\n", 
Flags.common.param)
+       parameters, err := getJSONFromStrings(Flags.common.param, true)
+
+       if err != nil {
+               whisk.Debug(whisk.DbgError, "getJSONFromStrings(%#v, true) 
failed: %s\n", Flags.common.param, err)
+               errStr := wski18n.T("Invalid parameter argument '{{.param}}': 
{{.err}}",
+                       map[string]interface{}{"param": fmt.Sprintf("%#v", 
Flags.common.param), "err": err})
+               werr := whisk.MakeWskErrorFromWskError(errors.New(errStr), err, 
whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.DISPLAY_USAGE)
+               return werr
+       }
+
+       whisk.Debug(whisk.DbgInfo, "Parsing annotations: %#v\n", 
Flags.common.annotation)
+       annotations, err := getJSONFromStrings(Flags.common.annotation, true)
+
+       if err != nil {
+               whisk.Debug(whisk.DbgError, "getJSONFromStrings(%#v, true) 
failed: %s\n", Flags.common.annotation, err)
+               errStr := wski18n.T("Invalid annotation argument 
'{{.annotation}}': {{.err}}",
+                       map[string]interface{}{"annotation": fmt.Sprintf("%#v", 
Flags.common.annotation), "err": err})
+               werr := whisk.MakeWskErrorFromWskError(errors.New(errStr), err, 
whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.DISPLAY_USAGE)
+               return werr
+       }
+
+       retTrigger, httpResp, err := 
Client.Triggers.Get(qualifiedName.GetEntityName())
+
+       if err != nil && httpResp.StatusCode == 404 {
+               t.Create(Client, args)
+       } else if err != nil {
+               whisk.Debug(whisk.DbgError, "Client.Triggers.Get(%s) failed: 
%s\n", qualifiedName.GetEntityName(), err)
+               errStr := wski18n.T("Unable to get trigger '{{.name}}': 
{{.err}}",
+                       map[string]interface{}{"name": 
qualifiedName.GetEntityName(), "err": err})
+               werr := whisk.MakeWskErrorFromWskError(errors.New(errStr), err, 
whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
+               return werr
+       } else {
+
+               // Get full feed name from trigger get request as it is needed 
to get the feed
+               if retTrigger != nil && retTrigger.Annotations != nil {
+                       fullFeedName = getValueString(retTrigger.Annotations, 
"feed")
+               }
+
+               if len(fullFeedName) > 0 {
+                       fullTriggerName := fmt.Sprintf("/%s/%s", 
qualifiedName.GetNamespace(), qualifiedName.GetEntityName())
+                       Flags.common.param = append(Flags.common.param, 
getFormattedJSON(FEED_LIFECYCLE_EVENT, FEED_UPDATE))
+                       Flags.common.param = append(Flags.common.param, 
getFormattedJSON(FEED_TRIGGER_NAME, fullTriggerName))
+                       Flags.common.param = append(Flags.common.param, 
getFormattedJSON(FEED_AUTH_KEY, Client.Config.AuthToken))
+
+                       // Invoke the specified feed action to configure the 
trigger feed
+                       err = configureFeed(qualifiedName.GetEntityName(), 
fullFeedName, getParameters(Flags.common.param, false, false))
+                       if err != nil {
+                               whisk.Debug(whisk.DbgError, "configureFeed(%s, 
%s) failed: %s\n", qualifiedName.GetEntityName(), Flags.common.feed,
+                                       err)
+                               errStr := wski18n.T("Unable to create trigger 
'{{.name}}': {{.err}}",
+                                       map[string]interface{}{"name": 
qualifiedName.GetEntityName(), "err": err})
+                               werr := 
whisk.MakeWskErrorFromWskError(errors.New(errStr), err, 
whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
+                               return werr
+                       }
+               } else {
+                       trigger := &whisk.Trigger{
+                               Name:        qualifiedName.GetEntityName(),
+                               Parameters:  parameters.(whisk.KeyValueArr),
+                               Annotations: annotations.(whisk.KeyValueArr),
+                       }
+
+                       _, _, err = Client.Triggers.Insert(trigger, true)
+                       if err != nil {
+                               whisk.Debug(whisk.DbgError, 
"Client.Triggers.Insert(%+v,true) failed: %s\n", trigger, err)
+                               errStr := wski18n.T("Unable to update trigger 
'{{.name}}': {{.err}}",
+                                       map[string]interface{}{"name": 
trigger.Name, "err": err})
+                               werr := 
whisk.MakeWskErrorFromWskError(errors.New(errStr), err, 
whisk.EXIT_CODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
+                               return werr
+                       }
+               }
+
+               fmt.Fprintf(color.Output,
+                       wski18n.T("{{.ok}} updated trigger {{.name}}\n",
+                               map[string]interface{}{"ok": 
color.GreenString("ok:"), "name": boldString(qualifiedName.GetEntityName())}))
+       }
+
+       return nil
+}
diff --git a/commands/trigger_test.go b/commands/trigger_test.go
new file mode 100644
index 0000000..d64e332
--- /dev/null
+++ b/commands/trigger_test.go
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 commands
+
+import (
+       "errors"
+       "github.com/apache/incubator-openwhisk-client-go/whisk"
+       . "github.com/onsi/ginkgo"
+       . "github.com/onsi/gomega"
+       "net/http"
+)
+
+var Triggers = make(map[string]*whisk.Trigger)
+
+type MockedTriggerService struct {
+}
+
+func (t MockedTriggerService) List(options *whisk.TriggerListOptions) 
([]whisk.Trigger, *http.Response, error) {
+       return []whisk.Trigger{}, &http.Response{}, nil
+}
+func (t MockedTriggerService) Insert(trigger *whisk.Trigger, overwrite bool) 
(*whisk.Trigger, *http.Response, error) {
+       Triggers[trigger.Name] = trigger
+       return trigger, &http.Response{}, nil
+}
+func (t MockedTriggerService) Get(triggerName string) (*whisk.Trigger, 
*http.Response, error) {
+       var trigger *whisk.Trigger
+       var ok bool
+       var err error = nil
+       var httpResponse http.Response
+       if trigger, ok = Triggers[triggerName]; !ok {
+               err = errors.New("Unable to get trigger")
+               httpResponse = http.Response{StatusCode: 404}
+       }
+       return trigger, &httpResponse, err
+}
+func (t MockedTriggerService) Delete(triggerName string) (*whisk.Trigger, 
*http.Response, error) {
+       return &whisk.Trigger{}, &http.Response{}, nil
+}
+func (t MockedTriggerService) Fire(triggerName string, payload interface{}) 
(*whisk.Trigger, *http.Response, error) {
+       return &whisk.Trigger{}, &http.Response{}, nil
+}
+
+var _ = Describe("Trigger Command", func() {
+       t := Trigger{}
+       name := "awesomeTrigger"
+       client := whisk.Client{Triggers: &MockedTriggerService{}, Config: 
&whisk.Config{}}
+       args := []string{name}
+
+       BeforeEach(func() {
+               Triggers = make(map[string]*whisk.Trigger)
+       })
+
+       It("should update an existing trigger", func() {
+               Triggers[name] = &whisk.Trigger{}
+               Expect(len(Triggers)).To(Equal(1))
+               err := t.Update(&client, args)
+               Expect(err).To(BeNil())
+               Expect(len(Triggers)).To(Equal(1))
+       })
+
+       It("should create a trigger on update when it does not exist yet", 
func() {
+               Expect(len(Triggers)).To(Equal(0))
+               err := t.Update(&client, args)
+               Expect(err).To(BeNil())
+               Expect(len(Triggers)).To(Equal(1))
+       })
+})

Reply via email to