You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwhisk.apache.org by cs...@apache.org on 2018/08/08 17:36:00 UTC

[incubator-openwhisk-runtime-nodejs] branch master updated: Don't override runtime npm packages when user provides their own (#73)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new db79b24  Don't override runtime npm packages when user provides their own (#73)
db79b24 is described below

commit db79b24c9dde0c78481c76c86d7d0063b5e9e77d
Author: Eric Weiterman <ew...@us.ibm.com>
AuthorDate: Wed Aug 8 13:35:58 2018 -0400

    Don't override runtime npm packages when user provides their own (#73)
---
 .gitignore                                         |   1 +
 core/nodejs6Action/Dockerfile                      |   6 ++--
 core/nodejs8Action/Dockerfile                      |   4 ++-
 core/nodejsActionBase/.dockerignore                |   2 --
 core/nodejsActionBase/Dockerfile                   |   2 ++
 settings.gradle                                    |   3 +-
 tests/dat/actions/nodejs-test.zip                  | Bin 0 -> 2138195 bytes
 tests/dat/docker/nodejs6docker/Dockerfile          |   3 ++
 .../docker/nodejs6docker/build.gradle}             |  11 ++----
 tests/dat/docker/nodejs6docker/package.json        |   8 +++++
 tests/dat/docker/nodejs8docker/Dockerfile          |   3 ++
 .../docker/nodejs8docker/build.gradle}             |  11 ++----
 tests/dat/docker/nodejs8docker/package.json        |   8 +++++
 .../NodeJs6ActionContainerTests.scala              |   2 +-
 .../NodeJs8ActionContainerTests.scala              |   1 +
 .../NodeJsActionContainerTests.scala               |  40 ++++++++++++++++++++-
 .../actionContainers/Nodejs6ConcurrentTests.scala  |   1 +
 .../actionContainers/Nodejs8ConcurrentTests.scala  |   1 +
 tests/tests/dat                                    |   1 +
 tools/travis/build.sh                              |   8 ++---
 20 files changed, 85 insertions(+), 31 deletions(-)

