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

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


The following commit(s) were added to refs/heads/master by this push:
     new 5614cc5  Integration test coverage on python functions (#2072)
5614cc5 is described below

commit 5614cc5ef6e5eec01213baabe6cedbb6b65d8f53
Author: Sijie Guo <[email protected]>
AuthorDate: Tue Jul 3 00:24:09 2018 -0700

    Integration test coverage on python functions (#2072)
    
    *Motivation*
    
    - Make sure python wheel file is built and can be installed/used correctly
    - Make sure pulsar python functions work as expected
    
    *Changes*
    
    - copy `python-examples` to the distribution
    - install python client in test image for pulsar python function test
    - add PYTHON runtime to functions runtime test
---
 distribution/server/src/assemble/bin.xml           |  4 ++
 pom.xml                                            |  1 +
 pulsar-client-cpp/docker/build-wheels.sh           | 28 +++++++++++++
 .../docker-images/latest-version-image/Dockerfile  |  8 +++-
 tests/docker-images/latest-version-image/pom.xml   | 46 ++++++++++++++++++++++
 .../scripts/install-pulsar-client.sh               | 32 ++-------------
 .../functions/PulsarFunctionsTestBase.java         | 20 +++++++++-
 .../runtime/PulsarFunctionsProcessRuntimeTest.java |  3 ++
 .../runtime/PulsarFunctionsRuntimeTest.java        | 34 ++++++++++++++--
 .../runtime/PulsarFunctionsThreadRuntimeTest.java  |  4 ++
 .../functions/utils/CommandGenerator.java          |  2 +-
 11 files changed, 145 insertions(+), 37 deletions(-)

diff --git a/distribution/server/src/assemble/bin.xml 
b/distribution/server/src/assemble/bin.xml
index ff7c1a3..61178bf 100644
--- a/distribution/server/src/assemble/bin.xml
+++ b/distribution/server/src/assemble/bin.xml
@@ -47,6 +47,10 @@
       
<directory>${basedir}/../../pulsar-functions/runtime/target/python-instance</directory>
       <outputDirectory>instances/python-instance</outputDirectory>
     </fileSet>
+    <fileSet>
+      <directory>${basedir}/../../pulsar-functions/python-examples</directory>
+      <outputDirectory>examples/python-examples</outputDirectory>
+    </fileSet>
   </fileSets>
   <files>
     <file>
diff --git a/pom.xml b/pom.xml
index 1c7f899..862a29d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -166,6 +166,7 @@ flexible messaging model and an intuitive client 
API.</description>
 
     <!-- Plugin dependencies -->
     <protobuf-maven-plugin.version>0.5.0</protobuf-maven-plugin.version>
+    <exec-maven-plugin.version>1.6.0</exec-maven-plugin.version>
   </properties>
 
   <dependencyManagement>
diff --git a/pulsar-client-cpp/docker/build-wheels.sh 
b/pulsar-client-cpp/docker/build-wheels.sh
index 2146869..ebbb441 100755
--- a/pulsar-client-cpp/docker/build-wheels.sh
+++ b/pulsar-client-cpp/docker/build-wheels.sh
@@ -35,6 +35,34 @@ PYTHON_VERSIONS=(
    '3.6 cp36-cp36m'
 )
 
+function contains() {
+    local n=$#
+    local value=${!n}
+    for ((i=1;i < $#;i++)) {
+        if [ "${!i}" == "${value}" ]; then
+            echo "y"
+            return 0
+        fi
+    }
+    echo "n"
+    return 1
+}
+
+
+if [ $# -ge 1 ]; then
+    build_version=$@
+    if [ $(contains "${PYTHON_VERSIONS[@]}" "${build_version}") == "y" ]; then
+        PYTHON_VERSIONS=(
+            "${build_version}"
+        )
+    else
+        echo "Unknown build version : ${build_version}"
+        echo "Supported python build versions are :"
+        echo ${PYTHON_VERSIONS[@]}
+        exit 1
+    fi
+fi
+
 for line in "${PYTHON_VERSIONS[@]}"; do
     read -r -a PY <<< "$line"
     PYTHON_VERSION=${PY[0]}
diff --git a/tests/docker-images/latest-version-image/Dockerfile 
b/tests/docker-images/latest-version-image/Dockerfile
index e638ba0..bcc2b53 100644
--- a/tests/docker-images/latest-version-image/Dockerfile
+++ b/tests/docker-images/latest-version-image/Dockerfile
@@ -19,7 +19,7 @@
 
 FROM apachepulsar/pulsar:latest
 
-RUN apt-get update && apt-get install -y supervisor
+RUN apt-get update && apt-get install -y supervisor python-pip
 
 RUN mkdir -p /var/log/pulsar && mkdir -p /var/run/supervisor/ && mkdir -p 
/pulsar/ssl
 
@@ -31,5 +31,9 @@ COPY ssl/ca.cert.pem ssl/broker.key-pk8.pem 
ssl/broker.cert.pem \
      ssl/admin.key-pk8.pem ssl/admin.cert.pem /pulsar/ssl/
 
 COPY scripts/init-cluster.sh scripts/run-global-zk.sh scripts/run-local-zk.sh \
-     scripts/run-bookie.sh scripts/run-broker.sh 
scripts/run-functions-worker.sh scripts/run-proxy.sh /pulsar/bin/
+     scripts/run-bookie.sh scripts/run-broker.sh 
scripts/run-functions-worker.sh scripts/run-proxy.sh \
+     scripts/install-pulsar-client.sh /pulsar/bin/
+
+ADD target/python-client/ /pulsar/pulsar-client
+RUN /pulsar/bin/install-pulsar-client.sh
 
diff --git a/tests/docker-images/latest-version-image/pom.xml 
b/tests/docker-images/latest-version-image/pom.xml
index 232312f..5094f89 100644
--- a/tests/docker-images/latest-version-image/pom.xml
+++ b/tests/docker-images/latest-version-image/pom.xml
@@ -48,20 +48,66 @@
         </dependency>
       </dependencies>
       <build>
+        <!-- build cpp client, copy the wheel file and then build docker image 
-->
         <plugins>
           <plugin>
+            <groupId>org.codehaus.mojo</groupId>
+            <artifactId>exec-maven-plugin</artifactId>
+            <version>${exec-maven-plugin.version}</version>
+            <executions>
+              <execution>
+                <id>build-pulsar-clients</id>
+                <phase>compile</phase>
+                <goals>
+                  <goal>exec</goal>
+                </goals>
+                <configuration>
+                  <skip>${skipBuildPythonClient}</skip>
+                  
<workingDirectory>${project.basedir}/target</workingDirectory>
+                  
<executable>${project.basedir}/../../../pulsar-client-cpp/docker/build-wheels.sh</executable>
+                  <arguments>
+                    <!-- build python 2.7 -->
+                    <argument>2.7 cp27-cp27mu</argument>
+                  </arguments>
+                </configuration>
+              </execution>
+            </executions>
+          </plugin>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-antrun-plugin</artifactId>
+            <executions>
+              <execution>
+                <phase>compile</phase>
+                <goals>
+                  <goal>run</goal>
+                </goals>
+                <configuration>
+                  <skip>${skipBuildPythonClient}</skip>
+                  <tasks>
+                    <echo>copy python wheel file</echo>
+                    <mkdir dir="${basedir}/target/python-client"/>
+                    <copydir 
src="${basedir}/../../../pulsar-client-cpp/python/wheelhouse" 
dest="${basedir}/target/python-client"/>
+                  </tasks>
+                </configuration>
+              </execution>
+            </executions>
+          </plugin>
+          <plugin>
             <groupId>com.spotify</groupId>
             <artifactId>dockerfile-maven-plugin</artifactId>
             <version>${dockerfile-maven.version}</version>
             <executions>
               <execution>
                 <id>default</id>
+                <phase>package</phase>
                 <goals>
                   <goal>build</goal>
                 </goals>
               </execution>
               <execution>
                 <id>add-latest-tag</id>
+                <phase>package</phase>
                 <goals>
                   <goal>tag</goal>
                 </goals>
diff --git a/pulsar-client-cpp/docker/build-wheels.sh 
b/tests/docker-images/latest-version-image/scripts/install-pulsar-client.sh
similarity index 53%
copy from pulsar-client-cpp/docker/build-wheels.sh
copy to 
tests/docker-images/latest-version-image/scripts/install-pulsar-client.sh
index 2146869..2e048c1 100755
--- a/pulsar-client-cpp/docker/build-wheels.sh
+++ b/tests/docker-images/latest-version-image/scripts/install-pulsar-client.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
 #
 # Licensed to the Apache Software Foundation (ASF) under one
 # or more contributor license agreements.  See the NOTICE file
@@ -18,31 +18,7 @@
 # under the License.
 #
 
+set -x
 
-set -e
-
-BUILD_IMAGE_NAME="${BUILD_IMAGE_NAME:-apachepulsar/pulsar-build}"
-
-ROOT_DIR=$(git rev-parse --show-toplevel)
-cd $ROOT_DIR
-
-PYTHON_VERSIONS=(
-   '2.7 cp27-cp27mu'
-   '2.7 cp27-cp27m'
-   '3.3 cp33-cp33m'
-   '3.4 cp34-cp34m'
-   '3.5 cp35-cp35m'
-   '3.6 cp36-cp36m'
-)
-
-for line in "${PYTHON_VERSIONS[@]}"; do
-    read -r -a PY <<< "$line"
-    PYTHON_VERSION=${PY[0]}
-    PYTHON_SPEC=${PY[1]}
-    echo "--------- Build Python wheel for $PYTHON_VERSION -- $PYTHON_SPEC"
-
-    IMAGE_NAME=$BUILD_IMAGE_NAME:manylinux-$PYTHON_SPEC
-
-    echo "Using image: $IMAGE_NAME"
-    docker run -i -v $PWD:/pulsar $IMAGE_NAME 
/pulsar/pulsar-client-cpp/docker/build-wheel-file-within-docker.sh
-done
+WHEEL_FILE=`ls /pulsar/pulsar-client`
+pip install /pulsar/pulsar-client/${WHEEL_FILE}
diff --git 
a/tests/integration/semantics/src/test/java/org/apache/pulsar/tests/integration/functions/PulsarFunctionsTestBase.java
 
b/tests/integration/semantics/src/test/java/org/apache/pulsar/tests/integration/functions/PulsarFunctionsTestBase.java
index dc2e290..b8ffc7c 100644
--- 
a/tests/integration/semantics/src/test/java/org/apache/pulsar/tests/integration/functions/PulsarFunctionsTestBase.java
+++ 
b/tests/integration/semantics/src/test/java/org/apache/pulsar/tests/integration/functions/PulsarFunctionsTestBase.java
@@ -31,9 +31,24 @@ import org.testng.annotations.DataProvider;
 @Slf4j
 public abstract class PulsarFunctionsTestBase extends PulsarClusterTestBase  {
 
-    public static final String EXCLAMATION_FUNC_CLASS =
+    public static final String EXCLAMATION_JAVA_CLASS =
         "org.apache.pulsar.functions.api.examples.ExclamationFunction";
 
+    public static final String EXCLAMATION_PYTHON_CLASS =
+        "exclamation.Exclamation";
+
+    public static final String EXCLAMATION_PYTHON_FILE = "exclamation.py";
+
+    protected static String getExclamationClass(Runtime runtime) {
+        if (Runtime.JAVA == runtime) {
+            return EXCLAMATION_JAVA_CLASS;
+        } else if (Runtime.PYTHON == runtime) {
+            return EXCLAMATION_PYTHON_CLASS;
+        } else {
+            throw new IllegalArgumentException("Unsupported runtime : " + 
runtime);
+        }
+    }
+
     @BeforeClass
     public static void setupCluster() throws Exception {
         PulsarClusterTestBase.setupCluster();
@@ -47,7 +62,8 @@ public abstract class PulsarFunctionsTestBase extends 
PulsarClusterTestBase  {
     @DataProvider(name = "FunctionRuntimes")
     public static Object[][] functionRuntimes() {
         return new Object[][] {
-            new Object[] { Runtime.JAVA }
+            new Object[] { Runtime.JAVA },
+            new Object[] { Runtime.PYTHON }
         };
     }
 
diff --git 
a/tests/integration/semantics/src/test/java/org/apache/pulsar/tests/integration/functions/runtime/PulsarFunctionsProcessRuntimeTest.java
 
b/tests/integration/semantics/src/test/java/org/apache/pulsar/tests/integration/functions/runtime/PulsarFunctionsProcessRuntimeTest.java
index 7c4033f..83edac8 100644
--- 
a/tests/integration/semantics/src/test/java/org/apache/pulsar/tests/integration/functions/runtime/PulsarFunctionsProcessRuntimeTest.java
+++ 
b/tests/integration/semantics/src/test/java/org/apache/pulsar/tests/integration/functions/runtime/PulsarFunctionsProcessRuntimeTest.java
@@ -22,4 +22,7 @@ package org.apache.pulsar.tests.integration.functions.runtime;
  * Run runtime tests in process mode.
  */
 public class PulsarFunctionsProcessRuntimeTest extends 
PulsarFunctionsRuntimeTest {
+    public PulsarFunctionsProcessRuntimeTest() {
+        super(ContainerFactory.PROCESS);
+    }
 }
diff --git 
a/tests/integration/semantics/src/test/java/org/apache/pulsar/tests/integration/functions/runtime/PulsarFunctionsRuntimeTest.java
 
b/tests/integration/semantics/src/test/java/org/apache/pulsar/tests/integration/functions/runtime/PulsarFunctionsRuntimeTest.java
index e816f70..41be67f 100644
--- 
a/tests/integration/semantics/src/test/java/org/apache/pulsar/tests/integration/functions/runtime/PulsarFunctionsRuntimeTest.java
+++ 
b/tests/integration/semantics/src/test/java/org/apache/pulsar/tests/integration/functions/runtime/PulsarFunctionsRuntimeTest.java
@@ -40,12 +40,28 @@ import org.testng.annotations.Test;
  */
 public abstract class PulsarFunctionsRuntimeTest extends 
PulsarFunctionsTestBase {
 
+    protected enum ContainerFactory {
+        PROCESS,
+        THREAD
+    }
+
+    private final ContainerFactory containerFactory;
+
+    public PulsarFunctionsRuntimeTest(ContainerFactory containerFactory) {
+        this.containerFactory = containerFactory;
+    }
+
     //
     // Test CRUD functions on different runtimes.
     //
 
     @Test(dataProvider = "FunctionRuntimes")
     public void testExclamationFunction(Runtime runtime) throws Exception {
+        if (ContainerFactory.THREAD == containerFactory && Runtime.PYTHON == 
runtime) {
+            // python can only run on process mode
+            return;
+        }
+
         String inputTopicName = "test-exclamation-" + runtime + "-input-" + 
randomName(8);
         String outputTopicName = "test-exclamation-" + runtime + "-output-" + 
randomName(8);
         String functionName = "test-exclamation-fn-" + randomName(8);
@@ -53,7 +69,7 @@ public abstract class PulsarFunctionsRuntimeTest extends 
PulsarFunctionsTestBase
 
         // submit the exclamation function
         submitExclamationFunction(
-            inputTopicName, outputTopicName, functionName);
+            runtime, inputTopicName, outputTopicName, functionName);
 
         // get function info
         getFunctionInfoSuccess(functionName);
@@ -71,13 +87,23 @@ public abstract class PulsarFunctionsRuntimeTest extends 
PulsarFunctionsTestBase
         getFunctionInfoNotFound(functionName);
     }
 
-    private static void submitExclamationFunction(String inputTopicName,
+    private static void submitExclamationFunction(Runtime runtime,
+                                                  String inputTopicName,
                                                   String outputTopicName,
                                                   String functionName) throws 
Exception {
-        CommandGenerator generator = 
CommandGenerator.createDefaultGenerator(inputTopicName, EXCLAMATION_FUNC_CLASS);
+        CommandGenerator generator;
+        generator = CommandGenerator.createDefaultGenerator(inputTopicName, 
getExclamationClass(runtime));
         generator.setSinkTopic(outputTopicName);
         generator.setFunctionName(functionName);
-        String command = generator.generateCreateFunctionCommand();
+        String command;
+        if (Runtime.JAVA == runtime) {
+            command = generator.generateCreateFunctionCommand();
+        } else if (Runtime.PYTHON == runtime) {
+            generator.setRuntime(runtime);
+            command = 
generator.generateCreateFunctionCommand(EXCLAMATION_PYTHON_FILE);
+        } else {
+            throw new IllegalArgumentException("Unsupported runtime : " + 
runtime);
+        }
         String[] commands = {
             "sh", "-c", command
         };
diff --git 
a/tests/integration/semantics/src/test/java/org/apache/pulsar/tests/integration/functions/runtime/PulsarFunctionsThreadRuntimeTest.java
 
b/tests/integration/semantics/src/test/java/org/apache/pulsar/tests/integration/functions/runtime/PulsarFunctionsThreadRuntimeTest.java
index 61ddba3..7ca9931 100644
--- 
a/tests/integration/semantics/src/test/java/org/apache/pulsar/tests/integration/functions/runtime/PulsarFunctionsThreadRuntimeTest.java
+++ 
b/tests/integration/semantics/src/test/java/org/apache/pulsar/tests/integration/functions/runtime/PulsarFunctionsThreadRuntimeTest.java
@@ -29,6 +29,10 @@ import org.testng.annotations.BeforeClass;
 @Slf4j
 public class PulsarFunctionsThreadRuntimeTest extends 
PulsarFunctionsRuntimeTest {
 
+    public PulsarFunctionsThreadRuntimeTest() {
+        super(ContainerFactory.THREAD);
+    }
+
     @BeforeClass
     public static void setupCluster() throws Exception {
         PulsarClusterTestBase.setupCluster();
diff --git 
a/tests/integration/semantics/src/test/java/org/apache/pulsar/tests/integration/functions/utils/CommandGenerator.java
 
b/tests/integration/semantics/src/test/java/org/apache/pulsar/tests/integration/functions/utils/CommandGenerator.java
index 12225fe..7146616 100644
--- 
a/tests/integration/semantics/src/test/java/org/apache/pulsar/tests/integration/functions/utils/CommandGenerator.java
+++ 
b/tests/integration/semantics/src/test/java/org/apache/pulsar/tests/integration/functions/utils/CommandGenerator.java
@@ -54,7 +54,7 @@ public class CommandGenerator {
 
     private Map<String, String> userConfig = new HashMap<>();
     private static final String JAVAJAR = "/pulsar/examples/api-examples.jar";
-    private static final String PYTHONBASE = "/pulsar/examples/python";
+    private static final String PYTHONBASE = 
"/pulsar/examples/python-examples/";
 
     public static CommandGenerator createDefaultGenerator(String sourceTopic, 
String functionClassName) {
         CommandGenerator generator = new CommandGenerator();

Reply via email to