You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwhisk.apache.org by ho...@apache.org on 2017/06/23 04:04:29 UTC

[incubator-openwhisk-cli] branch master updated (aeb8b46 -> 6a8c178)

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

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


    from aeb8b46  Merge pull request #57 from houshengbo/update-client-go-version
     new 6c534d1  Allow docker actions with zip files.  (#2112)
     new bd1f645  Error when Entity Names are Provided to List Commands (#2075)
     new 05f2c14  Fix the existing integration tests
     new 6a8c178  Remove appveyor script due to extremely slow build

The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .appveyor.yml                             |  21 ----
 .travis.yml                               |   2 -
 README.md                                 |   6 +-
 commands/action.go                        | 120 +++++++++++----------
 commands/activation.go                    |  31 ++----
 commands/api.go                           |  22 ++--
 commands/flags.go                         |  41 +++----
 commands/namespace.go                     |  27 ++---
 commands/package.go                       | 174 ++++++++++++------------------
 commands/rule.go                          | 136 +++++++++--------------
 commands/shared.go                        |  47 ++++++++
 commands/trigger.go                       | 170 +++++++++++------------------
 commands/util.go                          |  20 ++--
 commands/wsk.go                           |  10 +-
 tests/src/integration/common/wskprops.go  |   6 +-
 tests/src/integration/integration_test.go |  10 +-
 tools/travis/install_openwhisk.sh         |  43 --------
 tools/travis/test_openwhisk.sh            |  70 +++++++-----
 wski18n/i18n_resources.go                 |  22 ++--
 wski18n/resources/en_US.all.json          |  28 ++---
 20 files changed, 445 insertions(+), 561 deletions(-)
 delete mode 100644 .appveyor.yml
 create mode 100644 commands/shared.go
 delete mode 100755 tools/travis/install_openwhisk.sh

-- 
To stop receiving notification emails like this one, please contact
['"commits@openwhisk.apache.org" <co...@openwhisk.apache.org>'].

[incubator-openwhisk-cli] 01/04: Allow docker actions with zip files. (#2112)

Posted by ho...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 6c534d1c71166a03def3fff39f690d3731858b39
Author: rodric rabbah <ro...@gmail.com>
AuthorDate: Sat Jun 17 11:54:29 2017 -0400

    Allow docker actions with zip files.  (#2112)
    
    * Allow docker actions with zip files.
    Add native action for binary injection.
    Add note about breaking change for --docker option.
    
    * Separate dep fetching from rest of build to avoid repeated fetches when none changed.
---
 commands/action.go               | 89 +++++++++++++++++++++++++---------------
 commands/flags.go                | 41 ++++++++++--------
 wski18n/resources/en_US.all.json | 20 ++++-----
 3 files changed, 88 insertions(+), 62 deletions(-)

diff --git a/commands/action.go b/commands/action.go
index 2d8103f..8ba3633 100644
--- a/commands/action.go
+++ b/commands/action.go
@@ -58,10 +58,10 @@ var actionCreateCmd = &cobra.Command{
 
         if whiskErr := checkArgs(
             args,
-            2,
+            1,
             2,
             "Action create",
-            wski18n.T("An action name and action are required.")); whiskErr != nil {
+            wski18n.T("An action name and code artifact are required.")); whiskErr != nil {
                 return whiskErr
         }
 
@@ -94,11 +94,11 @@ var actionUpdateCmd = &cobra.Command{
             1,
             2,
             "Action update",
-            wski18n.T("An action name is required. An action is optional.")); whiskErr != nil {
+            wski18n.T("An action name is required. A code artifact is optional.")); whiskErr != nil {
                 return whiskErr
         }
 
-        if action, err = parseAction(cmd, args, false); err != nil {
+        if action, err = parseAction(cmd, args, true); err != nil {
             return actionParseError(cmd, args, err)
         }
 
@@ -321,7 +321,6 @@ var actionListCmd = &cobra.Command{
 
 func parseAction(cmd *cobra.Command, args []string, update bool) (*whisk.Action, error) {
     var err error
-    var artifact string
     var existingAction *whisk.Action
     var paramArgs []string
     var annotArgs []string
@@ -334,10 +333,6 @@ func parseAction(cmd *cobra.Command, args []string, update bool) (*whisk.Action,
         return nil, parseQualifiedNameError(args[0], err)
     }
 
-    if len(args) == 2 {
-        artifact = args[1]
-    }
-
     client.Namespace = qualifiedName.namespace
     action := new(whisk.Action)
     action.Name = qualifiedName.entityName
@@ -387,11 +382,20 @@ func parseAction(cmd *cobra.Command, args []string, update bool) (*whisk.Action,
         action.Parameters = append(action.Parameters, existingAction.Parameters...)
         action.Annotations = append(action.Annotations, existingAction.Annotations...)
     } else if Flags.action.sequence {
-        action.Exec = new(whisk.Exec)
-        action.Exec.Kind = "sequence"
-        action.Exec.Components = csvToQualifiedActions(artifact)
-    } else if len(artifact) > 0 {
-        action.Exec, err = getExec(args[1], Flags.action.kind, Flags.action.docker, Flags.action.main)
+        if len(args) == 2 {
+            action.Exec = new(whisk.Exec)
+            action.Exec.Kind = "sequence"
+            action.Exec.Components = csvToQualifiedActions(args[1])
+        } else {
+            return nil, noArtifactError()
+        }
+    } else if len(args) > 1 || len(Flags.action.docker) > 0 {
+        action.Exec, err = getExec(args, Flags.action)
+        if err != nil {
+            return nil, err
+        }
+    } else if !update {
+        return nil, noArtifactError()
     }
 
     if cmd.LocalFlags().Changed(WEB_FLAG) {
@@ -403,39 +407,48 @@ func parseAction(cmd *cobra.Command, args []string, update bool) (*whisk.Action,
     return action, err
 }
 
-func getExec(artifact string, kind string, isDocker bool, mainEntry string) (*whisk.Exec, error) {
+func getExec(args []string, params ActionFlags) (*whisk.Exec, error) {
     var err error
     var code string
     var exec *whisk.Exec
 
-    ext := filepath.Ext(artifact)
     exec = new(whisk.Exec)
+    kind := params.kind
+    isNative := params.native
+    docker := params.docker
+    mainEntry := params.main
+    ext := ""
 
-    if !isDocker || ext == ".zip" {
+    if len(args) == 2 {
+        artifact := args[1]
+        ext = filepath.Ext(artifact)
         code, err = ReadFile(artifact)
 
+        if err != nil {
+            whisk.Debug(whisk.DbgError, "ReadFile(%s) error: %s\n", artifact, err)
+            return nil, err
+        }
+
         if ext == ".zip" || ext == ".jar" {
             // Base64 encode the file
             code = base64.StdEncoding.EncodeToString([]byte(code))
-            exec.Code = &code
-        } else {
-            exec.Code = &code
         }
 
-        if err != nil {
-            whisk.Debug(whisk.DbgError, "readFile(%s) error: %s\n", artifact, err)
-            return nil, err
-        }
+        exec.Code = &code
+    } else if len(args) == 1 && len(docker) == 0 {
+        return nil, noArtifactError()
+    } else if len(args) > 1 {
+        return nil, noArtifactError()
     }
 
     if len(kind) > 0 {
         exec.Kind = kind
-    } else if isDocker {
+    } else if len(docker) > 0 || isNative {
         exec.Kind = "blackbox"
-        if ext != ".zip" {
-            exec.Image = artifact
-        } else {
+        if isNative {
             exec.Image = "openwhisk/dockerskeleton"
+        } else {
+            exec.Image = docker
         }
     } else if ext == ".swift" {
         exec.Kind = "swift:default"
@@ -574,7 +587,7 @@ func nestedError(errorMessage string, err error) (error) {
 func nonNestedError(errorMessage string) (error) {
     return whisk.MakeWskError(
         errors.New(errorMessage),
-        whisk.EXITCODE_ERR_GENERAL,
+        whisk.EXITCODE_ERR_USAGE,
         whisk.DISPLAY_MSG,
         whisk.DISPLAY_USAGE)
 }
@@ -583,9 +596,9 @@ func actionParseError(cmd *cobra.Command, args []string, err error) (error) {
     whisk.Debug(whisk.DbgError, "parseAction(%s, %s) error: %s\n", cmd, args, err)
 
     errMsg := wski18n.T(
-        "Unable to parse action command arguments: {{.err}}",
+        "Invalid argument(s). {{.required}}",
         map[string]interface{}{
-            "err": err,
+            "required": err,
         })
 
     return nestedError(errMsg, err)
@@ -726,6 +739,12 @@ func zipKindError() (error) {
     return nonNestedError(errMsg)
 }
 
+func noArtifactError() (error) {
+    errMsg := wski18n.T("An action name and code artifact are required.")
+
+    return nonNestedError(errMsg)
+}
+
 func extensionError(extension string) (error) {
     errMsg := wski18n.T(
         "'{{.name}}' is not a supported action runtime",
@@ -875,21 +894,23 @@ func isWebAction(client *whisk.Client, qname QualifiedName) error {
 }
 
 func init() {
-    actionCreateCmd.Flags().BoolVar(&Flags.action.docker, "docker", false, wski18n.T("treat ACTION as docker image path on dockerhub"))
+    actionCreateCmd.Flags().BoolVar(&Flags.action.native, "native", false, wski18n.T("treat ACTION as native action (zip file provides a compatible executable to run)"))
+    actionCreateCmd.Flags().StringVar(&Flags.action.docker, "docker", "", wski18n.T("use provided docker image (a path on DockerHub) to run the action"))
     actionCreateCmd.Flags().BoolVar(&Flags.action.copy, "copy", false, wski18n.T("treat ACTION as the name of an existing action"))
     actionCreateCmd.Flags().BoolVar(&Flags.action.sequence, "sequence", false, wski18n.T("treat ACTION as comma separated sequence of actions to invoke"))
     actionCreateCmd.Flags().StringVar(&Flags.action.kind, "kind", "", wski18n.T("the `KIND` of the action runtime (example: swift:default, nodejs:default)"))
     actionCreateCmd.Flags().StringVar(&Flags.action.main, "main", "", wski18n.T("the name of the action entry point (function or fully-qualified method name when applicable)"))
     actionCreateCmd.Flags().IntVarP(&Flags.action.timeout, "timeout", "t", TIMEOUT_LIMIT, wski18n.T("the timeout `LIMIT` in milliseconds after which the action is terminated"))
     actionCreateCmd.Flags().IntVarP(&Flags.action.memory, "memory", "m", MEMORY_LIMIT, wski18n.T("the maximum memory `LIMIT` in MB for the action"))
-    actionCreateCmd.Flags().IntVarP(&Flags.action.logsize, "logsize", "l", LOGSIZE_LIMIT, wski18n.T("the maximum log size `LIMIT` in MB for the action"))
+    actionCreateCmd.Flags().IntVarP(&flags.action.logsize, "logsize", "l", LOGSIZE_LIMIT, wski18n.T("the maximum log size `LIMIT` in MB for the action"))
     actionCreateCmd.Flags().StringSliceVarP(&Flags.common.annotation, "annotation", "a", nil, wski18n.T("annotation values in `KEY VALUE` format"))
     actionCreateCmd.Flags().StringVarP(&Flags.common.annotFile, "annotation-file", "A", "", wski18n.T("`FILE` containing annotation values in JSON format"))
     actionCreateCmd.Flags().StringSliceVarP(&Flags.common.param, "param", "p", nil, wski18n.T("parameter values in `KEY VALUE` format"))
     actionCreateCmd.Flags().StringVarP(&Flags.common.paramFile, "param-file", "P", "", wski18n.T("`FILE` containing parameter values in JSON format"))
     actionCreateCmd.Flags().StringVar(&Flags.action.web, "web", "", wski18n.T("treat ACTION as a web action, a raw HTTP web action, or as a standard action; yes | true = web action, raw = raw HTTP web action, no | false = standard action"))
 
-    actionUpdateCmd.Flags().BoolVar(&Flags.action.docker, "docker", false, wski18n.T("treat ACTION as docker image path on dockerhub"))
+    actionUpdateCmd.Flags().BoolVar(&Flags.action.native, "native", false, wski18n.T("treat ACTION as native action (zip file provides a compatible executable to run)"))
+    actionUpdateCmd.Flags().StringVar(&Flags.action.docker, "docker", "", wski18n.T("use provided docker image (a path on DockerHub) to run the action"))
     actionUpdateCmd.Flags().BoolVar(&Flags.action.copy, "copy", false, wski18n.T("treat ACTION as the name of an existing action"))
     actionUpdateCmd.Flags().BoolVar(&Flags.action.sequence, "sequence", false, wski18n.T("treat ACTION as comma separated sequence of actions to invoke"))
     actionUpdateCmd.Flags().StringVar(&Flags.action.kind, "kind", "", wski18n.T("the `KIND` of the action runtime (example: swift:default, nodejs:default)"))
diff --git a/commands/flags.go b/commands/flags.go
index d40e2aa..5695be8 100644
--- a/commands/flags.go
+++ b/commands/flags.go
@@ -32,7 +32,9 @@ const WEB_FLAG      = "web"
 
 var cliDebug = os.Getenv("WSK_CLI_DEBUG")  // Useful for tracing init() code
 
-var Flags struct {
+var Flags FlagsStruct
+
+type FlagsStruct struct {
 
     Global struct {
         Verbose    bool
@@ -49,10 +51,10 @@ var Flags struct {
         annotFile   string
         param       []string
         paramFile   string
-        shared      string // AKA "public" or "publish"
-        skip        int  // skip first N records
-        limit       int  // return max N records
-        full        bool // return full records (docs=true for client request)
+        shared      string  // AKA "public" or "publish"
+        skip        int     // skip first N records
+        limit       int     // return max N records
+        full        bool    // return full records (docs=true for client request)
         summary     bool
         feed        string  // name of feed
         detail      bool
@@ -74,19 +76,7 @@ var Flags struct {
         namespaceSet    string
     }
 
-    action struct {
-        docker      bool
-        copy        bool
-        pipe        bool
-        web         string
-        sequence    bool
-        timeout     int
-        memory      int
-        logsize     int
-        result      bool
-        kind        string
-        main        string
-    }
+    action ActionFlags
 
     activation struct {
         action          string // retrieve results for this action
@@ -123,6 +113,21 @@ var Flags struct {
     }
 }
 
+
+type ActionFlags struct {
+    docker      string
+    native      bool
+    copy        bool
+    web         string
+    sequence    bool
+    timeout     int
+    memory      int
+    logsize     int
+    result      bool
+    kind        string
+    main        string
+}
+
 func IsVerbose() bool {
     return Flags.Global.Verbose || IsDebug()
 }
diff --git a/wski18n/resources/en_US.all.json b/wski18n/resources/en_US.all.json
index e173b42..7a9b778 100644
--- a/wski18n/resources/en_US.all.json
+++ b/wski18n/resources/en_US.all.json
@@ -688,10 +688,6 @@
     "translation": "Arguments must be comma separated, and must be quoted if they contain spaces."
   },
   {
-    "id": "Invalid arguments: {{.err}}",
-    "translation": "Invalid arguments: {{.err}}"
-  },
-  {
     "id": "The argument `{{.arg}}` is invalid: {{.err}}",
     "translation": "The argument `{{.arg}}` is invalid: {{.err}}"
   },
@@ -872,8 +868,12 @@
     "translation": "Java actions require --main to specify the fully-qualified name of the main class"
   },
   {
-    "id": "treat ACTION as docker image path on dockerhub",
-    "translation": "treat ACTION as docker image path on dockerhub"
+    "id": "treat ACTION as native action (zip file provides a compatible executable to run)",
+    "translation": "treat ACTION as native action (zip file provides a compatible executable to run)"
+  },
+  {
+    "id": "use provided docker image (a path on DockerHub) to run the action",
+    "translation": "use provided docker image (a path on DockerHub) to run the action"
   },
   {
     "id": "treat ACTION as the name of an existing action",
@@ -1048,16 +1048,16 @@
     "translation": "The annotation arguments are invalid: {{.err}}"
   },
   {
-    "id": "An action name and action are required.",
-    "translation": "An action name and action are required."
+    "id": "An action name and code artifact are required.",
+    "translation": "An action name and code artifact are required."
   },
   {
     "id": "An action name is required.",
     "translation": "An action name is required."
   },
   {
-    "id": "An action name is required. An action is optional.",
-    "translation": "An action name is required. An action is optional."
+    "id": "An action name is required. A code artifact is optional.",
+    "translation": "An action name is required. A code artifact is optional."
   },
   {
     "id": "An activation ID is required.",

-- 
To stop receiving notification emails like this one, please contact
"commits@openwhisk.apache.org" <co...@openwhisk.apache.org>.

[incubator-openwhisk-cli] 04/04: Remove appveyor script due to extremely slow build

Posted by ho...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 6a8c1783e39fbb3322a6eee0483d45983ccb7c1e
Author: Vincent Hou <sh...@us.ibm.com>
AuthorDate: Thu Jun 22 14:57:17 2017 -0400

    Remove appveyor script due to extremely slow build
    
    The current appveyor script is a POC for us to prove appveyor is
    a candidate to run test cases and build binaries for windows. It
    does not have concrete effective script in it, but the appveyor
    infrastructure is extremely slow and blocks the development. We have
    to find out the reason why it is so slow and resolve before we
    add the real appveyor support.
---
 .appveyor.yml                            | 21 ----------
 README.md                                |  6 +--
 tests/src/integration/common/wskprops.go |  6 +--
 tools/travis/install_openwhisk.sh        | 47 ---------------------
 tools/travis/test_openwhisk.sh           | 70 +++++++++++++++++++++-----------
 5 files changed, 52 insertions(+), 98 deletions(-)

diff --git a/.appveyor.yml b/.appveyor.yml
deleted file mode 100644
index dc262e3..0000000
--- a/.appveyor.yml
+++ /dev/null
@@ -1,21 +0,0 @@
-clone_folder: c:\gopath\src\github.com\apache\incubator-openwhisk-cli
-
-environment:
-  GOPATH: c:\gopath
-
-build: off
-
-before_test:
-  - go get -u github.com/golang/lint/golint
-  - go get -d -t ./...
-
-install:
-  - echo %PATH%
-  - echo %GOPATH%
-  - set PATH=%GOPATH%\bin;c:\go\bin;%PATH%
-  - go version
-  - echo %PATH%
-  - go env
-
-test_script:
-  - echo %PATH%
\ No newline at end of file
diff --git a/README.md b/README.md
index 7b50d20..757472b 100644
--- a/README.md
+++ b/README.md
@@ -100,6 +100,6 @@ To get CLI command debug information, include the -d, or --debug flag when execu
 # Continuous Integration
 
 In order to build OpenWhisk CLI binaries with good quality, OpenWhisk CLI uses Travis CI as the continuous
-delivery service for Linux and Mac, and AppVeyor CI for Windows. OpenWhisk CLI is a Go project. Currently Travis
-CI supports the environments of Linux and Mac, but it is not available for Windows, which is the reason why we
-uses AppVeyor CI to run the test cases and build the binary for Windows.
+delivery service for Linux and Mac. OpenWhisk CLI is a Go project. Currently Travis CI supports the environments
+of Linux and Mac, but it is not available for Windows. We will add support of AppVeyor CI in future to run the
+test cases and build the binary for Windows.
diff --git a/tests/src/integration/common/wskprops.go b/tests/src/integration/common/wskprops.go
index 876a5de..ab6a728 100644
--- a/tests/src/integration/common/wskprops.go
+++ b/tests/src/integration/common/wskprops.go
@@ -47,9 +47,9 @@ func GetWskprops() *Wskprops {
         if err == nil {
             dep.AuthKey = string(b)
         }
-        dep.APIHost = viper.GetString("router.host")
-        dep.ControllerHost = viper.GetString("router.host")
-        dep.ControllerPort = viper.GetString("controller.host.port")
+        dep.APIHost = viper.GetString("controller.hosts")
+        dep.ControllerHost = viper.GetString("controller.hosts")
+        dep.ControllerPort = viper.GetString("controller.host.basePort")
     }
     return &dep
 }
diff --git a/tools/travis/install_openwhisk.sh b/tools/travis/install_openwhisk.sh
deleted file mode 100755
index 4bc601c..0000000
--- a/tools/travis/install_openwhisk.sh
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-
-export OPENWHISK_HOME="$(dirname "$TRAVIS_BUILD_DIR")/incubator-openwhisk";
-HOMEDIR="$(dirname "$TRAVIS_BUILD_DIR")"
-cd $HOMEDIR
-
-# Clone the OpenWhisk code
-git clone --depth 3 https://github.com/apache/incubator-openwhisk.git
-
-# Build script for Travis-CI.
-WHISKDIR="$OPENWHISK_HOME"
-
-cd $WHISKDIR
-./tools/travis/setup.sh
-
-ANSIBLE_CMD="ansible-playbook -i environments/local -e docker_image_prefix=testing"
-
-cd $WHISKDIR/ansible
-$ANSIBLE_CMD setup.yml
-$ANSIBLE_CMD prereq.yml
-$ANSIBLE_CMD couchdb.yml
-$ANSIBLE_CMD initdb.yml
-$ANSIBLE_CMD apigateway.yml
-
-cd $WHISKDIR
-./gradlew distDocker -PdockerImagePrefix=testing
-
-cd $WHISKDIR/ansible
-$ANSIBLE_CMD wipe.yml
-$ANSIBLE_CMD openwhisk.yml
-
-# Copy the binary generated into the OPENWHISK_HOME/bin, so that the test cases will run based on it.
-mkdir -p $WHISKDIR/bin
-cp $TRAVIS_BUILD_DIR/wsk $WHISKDIR/bin
-
-# Run the test cases under openwhisk to ensure the quality of the binary.
-cd $WHISKDIR
-./gradlew :tests:test -Dtest.single=Wsk*Tests*
-./gradlew tests:test -Dtest.single=*ApiGwRoutemgmtActionTests*
-sleep 30
-./gradlew tests:test -Dtest.single=*ApiGwTests*
-sleep 30
-./gradlew tests:test -Dtest.single=*ApiGwEndToEndTests*
-sleep 30
-make integration_test;
\ No newline at end of file
diff --git a/tools/travis/test_openwhisk.sh b/tools/travis/test_openwhisk.sh
index 9d096d7..f25b51c 100755
--- a/tools/travis/test_openwhisk.sh
+++ b/tools/travis/test_openwhisk.sh
@@ -1,26 +1,48 @@
 #!/usr/bin/env bash
 
-PIDS=()
-ERRORS=0
-
-function waitForAll() {
-    for pid in ${PIDS[@]}; do
-        wait $pid
-        STATUS=$?
-        echo "$pid finished with status $STATUS"
-        if [ $STATUS -ne 0 ]
-        then
-            let ERRORS=ERRORS+1
-        fi
-    done
-    PIDS=()
-}
-
-"$TRAVIS_BUILD_DIR/tools/travis/install_openwhisk.sh" &
-PID=$!
-PIDS+=($PID)
-
-waitForAll
-
-echo test openwhisk ERRORS = $ERRORS
-exit $ERRORS
+set -e
+
+export OPENWHISK_HOME="$(dirname "$TRAVIS_BUILD_DIR")/incubator-openwhisk";
+HOMEDIR="$(dirname "$TRAVIS_BUILD_DIR")"
+cd $HOMEDIR
+
+# Clone the OpenWhisk code
+git clone --depth 3 https://github.com/apache/incubator-openwhisk.git
+
+# Build script for Travis-CI.
+WHISKDIR="$OPENWHISK_HOME"
+
+cd $WHISKDIR
+./tools/travis/setup.sh
+
+ANSIBLE_CMD="ansible-playbook -i environments/local -e docker_image_prefix=testing"
+
+cd $WHISKDIR/ansible
+$ANSIBLE_CMD setup.yml
+$ANSIBLE_CMD prereq.yml
+$ANSIBLE_CMD couchdb.yml
+$ANSIBLE_CMD initdb.yml
+$ANSIBLE_CMD apigateway.yml
+
+cd $WHISKDIR
+./gradlew distDocker -PdockerImagePrefix=testing
+
+cd $WHISKDIR/ansible
+$ANSIBLE_CMD wipe.yml
+$ANSIBLE_CMD openwhisk.yml
+
+# Copy the binary generated into the OPENWHISK_HOME/bin, so that the test cases will run based on it.
+mkdir -p $WHISKDIR/bin
+cp $TRAVIS_BUILD_DIR/wsk $WHISKDIR/bin
+
+# Run the test cases under openwhisk to ensure the quality of the binary.
+cd $WHISKDIR
+./gradlew :tests:test -Dtest.single=Wsk*Tests*
+./gradlew :tests:test -Dtest.single=*ApiGwRoutemgmtActionTests*
+sleep 30
+./gradlew :tests:test -Dtest.single=*ApiGwTests*
+sleep 30
+./gradlew :tests:test -Dtest.single=*ApiGwEndToEndTests*
+sleep 30
+cd $TRAVIS_BUILD_DIR
+make integration_test

-- 
To stop receiving notification emails like this one, please contact
"commits@openwhisk.apache.org" <co...@openwhisk.apache.org>.

[incubator-openwhisk-cli] 03/04: Fix the existing integration tests

Posted by ho...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 05f2c145682f9d0278b96f4d38bdc971135c602c
Author: Vincent Hou <sh...@us.ibm.com>
AuthorDate: Thu Jun 22 11:04:50 2017 -0400

    Fix the existing integration tests
    
    After a sync-up with openwhisk for the updated cli, the integration
    tests in Go has to be updated with the new messages.
---
 .appveyor.yml                             |  2 +-
 .travis.yml                               |  2 --
 tests/src/integration/integration_test.go | 10 +++++++---
 tools/travis/install_openwhisk.sh         | 10 +++++++---
 4 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/.appveyor.yml b/.appveyor.yml
index 1c79b2c..dc262e3 100644
--- a/.appveyor.yml
+++ b/.appveyor.yml
@@ -1,4 +1,4 @@
-clone_folder: c:\gopath\src\github.com\openwhisk\openwhisk-cli
+clone_folder: c:\gopath\src\github.com\apache\incubator-openwhisk-cli
 
 environment:
   GOPATH: c:\gopath
diff --git a/.travis.yml b/.travis.yml
index ccb9f4e..e773f69 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -34,9 +34,7 @@ script:
   - export PATH=$PATH:$TRAVIS_BUILD_DIR;
   - make native_test;
   - if [ "$TRAVIS_OS_NAME" == "linux" ] ; then
-      export OPENWHISK_HOME="$(dirname "$TRAVIS_BUILD_DIR")/openwhisk";
       ./tools/travis/test_openwhisk.sh;
-      make integration_test;
     fi
 
 after_script:
diff --git a/tests/src/integration/integration_test.go b/tests/src/integration/integration_test.go
index 3224e09..5a2bc6b 100644
--- a/tests/src/integration/integration_test.go
+++ b/tests/src/integration/integration_test.go
@@ -31,9 +31,9 @@ var invalidArgs []common.InvalidArg
 var invalidArgsMsg = "error: Invalid argument(s)"
 var tooFewArgsMsg = invalidArgsMsg + "."
 var tooManyArgsMsg = invalidArgsMsg + ": "
-var actionNameActionReqMsg = "An action name and action are required."
+var actionNameActionReqMsg = "An action name and code artifact are required."
 var actionNameReqMsg = "An action name is required."
-var actionOptMsg = "An action is optional."
+var actionOptMsg = "A code artifact is optional."
 var packageNameReqMsg = "A package name is required."
 var packageNameBindingReqMsg = "A package name and binding name are required."
 var ruleNameReqMsg = "A rule name is required."
@@ -469,7 +469,11 @@ func TestRejectCommInvalidArgs(t *testing.T) {
         stdout, err := wsk.RunCommand(cs...)
         outputString := string(stdout)
         assert.NotEqual(t, nil, err, "The command should fail to run.")
-        assert.Equal(t, "exit status 1", err.Error(), "The error should be exit status 1.")
+        if (err.Error() == "exit status 1") {
+            assert.Equal(t, "exit status 1", err.Error(), "The error should be exit status 1 or 2.")
+        } else {
+            assert.Equal(t, "exit status 2", err.Error(), "The error should be exit status 1 or 2.")
+        }
         assert.Contains(t, outputString, invalidArg.Err,
             "The output of the command does not contain " + invalidArg.Err)
         assert.Contains(t, outputString, "Run 'wsk --help' for usage",
diff --git a/tools/travis/install_openwhisk.sh b/tools/travis/install_openwhisk.sh
index b5994af..4bc601c 100755
--- a/tools/travis/install_openwhisk.sh
+++ b/tools/travis/install_openwhisk.sh
@@ -1,13 +1,16 @@
 #!/usr/bin/env bash
 
+set -e
+
+export OPENWHISK_HOME="$(dirname "$TRAVIS_BUILD_DIR")/incubator-openwhisk";
 HOMEDIR="$(dirname "$TRAVIS_BUILD_DIR")"
 cd $HOMEDIR
 
 # Clone the OpenWhisk code
-git clone --depth 3 https://github.com/openwhisk/openwhisk.git
+git clone --depth 3 https://github.com/apache/incubator-openwhisk.git
 
 # Build script for Travis-CI.
-WHISKDIR="$HOMEDIR/openwhisk"
+WHISKDIR="$OPENWHISK_HOME"
 
 cd $WHISKDIR
 ./tools/travis/setup.sh
@@ -35,9 +38,10 @@ cp $TRAVIS_BUILD_DIR/wsk $WHISKDIR/bin
 # Run the test cases under openwhisk to ensure the quality of the binary.
 cd $WHISKDIR
 ./gradlew :tests:test -Dtest.single=Wsk*Tests*
-sleep 30
 ./gradlew tests:test -Dtest.single=*ApiGwRoutemgmtActionTests*
 sleep 30
 ./gradlew tests:test -Dtest.single=*ApiGwTests*
 sleep 30
 ./gradlew tests:test -Dtest.single=*ApiGwEndToEndTests*
+sleep 30
+make integration_test;
\ No newline at end of file

-- 
To stop receiving notification emails like this one, please contact
"commits@openwhisk.apache.org" <co...@openwhisk.apache.org>.

[incubator-openwhisk-cli] 02/04: Error when Entity Names are Provided to List Commands (#2075)

Posted by ho...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit bd1f645a3f76e06219180a8a611652c571330dd8
Author: James Dubee <jw...@us.ibm.com>
AuthorDate: Tue Jun 20 09:27:38 2017 -0400

    Error when Entity Names are Provided to List Commands (#2075)
    
    * Error when Entity Names are Provided to List Commands
    
    - When entity names are pass to list commands display an appropriate error
    - Share qualified name parsing error messages between commands
---
 commands/action.go               |  35 +++-----
 commands/activation.go           |  31 +++----
 commands/api.go                  |  22 ++---
 commands/namespace.go            |  27 ++----
 commands/package.go              | 174 +++++++++++++++------------------------
 commands/rule.go                 | 136 +++++++++++-------------------
 commands/shared.go               |  47 +++++++++++
 commands/trigger.go              | 170 ++++++++++++++------------------------
 commands/util.go                 |  20 ++---
 commands/wsk.go                  |  10 ++-
 wski18n/i18n_resources.go        |  22 ++---
 wski18n/resources/en_US.all.json |   8 +-
 12 files changed, 300 insertions(+), 402 deletions(-)

diff --git a/commands/action.go b/commands/action.go
index 8ba3633..6b57621 100644
--- a/commands/action.go
+++ b/commands/action.go
@@ -279,8 +279,8 @@ var actionDeleteCmd = &cobra.Command{
 }
 
 var actionListCmd = &cobra.Command{
-    Use:           "list [NAMESPACE]",
-    Short:         wski18n.T("list all actions"),
+    Use:           "list [ NAMESPACE | PACKAGE_NAME ]",
+    Short:         wski18n.T("list all actions in a namespace or actions contained in a package"),
     SilenceUsage:  true,
     SilenceErrors: true,
     PreRunE:       setupClientConfig,
@@ -289,13 +289,7 @@ var actionListCmd = &cobra.Command{
         var actions []whisk.Action
         var err error
 
-        if len(args) == 1 {
-            if qualifiedName, err = parseQualifiedName(args[0]); err != nil {
-                return parseQualifiedNameError(args[0], err)
-            }
-
-            client.Namespace = qualifiedName.namespace
-        } else if whiskErr := checkArgs(
+        if whiskErr := checkArgs(
             args,
             0,
             1,
@@ -304,6 +298,14 @@ var actionListCmd = &cobra.Command{
             return whiskErr
         }
 
+        if len(args) == 1 {
+            if qualifiedName, err = parseQualifiedName(args[0]); err != nil {
+                return parseQualifiedNameError(args[0], err)
+            }
+
+            client.Namespace = qualifiedName.namespace
+        }
+
         options := &whisk.ActionListOptions{
             Skip:  Flags.common.skip,
             Limit: Flags.common.limit,
@@ -617,19 +619,6 @@ func actionInsertError(action *whisk.Action, err error) (error) {
     return nestedError(errMsg, err)
 }
 
-func parseQualifiedNameError(entityName string, err error) (error) {
-    whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", entityName, err)
-
-    errMsg := wski18n.T(
-        "'{{.name}}' is not a valid qualified name: {{.err}}",
-        map[string]interface{}{
-            "name": entityName,
-            "err": err,
-        })
-
-    return nestedError(errMsg, err)
-}
-
 func getJSONFromStringsParamError(params []string, keyValueFormat bool, err error) (error) {
     whisk.Debug(whisk.DbgError, "getJSONFromStrings(%#v, %t) failed: %s\n", params, keyValueFormat, err)
 
@@ -902,7 +891,7 @@ func init() {
     actionCreateCmd.Flags().StringVar(&Flags.action.main, "main", "", wski18n.T("the name of the action entry point (function or fully-qualified method name when applicable)"))
     actionCreateCmd.Flags().IntVarP(&Flags.action.timeout, "timeout", "t", TIMEOUT_LIMIT, wski18n.T("the timeout `LIMIT` in milliseconds after which the action is terminated"))
     actionCreateCmd.Flags().IntVarP(&Flags.action.memory, "memory", "m", MEMORY_LIMIT, wski18n.T("the maximum memory `LIMIT` in MB for the action"))
-    actionCreateCmd.Flags().IntVarP(&flags.action.logsize, "logsize", "l", LOGSIZE_LIMIT, wski18n.T("the maximum log size `LIMIT` in MB for the action"))
+    actionCreateCmd.Flags().IntVarP(&Flags.action.logsize, "logsize", "l", LOGSIZE_LIMIT, wski18n.T("the maximum log size `LIMIT` in MB for the action"))
     actionCreateCmd.Flags().StringSliceVarP(&Flags.common.annotation, "annotation", "a", nil, wski18n.T("annotation values in `KEY VALUE` format"))
     actionCreateCmd.Flags().StringVarP(&Flags.common.annotFile, "annotation-file", "A", "", wski18n.T("`FILE` containing annotation values in JSON format"))
     actionCreateCmd.Flags().StringSliceVarP(&Flags.common.param, "param", "p", nil, wski18n.T("parameter values in `KEY VALUE` format"))
diff --git a/commands/activation.go b/commands/activation.go
index 4584110..347f612 100644
--- a/commands/activation.go
+++ b/commands/activation.go
@@ -51,35 +51,26 @@ var activationListCmd = &cobra.Command{
     PreRunE: setupClientConfig,
     RunE: func(cmd *cobra.Command, args []string) error {
         var err error
-        qName := QualifiedName{}
+        var qualifiedName QualifiedName
+
+        if whiskErr := checkArgs(args, 0, 1, "Activation list",
+            wski18n.T("An optional namespace is the only valid argument.")); whiskErr != nil {
+            return whiskErr
+        }
 
         // Specifying an activation item name filter is optional
         if len(args) == 1 {
             whisk.Debug(whisk.DbgInfo, "Activation item name filter '%s' provided\n", args[0])
-            qName, err = parseQualifiedName(args[0])
-            if err != nil {
-                whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", args[0], err)
-                errStr := wski18n.T("'{{.name}}' is not a valid qualified name: {{.err}}",
-                        map[string]interface{}{"name": args[0], "err": err})
-                werr := whisk.MakeWskErrorFromWskError(errors.New(errStr), err, whisk.EXITCODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
-                return werr
-            }
-            ns := qName.namespace
-            if len(ns) == 0 {
-                whisk.Debug(whisk.DbgError, "Namespace '%s' is invalid\n", ns)
-                errStr := wski18n.T("Namespace '{{.name}}' is invalid", map[string]interface{}{"name": ns})
-                werr := whisk.MakeWskError(errors.New(errStr), whisk.EXITCODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.DISPLAY_USAGE)
-                return werr
+
+            if qualifiedName, err = parseQualifiedName(args[0]); err != nil {
+                return parseQualifiedNameError(args[0], err)
             }
 
-            client.Namespace = ns
-        } else if whiskErr := checkArgs(args, 0, 1, "Activation list",
-                wski18n.T("An optional namespace is the only valid argument.")); whiskErr != nil {
-            return whiskErr
+            client.Namespace = qualifiedName.namespace
         }
 
         options := &whisk.ActivationListOptions{
-            Name:  qName.entityName,
+            Name:  qualifiedName.entityName,
             Limit: Flags.common.limit,
             Skip:  Flags.common.skip,
             Upto:  Flags.activation.upto,
diff --git a/commands/api.go b/commands/api.go
index 30bcad2..11aa494 100644
--- a/commands/api.go
+++ b/commands/api.go
@@ -607,19 +607,13 @@ func parseApi(cmd *cobra.Command, args []string) (*whisk.Api, error) {
     }
 
     // Is the specified action name valid?
-    var qName QualifiedName
+    var qualifiedName QualifiedName
     if (len(args) == 3) {
-        qName = QualifiedName{}
-        qName, err = parseQualifiedName(args[2])
-        if err != nil {
-            whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", args[2], err)
-            errMsg := wski18n.T("'{{.name}}' is not a valid action name: {{.err}}",
-                map[string]interface{}{"name": args[2], "err": err})
-            whiskErr := whisk.MakeWskErrorFromWskError(errors.New(errMsg), err, whisk.EXITCODE_ERR_GENERAL,
-                whisk.DISPLAY_MSG, whisk.DISPLAY_USAGE)
-            return nil, whiskErr
+        if qualifiedName, err = parseQualifiedName(args[2]); err != nil {
+            return nil, parseQualifiedNameError(args[2], err)
         }
-        if (qName.entityName == "") {
+
+        if (qualifiedName.entityName == "") {
             whisk.Debug(whisk.DbgError, "Action name '%s' is invalid\n", args[2])
             errMsg := wski18n.T("'{{.name}}' is not a valid action name.", map[string]interface{}{"name": args[2]})
             whiskErr := whisk.MakeWskErrorFromWskError(errors.New(errMsg), err, whisk.EXITCODE_ERR_GENERAL,
@@ -642,10 +636,10 @@ func parseApi(cmd *cobra.Command, args []string) (*whisk.Api, error) {
 
     api.Namespace = client.Config.Namespace
     api.Action = new(whisk.ApiAction)
-    api.Action.BackendUrl = "https://" + client.Config.Host + "/api/v1/namespaces/" + qName.namespace + "/actions/" + qName.entityName
+    api.Action.BackendUrl = "https://" + client.Config.Host + "/api/v1/namespaces/" + qualifiedName.namespace + "/actions/" + qualifiedName.entityName
     api.Action.BackendMethod = "POST"
-    api.Action.Name = qName.entityName
-    api.Action.Namespace = qName.namespace
+    api.Action.Name = qualifiedName.entityName
+    api.Action.Namespace = qualifiedName.namespace
     api.Action.Auth = client.Config.AuthToken
     api.ApiName = apiname
     api.GatewayBasePath = basepath
diff --git a/commands/namespace.go b/commands/namespace.go
index de4e877..3a52396 100644
--- a/commands/namespace.go
+++ b/commands/namespace.go
@@ -67,7 +67,7 @@ var namespaceGetCmd = &cobra.Command{
     SilenceErrors:  true,
     PreRunE: setupClientConfig,
     RunE: func(cmd *cobra.Command, args []string) error {
-        var qName QualifiedName
+        var qualifiedName QualifiedName
         var err error
 
         if whiskErr := checkArgs(args, 0, 1, "Namespace get",
@@ -77,18 +77,16 @@ var namespaceGetCmd = &cobra.Command{
 
         // Namespace argument is optional; defaults to configured property namespace
         if len(args) == 1 {
-            qName, err = parseQualifiedName(args[0])
-            if err != nil {
-                whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", args[0], err)
-                errMsg := wski18n.T("'{{.name}}' is not a valid qualified name: {{.err}}",
-                        map[string]interface{}{"name": args[0], "err": err})
-                werr := whisk.MakeWskErrorFromWskError(errors.New(errMsg), err, whisk.EXITCODE_ERR_GENERAL,
-                    whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
-                return werr
+            if qualifiedName, err = parseQualifiedName(args[0]); err != nil {
+                return parseQualifiedNameError(args[0], err)
+            }
+
+            if len(qualifiedName.entityName) > 0 {
+                return entityNameError(qualifiedName.entityName)
             }
         }
 
-        namespace, _, err := client.Namespaces.Get(qName.namespace)
+        namespace, _, err := client.Namespaces.Get(qualifiedName.namespace)
 
         if err != nil {
             whisk.Debug(whisk.DbgError, "client.Namespaces.Get(%s) error: %s\n", getClientNamespace(), err)
@@ -110,15 +108,6 @@ var namespaceGetCmd = &cobra.Command{
     },
 }
 
-var listCmd = &cobra.Command{
-    Use:   "list",
-    Short: wski18n.T("list entities in the current namespace"),
-    SilenceUsage:   true,
-    SilenceErrors:  true,
-    PreRunE: setupClientConfig,
-    RunE:   namespaceGetCmd.RunE,
-}
-
 func init() {
     namespaceCmd.AddCommand(
         namespaceListCmd,
diff --git a/commands/package.go b/commands/package.go
index 33e9665..68e75c5 100644
--- a/commands/package.go
+++ b/commands/package.go
@@ -42,6 +42,7 @@ var packageBindCmd = &cobra.Command{
   PreRunE:       setupClientConfig,
   RunE: func(cmd *cobra.Command, args []string) error {
     var err error
+    var pkgQualifiedName, bindQualifiedName QualifiedName
 
     if whiskErr := checkArgs(args, 2, 2, "Package bind",
             wski18n.T("A package name and binding name are required.")); whiskErr != nil {
@@ -49,28 +50,16 @@ var packageBindCmd = &cobra.Command{
     }
 
     packageName := args[0]
-    pkgQName, err := parseQualifiedName(packageName)
-    if err != nil {
-      whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", packageName, err)
-      errMsg := wski18n.T("'{{.name}}' is not a valid qualified name: {{.err}}",
-          map[string]interface{}{"name": packageName, "err": err})
-      werr := whisk.MakeWskErrorFromWskError(errors.New(errMsg), err, whisk.EXITCODE_ERR_GENERAL,
-        whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
-      return werr
+    if pkgQualifiedName, err = parseQualifiedName(packageName); err != nil {
+      return parseQualifiedNameError(packageName, err)
     }
 
     bindingName := args[1]
-    bindQName, err := parseQualifiedName(bindingName)
-    if err != nil {
-      whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", bindingName, err)
-      errMsg := wski18n.T("'{{.name}}' is not a valid qualified name: {{.err}}",
-          map[string]interface{}{"name": bindingName, "err": err})
-      werr := whisk.MakeWskErrorFromWskError(errors.New(errMsg), err, whisk.EXITCODE_ERR_GENERAL,
-        whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
-      return werr
+    if bindQualifiedName, err = parseQualifiedName(bindingName); err != nil {
+      return parseQualifiedNameError(bindingName, err)
     }
 
-    client.Namespace = bindQName.namespace
+    client.Namespace = bindQualifiedName.namespace
 
     // Convert the binding's list of default parameters from a string into []KeyValue
     // The 1 or more --param arguments have all been combined into a single []string
@@ -102,12 +91,12 @@ var packageBindCmd = &cobra.Command{
     }
 
     binding := whisk.Binding{
-      Name:      pkgQName.entityName,
-      Namespace: pkgQName.namespace,
+      Name:      pkgQualifiedName.entityName,
+      Namespace: pkgQualifiedName.namespace,
     }
 
     p := &whisk.BindingPackage{
-      Name:        bindQName.entityName,
+      Name:        bindQualifiedName.entityName,
       Annotations: annotations.(whisk.KeyValueArr),
       Parameters:  parameters.(whisk.KeyValueArr),
       Binding:     binding,
@@ -136,21 +125,17 @@ var packageCreateCmd = &cobra.Command{
   RunE: func(cmd *cobra.Command, args []string) error {
     var err error
     var shared, sharedSet bool
+    var qualifiedName QualifiedName
 
     if whiskErr := checkArgs(args, 1, 1, "Package create", wski18n.T("A package name is required.")); whiskErr != nil {
       return whiskErr
     }
 
-    qName, err := parseQualifiedName(args[0])
-    if err != nil {
-      whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", args[0], err)
-      errMsg := wski18n.T("'{{.name}}' is not a valid qualified name: {{.err}}",
-          map[string]interface{}{"name": args[0], "err": err})
-      werr := whisk.MakeWskErrorFromWskError(errors.New(errMsg), err, whisk.EXITCODE_ERR_GENERAL,
-        whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
-      return werr
+    if qualifiedName, err = parseQualifiedName(args[0]); err != nil {
+      return parseQualifiedNameError(args[0], err)
     }
-    client.Namespace = qName.namespace
+
+    client.Namespace = qualifiedName.namespace
 
     if shared, sharedSet, err = parseShared(Flags.common.shared); err != nil {
       whisk.Debug(whisk.DbgError, "parseShared(%s) failed: %s\n", Flags.common.shared, err)
@@ -180,8 +165,8 @@ var packageCreateCmd = &cobra.Command{
     }
 
     p := &whisk.Package{
-      Name:        qName.entityName,
-      Namespace:   qName.namespace,
+      Name:        qualifiedName.entityName,
+      Namespace:   qualifiedName.namespace,
       Annotations: annotations.(whisk.KeyValueArr),
       Parameters:  parameters.(whisk.KeyValueArr),
     }
@@ -196,7 +181,7 @@ var packageCreateCmd = &cobra.Command{
       errStr := wski18n.T(
         "Unable to create package '{{.name}}': {{.err}}",
         map[string]interface{}{
-          "name": qName.entityName,
+          "name": qualifiedName.entityName,
           "err": err,
         })
       werr := whisk.MakeWskErrorFromWskError(errors.New(errStr), err, whisk.EXITCODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
@@ -204,7 +189,7 @@ var packageCreateCmd = &cobra.Command{
     }
 
     fmt.Fprintf(color.Output, wski18n.T("{{.ok}} created package {{.name}}\n",
-      map[string]interface{}{"ok": color.GreenString(wski18n.T("ok:")), "name":boldString(qName.entityName)}))
+      map[string]interface{}{"ok": color.GreenString(wski18n.T("ok:")), "name":boldString(qualifiedName.entityName)}))
     return nil
   },
 }
@@ -218,21 +203,17 @@ var packageUpdateCmd = &cobra.Command{
   RunE: func(cmd *cobra.Command, args []string) error {
     var err error
     var shared, sharedSet bool
+    var qualifiedName QualifiedName
 
     if whiskErr := checkArgs(args, 1, 1, "Package update", wski18n.T("A package name is required.")); whiskErr != nil {
       return whiskErr
     }
 
-    qName, err := parseQualifiedName(args[0])
-    if err != nil {
-      whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", args[0], err)
-      errMsg := wski18n.T("'{{.name}}' is not a valid qualified name: {{.err}}",
-          map[string]interface{}{"name": args[0], "err": err})
-      werr := whisk.MakeWskErrorFromWskError(errors.New(errMsg), err, whisk.EXITCODE_ERR_GENERAL,
-        whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
-      return werr
+    if qualifiedName, err = parseQualifiedName(args[0]); err != nil {
+      return parseQualifiedNameError(args[0], err)
     }
-    client.Namespace = qName.namespace
+
+    client.Namespace = qualifiedName.namespace
 
     if shared, sharedSet, err = parseShared(Flags.common.shared); err != nil {
       whisk.Debug(whisk.DbgError, "parseShared(%s) failed: %s\n", Flags.common.shared, err)
@@ -261,8 +242,8 @@ var packageUpdateCmd = &cobra.Command{
     }
 
     p := &whisk.Package{
-      Name:        qName.entityName,
-      Namespace:   qName.namespace,
+      Name:        qualifiedName.entityName,
+      Namespace:   qualifiedName.namespace,
       Annotations: annotations.(whisk.KeyValueArr),
       Parameters:  parameters.(whisk.KeyValueArr),
     }
@@ -280,7 +261,7 @@ var packageUpdateCmd = &cobra.Command{
     }
 
     fmt.Fprintf(color.Output, wski18n.T("{{.ok}} updated package {{.name}}\n",
-      map[string]interface{}{"ok": color.GreenString(wski18n.T("ok:")), "name":boldString(qName.entityName)}))
+      map[string]interface{}{"ok": color.GreenString(wski18n.T("ok:")), "name":boldString(qualifiedName.entityName)}))
     return nil
   },
 }
@@ -294,6 +275,7 @@ var packageGetCmd = &cobra.Command{
   RunE: func(cmd *cobra.Command, args []string) error {
     var err error
     var field string
+    var qualifiedName QualifiedName
 
     if whiskErr := checkArgs(args, 1, 2, "Package get", wski18n.T("A package name is required.")); whiskErr != nil {
       return whiskErr
@@ -310,24 +292,18 @@ var packageGetCmd = &cobra.Command{
       }
     }
 
-    qName, err := parseQualifiedName(args[0])
-    if err != nil {
-      whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", args[0], err)
-      errMsg := wski18n.T("'{{.name}}' is not a valid qualified name: {{.err}}",
-          map[string]interface{}{"name": args[0], "err": err})
-      werr := whisk.MakeWskErrorFromWskError(errors.New(errMsg), err, whisk.EXITCODE_ERR_GENERAL,
-        whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
-      return werr
+    if qualifiedName, err = parseQualifiedName(args[0]); err != nil {
+      return parseQualifiedNameError(args[0], err)
     }
-    client.Namespace = qName.namespace
+    client.Namespace = qualifiedName.namespace
 
-    xPackage, _, err := client.Packages.Get(qName.entityName)
+    xPackage, _, err := client.Packages.Get(qualifiedName.entityName)
     if err != nil {
-      whisk.Debug(whisk.DbgError, "client.Packages.Get(%s) failed: %s\n", qName.entityName, err)
+      whisk.Debug(whisk.DbgError, "client.Packages.Get(%s) failed: %s\n", qualifiedName.entityName, err)
       errStr := wski18n.T(
         "Unable to get package '{{.name}}': {{.err}}",
         map[string]interface{}{
-          "name": qName.entityName,
+          "name": qualifiedName.entityName,
           "err":err,
         })
       werr := whisk.MakeWskErrorFromWskError(errors.New(errStr), err, whisk.EXITCODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
@@ -340,12 +316,12 @@ var packageGetCmd = &cobra.Command{
 
       if len(field) > 0 {
         fmt.Fprintf(color.Output, wski18n.T("{{.ok}} got package {{.name}}, displaying field {{.field}}\n",
-          map[string]interface{}{"ok": color.GreenString("ok:"), "name": boldString(qName.entityName),
+          map[string]interface{}{"ok": color.GreenString("ok:"), "name": boldString(qualifiedName.entityName),
           "field": boldString(field)}))
         printField(xPackage, field)
       } else {
         fmt.Fprintf(color.Output, wski18n.T("{{.ok}} got package {{.name}}\n",
-          map[string]interface{}{"ok": color.GreenString("ok:"), "name": boldString(qName.entityName)}))
+          map[string]interface{}{"ok": color.GreenString("ok:"), "name": boldString(qualifiedName.entityName)}))
         printJSON(xPackage)
       }
     }
@@ -362,29 +338,25 @@ var packageDeleteCmd = &cobra.Command{
   PreRunE:       setupClientConfig,
   RunE: func(cmd *cobra.Command, args []string) error {
     var err error
+    var qualifiedName QualifiedName
 
     if whiskErr := checkArgs(args, 1, 1, "Package delete", wski18n.T("A package name is required.")); whiskErr != nil {
       return whiskErr
     }
 
-    qName, err := parseQualifiedName(args[0])
-    if err != nil {
-      whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", args[0], err)
-      errMsg := wski18n.T("'{{.name}}' is not a valid qualified name: {{.err}}",
-          map[string]interface{}{"name": args[0], "err": err})
-      werr := whisk.MakeWskErrorFromWskError(errors.New(errMsg), err, whisk.EXITCODE_ERR_GENERAL,
-        whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
-      return werr
+    if qualifiedName, err = parseQualifiedName(args[0]); err != nil {
+      return parseQualifiedNameError(args[0], err)
     }
-    client.Namespace = qName.namespace
 
-    _, err = client.Packages.Delete(qName.entityName)
+    client.Namespace = qualifiedName.namespace
+
+    _, err = client.Packages.Delete(qualifiedName.entityName)
     if err != nil {
-      whisk.Debug(whisk.DbgError, "client.Packages.Delete(%s) failed: %s\n", qName.entityName, err)
+      whisk.Debug(whisk.DbgError, "client.Packages.Delete(%s) failed: %s\n", qualifiedName.entityName, err)
       errStr := wski18n.T(
         "Unable to delete package '{{.name}}': {{.err}}",
         map[string]interface{}{
-          "name": qName.entityName,
+          "name": qualifiedName.entityName,
           "err": err,
         })
       werr := whisk.MakeWskErrorFromWskError(errors.New(errStr), err, whisk.EXITCODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
@@ -393,7 +365,7 @@ var packageDeleteCmd = &cobra.Command{
 
     fmt.Fprintf(color.Output,
       wski18n.T("{{.ok}} deleted package {{.name}}\n",
-        map[string]interface{}{"ok": color.GreenString("ok:"), "name": boldString(qName.entityName)}))
+        map[string]interface{}{"ok": color.GreenString("ok:"), "name": boldString(qualifiedName.entityName)}))
     return nil
   },
 }
@@ -407,30 +379,23 @@ var packageListCmd = &cobra.Command{
   RunE: func(cmd *cobra.Command, args []string) error {
     var err error
     var shared bool
+    var qualifiedName QualifiedName
+
+    if whiskErr := checkArgs(args, 0, 1, "Package list",
+      wski18n.T("An optional namespace is the only valid argument.")); whiskErr != nil {
+      return whiskErr
+    }
 
-    qName := QualifiedName{}
     if len(args) == 1 {
-      qName, err = parseQualifiedName(args[0])
-      if err != nil {
-        whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", args[0], err)
-        errMsg := wski18n.T("'{{.name}}' is not a valid qualified name: {{.err}}",
-            map[string]interface{}{"name": args[0], "err": err})
-        werr := whisk.MakeWskErrorFromWskError(errors.New(errMsg), err, whisk.EXITCODE_ERR_GENERAL,
-          whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
-        return werr
+      if qualifiedName, err = parseQualifiedName(args[0]); err != nil {
+        return parseQualifiedNameError(args[0], err)
       }
-      ns := qName.namespace
-      if len(ns) == 0 {
-        whisk.Debug(whisk.DbgError, "An empty namespace in the package name '%s' is invalid \n", args[0])
-        errStr := wski18n.T("No valid namespace detected. Run 'wsk property set --namespace' or ensure the name argument is preceded by a \"/\"")
-        werr := whisk.MakeWskError(errors.New(errStr), whisk.EXITCODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.DISPLAY_USAGE)
-        return werr
+
+      if len(qualifiedName.entityName) > 0 {
+        return entityNameError(qualifiedName.entityName)
       }
 
-      client.Namespace = ns
-    } else if whiskErr := checkArgs(args, 0, 1, "Package list",
-        wski18n.T("An optional namespace is the only valid argument.")); whiskErr != nil {
-      return whiskErr
+      client.Namespace = qualifiedName.namespace
     }
 
     if Flags.common.shared == "yes" {
@@ -467,30 +432,27 @@ var packageRefreshCmd = &cobra.Command{
   PreRunE:       setupClientConfig,
   RunE: func(cmd *cobra.Command, args []string) error {
     var err error
-    var qName QualifiedName
+    var qualifiedName QualifiedName
 
     if whiskErr := checkArgs(args, 0, 1, "Package refresh",
         wski18n.T("An optional namespace is the only valid argument.")); whiskErr != nil {
       return whiskErr
+    }
+
+    if len(args) == 0 {
+      qualifiedName.namespace = getNamespace()
     } else {
-      if len(args) == 0 {
-        qName.namespace = getNamespace()
-      } else {
-        qName, err = parseQualifiedName(args[0])
-
-        if err != nil {
-          whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", args[0], err)
-          errMsg := wski18n.T("'{{.name}}' is not a valid qualified name: {{.err}}",
-              map[string]interface{}{"name": args[0], "err": err})
-          werr := whisk.MakeWskErrorFromWskError(errors.New(errMsg), err, whisk.EXITCODE_ERR_GENERAL,
-            whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
-          return werr
-        }
+      if qualifiedName, err = parseQualifiedName(args[0]); err != nil {
+        return parseQualifiedNameError(args[0], err)
+      }
+
+      if len(qualifiedName.entityName) > 0 {
+        return entityNameError(qualifiedName.entityName)
       }
     }
 
     currentNamespace := client.Config.Namespace
-    client.Config.Namespace = qName.namespace
+    client.Config.Namespace = qualifiedName.namespace
 
     defer func() {
       client.Config.Namespace = currentNamespace
diff --git a/commands/rule.go b/commands/rule.go
index 14bf64b..bc9ee1d 100644
--- a/commands/rule.go
+++ b/commands/rule.go
@@ -42,23 +42,18 @@ var ruleEnableCmd = &cobra.Command{
     PreRunE: setupClientConfig,
     RunE: func(cmd *cobra.Command, args []string) error {
         var err error
+        var qualifiedName QualifiedName
 
         if whiskErr := checkArgs(args, 1, 1, "Rule enable", wski18n.T("A rule name is required.")); whiskErr != nil {
             return whiskErr
         }
 
-        qName, err := parseQualifiedName(args[0])
-        if err != nil {
-            whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", args[0], err)
-            errMsg := wski18n.T("'{{.name}}' is not a valid qualified name: {{.err}}",
-                    map[string]interface{}{"name": args[0], "err": err})
-            werr := whisk.MakeWskErrorFromWskError(errors.New(errMsg), err, whisk.EXITCODE_ERR_GENERAL,
-                whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
-            return werr
+        if qualifiedName, err = parseQualifiedName(args[0]); err != nil {
+            return parseQualifiedNameError(args[0], err)
         }
 
-        client.Namespace = qName.namespace
-        ruleName := qName.entityName
+        client.Namespace = qualifiedName.namespace
+        ruleName := qualifiedName.entityName
 
         _, _, err = client.Rules.SetState(ruleName, "active")
         if err != nil {
@@ -84,23 +79,18 @@ var ruleDisableCmd = &cobra.Command{
     PreRunE: setupClientConfig,
     RunE: func(cmd *cobra.Command, args []string) error {
         var err error
+        var qualifiedName QualifiedName
 
         if whiskErr := checkArgs(args, 1, 1, "Rule disable", wski18n.T("A rule name is required.")); whiskErr != nil {
             return whiskErr
         }
 
-        qName, err := parseQualifiedName(args[0])
-        if err != nil {
-            whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", args[0], err)
-            errMsg := wski18n.T("'{{.name}}' is not a valid qualified name: {{.err}}",
-                    map[string]interface{}{"name": args[0], "err": err})
-            werr := whisk.MakeWskErrorFromWskError(errors.New(errMsg), err, whisk.EXITCODE_ERR_GENERAL,
-                whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
-            return werr
+        if qualifiedName, err = parseQualifiedName(args[0]); err != nil {
+            return parseQualifiedNameError(args[0], err)
         }
 
-        client.Namespace = qName.namespace
-        ruleName := qName.entityName
+        client.Namespace = qualifiedName.namespace
+        ruleName := qualifiedName.entityName
 
         _, _, err = client.Rules.SetState(ruleName, "inactive")
         if err != nil {
@@ -126,23 +116,18 @@ var ruleStatusCmd = &cobra.Command{
     PreRunE: setupClientConfig,
     RunE: func(cmd *cobra.Command, args []string) error {
         var err error
+        var qualifiedName QualifiedName
 
         if whiskErr := checkArgs(args, 1, 1, "Rule status", wski18n.T("A rule name is required.")); whiskErr != nil {
             return whiskErr
         }
 
-        qName, err := parseQualifiedName(args[0])
-        if err != nil {
-            whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", args[0], err)
-            errMsg := wski18n.T("'{{.name}}' is not a valid qualified name: {{.err}}",
-                    map[string]interface{}{"name": args[0], "err": err})
-            werr := whisk.MakeWskErrorFromWskError(errors.New(errMsg), err, whisk.EXITCODE_ERR_GENERAL,
-                whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
-            return werr
+        if qualifiedName, err = parseQualifiedName(args[0]); err != nil {
+            return parseQualifiedNameError(args[0], err)
         }
 
-        client.Namespace = qName.namespace
-        ruleName := qName.entityName
+        client.Namespace = qualifiedName.namespace
+        ruleName := qualifiedName.entityName
 
         rule, _, err := client.Rules.Get(ruleName)
         if err != nil {
@@ -168,24 +153,19 @@ var ruleCreateCmd = &cobra.Command{
     PreRunE: setupClientConfig,
     RunE: func(cmd *cobra.Command, args []string) error {
         var err error
+        var qualifiedName QualifiedName
 
         if whiskErr := checkArgs(args, 3, 3, "Rule create",
                 wski18n.T("A rule, trigger and action name are required.")); whiskErr != nil {
             return whiskErr
         }
 
-        qName, err := parseQualifiedName(args[0])
-        if err != nil {
-            whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", args[0], err)
-            errMsg := wski18n.T("'{{.name}}' is not a valid qualified name: {{.err}}",
-                    map[string]interface{}{"name": args[0], "err": err})
-            werr := whisk.MakeWskErrorFromWskError(errors.New(errMsg), err, whisk.EXITCODE_ERR_GENERAL,
-                whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
-            return werr
+        if qualifiedName, err = parseQualifiedName(args[0]); err != nil {
+            return parseQualifiedNameError(args[0], err)
         }
 
-        client.Namespace = qName.namespace
-        ruleName := qName.entityName
+        client.Namespace = qualifiedName.namespace
+        ruleName := qualifiedName.entityName
         triggerName := getQualifiedName(args[1], Properties.Namespace)
         actionName := getQualifiedName(args[2], Properties.Namespace)
 
@@ -222,24 +202,19 @@ var ruleUpdateCmd = &cobra.Command{
     PreRunE: setupClientConfig,
     RunE: func(cmd *cobra.Command, args []string) error {
         var err error
+        var qualifiedName QualifiedName
 
         if whiskErr := checkArgs(args, 3, 3, "Rule update",
                 wski18n.T("A rule, trigger and action name are required.")); whiskErr != nil {
             return whiskErr
         }
 
-        qName, err := parseQualifiedName(args[0])
-        if err != nil {
-            whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", args[0], err)
-            errMsg := wski18n.T("'{{.name}}' is not a valid qualified name: {{.err}}",
-                    map[string]interface{}{"name": args[0], "err": err})
-            werr := whisk.MakeWskErrorFromWskError(errors.New(errMsg), err, whisk.EXITCODE_ERR_GENERAL,
-                whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
-            return werr
+        if qualifiedName, err = parseQualifiedName(args[0]); err != nil {
+            return parseQualifiedNameError(args[0], err)
         }
 
-        client.Namespace = qName.namespace
-        ruleName := qName.entityName
+        client.Namespace = qualifiedName.namespace
+        ruleName := qualifiedName.entityName
         triggerName := getQualifiedName(args[1], Properties.Namespace)
         actionName := getQualifiedName(args[2], Properties.Namespace)
 
@@ -274,6 +249,7 @@ var ruleGetCmd = &cobra.Command{
     RunE: func(cmd *cobra.Command, args []string) error {
         var err error
         var field string
+        var qualifiedName QualifiedName
 
         if whiskErr := checkArgs(args, 1, 2, "Rule get", wski18n.T("A rule name is required.")); whiskErr != nil {
             return whiskErr
@@ -290,18 +266,12 @@ var ruleGetCmd = &cobra.Command{
             }
         }
 
-        qName, err := parseQualifiedName(args[0])
-        if err != nil {
-            whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", args[0], err)
-            errMsg := wski18n.T("'{{.name}}' is not a valid qualified name: {{.err}}",
-                    map[string]interface{}{"name": args[0], "err": err})
-            werr := whisk.MakeWskErrorFromWskError(errors.New(errMsg), err, whisk.EXITCODE_ERR_GENERAL,
-                whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
-            return werr
+        if qualifiedName, err = parseQualifiedName(args[0]); err != nil {
+            return parseQualifiedNameError(args[0], err)
         }
 
-        client.Namespace = qName.namespace
-        ruleName := qName.entityName
+        client.Namespace = qualifiedName.namespace
+        ruleName := qualifiedName.entityName
 
         rule, _, err := client.Rules.Get(ruleName)
         if err != nil {
@@ -339,23 +309,18 @@ var ruleDeleteCmd = &cobra.Command{
     PreRunE: setupClientConfig,
     RunE: func(cmd *cobra.Command, args []string) error {
         var err error
+        var qualifiedName QualifiedName
 
         if whiskErr := checkArgs(args, 1, 1, "Rule delete", wski18n.T("A rule name is required.")); whiskErr != nil {
             return whiskErr
         }
 
-        qName, err := parseQualifiedName(args[0])
-        if err != nil {
-            whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", args[0], err)
-            errMsg := wski18n.T("'{{.name}}' is not a valid qualified name: {{.err}}",
-                    map[string]interface{}{"name": args[0], "err": err})
-            werr := whisk.MakeWskErrorFromWskError(errors.New(errMsg), err, whisk.EXITCODE_ERR_GENERAL,
-                whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
-            return werr
+        if qualifiedName, err = parseQualifiedName(args[0]); err != nil {
+            return parseQualifiedNameError(args[0], err)
         }
 
-        client.Namespace = qName.namespace
-        ruleName := qName.entityName
+        client.Namespace = qualifiedName.namespace
+        ruleName := qualifiedName.entityName
 
         if Flags.rule.disable {
             _, _, err := client.Rules.SetState(ruleName, "inactive")
@@ -392,28 +357,23 @@ var ruleListCmd = &cobra.Command{
     PreRunE: setupClientConfig,
     RunE: func(cmd *cobra.Command, args []string) error {
         var err error
-        qName := QualifiedName{}
+        var qualifiedName QualifiedName
+
+        if whiskErr := checkArgs(args, 0, 1, "Rule list",
+            wski18n.T("An optional namespace is the only valid argument.")); whiskErr != nil {
+            return whiskErr
+        }
 
         if len(args) == 1 {
-            qName, err = parseQualifiedName(args[0])
-            if err != nil {
-                whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", args[0], err)
-                errStr := wski18n.T("Namespace '{{.name}}' is invalid: {{.err}}\n",
-                        map[string]interface{}{"name": args[0], "err": err})
-                werr := whisk.MakeWskErrorFromWskError(errors.New(errStr), err, whisk.EXITCODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
-                return werr
+            if qualifiedName, err = parseQualifiedName(args[0]); err != nil {
+                return parseQualifiedNameError(args[0], err)
             }
-            ns := qName.namespace
-            if len(ns) == 0 {
-                whisk.Debug(whisk.DbgError, "Namespace is missing from '%s'\n", args[0])
-                errStr := wski18n.T("No valid namespace detected. Run 'wsk property set --namespace' or ensure the name argument is preceded by a \"/\"")
-                werr := whisk.MakeWskError(errors.New(errStr), whisk.EXITCODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.DISPLAY_USAGE)
-                return werr
+
+            if len(qualifiedName.entityName) > 0 {
+                return entityNameError(qualifiedName.entityName)
             }
-            client.Namespace = ns
-        } else if whiskErr := checkArgs(args, 0, 1, "Rule list",
-                wski18n.T("An optional namespace is the only valid argument.")); whiskErr != nil {
-            return whiskErr
+
+            client.Namespace = qualifiedName.namespace
         }
 
         ruleListOptions := &whisk.RuleListOptions{
diff --git a/commands/shared.go b/commands/shared.go
new file mode 100644
index 0000000..9f4acd4
--- /dev/null
+++ b/commands/shared.go
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2015-2016 IBM Corporation
+ *
+ * Licensed 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-cli/wski18n"
+    "github.com/apache/incubator-openwhisk-client-go/whisk"
+)
+
+func entityNameError(entityName string) (error) {
+    errMsg := wski18n.T(
+        "An entity name, '{{.name}}', was provided instead of a namespace. Valid namespaces are of the following format: /NAMESPACE.",
+        map[string]interface{}{
+            "name": entityName,
+        })
+
+    return whisk.MakeWskError(errors.New(errMsg), whisk.EXITCODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.DISPLAY_USAGE)
+}
+
+func parseQualifiedNameError(entityName string, err error) (error) {
+    whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", entityName, err)
+
+    errMsg := wski18n.T(
+        "'{{.name}}' is not a valid qualified name: {{.err}}",
+        map[string]interface{}{
+            "name": entityName,
+            "err": err,
+        })
+
+    return whisk.MakeWskError(errors.New(errMsg), whisk.EXITCODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.DISPLAY_USAGE)
+}
diff --git a/commands/trigger.go b/commands/trigger.go
index 7b65e8c..3480656 100644
--- a/commands/trigger.go
+++ b/commands/trigger.go
@@ -49,24 +49,18 @@ var triggerFireCmd = &cobra.Command{
     RunE: func(cmd *cobra.Command, args []string) error {
         var err error
         var parameters interface{}
+        var qualifiedName QualifiedName
 
         if whiskErr := checkArgs(args, 1, 2, "Trigger fire",
                 wski18n.T("A trigger name is required. A payload is optional.")); whiskErr != nil {
             return whiskErr
         }
 
-        qName, err := parseQualifiedName(args[0])
-        if err != nil {
-            whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", args[0], err)
-            errMsg := wski18n.T("'{{.name}}' is not a valid qualified name: {{.err}}",
-                    map[string]interface{}{"name": args[0], "err": err})
-            whiskErr := whisk.MakeWskErrorFromWskError(errors.New(errMsg), err, whisk.EXITCODE_ERR_GENERAL,
-                whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
-
-            return whiskErr
+        if qualifiedName, err = parseQualifiedName(args[0]); err != nil {
+            return parseQualifiedNameError(args[0], err)
         }
 
-        client.Namespace = qName.namespace
+        client.Namespace = qualifiedName.namespace
 
         // Add payload to parameters
         if len(args) == 2 {
@@ -86,11 +80,11 @@ var triggerFireCmd = &cobra.Command{
             }
         }
 
-        trigResp, _, err := client.Triggers.Fire(qName.entityName, parameters)
+        trigResp, _, err := client.Triggers.Fire(qualifiedName.entityName, parameters)
         if err != nil {
-            whisk.Debug(whisk.DbgError, "client.Triggers.Fire(%s, %#v) failed: %s\n", qName.entityName, parameters, err)
+            whisk.Debug(whisk.DbgError, "client.Triggers.Fire(%s, %#v) failed: %s\n", qualifiedName.entityName, parameters, err)
             errStr := wski18n.T("Unable to fire trigger '{{.name}}': {{.err}}",
-                    map[string]interface{}{"name": qName.entityName, "err": err})
+                    map[string]interface{}{"name": qualifiedName.entityName, "err": err})
             werr := whisk.MakeWskErrorFromWskError(errors.New(errStr), err, whisk.EXITCODE_ERR_GENERAL,
                 whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
             return werr
@@ -100,8 +94,8 @@ var triggerFireCmd = &cobra.Command{
             wski18n.T("{{.ok}} triggered /{{.namespace}}/{{.name}} with id {{.id}}\n",
                 map[string]interface{}{
                     "ok": color.GreenString("ok:"),
-                    "namespace": boldString(qName.namespace),
-                    "name": boldString(qName.entityName),
+                    "namespace": boldString(qualifiedName.namespace),
+                    "name": boldString(qualifiedName.entityName),
                     "id": boldString(trigResp.ActivationId)}))
         return nil
     },
@@ -117,46 +111,31 @@ var triggerCreateCmd = &cobra.Command{
         var err error
         var annotations interface{}
         var feedArgPassed bool = (Flags.common.feed != "")
+        var qualifiedName QualifiedName
 
         if whiskErr := checkArgs(args, 1, 1, "Trigger create",
                 wski18n.T("A trigger name is required.")); whiskErr != nil {
             return whiskErr
         }
 
-        qName, err := parseQualifiedName(args[0])
-        if err != nil {
-            whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", args[0], err)
-            errMsg := wski18n.T("'{{.name}}' is not a valid qualified name: {{.err}}",
-                    map[string]interface{}{"name": args[0], "err": err})
-            whiskErr := whisk.MakeWskErrorFromWskError(errors.New(errMsg), err, whisk.EXITCODE_ERR_GENERAL,
-                whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
-            return whiskErr
+        if qualifiedName, err = parseQualifiedName(args[0]); err != nil {
+            return parseQualifiedNameError(args[0], err)
         }
 
-        client.Namespace = qName.namespace
+        client.Namespace = qualifiedName.namespace
 
         var fullTriggerName string
         var fullFeedName string
+        var feedQualifiedName QualifiedName
         if feedArgPassed {
             whisk.Debug(whisk.DbgInfo, "Trigger has a feed\n")
-            feedqName, err := parseQualifiedName(Flags.common.feed)
-            if err != nil {
-                whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", Flags.common.feed, err)
-                errMsg := wski18n.T("'{{.name}}' is not a valid qualified name: {{.err}}",
-                        map[string]interface{}{"name": Flags.common.feed, "err": err})
-                whiskErr := whisk.MakeWskErrorFromWskError(errors.New(errMsg), err, whisk.EXITCODE_ERR_GENERAL,
-                    whisk.DISPLAY_MSG, whisk.DISPLAY_USAGE)
-                return whiskErr
-            }
-            if len(feedqName.namespace) == 0 {
-                whisk.Debug(whisk.DbgError, "Namespace is missing from '%s'\n", Flags.common.feed)
-                errStr := wski18n.T("No valid namespace detected. Run 'wsk property set --namespace' or ensure the name argument is preceded by a \"/\"")
-                werr := whisk.MakeWskError(errors.New(errStr), whisk.EXITCODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.DISPLAY_USAGE)
-                return werr
+
+            if feedQualifiedName, err = parseQualifiedName(Flags.common.feed); err != nil {
+                return parseQualifiedNameError(Flags.common.feed, err)
             }
 
-            fullFeedName = fmt.Sprintf("/%s/%s", feedqName.namespace, feedqName.entityName)
-            fullTriggerName = fmt.Sprintf("/%s/%s", qName.namespace, qName.entityName)
+            fullFeedName = fmt.Sprintf("/%s/%s", feedQualifiedName.namespace, feedQualifiedName.entityName)
+            fullTriggerName = fmt.Sprintf("/%s/%s", qualifiedName.namespace, qualifiedName.entityName)
             Flags.common.param = append(Flags.common.param, getFormattedJSON(FEED_LIFECYCLE_EVENT, FEED_CREATE))
             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))
@@ -194,7 +173,7 @@ var triggerCreateCmd = &cobra.Command{
         }
 
         trigger := &whisk.Trigger{
-            Name:        qName.entityName,
+            Name:        qualifiedName.entityName,
             Annotations: annotations.(whisk.KeyValueArr),
         }
 
@@ -245,24 +224,18 @@ var triggerUpdateCmd = &cobra.Command{
     PreRunE: setupClientConfig,
     RunE: func(cmd *cobra.Command, args []string) error {
         var err error
+        var qualifiedName QualifiedName
 
         if whiskErr := checkArgs(args, 1, 1, "Trigger update",
                 wski18n.T("A trigger name is required.")); whiskErr != nil {
             return whiskErr
         }
 
-        qName, err := parseQualifiedName(args[0])
-        if err != nil {
-            whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", args[0], err)
-            errMsg := wski18n.T("'{{.name}}' is not a valid qualified name: {{.err}}",
-                    map[string]interface{}{"name": args[0], "err": err})
-            whiskErr := whisk.MakeWskErrorFromWskError(errors.New(errMsg), err, whisk.EXITCODE_ERR_GENERAL,
-                whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
-
-            return whiskErr
+        if qualifiedName, err = parseQualifiedName(args[0]); err != nil {
+            return parseQualifiedNameError(args[0], err)
         }
 
-        client.Namespace = qName.namespace
+        client.Namespace = qualifiedName.namespace
 
         // 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
@@ -291,7 +264,7 @@ var triggerUpdateCmd = &cobra.Command{
         }
 
         trigger := &whisk.Trigger{
-            Name:        qName.entityName,
+            Name:        qualifiedName.entityName,
             Parameters:  parameters.(whisk.KeyValueArr),
             Annotations: annotations.(whisk.KeyValueArr),
         }
@@ -321,6 +294,7 @@ var triggerGetCmd = &cobra.Command{
     RunE: func(cmd *cobra.Command, args []string) error {
         var err error
         var field string
+        var qualifiedName QualifiedName
 
         if whiskErr := checkArgs(args, 1, 2, "Trigger get", wski18n.T("A trigger name is required.")); whiskErr != nil {
             return whiskErr
@@ -337,24 +311,17 @@ var triggerGetCmd = &cobra.Command{
             }
         }
 
-        qName, err := parseQualifiedName(args[0])
-        if err != nil {
-            whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", args[0], err)
-            errMsg := wski18n.T("'{{.name}}' is not a valid qualified name: {{.err}}",
-                    map[string]interface{}{"name": args[0], "err": err})
-            whiskErr := whisk.MakeWskErrorFromWskError(errors.New(errMsg), err, whisk.EXITCODE_ERR_GENERAL,
-                whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
-
-            return whiskErr
+        if qualifiedName, err = parseQualifiedName(args[0]); err != nil {
+            return parseQualifiedNameError(args[0], err)
         }
 
-        client.Namespace = qName.namespace
+        client.Namespace = qualifiedName.namespace
 
-        retTrigger, _, err := client.Triggers.Get(qName.entityName)
+        retTrigger, _, err := client.Triggers.Get(qualifiedName.entityName)
         if err != nil {
-            whisk.Debug(whisk.DbgError, "client.Triggers.Get(%s) failed: %s\n", qName.entityName, err)
+            whisk.Debug(whisk.DbgError, "client.Triggers.Get(%s) failed: %s\n", qualifiedName.entityName, err)
             errStr := wski18n.T("Unable to get trigger '{{.name}}': {{.err}}",
-                    map[string]interface{}{"name": qName.entityName, "err": err})
+                    map[string]interface{}{"name": qualifiedName.entityName, "err": err})
             werr := whisk.MakeWskErrorFromWskError(errors.New(errStr), err, whisk.EXITCODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
             return werr
         }
@@ -364,12 +331,12 @@ var triggerGetCmd = &cobra.Command{
         } else {
             if len(field) > 0 {
                 fmt.Fprintf(color.Output, wski18n.T("{{.ok}} got trigger {{.name}}, displaying field {{.field}}\n",
-                    map[string]interface{}{"ok": color.GreenString("ok:"), "name": boldString(qName.entityName),
+                    map[string]interface{}{"ok": color.GreenString("ok:"), "name": boldString(qualifiedName.entityName),
                     "field": boldString(field)}))
                 printField(retTrigger, field)
             } else {
                 fmt.Fprintf(color.Output, wski18n.T("{{.ok}} got trigger {{.name}}\n",
-                        map[string]interface{}{"ok": color.GreenString("ok:"), "name": boldString(qName.entityName)}))
+                        map[string]interface{}{"ok": color.GreenString("ok:"), "name": boldString(qualifiedName.entityName)}))
                 printJSON(retTrigger)
             }
         }
@@ -389,30 +356,24 @@ var triggerDeleteCmd = &cobra.Command{
         var retTrigger *whisk.Trigger
         var fullFeedName string
         var origParams []string
+        var qualifiedName QualifiedName
 
         if whiskErr := checkArgs(args, 1, 1, "Trigger delete",
                 wski18n.T("A trigger name is required.")); whiskErr != nil {
             return whiskErr
         }
 
-        qName, err := parseQualifiedName(args[0])
-        if err != nil {
-            whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", args[0], err)
-            errMsg := wski18n.T("'{{.name}}' is not a valid qualified name: {{.err}}",
-                    map[string]interface{}{"name": args[0], "err": err})
-            whiskErr := whisk.MakeWskErrorFromWskError(errors.New(errMsg), err, whisk.EXITCODE_ERR_GENERAL,
-                whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
-
-            return whiskErr
+        if qualifiedName, err = parseQualifiedName(args[0]); err != nil {
+            return parseQualifiedNameError(args[0], err)
         }
 
-        client.Namespace = qName.namespace
+        client.Namespace = qualifiedName.namespace
 
-        retTrigger, _, err = client.Triggers.Get(qName.entityName)
+        retTrigger, _, err = client.Triggers.Get(qualifiedName.entityName)
         if err != nil {
-            whisk.Debug(whisk.DbgError, "client.Triggers.Get(%s) failed: %s\n", qName.entityName, err)
+            whisk.Debug(whisk.DbgError, "client.Triggers.Get(%s) failed: %s\n", qualifiedName.entityName, err)
             errStr := wski18n.T("Unable to get trigger '{{.name}}': {{.err}}",
-                    map[string]interface{}{"name": qName.entityName, "err": err})
+                    map[string]interface{}{"name": qualifiedName.entityName, "err": err})
             werr := whisk.MakeWskErrorFromWskError(errors.New(errStr), err, whisk.EXITCODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
             return werr
         }
@@ -423,34 +384,34 @@ var triggerDeleteCmd = &cobra.Command{
 
             if len(fullFeedName) > 0 {
                 origParams = Flags.common.param
-                fullTriggerName := fmt.Sprintf("/%s/%s", qName.namespace, qName.entityName)
+                fullTriggerName := fmt.Sprintf("/%s/%s", qualifiedName.namespace, qualifiedName.entityName)
                 Flags.common.param = append(Flags.common.param, getFormattedJSON(FEED_LIFECYCLE_EVENT, FEED_DELETE))
                 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))
 
-                err = configureFeed(qName.entityName, fullFeedName)
+                err = configureFeed(qualifiedName.entityName, fullFeedName)
                 if err != nil {
-                    whisk.Debug(whisk.DbgError, "configureFeed(%s, %s) failed: %s\n", qName.entityName, fullFeedName, err)
+                    whisk.Debug(whisk.DbgError, "configureFeed(%s, %s) failed: %s\n", qualifiedName.entityName, fullFeedName, err)
                 }
 
                 Flags.common.param = origParams
-                client.Namespace = qName.namespace
+                client.Namespace = qualifiedName.namespace
             }
 
         }
 
-        retTrigger, _, err = client.Triggers.Delete(qName.entityName)
+        retTrigger, _, err = client.Triggers.Delete(qualifiedName.entityName)
         if err != nil {
-            whisk.Debug(whisk.DbgError, "client.Triggers.Delete(%s) failed: %s\n", qName.entityName, err)
+            whisk.Debug(whisk.DbgError, "client.Triggers.Delete(%s) failed: %s\n", qualifiedName.entityName, err)
             errStr := wski18n.T("Unable to delete trigger '{{.name}}': {{.err}}",
-                map[string]interface{}{"name": qName.entityName, "err": err})
+                map[string]interface{}{"name": qualifiedName.entityName, "err": err})
             werr := whisk.MakeWskErrorFromWskError(errors.New(errStr), err, whisk.EXITCODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.NO_DISPLAY_USAGE)
             return werr
         }
 
         fmt.Fprintf(color.Output,
             wski18n.T("{{.ok}} deleted trigger {{.name}}\n",
-                map[string]interface{}{"ok": color.GreenString("ok:"), "name": boldString(qName.entityName)}))
+                map[string]interface{}{"ok": color.GreenString("ok:"), "name": boldString(qualifiedName.entityName)}))
 
         return nil
     },
@@ -464,28 +425,23 @@ var triggerListCmd = &cobra.Command{
     PreRunE: setupClientConfig,
     RunE: func(cmd *cobra.Command, args []string) error {
         var err error
-        qName := QualifiedName{}
+        var qualifiedName QualifiedName
+
+        if whiskErr := checkArgs(args, 0, 1, "Trigger list",
+            wski18n.T("An optional namespace is the only valid argument.")); whiskErr != nil {
+            return whiskErr
+        }
+
         if len(args) == 1 {
-            qName, err = parseQualifiedName(args[0])
-            if err != nil {
-                whisk.Debug(whisk.DbgError, "parseQualifiedName(%s) failed: %s\n", args[0], err)
-                errStr := wski18n.T("'{{.name}}' is not a valid qualified name: {{.err}}",
-                        map[string]interface{}{"name": args[0], "err": err})
-                werr := whisk.MakeWskErrorFromWskError(errors.New(errStr), err, whisk.EXITCODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.DISPLAY_USAGE)
-                return werr
+            if qualifiedName, err = parseQualifiedName(args[0]); err != nil {
+                return parseQualifiedNameError(args[0], err)
             }
-            ns := qName.namespace
-            if len(ns) == 0 {
-                whisk.Debug(whisk.DbgError, "Namespace is missing from '%s'\n", args[0])
-                errStr := wski18n.T("No valid namespace detected. Run 'wsk property set --namespace' or ensure the name argument is preceded by a \"/\"")
-                werr := whisk.MakeWskError(errors.New(errStr), whisk.EXITCODE_ERR_GENERAL, whisk.DISPLAY_MSG, whisk.DISPLAY_USAGE)
-                return werr
+
+            if len(qualifiedName.entityName) > 0 {
+                return entityNameError(qualifiedName.entityName)
             }
-            client.Namespace = ns
-            whisk.Debug(whisk.DbgInfo, "Using namespace '%s' from argument '%s''\n", ns, args[0])
-        } else if whiskErr := checkArgs(args, 0, 1, "Trigger list",
-                wski18n.T("An optional namespace is the only valid argument.")); whiskErr != nil {
-            return whiskErr
+
+            client.Namespace = qualifiedName.namespace
         }
 
         options := &whisk.TriggerListOptions{
diff --git a/commands/util.go b/commands/util.go
index 79af565..96e205a 100644
--- a/commands/util.go
+++ b/commands/util.go
@@ -49,16 +49,16 @@ type QualifiedName struct {
     entityName  string  // pkg+entity
 }
 
-func (qName QualifiedName) String() string {
+func (qualifiedName QualifiedName) String() string {
     output := []string{}
 
-    if len(qName.namespace) > 0 {
-        output = append(output, "/", qName.namespace, "/")
+    if len(qualifiedName.namespace) > 0 {
+        output = append(output, "/", qualifiedName.namespace, "/")
     }
-    if len(qName.packageName) > 0 {
-        output = append(output, qName.packageName, "/")
+    if len(qualifiedName.packageName) > 0 {
+        output = append(output, qualifiedName.packageName, "/")
     }
-    output = append(output, qName.entityName)
+    output = append(output, qualifiedName.entityName)
 
     return strings.Join(output, "")
 }
@@ -71,10 +71,10 @@ name, the namespace is also resolved from the property file.
 Return a qualifiedName struct
 
 Examples:
-      foo => qName {namespace: "_", entityName: foo}
-      pkg/foo => qName {namespace: "_", entityName: pkg/foo}
-      /ns/foo => qName {namespace: ns, entityName: foo}
-      /ns/pkg/foo => qName {namespace: ns, entityName: pkg/foo}
+      foo => qualifiedName {namespace: "_", entityName: foo}
+      pkg/foo => qualifiedName {namespace: "_", entityName: pkg/foo}
+      /ns/foo => qualifiedName {namespace: ns, entityName: foo}
+      /ns/pkg/foo => qualifiedName {namespace: ns, entityName: pkg/foo}
 */
 func parseQualifiedName(name string) (QualifiedName, error) {
     var qualifiedName QualifiedName
diff --git a/commands/wsk.go b/commands/wsk.go
index 236bf1c..48391e9 100644
--- a/commands/wsk.go
+++ b/commands/wsk.go
@@ -31,8 +31,14 @@ var WskCmd = &cobra.Command{
     PersistentPreRunE:parseConfigFlags,
 }
 
-
-
+var listCmd = &cobra.Command{
+    Use:   "list",
+    Short: wski18n.T("list entities in the current namespace"),
+    SilenceUsage:   true,
+    SilenceErrors:  true,
+    PreRunE: setupClientConfig,
+    RunE:   namespaceGetCmd.RunE,
+}
 
 func init() {
     WskCmd.SetHelpTemplate(`{{with or .Long .Short }}{{.}}
diff --git a/wski18n/i18n_resources.go b/wski18n/i18n_resources.go
index 0bd3e7d..eda4f46 100644
--- a/wski18n/i18n_resources.go
+++ b/wski18n/i18n_resources.go
@@ -109,12 +109,12 @@ func wski18nResourcesDe_deAllJson() (*asset, error) {
         return nil, err
     }
 
-    info := bindataFileInfo{name: "wski18n/resources/de_DE.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1495934612, 0)}
+    info := bindataFileInfo{name: "wski18n/resources/de_DE.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1498102835, 0)}
     a := &asset{bytes: bytes, info: info}
     return a, nil
 }
 
-var _wski18nResourcesEn_usAllJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x5d\x5f\x73\xdb\x38\x92\x7f\x9f\x4f\xd1\x95\x17\x3b\x55\xb6\xb3\xfb\x74\x75\x99\x9a\x07\x4d\xe2\xd9\x78\x93\xd8\xae\xc8\x99\xdd\xa9\x9b\xab\x11\x44\x42\x12\xc6\x14\xc0\x01\x40\x2b\x8a\xd7\xdf\xfd\x0a\x00\x49\x91\x12\xfe\x92\x72\x72\x4f\x71\xc4\xee\x5f\x37\xfe\x37\x1a\xdd\xc0\xff\xfc\x00\xf0\xf8\x03\x00\xc0\x0b\x92\xbf\x78\x0d\x2f\x26\x65\x59\x90\x0c\x49\xc2\x28\xe0\x2f\x44\xe2\x1c\x2a\x8a\xbf\x94\x38 [...]
+var _wski18nResourcesEn_usAllJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x5d\x5f\x73\xdb\x38\x92\x7f\x9f\x4f\xd1\x95\x17\x3b\x55\xb2\xb3\xfb\x74\x75\x99\x9a\x07\x4d\xec\xd9\x78\x93\xd8\xae\xc8\x99\xdd\xa9\x9b\xab\x11\x4c\x42\x12\xc6\x14\xc0\x01\x40\x2b\x4a\xd6\xdf\xfd\x0a\x00\x49\x91\x12\xfe\x92\x72\x72\x4f\x71\xc4\xee\x5f\x37\xfe\x37\x1a\xdd\xc0\xff\xfc\x00\xf0\xf5\x07\x00\x80\x17\x24\x7f\xf1\x1a\x5e\x4c\xcb\xb2\x20\x19\x92\x84\x51\xc0\x9f\x89\xc4\x39\x54\x14\x7f\x2e\x71 [...]
 
 func wski18nResourcesEn_usAllJsonBytes() ([]byte, error) {
     return bindataRead(
@@ -129,7 +129,7 @@ func wski18nResourcesEn_usAllJson() (*asset, error) {
         return nil, err
     }
 
-    info := bindataFileInfo{name: "wski18n/resources/en_US.all.json", size: 47607, mode: os.FileMode(420), modTime: time.Unix(1495934612, 0)}
+    info := bindataFileInfo{name: "wski18n/resources/en_US.all.json", size: 48166, mode: os.FileMode(420), modTime: time.Unix(1498103751, 0)}
     a := &asset{bytes: bytes, info: info}
     return a, nil
 }
@@ -149,7 +149,7 @@ func wski18nResourcesEs_esAllJson() (*asset, error) {
         return nil, err
     }
 
-    info := bindataFileInfo{name: "wski18n/resources/es_ES.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1495934612, 0)}
+    info := bindataFileInfo{name: "wski18n/resources/es_ES.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1498102835, 0)}
     a := &asset{bytes: bytes, info: info}
     return a, nil
 }
@@ -169,7 +169,7 @@ func wski18nResourcesFr_frAllJson() (*asset, error) {
         return nil, err
     }
 
-    info := bindataFileInfo{name: "wski18n/resources/fr_FR.all.json", size: 101, mode: os.FileMode(420), modTime: time.Unix(1495934612, 0)}
+    info := bindataFileInfo{name: "wski18n/resources/fr_FR.all.json", size: 101, mode: os.FileMode(420), modTime: time.Unix(1498102835, 0)}
     a := &asset{bytes: bytes, info: info}
     return a, nil
 }
@@ -189,7 +189,7 @@ func wski18nResourcesIt_itAllJson() (*asset, error) {
         return nil, err
     }
 
-    info := bindataFileInfo{name: "wski18n/resources/it_IT.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1495934612, 0)}
+    info := bindataFileInfo{name: "wski18n/resources/it_IT.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1498102835, 0)}
     a := &asset{bytes: bytes, info: info}
     return a, nil
 }
@@ -209,7 +209,7 @@ func wski18nResourcesJa_jaAllJson() (*asset, error) {
         return nil, err
     }
 
-    info := bindataFileInfo{name: "wski18n/resources/ja_JA.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1495934612, 0)}
+    info := bindataFileInfo{name: "wski18n/resources/ja_JA.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1498102835, 0)}
     a := &asset{bytes: bytes, info: info}
     return a, nil
 }
@@ -229,7 +229,7 @@ func wski18nResourcesKo_krAllJson() (*asset, error) {
         return nil, err
     }
 
-    info := bindataFileInfo{name: "wski18n/resources/ko_KR.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1495934612, 0)}
+    info := bindataFileInfo{name: "wski18n/resources/ko_KR.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1498102835, 0)}
     a := &asset{bytes: bytes, info: info}
     return a, nil
 }
@@ -249,7 +249,7 @@ func wski18nResourcesPt_brAllJson() (*asset, error) {
         return nil, err
     }
 
-    info := bindataFileInfo{name: "wski18n/resources/pt_BR.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1495934612, 0)}
+    info := bindataFileInfo{name: "wski18n/resources/pt_BR.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1498102835, 0)}
     a := &asset{bytes: bytes, info: info}
     return a, nil
 }
@@ -269,7 +269,7 @@ func wski18nResourcesZh_hansAllJson() (*asset, error) {
         return nil, err
     }
 
-    info := bindataFileInfo{name: "wski18n/resources/zh_Hans.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1495934612, 0)}
+    info := bindataFileInfo{name: "wski18n/resources/zh_Hans.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1498102835, 0)}
     a := &asset{bytes: bytes, info: info}
     return a, nil
 }
@@ -289,7 +289,7 @@ func wski18nResourcesZh_hantAllJson() (*asset, error) {
         return nil, err
     }
 
-    info := bindataFileInfo{name: "wski18n/resources/zh_Hant.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1495934612, 0)}
+    info := bindataFileInfo{name: "wski18n/resources/zh_Hant.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1498102835, 0)}
     a := &asset{bytes: bytes, info: info}
     return a, nil
 }
diff --git a/wski18n/resources/en_US.all.json b/wski18n/resources/en_US.all.json
index 7a9b778..fd27946 100644
--- a/wski18n/resources/en_US.all.json
+++ b/wski18n/resources/en_US.all.json
@@ -832,8 +832,8 @@
     "translation": "{{.ok}} deleted action {{.name}}\n"
   },
   {
-    "id": "list all actions",
-    "translation": "list all actions"
+    "id": "list all actions in a namespace or actions contained in a package",
+    "translation": "list all actions in a namespace or actions contained in a package"
   },
   {
     "id": "Unable to obtain the list of actions for namespace '{{.name}}': {{.err}}",
@@ -1462,5 +1462,9 @@
   {
     "id": "Invalid format type: {{.type}}",
     "translation": "Invalid format type: {{.type}}"
+  },
+  {
+    "id": "An entity name, '{{.name}}', was provided instead of a namespace. Valid namespaces are of the following format: /NAMESPACE.",
+    "translation": "An entity name, '{{.name}}', was provided instead of a namespace. Valid namespaces are of the following format: /NAMESPACE."
   }
 ]

-- 
To stop receiving notification emails like this one, please contact
"commits@openwhisk.apache.org" <co...@openwhisk.apache.org>.