.. -*- rst -*-
.. needs:example_verification
.. needs:body_verification

================================
 Host aggregates (os-aggregates)
================================

Creates and manages host aggregates. An aggregate assigns metadata to
groups of compute nodes. Aggregates are only visible to the cloud
provider.

List Aggregates
===============

.. rest_method:: GET /os-aggregates

Lists all aggregates. Includes the ID, name, and availability zone for each aggregate.

Normal response codes: 200

Error response codes: unauthorized(401), forbidden(403)

Response
--------

.. rest_parameters:: parameters.yaml

  - aggregates: aggregates
  - availability_zone: aggregate_az
  - created_at: created
  - deleted_at: deleted_at
  - deleted: deleted
  - hosts: aggregate_host_list
  - id: aggregate_id_body
  - metadata: aggregate_metadata
  - name: aggregate_name
  - updated_at: updated_consider_null

**Example List Aggregates: JSON response**

.. literalinclude:: ../../doc/api_samples/os-aggregates/aggregates-list-get-resp.json
   :language: javascript

Create Aggregate
================

.. rest_method:: POST /os-aggregates

Creates an aggregate in an availability zone.

Normal response codes: 200

Error response codes: badRequest(400), unauthorized(401), forbidden(403), conflict(409)

Request
-------

.. rest_parameters:: parameters.yaml

  - aggregate: aggregate
  - name: aggregate_name
  - availability_zone: aggregate_az_optional

**Example Create Aggregate: JSON request**

.. literalinclude:: ../../doc/api_samples/os-aggregates/aggregate-post-req.json
   :language: javascript

Response
--------

.. rest_parameters:: parameters.yaml

  - aggregate: aggregate
  - availability_zone: aggregate_az
  - created_at: created
  - deleted_at: deleted_at
  - deleted: deleted
  - id: aggregate_id_body
  - name: aggregate_name
  - updated_at: updated_consider_null

**Example Create Aggregate: JSON response**

.. literalinclude:: ../../doc/api_samples/os-aggregates/aggregate-post-resp.json
   :language: javascript

Show Aggregate Details
======================

.. rest_method:: GET /os-aggregates/{aggregate_id}

Shows details for an aggregate. Details include hosts and metadata.

Normal response codes: 200

Error response codes: unauthorized(401), forbidden(403), itemNotFound(404)

Request
-------

.. rest_parameters:: parameters.yaml

  - aggregate_id: aggregate_id

Response
--------

.. rest_parameters:: parameters.yaml

  - aggregate: aggregate
  - availability_zone: aggregate_az
  - created_at: created
  - deleted_at: deleted_at
  - deleted: deleted
  - hosts: hosts
  - id: aggregate_id_body
  - metadata: aggregate_metadata
  - name: aggregate_name
  - updated_at: updated_consider_null

**Example Show Aggregate Details: JSON response**

.. literalinclude:: ../../doc/api_samples/os-aggregates/aggregates-get-resp.json
   :language: javascript

Update Aggregate
================

.. rest_method:: PUT /os-aggregates/{aggregate_id}

Updates either or both the name and availability zone for an aggregate.

Normal response codes: 200

Error response codes: badRequest(400), unauthorized(401), forbidden(403),
itemNotFound(404), conflict(409)

Request
-------

.. rest_parameters:: parameters.yaml

  - aggregate_id: aggregate_id
  - aggregate: aggregate
  - name: aggregate_name_optional
  - availability_zone: aggregate_az_optional

**Example Update Aggregate: JSON request**

.. literalinclude:: ../../doc/api_samples/os-aggregates/aggregate-update-post-req.json
   :language: javascript

Response
--------

.. rest_parameters:: parameters.yaml

  - aggregate: aggregate
  - availability_zone: aggregate_az
  - created_at: created
  - deleted_at: deleted_at
  - deleted: deleted
  - hosts: hosts
  - id: aggregate_id_body
  - metadata: aggregate_metadata
  - name: aggregate_name
  - updated_at: updated_consider_null

**Example Update Aggregate: JSON response**

