CC-Agency API

This is a documentation of the available REST API endpoints of CC-Agency.

Before using the CC-Agency API, you should read the Introduction to CC-Agency, especially the section about data security.

Usage examples are provided as Python code. Install and import the following Python modules to prepare for the examples.

pip3 install --user --upgrade requests ruamel.yaml
import requests
from ruamel.yaml import YAML
yaml = YAML(typ='safe')
Endpoint Methods
/ GET
/token GET
/version GET
/red POST
/experiments/count GET
/experiments GET
/experiments/EXPERIMENT_ID GET
/batches/count GET
/batches GET
/batches/BATCH_ID GET, DELETE
/batches/BATCH_ID/FILENAME GET
/nodes GET

GET /

Hello World.

Request (Python):

requests.get(
    'https://example.com/'
)

Response (JSON):

{"Hello": "World"}

GET /token

Request temporary password token, which replaces the actual user password for basic auth.

Hint: This endpoints requires authorization with username and password credentials, not another token.

Request (Python):

requests.get(
    'https://example.com/token',
    auth=('guest', 'guest')
)

Response (JSON):

{
    "token": "d474a3d73a57e5636b070b03eee8ac2a0d8c302798ffd38f",
    "validForSeconds": 86400
}

Token can be used for authorization with other endpoints as follows.

Request (Python):

requests.get(
    'https://example.com/version',
    auth=('guest', 'd474a3d73a57e5636b070b03eee8ac2a0d8c302798ffd38f')
)

GET /version

Installed CC-Core and CC-Agency versions.

Request (Python):

requests.get(
    'https://example.com/version',
    auth=('guest', 'guest')
)

Response (JSON):

{
    "agencyVersion": "9.0.0",
    "coreVersion": "9.0.0"
}

POST /red

Send RED data to CC-Agency, which will result in one database entry in the experiments collection and one or more entries in the batches collection. The agency’s scheduler will trigger the parallel processing of the batches in the distributed cluster of docker-engines.

Additionally required fields:

  • outputs
  • container.settings.image.url
  • container.settings.image.ram

File red.yml:

redVersion: "9"
cli:
  cwlVersion: "v1.0"
  class: "CommandLineTool"
  baseCommand: "grepwrap"
  doc: "Search for query terms in text files."

  inputs:
    query_term:
      type: "string"
      inputBinding:
        position: 0
      doc: "Search for QUERY_TERM in TEXT_FILE."
    text_file:
      type: "File"
      inputBinding:
        position: 1
      doc: "TEXT_FILE containing plain text."
    after_context:
      type: "int?"
      inputBinding:
        prefix: "-A"
      doc: "Print NUM lines of trailing context after matching lines."
    before_context:
      type: "int?"
      inputBinding:
        prefix: "-B"
      doc: "Print NUM lines of leading context before matching lines."

  outputs:
    out_file:
      type: "File"
      outputBinding:
        glob: "out.txt"
      doc: "Query results."

container:
  engine: "docker"
  settings:
    image:
      url: "docker.io/copla/grepwrap"
    ram: 256

inputs:
  query_term: "QU"
  text_file:
    class: "File"
    connector:
      command: "red-connector-http"
      access:
        url: "https://raw.githubusercontent.com/curious-containers/vagrant-quickstart/master/in.txt"
  before_context: 1

outputs:
  out_file:
    class: "File"
    connector:
      command: "red-connector-http"
      access:
        url: "https://example.com/out.txt"

execution:
  engine: "ccagency"
  settings:
    batchConcurrencyLimit: 8

Request (Python):

with open('red.yml') as f:
    red = yaml.load(f)

requests.post(
    'https://example.com/red',
    auth=('guest', 'guest'),
    json=red
)

Response (JSON):

{"experimentId": "5b7b30f2aafce97767a50a95"}

URL arguments:

Argument Type Optional Default Description
disableRetry boolean yes 0 (false) Debug option to not retry the execution of a failed batch
requests.post(
    'https://example.com/red?disableRetry=1',
    auth=('guest', 'guest'),
    json=red
)

