valet/doc/rest_api.md
Joe D'Andrea 1e146b1499 Add locations to POST /v1/plans API
When determining placements for a related set of resources
via OpenStack Heat, there's no a priori knowledge of specific
location candidates. Thus the /v1/plans API never accounted
for them. However, when it comes to ad hoc placement of a
single resource (e.g., via OpenStack Nova), such knowledge
*does* exist. This is one piece of a three-part change (same
issue tracking ID).

Change-Id: I327b87a1a1104019239547d03600cdd849ea6501
2017-05-04 21:43:50 -05:00

28 KiB

Placement API v1 - CURRENT

Determines placement for cloud resources.

General API information

Authenticated calls that target a known URI but that use an HTTP method the implementation does not support return a 405 Method Not Allowed status. In addition, the HTTP OPTIONS method is supported for each known URI. In both cases, the Allow response header indicates the supported HTTP methods. See the API Errors section for more information about the error response structure.

API versions

List all Placement API versions

GET /

Normal response codes: 200

{
  "versions": [
    {
      "status": "CURRENT",
      "id": "v1.0",
      "links": [
        {
          "href": "http://127.0.0.1:8090/v1/",
          "rel": "self"
        }
      ]
    }
  ]
}

This operation does not accept a request body.

Groups

Create a group

POST /v1/groups

Normal response codes: 201 Error response codes: badRequest (400), unauthorized (401), internalServerError (500)

Request parameters

Parameter Style Type Description
description plain xsd:string A description for the new group.
name plain xsd:string A name for the new group. Must only contain letters, numbers, hypens, full stops, underscores, and tildes (RFC 3986, Section 2.3). This parameter is immutable.
type plain xsd:string A type for the new group. Presently, the only valid value is exclusivity. This parameter is immutable.

Response parameters

Parameter Style Type Description
description plain xsd:string The group description.
id plain csapi:UUID The UUID of the group.
members plain xsd:list A list of group members. Initially empty.
name plain xsd:string The group name.
type plain xsd:string The group type.
{
  "name": "group",
  "description": "My Awesome Group",
  "type": "exclusivity"
}
{
  "description": "My Awesome Group",
  "type": "exclusivity",
  "id": "7de4790e-08f2-44b7-8332-7a41fab36a41",
  "members": [],
  "name": "group"
}

List active groups

GET /v1/groups

Normal response codes: 200 Error response codes: unauthorized (401)

Response parameters

Parameter Style Type Description
description plain xsd:string The group description.
id plain csapi:UUID The UUID of the group.
members plain xsd:list A list of group members. Initially empty.
name plain xsd:string The group name.
type plain xsd:string The group type.

This operation does not accept a request body.

{
  "groups": [
    {
      "description": "My Awesome Group",
      "type": "exclusivity",
      "id": "7de4790e-08f2-44b7-8332-7a41fab36a41",
      "members": [],
      "name": "group"
    }
  ]
}

Show group details

GET /v1/groups/{group_id}

Normal response codes: 200 Error response codes: unauthorized (401), itemNotFound (404)

Request parameters

Parameter Style Type Description
group_id plain csapi:UUID The UUID of the group.

Response parameters

Parameter Style Type Description
description plain xsd:string The group description.
id plain csapi:UUID The UUID of the group.
members plain xsd:list A list of group members.
name plain xsd:string The group name.
type plain xsd:string The group type.
{
  "group": {
    "description": "My Awesome Group",
    "type": "exclusivity",
    "id": "7de4790e-08f2-44b7-8332-7a41fab36a41",
    "members": [],
    "name": "group"
  }
}

This operation does not accept a request body.


Update a group

PUT /v1/groups/{group_id}

Normal response codes: 201 Error response codes: badRequest (400), unauthorized (401), itemNotFound (404)

Request parameters

Parameter Style Type Description
description plain xsd:string A description for the group. Replaces the original description.
group_id plain csapi:UUID The UUID of the group.

Response parameters

