Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
bc450e1
Add parameter estimation service migration plan
jcschaff Apr 8, 2026
1931a6d
Add optimization job database schema, DTOs, and service layer
jcschaff Apr 8, 2026
3c99032
Add REST endpoints for parameter estimation optimization
jcschaff Apr 8, 2026
51973af
Refactor optimization job ID from UUID to bigint database sequence key
jcschaff Apr 8, 2026
2c328d3
Add GET /api/v1/optimization endpoint to list user's optimization jobs
jcschaff Apr 8, 2026
2ddc778
Add ActiveMQ messaging for optimization job dispatch and status
jcschaff Apr 8, 2026
c748e86
Add JMS queue listener for optimization requests on vcell-submit side
jcschaff Apr 8, 2026
2e6211e
Consolidate optimization message types into vcell-core
jcschaff Apr 8, 2026
36d4316
Add Quarkus integration tests for optimization REST endpoints
jcschaff Apr 8, 2026
90c24b4
Consolidate OpenAPI scripts and regenerate clients with optimization …
jcschaff Apr 8, 2026
7d62d42
Add generated-client tests for optimization API
jcschaff Apr 8, 2026
5fa8d8b
Update desktop client to use generated OptimizationResourceApi
jcschaff Apr 8, 2026
248681b
Connect optimization queue listener to Artemis broker
jcschaff Apr 8, 2026
14bbfbc
Fix CI test failure: make parest data dir configurable
jcschaff Apr 8, 2026
1a8f1b0
Fix CodeQL path traversal warnings in optimization job handler
jcschaff Apr 8, 2026
9d625bb
Add E2E test for optimization and refactor solver for testability
jcschaff Apr 8, 2026
91dbd42
Add database design patterns documentation
jcschaff Apr 9, 2026
08c488b
Add OptJobTable and comply with VCell database conventions
jcschaff Apr 9, 2026
093ce26
Configure AMQP connection to Artemis broker
jcschaff Apr 9, 2026
6275a14
Fix export tests: use ManagedExecutor for CDI context propagation
jcschaff Apr 9, 2026
370bf7b
Parallelize Docker image builds with matrix strategy
jcschaff Apr 9, 2026
a65e4d7
Fix CI: upload all Maven target dirs, full rebuild for rest/exporter
jcschaff Apr 9, 2026
35de69d
Fix AMQP address mapping and JDBC resource leaks in optimization service
jcschaff Apr 9, 2026
cf58741
Add Artemis broker config to vcell-submit Dockerfile
jcschaff Apr 10, 2026
0003cfb
Add ANYCAST capabilities to AMQP channels for Artemis cross-protocol …
jcschaff Apr 10, 2026
0e4f1f3
Add cross-protocol integration test for optimization AMQP messaging
jcschaff Apr 10, 2026
b66c49d
Fix CI: remove unused ActiveMQ import from QuarkusStartUpTasks
jcschaff Apr 10, 2026
1897d7f
Fix progress reporting for all active optimization states
jcschaff Apr 10, 2026
4f157bc
Update parameter estimation design doc with deployment learnings
jcschaff Apr 10, 2026
b7ac2e5
Fix COPASI progress buffering and remove broken mkdir in SlurmProxy
jcschaff Apr 11, 2026
fd99ebb
Add requirements section and post-migration notes to design doc
jcschaff Apr 11, 2026
629888a
Upgrade COPASI/basico and modernize vcell-opt Docker image
jcschaff Apr 11, 2026
98e1a67
Remove legacy optimization socket server and /api/v0/optimization end…
jcschaff Apr 11, 2026
fb928f9
Remove dead vcell.submit.service.host property and Dockerfile reference
jcschaff Apr 11, 2026
a7c832b
Rewrite parameter estimation design doc as maintenance reference
jcschaff Apr 11, 2026
f5b526b
Increase optimization polling timeout from 200 seconds to 10 minutes
jcschaff Apr 11, 2026
58a59f1
Fix CodeQL path traversal warnings in SlurmProxy and test stub
jcschaff Apr 12, 2026
496547e
Fix CodeQL partial path traversal alert #226
jcschaff Apr 15, 2026
bcce9a9
Merge remote-tracking branch 'origin/master' into parest-bug
jcschaff Apr 15, 2026
7d68604
Fail fast when notarytool submit fails
jcschaff Apr 15, 2026
e57a07c
Restore executable permission on langevin_x64 in batch container
jcschaff Apr 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
289 changes: 224 additions & 65 deletions .github/workflows/CI-full.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,36 @@ on:
tag:
description: "Repository tag (e.g., 7.7.0.37)"
required: true
# client_only:
# description: "Build only client images (true/false)"
# required: false
# default: "false"
release:
types: [published]

