diff --git a/.secrets.baseline b/.secrets.baseline index 831b5cad6..9a4553c96 100644 --- a/.secrets.baseline +++ b/.secrets.baseline @@ -6924,21 +6924,21 @@ "filename": "qa-dcp.planx-pla.net/manifest.json", "hashed_secret": "7120244dce59930b75711144fda4b1f6d78e4865", "is_verified": false, - "line_number": 72 + "line_number": 79 }, { "type": "Secret Keyword", "filename": "qa-dcp.planx-pla.net/manifest.json", "hashed_secret": "0447a636536df0264b2000403fbefd69f603ceb1", "is_verified": false, - "line_number": 240 + "line_number": 247 }, { "type": "Secret Keyword", "filename": "qa-dcp.planx-pla.net/manifest.json", "hashed_secret": "ca253d1c9dece2da0d6fb24ded7bdb849a475966", "is_verified": false, - "line_number": 246 + "line_number": 253 } ], "qa-heal.planx-pla.net/manifests/hatchery/hatchery.json": [ diff --git a/qa-dcp.planx-pla.net/manifest.json b/qa-dcp.planx-pla.net/manifest.json index 87926d2ee..964b9b2eb 100644 --- a/qa-dcp.planx-pla.net/manifest.json +++ b/qa-dcp.planx-pla.net/manifest.json @@ -7,7 +7,9 @@ "autodeploy": "yes" }, "versions": { + "ambassador": "quay.io/datawire/ambassador:1.4.2", "arborist": "707767160287.dkr.ecr.us-east-1.amazonaws.com/gen3/arborist:2025.06", + "audit-service": "707767160287.dkr.ecr.us-east-1.amazonaws.com/gen3/audit-service:2025.06", "aws-es-proxy": "707767160287.dkr.ecr.us-east-1.amazonaws.com/gen3/aws-es-proxy:v1.3.1", "fence": "707767160287.dkr.ecr.us-east-1.amazonaws.com/gen3/fence:2025.06", "indexd": "707767160287.dkr.ecr.us-east-1.amazonaws.com/gen3/indexd:2025.06", @@ -17,15 +19,20 @@ "portal": "707767160287.dkr.ecr.us-east-1.amazonaws.com/gen3/data-portal:2025.06", "fluentd": "fluent/fluentd-kubernetes-daemonset:v1.15.3-debian-cloudwatch-1.0", "spark": "707767160287.dkr.ecr.us-east-1.amazonaws.com/gen3/gen3-spark:2025.06", - "tube": "707767160287.dkr.ecr.us-east-1.amazonaws.com/gen3/tube:2025.06", + "ssjdispatcher": "707767160287.dkr.ecr.us-east-1.amazonaws.com/gen3/ssjdispatcher:2025.06", + "tube": "707767160287.dkr.ecr.us-east-1.amazonaws.com/gen3/tube:integration202506", + "manifestservice": "707767160287.dkr.ecr.us-east-1.amazonaws.com/gen3/manifestservice:2025.06", + "wts": "707767160287.dkr.ecr.us-east-1.amazonaws.com/gen3/workspace-token-service:2025.06", "guppy": "707767160287.dkr.ecr.us-east-1.amazonaws.com/gen3/guppy:2025.06", "sower": "707767160287.dkr.ecr.us-east-1.amazonaws.com/gen3/sower:2025.06", "hatchery": "707767160287.dkr.ecr.us-east-1.amazonaws.com/gen3/hatchery:2025.06", - "ambassador": "quay.io/datawire/ambassador:1.4.2", - "wts": "707767160287.dkr.ecr.us-east-1.amazonaws.com/gen3/workspace-token-service:2025.06", - "manifestservice": "707767160287.dkr.ecr.us-east-1.amazonaws.com/gen3/manifestservice:2025.06", - "ssjdispatcher": "707767160287.dkr.ecr.us-east-1.amazonaws.com/gen3/ssjdispatcher:2025.06", - "metadata": "707767160287.dkr.ecr.us-east-1.amazonaws.com/gen3/metadata-service:2025.06" + "metadata": "707767160287.dkr.ecr.us-east-1.amazonaws.com/gen3/metadata-service:2025.06", + "requestor": "707767160287.dkr.ecr.us-east-1.amazonaws.com/gen3/requestor:2025.06", + "gen3-user-data-library": "707767160287.dkr.ecr.us-east-1.amazonaws.com/gen3/gen3-user-data-library:main" + }, + "metadata": { + "USE_AGG_MDS": true, + "AGG_MDS_NAMESPACE": "qa-dcp" }, "google": { "enabled": "yes" diff --git a/qa-dcp.planx-pla.net/manifests/hatchery/dicom-compose.yaml b/qa-dcp.planx-pla.net/manifests/hatchery/dicom-compose.yaml deleted file mode 100644 index efe510e7b..000000000 --- a/qa-dcp.planx-pla.net/manifests/hatchery/dicom-compose.yaml +++ /dev/null @@ -1,62 +0,0 @@ -version: '3' -services: - # see https://github.com/uc-cdis/ohif-orthanc-app-example - dicom-viewer: - # nginx reverse proxy - image: quay.io/cdis/ohif-viewer:master - ports: - - ${SERVICE_PORT}:80 - volumes: - - ${DATA_VOLUME}:/data - environment: - - ORTHANC_HOST=localhost - deploy: - resources: - limits: - cpus: '0.50' - memory: 512M - reservations: - cpus: '0.25' - memory: 128M - orthanc: - image: quay.io/cdis/orthanc-plugins:master - # see https://blog.mikesir87.io/2019/03/sharing-network-namespaces-in-docker/ - network_mode: "service:dicom-viewer" - # sample dicom available here: - # https://medistim.com/dicom/ - volumes: - - ${DATA_VOLUME}:/data - healthcheck: - test: - - CMD - - wget - - -O - - /dev/null - - http://localhost/ - interval: 1m30s - timeout: 10s - retries: 3 - deploy: - resources: - limits: - cpus: '1.0' - memory: 3072M - reservations: - cpus: '0.4' - memory: 2048M - postgres: - image: postgres - # see https://blog.mikesir87.io/2019/03/sharing-network-namespaces-in-docker/ - network_mode: "service:dicom-viewer" - environment: - - POSTGRES_DB=orthanc - - POSTGRES_USER=postgres - - POSTGRES_PASSWORD=postgres - deploy: - resources: - limits: - cpus: '1.0' - memory: 768M - reservations: - cpus: '0.4' - memory: 512M diff --git a/qa-dcp.planx-pla.net/manifests/hatchery/hatchery.json b/qa-dcp.planx-pla.net/manifests/hatchery/hatchery.json index 476e214e2..dd18e0819 100644 --- a/qa-dcp.planx-pla.net/manifests/hatchery/hatchery.json +++ b/qa-dcp.planx-pla.net/manifests/hatchery/hatchery.json @@ -1,11 +1,11 @@ { "user-namespace": "jupyter-pods-qa-dcp", "sub-dir": "/lw-workspace", - "user-volume-size": "10Gi", + "user-volume-size": "512Mi", "sidecar": { "cpu-limit": "1.0", "memory-limit": "256Mi", - "image": "707767160287.dkr.ecr.us-east-1.amazonaws.com/gen3/gen3fuse-sidecar:2025.06", + "image": "quay.io/cdis/gen3fuse-sidecar:2025.06", "env": { "NAMESPACE": "qa-dcp", "HOSTNAME": "qa-dcp.planx-pla.net" @@ -44,99 +44,14 @@ "cpu-limit": "1.0", "memory-limit": "512Mi", "name": "Jupyter Notebook Bio Python", - "image": "quay.io/occ_data/jupyternotebook:1.9.0", - "env": {}, - "args": [ - "--NotebookApp.base_url=/lw-workspace/proxy/", - "--NotebookApp.password=''", - "--NotebookApp.token=''", - "--NotebookApp.notebook_dir='/home/jovyan/pd'", - "--NotebookApp.quit_button=False" - ], - "command": [ - "start-notebook.sh" - ], - "path-rewrite": "/lw-workspace/proxy/", - "use-tls": "false", - "ready-probe": "/lw-workspace/proxy/", - "lifecycle-post-start": [ - "/bin/sh", - "-c", - "export IAM=`whoami`; rm -rf /home/$IAM/pd/dockerHome; ln -s $(pwd) /home/$IAM/pd/dockerHome; mkdir -p /home/$IAM/.jupyter/custom; echo \"define(['base/js/namespace'], function(Jupyter){Jupyter._target = '_self';})\" >/home/$IAM/.jupyter/custom/custom.js; ln -s /data /home/$IAM/pd/; true" - ], - "user-uid": 1000, - "fs-gid": 100, - "user-volume-location": "/home/jovyan/pd" - }, - { - "target-port": 8888, - "cpu-limit": "1.0", - "memory-limit": "8192Mi", - "name": "Jupyter Notebook Power Python", "image": "quay.io/occ_data/jupyternotebook:1.7.2", - "env": {}, - "args": [ - "--NotebookApp.base_url=/lw-workspace/proxy/", - "--NotebookApp.password=''", - "--NotebookApp.token=''", - "--NotebookApp.notebook_dir='/home/jovyan/pd'", - "--NotebookApp.quit_button=False" - ], - "command": [ - "start-notebook.sh" - ], - "path-rewrite": "/lw-workspace/proxy/", - "use-tls": "false", - "ready-probe": "/lw-workspace/proxy/", - "lifecycle-post-start": [ - "/bin/sh", - "-c", - "export IAM=`whoami`; rm -rf /home/$IAM/pd/dockerHome; ln -s $(pwd) /home/$IAM/pd/dockerHome; mkdir -p /home/$IAM/.jupyter/custom; echo \"define(['base/js/namespace'], function(Jupyter){Jupyter._target = '_self';})\" >/home/$IAM/.jupyter/custom/custom.js; ln -s /data /home/$IAM/pd/; true" - ], - "user-uid": 1000, - "fs-gid": 100, - "user-volume-location": "/home/jovyan/pd" - }, - { - "target-port": 8888, - "cpu-limit": "1.0", - "memory-limit": "8096Mi", - "name": "Helium Autoencoder Demo", - "image": "quay.io/cdis/auntoencoder-copd-demo:latest", - "env": {}, - "args": [ - "--NotebookApp.base_url=/lw-workspace/proxy/", - "--NotebookApp.password=''", - "--NotebookApp.token=''", - "--NotebookApp.notebook_dir='/home/jovyan/pd'", - "--NotebookApp.quit_button=False" - ], - "command": [ - "start-notebook.sh" - ], - "path-rewrite": "/lw-workspace/proxy/", - "use-tls": "false", - "ready-probe": "/lw-workspace/proxy/", - "lifecycle-post-start": [ - "/bin/sh", - "-c", - "export IAM=`whoami`; rm -rf /home/$IAM/pd/dockerHome; ln -s $(pwd) /home/$IAM/pd/dockerHome; mkdir -p /home/$IAM/.jupyter/custom; echo \"define(['base/js/namespace'], function(Jupyter){Jupyter._target = '_self';})\" >/home/$IAM/.jupyter/custom/custom.js; ln -s /data /home/$IAM/pd/; true" - ], - "user-uid": 1000, - "fs-gid": 100 - }, - { - "target-port": 8888, - "cpu-limit": "1.0", - "memory-limit": "8096Mi", - "name": "Helium Tensorflow-Pytorch", - "image": "heliumdatastage/tensorflow-pytorch-ext:1", - "env": {}, + "env": { + "NAMESPACE": "qa-dcp" + }, "args": [ "--NotebookApp.base_url=/lw-workspace/proxy/", "--NotebookApp.password=''", "--NotebookApp.token=''", - "--NotebookApp.notebook_dir='/home/jovyan/pd'", "--NotebookApp.quit_button=False" ], "command": [ @@ -148,7 +63,7 @@ "lifecycle-post-start": [ "/bin/sh", "-c", - "export IAM=`whoami`; rm -rf /home/$IAM/pd/dockerHome; ln -s $(pwd) /home/$IAM/pd/dockerHome; mkdir -p /home/$IAM/.jupyter/custom; echo \"define(['base/js/namespace'], function(Jupyter){Jupyter._target = '_self';})\" >/home/$IAM/.jupyter/custom/custom.js; ln -s /data /home/$IAM/pd/; true" + "export IAM=`whoami`; rm -rf /home/$IAM/pd/dockerHome; mkdir -p /home/$IAM/.jupyter/custom; echo \"define(['base/js/namespace'], function(Jupyter){Jupyter._target = '_self';})\" >/home/$IAM/.jupyter/custom/custom.js; true" ], "user-uid": 1000, "fs-gid": 100 @@ -156,15 +71,16 @@ { "target-port": 8888, "cpu-limit": "1.0", - "memory-limit": "8096Mi", - "name": "Helium CIP Demo", - "image": "heliumdatastage/jup-cip:v1", - "env": {}, + "memory-limit": "512Mi", + "name": "(Tutorial) Bacpac Synthetic Data Analysis Notebook", + "image": "quay.io/cdis/heal-notebooks:bacpac__10670ad79b4488cfa9f1b3681ce52bc3f1139b5a", + "env": { + "FRAME_ANCESTORS": "https://qa-dcp.planx-pla.net" + }, "args": [ "--NotebookApp.base_url=/lw-workspace/proxy/", "--NotebookApp.password=''", "--NotebookApp.token=''", - "--NotebookApp.notebook_dir='/home/jovyan/pd'", "--NotebookApp.quit_button=False" ], "command": [ @@ -176,104 +92,9 @@ "lifecycle-post-start": [ "/bin/sh", "-c", - "export IAM=`whoami`; rm -rf /home/$IAM/pd/dockerHome; ln -s $(pwd) /home/$IAM/pd/dockerHome; mkdir -p /home/$IAM/.jupyter/custom; echo \"define(['base/js/namespace'], function(Jupyter){Jupyter._target = '_self';})\" >/home/$IAM/.jupyter/custom/custom.js; ln -s /data /home/$IAM/pd/; true" + "export IAM=`whoami`; rm -rf /home/$IAM/pd/dockerHome; rm -rf /home/$IAM/pd/lost+found; ln -s /data /home/$IAM/; true" ], "user-uid": 1000, - "fs-gid": 100 - }, - { - "target-port": 80, - "name": "DICOM Viewer", - "cpu-limit": "0.5", - "memory-limit": "512Mi", - "image": "quay.io/cdis/ohif-viewer:master", - "env": { - "ORTHANC_HOST": "localhost" - }, - "args": [], - "path-rewrite": "/lw-workspace/proxy/", - "use-tls": "false", - "ready-probe": "/lw-workspace/proxy/", - "friends": [ - { - "name": "orthanc", - "image": "quay.io/cdis/orthanc-plugins:master", - "livenessProbe": { - "httpGet": { - "path": "/", - "port": 80 - }, - "initialDelaySeconds": 30, - "periodSeconds": 60, - "timeoutSeconds": 30 - }, - "readinessProbe": { - "httpGet": { - "path": "/", - "port": 80 - } - }, - "ports": [ - { - "containerPort": 80 - } - ], - "resources": { - "limits": { - "cpu": "1.0", - "memory": "512Mi" - } - }, - "volumeMounts": [ - { - "mountPath": "/data", - "mountPropagation": "HostToContainer", - "name": "shared-data" - } - ] - }, - { - "name": "postgres", - "image": "postgres", - "env": [ - { - "name": "POSTGRES_DB", - "value": "orthanc" - }, - { - "name": "POSTGRES_USER", - "value": "postgres" - }, - { - "name": "POSTGRES_PASSWORD", - "value": "postgres" - } - ], - "resources": { - "limits": { - "cpu": "0.5", - "memory": "512Mi" - } - } - } - ] - } - ], - "more-configs": [ - { - "type": "dockstore-compose:1.0.0", - "path": "/hatchery-more-configs/test-app.yaml", - "name": "DockstoreTest" - }, - { - "type": "dockstore-compose:1.0.0", - "path": "/hatchery-more-configs/notebook-app.yaml", - "name": "DockstoreNotebook" - }, - { - "type": "dockstore-compose:1.0.0", - "path": "/hatchery-more-configs/dicom-compose.yaml", - "name": "DockstoreDicom" - } + "fs-gid": 100 } ] -} \ No newline at end of file +} diff --git a/qa-dcp.planx-pla.net/manifests/hatchery/notebook-app.yaml b/qa-dcp.planx-pla.net/manifests/hatchery/notebook-app.yaml deleted file mode 100644 index fcbdb6588..000000000 --- a/qa-dcp.planx-pla.net/manifests/hatchery/notebook-app.yaml +++ /dev/null @@ -1,27 +0,0 @@ -version: '3' -services: - webapp: - image: "quay.io/cdis/jupyter-notebook:master" - volumes: - - ${DATA_VOLUME}:/data - entrypoint: - - "start-notebook.sh" - command: - - "--NotebookApp.base_url=/lw-workspace/proxy" - - "--NotebookApp.password=''" - - "--NotebookApp.token=''" - ports: - - "${SERVICE_PORT}:8888" - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8888/lw-workspace/proxy/"] - interval: 1m30s - timeout: 10s - retries: 3 - deploy: - resources: - limits: - cpus: '0.50' - memory: 256M - reservations: - cpus: '0.25' - memory: 128M diff --git a/qa-dcp.planx-pla.net/manifests/hatchery/test-app.yaml b/qa-dcp.planx-pla.net/manifests/hatchery/test-app.yaml deleted file mode 100644 index 26af92cd2..000000000 --- a/qa-dcp.planx-pla.net/manifests/hatchery/test-app.yaml +++ /dev/null @@ -1,36 +0,0 @@ -version: '3' -services: - webapp: - image: "python:3.8-buster" - volumes: - - ${DATA_VOLUME}:/data - entrypoint: [ /bin/bash ] - command: - - "-c" - - "cd /tmp && mkdir -p lw-workspace/proxy; echo 'Hello!' > lw-workspace/proxy/index.html; /usr/bin/python3 -m http.server 8000" - ports: - - "${SERVICE_PORT}:8000" - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8000/lw-workspace/proxy/index.html"] - interval: 1m30s - timeout: 10s - retries: 3 - - worker: - image: "ubuntu:18.04" - # avoid user-volume mount if not necessary - #volumes: - # - user-volume/config/nginx-with-proxy.conf:/etc/nginx/conf.d/default.conf - environment: - - MONGO_URL=mongodb://localhost:27017/ohif - - APP_CONFIG=/usr/share/nginx/html/app-config.js - entrypoint: [ /bin/bash ] - command: [ -c, 'while true; do echo "hello there!"; sleep 10; done;' ] - deploy: - resources: - limits: - cpus: '0.50' - memory: 50M - reservations: - cpus: '0.25' - memory: 20M diff --git a/qa-dcp.planx-pla.net/metadata/aggregate_config.json b/qa-dcp.planx-pla.net/metadata/aggregate_config.json new file mode 100644 index 000000000..5a0c50f13 --- /dev/null +++ b/qa-dcp.planx-pla.net/metadata/aggregate_config.json @@ -0,0 +1,8 @@ +{ + "gen3_commons": { + "HEAL": { + "mds_url": "https://qa-dcp.planx-pla.net", + "commons_url": "qa-dcp.planx-pla.net" + } + } +} diff --git a/qa-dcp.planx-pla.net/portal/gitops.json b/qa-dcp.planx-pla.net/portal/gitops.json index 3b1778bbe..bf13bd73b 100644 --- a/qa-dcp.planx-pla.net/portal/gitops.json +++ b/qa-dcp.planx-pla.net/portal/gitops.json @@ -52,6 +52,13 @@ "body": "The Exploration Page gives you insights and a clear overview under selected factors.", "link": "/explorer", "label": "Explore data" + }, + { + "name": "Analyze Data", + "icon": "stage-analyze", + "body": "Analyze your selected cases using Jupyter Notebooks in our secure cloud environment", + "link": "/workspace", + "label": "Run analysis" } ], "homepageChartNodesExcludeFiles": true, @@ -86,6 +93,12 @@ "color": "#a2a2a2", "name": "Exploration" }, + { + "icon": "workspace", + "link": "/workspace", + "color": "#a2a2a2", + "name": "Workspace" + }, { "icon": "profile", "link": "/identity",