Parameter Style Type Description
description plain xsd:string The group description.
id plain csapi:UUID The UUID of the group.
members plain xsd:list A list of group members.
name plain xsd:string The group name.
type plain xsd:string The group type.
{
  "description": "My Extra Awesome Group"
}
{
  "description": "My Extra Awesome Group",
  "type": "exclusivity",
  "id": "7de4790e-08f2-44b7-8332-7a41fab36a41",
  "members": [],
  "name": "group"
}

Delete a group

DELETE /v1/groups/{group_id}

Normal response codes: 204 Error response codes: badRequest (400), unauthorized (401), itemNotFound (404), conflict (409)

Request parameters

Parameter Style Type Description
group_id plain csapi:UUID The UUID of the group.

This operation does not accept a request body and does not return a response body.


Add members to a group

PUT /v1/groups/{group_id}/members

Normal response codes: 201 Error response codes: badRequest (400), unauthorized (401), itemNotFound (404), conflict (409)

Request parameters

Parameter Style Type Description
group_id plain csapi:UUID The UUID of the group.
members plain xsd:list A list of group members. This is added to any previous list of members. All members must be valid tenant UUIDs.

Response parameters

Parameter Style Type Description
description plain xsd:string The group description.
id plain csapi:UUID The UUID of the group.
members plain xsd:list A list of group members.
name plain xsd:string The group name.
type plain xsd:string The group type.
{
  "members": [
    "b7d0e9b175294b649464caa3411adb3f"
  ]
}
{
  "description": "My Awesome Group",
  "type": "exclusivity",
  "id": "bf49803b-48b6-4a13-9191-98dde1dbd5e4",
  "members": [
    "b7d0e9b175294b649464caa3411adb3f",
    "65c3e5ee5ee0428caa5e5275c58ead61"
  ],
  "name": "group"
}

Verify membership in a group

GET /v1/groups/{group_id}/members/{member_id}

Normal response codes: 204 Error response codes: badRequest (400), unauthorized (401), itemNotFound (404)

Request parameters

Parameter Style Type Description
group_id plain csapi:UUID The UUID of the group.
member_id plain csapi:UUID The UUID of one potential group member. Members are tenant UUIDs.

This operation does not accept a request body and does not return a response body.


Delete member from a group

DELETE /v1/groups/{group_id}/members/{member_id}

Normal response codes: 204 Error response codes: badRequest (400), unauthorized (401), itemNotFound (404)

Request parameters

Parameter Style Type Description
group_id plain csapi:UUID The UUID of the group.
member_id plain csapi:UUID The UUID of one potential group member. Members are tenant UUIDs.

This operation does not accept a request body and does not return a response body.


Delete all members from a group

DELETE /v1/groups/{group_id}/members

Normal response codes: 204 Error response codes: badRequest (400), unauthorized (401), itemNotFound (404)

Request parameters

Parameter Style Type Description
group_id plain csapi:UUID The UUID of the group.

This operation does not accept a request body and does not return a response body.

Status

Get summary status of all subsystems

HEAD /v1/status

Normal response codes: 200 Error response codes: internalServerError (500)

This operation does not accept a request body and does not return a response body.

List detailed status of all subsystems

GET /v1/status

Normal response codes: 200 Error response codes: internalServerError (500)

Response parameters

Parameter Style Type Description
status plain xsd:dict A dictionary of statuses from each subsystem, keyed by name.

This operation does not accept a request body.

{
  "status": {
    "ostro": {
      "status": {
        "message": "ping",
        "type": "ok"
      },
      "resources": {
        "ip": "135.197.226.83"
      }
    }
  }
}

Placements

List active placements

GET /v1/placements

Normal response codes: 200 Error response codes: unauthorized (401)

Response parameters

Parameter Style Type Description
id plain csapi:UUID The UUID of the placement.
location plain xsd:string The placement location of the resource.
name plain xsd:string The name of the resource.
orchestration_id plain csapi:UUID The UUID provided by an orchestration engine (e.g., heat-engine) prior to instantiation of the resource.
resource_id plain csapi:UUID The physical UUID of the resource. The value is unknown until a placement has been reserved for the first time.
plan_id plain csapi:UUID The UUID of the plan.
reserved plain xsd:boolean Set to true if the placement was successfully reserved.