diff --git a/.gitignore b/.gitignore
index 52f108d..0bc5144 100644
--- a/.gitignore
+++ b/.gitignore
@@ -65,6 +65,7 @@ ansible/roles/nginx/files/*cert.pem
 *.zip
 !tests/dat/actions/blackbox.zip
 !tests/dat/actions/helloSwift.zip
+!tests/dat/actions/nodejs-test.zip
 !tests/dat/actions/python.zip
 !tests/dat/actions/python2_virtualenv.zip
 !tests/dat/actions/python3_virtualenv.zip
diff --git a/core/nodejs6Action/Dockerfile b/core/nodejs6Action/Dockerfile
index 3cb7ac0..bd55807 100644
--- a/core/nodejs6Action/Dockerfile
+++ b/core/nodejs6Action/Dockerfile
@@ -33,9 +33,9 @@ WORKDIR /nodejsAction
 
 # Install app dependencies
 RUN rm -rf .project .settings build.xml Dockerfile README node_modules logs
-RUN npm install .
-
-RUN npm install \
+RUN cd / && npm install .
+# In nodejsActionBase we copied the package.json file to the root of the container, this is what we are installing here, as to not be overriden by user set packages
+RUN cd / && npm install --no-package-lock \
 apn@2.1.2 \
 async@2.1.4 \
 body-parser@1.15.2 \
diff --git a/core/nodejs8Action/Dockerfile b/core/nodejs8Action/Dockerfile
index 3f56b96..c497a56 100644
--- a/core/nodejs8Action/Dockerfile
+++ b/core/nodejs8Action/Dockerfile
@@ -22,7 +22,9 @@ RUN apt-get update && apt-get install -y \
     && rm -rf /var/lib/apt/lists/*
 WORKDIR /nodejsAction
 COPY . .
-RUN npm install \
+# COPY the package.json to root container, so we can install npm packages a level up from user's packages, so user's packages take precedence
+COPY ./package.json /
+RUN cd / && npm install --no-package-lock \
     && npm cache clean --force
 EXPOSE 8080
 CMD node --expose-gc app.js
diff --git a/core/nodejsActionBase/.dockerignore b/core/nodejsActionBase/.dockerignore
deleted file mode 100644
index 6df164e..0000000
--- a/core/nodejsActionBase/.dockerignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Dockerfile
-build.gradle
diff --git a/core/nodejsActionBase/Dockerfile b/core/nodejsActionBase/Dockerfile
index a46360e..2c8c04d 100644
--- a/core/nodejsActionBase/Dockerfile
+++ b/core/nodejsActionBase/Dockerfile
@@ -23,3 +23,5 @@ ENV DEBIAN_FRONTEND noninteractive
 RUN apt-get update && apt-get install -y imagemagick && apt-get install -y unzip
 
 ADD . /nodejsAction
+# COPY the package.json to root container, so we can install npm packages a level up from user's packages, so user's packages take precedence
+COPY ./package.json /
diff --git a/settings.gradle b/settings.gradle
index c2bf195..e0f26b4 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -19,8 +19,9 @@ include 'tests'
 
 include 'core:nodejsActionBase'
 include 'core:nodejs6Action'
-
 include 'core:nodejs8Action'
+include 'tests:dat:docker:nodejs6docker'
+include 'tests:dat:docker:nodejs8docker'
 
 rootProject.name = 'runtime-nodejs'
 
diff --git a/tests/dat/actions/nodejs-test.zip b/tests/dat/actions/nodejs-test.zip
new file mode 100644
index 0000000..a0bfa23
Binary files /dev/null and b/tests/dat/actions/nodejs-test.zip differ
diff --git a/tests/dat/docker/nodejs6docker/Dockerfile b/tests/dat/docker/nodejs6docker/Dockerfile
new file mode 100644
index 0000000..63a26e1
--- /dev/null
+++ b/tests/dat/docker/nodejs6docker/Dockerfile
@@ -0,0 +1,3 @@
+FROM nodejs6action
+COPY package.json .
+RUN npm install --production
\ No newline at end of file
diff --git a/tests/src/test/scala/runtime/actionContainers/Nodejs6ConcurrentTests.scala b/tests/dat/docker/nodejs6docker/build.gradle
similarity index 75%
copy from tests/src/test/scala/runtime/actionContainers/Nodejs6ConcurrentTests.scala
copy to tests/dat/docker/nodejs6docker/build.gradle
index 0a218f6..4e4b018 100644
--- a/tests/src/test/scala/runtime/actionContainers/Nodejs6ConcurrentTests.scala
+++ b/tests/dat/docker/nodejs6docker/build.gradle
@@ -15,12 +15,5 @@
  * limitations under the License.
  */
 
-package runtime.actionContainers
-
-import org.junit.runner.RunWith
-import org.scalatest.junit.JUnitRunner
-
-@RunWith(classOf[JUnitRunner])
-class Nodejs6ConcurrentTests extends NodeJsConcurrentTests {
-  override lazy val nodejsContainerImageName = "nodejs6action"
-}
+ext.dockerImageName = 'nodejs6docker'
+apply from: '../../../../gradle/docker.gradle'
diff --git a/tests/dat/docker/nodejs6docker/package.json b/tests/dat/docker/nodejs6docker/package.json
new file mode 100644
index 0000000..ebfb5a4
--- /dev/null
+++ b/tests/dat/docker/nodejs6docker/package.json
@@ -0,0 +1,8 @@
+{
+  "name": "testdocker",
+  "version": "1.0.0",
+  "main": "index.js",
+  "dependencies": {
+    "openwhisk": "2.0.0"
+  }
+}
\ No newline at end of file
diff --git a/tests/dat/docker/nodejs8docker/Dockerfile b/tests/dat/docker/nodejs8docker/Dockerfile
new file mode 100644
index 0000000..d1f6ada
--- /dev/null
+++ b/tests/dat/docker/nodejs8docker/Dockerfile
@@ -0,0 +1,3 @@
+FROM action-nodejs-v8
+COPY package.json .
+RUN npm install --production
\ No newline at end of file
diff --git a/tests/src/test/scala/runtime/actionContainers/Nodejs6ConcurrentTests.scala b/tests/dat/docker/nodejs8docker/build.gradle
similarity index 75%
copy from tests/src/test/scala/runtime/actionContainers/Nodejs6ConcurrentTests.scala
copy to tests/dat/docker/nodejs8docker/build.gradle
index 0a218f6..a3a1d74 100644
--- a/tests/src/test/scala/runtime/actionContainers/Nodejs6ConcurrentTests.scala
+++ b/tests/dat/docker/nodejs8docker/build.gradle
@@ -15,12 +15,5 @@
  * limitations under the License.
  */
 
