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

dgrove pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openwhisk.git


The following commit(s) were added to refs/heads/master by this push:
     new 54564cbc7 Refresh runtimes list: add new versions; remove 
old/deprecated versions (#5426)
54564cbc7 is described below

commit 54564cbc76771658c14a84dd413856d8b078eeb8
Author: David Grove <[email protected]>
AuthorDate: Thu Jul 13 09:57:35 2023 -0400

    Refresh runtimes list: add new versions; remove old/deprecated versions 
(#5426)
---
 ansible/files/runtimes-nodeonly.json               |   6 +-
 ansible/files/runtimes.json                        | 149 ++++-----------------
 .../src/main/resources/apiv1swagger.json           |  12 +-
 .../monitoring/metrics/KamonRecorderTests.scala    |   2 +-
 .../metrics/PrometheusRecorderTests.scala          |   2 +-
 core/standalone/bin/waitready                      |   2 +-
 .../openwhisk/standalone/StandaloneOpenWhisk.scala |   4 +-
 docs/actions-new.md                                |  10 +-
 docs/actions-nodejs.md                             |  30 ++---
 docs/actions.md                                    |  16 +--
 tests/dat/actions/echo.json                        |   2 +-
 tests/dat/actions/word_count.json                  |   2 +-
 .../openwhisk/core/admin/WskAdminTests.scala       |   6 +-
 .../docker/test/DockerContainerFactoryTests.scala  |   2 +-
 .../controller/test/EntitlementProviderTests.scala |   2 +-
 .../core/controller/test/KindRestrictorTests.scala |   2 +-
 ...tifactWithFileStorageActivationStoreTests.scala |   6 +-
 .../core/database/LimitsCommandTests.scala         |  12 +-
 .../test/AttachmentCompatibilityTests.scala        |   4 +-
 .../openwhisk/core/entity/test/ExecHelpers.scala   |   2 +-
 .../core/entity/test/ExecManifestTests.scala       |   8 +-
 .../openwhisk/core/entity/test/ExecTests.scala     |  14 +-
 .../openwhisk/core/entity/test/SchemaTests.scala   |  16 +--
 .../core/entity/test/WhiskEntityTests.scala        |   4 +-
 .../test/ContainerMessageConsumerTests.scala       |   6 +-
 .../openwhisk/core/limits/ActionLimitsTests.scala  |   4 +-
 .../core/scheduler/grpc/test/CommonVariable.scala  |   2 +-
 .../test/scala/system/rest/JsonSchemaTests.scala   |   2 +-
 28 files changed, 113 insertions(+), 216 deletions(-)

diff --git a/ansible/files/runtimes-nodeonly.json 
b/ansible/files/runtimes-nodeonly.json
index 18de9caa8..a9a212567 100644
--- a/ansible/files/runtimes-nodeonly.json
+++ b/ansible/files/runtimes-nodeonly.json
@@ -3,7 +3,7 @@
         "This file describes the different languages (aka. managed action 
runtimes) supported by the system",
         "as well as blackbox images that support the runtime specification.",
         "Only actions with runtime families / kinds defined here can be 
created / read / updated / deleted / invoked.",
-        "Define a list of runtime families (example: 'nodejs') with at least 
one kind per family (example: 'nodejs:14').",
+        "Define a list of runtime families (example: 'nodejs') with at least 
one kind per family (example: 'nodejs:20').",
         "Each runtime family needs a default kind (default: true).",
         "When removing or renaming runtime families or runtime kinds from this 
file, preexisting actions",
         "with the affected kinds can no longer be read / updated / deleted / 
invoked. In order to remove or rename",
@@ -16,11 +16,11 @@
     "runtimes": {
         "nodejs": [
             {
-                "kind": "nodejs:14",
+                "kind": "nodejs:20",
                 "default": true,
                 "image": {
                     "prefix": "openwhisk",
-                    "name": "action-nodejs-v14",
+                    "name": "action-nodejs-v20",
                     "tag": "nightly"
                 },
                 "deprecated": false,
diff --git a/ansible/files/runtimes.json b/ansible/files/runtimes.json
index f3a748344..cd28fd11f 100644
--- a/ansible/files/runtimes.json
+++ b/ansible/files/runtimes.json
@@ -3,7 +3,7 @@
         "This file describes the different languages (aka. managed action 
runtimes) supported by the system",
         "as well as blackbox images that support the runtime specification.",
         "Only actions with runtime families / kinds defined here can be 
created / read / updated / deleted / invoked.",
-        "Define a list of runtime families (example: 'nodejs') with at least 
one kind per family (example: 'nodejs:14').",
+        "Define a list of runtime families (example: 'nodejs') with at least 
one kind per family (example: 'nodejs:20').",
         "Each runtime family needs a default kind (default: true).",
         "When removing or renaming runtime families or runtime kinds from this 
file, preexisting actions",
         "with the affected kinds can no longer be read / updated / deleted / 
invoked. In order to remove or rename",
@@ -15,11 +15,25 @@
     "runtimes": {
         "nodejs": [
             {
-                "kind": "nodejs:14",
+                "kind": "nodejs:18",
+                "default": false,
+                "image": {
+                    "prefix": "openwhisk",
+                    "name": "action-nodejs-v18",
+                    "tag": "nightly"
+                },
+                "deprecated": false,
+                "attached": {
+                    "attachmentName": "codefile",
+                    "attachmentType": "text/plain"
+                }
+            },
+            {
+                "kind": "nodejs:20",
                 "default": true,
                 "image": {
                     "prefix": "openwhisk",
-                    "name": "action-nodejs-v14",
+                    "name": "action-nodejs-v20",
                     "tag": "nightly"
                 },
                 "deprecated": false,
@@ -40,43 +54,15 @@
                         }
                     }
                 ]
-            },
-            {
-                "kind": "nodejs:16",
-                "default": false,
-                "image": {
-                    "prefix": "openwhisk",
-                    "name": "action-nodejs-v16",
-                    "tag": "nightly"
-                },
-                "deprecated": false,
-                "attached": {
-                    "attachmentName": "codefile",
-                    "attachmentType": "text/plain"
-                }
-            },
-            {
-                "kind": "nodejs:18",
-                "default": false,
-                "image": {
-                    "prefix": "openwhisk",
-                    "name": "action-nodejs-v18",
-                    "tag": "nightly"
-                },
-                "deprecated": false,
-                "attached": {
-                    "attachmentName": "codefile",
-                    "attachmentType": "text/plain"
-                }
             }
         ],
         "python": [
             {
-                "kind": "python:3",
+                "kind": "python:3.10",
                 "default": true,
                 "image": {
                     "prefix": "openwhisk",
-                    "name": "action-python-v3.7",
+                    "name": "action-python-v3.10",
                     "tag": "nightly"
                 },
                 "deprecated": false,
@@ -86,11 +72,11 @@
                 }
             },
             {
-                "kind": "python:3.10",
+                "kind": "python:3.11",
                 "default": false,
                 "image": {
                     "prefix": "openwhisk",
-                    "name": "action-python-v3.10",
+                    "name": "action-python-v3.11",
                     "tag": "nightly"
                 },
                 "deprecated": false,
@@ -101,20 +87,6 @@
             }
         ],
         "swift": [
-            {
-                "kind": "swift:5.1",
-                "default": false,
-                "image": {
-                    "prefix": "openwhisk",
-                    "name": "action-swift-v5.1",
-                    "tag": "nightly"
-                },
-                "deprecated": false,
-                "attached": {
-                    "attachmentName": "codefile",
-                    "attachmentType": "text/plain"
-                }
-            },
             {
                 "kind": "swift:5.3",
                 "default": true,
@@ -130,11 +102,11 @@
                 }
             },
             {
-                "kind": "swift:5.4",
+                "kind": "swift:5.7",
                 "default": false,
                 "image": {
                     "prefix": "openwhisk",
-                    "name": "action-swift-v5.4",
+                    "name": "action-swift-v5.7",
                     "tag": "nightly"
                 },
                 "deprecated": false,
@@ -162,51 +134,9 @@
             }
         ],
         "php": [
-            {
-                "kind": "php:7.3",
-                "default": false,
-                "deprecated": true,
-                "image": {
-                    "prefix": "openwhisk",
-                    "name": "action-php-v7.3",
-                    "tag": "nightly"
-                },
-                "attached": {
-                    "attachmentName": "codefile",
-                    "attachmentType": "text/plain"
-                }
-            },
-            {
-                "kind": "php:7.4",
-                "default": true,
-                "deprecated": false,
-                "image": {
-                    "prefix": "openwhisk",
-                    "name": "action-php-v7.4",
-                    "tag": "nightly"
-                },
-                "attached": {
-                    "attachmentName": "codefile",
-                    "attachmentType": "text/plain"
-                }
-            },
-            {
-                "kind": "php:8.0",
-                "default": false,
-                "deprecated": false,
-                "image": {
-                    "prefix": "openwhisk",
-                    "name": "action-php-v8.0",
-                    "tag": "nightly"
-                },
-                "attached": {
-                    "attachmentName": "codefile",
-                    "attachmentType": "text/plain"
-                }
-            },
             {
                 "kind": "php:8.1",
-                "default": false,
+                "default": true,
                 "deprecated": false,
                 "image": {
                     "prefix": "openwhisk",
@@ -236,23 +166,9 @@
             }
         ],
         "go": [
-            {
-                "kind": "go:1.17",
-                "default": true,
-                "deprecated": false,
-                "attached": {
-                    "attachmentName": "codefile",
-                    "attachmentType": "text/plain"
-                },
-                "image": {
-                    "prefix": "openwhisk",
-                    "name": "action-golang-v1.17",
-                    "tag": "nightly"
-                }
-            },
             {
                 "kind": "go:1.20",
-                "default": false,
+                "default": true,
                 "deprecated": false,
                 "attached": {
                     "attachmentName": "codefile",
@@ -266,21 +182,6 @@
             }
         ],
         "dotnet": [
-            {
-                "kind": "dotnet:2.2",
-                "default": false,
-                "deprecated": true,
-                "requireMain": true,
-                "image": {
-                    "prefix": "openwhisk",
-                    "name": "action-dotnet-v2.2",
-                    "tag": "nightly"
-                },
-                "attached": {
-                    "attachmentName": "codefile",
-                    "attachmentType": "text/plain"
-                }
-            },
             {
                 "kind": "dotnet:3.1",
                 "default": true,
diff --git a/core/controller/src/main/resources/apiv1swagger.json 
b/core/controller/src/main/resources/apiv1swagger.json
index a2713a9d4..1366ac02d 100644
--- a/core/controller/src/main/resources/apiv1swagger.json
+++ b/core/controller/src/main/resources/apiv1swagger.json
@@ -2001,29 +2001,23 @@
             "blackbox",
             "java:8",
             "java:default",
-            "nodejs:14",
             "nodejs:16",
             "nodejs:18",
+            "nodejs:20",
             "nodejs:default",
-            "php:7.3",
-            "php:7.4",
-            "php:8.0",
             "php:8.1",
             "php:default",
-            "python:3",
             "python:3.10",
+            "python:3.11",
             "python:default",
             "ruby:2.5",
             "ruby:default",
-            "go:1.17",
             "go:1.20",
             "go:default",
             "sequence",
-            "swift:5.1",
             "swift:5.3",
-            "swift:5.4",
+            "swift:5.7",
             "swift:default",
-            "dotnet:2.2",
             "dotnet:3.1",
             "dotnet:6.0",
             "dotnet:default",
diff --git 
a/core/monitoring/user-events/src/test/scala/org/apache/openwhisk/core/monitoring/metrics/KamonRecorderTests.scala
 
b/core/monitoring/user-events/src/test/scala/org/apache/openwhisk/core/monitoring/metrics/KamonRecorderTests.scala
index 10726c815..aabc9e653 100644
--- 
a/core/monitoring/user-events/src/test/scala/org/apache/openwhisk/core/monitoring/metrics/KamonRecorderTests.scala
+++ 
b/core/monitoring/user-events/src/test/scala/org/apache/openwhisk/core/monitoring/metrics/KamonRecorderTests.scala
@@ -62,7 +62,7 @@ class KamonRecorderTests extends KafkaSpecBase with 
BeforeAndAfterEach with Kamo
   val namespaceGuest = "guest"
   val actionWithCustomPackage = "apimgmt/createApi"
   val actionWithDefaultPackage = "createApi"
-  val kind = "nodejs:14"
+  val kind = "nodejs:20"
   val memory = 256
 
   it should "push user events to kamon" in {
diff --git 
a/core/monitoring/user-events/src/test/scala/org/apache/openwhisk/core/monitoring/metrics/PrometheusRecorderTests.scala
 
b/core/monitoring/user-events/src/test/scala/org/apache/openwhisk/core/monitoring/metrics/PrometheusRecorderTests.scala
index 0e1b35ac3..4f8e7f7a2 100644
--- 
a/core/monitoring/user-events/src/test/scala/org/apache/openwhisk/core/monitoring/metrics/PrometheusRecorderTests.scala
+++ 
b/core/monitoring/user-events/src/test/scala/org/apache/openwhisk/core/monitoring/metrics/PrometheusRecorderTests.scala
@@ -38,7 +38,7 @@ class PrometheusRecorderTests extends KafkaSpecBase with 
BeforeAndAfterEach with
   val namespaceGuest = "guest"
   val actionWithCustomPackage = "apimgmt/createApiOne"
   val actionWithDefaultPackage = "createApi"
-  val kind = "nodejs:14"
+  val kind = "nodejs:20"
   val memory = "256"
   createCustomTopic(EventConsumer.userEventTopic)
 
diff --git a/core/standalone/bin/waitready b/core/standalone/bin/waitready
index 0bc01ba5a..5349459e5 100755
--- a/core/standalone/bin/waitready
+++ b/core/standalone/bin/waitready
@@ -20,7 +20,7 @@ wsk property set --apihost "http://$(hostname):3233" --auth 
"$AUTH"
 until wsk action list 2>/dev/null >/dev/null
 do sleep 1 ; echo server still not ready - retrying
 done
-wsk action update testme <(echo 'function main(){return {"ready":true}}') 
--kind nodejs:14
+wsk action update testme <(echo 'function main(){return {"ready":true}}') 
--kind nodejs:20
 until wsk action invoke testme -r 2>/dev/null | grep 'ready'
 do sleep 1 ; echo server initializing... 
 done
diff --git 
a/core/standalone/src/main/scala/org/apache/openwhisk/standalone/StandaloneOpenWhisk.scala
 
b/core/standalone/src/main/scala/org/apache/openwhisk/standalone/StandaloneOpenWhisk.scala
index 4ea758dd7..964df7301 100644
--- 
a/core/standalone/src/main/scala/org/apache/openwhisk/standalone/StandaloneOpenWhisk.scala
+++ 
b/core/standalone/src/main/scala/org/apache/openwhisk/standalone/StandaloneOpenWhisk.scala
@@ -175,11 +175,11 @@ object StandaloneOpenWhisk extends SLF4JLogging {
      |  "runtimes": {
      |    "nodejs": [
      |      {
-     |        "kind": "nodejs:14",
+     |        "kind": "nodejs:20",
      |        "default": true,
      |        "image": {
      |          "prefix": "openwhisk",
-     |          "name": "action-nodejs-v14",
+     |          "name": "action-nodejs-v20",
      |          "tag": "latest"
      |        },
      |        "deprecated": false,
diff --git a/docs/actions-new.md b/docs/actions-new.md
index 66c40dd88..671f52494 100644
--- a/docs/actions-new.md
+++ b/docs/actions-new.md
@@ -61,21 +61,21 @@ Further, you should automate and pass the following test 
suites:
 Actions when created specify the desired runtime for the function via a 
property called "kind".
 When using the `wsk` CLI, this is specified as `--kind <runtime-kind>`. The 
value is typically
 a string describing the language (e.g., `nodejs`) followed by a colon and the 
version for the runtime
-as in `nodejs:14` or `php:7.4`.
+as in `nodejs:20` or `php:8.1`.
 
 The manifest is a map of runtime family names to an array of specific kinds. 
The details of the
 schema are found in the [Exec 
Manifest](../common/scala/src/main/scala/org/apache/openwhisk/core/entity/ExecManifest.scala).
 As an example, the following entry add a new runtime family called `nodejs` 
with a single kind
-`nodejs:14`.
+`nodejs:20`.
 
 ```json
 {
   "nodejs": [{
-    "kind": "nodejs:14",
+    "kind": "nodejs:20",
     "default": true,
     "image": {
       "prefix": "openwhisk",
-      "name": "action-nodejs-v10",
+      "name": "action-nodejs-v20",
       "tag": "latest"
     }
   }]
@@ -113,7 +113,7 @@ new language and added to the [test artifacts 
directory](../tests/dat/actions/un
 with the name `<runtime-kind>.txt` for plain text file or `<runtime-kind>.bin` 
for a
 a binary file. The `<runtime-kind>` must match the value used for `kind` in 
the corresponding
 runtime manifest entry, replacing `:` in the kind with a `-`.
-For example, a plain text function for `nodejs:14` becomes `nodejs-14.txt`.
+For example, a plain text function for `nodejs:20` becomes `nodejs-20.txt`.
 
 ```js
 function main(args) {
diff --git a/docs/actions-nodejs.md b/docs/actions-nodejs.md
index 7390f7605..b7e7edaa8 100644
--- a/docs/actions-nodejs.md
+++ b/docs/actions-nodejs.md
@@ -69,7 +69,7 @@ and demonstrate how to bundle multiple JavaScript files and 
third party dependen
 
   The CLI automatically infers the type of the action by using the source file 
extension.
   For `.js` source files, the action runs by using a Node.js runtime. You may 
specify
-  the Node.js runtime to use by explicitly specifying the parameter `--kind 
nodejs:14`, or `--kind nodejs:12`.
+  the Node.js runtime to use by explicitly specifying the parameter `--kind 
nodejs:18`, or `--kind nodejs:20`.
 
 
 ## Creating asynchronous actions
@@ -245,10 +245,10 @@ zip -r action.zip *
 - Create the action from the zip file.
 
 ```
-wsk action create packageAction --kind nodejs:14 action.zip
+wsk action create packageAction --kind nodejs:20 action.zip
 ```
 
-When creating an action from a `.zip` archive with the CLI tool, you must 
explicitly provide a value for the `--kind` flag by using `nodejs:14`, or 
`nodejs:12`.
+When creating an action from a `.zip` archive with the CLI tool, you must 
explicitly provide a value for the `--kind` flag by using `nodejs:18`, or 
`nodejs:20`.
 
 - Invoke the action as normal.
 
@@ -294,7 +294,7 @@ zip -r action.zip *
 - Create new action with action archive.
 
 ```
-wsk action create my-action --kind nodejs:14 action.zip
+wsk action create my-action --kind nodejs:20 action.zip
 ```
 
 #### Building custom runtime image
@@ -379,7 +379,7 @@ npx rollup --config
 - Create an action using the bundle source file.
 
 ```
-wsk action create my-action bundle.js --kind nodejs:14
+wsk action create my-action bundle.js --kind nodejs:20
 ```
 
 - Invoke the action as normal. Results should be the same as the example above.
@@ -432,7 +432,7 @@ npx webpack --config webpack.config.js
 - Create an action using the bundle source file.
 
 ```
-wsk action create my-action dist/bundle.js --kind nodejs:14
+wsk action create my-action dist/bundle.js --kind nodejs:20
 ```
 
 - Invoke the action as normal. Results should be the same as the example above.
@@ -473,7 +473,7 @@ npm install parcel-bundler --save-dev
 - Create an action using the bundle source file.
 
 ```
-wsk action create my-action dist/index.js --kind nodejs:14
+wsk action create my-action dist/index.js --kind nodejs:20
 ```
 
 - Invoke the action as normal. Results should be the same as the example above.
@@ -485,19 +485,19 @@ wsk action invoke my-action --result --param lines 
"[\"and now\", \"for somethin
 
 ## Reference
 
-JavaScript actions can be executed in Node.js version 12 or 14.
-Currently actions are executed by default in a Node.js version 14 environment.
+JavaScript actions can be executed in Node.js version 18 or 20.
+Currently actions are executed by default in a Node.js version 20 environment.
 
-### Node.js version 12 environment
-The Node.js version 12 environment is used if the `--kind` flag is explicitly 
specified with a value of 'nodejs:12' when creating or updating an Action.
+### Node.js version 18 environment
+The Node.js version 18 environment is used if the `--kind` flag is explicitly 
specified with a value of 'nodejs:18' when creating or updating an Action.
 
-The following packages are pre-installed in the Node.js version 12 environment:
+The following packages are pre-installed in the Node.js version 18 environment:
 
 - [openwhisk](https://www.npmjs.com/package/openwhisk) - JavaScript client 
library for the OpenWhisk platform. Provides a wrapper around the OpenWhisk 
APIs.
 
-### Node.js version 14 environment
-The Node.js version 14 environment is used if the `--kind` flag is explicitly 
specified with a value of 'nodejs:14' when creating or updating an Action.
+### Node.js version 20 environment
+The Node.js version 20 environment is used if the `--kind` flag is explicitly 
specified with a value of 'nodejs:20' when creating or updating an Action.
 
-The following packages are pre-installed in the Node.js version 14 environment:
+The following packages are pre-installed in the Node.js version 20 environment:
 
 - [openwhisk](https://www.npmjs.com/package/openwhisk) - JavaScript client 
library for the OpenWhisk platform. Provides a wrapper around the OpenWhisk 
APIs.
diff --git a/docs/actions.md b/docs/actions.md
index 9f814799f..82eee6363 100644
--- a/docs/actions.md
+++ b/docs/actions.md
@@ -86,11 +86,11 @@ runtime kinds or language families.
 Prewarmed containers are created when an invoker starts, they are created 
according to runtimes.json's stemCells, e.g.
 ```
 {
-    "kind": "nodejs:14",
+    "kind": "nodejs:20",
     "default": true,
     "image": {
         "prefix": "openwhisk",
-        "name": "action-nodejs-v14",
+        "name": "action-nodejs-v20",
         "tag": "nightly"
     },
     "deprecated": false,
@@ -106,9 +106,9 @@ Prewarmed containers are created when an invoker starts, 
they are created accord
      ]
 }
 ```
-In the above example, there is only one runtime configuration, which is 
`nodejs:14`.
-It has a stem cell configuration and 2 containers with 256MB memory for 
`nodejs:14` will be provisioned when an invoker starts.
-When an activation with the `nodejs:14` kind arrives, one of the prewarm 
containers can be used to alleviate a cold start.
+In the above example, there is only one runtime configuration, which is 
`nodejs:20`.
+It has a stem cell configuration and 2 containers with 256MB memory for 
`nodejs:20` will be provisioned when an invoker starts.
+When an activation with the `nodejs:20` kind arrives, one of the prewarm 
containers can be used to alleviate a cold start.
 A prewarm container that is assigned to an action is moved to the busy pool 
and the invoker creates one more prewarm container to replenish the prewarm 
pool.
 In this way, when no reactive configuration is configured, an invoker always 
maintains the same number of prewarm containers.
 
@@ -117,11 +117,11 @@ In this way, when no reactive configuration is 
configured, an invoker always mai
 With a reactive configuration, the number of prewarm containers is dynamically 
controlled, e.g.
 ```
 {
-    "kind": "nodejs:14",
+    "kind": "nodejs:20",
     "default": true,
     "image": {
         "prefix": "openwhisk",
-        "name": "action-nodejs-v14",
+        "name": "action-nodejs-v20",
         "tag": "nightly"
     },
     "deprecated": false,
@@ -143,7 +143,7 @@ With a reactive configuration, the number of prewarm 
containers is dynamically c
      ]
 }
 ```
-In the above example, there is a reactive configuration for `nodejs:14` and 
there are 4 underlying configurations.
+In the above example, there is a reactive configuration for `nodejs:20` and 
there are 4 underlying configurations.
 * `minCount`: the minimum number of prewarm containers. The number of prewarm 
containers can't be fewer than this value
 * `maxCount`: the maximum number of prewarm containers. The number of prewarm 
containers cannot exceed this value
 * `ttl`: the amount of time that prewarm containers can exist without any 
activation. If no activation for the prewarm container arrives in the given 
time, the prewarm container will be removed
diff --git a/tests/dat/actions/echo.json b/tests/dat/actions/echo.json
index 701c1f500..dda28e619 100644
--- a/tests/dat/actions/echo.json
+++ b/tests/dat/actions/echo.json
@@ -3,7 +3,7 @@
     "version": "0.0.1",
     "publish": false,
     "exec": {
-        "kind": "nodejs:14",
+        "kind": "nodejs:20",
         "code": "/**\n * Returns params, or an empty string if no parameter 
values are provided\n */\nfunction main(params) {\n    return params || 
{};\n}\n\n"
     },
     "annotations": [],
diff --git a/tests/dat/actions/word_count.json 
b/tests/dat/actions/word_count.json
index 62760e334..a73bc95f9 100644
--- a/tests/dat/actions/word_count.json
+++ b/tests/dat/actions/word_count.json
@@ -3,7 +3,7 @@
     "version": "0.0.1",
     "publish": false,
     "exec": {
-        "kind": "nodejs:14",
+        "kind": "nodejs:20",
         "code": "/**\n *  word count utility\n */\nfunction main(params) {\n   
 var str = params.payload.toString();\n    var words = str.split(\" \");\n    
var count = words.length;\n    console.log(\"The message '\"+str+\"' has\", 
count, 'words');\n    return { count: count };\n}\n"
     },
     "annotations": [],
diff --git 
a/tests/src/test/scala/org/apache/openwhisk/core/admin/WskAdminTests.scala 
b/tests/src/test/scala/org/apache/openwhisk/core/admin/WskAdminTests.scala
index 64d5c82d9..ca55dd8ed 100644
--- a/tests/src/test/scala/org/apache/openwhisk/core/admin/WskAdminTests.scala
+++ b/tests/src/test/scala/org/apache/openwhisk/core/admin/WskAdminTests.scala
@@ -248,12 +248,12 @@ class WskAdminTests extends TestHelpers with 
WskActorSystem with Matchers with B
     val subject = Subject().asString
     try {
       // set some limits
-      wskadmin.cli(Seq("limits", "set", subject, "--allowedKinds", 
"nodejs:14", "blackbox"))
+      wskadmin.cli(Seq("limits", "set", subject, "--allowedKinds", 
"nodejs:20", "blackbox"))
       // check correctly set
       val lines = wskadmin.cli(Seq("limits", "get", 
subject)).stdout.linesIterator.toSeq
       lines should have size 1
-      lines(0) should (be("allowedKinds = [u'nodejs:14', u'blackbox']") or be(
-        "allowedKinds = ['nodejs:14', 'blackbox']"))
+      lines(0) should (be("allowedKinds = [u'nodejs:20', u'blackbox']") or be(
+        "allowedKinds = ['nodejs:20', 'blackbox']"))
     } finally {
       wskadmin.cli(Seq("limits", "delete", subject)).stdout should 
include("Limits deleted")
     }
diff --git 
a/tests/src/test/scala/org/apache/openwhisk/core/containerpool/docker/test/DockerContainerFactoryTests.scala
 
b/tests/src/test/scala/org/apache/openwhisk/core/containerpool/docker/test/DockerContainerFactoryTests.scala
index 754aa5c22..baacd95c8 100644
--- 
a/tests/src/test/scala/org/apache/openwhisk/core/containerpool/docker/test/DockerContainerFactoryTests.scala
+++ 
b/tests/src/test/scala/org/apache/openwhisk/core/containerpool/docker/test/DockerContainerFactoryTests.scala
@@ -68,7 +68,7 @@ class DockerContainerFactoryTests
 
   it should "set the docker run args based on ContainerArgsConfig" in {
 
-    val image = ExecManifest.runtimesManifest.manifests("nodejs:14").image
+    val image = ExecManifest.runtimesManifest.manifests("nodejs:20").image
 
     implicit val tid = TransactionId.testing
     val dockerApiStub = mock[DockerApiWithFileAccess]
diff --git 
a/tests/src/test/scala/org/apache/openwhisk/core/controller/test/EntitlementProviderTests.scala
 
b/tests/src/test/scala/org/apache/openwhisk/core/controller/test/EntitlementProviderTests.scala
index 5d48d42b1..48edcd45c 100644
--- 
a/tests/src/test/scala/org/apache/openwhisk/core/controller/test/EntitlementProviderTests.scala
+++ 
b/tests/src/test/scala/org/apache/openwhisk/core/controller/test/EntitlementProviderTests.scala
@@ -53,7 +53,7 @@ class EntitlementProviderTests extends ControllerTestCommon 
with ScalaFutures {
   val adminUser = WhiskAuthHelpers.newIdentity(Subject("admin"))
   val guestUser = WhiskAuthHelpers.newIdentity(Subject("anonym"))
 
-  val allowedKinds = Set("nodejs:14", "python")
+  val allowedKinds = Set("nodejs:20", "python")
   val disallowedKinds = Set("golang", "blackbox")
 
   def getExec(kind: String): Exec = {
diff --git 
a/tests/src/test/scala/org/apache/openwhisk/core/controller/test/KindRestrictorTests.scala
 
b/tests/src/test/scala/org/apache/openwhisk/core/controller/test/KindRestrictorTests.scala
index 4a36bd416..4f29d3701 100644
--- 
a/tests/src/test/scala/org/apache/openwhisk/core/controller/test/KindRestrictorTests.scala
+++ 
b/tests/src/test/scala/org/apache/openwhisk/core/controller/test/KindRestrictorTests.scala
@@ -39,7 +39,7 @@ class KindRestrictorTests extends FlatSpec with Matchers with 
StreamLogging {
 
   behavior of "Kind Restrictor"
 
-  val allowedKinds = Set("nodejs:14", "python")
+  val allowedKinds = Set("nodejs:20", "python")
   val disallowedKinds = Set("golang", "blackbox")
   val allKinds = allowedKinds ++ disallowedKinds
 
diff --git 
a/tests/src/test/scala/org/apache/openwhisk/core/database/ArtifactWithFileStorageActivationStoreTests.scala
 
b/tests/src/test/scala/org/apache/openwhisk/core/database/ArtifactWithFileStorageActivationStoreTests.scala
index 90074ca49..56048d7d9 100644
--- 
a/tests/src/test/scala/org/apache/openwhisk/core/database/ArtifactWithFileStorageActivationStoreTests.scala
+++ 
b/tests/src/test/scala/org/apache/openwhisk/core/database/ArtifactWithFileStorageActivationStoreTests.scala
@@ -152,7 +152,7 @@ class ArtifactWithFileStorageActivationStoreTests()
             response = response,
             logs = logs,
             duration = Some(101L),
-            annotations = Parameters("kind", "nodejs:14") ++ Parameters(
+            annotations = Parameters("kind", "nodejs:20") ++ Parameters(
               "limits",
               ActionLimits(TimeLimit(60.second), MemoryLimit(256.MB), 
LogLimit(10.MB)).toJson) ++
               Parameters("waitTime", 16.toJson) ++
@@ -203,7 +203,7 @@ class ArtifactWithFileStorageActivationStoreTests()
             response = response,
             logs = logs,
             duration = Some(101L),
-            annotations = Parameters("kind", "nodejs:14") ++ Parameters(
+            annotations = Parameters("kind", "nodejs:20") ++ Parameters(
               "limits",
               ActionLimits(TimeLimit(60.second), MemoryLimit(256.MB), 
LogLimit(10.MB)).toJson) ++
               Parameters("waitTime", 16.toJson) ++
@@ -315,7 +315,7 @@ class ArtifactWithFileStorageActivationStoreTests()
               response = response,
               logs = logs,
               duration = Some(101L),
-              annotations = Parameters("kind", "nodejs:14") ++ Parameters(
+              annotations = Parameters("kind", "nodejs:20") ++ Parameters(
                 "limits",
                 ActionLimits(TimeLimit(60.second), MemoryLimit(256.MB), 
LogLimit(10.MB)).toJson) ++
                 Parameters("waitTime", 16.toJson) ++
diff --git 
a/tests/src/test/scala/org/apache/openwhisk/core/database/LimitsCommandTests.scala
 
b/tests/src/test/scala/org/apache/openwhisk/core/database/LimitsCommandTests.scala
index 656b8ec25..e30cd409a 100644
--- 
a/tests/src/test/scala/org/apache/openwhisk/core/database/LimitsCommandTests.scala
+++ 
b/tests/src/test/scala/org/apache/openwhisk/core/database/LimitsCommandTests.scala
@@ -50,7 +50,7 @@ class LimitsCommandTests extends FlatSpec with 
WhiskAdminCliTestBase {
       "--concurrentInvocations",
       "11",
       "--allowedKinds",
-      "nodejs:14",
+      "nodejs:20",
       "blackbox",
       "--storeActivations",
       "false",
@@ -61,7 +61,7 @@ class LimitsCommandTests extends FlatSpec with 
WhiskAdminCliTestBase {
       invocationsPerMinute = Some(3),
       firesPerMinute = Some(7),
       concurrentInvocations = Some(11),
-      allowedKinds = Some(Set("nodejs:14", "blackbox")),
+      allowedKinds = Some(Set("nodejs:20", "blackbox")),
       storeActivations = Some(false))
 
     resultOk("limits", "set", "--invocationsPerMinute", "13", ns) shouldBe 
CommandMessages.limitsSuccessfullyUpdated(ns)
@@ -97,10 +97,10 @@ class LimitsCommandTests extends FlatSpec with 
WhiskAdminCliTestBase {
 
   it should "update existing allowedKind limit" in {
     val ns = newNamespace()
-    resultOk("limits", "set", "--allowedKinds", "nodejs:14", ns)
-    resultOk("limits", "get", ns) shouldBe "allowedKinds = nodejs:14"
-    resultOk("limits", "set", "--allowedKinds", "nodejs:14", "blackbox", 
"python", ns)
-    resultOk("limits", "get", ns) shouldBe "allowedKinds = nodejs:14, 
blackbox, python"
+    resultOk("limits", "set", "--allowedKinds", "nodejs:20", ns)
+    resultOk("limits", "get", ns) shouldBe "allowedKinds = nodejs:20"
+    resultOk("limits", "set", "--allowedKinds", "nodejs:20", "blackbox", 
"python", ns)
+    resultOk("limits", "get", ns) shouldBe "allowedKinds = nodejs:20, 
blackbox, python"
 
     //Delete
     resultOk("limits", "delete", ns) shouldBe CommandMessages.limitsDeleted
diff --git 
a/tests/src/test/scala/org/apache/openwhisk/core/database/test/AttachmentCompatibilityTests.scala
 
b/tests/src/test/scala/org/apache/openwhisk/core/database/test/AttachmentCompatibilityTests.scala
index 6965113b1..01fd303ff 100644
--- 
a/tests/src/test/scala/org/apache/openwhisk/core/database/test/AttachmentCompatibilityTests.scala
+++ 
b/tests/src/test/scala/org/apache/openwhisk/core/database/test/AttachmentCompatibilityTests.scala
@@ -114,7 +114,7 @@ class AttachmentCompatibilityTests
   it should "read existing base64 encoded code string" in {
     implicit val tid: TransactionId = transid()
     val exec = """{
-               |  "kind": "nodejs:14",
+               |  "kind": "nodejs:20",
                |  "code": "SGVsbG8gT3BlbldoaXNr"
                |}""".stripMargin.parseJson.asJsObject
     val (id, action) = makeActionJson(namespace, aname(), exec)
@@ -127,7 +127,7 @@ class AttachmentCompatibilityTests
   it should "read existing simple code string" in {
     implicit val tid: TransactionId = transid()
     val exec = """{
-                 |  "kind": "nodejs:14",
+                 |  "kind": "nodejs:20",
                  |  "code": "while (true)"
                  |}""".stripMargin.parseJson.asJsObject
     val (id, action) = makeActionJson(namespace, aname(), exec)
diff --git 
a/tests/src/test/scala/org/apache/openwhisk/core/entity/test/ExecHelpers.scala 
b/tests/src/test/scala/org/apache/openwhisk/core/entity/test/ExecHelpers.scala
index 6ada36a57..7182741cf 100644
--- 
a/tests/src/test/scala/org/apache/openwhisk/core/entity/test/ExecHelpers.scala
+++ 
b/tests/src/test/scala/org/apache/openwhisk/core/entity/test/ExecHelpers.scala
@@ -35,7 +35,7 @@ trait ExecHelpers extends Matchers with WskActorSystem with 
StreamLogging {
   private val config = new WhiskConfig(ExecManifest.requiredProperties)
   ExecManifest.initialize(config) should be a 'success
 
-  protected val NODEJS = "nodejs:14"
+  protected val NODEJS = "nodejs:20"
   protected val SWIFT5 = "swift:5.3"
   protected val BLACKBOX = "blackbox"
   protected val JAVA_DEFAULT = "java:8"
diff --git 
a/tests/src/test/scala/org/apache/openwhisk/core/entity/test/ExecManifestTests.scala
 
b/tests/src/test/scala/org/apache/openwhisk/core/entity/test/ExecManifestTests.scala
index dce964e21..35735ddc1 100644
--- 
a/tests/src/test/scala/org/apache/openwhisk/core/entity/test/ExecManifestTests.scala
+++ 
b/tests/src/test/scala/org/apache/openwhisk/core/entity/test/ExecManifestTests.scala
@@ -270,7 +270,7 @@ class ExecManifestTests extends FlatSpec with 
WskActorSystem with StreamLogging
                  |{ "runtimes": {
                  |    "nodef": [
                  |      {
-                 |        "kind": "nodejs:14",
+                 |        "kind": "nodejs:20",
                  |        "default": true,
                  |        "image": {
                  |          "name": "nodejsaction"
@@ -322,7 +322,7 @@ class ExecManifestTests extends FlatSpec with 
WskActorSystem with StreamLogging
                  |""".stripMargin.parseJson.asJsObject
 
     val js14 = RuntimeManifest(
-      "nodejs:14",
+      "nodejs:20",
       ImageName("nodejsaction"),
       default = Some(true),
       stemCells = Some(List(StemCell(1, 128.MB), StemCell(1, 256.MB))))
@@ -364,7 +364,7 @@ class ExecManifestTests extends FlatSpec with 
WskActorSystem with StreamLogging
                  |{ "runtimes": {
                  |    "nodef": [
                  |      {
-                 |        "kind": "nodejs:14",
+                 |        "kind": "nodejs:20",
                  |        "default": true,
                  |        "image": {
                  |          "name": "nodejsaction"
@@ -445,7 +445,7 @@ class ExecManifestTests extends FlatSpec with 
WskActorSystem with StreamLogging
 
     val reactive = Some(ReactivePrewarmingConfig(1, 4, FiniteDuration(2, 
TimeUnit.MINUTES), 1, 1))
     val js14 = RuntimeManifest(
-      "nodejs:14",
+      "nodejs:20",
       ImageName("nodejsaction"),
       default = Some(true),
       stemCells = Some(List(StemCell(1, 128.MB, reactive), StemCell(1, 256.MB, 
reactive))))
diff --git 
a/tests/src/test/scala/org/apache/openwhisk/core/entity/test/ExecTests.scala 
b/tests/src/test/scala/org/apache/openwhisk/core/entity/test/ExecTests.scala
index dd25b7bdb..09bed32aa 100644
--- a/tests/src/test/scala/org/apache/openwhisk/core/entity/test/ExecTests.scala
+++ b/tests/src/test/scala/org/apache/openwhisk/core/entity/test/ExecTests.scala
@@ -59,7 +59,7 @@ class ExecTests extends FlatSpec with Matchers with 
StreamLogging with BeforeAnd
                  |  "updated": 1533623651650,
                  |  "entityType": "action",
                  |  "exec": {
-                 |    "kind": "nodejs:14",
+                 |    "kind": "nodejs:20",
                  |    "code": "foo",
                  |    "binary": false
                  |  },
@@ -82,7 +82,7 @@ class ExecTests extends FlatSpec with Matchers with 
StreamLogging with BeforeAnd
 
   it should "properly determine binary property" in {
     val j1 = """{
-               |  "kind": "nodejs:14",
+               |  "kind": "nodejs:20",
                |  "code": "SGVsbG8gT3BlbldoaXNr",
                |  "binary": false
                |}""".stripMargin.parseJson.asJsObject
@@ -91,7 +91,7 @@ class ExecTests extends FlatSpec with Matchers with 
StreamLogging with BeforeAnd
     }
 
     val j2 = """{
-               |  "kind": "nodejs:14",
+               |  "kind": "nodejs:20",
                |  "code": "while (true)",
                |  "binary": false
                |}""".stripMargin.parseJson.asJsObject
@@ -101,7 +101,7 @@ class ExecTests extends FlatSpec with Matchers with 
StreamLogging with BeforeAnd
 
     //Defaults to binary
     val j3 = """{
-               |  "kind": "nodejs:14",
+               |  "kind": "nodejs:20",
                |  "code": "while (true)"
                |}""".stripMargin.parseJson.asJsObject
     Exec.serdes.read(j3) should matchPattern {
@@ -128,7 +128,7 @@ class ExecTests extends FlatSpec with Matchers with 
StreamLogging with BeforeAnd
 
   it should "read code stored as jar property" in {
     val j1 = """{
-               |  "kind": "nodejs:14",
+               |  "kind": "nodejs:20",
                |  "jar": "SGVsbG8gT3BlbldoaXNr",
                |  "binary": false
                |}""".stripMargin.parseJson.asJsObject
@@ -143,7 +143,7 @@ class ExecTests extends FlatSpec with Matchers with 
StreamLogging with BeforeAnd
         |  "runtimes": {
         |    "nodejs": [
         |      {
-        |        "kind": "nodejs:14",
+        |        "kind": "nodejs:20",
         |        "default": true,
         |        "image": {
         |          "prefix": "openwhisk",
@@ -164,7 +164,7 @@ class ExecTests extends FlatSpec with Matchers with 
StreamLogging with BeforeAnd
       new TestConfig(Map(WhiskConfig.runtimesManifest -> oldManifestJson), 
ExecManifest.requiredProperties)
     ExecManifest.initialize(oldConfig)
     val j1 = """{
-               |  "kind": "nodejs:14",
+               |  "kind": "nodejs:20",
                |  "code": "SGVsbG8gT3BlbldoaXNr",
                |  "binary": false
              |}""".stripMargin.parseJson.asJsObject
diff --git 
a/tests/src/test/scala/org/apache/openwhisk/core/entity/test/SchemaTests.scala 
b/tests/src/test/scala/org/apache/openwhisk/core/entity/test/SchemaTests.scala
index dc2c8ef4b..c62d2bd6f 100644
--- 
a/tests/src/test/scala/org/apache/openwhisk/core/entity/test/SchemaTests.scala
+++ 
b/tests/src/test/scala/org/apache/openwhisk/core/entity/test/SchemaTests.scala
@@ -492,18 +492,18 @@ class SchemaTests extends FlatSpec with BeforeAndAfter 
with ExecHelpers with Mat
   it should "initialize exec manifest" in {
     val runtimes = ExecManifest.runtimesManifest
     val kind = runtimes.resolveDefaultRuntime("nodejs:default").get.kind
-    Some(kind) should contain oneOf ("nodejs:12", "nodejs:14")
+    Some(kind) should contain oneOf ("nodejs:12", "nodejs:20")
   }
 
   it should "properly deserialize and reserialize JSON" in {
     val b64Body = """ZnVuY3Rpb24gbWFpbihhcmdzKSB7IHJldHVybiBhcmdzOyB9Cg=="""
 
     val json = Seq[JsObject](
-      JsObject("kind" -> "nodejs:14".toJson, "code" -> "js1".toJson, "binary" 
-> false.toJson),
-      JsObject("kind" -> "nodejs:14".toJson, "code" -> "js2".toJson, "binary" 
-> false.toJson, "foo" -> "bar".toJson),
+      JsObject("kind" -> "nodejs:20".toJson, "code" -> "js1".toJson, "binary" 
-> false.toJson),
+      JsObject("kind" -> "nodejs:20".toJson, "code" -> "js2".toJson, "binary" 
-> false.toJson, "foo" -> "bar".toJson),
       JsObject("kind" -> "swift:5.3".toJson, "code" -> "swift1".toJson, 
"binary" -> false.toJson),
       JsObject("kind" -> "swift:5.3".toJson, "code" -> b64Body.toJson, 
"binary" -> true.toJson),
-      JsObject("kind" -> "nodejs:14".toJson, "code" -> b64Body.toJson, 
"binary" -> true.toJson))
+      JsObject("kind" -> "nodejs:20".toJson, "code" -> b64Body.toJson, 
"binary" -> true.toJson))
 
     val execs = json.map { e =>
       Exec.serdes.read(e)
@@ -636,8 +636,8 @@ class SchemaTests extends FlatSpec with BeforeAndAfter with 
ExecHelpers with Mat
       JsObject.empty,
       JsNull,
       JsObject("init" -> "zipfile".toJson),
-      JsObject("kind" -> "nodejs:14".toJson, "code" -> JsNumber(42)),
-      JsObject("kind" -> "nodejs:14".toJson, "init" -> "zipfile".toJson),
+      JsObject("kind" -> "nodejs:20".toJson, "code" -> JsNumber(42)),
+      JsObject("kind" -> "nodejs:20".toJson, "init" -> "zipfile".toJson),
       JsObject("kind" -> "turbopascal".toJson, "code" -> "BEGIN1".toJson),
       JsObject("kind" -> "blackbox".toJson, "code" -> "js".toJson),
       JsObject("kind" -> "swift".toJson, "swiftcode" -> "swift".toJson))
@@ -665,8 +665,8 @@ class SchemaTests extends FlatSpec with BeforeAndAfter with 
ExecHelpers with Mat
   it should "serialize to json" in {
     val execs = Seq(bb("container"), jsDefault("js"), jsDefault("js"), 
swift("swift")).map { _.asJson }
     assert(execs(0) == JsObject("kind" -> "blackbox".toJson, "image" -> 
"container".toJson, "binary" -> false.toJson))
-    assert(execs(1) == JsObject("kind" -> "nodejs:14".toJson, "code" -> 
"js".toJson, "binary" -> false.toJson))
-    assert(execs(2) == JsObject("kind" -> "nodejs:14".toJson, "code" -> 
"js".toJson, "binary" -> false.toJson))
+    assert(execs(1) == JsObject("kind" -> "nodejs:20".toJson, "code" -> 
"js".toJson, "binary" -> false.toJson))
+    assert(execs(2) == JsObject("kind" -> "nodejs:20".toJson, "code" -> 
"js".toJson, "binary" -> false.toJson))
     assert(execs(3) == JsObject("kind" -> "swift:5.3".toJson, "code" -> 
"swift".toJson, "binary" -> false.toJson))
   }
 
diff --git 
a/tests/src/test/scala/org/apache/openwhisk/core/entity/test/WhiskEntityTests.scala
 
b/tests/src/test/scala/org/apache/openwhisk/core/entity/test/WhiskEntityTests.scala
index 83e65d6b5..25bae832c 100644
--- 
a/tests/src/test/scala/org/apache/openwhisk/core/entity/test/WhiskEntityTests.scala
+++ 
b/tests/src/test/scala/org/apache/openwhisk/core/entity/test/WhiskEntityTests.scala
@@ -177,7 +177,7 @@ class WhiskEntityTests extends FlatSpec with ExecHelpers 
with Matchers {
         |      "version": "0.0.2",
         |      "entityType": "action",
         |      "exec": {
-        |              "kind": "nodejs:14",
+        |              "kind": "nodejs:20",
         |              "code": "foo",
         |              "binary": false
         |      },
@@ -205,7 +205,7 @@ class WhiskEntityTests extends FlatSpec with ExecHelpers 
with Matchers {
         |  "annotations": [],
         |  "version": "0.0.1",
         |  "exec": {
-        |         "kind": "nodejs:14",
+        |         "kind": "nodejs:20",
         |    "code": "foo",
         |    "binary": false
         |  },
diff --git 
a/tests/src/test/scala/org/apache/openwhisk/core/invoker/test/ContainerMessageConsumerTests.scala
 
b/tests/src/test/scala/org/apache/openwhisk/core/invoker/test/ContainerMessageConsumerTests.scala
index aa2db7c21..670b812b3 100644
--- 
a/tests/src/test/scala/org/apache/openwhisk/core/invoker/test/ContainerMessageConsumerTests.scala
+++ 
b/tests/src/test/scala/org/apache/openwhisk/core/invoker/test/ContainerMessageConsumerTests.scala
@@ -163,7 +163,7 @@ class ContainerMessageConsumerTests
         500,
         sendAckToScheduler(producer))
 
-    val exec = CodeExecAsString(RuntimeManifest("nodejs:14", 
ImageName("testImage")), "testCode", None)
+    val exec = CodeExecAsString(RuntimeManifest("nodejs:20", 
ImageName("testImage")), "testCode", None)
     val action =
       WhiskAction(EntityPath("testns"), EntityName("testAction"), exec, limits 
= ActionLimits(TimeLimit(1.minute)))
     put(entityStore, action)
@@ -218,7 +218,7 @@ class ContainerMessageConsumerTests
         500,
         sendAckToScheduler(ackConsumer.getProducer()))
 
-    val exec = CodeExecAsString(RuntimeManifest("nodejs:14", 
ImageName("testImage")), "testCode", None)
+    val exec = CodeExecAsString(RuntimeManifest("nodejs:20", 
ImageName("testImage")), "testCode", None)
     val whiskAction =
       WhiskAction(EntityPath("testns"), EntityName("testAction2"), exec, 
limits = ActionLimits(TimeLimit(1.minute)))
     val execMetadata =
@@ -294,7 +294,7 @@ class ContainerMessageConsumerTests
         500,
         sendAckToScheduler(producer))
 
-    val exec = CodeExecAsString(RuntimeManifest("nodejs:14", 
ImageName("testImage")), "testCode", None)
+    val exec = CodeExecAsString(RuntimeManifest("nodejs:20", 
ImageName("testImage")), "testCode", None)
     val action =
       WhiskAction(
         WarmUp.warmUpAction.namespace.toPath,
diff --git 
a/tests/src/test/scala/org/apache/openwhisk/core/limits/ActionLimitsTests.scala 
b/tests/src/test/scala/org/apache/openwhisk/core/limits/ActionLimitsTests.scala
index 7fe757428..0001e1225 100644
--- 
a/tests/src/test/scala/org/apache/openwhisk/core/limits/ActionLimitsTests.scala
+++ 
b/tests/src/test/scala/org/apache/openwhisk/core/limits/ActionLimitsTests.scala
@@ -75,7 +75,9 @@ class ActionLimitsTests extends TestHelpers with 
WskTestHelpers with WskActorSys
   // * With the introduction of Node.js 10, this was changed from 
"openFileLimit - 15" to
   //   "openFileLimit - 20".
   // * With Docker 18.09.3, we observed test failures and changed to 
"openFileLimit - 24".
-  val minExpectedOpenFiles = openFileLimit - 24
+  // * With the introduction of Node.js 20, this was changed from 
"openFileLimit - 24" to
+  //   "openFileLimit - 30".
+  val minExpectedOpenFiles = openFileLimit - 30
 
   behavior of "Action limits"
 
diff --git 
a/tests/src/test/scala/org/apache/openwhisk/core/scheduler/grpc/test/CommonVariable.scala
 
b/tests/src/test/scala/org/apache/openwhisk/core/scheduler/grpc/test/CommonVariable.scala
index 04f0e8180..00076110d 100644
--- 
a/tests/src/test/scala/org/apache/openwhisk/core/scheduler/grpc/test/CommonVariable.scala
+++ 
b/tests/src/test/scala/org/apache/openwhisk/core/scheduler/grpc/test/CommonVariable.scala
@@ -32,7 +32,7 @@ trait CommonVariable {
   val semVer = SemVer(0, 1, 1)
   val testVersion = Some(semVer)
   val testFQN = FullyQualifiedEntityName(testEntityPath, testEntityName, 
testVersion)
-  val testExec = CodeExecAsString(RuntimeManifest("nodejs:14", 
ImageName("testImage")), "testCode", None)
+  val testExec = CodeExecAsString(RuntimeManifest("nodejs:20", 
ImageName("testImage")), "testCode", None)
   val testExecMetadata =
     CodeExecMetaDataAsString(testExec.manifest, entryPoint = 
testExec.entryPoint)
   val testActionMetaData =
diff --git a/tests/src/test/scala/system/rest/JsonSchemaTests.scala 
b/tests/src/test/scala/system/rest/JsonSchemaTests.scala
index 482997dd4..86007af07 100644
--- a/tests/src/test/scala/system/rest/JsonSchemaTests.scala
+++ b/tests/src/test/scala/system/rest/JsonSchemaTests.scala
@@ -51,7 +51,7 @@ class JsonSchemaTests extends FlatSpec with Matchers with 
JsonSchema with RestUt
                        | "name":"foo",
                        | "version":"1.1.1",
                        | "publish":false,
-                       | "exec":{ "code": "foo", "kind": "nodejs:14" },
+                       | "exec":{ "code": "foo", "kind": "nodejs:20" },
                        | "parameters":["key1","value1"],
                        | "limits":{ "timeout":1000, "memory":200 } 
}""".stripMargin
     assert(check(ACTION, schema))

Reply via email to