.. -*- rst -*-

List Pools
==========

.. rest_method:: GET /v2/lbaas/pools

Lists all pools for the project.

Use the ``fields`` query parameter to control which fields are
returned in the response body. Additionally, you can filter results
by using query string parameters. For information, see :ref:`filtering`.

Administrative users can specify a project ID that is different than their own
to list pools for other projects.

The list might be empty.

.. rest_status_code:: success ../http-status.yaml

   - 200

.. rest_status_code:: error ../http-status.yaml

   - 400
   - 401
   - 500

Request
-------

.. rest_parameters:: ../parameters.yaml

   - fields: fields
   - project_id: project_id_query

Curl Example
------------

.. literalinclude:: examples/pools-list-curl
   :language: bash

Response Parameters
-------------------

.. rest_parameters:: ../parameters.yaml

   - admin_state_up: admin_state_up
   - alpn_protocols: alpn_protocols-pool
   - ca_tls_container_ref: ca_tls_container_ref
   - created_at: created_at
   - crl_container_ref: crl_container_ref
   - description: description
   - healthmonitor_id: healthmonitor-id
   - id: pool-id
   - lb_algorithm: lb-algorithm
   - listeners: listener-ids
   - loadbalancers: loadbalancer-ids
   - members: member-ids
   - name: name
   - operating_status: operating_status
   - project_id: project_id
   - protocol: protocol-pools
   - provisioning_status: provisioning_status
   - session_persistence: session_persistence
   - tags: tags
   - tls_ciphers: tls_ciphers
   - tls_container_ref: tls_container_ref
   - tls_enabled: tls_enabled
   - tls_versions: tls_versions
   - updated_at: updated_at

Response Example
----------------

.. literalinclude:: examples/pools-list-response.json
   :language: javascript

Create Pool
===========

.. rest_method:: POST /v2/lbaas/pools

Creates a pool for a load balancer.

The pool defines how requests should be balanced across the backend
member servers.

This operation provisions a pool by using the configuration that
you define in the request object. After the API validates the
request and starts the provisioning process, the API returns a
response object, which contains a unique ID.

In the response, the pool :ref:`provisioning status<prov_status>` is
``ACTIVE``, ``PENDING_CREATE``, or ``ERROR``.

If the status is ``PENDING_CREATE``, issue GET
``/v2/lbaas/pools/{pool_id}`` to view the progress of
the provisioning operation. When the pool status changes
to ``ACTIVE``, the pool is successfully provisioned and
is ready for further configuration.

At a minimum, you must specify these pool attributes:

- ``protocol`` The protocol for which this pool and its members
  listen. A valid value is ``HTTP``, ``HTTPS``, ``PROXY``, ``PROXYV2``,
  ``SCTP``, ``TCP``, or ``UDP``.

- ``lb_algorithm`` The load-balancer algorithm, such as
  ``ROUND_ROBIN``, ``LEAST_CONNECTIONS``, ``SOURCE_IP`` and ``SOURCE_IP_PORT``,
  that distributes traffic to the pool members. The load-balancer
  provider must support this algorithm.

- ``listener_id`` The ID of the listener in which this pool
  becomes the default pool. Each listener has only one default
  pool.

  ---OR---

- ``loadbalancer_id`` The ID of the load balancer under which this
  pool will be created.  Each load balancer can have zero or more pools
  associated with it.  These pools can be used for L7policies.

.. note::
   Either ``listener_id`` or ``loadbalancer_id`` must be specified.

Some attributes receive default values if you omit them from the
request:

- ``admin_state_up`` Default is ``true``.

- ``name`` Default is an empty string.

- ``description`` Default is an empty string.

If the API cannot fulfill the request due to insufficient data or
data that is not valid, the service returns the HTTP ``Bad Request
(400)`` response code with information about the failure in the
response body. Validation errors require that you correct the error
and submit the request again.

Specifying a project_id is deprecated.  The pool will inherit the
project_id of the parent load balancer.

You can configure all documented features of the pool at creation time by
specifying the additional elements or attributes in the request.

To create a pool, the parent load balancer must have an ``ACTIVE``
provisioning status.

``SOURCE_IP_PORT`` algorithm is available from version 2.13.


.. rest_status_code:: success ../http-status.yaml

   - 201