-package runtime.actionContainers
-
-import org.junit.runner.RunWith
-import org.scalatest.junit.JUnitRunner
-
-@RunWith(classOf[JUnitRunner])
-class Nodejs6ConcurrentTests extends NodeJsConcurrentTests {
-  override lazy val nodejsContainerImageName = "nodejs6action"
-}
+ext.dockerImageName = 'nodejs8docker'
+apply from: '../../../../gradle/docker.gradle'
diff --git a/tests/dat/docker/nodejs8docker/package.json b/tests/dat/docker/nodejs8docker/package.json
new file mode 100644
index 0000000..ebfb5a4
--- /dev/null
+++ b/tests/dat/docker/nodejs8docker/package.json
@@ -0,0 +1,8 @@
+{
+  "name": "testdocker",
+  "version": "1.0.0",
+  "main": "index.js",
+  "dependencies": {
+    "openwhisk": "2.0.0"
+  }
+}
\ No newline at end of file
diff --git a/tests/src/test/scala/runtime/actionContainers/NodeJs6ActionContainerTests.scala b/tests/src/test/scala/runtime/actionContainers/NodeJs6ActionContainerTests.scala
index 77fea66..a8a26fb 100644
--- a/tests/src/test/scala/runtime/actionContainers/NodeJs6ActionContainerTests.scala
+++ b/tests/src/test/scala/runtime/actionContainers/NodeJs6ActionContainerTests.scala
@@ -24,5 +24,5 @@ import org.scalatest.junit.JUnitRunner
 class NodeJs6ActionContainerTests extends NodeJsNonConcurrentTests {
 
   override lazy val nodejsContainerImageName = "nodejs6action"
-
+  override lazy val nodejsTestDockerImageName = "nodejs6docker"
 }