env:
python-version: "3.10"

jobs:
build:
setup:
runs-on: ubuntu-22.04
outputs:
vcell_tag: ${{ steps.set-vars.outputs.vcell_tag }}
vcell_repo_namespace: ${{ steps.set-vars.outputs.vcell_repo_namespace }}
friendly_tag: ${{ steps.set-vars.outputs.friendly_tag }}
steps:
- uses: actions/checkout@v4

- name: set global environment variables
id: set-vars
run: |
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
echo "friendly_tag=${{ github.event.inputs.tag }}" >> $GITHUB_OUTPUT
else
echo "friendly_tag=${GITHUB_REF:10}" >> $GITHUB_OUTPUT
fi
echo "vcell_tag=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
echo "vcell_repo_namespace=ghcr.io/virtualcell" >> $GITHUB_OUTPUT

maven-build:
runs-on: ubuntu-22.04
needs: setup
steps:
- name: Free up VM's disk space
run: |
Expand All @@ -30,37 +47,12 @@ jobs:

- uses: actions/checkout@v4

- name: set global environment variables
run: |
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
echo "FRIENDLY_TAG=${{ github.event.inputs.tag }}" >> $GITHUB_ENV
else
echo "FRIENDLY_TAG=${GITHUB_REF:10}" >> $GITHUB_ENV
fi
echo "VCELL_TAG=`git rev-parse --short HEAD`" >> $GITHUB_ENV
echo "VCELL_REPO_NAMESPACE=ghcr.io/virtualcell" >> $GITHUB_ENV
echo "VCELL_DEPLOY_REMOTE_DIR=/share/apps/vcell3/deployed_github" >> $GITHUB_ENV
echo "VCELL_MANAGER_NODE=vcellapi.cam.uchc.edu" >> $GITHUB_ENV
- name: setup ssh-agent
uses: webfactory/ssh-agent@v0.8.0
with:
ssh-private-key: ${{ secrets.VC_KEY }}
- name: get installer secrets
run: |
ssh-keyscan ${VCELL_MANAGER_NODE} >> ~/.ssh/known_hosts
sudo mkdir /usr/local/deploy
sudo chmod 777 /usr/local/deploy
cd /usr/local/deploy
scp ${{ secrets.CD_FULL_USER }}@${VCELL_MANAGER_NODE}:${VCELL_DEPLOY_REMOTE_DIR}/deploy_dir_2025_03_18.tar .
cd ..
sudo tar -xvf deploy/deploy_dir_2025_03_18.tar
sudo chmod 777 -R deploy
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ env.python-version }}
cache: "pip"

- name: Install Dependencies
run: pip install -r requirements.txt

Expand All @@ -81,42 +73,209 @@ jobs:
java-version: '17'
cache: 'maven'

- name: build and publish all images
shell: bash
- name: Maven build
run: mvn --batch-mode clean install dependency:copy-dependencies -DskipTests=true

- name: Upload Maven artifacts
uses: actions/upload-artifact@v4
with:
name: maven-build-output
retention-days: 1
path: |
**/target/
localsolvers/