This operation does not accept a request body.

{
  "placements": [
    {
      "plan_id": "e01ae778-52c8-4e52-9f32-a486584f0e89",
      "name": "my-instance-1",
      "orchestration_id": "f8cfab7e-83d0-4a7d-8551-905ea8a43a39",
      "resource_id": "240b2fe5-2e01-4cfb-982c-67e3f1553386",
      "location": "qos104",
      "reserved": true,
      "id": "55f4aee9-b7df-44d0-85d3-3234c08dbfb4"
    },
    {
      "plan_id": "c8b8e9d9-227f-4652-8a18-523cd37b86c0",
      "name": "ad_hoc_instance",
      "orchestration_id": "23ffc206-cb57-4b99-9393-6e01837855bc",
      "resource_id": null,
      "location": "qos101",
      "reserved": false,
      "id": "dbbc9ae2-3ba2-4409-8765-03cdbfcd0dcb"
    }
  ]
}

Show placement details with no reservation

GET /v1/placements/{placement_id}

Normal response codes: 200 Error response codes: unauthorized (401), itemNotFound (404)

Request parameters

Parameter Style Type Description
placement_id plain csapi:UUID The UUID of the placement or its associated orchestration UUID.

Response parameters

Parameter Style Type Description
id plain csapi:UUID The UUID of the placement.
location plain xsd:string The placement location of the resource.
name plain xsd:string The name of the resource.
orchestration_id plain csapi:UUID The UUID provided by an orchestration engine (e.g., heat-engine) prior to instantiation of the resource.
resource_id plain csapi:UUID The physical UUID of the resource. The value is unknown until a placement has been reserved for the first time.
plan_id plain csapi:UUID The UUID of the plan.
reserved plain xsd:boolean Set to true if the placement was successfully reserved.

This operation does not accept a request body.

{
  "placement": {
    "plan_id": "a78d1936-0b63-4ce3-9450-832f71ebf160",
    "name": "my_instance",
    "orchestration_id": "b71bedad-dd57-4942-a7bd-ab074b72d652",
    "resource_id": null,
    "location": "qos105",
    "reserved": false,
    "id": "b7116936-5210-448a-b21f-c35f33e9bcc2"
  }
}

Reserve a placement with possible replanning

POST /v1/placements/{placement_id}

Normal response codes: 201 Error response codes: unauthorized (401), itemNotFound (404), internalServerError (500)

Request parameters

Parameter Style Type Description
locations plain xsd:list A list of available locations. If the placement was not planned in one of these locations, the placement for this resource (and any others in the same plan not yet reserved) will be replanned on-the-fly.
resource_id plain csapi:UUID The physical UUID of the resource.
placement_id plain csapi:UUID The UUID of the placement or its associated orchestration UUID.

Response parameters

Parameter Style Type Description
id plain csapi:UUID The UUID of the placement.
location plain xsd:string The placement location of the resource.
name plain xsd:string The name of the resource.
orchestration_id plain csapi:UUID The UUID provided by an orchestration engine (e.g., heat-engine) prior to instantiation of the resource.
resource_id plain csapi:UUID The physical UUID of the resource.
plan_id plain csapi:UUID The UUID of the plan.
reserved plain xsd:boolean Set to true if the placement was successfully reserved.
{
  "locations": ["qos101", "qos102", "qos104", "qos106", "qos107"],
  "resource_id": "240b2fe5-2e01-4cfb-982c-67e3f1553386"
}
{
  "placement": {
    "plan_id": "a78d1936-0b63-4ce3-9450-832f71ebf160",
    "name": "my_instance",
    "orchestration_id": "b71bedad-dd57-4942-a7bd-ab074b72d652",
    "resource_id": "240b2fe5-2e01-4cfb-982c-67e3f1553386",
    "location": "qos101",
    "reserved": true,
    "id": "b7116936-5210-448a-b21f-c35f33e9bcc2"
  }
}

Plans

Create a plan

POST /v1/plans

Normal response codes: 201 Error response codes: badRequest (400), unauthorized (401), internalServerError (500)

Request parameters

Parameter Style Type Description
locations plain xsd:list An optional list of placement location candidates.
plan_name plain xsd:string The name of the plan.
resources plain xsd:dict A dictionary of resources to be planned. Each is keyed by an orchestration uuid. This is a UUID provided by an orchestration engine (e.g., heat-engine) prior to instantiation of a resource. The dictionary contains three keys:
name: resource name
type: resource type (in Heat Orchestration Template format)
properties: resource properties (in Heat Orchestration Template format)
stack_id plain csapi:UUID The UUID of the stack.

Response parameters

Parameter Style Type Description
stack_id plain csapi:UUID The UUID of the stack.
id plain csapi:UUID The UUID of the plan.
placements plain xsd:dict A dictionary of planned resources. Each is keyed by an orchestration uuid. This is a UUID provided by an orchestration engine (e.g., heat-engine) prior to instantiation of a resource. The dictionary contains two keys:
location: resource placement
name: resource name
name plain xsd:string The name of the plan.
{
  "plan_name": "e624474b-fc80-4053-ab5f-45cc1030e692",
  "resources": {
    "b71bedad-dd57-4942-a7bd-ab074b72d652": {
      "properties": {
        "flavor": "m1.small",
        "image": "ubuntu12_04",
        "key_name": "demo",
        "networks": [
          {
            "network": "demo-net"
          }
        ]
      },
      "type": "OS::Nova::Server",
      "name": "my_instance"
    }
  },
  "stack_id": "e624474b-fc80-4053-ab5f-45cc1030e692"
}
{
  "plan" {
    "stack_id": "e624474b-fc80-4053-ab5f-45cc1030e692",
    "id": "1853a7e7-0075-465b-9019-8908db680f2e",
    "placements": {
      "b71bedad-dd57-4942-a7bd-ab074b72d652": {
        "location": "qos103",
        "name": "my_instance"
      }
    },
    "name": "e624474b-fc80-4053-ab5f-45cc1030e692"
  }
}

List active plans

GET /v1/plans

Normal response codes: 200 Error response codes: unauthorized (401)

Response parameters

Parameter Style Type Description
stack_id plain csapi:UUID The UUID of the stack.
id plain csapi:UUID The UUID of the plan.
placements plain xsd:dict A dictionary of planned resources. Each is keyed by an orchestration uuid. This is a UUID provided by an orchestration engine (e.g., heat) prior to instantiation of a resource. The dictionary contains two keys:
location: resource placement
name: resource name
name plain xsd:string The name of the plan.

This operation does not accept a request body.

{
  "plans": [
    {
      "stack_id": "e624474b-fc80-4053-ab5f-45cc1030e692",
      "id": "f1a81397-e4d4-46de-8445-dfadef633beb",
      "placements": {
        "b71bedad-dd57-4942-a7bd-ab074b72d652": {
          "location": "qos101",
          "name": "my_instance"
        }
      },
      "name": "e624474b-fc80-4053-ab5f-45cc1030e692"
    },
    {
      "stack_id": "8e06301e-7375-465f-9fc7-70fb13763927",
      "id": "f56391b0-61bb-4e18-b9ca-23c0ff2e4508",
      "placements": {
        "8e06301e-7375-465f-9fc7-70fb13763927": {
          "location": "qos101",
          "name": "ad_hoc_instance"
        }
      },
      "name": "8e06301e-7375-465f-9fc7-70fb13763927"
    }
  ]
}

Show plan details

GET /v1/plans/{plan_id}

Normal response codes: 200 Error response codes: unauthorized (401), itemNotFound (404)

Request parameters

Parameter Style Type Description
plan_id plain csapi:UUID The UUID of the plan or its associated stack UUID.

Response parameters

Parameter Style Type Description
stack_id plain csapi:UUID The UUID of the stack.
id plain csapi:UUID The UUID of the plan.
placements plain xsd:dict A dictionary of planned resources. Each is keyed by an orchestration UUID. This is provided by an orchestration engine (e.g., heat) prior to instantiation of a resource. The dictionary contains two keys:
location: resource placement
name: resource name
name plain xsd:string The name of the plan.

