{
  "access": {
    "embargo": {
      "active": false,
      "reason": null
    },
    "files": "public",
    "record": "public",
    "status": "open"
  },
  "created": "2026-04-02T14:25:28.831799+00:00",
  "custom_fields": {
    "legacy:communities": [
      "f312c6b6-0dd6-4fb2-a224-7c4960394ac1",
      "dockstore",
      "f312c6b6-0dd6-4fb2-a224-7c4960394ac1"
    ]
  },
  "deletion_status": {
    "is_deleted": false,
    "status": "P"
  },
  "files": {
    "count": 1,
    "enabled": true,
    "entries": {
      "github.com-DataBiosphere-terra-scientific-pipelines-service-UpdateVcfDictionaryHeader_2.3.7.zip": {
        "access": {
          "hidden": false
        },
        "checksum": "md5:7fab95ddea4c92c30824e50e3cc7b17d",
        "ext": "zip",
        "id": "65f269fc-7174-4bfc-819a-0ca4269c26f4",
        "key": "github.com-DataBiosphere-terra-scientific-pipelines-service-UpdateVcfDictionaryHeader_2.3.7.zip",
        "links": {
          "content": "https://zenodo.org/api/records/19388779/files/github.com-DataBiosphere-terra-scientific-pipelines-service-UpdateVcfDictionaryHeader_2.3.7.zip/content",
          "self": "https://zenodo.org/api/records/19388779/files/github.com-DataBiosphere-terra-scientific-pipelines-service-UpdateVcfDictionaryHeader_2.3.7.zip"
        },
        "metadata": {},
        "mimetype": "application/zip",
        "size": 1835,
        "storage_class": "L"
      }
    },
    "order": [],
    "total_bytes": 1835
  },
  "id": "19388779",
  "is_draft": false,
  "is_published": true,
  "links": {
    "access": "https://zenodo.org/api/records/19388779/access",
    "access_grants": "https://zenodo.org/api/records/19388779/access/grants",
    "access_links": "https://zenodo.org/api/records/19388779/access/links",
    "access_request": "https://zenodo.org/api/records/19388779/access/request",
    "access_users": "https://zenodo.org/api/records/19388779/access/users",
    "archive": "https://zenodo.org/api/records/19388779/files-archive",
    "archive_media": "https://zenodo.org/api/records/19388779/media-files-archive",
    "communities": "https://zenodo.org/api/records/19388779/communities",
    "communities-suggestions": "https://zenodo.org/api/records/19388779/communities-suggestions",
    "doi": "https://doi.org/10.5281/zenodo.19388779",
    "draft": "https://zenodo.org/api/records/19388779/draft",
    "file_modification": "https://zenodo.org/api/records/19388779/file-modification",
    "files": "https://zenodo.org/api/records/19388779/files",
    "latest": "https://zenodo.org/api/records/19388779/versions/latest",
    "latest_html": "https://zenodo.org/records/19388779/latest",
    "media_files": "https://zenodo.org/api/records/19388779/media-files",
    "parent": "https://zenodo.org/api/records/14278238",
    "parent_doi": "https://doi.org/10.5281/zenodo.14278238",
    "parent_doi_html": "https://zenodo.org/doi/10.5281/zenodo.14278238",
    "parent_html": "https://zenodo.org/records/14278238",
    "preview_html": "https://zenodo.org/records/19388779?preview=1",
    "request_deletion": "https://zenodo.org/api/records/19388779/request-deletion",
    "requests": "https://zenodo.org/api/records/19388779/requests",
    "reserve_doi": "https://zenodo.org/api/records/19388779/draft/pids/doi",
    "self": "https://zenodo.org/api/records/19388779",
    "self_doi": "https://doi.org/10.5281/zenodo.19388779",
    "self_doi_html": "https://zenodo.org/doi/10.5281/zenodo.19388779",
    "self_html": "https://zenodo.org/records/19388779",
    "self_iiif_manifest": "https://zenodo.org/api/iiif/record:19388779/manifest",
    "self_iiif_sequence": "https://zenodo.org/api/iiif/record:19388779/sequence/default",
    "versions": "https://zenodo.org/api/records/19388779/versions"
  },
  "media_files": {
    "count": 0,
    "enabled": false,
    "entries": {},
    "order": [],
    "total_bytes": 0
  },
  "metadata": {
    "creators": [
      {
        "person_or_org": {
          "family_name": "Terra Scientific Services",
          "name": "Terra Scientific Services",
          "type": "personal"
        }
      }
    ],
    "description": "<h1>Terra Scientific Pipelines Service</h1>\n<p><a href=\"https://sonarcloud.io/summary/new_code?id=DataBiosphere_terra-scientific-pipelines-service\"></a></p>\n<h2>Overview</h2>\n<p>Terra Scientific Pipelines Service, or Teaspoons, facilitates running a number of defined scientific pipelines\non behalf of users that users can't run themselves in Terra. The most common reason for this is that the pipeline\naccesses proprietary data that users are not allowed to access directly, but that may be used as e.g. a reference panel\nfor imputation.</p>\n<h2>Supported pipelines</h2>\n<p>Current supported pipelines are:</p>\n<ul>\n<li><a href=\"https://allofus-anvil-imputation.terra.bio/\">Array Imputation with the <em>All of Us</em> + AnVIL Reference Panel</a></li>\n</ul>\n<h2>Architecture</h2>\n<p><a href=\"https://docs.google.com/document/d/1dAPwOG2z1h0B5CszeQ0DfyToniNV_3y1OBV7x7L8ofI/edit?usp=sharing\">Architecture Doc</a></p>\n<p><a href=\"https://lucid.app/lucidchart/2f067b5e-2d40-41b4-a5f3-a9dc72d83820/edit?viewport_loc=-72%2C25%2C1933%2C1133%2C0_0&amp;invitationId=inv_97522cca-1b6d-44fe-9552-8f959d410dd7\">Architecture Diagram</a></p>\n<h2>Development</h2>\n<p>This codebase is in initial development.</p>\n<h3>Requirements</h3>\n<h4>Technical</h4>\n<p>This service is written in Java 17, and uses Postgres 15.</p>\n<p>To run locally, you'll also need:</p>\n<ul>\n<li>jq - install with <code>brew install jq</code></li>\n<li>Java 17 - can be installed manually or through IntelliJ which will do it for you when importing the project</li>\n<li>Postgres 15 - multiple solutions here as long as you have a postgres instance running on localhost:5432 the local app will connect appropriately. Be sure to use Postgres 15 (as of Feb 2025, Postgres 17 did not work)\n<ul>\n<li>Download Postgres.app (recommended) from https://postgresapp.com/</li>\n<li>Brew https://formulae.brew.sh/formula/postgresql@15</li>\n</ul>\n</li>\n</ul>\n<h4>External Services</h4>\n<p>Terra services</p>\n<ul>\n<li>Sam\n<ul>\n<li>Used to authn users connecting to the service and authz users for admin endpoints</li>\n</ul>\n</li>\n<li>Rawls\n<ul>\n<li>Used to handle workspace interactions\n<ul>\n<li>creating methods</li>\n<li>data tables</li>\n<li>workflow submission</li>\n</ul>\n</li>\n</ul>\n</li>\n<li>Cromwell\n<ul>\n<li>Used through Rawls to run submissions</li>\n</ul>\n</li>\n<li>Thurloe\n<ul>\n<li>Used to send notification emails to users</li>\n</ul>\n</li>\n</ul>\n<h3>Tech stack</h3>\n<ul>\n<li>Java 17 temurin</li>\n<li>Postgres 15</li>\n<li>Gradle - build automation tool</li>\n<li>SonarQube - static code security and coverage</li>\n<li>Trivy - security scanner for docker images</li>\n<li>Jib - docker image builder for Java</li>\n</ul>\n<h3>Local development</h3>\n<p>To run locally:</p>\n<ol>\n<li>Make sure you have the requirements installed from above. We recommend IntelliJ as an IDE.</li>\n<li>Clone the repo (if you see broken inputs build the project to get the generated sources)</li>\n<li>Spin up a local postgres instance (NOTE: use version 15)</li>\n<li>Run the commands in <code>scripts/postgres-init.sql</code> in your local postgres instance. You will need to be authenticated to access GSM.</li>\n<li>Run <code>scripts/write-config.sh</code></li>\n<li>Run <code>./gradlew bootRun</code> to spin up the server.</li>\n<li>Navigate to <a href=\"http://localhost:8080/#\">http://localhost:8080/#</a></li>\n<li>If this is your first time deploying to any environment, be sure to use the admin endpoint <code>/api/admin/v1/pipelines/{pipelineName}/{pipelineVersion}</code> to set your pipeline's workspace id.\n<ol>\n<li>To run this endpoint, you need to be authenticated using your firecloud test account. A list of accounts that developers typically need is <a href=\"https://broadworkbench.atlassian.net/wiki/spaces/TSPS/pages/3699605509/Accounts+for+developers\">here</a>. Further, a list of resources that are generally useful is stored <a href=\"https://broadworkbench.atlassian.net/wiki/spaces/TSPS/pages/2887778308/Teaspoons+Resources\">here</a></li>\n<li>This endpoint requires two parameters directly, and three in the message body:\n<ol>\n<li>pipelineName can be retrieved by querying the <code>/api/pipelines/v1</code> endpoint.</li>\n<li>pipelineVersion can also be retrieved from the <code>/api/pipelines/v1</code> endpoint.</li>\n<li>workspaceBillingProject is listed in the Teaspoons Resources document linked above</li>\n<li>workspaceName is also listed in the Teaspoons Resources document, and can be found through the Terra UI workspace dashboard</li>\n<li>wdlMethodVersion is found for the specific workflow as listed in the Terra UI page for workflows.</li>\n</ol>\n</li>\n</ol>\n</li>\n</ol>\n<h3>Local development with the UI</h3>\n<p>When running terra-ui locally against a local teaspoons backend, CORS-related errors can arise. To get around this, run the following command to copy a configuration file that allows requests from localhost:</p>\n<pre><code>./scripts/local-dev/copy_web_config.sh \n</code></pre>\n<p>Note that this file at the destination path (next to App.java) is ignored via .gitignore, since it should not be used in deployed environments.</p>\n<h4>Local development with debugging</h4>\n<p>If using Intellij (only IDE we use on the team), you can run the server with a debugger. Follow\nthe steps above but instead of running <code>./gradlew bootRun</code> to spin up the server, you can run\n(debug) the App.java class through intellij and set breakpoints in the code.  Be sure to set the\nGOOGLE_APPLICATION_CREDENTIALS=config/teaspoons-sa.json in the Run/Debug configuration Environment Variables.</p>\n<h3>Testing the CLI locally</h3>\n<p>If you make changes to <a href=\"common/openapi.yml\">openapi.yml</a>, you should test the CLI locally.</p>\n<p>To create the autogenerated Python client files locally, run</p>\n<pre><code>./gradlew openApiGenerate\n</code></pre>\n<p>The files will be generated in <code>python-client/generated</code> and are ignored from being checked into the repo.</p>\n<p>To test with the CLI, follow the instructions in the CLI repo: <a href=\"https://github.com/DataBiosphere/terra-scientific-pipelines-service-cli/blob/main/CONTRIBUTING.md\">DataBiosphere/terra-scientific-pipelines-service-cli</a>.</p>\n<h3>Running Tests Locally</h3>\n<p>Run <code>./gradlew service:test</code> to run tests</p>\n<p>Note: If you encounter errors indicating a failure to load the ApplicationContext due to an error while preparing a database cluster caused by a missing Docker environment,\nthis may be related to newer Docker versions (for example, 29.0.0 and above). To resolve this issue, override the\nDocker API version in the <code>$HOME/.docker-java.properties</code> file. If the file does not already exist, create it and add the following line:</p>\n<pre><code>api.version=1.44\n</code></pre>\n<p>If the file mentioned already exists with above line, and the tests are still failing in the same way, try restarting Docker.</p>\n<h3>Running Linter Locally</h3>\n<ul>\n<li>Run <code>./gradlew spotlessCheck</code> to run linter checks</li>\n<li>Run <code>./gradlew :service:spotlessApply</code> to apply fix any issues the linter finds</li>\n</ul>\n<h3>(Optional) Install pre-commit hooks</h3>\n<ol>\n<li>[scripts/git-hooks/pre-commit] has been provided to help ensure all submitted changes are formatted correctly.  To install all hooks in [scripts/git-hooks], run:</li>\n</ol>\n<pre><code>git config core.hooksPath scripts/git-hooks\n</code></pre>\n<h3>Running SonarQube locally</h3>\n<p><a href=\"https://www.sonarqube.org\">SonarQube</a> is a static analysis code that scans code for a wide\nrange of issues, including maintainability and possible bugs. Get more information from\n<a href=\"https://dsp-security.broadinstitute.org/appsec-team-internal/appsec-team-internal/security-activities/sast-1#\">DSP SonarQube Docs</a></p>\n<p>If you get a build failure due to\nSonarQube and want to debug the problem locally, you need to get the sonar token from GSM\nbefore running the gradle task.</p>\n<pre><code>export SONAR_TOKEN=$(gcloud secrets versions access latest --project=&quot;broad-dsde-dev&quot; --secret=&quot;teaspoons-sonarcloud&quot; | jq '.sonar_token')\n./gradlew sonarqube\n</code></pre>\n<p>Running this task produces no output unless your project has errors. To\ngenerate a report, run using <code>--info</code>:</p>\n<pre><code>./gradlew sonarqube --info\n</code></pre>\n<h3>Connecting to the database</h3>\n<p>To connect to the Teaspoons database, we have a script in <a href=\"https://github.com/broadinstitute/dsp-scripts\">dsp-scripts</a> that\ndoes all the setup for you. Clone that repo and make sure you're either on Broad Internal wifi or connected\nto the VPN. Then run the following command:</p>\n<pre><code>./db/psql-connect.sh dev teaspoons\n</code></pre>\n<h3>Deploying to dev</h3>\n<p>Upon merging to main, the dev environment will be automatically deployed via the GitHub Action <a href=\"https://github.com/DataBiosphere/terra-scientific-pipelines-service/actions/workflows/tag-publish.yml\">Bump, Tag, Publish, and Deploy</a>\n(that workflow is defined <a href=\"https://github.com/DataBiosphere/terra-scientific-pipelines-service/blob/main/.github/workflows/tag-publish.yml\">here</a>).</p>\n<p>The two tasks <code>report-to-sherlock</code> and <code>set-version-in-dev</code> will prompt Sherlock to deploy the new version to dev.\nYou can check the status of the deployment in <a href=\"https://beehive.dsp-devops.broadinstitute.org/apps/teaspoons\">Beehive</a> and in\n<a href=\"https://ap-argocd.dsp-devops.broadinstitute.org/applications/ap-argocd/teaspoons-dev\">ArgoCD</a>.</p>\n<p>For more information about deployment to dev, check out DevOps' <a href=\"https://docs.google.com/document/d/1lkUkN2KOpHKWufaqw_RIE7EN3vN4G2xMnYBU83gi8VA/\">excellent documentation</a>.</p>\n<h3>Tracing</h3>\n<p>We use <a href=\"https://opentelemetry.io/\">OpenTelemetry</a> for tracing, so that every request has a tracing span that can\nbe viewed in <a href=\"https://cloud.google.com/trace\">Google Cloud Trace</a>.\nSee <a href=\"https://broadworkbench.atlassian.net/wiki/x/AoGlrg\">this DSP blog post</a> for more info.</p>\n<h3>Running the BEE end-to-end tests</h3>\n<p>The end-to-end test that runs against a BEE is specified in <code>.github/workflows/run-bee-e2e-tests.yaml</code>. It calls <a href=\"https://github.com/broadinstitute/terra-github-workflows/blob/main/.github/workflows/teaspoons-bee-e2e-service-test.yaml\">the workflow defined\nin the terra-github-workflows repo</a>.</p>\n<p>The end-to-end test is automatically run nightly on the dev environment.</p>\n<p>To run the test against a specific feature branch:</p>\n<ol>\n<li>Grab the image tag for your feature branch.</li>\n</ol>\n<blockquote>\n<p>If you've opened a PR, you can find the image tag as follows:</p>\n<ul>\n<li>go to the Bump, Tag, Publish, and Deploy workflow that's triggered each time you push to your branch</li>\n<li>From there, go to the tag-publish-docker-deploy task</li>\n<li>Expand the &quot;Construct docker image name and tag&quot; step</li>\n<li>The first line should contain the image tag, something like &quot;0.0.81-6761487&quot;.</li>\n</ul>\n</blockquote>\n<ol>\n<li>Navigate to the <a href=\"https://github.com/DataBiosphere/terra-scientific-pipelines-service/actions/workflows/run-bee-e2e-tests.yaml\">e2e-test GHA workflow</a></li>\n<li>Click on the &quot;Run workflow&quot; button and select your branch from the dropdown</li>\n</ol>\n<ul>\n<li>Enter the image tag from step 1 in the &quot;Custom image tag&quot; field</li>\n<li>If you've updated the end-to-end test in the dsp-resuable-workflows repo, enter either a commit hash or your git\nbranch name. If you don't need to change the test, leave the default as main.</li>\n</ul>\n<ol>\n<li>Click the green &quot;Run workflow&quot; button.</li>\n</ol>\n<h2>Python clients</h2>\n<p>We publish a &quot;thin&quot;, auto-generated Python client that wraps the Teaspoons APIs. This client is published to\n<a href=\"https://pypi.org/project/terra-scientific-pipelines-service-api-client/\">PyPi</a> and can be installed with\n<code>pip install teaspoons_client</code>, although this is not meant to be user-facing. The thin api client is generated from\nthe OpenAPI spec in the <code>openapi</code> directory.</p>\n<p>Publishing occurs automatically when a new version of the service is deployed, via the\n<a href=\"https://github.com/DataBiosphere/terra-scientific-pipelines-service/blob/main/.github/workflows/release-python-client.yml\">release-python-client GHA</a>.</p>\n<p>We also have a user-facing, &quot;thick&quot; CLI whose code lives in a separate repository: <a href=\"https://github.com/DataBiosphere/terra-scientific-pipelines-service-cli\">DataBiosphere/terra-scientific-pipelines-service-cli</a>.</p>",
    "publication_date": "2026-04-02",
    "publisher": "Zenodo",
    "related_identifiers": [
      {
        "identifier": "https://dockstore.org/aliases/workflow-versions/10.5281-zenodo.19388779",
        "relation_type": {
          "id": "isidenticalto",
          "title": {
            "de": "Ist identisch mit",
            "en": "Is identical to"
          }
        },
        "scheme": "url"
      },
      {
        "identifier": "https://dockstore.org/workflows/github.com/DataBiosphere/terra-scientific-pipelines-service/UpdateVcfDictionaryHeader:2.3.7",
        "relation_type": {
          "id": "isidenticalto",
          "title": {
            "de": "Ist identisch mit",
            "en": "Is identical to"
          }
        },
        "scheme": "url"
      },
      {
        "identifier": "https://dockstore.org/api/ga4gh/trs/v2/tools/%23workflow%2Fgithub.com%2FDataBiosphere%2Fterra-scientific-pipelines-service%2FUpdateVcfDictionaryHeader/versions/2.3.7/PLAIN-WDL/descriptor/UpdateVcfDictionaryHeader.wdl",
        "relation_type": {
          "id": "isidenticalto",
          "title": {
            "de": "Ist identisch mit",
            "en": "Is identical to"
          }
        },
        "scheme": "url"
      }
    ],
    "resource_type": {
      "id": "software",
      "title": {
        "de": "Software",
        "en": "Software"
      }
    },
    "rights": [
      {
        "description": {
          "en": "The Creative Commons Attribution license allows re-distribution and re-use of a licensed work on the condition that the creator is appropriately credited."
        },
        "icon": "cc-by-icon",
        "id": "cc-by-4.0",
        "props": {
          "scheme": "spdx",
          "url": "https://creativecommons.org/licenses/by/4.0/legalcode"
        },
        "title": {
          "en": "Creative Commons Attribution 4.0 International"
        }
      }
    ],
    "title": "github.com/DataBiosphere/terra-scientific-pipelines-service/UpdateVcfDictionaryHeader",
    "version": "2.3.7"
  },
  "parent": {
    "access": {
      "owned_by": {
        "user": "76183"
      },
      "settings": {
        "accept_conditions_text": null,
        "allow_guest_requests": false,
        "allow_user_requests": false,
        "secret_link_expiration": 0
      }
    },
    "communities": {
      "default": "f312c6b6-0dd6-4fb2-a224-7c4960394ac1",
      "entries": [
        {
          "access": {
            "member_policy": "open",
            "members_visibility": "public",
            "record_submission_policy": "open",
            "review_policy": "open",
            "visibility": "public"
          },
          "children": {
            "allow": false
          },
          "created": "2024-11-05T20:16:09.639062+00:00",
          "custom_fields": {},
          "deletion_status": {
            "is_deleted": false,
            "status": "P"
          },
          "id": "f312c6b6-0dd6-4fb2-a224-7c4960394ac1",
          "links": {},
          "metadata": {
            "description": "Dockstore is a free and open source platform for sharing reusable and scalable analytical tools and workflows.",
            "title": "Dockstore",
            "type": {
              "id": "project"
            },
            "website": "https://dockstore.org/"
          },
          "revision_id": 5,
          "slug": "dockstore",
          "updated": "2024-11-05T20:17:15.254457+00:00"
        }
      ],
      "ids": [
        "f312c6b6-0dd6-4fb2-a224-7c4960394ac1"
      ]
    },
    "id": "14278238",
    "pids": {
      "doi": {
        "client": "datacite",
        "identifier": "10.5281/zenodo.14278238",
        "provider": "datacite"
      }
    }
  },
  "pids": {
    "doi": {
      "client": "datacite",
      "identifier": "10.5281/zenodo.19388779",
      "provider": "datacite"
    },
    "oai": {
      "identifier": "oai:zenodo.org:19388779",
      "provider": "oai"
    }
  },
  "revision_id": 4,
  "stats": {
    "all_versions": {
      "data_volume": 2078977.0,
      "downloads": 1170,
      "unique_downloads": 1150,
      "unique_views": 2985,
      "views": 3018
    },
    "this_version": {
      "data_volume": 7340.0,
      "downloads": 4,
      "unique_downloads": 4,
      "unique_views": 7,
      "views": 7
    }
  },
  "status": "published",
  "swh": {},
  "updated": "2026-04-02T14:25:29.058794+00:00",
  "versions": {
    "index": 97,
    "is_latest": false
  }
}