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/07/17 14:10:32 UTC

[incubator-openwhisk-cli] 09/09: Add subject with a namespace. (#2291)

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 7859b711a4a73345f4d60657c040f6089182298b
Author: rodric rabbah <ro...@gmail.com>
AuthorDate: Fri Jul 14 19:02:24 2017 -0400

    Add subject with a namespace. (#2291)
    
    - Add a test that should catch future regressions where a key is installed incorrectly.
    - Add a helper to retrieve namespace for a key.
    - Eliminate use of wskadmin in tests to lookup a namespace from a key.
    - Delete deprecated WhiskAuth
    - Rename WhiskAuthV2 to WhiskAuth.
    - Fix all tests for WhiskAuth removal.
---
 .../apigw/healthtests/ApiGwEndToEndTests.scala     |   7 +-
 .../test/scala/system/basic/WskBasicTests.scala    | 340 ++++++++++-----------
 .../scala/whisk/core/admin/WskAdminTests.scala     |  20 +-
 .../scala/whisk/core/cli/test/ApiGwTests.scala     |  17 +-
 .../core/cli/test/WskActionSequenceTests.scala     |   6 +-
 .../whisk/core/cli/test/WskBasicUsageTests.scala   |  29 +-
 .../whisk/core/cli/test/WskEntitlementTests.scala  |   3 +-
 .../whisk/core/cli/test/WskWebActionsTests.scala   |   3 +-
 8 files changed, 202 insertions(+), 223 deletions(-)

diff --git a/tests/src/test/scala/apigw/healthtests/ApiGwEndToEndTests.scala b/tests/src/test/scala/apigw/healthtests/ApiGwEndToEndTests.scala
index d1bc472..49cfbf7 100644
--- a/tests/src/test/scala/apigw/healthtests/ApiGwEndToEndTests.scala
+++ b/tests/src/test/scala/apigw/healthtests/ApiGwEndToEndTests.scala
@@ -35,7 +35,6 @@ import common.TestHelpers
 import common.TestCLIUtils
 import common.TestUtils._
 import common.Wsk
-import common.WskAdmin
 import common.WskProps
 import common.WskPropsV2
 import common.WskTestHelpers
@@ -57,7 +56,7 @@ class ApiGwEndToEndTests
 
     implicit val wskprops = WskProps()
     val wsk = new Wsk
-    val (cliuser, clinamespace) = WskAdmin.getUser(wskprops.authKey)
+    val clinamespace = wsk.namespace.whois()
 
     // Custom CLI properties file
     val cliWskPropsFile = File.createTempFile("wskprops", ".tmp")
@@ -85,7 +84,7 @@ class ApiGwEndToEndTests
         val urlqueryvalue = "test"
 
         try {
-            println("cli user: " + cliuser + "; cli namespace: " + clinamespace)
+            println("cli namespace: " + clinamespace)
 
             // Create the action for the API
             val file = TestCLIUtils.getTestActionFilename(s"echo.js")
@@ -155,7 +154,7 @@ class ApiGwEndToEndTests
         val urlqueryvalue = "test"
 
         try {
-            println("cli user: " + cliuser + "; cli namespace: " + clinamespace)
+            println("cli namespace: " + clinamespace)
 
             // Create the action for the API.  It must be a "web-action" action.
             val file = TestCLIUtils.getTestActionFilename(s"echo-web-http.js")
diff --git a/tests/src/test/scala/system/basic/WskBasicTests.scala b/tests/src/test/scala/system/basic/WskBasicTests.scala
index 65ebc04..ef86c1b 100644
--- a/tests/src/test/scala/system/basic/WskBasicTests.scala
+++ b/tests/src/test/scala/system/basic/WskBasicTests.scala
@@ -20,6 +20,9 @@ package system.basic
 import java.io.File
 import java.time.Instant
 
+import scala.concurrent.duration.DurationInt
+import scala.language.postfixOps
+
 import org.junit.runner.RunWith
 import org.scalatest.junit.JUnitRunner
 
@@ -29,12 +32,9 @@ import common.TestUtils._
 import common.Wsk
 import common.WskProps
 import common.WskTestHelpers
-
 import spray.json._
 import spray.json.DefaultJsonProtocol._
 import spray.json.pimpAny
-import scala.concurrent.duration.DurationInt
-import scala.language.postfixOps
 
 @RunWith(classOf[JUnitRunner])
 class WskBasicTests
@@ -138,17 +138,16 @@ class WskBasicTests
                         "description" -> JsString("Parameter description 2"))))
 
             assetHelper.withCleaner(wsk.pkg, packageName) {
-                (pkg, _) =>
-                    pkg.create(packageName, annotations = packageAnnots)
+                (pkg, _) => pkg.create(packageName, annotations = packageAnnots)
             }
 
             wsk.action.create(packageName + "/" + actionName, defaultAction, annotations = actionAnnots)
             val stdout = wsk.pkg.get(packageName, summary = true).stdout
-            val ns_regex_list = wsk.namespace.list().stdout.trim.replace('\n', '|')
+            val ns = wsk.namespace.whois()
             wsk.action.delete(packageName + "/" + actionName)
 
-            stdout should include regex (s"(?i)package /${ns_regex_list}/${packageName}: Package description\\s*\\(parameters: paramName1, paramName2\\)")
-            stdout should include regex (s"(?i)action /${ns_regex_list}/${packageName}/${actionName}: Action description\\s*\\(parameters: paramName1, paramName2\\)")
+            stdout should include regex (s"(?i)package /$ns/$packageName: Package description\\s*\\(parameters: paramName1, paramName2\\)")
+            stdout should include regex (s"(?i)action /$ns/$packageName/$actionName: Action description\\s*\\(parameters: paramName1, paramName2\\)")
     }
 
     it should "create a package with a name that contains spaces" in withAssetCleaner(wskprops) {
@@ -156,8 +155,7 @@ class WskBasicTests
             val name = "package with spaces"
 
             val res = assetHelper.withCleaner(wsk.pkg, name) {
-                (pkg, _) =>
-                    pkg.create(name)
+                (pkg, _) => pkg.create(name)
             }
 
             res.stdout should include(s"ok: created package $name")
@@ -173,12 +171,10 @@ class WskBasicTests
                 (pkg, _) => pkg.create(name, parameters = paramInput)
             }
 
-            val expectedParam = JsObject(
-                "payload" -> JsString("test"))
-
-            val ns_regex_list = wsk.namespace.list().stdout.trim.replace('\n', '|')
+            val expectedParam = JsObject("payload" -> JsString("test"))
+            val ns = wsk.namespace.whois()
 