docker-build:
runs-on: ubuntu-22.04
needs: [setup, maven-build]
strategy:
fail-fast: false
matrix:
image:
- name: api
dockerfile: docker/build/Dockerfile-api-dev
context: .
needs_maven: true
needs_secrets: false
- name: rest
dockerfile: vcell-rest/src/main/docker/Dockerfile.jvm
context: vcell-rest
needs_maven: true
needs_secrets: false
pre_build: "mvn --batch-mode clean install dependency:copy-dependencies -DskipTests -Dvcell.exporter=false"
- name: exporter
dockerfile: vcell-rest/src/main/docker/Dockerfile.jvm
context: vcell-rest
needs_maven: true
needs_secrets: false
pre_build: "mvn --batch-mode clean install dependency:copy-dependencies -DskipTests -Dvcell.exporter=true"
- name: webapp-dev
dockerfile: webapp-ng/Dockerfile-webapp
context: webapp-ng
needs_maven: false
needs_secrets: false
build_args: "BUILD_COMMAND=build_dev"
- name: webapp-stage
dockerfile: webapp-ng/Dockerfile-webapp
context: webapp-ng
needs_maven: false
needs_secrets: false
build_args: "BUILD_COMMAND=build_stage"
- name: webapp-prod
dockerfile: webapp-ng/Dockerfile-webapp
context: webapp-ng
needs_maven: false
needs_secrets: false
build_args: "BUILD_COMMAND=build_prod"
- name: webapp-island
dockerfile: webapp-ng/Dockerfile-webapp
context: webapp-ng
needs_maven: false
needs_secrets: false
build_args: "BUILD_COMMAND=build_island"
- name: webapp-remote
dockerfile: webapp-ng/Dockerfile-webapp
context: webapp-ng
needs_maven: false
needs_secrets: false
build_args: "BUILD_COMMAND=build_remote"
- name: db
dockerfile: docker/build/Dockerfile-db-dev
context: .
needs_maven: true
needs_secrets: false
- name: sched
dockerfile: docker/build/Dockerfile-sched-dev
context: .
needs_maven: true
needs_secrets: false
- name: submit
dockerfile: docker/build/Dockerfile-submit-dev
context: .
needs_maven: true
needs_secrets: false
- name: data
dockerfile: docker/build/Dockerfile-data-dev
context: .
needs_maven: true
needs_secrets: false
- name: mongo
dockerfile: docker/build/mongo/Dockerfile
context: docker/build/mongo
needs_maven: false
needs_secrets: false
- name: batch
dockerfile: docker/build/Dockerfile-batch-dev
context: .
needs_maven: true
needs_secrets: false
- name: opt
dockerfile: pythonCopasiOpt/Dockerfile
context: pythonCopasiOpt
needs_maven: false
needs_secrets: false
- name: clientgen
dockerfile: docker/build/Dockerfile-clientgen-dev
context: .
needs_maven: true
needs_secrets: false
needs_installer_secrets: true
- name: admin
dockerfile: docker/build/Dockerfile-admin-dev
context: .
needs_maven: true
needs_secrets: false
steps:
- name: Free up VM's disk space
run: |
sudo rm -rf /usr/local/lib/android
sudo rm -rf /usr/local/.ghcup
sudo rm -rf /usr/share/dotnet
sudo rm -rf /usr/share/swift
sudo apt-get clean

- uses: actions/checkout@v4

- name: setup java 17 with maven cache
if: ${{ matrix.image.pre_build }}
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '17'
cache: 'maven'

- name: Download Maven artifacts
if: ${{ matrix.image.needs_maven }}
uses: actions/download-artifact@v4
with:
name: maven-build-output
path: .

- name: setup ssh-agent for installer secrets
if: ${{ matrix.image.needs_installer_secrets }}
uses: webfactory/ssh-agent@v0.8.0
with:
ssh-private-key: ${{ secrets.VC_KEY }}

- name: get installer secrets
if: ${{ matrix.image.needs_installer_secrets }}
env:
VCELL_MANAGER_NODE: vcellapi.cam.uchc.edu
VCELL_DEPLOY_REMOTE_DIR: /share/apps/vcell3/deployed_github
run: |
ssh-keyscan ${VCELL_MANAGER_NODE} >> ~/.ssh/known_hosts
sudo mkdir /usr/local/deploy
sudo chmod 777 /usr/local/deploy
cd /usr/local/deploy
scp ${{ secrets.CD_FULL_USER }}@${VCELL_MANAGER_NODE}:${VCELL_DEPLOY_REMOTE_DIR}/deploy_dir_2025_03_18.tar .
cd ..
sudo tar -xvf deploy/deploy_dir_2025_03_18.tar
sudo chmod 777 -R deploy

- name: Pre-build step
if: ${{ matrix.image.pre_build }}
run: ${{ matrix.image.pre_build }}

- name: Log in to GHCR
run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin

- name: Build and push Docker image
run: |
cd docker/build
echo "${{ secrets.GITHUB_TOKEN }}" | sudo docker login ghcr.io -u ${{ github.actor }} --password-stdin
echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
export BUILD_IMAGES="all"
./build.sh ${BUILD_IMAGES} ${{ env.VCELL_REPO_NAMESPACE }} ${{ env.VCELL_TAG }}

- name: tag as latest and push to registry
shell: bash
IMAGE_NAME="vcell-${{ matrix.image.name }}"
FULL_TAG="${{ needs.setup.outputs.vcell_repo_namespace }}/${IMAGE_NAME}:${{ needs.setup.outputs.vcell_tag }}"
BUILD_ARGS=""
if [ -n "${{ matrix.image.build_args || '' }}" ]; then
BUILD_ARGS="--build-arg ${{ matrix.image.build_args }}"
fi
echo "Building ${FULL_TAG}"
docker buildx build --platform=linux/amd64 \
${BUILD_ARGS} \
-f ${{ matrix.image.dockerfile }} \
--tag ${FULL_TAG} \
${{ matrix.image.context }}
docker push ${FULL_TAG}

tag-and-push:
runs-on: ubuntu-22.04
needs: [setup, docker-build]
steps:
- name: Log in to GHCR
run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin

- name: Tag and push all images
run: |
export CONTAINER_SET="vcell-exporter vcell-api vcell-rest vcell-webapp-prod vcell-webapp-dev vcell-webapp-stage vcell-webapp-island vcell-batch vcell-opt vcell-clientgen vcell-data vcell-db vcell-mongo vcell-sched vcell-submit vcell-admin"
for CONTAINER in ${CONTAINER_SET};\
do docker tag ${VCELL_REPO_NAMESPACE}/$CONTAINER:${VCELL_TAG} ${VCELL_REPO_NAMESPACE}/$CONTAINER:latest;\
docker tag ${VCELL_REPO_NAMESPACE}/$CONTAINER:${VCELL_TAG} ${VCELL_REPO_NAMESPACE}/$CONTAINER:${FRIENDLY_TAG};\
docker push --all-tags ${VCELL_REPO_NAMESPACE}/$CONTAINER;\
REPO="${{ needs.setup.outputs.vcell_repo_namespace }}"
TAG="${{ needs.setup.outputs.vcell_tag }}"
FRIENDLY="${{ needs.setup.outputs.friendly_tag }}"
CONTAINERS="vcell-exporter vcell-api vcell-rest vcell-webapp-prod vcell-webapp-dev vcell-webapp-stage vcell-webapp-island vcell-webapp-remote vcell-batch vcell-opt vcell-clientgen vcell-data vcell-db vcell-mongo vcell-sched vcell-submit vcell-admin"
for CONTAINER in ${CONTAINERS}; do
docker pull ${REPO}/${CONTAINER}:${TAG}
docker tag ${REPO}/${CONTAINER}:${TAG} ${REPO}/${CONTAINER}:latest
docker tag ${REPO}/${CONTAINER}:${TAG} ${REPO}/${CONTAINER}:${FRIENDLY}
docker push --all-tags ${REPO}/${CONTAINER}
done

- name: Setup tmate session
uses: mxschmitt/action-tmate@v3
if: ${{ failure() }}


# if [ "${{ github.event.inputs.client_only }}" = "true" ]; then
# echo "Building only client images"
# export BUILD_IMAGES="clientgen"
# else
# echo "Building all images"
#
# fi