.. literalinclude:: ../../doc/api_samples/os-aggregates/aggregate-update-post-resp.json
   :language: javascript

Delete Aggregate
================

.. rest_method:: DELETE /os-aggregates/{aggregate_id}

Deletes an aggregate.

Normal response codes: 200

Error response codes: badRequest(400), unauthorized(401), forbidden(403), itemNotFound(404)

Request
-------

.. rest_parameters:: parameters.yaml

  - aggregate_id: aggregate_id

Response
--------

Add Host
========

.. rest_method:: POST /os-aggregates/{aggregate_id}/action

Adds a host to an aggregate.

Specify the ``add_host`` action and host name in the request body.

Normal response codes: 200

Error response codes: badRequest(400), unauthorized(401), forbidden(403),
itemNotFound(404), conflict(409)

Request
-------

.. rest_parameters:: parameters.yaml

  - aggregate_id: aggregate_id
  - add_host: aggregate_add_host
  - host: host_name_body

**Example Add Host: JSON request**

.. literalinclude:: ../../doc/api_samples/os-aggregates/aggregate-add-host-post-req.json
   :language: javascript

Response
--------

.. rest_parameters:: parameters.yaml

  - aggregate: aggregate
  - availability_zone: aggregate_az
  - created_at: created
  - deleted_at: deleted_at
  - deleted: deleted
  - hosts: hosts
  - id: aggregate_id_body
  - metadata: aggregate_metadata
  - name: aggregate_name
  - updated_at: updated_consider_null

**Example Add Host: JSON response**

.. literalinclude:: ../../doc/api_samples/os-aggregates/aggregates-add-host-post-resp.json
   :language: javascript

Remove Host
===========

.. rest_method:: POST /os-aggregates/{aggregate_id}/action

Removes a host from an aggregate.

Specify the ``remove_host`` action and host name in the request body.

Normal response codes: 200

Error response codes: badRequest(400), unauthorized(401), forbidden(403),
itemNotFound(404), conflict(409)

Request
-------

.. rest_parameters:: parameters.yaml

  - aggregate_id: aggregate_id
  - remove_host: aggregate_remove_host
  - host: host_name_body

**Example Remove Host: JSON request**

.. literalinclude:: ../../doc/api_samples/os-aggregates/aggregate-remove-host-post-req.json
   :language: javascript

Response
--------

.. rest_parameters:: parameters.yaml

  - aggregate: aggregate
  - availability_zone: aggregate_az
  - created_at: created
  - deleted_at: deleted_at
  - deleted: deleted
  - hosts: hosts
  - id: aggregate_id_body
  - metadata: aggregate_metadata
  - name: aggregate_name
  - updated_at: updated_consider_null

**Example Remove Host: JSON response**

.. literalinclude:: ../../doc/api_samples/os-aggregates/aggregates-remove-host-post-resp.json
   :language: javascript

Create Or Update Aggregate Metadata
===================================

.. rest_method:: POST /os-aggregates/{aggregate_id}/action

Creates or replaces metadata for an aggregate.

Specify the ``set_metadata`` action in the request body.

Normal response codes: 200

Error response codes: badRequest(400), unauthorized(401), forbidden(403),
itemNotFound(404)

Request
-------

.. rest_parameters:: parameters.yaml

  - aggregate_id: aggregate_id
  - set_metadata: set_metadata
  - metadata: metadata_set_required

**Example Create Or Update Aggregate Metadata: JSON request**

.. literalinclude:: ../../doc/api_samples/os-aggregates/aggregate-metadata-post-req.json
   :language: javascript

Response
--------

.. rest_parameters:: parameters.yaml

  - aggregate: aggregate
  - availability_zone: aggregate_az
  - created_at: created
  - deleted_at: deleted_at
  - deleted: deleted
  - hosts: hosts
  - id: aggregate_id_body
  - metadata: aggregate_metadata
  - name: aggregate_name
  - updated_at: updated_consider_null

**Example Create Or Update Aggregate Metadata: JSON response**

.. literalinclude:: ../../doc/api_samples/os-aggregates/aggregates-metadata-post-resp.json
   :language: javascript