From de0530276e26713a1a3705412821f71f12d3eada Mon Sep 17 00:00:00 2001 From: Peter Somogyvari Date: Mon, 8 Jul 2024 13:23:38 -0700 Subject: [PATCH] test(tools): fix Corda AIO flowdb image: JVM upgrade, flow permissions 1. Also removed the party B, C and notary because none of these are present in the ledger definition that we get handed down from the official kotlin samples Corda GitHub repository. 2. The above change also saves on resources to have only party A which makes this image boot very fast compared to the other Corda AIO images. 3. Also refactored the corda sample app enum so that the file-system paths declared in it are matching reality instead of pointing to non-existent directories. Signed-off-by: Peter Somogyvari --- .../typescript/corda/sample-cordapp-enum.ts | 11 +- .../corda-v4_8-flowdb/Dockerfile | 65 ++++------- .../corda-v4_8-flowdb/build.gradle | 110 ++++++++---------- .../corda-v4_8-flowdb/healthcheck.sh | 20 ---- .../corda-v4_8-flowdb/run-notary-node.sh | 13 --- .../corda-v4_8-flowdb/run-party-a-node.sh | 2 +- .../corda-v4_8-flowdb/run-party-b-node.sh | 9 -- .../corda-v4_8-flowdb/run-party-b-server.sh | 9 -- .../corda-v4_8-flowdb/run-party-c-node.sh | 13 --- .../corda-v4_8-flowdb/run-party-c-server.sh | 9 -- .../corda-v4_8-flowdb/supervisord.conf | 65 +---------- 11 files changed, 79 insertions(+), 247 deletions(-) delete mode 100755 tools/docker/corda-all-in-one/corda-v4_8-flowdb/run-notary-node.sh delete mode 100755 tools/docker/corda-all-in-one/corda-v4_8-flowdb/run-party-b-node.sh delete mode 100755 tools/docker/corda-all-in-one/corda-v4_8-flowdb/run-party-b-server.sh delete mode 100755 tools/docker/corda-all-in-one/corda-v4_8-flowdb/run-party-c-node.sh delete mode 100755 tools/docker/corda-all-in-one/corda-v4_8-flowdb/run-party-c-server.sh diff --git a/packages/cactus-test-tooling/src/main/typescript/corda/sample-cordapp-enum.ts b/packages/cactus-test-tooling/src/main/typescript/corda/sample-cordapp-enum.ts index bbc4a6ea97..15e2f1469c 100644 --- a/packages/cactus-test-tooling/src/main/typescript/corda/sample-cordapp-enum.ts +++ b/packages/cactus-test-tooling/src/main/typescript/corda/sample-cordapp-enum.ts @@ -83,13 +83,10 @@ export const SAMPLE_CORDAPP_DATA = Object.freeze({ [SampleCordappEnum.BASIC_FLOW]: { rootDir: "/samples-kotlin/Basic/flow-database-access/", cordappDirPartyA: - "/samples-kotlin/Basic/flow-database-access/build/nodes/ParticipantA/cordapps", - cordappDirPartyB: - "/samples-kotlin/Basic/flow-database-access/build/nodes/ParticipantB/cordapps", - cordappDirPartyC: - "/samples-kotlin/Basic/flow-database-access/build/nodes/ParticipantC/cordapps", - cordappDirNotary: - "/samples-kotlin/Basic/flow-database-access/build/nodes/Notary/cordapps", + "/samples-kotlin/Basic/flow-database-access/build/nodes/PartyA/cordapps", + cordappDirPartyB: "-", + cordappDirPartyC: "-", + cordappDirNotary: "-", jars: [ { jarRelativePath: "workflows/build/libs/workflows-0.1.jar", diff --git a/tools/docker/corda-all-in-one/corda-v4_8-flowdb/Dockerfile b/tools/docker/corda-all-in-one/corda-v4_8-flowdb/Dockerfile index 086b0d22ce..93d7d22de4 100644 --- a/tools/docker/corda-all-in-one/corda-v4_8-flowdb/Dockerfile +++ b/tools/docker/corda-all-in-one/corda-v4_8-flowdb/Dockerfile @@ -1,39 +1,26 @@ FROM docker:24.0.2-dind -ARG SAMPLES_KOTLIN_SHA=30fd841dd035934bae75ab8910da3b6e3d5d6ee7 -ARG SAMPLES_KOTLIN_FLOWDB_SUB_DIR_PATH="./Basic/flow-database-access/" -ARG CORDA_TOOLS_SHELL_CLI_VERSION=4.8 - WORKDIR / -RUN apk update - -# Install dependencies of Docker Compose -RUN apk add py-pip python3-dev libffi-dev openssl-dev gcc libc-dev make - -# Install git so we can check out the kotlin-samples repo of Corda -RUN apk add --no-cache git - -# Fabric Samples needs bash, sh is not good enough here -RUN apk add --no-cache bash - -# Need curl to run healthchecks -RUN apk add --no-cache curl - -# The file binary is used to inspect exectubles when debugging container image issues -RUN apk add --no-cache file - -RUN apk add --no-cache openjdk8 - -# Need gradle to execute the corda sample app setup commands -RUN apk add --no-cache gradle +# Delete openssh packages to avoid conflicting with versions that Alpine ships with +# py-pip python3-dev libffi-dev openssl-dev gcc libc-dev make: Dependencies of Docker Compose +# git: so we can check out the kotlin-samples repo of Corda +# curl: to run healthchecks +# file: binary is used to inspect exectubles when debugging container image issues +# augeas: - need it for editing config files +RUN apk del openssh* && apk update && apk add --no-cache \ + py-pip python3-dev libffi-dev openssl-dev gcc libc-dev make \ + git \ + bash \ + curl \ + file \ + augeas \ + openssh \ + openjdk17 ENV CACTUS_CFG_PATH=/etc/hyperledger/cactus RUN mkdir -p $CACTUS_CFG_PATH -# OpenSSH - need to have it so we can shell in and install/instantiate contracts and troubleshoot -RUN apk add --no-cache openssh augeas - # Configure the OpenSSH server we just installed RUN augtool 'set /files/etc/ssh/sshd_config/AuthorizedKeysFile ".ssh/authorized_keys /etc/authorized_keys/%u"' RUN augtool 'set /files/etc/ssh/sshd_config/PermitRootLogin yes' @@ -59,14 +46,19 @@ RUN cp $CACTUS_CFG_PATH/corda-aio-image.pub ~/.ssh/authorized_keys # RUN cat /root-password.txt | chpasswd RUN echo "root:root" | chpasswd +ARG CORDA_TOOLS_SHELL_CLI_VERSION=4.8 RUN curl https://download.corda.net/maven/corda-releases/net/corda/corda-tools-shell-cli/${CORDA_TOOLS_SHELL_CLI_VERSION}/corda-tools-shell-cli-${CORDA_TOOLS_SHELL_CLI_VERSION}-all.jar --output /corda-tools-shell-cli-all.jar # This is what makes the "corda-shell" alias avaialble on the terminal RUN java -jar /corda-tools-shell-cli-all.jar install-shell-extensions RUN git clone https://github.com/corda/samples-kotlin.git WORKDIR /samples-kotlin + +ARG SAMPLES_KOTLIN_SHA=b7f814b2d6d57c654716ac572a307c3868dacf6d RUN git checkout ${SAMPLES_KOTLIN_SHA} +ARG SAMPLES_KOTLIN_FLOWDB_SUB_DIR_PATH="./Basic/flow-database-access/" + COPY build.gradle /samples-kotlin/${SAMPLES_KOTLIN_FLOWDB_SUB_DIR_PATH}/build.gradle WORKDIR /samples-kotlin/${SAMPLES_KOTLIN_FLOWDB_SUB_DIR_PATH} @@ -105,15 +97,10 @@ EXPOSE 7005 7006 7007 7008 COPY supervisord.conf /etc/supervisord.conf COPY run-party-a-server.sh / -COPY run-party-b-server.sh / -COPY run-party-c-server.sh / COPY run-party-a-node.sh / -COPY run-party-b-node.sh / -COPY run-party-c-node.sh / -COPY run-notary-node.sh / COPY healthcheck.sh / -# By default we only run the absolute minimum which is a single party's node. +# By default we only run the absolute minimum which is a single node. # For more complex tests everything else can also be enabled via the env vars # below so that if needed there is 2 parties, a notary and a dedicated web server # for all 3 of those nodes. @@ -121,15 +108,7 @@ COPY healthcheck.sh / ENV PARTY_A_NODE_ENABLED="true" ENV PARTY_A_WEB_SRV_ENABLED="false" -ENV PARTY_B_NODE_ENABLED="true" -ENV PARTY_B_WEB_SRV_ENABLED="false" - -ENV PARTY_C_NODE_ENABLED="true" -ENV PARTY_C_WEB_SRV_ENABLED="false" - -ENV NOTARY_NODE_ENABLED="true" - -# Extend the parent image's entrypoint +# Extend the entrypoint of the image # https://superuser.com/questions/1459466/can-i-add-an-additional-docker-entrypoint-script ENTRYPOINT ["/usr/bin/supervisord"] CMD ["--configuration", "/etc/supervisord.conf", "--nodaemon"] diff --git a/tools/docker/corda-all-in-one/corda-v4_8-flowdb/build.gradle b/tools/docker/corda-all-in-one/corda-v4_8-flowdb/build.gradle index c2bfa0ef75..ede2efbabd 100644 --- a/tools/docker/corda-all-in-one/corda-v4_8-flowdb/build.gradle +++ b/tools/docker/corda-all-in-one/corda-v4_8-flowdb/build.gradle @@ -1,3 +1,6 @@ +import static org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17 +import static org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_1_9 + buildscript { //properties that you need to build the project Properties constants = new Properties() @@ -14,7 +17,15 @@ buildscript { //properties that you need to build the project quasar_version = constants.getProperty("quasarVersion") log4j_version = constants.getProperty("log4jVersion") slf4j_version = constants.getProperty("slf4jVersion") + corda_shell_version = constants.getProperty("cordaShellVersion") corda_platform_version = constants.getProperty("platformVersion").toInteger() + + testJvmArgs = ['--add-opens', 'java.base/java.time=ALL-UNNAMED', '--add-opens', 'java.base/java.io=ALL-UNNAMED', + '--add-opens', 'java.base/java.util=ALL-UNNAMED', '--add-opens', 'java.base/java.net=ALL-UNNAMED', + '--add-opens', 'java.base/java.nio=ALL-UNNAMED', '--add-opens', 'java.base/java.lang.invoke=ALL-UNNAMED', + '--add-opens', 'java.base/java.security.cert=ALL-UNNAMED', '--add-opens', 'java.base/java.security=ALL-UNNAMED', + '--add-opens', 'java.base/javax.net.ssl=ALL-UNNAMED', '--add-opens', 'java.base/java.lang=ALL-UNNAMED', + '--add-opens', 'java.base/java.util.concurrent=ALL-UNNAMED', '--add-opens', 'java.sql/java.sql=ALL-UNNAMED',] } repositories { @@ -32,21 +43,17 @@ buildscript { //properties that you need to build the project } allprojects { //Properties that you need to compile your project (The application) - apply plugin: 'kotlin' - - repositories { - mavenLocal() - mavenCentral() - maven { url 'https://download.corda.net/maven/corda' } - maven { url 'https://jitpack.io' } - } + apply from: "${rootProject.projectDir}/../repositories.gradle" + apply plugin: 'org.jetbrains.kotlin.jvm' tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile) { - kotlinOptions { - languageVersion = "1.2" - apiVersion = "1.2" - jvmTarget = "1.8" + compilerOptions { + languageVersion = KOTLIN_1_9 + apiVersion = KOTLIN_1_9 + jvmTarget = JVM_17 javaParameters = true // Useful for reflection. + freeCompilerArgs = ['-Xjvm-default=all-compatibility'] + allWarningsAsErrors = true } } @@ -69,19 +76,24 @@ sourceSets { } } -//Module dependencis +//Module dependencies dependencies { // Corda dependencies. - cordaCompile "$corda_core_release_group:corda-core:$corda_core_release_version" - cordaRuntime "$corda_release_group:corda-node-api:$corda_release_version" - cordaRuntime "$corda_release_group:corda:$corda_release_version" + cordaBootstrapper "$corda_release_group:corda-node-api:$corda_release_version" + corda "$corda_release_group:corda:$corda_release_version" // CorDapp dependencies. cordapp project(":workflows") - cordaCompile "org.apache.logging.log4j:log4j-slf4j-impl:${log4j_version}" - cordaCompile "org.apache.logging.log4j:log4j-web:${log4j_version}" - cordaCompile "org.slf4j:jul-to-slf4j:$slf4j_version" + cordaProvided "$corda_core_release_group:corda-core:$corda_core_release_version" + cordaProvided "org.apache.logging.log4j:log4j-slf4j2-impl:${log4j_version}" + cordaProvided "org.apache.logging.log4j:log4j-web:${log4j_version}" + cordaProvided "org.slf4j:jul-to-slf4j:$slf4j_version" + cordaDriver "net.corda:corda-shell:$corda_shell_version" +} + +cordapp { + targetPlatformVersion corda_platform_version.toInteger() } task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { @@ -90,48 +102,28 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { deploy = false } cordapp project(':workflows') - rpcUsers = [[ user: "user1", "password": "password", "permissions": ["ALL"]]] - runSchemaMigration = true + runSchemaMigration = true //This configuration is for any CorDapps with custom schema, We will leave this as true to avoid + //problems for developers who are not familiar with Corda. If you are not using custom schemas, you can change + //it to false for quicker project compiling time. } node { - name "O=Notary,L=London,C=GB" - notary = [validating: false] - p2pPort 10002 + name "O=PartyA,L=London,C=GB" + p2pPort 10005 rpcSettings { - useSsl false - standAloneBroker false - address "0.0.0.0:10003" - adminAddress "0.0.0.0:10103" - } - } - node { - name "O=ParticipantA,L=London,C=GB" - p2pPort 10007 - rpcSettings { - useSsl false - standAloneBroker false - address "0.0.0.0:10008" - adminAddress "0.0.0.0:10108" - } - } - node { - name "O=ParticipantB,L=New York,C=US" - p2pPort 10010 - rpcSettings { - useSsl false - standAloneBroker false - address "0.0.0.0:10011" - adminAddress "0.0.0.0:10111" - } - } - node { - name "O=ParticipantC,L=Paris,C=FR" - p2pPort 10013 - rpcSettings { - useSsl false - standAloneBroker false - address "0.0.0.0:10014" - adminAddress "0.0.0.0:10114" + address("0.0.0.0:10006") + adminAddress("0.0.0.0:10046") } + rpcUsers = [[user: "user1", "password": "test", "permissions": [ + "StartFlow.com.flowdb.AddTokenValueFlow", + "StartFlow.com.flowdb.UpdateTokenValueFlow", + "StartFlow.com.flowdb.QueryTokenValueFlow", + // Without this, the connector cannot connect - fails with the error logs below" + // Permission Exception establishing connection: User not authorized to perform RPC call public abstract net.corda.core.node.NodeInfo net.corda.core.messaging.CordaRPCOps.nodeInfo() with target []' + "InvokeRpc.nodeInfo", + + // net.corda.client.rpc.PermissionException: User not authorized to perform RPC call public abstract java.util.List net.corda.core.messaging.CordaRPCOps.registeredFlows() with target [] + "InvokeRpc.registeredFlows", + "InvokeRpc.startFlowDynamic" + ]]] } -} \ No newline at end of file +} diff --git a/tools/docker/corda-all-in-one/corda-v4_8-flowdb/healthcheck.sh b/tools/docker/corda-all-in-one/corda-v4_8-flowdb/healthcheck.sh index ea5b904b8e..80b5d7b907 100755 --- a/tools/docker/corda-all-in-one/corda-v4_8-flowdb/healthcheck.sh +++ b/tools/docker/corda-all-in-one/corda-v4_8-flowdb/healthcheck.sh @@ -7,28 +7,8 @@ then curl -vv -i -X OPTIONS http://127.0.0.1:10009/web/iou/ fi -if [ "$PARTY_B_WEB_SRV_ENABLED" = "true" ] -then - curl -vv -i -X OPTIONS http://127.0.0.1:10012/web/iou/ -fi - -if [ "$PARTY_C_WEB_SRV_ENABLED" = "true" ] -then - curl -vv -i -X OPTIONS http://127.0.0.1:10015/web/iou/ -fi - if [ "$PARTY_A_NODE_ENABLED" = "true" ] then curl -v 'http://localhost:7005/jolokia/exec/org.apache.activemq.artemis:address=%22rpc.server%22,broker=%22RPC%22,component=addresses,queue=%22rpc.server%22,routing-type=%22multicast%22,subcomponent=queues/countMessages()/' fi - -if [ "$PARTY_B_NODE_ENABLED" = "true" ] -then - curl -v 'http://localhost:7006/jolokia/exec/org.apache.activemq.artemis:address=%22rpc.server%22,broker=%22RPC%22,component=addresses,queue=%22rpc.server%22,routing-type=%22multicast%22,subcomponent=queues/countMessages()/' -fi - -if [ "$PARTY_C_NODE_ENABLED" = "true" ] -then - curl -v 'http://localhost:7007/jolokia/exec/org.apache.activemq.artemis:address=%22rpc.server%22,broker=%22RPC%22,component=addresses,queue=%22rpc.server%22,routing-type=%22multicast%22,subcomponent=queues/countMessages()/' -fi \ No newline at end of file diff --git a/tools/docker/corda-all-in-one/corda-v4_8-flowdb/run-notary-node.sh b/tools/docker/corda-all-in-one/corda-v4_8-flowdb/run-notary-node.sh deleted file mode 100755 index ac62aea895..0000000000 --- a/tools/docker/corda-all-in-one/corda-v4_8-flowdb/run-notary-node.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -set -e - -if [ "$NOTARY_NODE_ENABLED" = "true" ] -then - java \ - -Dcapsule.jvm.args="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5008 -javaagent:drivers/jolokia-jvm-1.6.0-agent.jar=port=7008,logHandlerClass=net.corda.node.JolokiaSlf4jAdapter" \ - -Dname=Notary \ - -jar \ - /samples-kotlin/Basic/flow-database-access/build/nodes/Notary/corda.jar -else - sleep infinity -fi diff --git a/tools/docker/corda-all-in-one/corda-v4_8-flowdb/run-party-a-node.sh b/tools/docker/corda-all-in-one/corda-v4_8-flowdb/run-party-a-node.sh index 7266162ac9..bc3000f16e 100755 --- a/tools/docker/corda-all-in-one/corda-v4_8-flowdb/run-party-a-node.sh +++ b/tools/docker/corda-all-in-one/corda-v4_8-flowdb/run-party-a-node.sh @@ -3,7 +3,7 @@ set -e if [ "$PARTY_A_NODE_ENABLED" = "true" ] then - java -Dcapsule.jvm.args="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -javaagent:drivers/jolokia-jvm-1.6.0-agent.jar=port=7005,logHandlerClass=net.corda.node.JolokiaSlf4jAdapter" -Dname=ParticipantA -jar /samples-kotlin/Basic/flow-database-access/build/nodes/ParticipantA/corda.jar + java -Dcapsule.jvm.args="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -javaagent:drivers/jolokia-jvm-1.6.2-agent.jar=port=7005,logHandlerClass=net.corda.node.JolokiaSlf4jAdapter" -Dname=PartyA -jar /samples-kotlin/Basic/flow-database-access/build/nodes/PartyA/corda.jar else sleep infinity fi diff --git a/tools/docker/corda-all-in-one/corda-v4_8-flowdb/run-party-b-node.sh b/tools/docker/corda-all-in-one/corda-v4_8-flowdb/run-party-b-node.sh deleted file mode 100755 index d2152ee736..0000000000 --- a/tools/docker/corda-all-in-one/corda-v4_8-flowdb/run-party-b-node.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -set -e - -if [ "$PARTY_B_NODE_ENABLED" = "true" ] -then - java -Dcapsule.jvm.args="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5006 -javaagent:drivers/jolokia-jvm-1.6.0-agent.jar=port=7006,logHandlerClass=net.corda.node.JolokiaSlf4jAdapter" -Dname=ParticipantB -jar /samples-kotlin/Basic/flow-database-access/build/nodes/ParticipantB/corda.jar -else - sleep infinity -fi diff --git a/tools/docker/corda-all-in-one/corda-v4_8-flowdb/run-party-b-server.sh b/tools/docker/corda-all-in-one/corda-v4_8-flowdb/run-party-b-server.sh deleted file mode 100755 index 5c44139861..0000000000 --- a/tools/docker/corda-all-in-one/corda-v4_8-flowdb/run-party-b-server.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -set -e - -if [ "$PARTY_B_WEB_SRV_ENABLED" = "true" ] -then - ./gradlew runPartyBServer -else - sleep infinity -fi diff --git a/tools/docker/corda-all-in-one/corda-v4_8-flowdb/run-party-c-node.sh b/tools/docker/corda-all-in-one/corda-v4_8-flowdb/run-party-c-node.sh deleted file mode 100755 index 8a35dc11fc..0000000000 --- a/tools/docker/corda-all-in-one/corda-v4_8-flowdb/run-party-c-node.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -set -e - -if [ "$PARTY_C_NODE_ENABLED" = "true" ] -then - java \ - -Dcapsule.jvm.args="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5007 -javaagent:drivers/jolokia-jvm-1.6.0-agent.jar=port=7007,logHandlerClass=net.corda.node.JolokiaSlf4jAdapter" \ - -Dname=ParticipantC \ - -jar \ - /samples-kotlin/Basic/flow-database-access/build/nodes/ParticipantC/corda.jar -else - sleep infinity -fi diff --git a/tools/docker/corda-all-in-one/corda-v4_8-flowdb/run-party-c-server.sh b/tools/docker/corda-all-in-one/corda-v4_8-flowdb/run-party-c-server.sh deleted file mode 100755 index f74b84609c..0000000000 --- a/tools/docker/corda-all-in-one/corda-v4_8-flowdb/run-party-c-server.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -set -e - -if [ "$PARTY_C_WEB_SRV_ENABLED" = "true" ] -then - ./gradlew runPartyCServer -else - sleep infinity -fi diff --git a/tools/docker/corda-all-in-one/corda-v4_8-flowdb/supervisord.conf b/tools/docker/corda-all-in-one/corda-v4_8-flowdb/supervisord.conf index f3c9e3248d..31404e5a18 100644 --- a/tools/docker/corda-all-in-one/corda-v4_8-flowdb/supervisord.conf +++ b/tools/docker/corda-all-in-one/corda-v4_8-flowdb/supervisord.conf @@ -34,7 +34,7 @@ stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0 [program:corda-a] -directory=/samples-kotlin/Basic/flow-database-access/build/nodes/ParticipantA/ +directory=/samples-kotlin/Basic/flow-database-access/build/nodes/PartyA/ command=/run-party-a-node.sh autostart=true autorestart=false @@ -43,66 +43,3 @@ stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0 - -[program:corda-b] -directory=/samples-kotlin/Basic/flow-database-access/build/nodes/ParticipantB -command=/run-party-b-node.sh -autostart=true -autorestart=false -exitcodes=0 -stdout_logfile=/dev/stdout -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/stderr -stderr_logfile_maxbytes=0 - -[program:corda-c] -directory=/samples-kotlin/Basic/flow-database-access/build/nodes/ParticipantC -command=/run-party-c-node.sh -autostart=true -autorestart=false -exitcodes=0 -stdout_logfile=/dev/stdout -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/stderr -stderr_logfile_maxbytes=0 - -[program:corda-n] -directory=/samples-kotlin/Basic/flow-database-access/build/nodes/Notary -command=/run-notary-node.sh -autostart=true -autorestart=false -exitcodes=0 -stdout_logfile=/dev/stdout -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/stderr -stderr_logfile_maxbytes=0 - -[program:corda-run-party-a-server] -directory=/samples-kotlin/Basic/flow-database-access/ -command=/run-party-a-server.sh -autostart=true -autorestart=unexpected -stdout_logfile=/dev/stdout -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/stderr -stderr_logfile_maxbytes=0 - -[program:corda-run-party-b-server] -directory=/samples-kotlin/Basic/flow-database-access/ -command=/run-party-b-server.sh -autostart=true -autorestart=unexpected -stdout_logfile=/dev/stdout -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/stderr -stderr_logfile_maxbytes=0 - -[program:corda-run-party-c-server] -directory=/samples-kotlin/Basic/flow-database-access/ -command=/run-party-c-server.sh -autostart=true -autorestart=unexpected -stdout_logfile=/dev/stdout -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/stderr -stderr_logfile_maxbytes=0