This operation does not accept a request body.

{
  "plan": {
    "stack_id": "e624474b-fc80-4053-ab5f-45cc1030e692",
    "id": "1853a7e7-0075-465b-9019-8908db680f2e",
    "placements": {
      "b71bedad-dd57-4942-a7bd-ab074b72d652": {
        "location": "qos103",
        "name": "my_instance"
      }
    },
    "name": "e624474b-fc80-4053-ab5f-45cc1030e692"
  }
}

Update a plan

PUT /v1/plans/{plan_id}

Normal response codes: 201 Error response codes: badRequest (400), unauthorized (401), itemNotFound (404)

Request parameters

Parameter Style Type Description
plan_id plain csapi:UUID The UUID of the plan or its associated stack id.
action plain xsd:string The plan update action. There is only one valid option at this time.
migrate: Replan a single resource
excluded_hosts plain xsd:list A list of hosts that must not be considered when replanning
resources plain xsd:list When action="migrate" this is a list of length one. The lone item is either a physical resource id or an orchestration id.

Response parameters

Parameter Style Type Description
stack_id plain csapi:UUID The UUID of the stack.
id plain csapi:UUID The UUID of the plan.
placements plain xsd:dict A dictionary of planned resources. Each is keyed by an orchestration uuid. This is provided by an orchestration engine (e.g., heat) prior to instantiation of a resource. The dictionary contains two keys:
location: resource placement
name: resource name
{
  "action": "migrate",
  "excluded_hosts": ["qos104", "qos106", "qos107"],
  "resources": ["b71bedad-dd57-4942-a7bd-ab074b72d652"]
}
{
  "plan": {
    "stack_id": "e624474b-fc80-4053-ab5f-45cc1030e692",
    "id": "a78d1936-0b63-4ce3-9450-832f71ebf160",
    "placements": {
      "b71bedad-dd57-4942-a7bd-ab074b72d652": {
        "location": "qos105",
        "name": "my_instance"
      }
    },
    "name": "e624474b-fc80-4053-ab5f-45cc1030e692"
  }
}

Delete a plan

DELETE /v1/plans/{plan_id}

Normal response codes: 204 Error response codes: badRequest (400), unauthorized (401), itemNotFound (404)

Request parameters

Parameter Style Type Description
plan_id plain csapi:UUID The UUID of the plan or its associated stack id.

This operation does not accept a request body and does not return a response body.

API Errors

In the event of an error with a status other than unauthorized (401), a detailed repsonse body is returned.

Response parameters

Parameter Style Type Description
title plain xsd:string Human-readable name.
explanation plain xsd:string Detailed explanation with remediation (if any).
code plain xsd:int HTTP Status Code.
error plain xsd:dict Error dictionary. Keys include message, traceback (currently reserved / unused), and type.
message plain xsd:string Internal error message.
traceback plain xsd:string Python traceback (if available).
type plain xsd:string HTTP Status class name (from python-webob)

Examples

A group with the name "gro up" is considered a bad request because the name contains a space.

{
  "title": "Bad Request",
  "explanation": "-> name -> gro up did not pass validation against callable: group_name_type (must contain only uppercase and lowercase letters, decimal digits, hyphens, periods, underscores, and tildes [RFC 3986, Section 2.3])",
  "code": 400,
  "error": {
    "message": "The server could not comply with the request since it is either malformed or otherwise incorrect.",
    "traceback": null,
    "type": "HTTPBadRequest"
  }
}

The HTTP COPY method was attempted but is not allowed.

{
  "title": "Method Not Allowed",
  "explanation": "The COPY method is not allowed.",
  "code": 405,
  "error": {
    "message": "The server could not comply with the request since it is either malformed or otherwise incorrect.",
    "traceback": null,
    "type": "HTTPMethodNotAllowed"
  }
}

A Valet Group was not found.

{
  "title": "Not Found",
  "explanation": "Group not found",
  "code": 404,
  "error": {
    "message": "The resource could not be found.",
    "traceback": null,
    "type": "HTTPNotFound"
  }
}