cloudsoft.io

AMP Cluster REST API

Overview and Design Goals

This document details the beta Cluster API it currently covers only the initial use-cases. Much longer term, we hope that it will become (or inform) the basis of the API for “truly clustered AMP” with features such as auto-sharding.

API Documentation

Authentication

The Authentication method used is basic authentication, with credentials set through the AMP Cluster blueprint. For making API requests, the authentication username and password should be set in the request header. To do this in curl for example:

curl --user name:password http://endpoint/v1/cluster/version

Version: GET /v1/cluster/version

Returns:

  • 200: Status ok

Response:

{
    "version": "1.9.1"    
}

Deploy an app: POST /v1/cluster/applications?tagName=tagValue

Returns:

  • 201: if created

The request body is a normal YAML app, e.g.:

services:
- type: org.apache.brooklyn.entity.machine.MachineEntity

Example response:

{
    "kind": "ClusterApplication",
    "applicationId": "afiejafefil",
    "ampNodeUri": "https://amp1.example.org",
    "labels": { "tagName": "tagValue" },
    "creationDate": "2017-03-29T21:31:02+0000"
}

Listing of apps

All apps: GET /v1/cluster/applications/

Returns:

  • 200: json for all the apps

Example response:

{
    "kind": "ClusterApplicationList",
    "items": [
        {
            "kind": "ClusterApplication",
            "applicationId": "afiejafefil",
            "ampNodeUri": "https://amp1.example.org",
            "creationDate": "2017-03-29T21:31:02+0000"
            "labels": {
                "test-label": "test-label",
                "test-label2": "test-company"
            }
        }
    ]
}

Single app: GET /v1/cluster/applications/${app-id}

Returns:

  • 200: json for the given app
  • 404 if not found

Example response:

{
    "kind": "ClusterApplication",
    "applicationId": "ruf89yeoy8",
    "ampNodeUri": "http://104.155.106.130:8081",
    "creationDate": "2017-05-17T13:59:24+0000",
    "labels": {
        "test-label": "test-label",
        "test-label2": "test-company"
    }
}

Search for apps: GET /v1/cluster/applications?filter=label [in|matches] ([value1,value2|regex])&filter=...

Example searches:

/v1/cluster/applications?filter=department in (development,finance)
/v1/cluster/applications?filter=testLabel in (.+test)
/v1/cluster/applications?filter=department in (development,finance)&testLabel in (.+test)

Returns:

  • 200: json for the matching apps (including empty list if no matches)
  • 400: if invalid regex

Example response:

{
    "kind": "ClusterApplication",
    "applicationId": "ruf89yeoy8",
    "ampNodeUri": "http://104.155.106.130:8081",
    "creationDate": "2017-05-17T13:59:24+0000",
    "labels": {
        "test-label": "test-label",
        "test-label2": "test-company"
    }
}

Catalog management

These operations affect all Worker AMPs in the cluster.

Add YAML to Catalog: POST /v1/cluster/catalog

Returns:

  • 201: if created

The request body is a normal YAML catalog item, e.g.:

brooklyn.catalog:
  id: my-new-app
  version: 1.0.0
  itemType: entity
  item:
    type: org.apache.brooklyn.entity.machine.MachineEntity

Request headers:

  • Content-Type: application/x-yaml

Response is a cut-down version of what AMP returns currently:

Example response:

{
    "kind": "CatalogItemIdList",
    "items": [
        "my-new-app:1.0.0"
    ]
}

Add zip/bundle to Catalog: POST /v1/cluster/catalog

Returns:

  • 201: if created

The request body is zip or bundle (as with AMP).

Request headers:

  • Content-Type: application/x-zip

Response is the same as for adding yaml-based catalog items (i.e. a list of the catalog item ids that were added).

Managing list of Worker AMPs (Internal)

This part of the API is potentially temporary; it may well be moved into an external placement strategy; this is internal only.

Add Worker AMP to Cluster: PUT /v1/cluster/nodes/${id}

Returns:

  • 200: if joined successfully

Example request body:

{
    "uri": "https://amp2.example.org",
    "username": "amp",
    "password": "pa55wOrd"
}

Remove Worker AMP from Cluster: DELETE /v1/cluster/nodes/${id}

Returns:

  • 200: if deleted successfully
  • 404: if AMP not known about

List Worker AMPs: GET /v1/cluster/nodes

Returns:

  • 200

Example response:

{
    "kind": "ClusterNodeList",
    "items": [
        {
            "kind": "ClusterNode",
            "uri": "https://amp1.example.org"
        },
        {
            "kind": "ClusterNode",
            "uri": "https://amp2.example.org"
        }
    ]
}