# if [ "${{ github.event.inputs.client_only }}" = "true" ]; then
# echo "Building only client images"
# export CONTAINER_SET="vcell-clientgen"
# else
# echo "Building all images"
# export CONTAINER_SET="vcell-exporter vcell-api vcell-rest vcell-webapp-prod vcell-webapp-dev vcell-webapp-stage vcell-webapp-island vcell-batch vcell-opt vcell-clientgen vcell-data vcell-db vcell-mongo vcell-sched vcell-submit vcell-admin"
# fi
8 changes: 7 additions & 1 deletion .github/workflows/site_deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -116,9 +116,15 @@ jobs:
cd installers
export MAC_INSTALLER=`ls *dmg`
xcrun notarytool submit --output-format normal --no-progress --no-wait --team-id "${{ secrets.MACTEAMID }}" --apple-id "${{ secrets.MACID }}" --password "${{ secrets.MACPW }}" $MAC_INSTALLER > submit_output
SUBMIT_EXIT=$?
echo "output returned by notarytool submit:"
cat submit_output
cat submit_output | grep "id:" | cut -d ':' -f2 > UUID
cat submit_output | grep "id:" | cut -d ':' -f2 | tr -d '[:space:]' > UUID
if [[ $SUBMIT_EXIT != 0 || ! -s UUID ]]; then
echo "notarytool submit failed (exit=$SUBMIT_EXIT), no submission UUID obtained - aborting"
exit 1
fi
echo "submission UUID: $(cat UUID)"
for minutes in {1..5}
do
sleep 60
Expand Down
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -249,3 +249,7 @@ pythonData/test_data/SimID_946368938_0_.vcg
pythonData/test_data/SimID_946368938_mathmodel.vcml

pythonData/test_data/zarr/

pythonCopasiOpt/vcell-opt/.venv/

pythonCopasiOpt/vcell-opt/test_data/optproblem.report
13 changes: 8 additions & 5 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,17 @@ mvn compile test-compile -pl vcell-rest -am

## OpenAPI Client Generation

OpenAPI spec is generated by Quarkus SmallRye OpenAPI from `vcell-rest` and stored in `tools/openapi.yaml`. Three clients are auto-generated:
OpenAPI spec is generated by Quarkus SmallRye OpenAPI from `vcell-rest` and stored in `tools/openapi.yaml`. Three clients are auto-generated (Java, Python, TypeScript-Angular) using OpenAPI Generator v7.1.0.

```bash
cd tools
./generate.sh # Generates Java, Python, and TypeScript-Angular clients
# Generate clients from existing tools/openapi.yaml (if spec is already up to date)
./tools/openapi-clients.sh

# Rebuild vcell-rest, regenerate the OpenAPI spec, then generate all clients
./tools/openapi-clients.sh --update-spec
```

- **Java client:** `vcell-restclient/` (OpenAPI Generator v7.1.0)
- **Java client:** `vcell-restclient/`
- **Python client:** `python-restclient/`
- **Angular client:** `webapp-ng/src/app/core/modules/openapi/`

Expand Down Expand Up @@ -124,7 +127,7 @@ GitHub Actions (`.github/workflows/ci_cd.yml`):
After major changes (especially removing/renaming user-facing features):

- [ ] Check `vcell-client/UserDocumentation/` for references to changed features. This is an ad-hoc XML format compiled into JavaHelp (in-app help) and HTML published at https://vcell.org/webstart/VCell_Tutorials/VCell_Help/index.html. Update documentation to stay consistent with code.
- [ ] After regenerating OpenAPI clients (`tools/generate.sh`), compile downstream: `mvn compile test-compile -pl vcell-rest -am`
- [ ] After regenerating OpenAPI clients (`tools/openapi-clients.sh`), compile downstream: `mvn compile test-compile -pl vcell-rest -am`

## Conventions

Expand Down
2 changes: 0 additions & 2 deletions docker/build/Dockerfile-api-dev
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,6 @@ ENV softwareVersion=SOFTWARE-VERSION-NOT-SET \
ssl_ignoreCertProblems=false \
serverPrefixV0="server-path-prefix-v0-not-set" \
protocol="https" \
submit_service_host="submit" \
workingDir="/usr/local/app"

ENV dbpswdfile=/run/secrets/dbpswd \
Expand Down Expand Up @@ -117,7 +116,6 @@ ENTRYPOINT java \
-Dvcell.smtp.emailAddress="${smtp_emailaddress}" \
-Dvcell.ssl.ignoreHostMismatch="${ssl_ignoreHostMismatch}" \
-Dvcell.ssl.ignoreCertProblems="${ssl_ignoreCertProblems}" \
-Dvcell.submit.service.host="${submit_service_host}" \
-Dvcellapi.privateKey.file="${vcellapi_privatekeyfile}" \
-Dvcellapi.publicKey.file="${vcellapi_publickeyfile}" \
-cp "./lib/*" org.vcell.rest.VCellApiMain \
Expand Down
Loading
Loading