blob: 4bb49ec946391af2a3d76f7b2bc977bab953f3f5 [file] [edit]
.. _api:
Accessing Data outside of LNT: REST API
=======================================
LNT provides comprehensive REST APIs to access and manage data stored in the LNT database.
Quick Reference
---------------
Complete Endpoint Summary
~~~~~~~~~~~~~~~~~~~~~~~~~
+-------+-------------------------------------------------------+---------------------------+
| Method| Endpoint | Authentication Required |
+=======+=======================================================+===========================+
| GET | /fields | No |
+-------+-------------------------------------------------------+---------------------------+
| GET | /tests | No |
+-------+-------------------------------------------------------+---------------------------+
| GET | /schema | No |
+-------+-------------------------------------------------------+---------------------------+
| POST | /schema | **Yes** |
+-------+-------------------------------------------------------+---------------------------+
| GET | /machines | No |
+-------+-------------------------------------------------------+---------------------------+
| GET | /machines/<machine_spec> | No |
+-------+-------------------------------------------------------+---------------------------+
| PUT | /machines/<machine_spec> | **Yes** |
+-------+-------------------------------------------------------+---------------------------+
| POST | /machines/<machine_spec> | **Yes** |
+-------+-------------------------------------------------------+---------------------------+
| DELETE| /machines/<machine_spec> | **Yes** |
+-------+-------------------------------------------------------+---------------------------+
| GET | /runs/<run_id> | No |
+-------+-------------------------------------------------------+---------------------------+
| POST | /runs | **Yes** |
+-------+-------------------------------------------------------+---------------------------+
| DELETE| /runs/<run_id> | **Yes** |
+-------+-------------------------------------------------------+---------------------------+
| GET | /samples | No |
+-------+-------------------------------------------------------+---------------------------+
| GET | /samples/<sample_id> | No |
+-------+-------------------------------------------------------+---------------------------+
| GET | /orders/<order_id> | No |
+-------+-------------------------------------------------------+---------------------------+
| GET | /graph/<machine_id>/<test_id>/<field_index> | No |
+-------+-------------------------------------------------------+---------------------------+
| GET | /regression/<machine_id>/<test_id>/<field_index> | No |
+-------+-------------------------------------------------------+---------------------------+
All endpoints are prefixed with: ``/api/db_<database>/v4/<testsuite>``
Overview
--------
The REST API provides programmatic access to:
* **Test suites** - Schema definitions and test metadata
* **Machines** - Test execution machines and their configurations
* **Runs** - Test execution results and submission
* **Samples** - Individual test measurements and metrics
* **Orders** - Ordering information for test runs
* **Regressions** - Performance regression data
* **Graphs** - Historical performance data for visualization
All API endpoints follow the pattern::
http://<server>/api/db_<database>/v4/<testsuite>/<resource>
For example::
http://lnt.llvm.org/api/db_default/v4/nts/machines/1330
Response Format
---------------
All API responses are JSON formatted and include common metadata fields:
* ``generated_by`` - LNT server version that generated the response
Example response structure::
{
"generated_by": "LNT Server <version>",
"machines": [...],
"runs": [...]
}
All responses include CORS headers (``Access-Control-Allow-Origin: *``) to support cross-origin requests.
.. _auth_tokens:
Authentication
--------------
**Read Operations**: All GET requests are unauthenticated and publicly accessible.
**Write Operations**: POST, PUT, and DELETE requests require authentication via an ``AuthToken`` HTTP header.
To enable authentication, add the ``api_auth_token`` setting to your instance's ``lnt.cfg`` configuration file::
# API Auth Token
api_auth_token = "SomeSecret"
Include this token in the request header::
curl --request DELETE \
--header "AuthToken: SomeSecret" \
http://localhost:8000/api/db_default/v4/nts/runs/1
Without a valid token, write operations will return HTTP 401 Unauthorized.
Error Handling
--------------
HTTP Status Codes
~~~~~~~~~~~~~~~~~
The API uses standard HTTP status codes:
* **200 OK** - Successful GET request
* **201 Created** - Successful POST request (e.g. schema creation)
* **301 Moved Permanently** - Successful run submission with redirect to the created resource
* **400 Bad Request** - Invalid request data or parameters
* **401 Unauthorized** - Missing or invalid authentication token
* **404 Not Found** - Requested resource does not exist
* **415 Unsupported Media Type** - Invalid Content-Type header
Error Response Format
~~~~~~~~~~~~~~~~~~~~~
Error responses include a descriptive message:
.. code-block:: json
{
"msg": "Auth Token must be passed in AuthToken header, and included in LNT config.",
"status": 401
}
API Endpoints
-------------
Test Suite Metadata
~~~~~~~~~~~~~~~~~~~
Fields
^^^^^^
**GET** ``/api/db_<database>/v4/<testsuite>/fields``
Lists all sample fields (metrics) defined in the test suite.
**Response:**
.. code-block:: json
{
"generated_by": "LNT Server <version>",
"fields": [
{
"column_id": 0,
"column_name": "compile_time",
"column_type": "REAL"
},
{
"column_id": 1,
"column_name": "execution_time",
"column_type": "REAL"
}
]
}
Tests
^^^^^
**GET** ``/api/db_<database>/v4/<testsuite>/tests``
Lists all tests registered in the test suite.
**Response:**
.. code-block:: json
{
"generated_by": "LNT Server <version>",
"tests": [
{
"id": 1,
"name": "test.compile.time"
},
{
"id": 2,
"name": "test.execution.time"
}
]
}
Schema
^^^^^^
**GET** ``/api/db_<database>/v4/<testsuite>/schema``
Returns the complete test suite schema definition.
**Response:** The full schema object in JSON format.
**POST** ``/api/db_<database>/v4/<testsuite>/schema``
Creates or updates a test suite schema. Requires authentication.
**Headers:**
* ``AuthToken: <token>`` (required)
* ``Content-Type: application/x-yaml`` (required)
**Request Body:** YAML schema definition (see schemas/ directory for examples)
**Example:**
.. code-block:: bash
curl --request POST \
--header "AuthToken: SomeSecret" \
--header "Content-Type: application/x-yaml" \
--data-binary @my_suite.yaml \
http://localhost:8000/api/db_default/v4/my_suite/schema
**Response (201 Created):**
.. code-block:: json
{
"generated_by": "LNT Server <version>",
"testsuite": "my_suite",
"schema": {}
}
**Error Responses:**
* 400 Bad Request - Invalid YAML, missing required fields, or schema validation errors
* 401 Unauthorized - Missing or invalid AuthToken
* 415 Unsupported Media Type - Content-Type is not application/x-yaml
Machines
~~~~~~~~
List Machines
^^^^^^^^^^^^^
**GET** ``/api/db_<database>/v4/<testsuite>/machines``
Lists all machines registered in the test suite.
**Response:**
.. code-block:: json
{
"generated_by": "LNT Server <version>",
"machines": [
{
"id": 1,
"name": "machine1",
"info": {}
}
]
}
Machine Details
^^^^^^^^^^^^^^^
**GET** ``/api/db_<database>/v4/<testsuite>/machines/<machine_spec>``
Retrieves detailed information about a specific machine and all runs executed on it.
**Parameters:**
* ``machine_spec`` - Machine ID (numeric) or machine name (string)
**Response:**
.. code-block:: json
{
"generated_by": "LNT Server <version>",
"machine": {
"id": 1,
"name": "machine1",
"info": {}
},
"runs": [
{
"id": 101,
"machine_id": 1,
"order": {},
"start_time": "2026-01-15T10:30:00"
}
]
}
**Error Responses:**
* 404 Not Found - Machine not found or ambiguous name (use ID instead)
Delete Machine
^^^^^^^^^^^^^^
**DELETE** ``/api/db_<database>/v4/<testsuite>/machines/<machine_spec>``
Deletes a machine and all associated runs. Requires authentication.
**Headers:**
* ``AuthToken: <token>`` (required)
**Response:** Streaming text response showing deletion progress
**Example:**
.. code-block:: bash
curl --request DELETE \
--header "AuthToken: SomeSecret" \
http://localhost:8000/api/db_default/v4/nts/machines/1
Update Machine
^^^^^^^^^^^^^^
**PUT** ``/api/db_<database>/v4/<testsuite>/machines/<machine_spec>``
Updates machine information. Requires authentication.
**Headers:**
* ``AuthToken: <token>`` (required)
* ``Content-Type: application/json`` (required)
**Request Body:**
.. code-block:: json
{
"machine": {
"name": "new_name",
"info": {}
}
}
Machine Operations
^^^^^^^^^^^^^^^^^^
**POST** ``/api/db_<database>/v4/<testsuite>/machines/<machine_spec>``
Performs special operations on machines. Requires authentication.
**Headers:**
* ``AuthToken: <token>`` (required)
**Rename Machine:**
.. code-block:: bash
curl --request POST \
--header "AuthToken: SomeSecret" \
--data "action=rename&name=new_machine_name" \
http://localhost:8000/api/db_default/v4/nts/machines/1
**Merge Machines:**
Merges all runs from one machine into another, then deletes the source machine.
.. code-block:: bash
curl --request POST \
--header "AuthToken: SomeSecret" \
--data "action=merge&into=2" \
http://localhost:8000/api/db_default/v4/nts/machines/1
**Error Responses:**
* 400 Bad Request - Missing action parameter, invalid action, or operation-specific errors
* 401 Unauthorized - Missing or invalid AuthToken
Runs
~~~~
Get Run
^^^^^^^
**GET** ``/api/db_<database>/v4/<testsuite>/runs/<run_id>``
Retrieves complete information about a specific run, including all sample data.
**Response:**
.. code-block:: json
{
"generated_by": "LNT Server <version>",
"run": {
"id": 101,
"machine_id": 1,
"order_id": 50,
"start_time": "2026-01-15T10:30:00",
"end_time": "2026-01-15T11:30:00"
},
"machine": {
"id": 1,
"name": "machine1"
},
"tests": [
{
"id": 1001,
"run_id": 101,
"name": "test.compile.time",
"compile_time": 1.23,
"execution_time": 0.45
}
]
}
**Error Responses:**
* 404 Not Found - Run not found
Delete Run
^^^^^^^^^^
**DELETE** ``/api/db_<database>/v4/<testsuite>/runs/<run_id>``
Deletes a specific run and all associated sample data. Requires authentication.
**Headers:**
* ``AuthToken: <token>`` (required)
**Example:**
.. code-block:: bash
curl --request DELETE \
--header "AuthToken: SomeSecret" \
http://localhost:8000/api/db_default/v4/nts/runs/101
Submit Run
^^^^^^^^^^
**POST** ``/api/db_<database>/v4/<testsuite>/runs``
Submits new test run data to the database. Requires authentication.
**Headers:**
* ``AuthToken: <token>`` (required)
* ``Content-Type: application/json`` (required)
**Query Parameters:**
* ``select_machine`` - Machine selection strategy (default: "match")
* ``merge`` - Run ID to merge with (optional)
* ``ignore_regressions`` - Skip regression detection (optional, boolean)
**Request Body:** JSON or Property List formatted run data (see :ref:`importing_data` for format)
**Response (301 Moved Permanently):**
.. code-block:: json
{
"success": true,
"run_id": 102,
"result_url": "http://localhost:8000/api/db_default/v4/nts/runs/102"
}
**Error Responses:**
* 400 Bad Request - Invalid data format or submission rejected
* 401 Unauthorized - Missing or invalid AuthToken
Samples
~~~~~~~
Get Sample
^^^^^^^^^^
**GET** ``/api/db_<database>/v4/<testsuite>/samples/<sample_id>``
Retrieves a specific sample's data.
**Response:**
.. code-block:: json
{
"generated_by": "LNT Server <version>",
"samples": [
{
"id": 1001,
"run_id": 101,
"test_id": 1,
"compile_time": 1.23,
"execution_time": 0.45
}
]
}
Query Samples
^^^^^^^^^^^^^
**GET** ``/api/db_<database>/v4/<testsuite>/samples?runid=<id>&runid=<id>...``
Retrieves sample data for multiple runs. Useful for bulk data export.
**Query Parameters:**
* ``runid`` - Run ID (can be specified multiple times)
**Example:**
.. code-block:: bash
curl "http://localhost:8000/api/db_default/v4/nts/samples?runid=101&runid=102&runid=103"
**Response:**
.. code-block:: json
{
"generated_by": "LNT Server <version>",
"samples": [
{
"id": 1001,
"run_id": 101,
"name": "test.compile.time",
"llvm_project_revision": "abc123",
"compile_time": 1.23
},
{
"id": 1002,
"run_id": 102,
"name": "test.compile.time",
"llvm_project_revision": "def456",
"compile_time": 1.25
}
]
}
Empty samples (all fields are null) are omitted from results.
**Error Responses:**
* 400 Bad Request - No runid parameters provided
Orders
~~~~~~
Get Order
^^^^^^^^^
**GET** ``/api/db_<database>/v4/<testsuite>/orders/<order_id>``
Retrieves order information (version/revision tracking).
**Response:**
.. code-block:: json
{
"generated_by": "LNT Server <version>",
"orders": [
{
"id": 50,
"llvm_project_revision": "abc123",
"previous_order_id": 49
}
]
}
Graphs and Regressions
~~~~~~~~~~~~~~~~~~~~~~~
Graph Data
^^^^^^^^^^
**GET** ``/api/db_<database>/v4/<testsuite>/graph/<machine_id>/<test_id>/<field_index>``
Retrieves time-series data for graphing a specific metric on a machine/test combination.
**Query Parameters:**
* ``limit`` - Maximum number of data points to return (optional)
**Response:**
.. code-block:: json
[
[
"abc123",
1.23,
{
"label": "abc123",
"date": "2026-01-15 10:30:00",
"runID": "101"
}
],
[
"def456",
1.25,
{
"label": "def456",
"date": "2026-01-16 10:30:00",
"runID": "102"
}
]
]
Each data point is an array: ``[revision, value, metadata]``
Regression Data
^^^^^^^^^^^^^^^
**GET** ``/api/db_<database>/v4/<testsuite>/regression/<machine_id>/<test_id>/<field_index>``
Retrieves regression information for a specific metric on a machine/test combination.
**Response:**
.. code-block:: json
[
{
"id": 1,
"title": "Performance regression in test.compile.time",
"state": "active",
"end_point": ["def456", 1.35]
}
]
**Error Responses:**
* 404 Not Found - Invalid machine, test, or field
Usage Examples
--------------
**List all machines:**
.. code-block:: bash
curl http://localhost:8000/api/db_default/v4/nts/machines
**Get run details:**
.. code-block:: bash
curl http://localhost:8000/api/db_default/v4/nts/runs/101
**Delete a run:**
.. code-block:: bash
curl --request DELETE \
--header "AuthToken: SomeSecret" \
http://localhost:8000/api/db_default/v4/nts/runs/101
**Bulk sample export:**
.. code-block:: bash
curl "http://localhost:8000/api/db_default/v4/nts/samples?runid=101&runid=102&runid=103" \
| python -m json.tool