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