.. rest_status_code:: error ../http-status.yaml

   - 400
   - 401
   - 403
   - 404
   - 409
   - 500
   - 503

Request
-------

.. rest_parameters:: ../parameters.yaml

   - admin_state_up: admin_state_up-default-optional
   - alpn_protocols: alpn_protocols-pool-optional
   - ca_tls_container_ref: ca_tls_container_ref-optional
   - crl_container_ref: crl_container_ref-optional
   - description: description-optional
   - lb_algorithm: lb-algorithm
   - listener_id: listener-id-pool-optional
   - loadbalancer_id: loadbalancer-id-pool-optional
   - name: name-optional
   - project_id: project_id-optional-deprecated
   - protocol: protocol-pools
   - session_persistence: session_persistence-optional
   - tags: tags-optional
   - tls_enabled: tls_enabled-optional
   - tls_ciphers: tls_ciphers-optional
   - tls_container_ref: tls_container_ref-optional
   - tls_versions: tls_versions-optional

.. _session_persistence:

Pool Session Persistence
------------------------

Pool session persistence tells the load balancer to attempt to send future
requests from a client to the same backend member as the initial request.

When the pool has no session persistence, the session persistence object is
``null``.

Octavia currently support three session persistence methods:

+-----------------+----------------------------------------------------------+
| Method          | Description                                              |
+=================+==========================================================+
| ``APP_COOKIE``  | Use the specified ``cookie_name`` send future requests   |
|                 | to the same member.                                      |
+-----------------+----------------------------------------------------------+
| ``HTTP_COOKIE`` | The load balancer will generate a cookie that is         |
|                 | inserted into the response.  This cookie will be used to |
|                 | send future requests to the same member.                 |
+-----------------+----------------------------------------------------------+
| ``SOURCE_IP``   | The source IP address on the request will be hashed to   |
|                 | send future requests to the same member.                 |
+-----------------+----------------------------------------------------------+

Pool Session Persistence Object
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. rest_parameters:: ../parameters.yaml

   - type: session_persistence_type
   - cookie_name: session_persistence_cookie
   - persistence_timeout: session_persistence_timeout
   - persistence_granularity: session_persistence_granularity

Pool Session Persistence Object Example
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. literalinclude:: examples/pool-session-persistence-obj.json
   :language: javascript

Request Example
----------------

.. literalinclude:: examples/pool-create-request.json
   :language: javascript

Curl Example
------------

.. literalinclude:: examples/pool-create-curl
   :language: bash

Response Parameters
-------------------

.. rest_parameters:: ../parameters.yaml

   - admin_state_up: admin_state_up
   - alpn_protocols: alpn_protocols-pool
   - ca_tls_container_ref: ca_tls_container_ref
   - created_at: created_at
   - crl_container_ref: crl_container_ref
   - description: description
   - healthmonitor_id: healthmonitor-id
   - id: pool-id
   - lb_algorithm: lb-algorithm
   - listeners: listener-ids
   - loadbalancers: loadbalancer-ids
   - members: member-ids
   - name: name
   - operating_status: operating_status
   - project_id: project_id
   - protocol: protocol-pools
   - provisioning_status: provisioning_status
   - session_persistence: session_persistence
   - tags: tags
   - tls_enabled: tls_enabled
   - tls_ciphers: tls_ciphers
   - tls_container_ref: tls_container_ref
   - tls_versions: tls_versions
   - updated_at: updated_at

Response Example
----------------

.. literalinclude:: examples/pool-create-response.json
   :language: javascript

Show Pool details
=================

.. rest_method:: GET /v2/lbaas/pools/{pool_id}

Shows the details of a pool.

If you are not an administrative user and the parent load balancer does not
belong to your project, the service returns the HTTP ``Forbidden (403)``
response code.

This operation does not require a request body.

.. rest_status_code:: success ../http-status.yaml

   - 200

.. rest_status_code:: error ../http-status.yaml

   - 401
   - 403
   - 404
   - 500

Request
-------

.. rest_parameters:: ../parameters.yaml

   - fields: fields
   - pool_id: path-pool-id

Curl Example
------------

.. literalinclude:: examples/pool-show-curl
   :language: bash

Response Parameters
-------------------

