mirror of
https://github.com/gryf/openstack.git
synced 2025-12-17 11:30:24 +01:00
247 lines
5.5 KiB
ReStructuredText
247 lines
5.5 KiB
ReStructuredText
..
|
||
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||
License.
|
||
|
||
http://creativecommons.org/licenses/by/3.0/legalcode
|
||
|
||
===============================
|
||
Quota per custom resource class
|
||
===============================
|
||
|
||
https://blueprints.launchpad.net/nova/+spec/tbd
|
||
|
||
With this blueprint we introduce a way to define and use quotas per custom
|
||
resources classes, so that operator can limit how DC resources are utilized.
|
||
|
||
Problem description
|
||
===================
|
||
|
||
Currently, quotas in Nova are restricted only for selected resources like CPU
|
||
cores, ram, floating IPs, and for non-resource things: number of instances,
|
||
metadata items, key pairs, server groups and so on. Introducing `custom
|
||
resource classes`_ within placement service, allows operator to create
|
||
resources, which are unknown to the quota mechanism.
|
||
|
||
Use Cases
|
||
---------
|
||
|
||
As an operator I’d like to define quota for custom resource classes, so that
|
||
amount of such resources can be limited per project and/or per user.
|
||
|
||
Proposed change
|
||
===============
|
||
|
||
We propose to add ability for dynamically adding custom resource classes to
|
||
resources which ``QuotaEngine`` can handle, and track the usage like all the
|
||
other resources.
|
||
|
||
Alternatives
|
||
------------
|
||
|
||
As an alternative, we could leverage Quota Classes to be used instead of
|
||
affecting QuotaEngine, although it will require slightly more effort in
|
||
implementation, since there is no tracking of resources within that model, and,
|
||
what's more important, quota classes are used for setting/changing defaults
|
||
which comes from configuration.
|
||
|
||
We could also make a custom scheduler filter, which would count the resources
|
||
usage and limits for anything operator needs, however this will have
|
||
performance impact, since originally limits are checked during API call, and
|
||
scheduler filters are executed on scheduling phase.
|
||
|
||
Data model impact
|
||
-----------------
|
||
|
||
New attribute ``uuid`` will be added to the ``Quotas`` object.
|
||
|
||
REST API impact
|
||
---------------
|
||
|
||
New API methods will be introduced to list/add/delete/modify to the
|
||
``os-quota-sets`` for a project and optionally user.
|
||
|
||
Optionally, ``GET /os-quota-sets/{tenant_id}`` will provide a list of custom
|
||
resources in under ``quota_set["custom_resources"]`` key in JSON response.
|
||
|
||
* Getting the list of defined custom resources in limits:
|
||
|
||
.. code::
|
||
|
||
GET /os-quota-sets/{tenant_id}/custom_resource
|
||
|
||
200 OK
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"custom_resources": [
|
||
{
|
||
"name": "name of custom resource class",
|
||
"UUID": "uuid of custom resource class from resource provider",
|
||
"limit": 0
|
||
},
|
||
...
|
||
]
|
||
}
|
||
|
||
* Getting a definition of the particular custom resources in limits:
|
||
|
||
.. code::
|
||
|
||
GET /os-quota-sets/{tenant_id}/custom_resource/{resource_uuid}
|
||
|
||
200 OK
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"name": "name of custom resource class",
|
||
"UUID": "uuid of custom resource class from resource provider",
|
||
"limit": 0
|
||
}
|
||
|
||
* Adding custom resource to quotas:
|
||
|
||
.. code::
|
||
|
||
POST /os-quota-sets/{tenant_id}/custom_resource
|
||
|
||
with a payload:
|
||
|
||
.. code::
|
||
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"name": "name of custom resource class",
|
||
"UUID": "uuid of custom resource class from resource provider",
|
||
"limit": 0
|
||
}
|
||
|
||
Response body is empty. Response code will be ``201 Created`` on success, or
|
||
``409 Conflict`` if there is resource with such UUID already created.
|
||
|
||
* ``200 OK`` on success.
|
||
* ``400 Bad Request`` for bad or invalid syntax.
|
||
* ``409 Conflict`` if there is resource with such UUID already created.
|
||
|
||
* Updating limit value for the custom resource:
|
||
|
||
.. code::
|
||
|
||
PUT /os-quota-sets/{tenant_id}/custom_resource/{resource_uuid}
|
||
|
||
with a payload:
|
||
|
||
.. code::
|
||
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"limit": 10
|
||
}
|
||
|
||
Response body is empty. Response code will be:
|
||
|
||
* ``200 OK`` on success.
|
||
* ``400 Bad Request`` for bad or invalid syntax.
|
||
* ``404 Not Found`` on undefined custom resource.
|
||
|
||
* Removing the custom resource from limits:
|
||
|
||
.. code::
|
||
|
||
DELETE /os-quota-sets/{tenant_id}/custom_resource/{resource_uuid}
|
||
|
||
Request body is empty. Response body is empty. Response code will be:
|
||
|
||
* ``200 OK`` on success.
|
||
* ``404 Not Found`` on undefined custom resource.
|
||
|
||
|
||
Security impact
|
||
---------------
|
||
|
||
None
|
||
|
||
Notifications impact
|
||
--------------------
|
||
|
||
None
|
||
|
||
Other end user impact
|
||
---------------------
|
||
|
||
Nova-client and/or openstack client should be updated to be able to provide
|
||
custom resource class as an argument for ``quota*`` subcommands.
|
||
|
||
Performance Impact
|
||
------------------
|
||
|
||
None
|
||
|
||
Other deployer impact
|
||
---------------------
|
||
|
||
None
|
||
|
||
Developer impact
|
||
----------------
|
||
|
||
None
|
||
|
||
Upgrade impact
|
||
--------------
|
||
|
||
None
|
||
|
||
Implementation
|
||
==============
|
||
|
||
Assignee(s)
|
||
-----------
|
||
|
||
Primary assignee:
|
||
<launchpad-id or None>
|
||
|
||
Other contributors:
|
||
<launchpad-id or None>
|
||
|
||
Work Items
|
||
----------
|
||
|
||
* DB changes
|
||
* Hook to register custom resource class in ``QuotaEngine._resources`` dict
|
||
* API implementation
|
||
|
||
Dependencies
|
||
============
|
||
|
||
None
|
||
|
||
Testing
|
||
=======
|
||
|
||
Unit test have to be provided.
|
||
|
||
Documentation Impact
|
||
====================
|
||
|
||
Documentation of additional API calls have to be updated.
|
||
|
||
References
|
||
==========
|
||
|
||
None
|
||
|
||
History
|
||
=======
|
||
|
||
.. list-table:: Revisions
|
||
:header-rows: 1
|
||
|
||
* - Release Name
|
||
- Description
|
||
* - Rocky
|
||
- Introduced
|
||
|
||
.. _custom resource classes: https://specs.openstack.org/openstack/nova-specs/specs/ocata/implemented/custom-resource-classes.html
|