GET /experiments/count

Count experiments stored in database.

Hint: Users without admin priviliges will only receive information about their own database entries.

URL parameters:

Parameter Type Optional Default Description
username string yes   Filter by username.

Request (Python):

requests.get(
    'https://example.com/experiments/count',
    auth=('guest', 'guest')
)

Response (JSON):

{"count": 1}

GET /experiments

List experiments stored in database sorted by registration time in descending order.

Hint: Users without admin priviliges will only receive information about their own database entries.

URL parameters:

Parameter Type Optional Default Description
skip integer >= 0 yes 0 Skip a certain number of experiments.
limit integer >= 1 yes   Limit the amount of experiments returned.
ascending boolean yes False Sort results by registrationTime in ascending order. Order is descending (newest first) by default.
username string yes   Filter by username.

Request (Python):

requests.get(
    'https://example.com/experiments?ascending=true&limit=10',
    auth=('guest', 'guest')
)

GET /experiments/EXPERIMENT_ID

Get full experiment stored in database by its experimentId.

Hint: Users without admin priviliges will only receive information about their own database entries.

Request (Python):

requests.get(
    'https://example.com/experiments/5b7b2c98aafce967d9e2709b',
    auth=('guest', 'guest')
)

GET /batches/count

Count batches stored in database.

Hint: Users without admin priviliges will only receive information about their own database entries.

URL parameters:

Parameter Type Optional Default Description
username string yes   Filter by username.
node string yes   Filter by node.
state enum: registered, scheduled, processing, succeeded, failed, cancelled yes   Filter by state.
experimentId string yes   Filter by experimentId.

Request (Python):

requests.get(
    'https://example.com/batches/count',
    auth=('guest', 'guest')
)

Response (JSON):

{"count": 1}

GET /batches

List batches stored in database sorted by registration time in descending order.

Hint: Users without admin priviliges will only receive information about their own database entries.

URL parameters:

Parameter Type Optional Default Description
skip integer >= 0 yes 0 Skip a certain number of experiments.
limit integer >= 1 yes   Limit the amount of experiments returned.
ascending boolean yes False Sort results by registrationTime in ascending order. Order is descending (newest first) by default.
username string yes   Filter by username.
node string yes   Filter by node.
state enum: registered, scheduled, processing, succeeded, failed, cancelled yes   Filter by state.
experimentId string yes   Filter by experimentId.

Request (Python):

requests.get(
    'https://example.com/batches?ascending=true&limit=10',
    auth=('guest', 'guest')
)

GET /batches/BATCH_ID

Get full batch stored in database by its batchId.

Hint: Users without admin priviliges will only receive information about their own database entries.

Request (Python):

requests.get(
    'https://example.com/batches/5b7b2c98aafce967d9e2709c',
    auth=('guest', 'guest')
)

DELETE /batches/BATCH_ID

Cancel unfinished batch by its batchId. This will not delete their database entries.

Hint: Users without admin priviliges can only cancel their own batches.

Request (Python):

requests.delete(
    'https://example.com/batches/5b7b2c98aafce967d9e2709c',
    auth=('guest', 'guest')
)

GET /batches/BATCH_ID/FILENAME

Get the stdout/stderr of the user process of the batch with the given batchId.

The stdout/stderr files are only provided, if the given batch failed or if the user specified the cli.stdout/cli.stderr files in the RED experiment.

To get the stdout of the user process use /batches/BATCH_ID/stdout. To get the stderr of the user process use /batches/BATCH_ID/stderr. Using the filename(s) specified in the RED file will not work.

Hint: Users without admin priviliges will only receive information about their own database entries.

requests.get(
    'https://example.com/batches/5b7b2c98aafce967d9e2709c/stdout',
    auth=('guest', 'guest')
)

GET /nodes

List docker-engine nodes available in the cluster.

Request (Python):

requests.get(
    'https://example.com/nodes',
    auth=(guest, guest)
)

Updated: