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 <[email protected]> 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 "[email protected]" <[email protected]>.