-            wsk.pkg.get(name, fieldFilter = Some("namespace")).stdout should include regex (s"""(?i)$successMsg namespace\n$ns_regex_list""")
+            wsk.pkg.get(name, fieldFilter = Some("namespace")).stdout should include regex (s"""(?i)$successMsg namespace\n"$ns"""")
             wsk.pkg.get(name, fieldFilter = Some("name")).stdout should include(s"""$successMsg name\n"$name"""")
             wsk.pkg.get(name, fieldFilter = Some("version")).stdout should include(s"""$successMsg version\n"0.0.1"""")
             wsk.pkg.get(name, fieldFilter = Some("publish")).stdout should include(s"""$successMsg publish\nfalse""")
@@ -189,10 +185,9 @@ class WskBasicTests
     it should "reject creation of duplication packages" in withAssetCleaner(wskprops) {
         val name = "dupePackage"
 
-        (wp, assetHelper) =>
-            assetHelper.withCleaner(wsk.pkg, name) {
-                (pkg, _) => pkg.create(name)
-            }
+        (wp, assetHelper) => assetHelper.withCleaner(wsk.pkg, name) {
+            (pkg, _) => pkg.create(name)
+        }
 
         val stderr = wsk.pkg.create(name, expectedExitCode = CONFLICT).stderr
         stderr should include regex (s"""Unable to create package '$name': resource already exists \\(code \\d+\\)""")
@@ -228,6 +223,7 @@ class WskBasicTests
                     action.create(name, file, parameters = params)
                     action.create(name, None, parameters = Map("b" -> "B".toJson), update = true)
             }
+
             val stdout = wsk.action.get(name).stdout
             stdout should not include regex(""""key": "a"""")
             stdout should not include regex(""""value": "A"""")
@@ -242,13 +238,12 @@ class WskBasicTests
         val name = "dupeAction"
         val file = Some(TestCLIUtils.getTestActionFilename("echo.js"))
 
-        (wp, assetHelper) =>
-            assetHelper.withCleaner(wsk.action, name) {
-                (action, _) => action.create(name, file)
-            }
+        (wp, assetHelper) => assetHelper.withCleaner(wsk.action, name) {
+            (action, _) => action.create(name, file)
+        }
 
-            val stderr = wsk.action.create(name, file, expectedExitCode = CONFLICT).stderr
-            stderr should include regex (s"""Unable to create action '$name': resource already exists \\(code \\d+\\)""")
+        val stderr = wsk.action.create(name, file, expectedExitCode = CONFLICT).stderr
+        stderr should include regex (s"""Unable to create action '$name': resource already exists \\(code \\d+\\)""")
     }
 
     it should "reject delete of action that does not exist" in {
@@ -271,40 +266,38 @@ class WskBasicTests
 
     it should "create, and invoke an action that utilizes a docker container" in withAssetCleaner(wskprops) {
         val name = "dockerContainer"
-        (wp, assetHelper) =>
-            assetHelper.withCleaner(wsk.action, name) {
-                // this docker image will be need to be pulled from dockerhub and hence has to be published there first
-                (action, _) => action.create(name, None, docker = Some("openwhisk/example"))
-            }
+        (wp, assetHelper) => assetHelper.withCleaner(wsk.action, name) {
+            // this docker image will be need to be pulled from dockerhub and hence has to be published there first
+            (action, _) => action.create(name, None, docker = Some("openwhisk/example"))
+        }
 
-            val args = Map("payload" -> "test".toJson)
-            val run = wsk.action.invoke(name, args)
-            withActivation(wsk.activation, run) {
-                activation =>
-                    activation.response.result shouldBe Some(JsObject(
-                        "args" -> args.toJson,
-                        "msg" -> "Hello from arbitrary C program!".toJson))
-            }
+        val args = Map("payload" -> "test".toJson)
+        val run = wsk.action.invoke(name, args)
+        withActivation(wsk.activation, run) {
+            activation =>
+                activation.response.result shouldBe Some(JsObject(
+                    "args" -> args.toJson,
+                    "msg" -> "Hello from arbitrary C program!".toJson))
+        }
     }
 
     it should "create, and invoke an action that utilizes dockerskeleton with native zip" in withAssetCleaner(wskprops) {
         val name = "dockerContainerWithZip"
-        (wp, assetHelper) =>
-            assetHelper.withCleaner(wsk.action, name) {
-                // this docker image will be need to be pulled from dockerhub and hence has to be published there first
-                (action, _) => action.create(name, Some(TestCLIUtils.getTestActionFilename("blackbox.zip")), kind = Some("native"))
-            }
+        (wp, assetHelper) => assetHelper.withCleaner(wsk.action, name) {
+            // this docker image will be need to be pulled from dockerhub and hence has to be published there first
+            (action, _) => action.create(name, Some(TestCLIUtils.getTestActionFilename("blackbox.zip")), kind = Some("native"))
+        }
 
-            val run = wsk.action.invoke(name, Map())
-            withActivation(wsk.activation, run) {
-                activation =>
-                    activation.response.result shouldBe Some(JsObject(
-                        "msg" -> "hello zip".toJson))
-                    activation.logs shouldBe defined
-                    val logs = activation.logs.get.toString
-                    logs should include("This is an example zip used with the docker skeleton action.")
-                    logs should not include ("XXX_THE_END_OF_A_WHISK_ACTIVATION_XXX")
-            }
+        val run = wsk.action.invoke(name, Map())
+        withActivation(wsk.activation, run) {
+            activation =>
+                activation.response.result shouldBe Some(JsObject(
+                    "msg" -> "hello zip".toJson))
+                activation.logs shouldBe defined
+                val logs = activation.logs.get.toString
+                logs should include("This is an example zip used with the docker skeleton action.")
+                logs should not include ("XXX_THE_END_OF_A_WHISK_ACTIVATION_XXX")
+        }
     }
 
     it should "create, and invoke an action using a parameter file" in withAssetCleaner(wskprops) {
@@ -312,18 +305,15 @@ class WskBasicTests
         val file = Some(TestCLIUtils.getTestActionFilename("argCheck.js"))
         val argInput = Some(TestCLIUtils.getTestActionFilename("validInput2.json"))
 
-        (wp, assetHelper) =>
-            assetHelper.withCleaner(wsk.action, name) {
-                (action, _) => action.create(name, file)
-            }
+        (wp, assetHelper) => assetHelper.withCleaner(wsk.action, name) {
+            (action, _) => action.create(name, file)
+        }
 
-            val expectedOutput = JsObject(
-                "payload" -> JsString("test"))
-            val run = wsk.action.invoke(name, parameterFile = argInput)
-            withActivation(wsk.activation, run) {
-                activation =>
-                    activation.response.result shouldBe Some(expectedOutput)
-            }
+        val expectedOutput = JsObject("payload" -> JsString("test"))
+        val run = wsk.action.invoke(name, parameterFile = argInput)
+        withActivation(wsk.activation, run) {
+            activation => activation.response.result shouldBe Some(expectedOutput)
+        }
     }
 
     it should "create an action, and get its individual fields" in withAssetCleaner(wskprops) {
@@ -331,26 +321,23 @@ class WskBasicTests
         val paramInput = Map("payload" -> "test".toJson)
         val successMsg = s"ok: got action $name, displaying field"
 
-        (wp, assetHelper) =>
-            assetHelper.withCleaner(wsk.action, name) {
-                (action, _) => action.create(name, defaultAction, parameters = paramInput)
-            }
-
-            val expectedParam = JsObject(
-                "payload" -> JsString("test"))
+        (wp, assetHelper) => assetHelper.withCleaner(wsk.action, name) {
+            (action, _) => action.create(name, defaultAction, parameters = paramInput)
+        }
 
-            val ns_regex_list = wsk.namespace.list().stdout.trim.replace('\n', '|')
+        val expectedParam = JsObject("payload" -> JsString("test"))
+        val ns = wsk.namespace.whois()
 
-            wsk.action.get(name, fieldFilter = Some("name")).stdout should include(s"""$successMsg name\n"$name"""")
-            wsk.action.get(name, fieldFilter = Some("version")).stdout should include(s"""$successMsg version\n"0.0.1"""")
-            wsk.action.get(name, fieldFilter = Some("exec")).stdout should include(s"""$successMsg""")
-            wsk.action.get(name, fieldFilter = Some("exec")).stdout should include regex (s"""$successMsg exec\n\\{\\s+"kind":\\s+"nodejs:6",\\s+"code":\\s+"\\/\\*\\*[\\\\r]*\\\\n \\* Hello, world.[\\\\r]*\\\\n \\*\\/[\\\\r]*\\\\nfunction main\\(params\\) \\{[\\\\r]*\\\\n    greeting \\= 'hello, ' \\+ params.payload \\+ '!'[\\\\r]*\\\\n    console.log\\(greeting\\);[\\\\r]*\\\\n    return \\{payload: greeting\\}[\\\\r]*\\\\n\\}""")
-            wsk.action.get(name, fieldFilter = Some("parameters")).stdout should include regex (s"""$successMsg parameters\n\\[\\s+\\{\\s+"key":\\s+"payload",\\s+"value":\\s+"test"\\s+\\}\\s+\\]""")
-            wsk.action.get(name, fieldFilter = Some("annotations")).stdout should include regex (s"""$successMsg annotations\n\\[\\s+\\{\\s+"key":\\s+"exec",\\s+"value":\\s+"nodejs:6"\\s+\\}\\s+\\]""")
-            wsk.action.get(name, fieldFilter = Some("limits")).stdout should include regex (s"""$successMsg limits\n\\{\\s+"timeout":\\s+60000,\\s+"memory":\\s+256,\\s+"logs":\\s+10\\s+\\}""")
-            wsk.action.get(name, fieldFilter = Some("namespace")).stdout should include regex (s"""(?i)$successMsg namespace\n$ns_regex_list""")
-            wsk.action.get(name, fieldFilter = Some("invalid"), expectedExitCode = MISUSE_EXIT).stderr should include("error: Invalid field filter 'invalid'.")
-            wsk.action.get(name, fieldFilter = Some("publish")).stdout should include(s"""$successMsg publish\nfalse""")
+        wsk.action.get(name, fieldFilter = Some("name")).stdout should include(s"""$successMsg name\n"$name"""")
+        wsk.action.get(name, fieldFilter = Some("version")).stdout should include(s"""$successMsg version\n"0.0.1"""")
+        wsk.action.get(name, fieldFilter = Some("exec")).stdout should include(s"""$successMsg""")
+        wsk.action.get(name, fieldFilter = Some("exec")).stdout should include regex (s"""$successMsg exec\n\\{\\s+"kind":\\s+"nodejs:6",\\s+"code":\\s+"\\/\\*\\*[\\\\r]*\\\\n \\* Hello, world.[\\\\r]*\\\\n \\*\\/[\\\\r]*\\\\nfunction main\\(params\\) \\{[\\\\r]*\\\\n    greeting \\= 'hello, ' \\+ params.payload \\+ '!'[\\\\r]*\\\\n    console.log\\(greeting\\);[\\\\r]*\\\\n    return \\{payload: greeting\\}[\\\\r]*\\\\n\\}""")
+        wsk.action.get(name, fieldFilter = Some("parameters")).stdout should include regex (s"""$successMsg parameters\n\\[\\s+\\{\\s+"key":\\s+"payload",\\s+"value":\\s+"test"\\s+\\}\\s+\\]""")
+        wsk.action.get(name, fieldFilter = Some("annotations")).stdout should include regex (s"""$successMsg annotations\n\\[\\s+\\{\\s+"key":\\s+"exec",\\s+"value":\\s+"nodejs:6"\\s+\\}\\s+\\]""")
+        wsk.action.get(name, fieldFilter = Some("limits")).stdout should include regex (s"""$successMsg limits\n\\{\\s+"timeout":\\s+60000,\\s+"memory":\\s+256,\\s+"logs":\\s+10\\s+\\}""")
+        wsk.action.get(name, fieldFilter = Some("namespace")).stdout should include regex (s"""(?i)$successMsg namespace\n"$ns"""")
+        wsk.action.get(name, fieldFilter = Some("invalid"), expectedExitCode = MISUSE_EXIT).stderr should include("error: Invalid field filter 'invalid'.")
+        wsk.action.get(name, fieldFilter = Some("publish")).stdout should include(s"""$successMsg publish\nfalse""")
     }
 
     /**
@@ -414,6 +401,7 @@ class WskBasicTests
             assetHelper.withCleaner(wsk.action, name) {
                 (action, _) => action.create(name, Some(TestCLIUtils.getTestActionFilename("wc.js")))
             }
+
             wsk.action.invoke(name, Map("payload" -> "one two three".toJson), result = true)
                 .stdout should include regex (""""count": 3""")
     }
@@ -437,9 +425,9 @@ class WskBasicTests
             }
 
             val stdout = wsk.action.get(name, summary = true).stdout
-            val ns_regex_list = wsk.namespace.list().stdout.trim.replace('\n', '|')
+            val ns = wsk.namespace.whois()
 
-            stdout should include regex (s"(?i)action /${ns_regex_list}/${name}: Action description\\s*\\(parameters: paramName1, paramName2\\)")
+            stdout should include regex (s"(?i)action /$ns/$name: Action description\\s*\\(parameters: paramName1, paramName2\\)")
     }
 
     it should "create an action with a name that contains spaces" in withAssetCleaner(wskprops) {
@@ -484,12 +472,11 @@ class WskBasicTests
 
     it should "create, and get docker action get ensure exec code is omitted" in withAssetCleaner(wskprops) {
         val name = "dockerContainer"
-        (wp, assetHelper) =>
-            assetHelper.withCleaner(wsk.action, name) {
-                (action, _) => action.create(name, None, docker = Some("fake-container"))
-            }
+        (wp, assetHelper) => assetHelper.withCleaner(wsk.action, name) {
+            (action, _) => action.create(name, None, docker = Some("fake-container"))
+        }
 
-            wsk.action.get(name).stdout should not include (""""code"""")
+        wsk.action.get(name).stdout should not include (""""code"""")
     }
 
     behavior of "Wsk Trigger CLI"
@@ -548,9 +535,9 @@ class WskBasicTests
             }
 
             val stdout = wsk.trigger.get(name, summary = true).stdout
-            val ns_regex_list = wsk.namespace.list().stdout.trim.replace('\n', '|')
+            val ns = wsk.namespace.whois()
 
-            stdout should include regex (s"trigger /${ns_regex_list}/${name}: Trigger description\\s*\\(parameters: paramName1, paramName2\\)")
+            stdout should include regex (s"trigger /$ns/$name: Trigger description\\s*\\(parameters: paramName1, paramName2\\)")
     }
 
     it should "create a trigger with a name that contains spaces" in withAssetCleaner(wskprops) {
@@ -558,8 +545,7 @@ class WskBasicTests
             val name = "trigger with spaces"
 
             val res = assetHelper.withCleaner(wsk.trigger, name) {
-                (trigger, _) =>
-                    trigger.create(name)
+                (trigger, _) => trigger.create(name)
             }
 
             res.stdout should include regex (s"ok: created trigger $name")
@@ -570,19 +556,15 @@ class WskBasicTests
         val file = Some(TestCLIUtils.getTestActionFilename("argCheck.js"))
         val argInput = Some(TestCLIUtils.getTestActionFilename("validInput2.json"))
 
-        (wp, assetHelper) =>
-            assetHelper.withCleaner(wsk.trigger, name) {
-                (trigger, _) =>
-                    trigger.create(name)
-            }
+        (wp, assetHelper) => assetHelper.withCleaner(wsk.trigger, name) {
+            (trigger, _) => trigger.create(name)
+        }
 
-            val expectedOutput = JsObject(
-                "payload" -> JsString("test"))
-            val run = wsk.trigger.fire(name, parameterFile = argInput)
-            withActivation(wsk.activation, run) {
-                activation =>
-                    activation.response.result shouldBe Some(expectedOutput)
-            }
+        val expectedOutput = JsObject("payload" -> JsString("test"))
+        val run = wsk.trigger.fire(name, parameterFile = argInput)
+        withActivation(wsk.activation, run) {
+            activation => activation.response.result shouldBe Some(expectedOutput)
+        }
     }
 
     it should "create a trigger, and get its individual fields" in withAssetCleaner(wskprops) {
@@ -590,53 +572,47 @@ class WskBasicTests
         val paramInput = Map("payload" -> "test".toJson)
         val successMsg = s"ok: got trigger $name, displaying field"
 
-        (wp, assetHelper) =>
-            assetHelper.withCleaner(wsk.trigger, name) {
-                (trigger, _) =>
-                    trigger.create(name, parameters = paramInput)
-            }
-
-            val expectedParam = JsObject(
-                "payload" -> JsString("test"))
+        (wp, assetHelper) => assetHelper.withCleaner(wsk.trigger, name) {
+            (trigger, _) => trigger.create(name, parameters = paramInput)
+        }
 
-            val ns_regex_list = wsk.namespace.list().stdout.trim.replace('\n', '|')
+        val expectedParam = JsObject("payload" -> JsString("test"))
+        val ns = wsk.namespace.whois()
 
-            wsk.trigger.get(name, fieldFilter = Some("namespace")).stdout should include regex (s"""(?i)$successMsg namespace\n$ns_regex_list""")
-            wsk.trigger.get(name, fieldFilter = Some("name")).stdout should include(s"""$successMsg name\n"$name"""")
-            wsk.trigger.get(name, fieldFilter = Some("version")).stdout should include(s"""$successMsg version\n"0.0.1"""")
-            wsk.trigger.get(name, fieldFilter = Some("publish")).stdout should include(s"""$successMsg publish\nfalse""")
-            wsk.trigger.get(name, fieldFilter = Some("annotations")).stdout should include(s"""$successMsg annotations\n[]""")
-            wsk.trigger.get(name, fieldFilter = Some("parameters")).stdout should include regex (s"""$successMsg parameters\n\\[\\s+\\{\\s+"key":\\s+"payload",\\s+"value":\\s+"test"\\s+\\}\\s+\\]""")
-            wsk.trigger.get(name, fieldFilter = Some("limits")).stdout should include(s"""$successMsg limits\n{}""")
-            wsk.trigger.get(name, fieldFilter = Some("invalid"), expectedExitCode = ERROR_EXIT).stderr should include("error: Invalid field filter 'invalid'.")
+        wsk.trigger.get(name, fieldFilter = Some("namespace")).stdout should include regex (s"""(?i)$successMsg namespace\n"$ns"""")
+        wsk.trigger.get(name, fieldFilter = Some("name")).stdout should include(s"""$successMsg name\n"$name"""")
+        wsk.trigger.get(name, fieldFilter = Some("version")).stdout should include(s"""$successMsg version\n"0.0.1"""")
+        wsk.trigger.get(name, fieldFilter = Some("publish")).stdout should include(s"""$successMsg publish\nfalse""")
+        wsk.trigger.get(name, fieldFilter = Some("annotations")).stdout should include(s"""$successMsg annotations\n[]""")
+        wsk.trigger.get(name, fieldFilter = Some("parameters")).stdout should include regex (s"""$successMsg parameters\n\\[\\s+\\{\\s+"key":\\s+"payload",\\s+"value":\\s+"test"\\s+\\}\\s+\\]""")
+        wsk.trigger.get(name, fieldFilter = Some("limits")).stdout should include(s"""$successMsg limits\n{}""")
+        wsk.trigger.get(name, fieldFilter = Some("invalid"), expectedExitCode = ERROR_EXIT).stderr should include("error: Invalid field filter 'invalid'.")
     }
 
     it should "create, and fire a trigger to ensure result is empty" in withAssetCleaner(wskprops) {
         (wp, assetHelper) =>
             val name = "emptyResultTrigger"
             assetHelper.withCleaner(wsk.trigger, name) {
-                (trigger, _) =>
-                    trigger.create(name)
+                (trigger, _) => trigger.create(name)
             }
 
             val run = wsk.trigger.fire(name)
             withActivation(wsk.activation, run) {
-                activation =>
-                    activation.response.result shouldBe Some(JsObject())
+                activation => activation.response.result shouldBe Some(JsObject())
             }
     }
 
     it should "reject creation of duplicate triggers" in withAssetCleaner(wskprops) {
         val name = "dupeTrigger"
 
-        (wp, assetHelper) =>
-            assetHelper.withCleaner(wsk.trigger, name) {
-                (trigger, _) => trigger.create(name)
-            }
+        (wp, assetHelper) => assetHelper.withCleaner(wsk.trigger, name) {
+            (trigger, _) => trigger.create(name)
+        }
 
         val stderr = wsk.trigger.create(name, expectedExitCode = CONFLICT).stderr
         stderr should include regex (s"""Unable to create trigger '$name': resource already exists \\(code \\d+\\)""")
     }
+
     it should "reject delete of trigger that does not exist" in {
         val name = "nonexistentTrigger"
         val stderr = wsk.trigger.delete(name, expectedExitCode = NOT_FOUND).stderr
@@ -698,8 +674,7 @@ class WskBasicTests
                 (action, name) => action.create(name, defaultAction)
             }
             assetHelper.withCleaner(wsk.rule, ruleName) {
-                (rule, name) =>
-                    rule.create(name, trigger = triggerName, action = actionName)
+                (rule, name) => rule.create(name, trigger = triggerName, action = actionName)
             }
 
             val stdout = wsk.rule.get(ruleName).stdout
@@ -721,11 +696,12 @@ class WskBasicTests
             assetHelper.withCleaner(wsk.rule, ruleName, confirmDelete = false) {
                 (rule, name) => rule.create(name, trigger = triggerName, action = actionName)
             }
+
             // Summary namespace should match one of the allowable namespaces (typically 'guest')
-            val ns_regex_list = wsk.namespace.list().stdout.trim.replace('\n', '|')
+            val ns = wsk.namespace.whois()
             val stdout = wsk.rule.get(ruleName, summary = true).stdout
 
-            stdout should include regex (s"(?i)rule /${ns_regex_list}/${ruleName}\\s*\\(status: active\\)")
+            stdout should include regex (s"(?i)rule /$ns/$ruleName\\s*\\(status: active\\)")
     }
 
     it should "create a rule, and get its individual fields" in withAssetCleaner(wskprops) {
@@ -735,32 +711,29 @@ class WskBasicTests
         val paramInput = Map("payload" -> "test".toJson)
         val successMsg = s"ok: got rule $ruleName, displaying field"
 
-        (wp, assetHelper) =>
-            assetHelper.withCleaner(wsk.trigger, triggerName) {
-                (trigger, name) => trigger.create(name)
-            }
-            assetHelper.withCleaner(wsk.action, actionName) {
-                (action, name) => action.create(name, defaultAction)
-            }
-            assetHelper.withCleaner(wsk.rule, ruleName) {
-                (rule, name) =>
-                    rule.create(name, trigger = triggerName, action = actionName)
-            }
-
-            val ns_regex_list = wsk.namespace.list().stdout.trim.replace('\n', '|')
+        (wp, assetHelper) => assetHelper.withCleaner(wsk.trigger, triggerName) {
+            (trigger, name) => trigger.create(name)
+        }
+        assetHelper.withCleaner(wsk.action, actionName) {
+            (action, name) => action.create(name, defaultAction)
+        }
+        assetHelper.withCleaner(wsk.rule, ruleName) {
+            (rule, name) => rule.create(name, trigger = triggerName, action = actionName)
+        }
 
-            wsk.rule.get(ruleName, fieldFilter = Some("namespace")).stdout should include regex (s"""(?i)$successMsg namespace\n$ns_regex_list""")
-            wsk.rule.get(ruleName, fieldFilter = Some("name")).stdout should include(s"""$successMsg name\n"$ruleName"""")
-            wsk.rule.get(ruleName, fieldFilter = Some("version")).stdout should include(s"""$successMsg version\n"0.0.1"\n""")
-            wsk.rule.get(ruleName, fieldFilter = Some("status")).stdout should include(s"""$successMsg status\n"active"""")
-            val trigger = wsk.rule.get(ruleName, fieldFilter = Some("trigger")).stdout
-            trigger should include regex (s"""$successMsg trigger\n""")
-            trigger should include(triggerName)
-            trigger should not include (actionName)
-            val action = wsk.rule.get(ruleName, fieldFilter = Some("action")).stdout
-            action should include regex (s"""$successMsg action\n""")
-            action should include(actionName)
-            action should not include (triggerName)
+        val ns = wsk.namespace.whois()
+        wsk.rule.get(ruleName, fieldFilter = Some("namespace")).stdout should include regex (s"""(?i)$successMsg namespace\n"$ns"""")
+        wsk.rule.get(ruleName, fieldFilter = Some("name")).stdout should include(s"""$successMsg name\n"$ruleName"""")
+        wsk.rule.get(ruleName, fieldFilter = Some("version")).stdout should include(s"""$successMsg version\n"0.0.1"\n""")
+        wsk.rule.get(ruleName, fieldFilter = Some("status")).stdout should include(s"""$successMsg status\n"active"""")
+        val trigger = wsk.rule.get(ruleName, fieldFilter = Some("trigger")).stdout
+        trigger should include regex (s"""$successMsg trigger\n""")
+        trigger should include(triggerName)
+        trigger should not include (actionName)
+        val action = wsk.rule.get(ruleName, fieldFilter = Some("action")).stdout
+        action should include regex (s"""$successMsg action\n""")
+        action should include(actionName)
+        action should not include (triggerName)
     }
 
     it should "reject creation of duplicate rules" in withAssetCleaner(wskprops) {
@@ -768,17 +741,15 @@ class WskBasicTests
         val triggerName = "triggerName"
         val actionName = "actionName"
 
-        (wp, assetHelper) =>
-            assetHelper.withCleaner(wsk.trigger, triggerName) {
-                (trigger, name) => trigger.create(name)
-            }
-            assetHelper.withCleaner(wsk.action, actionName) {
-                (action, name) => action.create(name, defaultAction)
-            }
-            assetHelper.withCleaner(wsk.rule, ruleName) {
-                (rule, name) =>
-                    rule.create(name, trigger = triggerName, action = actionName)
-            }
+        (wp, assetHelper) => assetHelper.withCleaner(wsk.trigger, triggerName) {
+            (trigger, name) => trigger.create(name)
+        }
+        assetHelper.withCleaner(wsk.action, actionName) {
+            (action, name) => action.create(name, defaultAction)
+        }
+        assetHelper.withCleaner(wsk.rule, ruleName) {
+            (rule, name) => rule.create(name, trigger = triggerName, action = actionName)
+        }
 
         val stderr = wsk.rule.create(ruleName, trigger = triggerName, action = actionName, expectedExitCode = CONFLICT).stderr
         stderr should include regex (s"""Unable to create rule '$ruleName': resource already exists \\(code \\d+\\)""")
@@ -817,8 +788,10 @@ class WskBasicTests
     behavior of "Wsk Namespace CLI"
 
     it should "return a list of exactly one namespace" in {
-        wsk.namespace.list().
-            stdout.lines should have size 2 // headline + namespace
+        val lines = wsk.namespace.list().stdout.lines.toSeq
+        lines should have size 2
+        lines.head shouldBe "namespaces"
+        lines(1).trim should not be empty
     }
 
     it should "list entities in default namespace" in {
@@ -846,13 +819,12 @@ class WskBasicTests
                     trigger.create(name)
             }
 
-            val ns_regex_list = wsk.namespace.list().stdout.trim.replace('\n', '|')
-
+            val ns = s""""${wsk.namespace.whois()}""""
             val run = wsk.trigger.fire(name)
             withActivation(wsk.activation, run) {
                 activation =>
                     val successMsg = s"ok: got activation ${activation.activationId}, displaying field"
-                    wsk.activation.get(Some(activation.activationId), fieldFilter = Some("namespace")).stdout should include regex (s"""(?i)$successMsg namespace\n$ns_regex_list""")
+                    wsk.activation.get(Some(activation.activationId), fieldFilter = Some("namespace")).stdout should include regex (s"""(?i)$successMsg namespace\n$ns""")
                     wsk.activation.get(Some(activation.activationId), fieldFilter = Some("name")).stdout should include(s"""$successMsg name\n"$name"""")
                     wsk.activation.get(Some(activation.activationId), fieldFilter = Some("version")).stdout should include(s"""$successMsg version\n"0.0.1"""")
                     wsk.activation.get(Some(activation.activationId), fieldFilter = Some("publish")).stdout should include(s"""$successMsg publish\nfalse""")
@@ -866,19 +838,19 @@ class WskBasicTests
     }
 
     it should "reject get of activation that does not exist" in {
-        val name = "0"*32
+        val name = "0" * 32
         val stderr = wsk.activation.get(Some(name), expectedExitCode = NOT_FOUND).stderr
         stderr should include regex (s"""Unable to get activation '$name': The requested resource does not exist. \\(code \\d+\\)""")
     }
 
     it should "reject logs of activation that does not exist" in {
-        val name = "0"*32
+        val name = "0" * 32
         val stderr = wsk.activation.logs(Some(name), expectedExitCode = NOT_FOUND).stderr
         stderr should include regex (s"""Unable to get logs for activation '$name': The requested resource does not exist. \\(code \\d+\\)""")
     }
 
     it should "reject result of activation that does not exist" in {
-        val name = "0"*32
+        val name = "0" * 32
         val stderr = wsk.activation.result(Some(name), expectedExitCode = NOT_FOUND).stderr
         stderr should include regex (s"""Unable to get result for activation '$name': The requested resource does not exist. \\(code \\d+\\)""")
     }
@@ -895,7 +867,7 @@ class WskBasicTests
             val includeID = wsk.activation.extractActivationId(lastInvoke).get
             Thread.sleep(1000)
 
-            var  lastFlag = Seq (
+            val lastFlag = Seq(
                 (Seq("activation", "get", "publish", "--last"), includeID),
                 (Seq("activation", "get", "--last"), includeID),
                 (Seq("activation", "logs", "--last"), includeStr),
@@ -912,15 +884,15 @@ class WskBasicTests
         (wp, assetHelper) =>
             val auth: Seq[String] = Seq("--auth", wskprops.authKey)
 
-             assetHelper.withCleaner(wsk.action, "lastName") {
-                 (action, _) => wsk.action.create("lastName", defaultAction)
-             }
+            assetHelper.withCleaner(wsk.action, "lastName") {
+                (action, _) => wsk.action.create("lastName", defaultAction)
+            }
             val lastId = wsk.activation.extractActivationId(wsk.action.invoke("lastName")).get
             val tooManyArgsMsg = s"${lastId}. An activation ID is required."
             val invalidField = s"Invalid field filter '${lastId}'."
             Thread.sleep(1000)
 
-            var  invalidCmd = Seq (
+            val invalidCmd = Seq(
                 (Seq("activation", "get", s"$lastId", "publish", "--last"), tooManyArgsMsg),
                 (Seq("activation", "get", s"$lastId", "--last"), invalidField),
                 (Seq("activation", "logs", s"$lastId", "--last"), tooManyArgsMsg),
@@ -931,5 +903,5 @@ class WskBasicTests
                     val stderr = wsk.cli(cmd ++ wskprops.overrides ++ auth, expectedExitCode = ERROR_EXIT).stderr
                     stderr should include(err)
             }
-     }
+    }
 }
diff --git a/tests/src/test/scala/whisk/core/admin/WskAdminTests.scala b/tests/src/test/scala/whisk/core/admin/WskAdminTests.scala
index e5ab26c..ec4cf59 100644
--- a/tests/src/test/scala/whisk/core/admin/WskAdminTests.scala
+++ b/tests/src/test/scala/whisk/core/admin/WskAdminTests.scala
@@ -25,10 +25,11 @@ import org.scalatest.junit.JUnitRunner
 
 import common.RunWskAdminCmd
 import common.TestHelpers
+import common.Wsk
 import common.WskAdmin
+import common.WskProps
 import whisk.core.entity.AuthKey
 import whisk.core.entity.Subject
-import whisk.core.entity.WhiskAuth
 
 @RunWith(classOf[JUnitRunner])
 class WskAdminTests
@@ -43,8 +44,8 @@ class WskAdminTests
 
     it should "CRD a subject" in {
         val wskadmin = new RunWskAdminCmd {}
-        val auth = WhiskAuth(Subject(), AuthKey())
-        val subject = auth.subject.asString
+        val auth = AuthKey()
+        val subject = Subject().asString
         try {
             println(s"CRD subject: $subject")
             val create = wskadmin.cli(Seq("user", "create", subject))
@@ -67,14 +68,14 @@ class WskAdminTests
 
             // recreate with explicit
             val newspace = s"${subject}.myspace"
-            wskadmin.cli(Seq("user", "create", subject, "-ns", newspace, "-u", auth.authkey.compact))
+            wskadmin.cli(Seq("user", "create", subject, "-ns", newspace, "-u", auth.compact))
 
             whisk.utils.retry({
                 // reverse lookup by namespace
-                wskadmin.cli(Seq("user", "list", "-k", newspace)).stdout.trim should be(auth.authkey.compact)
+                wskadmin.cli(Seq("user", "list", "-k", newspace)).stdout.trim should be(auth.compact)
             }, 10, Some(1.second))
 
-            wskadmin.cli(Seq("user", "get", subject, "-ns", newspace)).stdout.trim should be(auth.authkey.compact)
+            wskadmin.cli(Seq("user", "get", subject, "-ns", newspace)).stdout.trim should be(auth.compact)
 
             // delete namespace
             wskadmin.cli(Seq("user", "delete", subject, "-ns", newspace)).stdout should include("Namespace deleted")
@@ -83,4 +84,11 @@ class WskAdminTests
         }
     }
 
+    it should "verify guest account installed correctly" in {
+        val wskadmin = new RunWskAdminCmd {}
+        implicit val wskprops = WskProps()
+        val wsk = new Wsk
+        val ns = wsk.namespace.whois()
+        wskadmin.cli(Seq("user", "get", ns)).stdout.trim should be(wskprops.authKey)
+    }
 }
diff --git a/tests/src/test/scala/whisk/core/cli/test/ApiGwTests.scala b/tests/src/test/scala/whisk/core/cli/test/ApiGwTests.scala
index aadb929..aa3fd84 100644
--- a/tests/src/test/scala/whisk/core/cli/test/ApiGwTests.scala
+++ b/tests/src/test/scala/whisk/core/cli/test/ApiGwTests.scala
@@ -29,7 +29,6 @@ import common.TestUtils._
 import common.TestCLIUtils
 import common.WhiskProperties
 import common.Wsk
-import common.WskAdmin
 import common.WskProps
 import common.WskPropsV2
 import common.WskTestHelpers
@@ -45,7 +44,7 @@ class ApiGwTests
 
     implicit var wskprops = WskProps()
     val wsk = new Wsk
-    val (cliuser, clinamespace) = WskAdmin.getUser(wskprops.authKey)
+    val clinamespace = wsk.namespace.whois()
 
     // This test suite makes enough CLI invocations in 60 seconds to trigger the OpenWhisk
     // throttling restriction.  To avoid CLI failures due to being throttled, track the
@@ -229,7 +228,7 @@ class ApiGwTests
         val testapiname = testName + " API Name"
         val actionName = testName + "_action"
         try {
-            println("cli user: " + cliuser + "; cli namespace: " + clinamespace)
+            println("cli namespace: " + clinamespace)
 
             var rr = apiCreateExperimental(basepath = Some(testbasepath), relpath = Some(testrelpath), operation = Some(testurlop), action = Some(actionName), apiname = Some(testapiname))
             println("api create: " + rr.stdout)
@@ -259,7 +258,7 @@ class ApiGwTests
         val testapiname = testName+" API Name"
         val actionName = testName+"_action"
         try {
-            println("cli user: "+cliuser+"; cli namespace: "+clinamespace)
+            println("cli namespace: "+clinamespace)
 
             var rr = apiCreateExperimental(basepath = Some(testbasepath), relpath = Some(testrelpath), operation = Some(testurlop), action = Some(actionName), apiname = Some(testapiname))
             rr.stdout should include("ok: created API")
@@ -434,7 +433,7 @@ class ApiGwTests
         val testapiname = testName+" API Name"
         val actionName = testName+"a-c@t ion"
         try {
-            println("cli user: "+cliuser+"; cli namespace: "+clinamespace)
+            println("cli namespace: "+clinamespace)
 
             var rr = apiCreateExperimental(basepath = Some(testbasepath), relpath = Some(testrelpath), operation = Some(testurlop), action = Some(actionName), apiname = Some(testapiname))
             rr.stdout should include("ok: created API")
@@ -612,7 +611,7 @@ class ApiGwTests
         val testapiname = testName + " API Name"
         val actionName = testName + "_action"
         try {
-            println("cli user: " + cliuser + "; cli namespace: " + clinamespace)
+            println("cli namespace: " + clinamespace)
             // Create the action for the API.  It must be a "web-action" action.
             val file = TestCLIUtils.getTestActionFilename(s"echo.js")
             wsk.action.create(name = actionName, artifact = Some(file), expectedExitCode = SUCCESS_EXIT, web = Some("true"))
@@ -646,7 +645,7 @@ class ApiGwTests
         val testapiname = testName+" API Name"
         val actionName = testName+"_action"
         try {
-            println("cli user: "+cliuser+"; cli namespace: "+clinamespace)
+            println("cli namespace: "+clinamespace)
 
             // Create the action for the API.  It must be a "web-action" action.
             val file = TestCLIUtils.getTestActionFilename(s"echo.js")
@@ -856,7 +855,7 @@ class ApiGwTests
         val testapiname = testName+" API Name"
         val actionName = testName+"a-c@t ion"
         try {
-            println("cli user: "+cliuser+"; cli namespace: "+clinamespace)
+            println("cli namespace: "+clinamespace)
             // Create the action for the API.  It must be a "web-action" action.
             val file = TestCLIUtils.getTestActionFilename(s"echo.js")
             wsk.action.create(name = actionName, artifact = Some(file), expectedExitCode = SUCCESS_EXIT, web = Some("true"))
@@ -1256,7 +1255,7 @@ class ApiGwTests
         val wskpropsBackup = wskprops
         try {
             // Create the action for the API.
-            val file = TestUtils.getTestActionFilename(s"echo.js")
+            val file = TestCLIUtils.getTestActionFilename(s"echo.js")
             wsk.action.create(name = actionName, artifact = Some(file), expectedExitCode = SUCCESS_EXIT, web = Some("true"))
 
             // Set an invalid auth key
diff --git a/tests/src/test/scala/whisk/core/cli/test/WskActionSequenceTests.scala b/tests/src/test/scala/whisk/core/cli/test/WskActionSequenceTests.scala
index d6a2fab..84d4a82 100644
--- a/tests/src/test/scala/whisk/core/cli/test/WskActionSequenceTests.scala
+++ b/tests/src/test/scala/whisk/core/cli/test/WskActionSequenceTests.scala
@@ -23,10 +23,10 @@ import org.scalatest.junit.JUnitRunner
 import common.TestHelpers
 import common.TestCLIUtils
 import common.Wsk
-import common.WskAdmin
 import common.WskProps
 import common.WskTestHelpers
 import spray.json._
+import whisk.core.entity.EntityPath
 
 /**
  * Tests creation and retrieval of a sequence action
@@ -38,8 +38,8 @@ class WskActionSequenceTests
 
     implicit val wskprops = WskProps()
     val wsk = new Wsk
-    val defaultNamespace = wskprops.namespace
-    val (user, namespace) = WskAdmin.getUser(wskprops.authKey)
+    val defaultNamespace = EntityPath.DEFAULT.asString
+    val namespace = wsk.namespace.whois()
 
     behavior of "Wsk Action Sequence"
 
diff --git a/tests/src/test/scala/whisk/core/cli/test/WskBasicUsageTests.scala b/tests/src/test/scala/whisk/core/cli/test/WskBasicUsageTests.scala
index ea2c8d4..987d0ae 100644
--- a/tests/src/test/scala/whisk/core/cli/test/WskBasicUsageTests.scala
+++ b/tests/src/test/scala/whisk/core/cli/test/WskBasicUsageTests.scala
@@ -22,6 +22,8 @@ import java.io.BufferedWriter
 import java.io.FileWriter
 import java.time.Instant
 import java.net.URLEncoder
+import java.nio.charset.StandardCharsets
+import java.time.Clock
 
 import scala.language.postfixOps
 import scala.concurrent.duration.Duration
@@ -50,8 +52,6 @@ import whisk.core.entity.size.SizeInt
 import whisk.utils.retry
 import JsonArgsForTests._
 import whisk.http.Messages
-import common.WskAdmin
-import java.time.Clock
 
 /**
  * Tests for basic CLI usage. Some of these tests require a deployed backend.
@@ -98,10 +98,13 @@ class WskBasicUsageTests
     it should "set apihost, auth, and namespace" in {
         val tmpwskprops = File.createTempFile("wskprops", ".tmp")
         try {
-            val namespace = wsk.namespace.list().stdout.trim.split("\n").last
+            val namespace = wsk.namespace.whois()
             val env = Map("WSK_CONFIG_FILE" -> tmpwskprops.getAbsolutePath())
-            val stdout = wsk.cli(Seq("property", "set", "-i", "--apihost", wskprops.apihost, "--auth", wskprops.authKey,
-                "--namespace", namespace), env = env).stdout
+            val stdout = wsk.cli(Seq("property", "set", "-i",
+                "--apihost", wskprops.apihost,
+                "--auth", wskprops.authKey,
+                "--namespace", namespace),
+                env = env).stdout
             stdout should include(s"ok: whisk auth set")
             stdout should include(s"ok: whisk API host set to ${wskprops.apihost}")
             stdout should include(s"ok: whisk namespace set to ${namespace}")
@@ -521,7 +524,7 @@ class WskBasicUsageTests
 
     it should "invoke an action receiving context properties" in withAssetCleaner(wskprops) {
         (wp, assetHelper) =>
-            val (user, namespace) = WskAdmin.getUser(wskprops.authKey)
+            val namespace = wsk.namespace.whois()
             val name = "context"
             assetHelper.withCleaner(wsk.action, name) {
                 (action, _) => action.create(name, Some(TestCLIUtils.getTestActionFilename("helloContext.js")))
@@ -706,11 +709,11 @@ class WskBasicUsageTests
             val nonExistentActionName = "non-existence action"
             val packagedAction = s"$packageName/$actionName"
             val packagedWebAction = s"$packageName/$webActionName"
-            val (user, namespace) = WskAdmin.getUser(wskprops.authKey)
-            val encodedActionName = URLEncoder.encode(actionName, "UTF-8").replace("+", "%20")
-            val encodedPackageName = URLEncoder.encode(packageName, "UTF-8").replace("+", "%20")
-            val encodedWebActionName = URLEncoder.encode(webActionName, "UTF-8").replace("+", "%20")
-            val encodedNamespace = URLEncoder.encode(namespace, "UTF-8").replace("+", "%20")
+            val namespace = wsk.namespace.whois()
+            val encodedActionName = URLEncoder.encode(actionName, StandardCharsets.UTF_8.name).replace("+", "%20")
+            val encodedPackageName = URLEncoder.encode(packageName, StandardCharsets.UTF_8.name).replace("+", "%20")
+            val encodedWebActionName = URLEncoder.encode(webActionName, StandardCharsets.UTF_8.name).replace("+", "%20")
+            val encodedNamespace = URLEncoder.encode(namespace, StandardCharsets.UTF_8.name).replace("+", "%20")
             val actionPath = "https://%s/api/%s/namespaces/%s/actions/%s"
             val packagedActionPath = s"$actionPath/%s"
             val webActionPath = "https://%s/api/%s/web/%s/%s/%s"
@@ -906,9 +909,9 @@ class WskBasicUsageTests
             }
 
             // Summary namespace should match one of the allowable namespaces (typically 'guest')
-            val ns_regex_list = wsk.namespace.list().stdout.trim.replace('\n', '|')
+            val ns = wsk.namespace.whois()
             val stdout = wsk.trigger.get(triggerName, summary = true).stdout
-            stdout should include regex (s"(?i)trigger\\s+/${ns_regex_list}/${triggerName}")
+            stdout should include regex (s"(?i)trigger\\s+/$ns/$triggerName")
     }
 
     it should "create a trigger with the proper parameter and annotation escapes" in withAssetCleaner(wskprops) {
diff --git a/tests/src/test/scala/whisk/core/cli/test/WskEntitlementTests.scala b/tests/src/test/scala/whisk/core/cli/test/WskEntitlementTests.scala
index 70de2f8..7f83762 100644
--- a/tests/src/test/scala/whisk/core/cli/test/WskEntitlementTests.scala
+++ b/tests/src/test/scala/whisk/core/cli/test/WskEntitlementTests.scala
@@ -27,7 +27,6 @@ import common.TestUtils.FORBIDDEN
 import common.TestUtils.NOT_FOUND
 import common.TestUtils.TIMEOUT
 import common.Wsk
-import common.WskAdmin
 import common.WskProps
 import common.WskTestHelpers
 import spray.json._
@@ -328,7 +327,7 @@ class WskEntitlementTests
             val run = wsk.action.invoke(fullyQualifiedActionName)(defaultWskProps)
 
             withActivation(wsk.activation, run)({ activation =>
-                val (_, namespace) = WskAdmin.getUser(defaultWskProps.authKey)
+                val namespace = wsk.namespace.whois()(defaultWskProps)
                 activation.response.success shouldBe true
                 activation.response.result.get.toString should include regex (s""""namespace":\\s*"$namespace"""")
             })(defaultWskProps)
diff --git a/tests/src/test/scala/whisk/core/cli/test/WskWebActionsTests.scala b/tests/src/test/scala/whisk/core/cli/test/WskWebActionsTests.scala
index 1f38acd..be6ae04 100644
--- a/tests/src/test/scala/whisk/core/cli/test/WskWebActionsTests.scala
+++ b/tests/src/test/scala/whisk/core/cli/test/WskWebActionsTests.scala
@@ -32,7 +32,6 @@ import common.TestHelpers
 import common.TestCLIUtils
 import common.WhiskProperties
 import common.Wsk
-import common.WskAdmin
 import common.WskProps
 import common.WskTestHelpers
 import spray.json._
@@ -132,7 +131,7 @@ trait WskWebActionsTests
 
     val wsk = new Wsk
     private implicit val wskprops = WskProps()
-    val namespace = WskAdmin.getUser(wskprops.authKey)._2
+    val namespace = wsk.namespace.whois()
 
     protected val testRoutePath: String
 

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