.. rest_parameters:: ../parameters.yaml

   - admin_state_up: admin_state_up
   - alpn_protocols: alpn_protocols-pool
   - ca_tls_container_ref: ca_tls_container_ref
   - created_at: created_at
   - crl_container_ref: crl_container_ref
   - description: description
   - healthmonitor_id: healthmonitor-id
   - id: pool-id
   - lb_algorithm: lb-algorithm
   - listeners: listener-ids
   - loadbalancers: loadbalancer-ids
   - members: member-ids
   - name: name
   - operating_status: operating_status
   - project_id: project_id
   - protocol: protocol-pools
   - provisioning_status: provisioning_status
   - session_persistence: session_persistence
   - tags: tags
   - tls_enabled: tls_enabled
   - tls_ciphers: tls_ciphers
   - tls_container_ref: tls_container_ref
   - tls_versions: tls_versions
   - updated_at: updated_at

Response Example
----------------

.. literalinclude:: examples/pool-show-response.json
   :language: javascript

Update a Pool
=============

.. rest_method:: PUT /v2/lbaas/pools/{pool_id}

Update an existing pool.

If the request is valid, the service returns the ``Accepted (202)``
response code. To confirm the update, check that the pool provisioning
status is ``ACTIVE``. If the status is ``PENDING_UPDATE``, use a GET
operation to poll the pool object for changes.

This operation returns the updated pool object with the
``ACTIVE``, ``PENDING_UPDATE``, or ``ERROR`` provisioning status.

.. rest_status_code:: success ../http-status.yaml

   - 202

.. rest_status_code:: error ../http-status.yaml

   - 400
   - 401
   - 403
   - 404
   - 409
   - 500

Request
-------

.. rest_parameters:: ../parameters.yaml

   - admin_state_up: admin_state_up-default-optional
   - alpn_protocols: alpn_protocols-pool-optional
   - ca_tls_container_ref: ca_tls_container_ref-optional
   - crl_container_ref: crl_container_ref-optional
   - description: description-optional
   - lb_algorithm: lb-algorithm-optional
   - name: name-optional
   - pool_id: path-pool-id
   - session_persistence: session_persistence-optional
   - tags: tags-optional
   - tls_enabled: tls_enabled-optional
   - tls_ciphers: tls_ciphers-optional
   - tls_container_ref: tls_container_ref-optional
   - tls_versions: tls_versions-optional

Request Example
---------------

.. literalinclude:: examples/pool-update-request.json
   :language: javascript

Curl Example
------------

.. literalinclude:: examples/pool-update-curl
   :language: bash

Response Parameters
-------------------

.. rest_parameters:: ../parameters.yaml

   - admin_state_up: admin_state_up
   - alpn_protocols: alpn_protocols-pool
   - ca_tls_container_ref: ca_tls_container_ref
   - created_at: created_at
   - crl_container_ref: crl_container_ref
   - description: description
   - healthmonitor_id: healthmonitor-id
   - id: pool-id
   - lb_algorithm: lb-algorithm
   - listeners: listener-ids
   - loadbalancers: loadbalancer-ids
   - members: member-ids
   - name: name
   - operating_status: operating_status
   - project_id: project_id
   - protocol: protocol-pools
   - provisioning_status: provisioning_status
   - session_persistence: session_persistence
   - tags: tags
   - tls_enabled: tls_enabled
   - tls_ciphers: tls_ciphers
   - tls_container_ref: tls_container_ref
   - tls_versions: tls_versions
   - updated_at: updated_at

Response Example
----------------

.. literalinclude:: examples/pool-update-response.json
   :language: javascript

Remove a Pool
=============

.. rest_method:: DELETE /v2/lbaas/pools/{pool_id}

Removes a pool and its associated configuration from the load balancer.

The API immediately purges any and all configuration data, depending on the
configuration settings. You cannot recover it.

.. rest_status_code:: success ../http-status.yaml

   - 204

.. rest_status_code:: error ../http-status.yaml

   - 400
   - 401
   - 403
   - 404
   - 409
   - 500

Request
-------

.. rest_parameters:: ../parameters.yaml

   - pool_id: path-pool-id

Curl Example
------------

.. literalinclude:: examples/pool-delete-curl
   :language: bash

Response
--------

There is no body content for the response of a successful DELETE request.
