..
    Copyright 2016 Rackspace Inc.

    Author: Tim Simmons <tim.simmons@rackspace.com>

    Licensed under the Apache License, Version 2.0 (the "License"); you may
    not use this file except in compliance with the License. You may obtain
    a copy of the License at

        http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
    License for the specific language governing permissions and limitations
    under the License.


View and Manage Quotas
======================

Quotas exist in Designate for various resources, these are configurable by an
operator globally, as well as on a per-tenant basis.

View Quotas
-----------

Users can view their quotas with a simple API call:

.. code-block:: http

  GET /v2/quotas/ HTTP/1.1
  Accept: application/json
  Content-Type: application/json

Response:

.. code-block:: http

  HTTP/1.1 200 OK 
  Content-Type: application/json; charset=UTF-8
  X-Openstack-Request-Id: req-bfcd0723-624c-4ec2-bbd5-99e985efe8db

  {
    "api_export_size": 1000,
    "recordset_records": 20,
    "zone_records": 500,
    "zone_recordsets": 500,
    "zones": 500 
  }

Administrators with the ability to use the ``X-Auth-All-Projects`` header
can view the quotas of any user by making a similar API call to
``/v2/quotas/tenant``.

Available Quotas
----------------

Zones
^^^^^

+---------+---------------------------------------+---------+
| Quota   | Description                           | Default |
+---------+---------------------------------------+---------+
| zones   | The number of zone allowed per tenant | 10      |
+---------+---------------------------------------+---------+

Recordsets/Records
^^^^^^^^^^^^^^^^^^

+------------------+-------------------------------------------------+---------+
| Quota            | Description                                     | Default |
+------------------+-------------------------------------------------+---------+
| zone_recordsets  | Number of recordsets allowed per zone           | 500     |
+------------------+-------------------------------------------------+---------+
| zone_records     | Number of records allowed per zone              | 500     |
+------------------+-------------------------------------------------+---------+
| recordset_records| Number of records allowed per recordset         | 20      |
+------------------+-------------------------------------------------+---------+


Zone Exports
^^^^^^^^^^^^

+-----------------+-------------------------------------------------+---------+
| Quota           | Description                                     | Default |
+-----------------+-------------------------------------------------+---------+
| api_export_size | Number of recordsets allowed in a zone export   | 1000    |
+-----------------+-------------------------------------------------+---------+


Editing Quotas
--------------

Global Configuration
^^^^^^^^^^^^^^^^^^^^

All of the quotas above can be set as a default for all users by editing the
``[DEFAULT]`` configuration section, and setting each quota with
``quota_$name``. for example::

    [DEFAULT]
    ########################
    ## General Configuration
    ########################
    quota_zones = 500 
    quota_zone_recordsets = 500 
    quota_zone_records = 500 
    quota_recordset_records = 20 
    quota_api_export_size = 1000

Per-Tenant via API
^^^^^^^^^^^^^^^^^^

These quotas can be edited via API on a per-tenant basis. An administrator
can edit quotas for any tenant, but they must supply the
``X-Auth-All-Projects`` header, and have permission to use it, they'll also
need the ``set-quotas`` permission in ``policy.json``. For example, an
admin setting the zones quota for tenant X would look like:

.. code-block:: http

  PATCH /v2/quotas/tenantX HTTP/1.1
  Accept: application/json
  Content-Type: application/json
  X-Auth-All-Projects: True

  {
    "zones": 100
  }

The response would be:

.. code-block:: http

  HTTP/1.1 200 OK 
  Content-Type: application/json; charset=UTF-8
  X-Openstack-Request-Id: req-bfcd0723-624c-4ec2-bbd5-99e985efe8db

  {
    "api_export_size": 1000,
    "recordset_records": 20,
    "zone_records": 500,
    "zone_recordsets": 500,
    "zones": 100 
  } 