diff --git a/tests/src/test/scala/runtime/actionContainers/NodeJs8ActionContainerTests.scala b/tests/src/test/scala/runtime/actionContainers/NodeJs8ActionContainerTests.scala
index f4092c6..61fa8df 100644
--- a/tests/src/test/scala/runtime/actionContainers/NodeJs8ActionContainerTests.scala
+++ b/tests/src/test/scala/runtime/actionContainers/NodeJs8ActionContainerTests.scala
@@ -25,6 +25,7 @@ import spray.json.JsObject
 class NodeJs8ActionContainerTests extends NodeJsNonConcurrentTests {
 
   override lazy val nodejsContainerImageName = "action-nodejs-v8"
+  override lazy val nodejsTestDockerImageName = "nodejs8docker"
 
   it should "support async and await" in {
     withNodeJsContainer { c =>
diff --git a/tests/src/test/scala/runtime/actionContainers/NodeJsActionContainerTests.scala b/tests/src/test/scala/runtime/actionContainers/NodeJsActionContainerTests.scala
index 3f9694d..49c900b 100644
--- a/tests/src/test/scala/runtime/actionContainers/NodeJsActionContainerTests.scala
+++ b/tests/src/test/scala/runtime/actionContainers/NodeJsActionContainerTests.scala
@@ -17,8 +17,10 @@
 
 package runtime.actionContainers
 
+import java.io.File
+
 import common.WskActorSystem
-import actionContainers.{ActionContainer, BasicActionRunnerTests}
+import actionContainers.{ActionContainer, BasicActionRunnerTests, ResourceHelpers}
 import actionContainers.ActionContainer.withContainer
 import actionContainers.ResourceHelpers.ZipBuilder
 import spray.json._
@@ -26,6 +28,7 @@ import spray.json._
 abstract class NodeJsActionContainerTests extends BasicActionRunnerTests with WskActorSystem {
 
   val nodejsContainerImageName: String
+  val nodejsTestDockerImageName: String
 
   override def withActionContainer(env: Map[String, String] = Map.empty)(code: ActionContainer => Unit) = {
     withContainer(nodejsContainerImageName, env)(code)
@@ -586,4 +589,39 @@ abstract class NodeJsActionContainerTests extends BasicActionRunnerTests with Ws
     })
   }
 
+  it should "use user provided npm packages in a zip file" in {
+    val zipPath = new File("tests/dat/actions/nodejs-test.zip").toPath
+    val code = ResourceHelpers.readAsBase64(zipPath)
+    withNodeJsContainer { c =>
+      c.init(initPayload(code))._1 should be(200)
+
+      val (runCode, runRes) = c.run(runPayload(JsObject()))
+      runRes.get.fields.get("message") shouldBe Some(JsString("success"))
+    }
+  }
+
+  it should "use user provided packages in Docker Actions" in {
+    withContainer(nodejsTestDockerImageName) { c =>
+      val code =
+        """
+                   | function main(args) {
+                   |  var ow = require('openwhisk');
+                   |  // actions only exists on 2.* versions of openwhisk, not 3.*, so if this was 3.* it would throw an error,
+                   |  var actions = ow().actions;
+                   |
+                   |  return { "message": "success" };
+                   |}
+                 """.stripMargin
+      // Initialization of the code should be successful
+      val (initCode, err) = c.init(initPayload(code))
+      initCode should be(200)
+
+      // Running the code should be successful and return a 200 status
+      val (runCode, runRes) = c.run(runPayload(JsObject()))
+      runCode should be(200)
+
+      runRes shouldBe defined
+      runRes.get.fields.get("message") shouldBe Some(JsString("success"))
+    }
+  }
 }
diff --git a/tests/src/test/scala/runtime/actionContainers/Nodejs6ConcurrentTests.scala b/tests/src/test/scala/runtime/actionContainers/Nodejs6ConcurrentTests.scala
index 0a218f6..27dfbfb 100644
--- a/tests/src/test/scala/runtime/actionContainers/Nodejs6ConcurrentTests.scala
+++ b/tests/src/test/scala/runtime/actionContainers/Nodejs6ConcurrentTests.scala
@@ -23,4 +23,5 @@ import org.scalatest.junit.JUnitRunner
 @RunWith(classOf[JUnitRunner])
 class Nodejs6ConcurrentTests extends NodeJsConcurrentTests {
   override lazy val nodejsContainerImageName = "nodejs6action"
+  override lazy val nodejsTestDockerImageName = "nodejs6docker"
 }
diff --git a/tests/src/test/scala/runtime/actionContainers/Nodejs8ConcurrentTests.scala b/tests/src/test/scala/runtime/actionContainers/Nodejs8ConcurrentTests.scala
index 2f1ffaa..565d20e 100644
--- a/tests/src/test/scala/runtime/actionContainers/Nodejs8ConcurrentTests.scala
+++ b/tests/src/test/scala/runtime/actionContainers/Nodejs8ConcurrentTests.scala
@@ -23,4 +23,5 @@ import org.scalatest.junit.JUnitRunner
 @RunWith(classOf[JUnitRunner])
 class Nodejs8ConcurrentTests extends NodeJsConcurrentTests {
   override lazy val nodejsContainerImageName = "action-nodejs-v8"
+  override lazy val nodejsTestDockerImageName = "nodejs8docker"
 }
diff --git a/tests/tests/dat b/tests/tests/dat
new file mode 120000
index 0000000..735ed3b
--- /dev/null
+++ b/tests/tests/dat
@@ -0,0 +1 @@
+../dat
\ No newline at end of file
diff --git a/tools/travis/build.sh b/tools/travis/build.sh
index 2d39fa9..a676794 100755
--- a/tools/travis/build.sh
+++ b/tools/travis/build.sh
@@ -38,8 +38,8 @@ TERM=dumb ./gradlew install
 echo "openwhisk.home=$WHISKDIR" > whisk.properties
 echo "vcap.services.file=" >> whisk.properties
 
-# Build runtime
+# Build runtime and dependencies
 cd $ROOTDIR
-TERM=dumb ./gradlew \
-:core:nodejs6Action:distDocker \
-:core:nodejs8Action:distDocker
+
+# Build runtime & test dependencies
+TERM=dumb ./gradlew distDocker