diff --git a/.github/workflows/demo_test.yml b/.github/workflows/demo_test.yml index 01916ddb..843ededc 100644 --- a/.github/workflows/demo_test.yml +++ b/.github/workflows/demo_test.yml @@ -103,7 +103,13 @@ jobs: run: docker exec java_support_test bash -c "cd /root/occlum/demos/java && occlum-javac ./hello_world/Main.java" - name: Run hello world - run: docker exec java_support_test bash -c "cd /root/occlum/demos/java && SGX_MODE=SIM ./run_java_on_occlum.sh hello" & + run: docker exec java_support_test bash -c "cd /root/occlum/demos/java && SGX_MODE=SIM ./run_java_on_occlum.sh hello" + + - name: Compile processBuilder demo + run: docker exec java_support_test bash -c "cd /root/occlum/demos/java && occlum-javac ./processBuilder/processBuilder.java" + + - name: Run processBuilder + run: docker exec java_support_test bash -c "cd /root/occlum/demos/java && SGX_MODE=SIM ./run_java_on_occlum.sh processBuilder" Fish_test: runs-on: ubuntu-18.04 diff --git a/.github/workflows/hw_mode_test.yml b/.github/workflows/hw_mode_test.yml index a31ea470..e13941a8 100644 --- a/.github/workflows/hw_mode_test.yml +++ b/.github/workflows/hw_mode_test.yml @@ -288,6 +288,12 @@ jobs: - name: Run hello world run: docker exec $java_support_test bash -c "cd /root/occlum/demos/java && ./run_java_on_occlum.sh hello" + - name: Compile processBuilder demo + run: docker exec $java_support_test bash -c "cd /root/occlum/demos/java && occlum-javac ./processBuilder/processBuilder.java" + + - name: Run processBuilder + run: docker exec $java_support_test bash -c "cd /root/occlum/demos/java && SGX_MODE=SIM ./run_java_on_occlum.sh processBuilder" + - name: Clean the environment if: ${{ always() }} run: docker stop $java_support_test diff --git a/demos/java/README.md b/demos/java/README.md index 62387d60..2ed23635 100644 --- a/demos/java/README.md +++ b/demos/java/README.md @@ -50,3 +50,23 @@ curl http://localhost:8080 in another terminal. It is recommended to access the web application in a Web browser. You have to manually map port 8080 of the Docker container to a port on the host OS. Check out how to use [the `-p` argument of `docker run` command](https://docs.docker.com/engine/reference/commandline/run/). + +# Demo: ProcessBuilder application +This demo shows that Occlum has enabled support for `ProcessBuilder` class and multiprocess in Java. + +# How to Run +Step 1: Compile the source code with `occlum-javac` +``` +occlum-javac ./processBuilder/processBuilder.java +``` +When completed, the resulting file can be found at `./processBuilder/processBuilder.java`. + +Try to run it on native Linux with: +``` +cd processBuilder && occlum-java processBuilder +``` + +Step 2: Start JVM to run the processBuilder demo +``` +./run_java_on_occlum.sh processBuilder +``` diff --git a/demos/java/processBuilder/processBuilder.java b/demos/java/processBuilder/processBuilder.java new file mode 100644 index 00000000..95d1a5d1 --- /dev/null +++ b/demos/java/processBuilder/processBuilder.java @@ -0,0 +1,15 @@ +import java.io.IOException; + +public class processBuilder { + public static void main(String[] args) throws IOException, InterruptedException { + + ProcessBuilder pb = new ProcessBuilder("date"); + Process process = pb.start(); + + String result = new String(process.getInputStream().readAllBytes()); + System.out.printf("%s", result); + + var ret = process.waitFor(); + System.out.printf("Child process exited with code: %d\n", ret); + } +} diff --git a/demos/java/run_java_on_occlum.sh b/demos/java/run_java_on_occlum.sh index da957027..d3ff8e04 100755 --- a/demos/java/run_java_on_occlum.sh +++ b/demos/java/run_java_on_occlum.sh @@ -6,7 +6,7 @@ NC='\033[0m' show_usage() { echo "Error: invalid arguments" - echo "Usage: $0 web_app/hello" + echo "Usage: $0 web_app/hello/processBuilder" exit 1 } @@ -72,6 +72,29 @@ run_hello() { occlum run /usr/lib/jvm/java-11-alibaba-dragonwell/jre/bin/java -Xmx512m -XX:-UseCompressedOops -XX:MaxMetaspaceSize=64m -Dos.name=Linux Main } +build_processBuilder() { + # Copy JVM and class file into Occlum instance and build + mkdir -p image/usr/lib/jvm + cp -r /opt/occlum/toolchains/jvm/java-11-alibaba-dragonwell image/usr/lib/jvm + cp /usr/local/occlum/x86_64-linux-musl/lib/libz.so.1 image/lib + cp ../${app} image + cp /bin/date image/bin/ + # Need bigger user space size for multiprocess + new_json="$(jq '.resource_limits.user_space_size = "6000MB"' Occlum.json)" && \ + echo "${new_json}" > Occlum.json + occlum build +} + +run_processBuilder() { + app=./processBuilder/processBuilder.class + check_file_exist ${app} + init_instance + build_processBuilder + echo -e "${BLUE}occlum run JVM processBuilder${NC}" + occlum run /usr/lib/jvm/java-11-alibaba-dragonwell/jre/bin/java -Xmx512m -XX:-UseCompressedOops -XX:MaxMetaspaceSize=64m -Dos.name=Linux \ + -Djdk.lang.Process.launchMechanism=posix_spawn processBuilder +} + arg=$1 case "$arg" in web_app) @@ -80,6 +103,9 @@ case "$arg" in hello) run_hello ;; + processBuilder) + run_processBuilder + ;; *) show_usage esac