blob: 6dd0ce1a55590460525825893c79936955d3e04f [file] [log] [blame] [view]
---
title: REST API
layout: website-normal
---
Apache Brooklyn exposes a powerful REST API,
allowing it to be scripted from bash or integrated with other systems.
For many commands, the REST call follows the same structure as the web console URL
scheme, but with the `#` at the start of the path removed; for instance the catalog
item `cluster` in the web console is displayed at:
<!-- BROOKLYN_VERSION_BELOW -->
http://localhost:8081/#v1/catalog/entities/cluster:1.2.0-SNAPSHOT
And in the REST API it is accessed at:
<!-- BROOKLYN_VERSION_BELOW -->
http://localhost:8081/v1/catalog/entities/cluster:1.2.0-SNAPSHOT
A full reference for the REST API is automatically generated by the server at runtime.
It can be found in the Brooklyn web console by clicking `REST API` under the menu icon in the top right corner.
This opens a Swagger UI that allows users to see the full reference for the API capabilities, as well as
execute the API commands with a user-friendly interface.
Here we include some of the most common REST examples and other advice for working with the REST API.
### Tooling Tips
For command-line access, we recommend `curl`, with tips below.
For navigating in a browser we recommend getting a plugin for
working with REST; these are available for most browsers and
make it easier to authenticate, set headers, and see JSON responses.
For manipulating JSON responses on the command-line,
the library `jq` from [stedolan's github](https://stedolan.github.io/jq/)
is very useful, and available in most package repositories, including `port` and `brew` on Mac.
### Common REST Examples
Here are some useful snippets:
* List applications
curl http://localhost:8081/v1/applications
* Deploy an application from `__FILE__`
curl http://localhost:8081/v1/applications --data-binary @__FILE__
* Get details of a task with ID `__ID__` (where the `id` is returned by the above,
optionally piped to `jq .id`)
curl http://localhost:8081/v1/activities/__ID__
* Get the value of sensor `service.state` on entity `e1` in application `app1`
(note you can use either the entity's ID or its name)
curl http://localhost:8081/v1/applications/app1/entities/e1/sensors/service.state
* Get all sensor values (using the pseudo-sensor `current-state`)
curl http://localhost:8081/v1/applications/app1/entities/e1/sensors/service.state
* Invoke an effector `eff` on `e1`, with argument `arg1` equal to `hi`
(note if no arguments, you must specify `-d ""`; for multiple args, just use multiple `-d` entries,
or a JSON file with `--data-binary @...`)
curl http://localhost:8081/v1/applications/app1/entities/e1/effectors/eff -d arg1=hi
* Add an item to the catalog from `__FILE__`
curl http://localhost:8081/v1/catalog --data-binary @__FILE__
### Curl Cheat Sheet
* if authentication is required, use `--user username:password`
* to see detailed output, including headers, code, and errors, use `-v`
* where the request is not a simple HTTP GET, use `-X POST` or `-X DELETE`
* to pass key-value data to a post, use `-d key=value`
* where you are posting from a file `__FILE__`, use `--data-binary @__FILE__` (implies a POST) or `-T __FILE__ -X POST`
* to add a header, use `-H "key: value"`, for example `-H "Brooklyn-Allow-Non-Master-Access: true"`
* to specify that a specific content-type is being uploaded, use `-H "Content-Type: application/json"` (or `application/yaml`)
* to specify the content-type required for the result, use `-H "Accept: application/json"`
(or `application/yaml`, or for sensor values, `text/plain`)