diff --git a/.github/workflows/site_deploy.yml b/.github/workflows/site_deploy.yml index 738a6a94dd..aa4008e455 100644 --- a/.github/workflows/site_deploy.yml +++ b/.github/workflows/site_deploy.yml @@ -13,19 +13,15 @@ on: vcell_build: description: 'build number' required: true - default: '23' + default: '148' vcell_site: - description: 'rel or alpha or test' + description: 'rel or alpha or test (note rel is Swarm, alpha and test are Kubernetes)' required: true default: 'alpha' server_only: description: 'Deploy only the server components?' required: true default: 'false' - deployment_type: - description: 'swarm or kubernetes (choose kubernetes for vcell_site="test")' - required: true - default: 'swarm' jobs: build: name: Build client installers @@ -48,7 +44,7 @@ jobs: echo "VCELL_MANAGER_NODE=vcellapi.cam.uchc.edu" >> $GITHUB_ENV;\ echo "VCELL_INSTALLER_REMOTE_DIR="/share/apps/vcell3/apache_webroot/htdocs/webstart/Rel"" >> $GITHUB_ENV;\ else if [ "${{ github.event.inputs.vcell_site }}" == "alpha" ]; then\ - echo "VCELL_MANAGER_NODE=vcellapi-beta.cam.uchc.edu" >> $GITHUB_ENV;\ + echo "VCELL_MANAGER_NODE=vcellapi.cam.uchc.edu" >> $GITHUB_ENV;\ echo "VCELL_INSTALLER_REMOTE_DIR="/share/apps/vcell3/apache_webroot/htdocs/webstart/Alpha"" >> $GITHUB_ENV;\ else if [ "${{ github.event.inputs.vcell_site }}" == "test" ]; then\ echo "VCELL_MANAGER_NODE=vcellapi.cam.uchc.edu" >> $GITHUB_ENV;\ @@ -212,7 +208,7 @@ jobs: set -ux mvn clean install -DskipTests - name: deploy installers and singularity to kubernetes site and web help to vcell.org - if: ${{ github.event.inputs.deployment_type == 'kubernetes' }} + if: ${{ github.event.inputs.vcell_site != 'rel' }} run: | set -ux cd docker/swarm @@ -237,7 +233,7 @@ jobs: ./deploy-action-kubernetes.sh \ --ssh-user ${{ secrets.CD_FULL_USER }} \ --install-singularity \ - ${VCELL_MANAGER_NODE} \ + ${VCELL_MANAGER_NODE} \ ./${VCELL_CONFIG_FILE_NAME} fi - name: Capitalize first character of site name @@ -246,13 +242,16 @@ jobs: SITE="${{ github.event.inputs.vcell_site }}" SITE_CAPITALIZED="$(tr '[:lower:]' '[:upper:]' <<< ${SITE:0:1})${SITE:1}" VCELL_SWVERSION="${SITE_CAPITALIZED}_Version_${{ github.event.inputs.vcell_version }}_build_${{ github.event.inputs.vcell_build}}" - KUSTOMIZE_OVERLAY="stage" + KUSTOMIZE_OVERLAY='not-specified' + if [ "${{ github.event.inputs.vcell_site }}" == "rel" ]; then KUSTOMIZE_OVERLAY="prod"; fi + if [ "${{ github.event.inputs.vcell_site }}" == "alpha" ]; then KUSTOMIZE_OVERLAY="dev"; fi + if [ "${{ github.event.inputs.vcell_site }}" == "test" ]; then KUSTOMIZE_OVERLAY="stage"; fi CONTAINER_IMAGE_TAG="${{ github.event.inputs.vcell_version }}.${{ github.event.inputs.vcell_build}}" echo "VCELL_SWVERSION=${VCELL_SWVERSION}" >> $GITHUB_ENV echo "KUSTOMIZE_OVERLAY=${KUSTOMIZE_OVERLAY}" >> $GITHUB_ENV echo "CONTAINER_IMAGE_TAG=${CONTAINER_IMAGE_TAG}" >> $GITHUB_ENV - - name: Call webhook to deploy to kubernetes cluster (overlay 'stage') - if: ${{ github.event.inputs.deployment_type == 'kubernetes' }} + - name: Call webhook to deploy to kubernetes cluster (overlay 'prod', 'dev' or 'stage') + if: ${{ github.event.inputs.vcell_site != 'rel' }} run: | git_sha=$(git rev-parse --short "$GITHUB_SHA") echo '{"ref": "main","inputs":{"overlay": "'${KUSTOMIZE_OVERLAY}'","tag":"'${CONTAINER_IMAGE_TAG}'","swversion": "'${VCELL_SWVERSION}'"}}' >body @@ -261,7 +260,7 @@ jobs: -H 'Content-Type: application/json' \ --data "@body" - name: deploy to swarm site - if: ${{ github.event.inputs.deployment_type == 'swarm' }} + if: ${{ github.event.inputs.vcell_site == 'rel' }} run: | set -ux cd docker/swarm diff --git a/docker/swarm/deploy-action-kubernetes.sh b/docker/swarm/deploy-action-kubernetes.sh index 49c738ebf2..7ecce0a8a1 100755 --- a/docker/swarm/deploy-action-kubernetes.sh +++ b/docker/swarm/deploy-action-kubernetes.sh @@ -3,12 +3,12 @@ set -ux show_help() { - echo "Deploys or updates a deployment of VCell on remote Kubernetes cluster" + echo "Deploys vcell client installers, webhelp and singularity images for a Kubernetes deploy" echo "" echo "usage: deploy-action-kubernetes.sh [OPTIONS] REQUIRED-ARGUMENTS" echo "" echo " REQUIRED-ARGUMENTS" - echo " manager-node any node for ssh access ( vcellapi-test.cam.uchc.edu )" + echo " manager-node any node for ssh access (e.g. vcellapi.cam.uchc.edu)" echo "" echo " local-config-file local config file for setting environment" echo "" @@ -38,10 +38,10 @@ show_help() { echo "deploy-action-kubernetes.sh \\" echo " --ssh-user vcell \\" echo " --install_singularity \\" - echo " --build_installers --installer_deploy_dir /share/apps/vcell3/apache_webroot/htdocs/webstart/Test \\" + echo " --build_installers --installer_deploy_dir /share/apps/vcell3/apache_webroot/htdocs/webstart/Alpha \\" echo " --webhelp_local_dir ../../vcell-client/target/classes/vcellDoc \\" echo " --webhelp_deploy_dir /share/apps/vcell3/apache_webroot/htdocs/webstart/VCell_Tutorials/VCell_Help \\" - echo " vcellapi-test.cam.uchc.edu \\" + echo " vcellapi.cam.uchc.edu \\" echo " ./server.config" exit 1 } diff --git a/docker/swarm/serverconfig-uch.sh b/docker/swarm/serverconfig-uch.sh index b5a405c9d9..f3774abe77 100755 --- a/docker/swarm/serverconfig-uch.sh +++ b/docker/swarm/serverconfig-uch.sh @@ -43,76 +43,27 @@ case $VCELL_SITE in VCELL_API_PORT_EXTERNAL=443 VCELL_API_PREFIX_V0="" VCELL_API_PREFIX_V1="" - VCELL_DEBUG_PORT_BASE=5000 _applicationId="1471-8022-1038-5553" ;; - BETA) - _site_port_offset=1 - VCELL_API_HOST_EXTERNAL=vcellapi.cam.uchc.edu - VCELL_S3_EXPORT_BASEURL=https://vcellapi.cam.uchc.edu - VCELL_API_PORT_EXTERNAL=443 - VCELL_API_PREFIX_V0="/api/v0" - VCELL_API_PREFIX_V1="/api/v1" - VCELL_DEBUG_PORT_BASE=5010 - _applicationId="1471-8022-1038-5552" - ;; ALPHA) _site_port_offset=2 - VCELL_API_HOST_EXTERNAL=vcellapi-beta.cam.uchc.edu - VCELL_S3_EXPORT_BASEURL=https://vcellapi-beta.cam.uchc.edu - VCELL_API_PORT_EXTERNAL=8080 + VCELL_API_HOST_EXTERNAL=vcell-dev.cam.uchc.edu + VCELL_S3_EXPORT_BASEURL=https://vcell-dev.cam.uchc.edu + VCELL_API_PORT_EXTERNAL=443 VCELL_API_PREFIX_V0="/api/v0" VCELL_API_PREFIX_V1="/api/v1" - VCELL_DEBUG_PORT_BASE=5020 _applicationId="1471-8022-1038-5554" ;; TEST) _site_port_offset=3 # VCELL_API_PORT_EXTERNAL=8081 - VCELL_API_HOST_EXTERNAL=vcellapi-test.cam.uchc.edu - VCELL_S3_EXPORT_BASEURL=https://vcellapi-test.cam.uchc.edu + VCELL_API_HOST_EXTERNAL=vcell-stage.cam.uchc.edu + VCELL_S3_EXPORT_BASEURL=https://vcell-stage.cam.uchc.edu VCELL_API_PORT_EXTERNAL=443 VCELL_API_PREFIX_V0="/api/v0" VCELL_API_PREFIX_V1="/api/v1" - VCELL_DEBUG_PORT_BASE=5030 _applicationId="1471-8022-1038-5555" ;; - TEST2) - _site_port_offset=4 - VCELL_API_HOST_EXTERNAL=vcellapi-beta.cam.uchc.edu - VCELL_API_PORT_EXTERNAL=8082 - VCELL_API_PREFIX_V0="/api/v0" - VCELL_API_PREFIX_V1="/api/v1" - VCELL_DEBUG_PORT_BASE=5040 - _applicationId="1471-8022-1038-5556" - ;; - TEST3) - _site_port_offset=5 - VCELL_API_HOST_EXTERNAL=vcellapi-beta.cam.uchc.edu - VCELL_API_PORT_EXTERNAL=8083 - VCELL_API_PREFIX_V0="/api/v0" - VCELL_API_PREFIX_V1="/api/v1" - VCELL_DEBUG_PORT_BASE=5050 - _applicationId="1471-8022-1038-5557" - ;; - TEST4) - _site_port_offset=6 - VCELL_API_HOST_EXTERNAL=vcellapi-beta.cam.uchc.edu - VCELL_API_PORT_EXTERNAL=8084 - VCELL_API_PREFIX_V0="/api/v0" - VCELL_API_PREFIX_V1="/api/v1" - VCELL_DEBUG_PORT_BASE=5060 - _applicationId="1471-8022-1038-5558" - ;; - TEST5) - _site_port_offset=7 - VCELL_API_HOST_EXTERNAL=vcellapi-beta.cam.uchc.edu - VCELL_API_PORT_EXTERNAL=8085 - VCELL_API_PREFIX_V0="/api/v0" - VCELL_API_PREFIX_V1="/api/v1" - VCELL_DEBUG_PORT_BASE=5070 - _applicationId="1471-8022-1038-5559" - ;; *) printf 'ERROR: Unknown site: %s\n' "$1" >&2 ;; @@ -141,13 +92,6 @@ VCELL_SLURM_LOCAL_SINGULARITY_DIR=/local/singularityImages VCELL_SLURM_CENTRAL_SINGULARITY_DIR=/share/apps/vcell3/singularityImages VCELL_SLURM_SINGULARITY_MODULE_NAME=singularity/vcell-3.10.0 -# -# VCELL_API_PORT_EXTERNAL uses 443 for Beta and Rel (but on different machines/swarm clusters) -# ALPHA, TEST, TEST2, TEST3, etc. uses ports starting with 8080 -# Note: port 8080 is currently needed by vcell.org website. -# - - VCELL_JMS_SIM_PORT_EXTERNAL=$((61616 + _site_port_offset)) VCELL_JMS_SIM_RESTPORT_EXTERNAL=$((8161 + _site_port_offset)) VCELL_MONGO_PORT_EXTERNAL=$((27017 + _site_port_offset)) @@ -173,7 +117,7 @@ VCELL_SSH_CMD_RESTORE_TIMEOUT=5 # # write out the environment file to be for: # 1. deployment actions (e.g. deploy-action-swarm.sh or deploy-action-kubernetes.sh) -# 2. runtime environment for the docker stack run command +# 2. runtime environment for the docker stack run command (Docker swarm mode only, kubernetes uses ConfigMaps in vcell-fluxcd repo) # cat <"$_outputfile" VCELL_API_HOST_EXTERNAL=$VCELL_API_HOST_EXTERNAL diff --git a/pom.xml b/pom.xml index 95d2c38db2..9ded4540c8 100644 --- a/pom.xml +++ b/pom.xml @@ -97,6 +97,8 @@ 5.18.3 1.4 1.2 + 1.70 + 1.70 6.7.0 ${bio-formats.version} 6.0.4 @@ -123,6 +125,7 @@ 2.3.0 ${imagej2.version} 2.1.7 + 3.0.5 2.15.2 2.15.2 2.15.2 @@ -172,7 +175,7 @@ 2.9.0 2.9.0 2.0.9 - 0.38.0 + 0.35.0 2.8.0 1.4.20 1.2.5 diff --git a/vcell-core/pom.xml b/vcell-core/pom.xml index a78f4a6534..abcbef912c 100644 --- a/vcell-core/pom.xml +++ b/vcell-core/pom.xml @@ -243,7 +243,34 @@ com.lowagie itext ${itext.version} + + + org.bouncycastle + bcmail-jdk14 + + + org.bouncycastle + bcprov-jdk14 + + + org.bouncycastle + bctsp-jdk14 + + + + + + org.bouncycastle + bcprov-jdk15on + ${bcprov-jdk15on.version} + + + org.bouncycastle + bcpkix-jdk15on + ${bcpkix-jdk15on.version} + + org.apache.commons diff --git a/vcell-core/src/main/java/cbit/vcell/solvers/mb/MovingBoundaryReader.java b/vcell-core/src/main/java/cbit/vcell/solvers/mb/MovingBoundaryReader.java index 238e85e756..4d13c94983 100644 --- a/vcell-core/src/main/java/cbit/vcell/solvers/mb/MovingBoundaryReader.java +++ b/vcell-core/src/main/java/cbit/vcell/solvers/mb/MovingBoundaryReader.java @@ -141,40 +141,40 @@ void testquery(){ } private double[] getDoubleArray(String... names){ - MovingBoundardyVH5TypedPath dpath = new MovingBoundardyVH5TypedPath(root, double[].class, names); + MovingBoundaryVH5TypedPath dpath = new MovingBoundaryVH5TypedPath(root, double[].class, names); return dpath.get(); } private double singleDouble(String... names){ double[] a = getDoubleArray(names); if(a.length != 1){ - throw new MovingBoundaryResultException(MovingBoundardyVH5Path.concat(names) + " is not single element array"); + throw new MovingBoundaryResultException(MovingBoundaryVH5Path.concat(names) + " is not single element array"); } return a[0]; } private long[] getLongArray(String... names){ - MovingBoundardyVH5TypedPath dpath = new MovingBoundardyVH5TypedPath(root, long[].class, names); + MovingBoundaryVH5TypedPath dpath = new MovingBoundaryVH5TypedPath(root, long[].class, names); return dpath.get(); } private long singleLong(String... names){ long[] a = getLongArray(names); if(a.length != 1){ - throw new MovingBoundaryResultException(MovingBoundardyVH5Path.concat(names) + " is not single element array"); + throw new MovingBoundaryResultException(MovingBoundaryVH5Path.concat(names) + " is not single element array"); } return a[0]; } private int[] getIntArray(String... names){ - MovingBoundardyVH5TypedPath dpath = new MovingBoundardyVH5TypedPath(root, int[].class, names); + MovingBoundaryVH5TypedPath dpath = new MovingBoundaryVH5TypedPath(root, int[].class, names); return dpath.get(); } private int singleInt(String... names){ int[] a = getIntArray(names); if(a.length != 1){ - throw new MovingBoundaryResultException(MovingBoundardyVH5Path.concat(names) + " is not single element array"); + throw new MovingBoundaryResultException(MovingBoundaryVH5Path.concat(names) + " is not single element array"); } return a[0]; } @@ -400,10 +400,10 @@ private class PlaneNodes { final H5CompoundDS species; PlaneNodes() throws Exception{ - MovingBoundardyVH5TypedPath dpath = new MovingBoundardyVH5TypedPath(root, H5CompoundDS.class, "elements"); + MovingBoundaryVH5TypedPath dpath = new MovingBoundaryVH5TypedPath(root, H5CompoundDS.class, "elements"); elements = dpath.get(); elements.read(); - dpath = new MovingBoundardyVH5TypedPath(root, H5CompoundDS.class, "species"); + dpath = new MovingBoundaryVH5TypedPath(root, H5CompoundDS.class, "species"); species = dpath.get(); species.read(); } @@ -441,7 +441,7 @@ public int[] getBoundaryIndexes(int timeIndex){ VCAssert.assertTrue(timeIndex >= 0, "negative time index"); validateTimeIndex(timeIndex); - MovingBoundardyVH5TypedPath path = new MovingBoundardyVH5TypedPath<>(root, H5ScalarDS.class, "boundaries"); + MovingBoundaryVH5TypedPath path = new MovingBoundaryVH5TypedPath<>(root, H5ScalarDS.class, "boundaries"); H5ScalarDS hsd = path.get(); hsd.init(); long[] start = hsd.getStartDims(); diff --git a/vcell-core/src/main/java/cbit/vcell/solvers/mb/MovingBoundardyVH5Path.java b/vcell-core/src/main/java/cbit/vcell/solvers/mb/MovingBoundaryVH5Path.java similarity index 94% rename from vcell-core/src/main/java/cbit/vcell/solvers/mb/MovingBoundardyVH5Path.java rename to vcell-core/src/main/java/cbit/vcell/solvers/mb/MovingBoundaryVH5Path.java index a175262350..e9e23885b0 100644 --- a/vcell-core/src/main/java/cbit/vcell/solvers/mb/MovingBoundardyVH5Path.java +++ b/vcell-core/src/main/java/cbit/vcell/solvers/mb/MovingBoundaryVH5Path.java @@ -24,18 +24,18 @@ * * @author GWeatherby */ -public class MovingBoundardyVH5Path { +public class MovingBoundaryVH5Path { protected Object target; protected Exception exc; - protected static final Logger lg = LogManager.getLogger(MovingBoundardyVH5Path.class); + protected static final Logger lg = LogManager.getLogger(MovingBoundaryVH5Path.class); /** * @param g staring point, not null * @param names path to search */ - public MovingBoundardyVH5Path(Group g, String... names){ + public MovingBoundaryVH5Path(Group g, String... names){ target = null; exc = null; try { diff --git a/vcell-core/src/main/java/cbit/vcell/solvers/mb/MovingBoundardyVH5TypedPath.java b/vcell-core/src/main/java/cbit/vcell/solvers/mb/MovingBoundaryVH5TypedPath.java similarity index 93% rename from vcell-core/src/main/java/cbit/vcell/solvers/mb/MovingBoundardyVH5TypedPath.java rename to vcell-core/src/main/java/cbit/vcell/solvers/mb/MovingBoundaryVH5TypedPath.java index d9d5b4358d..03256d2940 100644 --- a/vcell-core/src/main/java/cbit/vcell/solvers/mb/MovingBoundardyVH5TypedPath.java +++ b/vcell-core/src/main/java/cbit/vcell/solvers/mb/MovingBoundaryVH5TypedPath.java @@ -17,9 +17,9 @@ * @param type of returned data. primitives not supported, autoboxing not supported * @author GWeatherby */ -public class MovingBoundardyVH5TypedPath extends MovingBoundardyVH5Path { +public class MovingBoundaryVH5TypedPath extends MovingBoundaryVH5Path { - public MovingBoundardyVH5TypedPath(Group g, Class clzz, String... names){ + public MovingBoundaryVH5TypedPath(Group g, Class clzz, String... names){ super(g, names); Objects.requireNonNull(clzz); if(clzz.isPrimitive()){ diff --git a/vcell-core/src/test/java/cbit/vcell/solvers/mb/MovingBoundaryH5Client.java b/vcell-core/src/test/java/cbit/vcell/solvers/mb/MovingBoundaryH5Client.java deleted file mode 100644 index 4b7ab22745..0000000000 --- a/vcell-core/src/test/java/cbit/vcell/solvers/mb/MovingBoundaryH5Client.java +++ /dev/null @@ -1,48 +0,0 @@ -package cbit.vcell.solvers.mb; - -import cbit.vcell.resource.NativeLib; -import cbit.vcell.resource.PropertyLoader; -import ncsa.hdf.object.DataFormat; -import org.apache.commons.lang3.StringUtils; - -import java.util.List; - -/** - * setup logging, load HDF5 native - * @author GWeatherby - * - */ -public class MovingBoundaryH5Client { - -// protected static String FILE = "nformat.h5"; - protected static String FILE = "nformat2.h5"; -// protected static String FILE = "fig43-10-1.h5"; - - public MovingBoundaryH5Client() { - PropertyLoader.setProperty(PropertyLoader.installationRoot, "."); - NativeLib.HDF5.load(); - } - - @SuppressWarnings("unchecked") - public static String parseMeta(DataFormat df) { - try { - List meta = null; - try { - meta = df.getMetadata(); - } catch (NullPointerException npe) { - //HDF Java 5.11 throws these sometimes - } - if (meta != null) { - return StringUtils.join(meta); - } - else { - return "no meta"; - } - } catch (Exception e) { - throw new RuntimeException("printMeta", e); - } - - - } - -} diff --git a/vcell-core/src/test/java/cbit/vcell/solvers/mb/MovingBoundaryH5FileStructureTest.java b/vcell-core/src/test/java/cbit/vcell/solvers/mb/MovingBoundaryH5FileStructureTest.java index 06acea76b7..bd80ae5597 100644 --- a/vcell-core/src/test/java/cbit/vcell/solvers/mb/MovingBoundaryH5FileStructureTest.java +++ b/vcell-core/src/test/java/cbit/vcell/solvers/mb/MovingBoundaryH5FileStructureTest.java @@ -14,12 +14,17 @@ package cbit.vcell.solvers.mb; +import cbit.vcell.resource.NativeLib; +import cbit.vcell.resource.PropertyLoader; import ncsa.hdf.object.*; import ncsa.hdf.object.h5.H5File; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.vcell.util.CastingUtils; +import java.io.File; + /** *

* Title: HDF Object Package (Java) Example @@ -45,11 +50,17 @@ * @version 2.4 */ @Tag("Fast") -public class MovingBoundaryH5FileStructureTest extends MovingBoundaryH5Client { - private static String fname = FILE; +public class MovingBoundaryH5FileStructureTest { + private static String fname = "nformat2.h5"; private static long[] dims2D = {20, 10}; private static long[] dims3D = {20, 10, 5}; + @BeforeAll + public static void setup() { + PropertyLoader.setProperty(PropertyLoader.installationRoot, new File("..").getAbsolutePath()); + NativeLib.HDF5.load(); + } + //public static void main(String args[]) throws Exception { @Test public void run(){ diff --git a/vcell-core/src/test/java/cbit/vcell/solvers/mb/MovingBoundaryResultTest.java b/vcell-core/src/test/java/cbit/vcell/solvers/mb/MovingBoundaryResultTest.java index 0a6abd8c28..a0f69f9b25 100644 --- a/vcell-core/src/test/java/cbit/vcell/solvers/mb/MovingBoundaryResultTest.java +++ b/vcell-core/src/test/java/cbit/vcell/solvers/mb/MovingBoundaryResultTest.java @@ -1,20 +1,30 @@ package cbit.vcell.solvers.mb; +import cbit.vcell.resource.NativeLib; +import cbit.vcell.resource.PropertyLoader; import cbit.vcell.solvers.mb.MovingBoundaryTypes.*; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; +import java.io.File; import java.util.Arrays; @Disabled @Tag("Fast") -public class MovingBoundaryResultTest extends MovingBoundaryH5Client { - private static String fname = FILE; +public class MovingBoundaryResultTest { + private static String fname = "nformat2.h5"; MovingBoundaryReader mbr; + + @BeforeAll + public static void setup() { + PropertyLoader.setProperty(PropertyLoader.installationRoot, new File("..").getAbsolutePath()); + NativeLib.HDF5.load(); + } public MovingBoundaryResultTest() { Logger lg = LogManager.getLogger("ncsa"); mbr = new MovingBoundaryReader(fname); diff --git a/vcell-core/src/test/java/cbit/vcell/solvers/mb/MovingBoundaryVH5Dataset.java b/vcell-core/src/test/java/cbit/vcell/solvers/mb/MovingBoundaryVH5Dataset.java index 1380d2ac06..d911bc5766 100644 --- a/vcell-core/src/test/java/cbit/vcell/solvers/mb/MovingBoundaryVH5Dataset.java +++ b/vcell-core/src/test/java/cbit/vcell/solvers/mb/MovingBoundaryVH5Dataset.java @@ -6,6 +6,7 @@ import java.util.Objects; import java.util.Vector; +import ncsa.hdf.object.DataFormat; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.vcell.util.CastingUtils; @@ -77,7 +78,26 @@ public static void info(H5ScalarDS ds) throws Exception{ // dt = dt.getBasetype(); System.out.println(nt.getFullName()); System.out.println(nt.getDatatypeDescription()); - System.out.println(MovingBoundaryH5Client.parseMeta(dt)); + String result; + try { + List meta = null; + try { + meta = ((DataFormat) dt).getMetadata(); + } catch (NullPointerException npe) { + //HDF Java 5.11 throws these sometimes + } + if (meta != null) { + result = StringUtils.join(meta); + } + else { + result = "no meta"; + } + } catch (Exception e) { + throw new RuntimeException("printMeta", e); + } + + + System.out.println(result); // ds.init(); // int did = ds.open(); diff --git a/vcell-core/src/test/java/cbit/vcell/solvers/mb/MovingBoundardyVH5PathTest.java b/vcell-core/src/test/java/cbit/vcell/solvers/mb/MovingBoundaryVH5PathTest.java similarity index 73% rename from vcell-core/src/test/java/cbit/vcell/solvers/mb/MovingBoundardyVH5PathTest.java rename to vcell-core/src/test/java/cbit/vcell/solvers/mb/MovingBoundaryVH5PathTest.java index 9c6a2e59a3..1cf8988a54 100644 --- a/vcell-core/src/test/java/cbit/vcell/solvers/mb/MovingBoundardyVH5PathTest.java +++ b/vcell-core/src/test/java/cbit/vcell/solvers/mb/MovingBoundaryVH5PathTest.java @@ -14,25 +14,32 @@ package cbit.vcell.solvers.mb; +import cbit.vcell.resource.NativeLib; +import cbit.vcell.resource.PropertyLoader; import cern.colt.Arrays; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.Group; import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.*; +import java.io.File; + import static org.junit.jupiter.api.Assertions.assertThrows; @Disabled @Tag("Fast") -public class MovingBoundardyVH5PathTest extends MovingBoundaryH5Client { - private static String fname = FILE; +public class MovingBoundaryVH5PathTest { + private static String fname = "nformat2.h5"; private FileFormat testFile = null; private Group root = null; @BeforeEach public void setup( ) throws Exception { + PropertyLoader.setProperty(PropertyLoader.installationRoot, new File("..").getAbsolutePath()); + NativeLib.HDF5.load(); + - // retrieve an instance of H5File + // retrieve an instance of H5File FileFormat fileFormat = FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5); if (fileFormat == null) { @@ -65,25 +72,25 @@ public void run() { // create the file and add groups ans dataset into the file try { Group root = (Group) ((javax.swing.tree.DefaultMutableTreeNode) testFile.getRootNode()).getUserObject(); - MovingBoundardyVH5Path vpath = new MovingBoundardyVH5Path(root, "elements" ,"volume"); + MovingBoundaryVH5Path vpath = new MovingBoundaryVH5Path(root, "elements" ,"volume"); System.out.println(vpath.foundType()); - MovingBoundardyVH5TypedPath tpath = new MovingBoundardyVH5TypedPath(root, double[].class,"elements" ,"volume"); + MovingBoundaryVH5TypedPath tpath = new MovingBoundaryVH5TypedPath(root, double[].class,"elements" ,"volume"); double[] e = tpath.get(); System.out.println(e[0]); - MovingBoundardyVH5Path bpPath = new MovingBoundardyVH5Path(root, "elements" ,"boundaryPosition"); + MovingBoundaryVH5Path bpPath = new MovingBoundaryVH5Path(root, "elements" ,"boundaryPosition"); Object data = bpPath.getData(); System.out.println(data.getClass().getSimpleName()); - MovingBoundardyVH5Path vpPath = new MovingBoundardyVH5Path(root, "elements" ,"volumePoints"); + MovingBoundaryVH5Path vpPath = new MovingBoundaryVH5Path(root, "elements" ,"volumePoints"); data = vpPath.getData(); System.out.println(data.getClass().getSimpleName()); // MovingBoundardyVH5TypedPath spath = new MovingBoundardyVH5TypedPath(root, String[].class,"elements" ,"front description"); - MovingBoundardyVH5TypedPath spath = new MovingBoundardyVH5TypedPath(root, String.class,"elements" ,"front description"); + MovingBoundaryVH5TypedPath spath = new MovingBoundaryVH5TypedPath(root, String.class,"elements" ,"front description"); // String[] sdata = spath.get(); // System.out.println(sdata[0]); System.out.println(spath.get( )); - MovingBoundardyVH5Path xpath = new MovingBoundardyVH5Path(root, "elements" ,"front description"); + MovingBoundaryVH5Path xpath = new MovingBoundaryVH5Path(root, "elements" ,"front description"); Object o = xpath.getData(); System.out.println(o); dtype("elements","endX"); @@ -94,9 +101,9 @@ public void run() { dtype("solverTimeStep"); dtype("timeStep"); dtype("timeStepTimes"); - MovingBoundardyVH5TypedPath ipath = new MovingBoundardyVH5TypedPath(root, int[].class,"lastTimeIndex"); + MovingBoundaryVH5TypedPath ipath = new MovingBoundaryVH5TypedPath(root, int[].class,"lastTimeIndex"); System.out.println(Arrays.toString(ipath.get())); - MovingBoundardyVH5TypedPath lpath = new MovingBoundardyVH5TypedPath(root, long[].class,"elements","numX"); + MovingBoundaryVH5TypedPath lpath = new MovingBoundaryVH5TypedPath(root, long[].class,"elements","numX"); System.out.println(Arrays.toString(lpath.get())); // System.out.println("-------"); // MovingBoundardyVH5TypedPath spath = new MovingBoundardyVH5TypedPath(root, H5ScalarDS.class,"endTime"); @@ -117,7 +124,7 @@ public void run() { } private void dtype(String ...name) { - MovingBoundardyVH5TypedPath dpath = new MovingBoundardyVH5TypedPath(root, double[].class,name); + MovingBoundaryVH5TypedPath dpath = new MovingBoundaryVH5TypedPath(root, double[].class,name); System.out.println(StringUtils.join(name,'/') + ' ' + Arrays.toString(dpath.get())); } @@ -125,7 +132,7 @@ private void dtype(String ...name) { @Test public void badType () { assertThrows(UnsupportedOperationException.class, () -> { - MovingBoundardyVH5TypedPath ipath = new MovingBoundardyVH5TypedPath(root, int[].class,"elements" ,"volume"); + MovingBoundaryVH5TypedPath ipath = new MovingBoundaryVH5TypedPath(root, int[].class,"elements" ,"volume"); System.out.println(ipath); }); } @@ -133,7 +140,7 @@ public void badType () { @Test public void primType () { assertThrows(UnsupportedOperationException.class, () -> { - MovingBoundardyVH5TypedPath ipath = new MovingBoundardyVH5TypedPath(root, int.class,"elements" ,"volume"); + MovingBoundaryVH5TypedPath ipath = new MovingBoundaryVH5TypedPath(root, int.class,"elements" ,"volume"); System.out.println(ipath); }); } diff --git a/vcell-rest/pom.xml b/vcell-rest/pom.xml index a320b8fb13..e3828731cc 100644 --- a/vcell-rest/pom.xml +++ b/vcell-rest/pom.xml @@ -100,7 +100,7 @@ io.quarkiverse.itext quarkus-itext - 3.0.5 + ${quarkus-itext.version} com.nimbusds @@ -138,6 +138,10 @@ org.apache.logging.log4j log4j-core + + com.lowagie + itext + diff --git a/vcell-server/pom.xml b/vcell-server/pom.xml index 3e51576e74..c8fdb1fd72 100644 --- a/vcell-server/pom.xml +++ b/vcell-server/pom.xml @@ -135,19 +135,5 @@ - - - org.bouncycastle - bcprov-jdk15on - 1.70 - - - - - org.bouncycastle - bcpkix-jdk15on - 1.70 - - diff --git a/vcell-server/src/main/java/org/vcell/auth/JWTUtils.java b/vcell-server/src/main/java/org/vcell/auth/JWTUtils.java index 824d19918a..3a3e8e1039 100644 --- a/vcell-server/src/main/java/org/vcell/auth/JWTUtils.java +++ b/vcell-server/src/main/java/org/vcell/auth/JWTUtils.java @@ -1,14 +1,8 @@ package org.vcell.auth; import cbit.vcell.resource.PropertyLoader; -import com.nimbusds.jwt.proc.DefaultJWTClaimsVerifier; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.bouncycastle.asn1.pkcs.PrivateKeyInfo; -import org.bouncycastle.jce.provider.BouncyCastleProvider; -import org.bouncycastle.openssl.PEMKeyPair; -import org.bouncycastle.openssl.PEMParser; -import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter; import org.jose4j.jwa.AlgorithmConstraints; import org.jose4j.jwk.RsaJsonWebKey; import org.jose4j.jwk.RsaJwkGenerator; @@ -24,12 +18,20 @@ import org.jose4j.lang.JoseException; import org.vcell.util.document.User; -import java.io.FileReader; import java.io.IOException; +import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.security.KeyFactory; +import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.PublicKey; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; import java.util.Arrays; +import java.util.Base64; import java.util.List; import java.util.stream.Collectors; @@ -63,24 +65,25 @@ synchronized static void createRsaJsonWebKeyIfNeeded() throws JoseException { } try { // Read public key from file - FileReader reader = new FileReader(publicKeyFilePath); - PEMParser pemParser = new PEMParser(reader); - JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider(new BouncyCastleProvider()); - PublicKey publicKey = converter.getPublicKey((org.bouncycastle.asn1.x509.SubjectPublicKeyInfo) pemParser.readObject()); + String publicKeyFromFile = Files.readString(Paths.get(publicKeyFilePath), Charset.defaultCharset()); + String publicKeyEncoded = publicKeyFromFile + .replace("-----BEGIN PUBLIC KEY-----", "") + .replace("-----END PUBLIC KEY-----","") + .replace(System.lineSeparator(), ""); + byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyEncoded); + X509EncodedKeySpec publicSpec = new X509EncodedKeySpec(publicKeyBytes); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + PublicKey publicKey = keyFactory.generatePublic(publicSpec); // Read private key from file - reader = new FileReader(privateKeyFilePath); - pemParser = new PEMParser(reader); - Object keyPairObject = pemParser.readObject(); - final PrivateKeyInfo privateKeyInfo; - if (keyPairObject instanceof PEMKeyPair pemKeyPair) { - privateKeyInfo = pemKeyPair.getPrivateKeyInfo(); - } else if (keyPairObject instanceof org.bouncycastle.asn1.pkcs.PrivateKeyInfo pkcsPrivateKeyInfo) { - privateKeyInfo = pkcsPrivateKeyInfo; - } else { - throw new RuntimeException("Error reading private key file"); - } - PrivateKey privateKey = converter.getPrivateKey(privateKeyInfo); + String privateKeyFromFile = Files.readString(Paths.get(privateKeyFilePath), Charset.defaultCharset()); + String privateKeyEncoded = privateKeyFromFile + .replace("-----BEGIN PRIVATE KEY-----", "") + .replace("-----END PRIVATE KEY-----","") + .replace(System.lineSeparator(), ""); + byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyEncoded); + PKCS8EncodedKeySpec privateSpec = new PKCS8EncodedKeySpec(privateKeyBytes); + PrivateKey privateKey = keyFactory.generatePrivate(privateSpec); // Create RsaJsonWebKey RsaJsonWebKey rsaJsonWebKey = new RsaJsonWebKey((java.security.interfaces.RSAPublicKey) publicKey); @@ -89,7 +92,7 @@ synchronized static void createRsaJsonWebKeyIfNeeded() throws JoseException { rsaJsonWebKey.setKeyId("k1"); JWTUtils.rsaJsonWebKey = rsaJsonWebKey; - } catch (IOException e) { + } catch (IOException | NoSuchAlgorithmException | InvalidKeySpecException e) { throw new RuntimeException("Error reading public/private key files", e); } } diff --git a/vcell-server/src/test/java/org/vcell/auth/JWTUtilsTest.java b/vcell-server/src/test/java/org/vcell/auth/JWTUtilsTest.java index 4a15f06631..9ace49d195 100644 --- a/vcell-server/src/test/java/org/vcell/auth/JWTUtilsTest.java +++ b/vcell-server/src/test/java/org/vcell/auth/JWTUtilsTest.java @@ -100,6 +100,30 @@ public void testJWT() throws JoseException, MalformedClaimException { User user = new User.SpecialUser("testuser", new KeyValue("12345"), new User.SPECIAL_CLAIM[0]); + NumericDate expirationDate = NumericDate.now(); + expirationDate.addSeconds(1); + String token1 = JWTUtils.createToken(user, expirationDate); + assertTrue(verifyJWS(token1), "expect valid token"); + + // test expiration date by setting the expiration date 31 seconds in the past (there is a 30 second tolerance) + expirationDate = NumericDate.now(); + expirationDate.addSeconds(-31); + String token2 = JWTUtils.createToken(user, expirationDate); + assertFalse(verifyJWS(token2), "expect timeout"); + + // install a different JsonWebKey and see that both tokens are invalid + RsaJsonWebKey rsaJsonWebKey2 = JWTUtils.createNewJsonWebKey("k2"); + JWTUtils.setRsaJsonWebKey(rsaJsonWebKey2); + assertFalse(verifyJWS(token1), "expect invalid token1, wrong signature"); + assertFalse(verifyJWS(token2), "expect invalid token2, wrong signature"); + } + + @Test + public void testJWTWithStoredKeys() throws JoseException, MalformedClaimException { + // test with keys stored in files + JWTUtils.setRsaJsonWebKey(null); + User user = new User.SpecialUser("testuser", new KeyValue("12345"), new User.SPECIAL_CLAIM[0]); + NumericDate expirationDate = NumericDate.now(); expirationDate.addSeconds(1); String token1 = JWTUtils.createToken(user, expirationDate);