Merge "Spec: Add Quotas to Karbor"
This commit is contained in:
commit
37d6eb6de8
|
@ -40,6 +40,7 @@ Approved Specs
|
||||||
adding-more-protection-parameters-retention-period
|
adding-more-protection-parameters-retention-period
|
||||||
checkpoint-copy-api
|
checkpoint-copy-api
|
||||||
api-json-schema-validation
|
api-json-schema-validation
|
||||||
|
quotas
|
||||||
|
|
||||||
Spec Template
|
Spec Template
|
||||||
-------------
|
-------------
|
||||||
|
|
|
@ -0,0 +1,300 @@
|
||||||
|
..
|
||||||
|
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||||
|
License.
|
||||||
|
|
||||||
|
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||||
|
|
||||||
|
====================
|
||||||
|
Add Quotas to Karbor
|
||||||
|
====================
|
||||||
|
|
||||||
|
https://blueprints.launchpad.net/karbor/+spec/support-quotas-in-karbor
|
||||||
|
|
||||||
|
Problem description
|
||||||
|
===================
|
||||||
|
|
||||||
|
To prevent system capacities from being exhausted without notification, users can
|
||||||
|
set up quotas. Quotas are operational limits.
|
||||||
|
For example, the number of gigabytes allowed for each project can be controlled so
|
||||||
|
that cloud resources are optimized in Block Storage service(Cinder)[1] . Quotas can
|
||||||
|
be enforced at the project level. Nova uses a quota system for setting limits on
|
||||||
|
resources such as number of instances or amount of CPU that a specific project or
|
||||||
|
user can use. [2]
|
||||||
|
|
||||||
|
A quotas system will be introduced to Karbor for setting limits on resources such
|
||||||
|
as the amount of gigabytes about backup data that a specific project can use.
|
||||||
|
|
||||||
|
Use Cases
|
||||||
|
=========
|
||||||
|
|
||||||
|
User can set limits on resources such as the amount of gigabytes about backup data
|
||||||
|
via a new quotas RESTful API.
|
||||||
|
|
||||||
|
|
||||||
|
Proposed change
|
||||||
|
===============
|
||||||
|
1. Two data modules about quotas will be introduced to karbor.
|
||||||
|
|
||||||
|
The data module 'quotas' is used for saving the hard limit number of the resources
|
||||||
|
that a specific project can use.
|
||||||
|
The data module 'quota_usages' is used for saving the in use number and reserved
|
||||||
|
number of the resources that belong to a specific project.
|
||||||
|
|
||||||
|
|
||||||
|
2. Add the quotas API controller for the Karbor API.
|
||||||
|
|
||||||
|
Implement the 'update' method of quotas API controller.
|
||||||
|
Implement the 'show' method of quotas API controller.
|
||||||
|
Implement the 'index' method of quotas API controller.
|
||||||
|
|
||||||
|
2. The resources need to limit.
|
||||||
|
|
||||||
|
QUOTAS_PLAN_CAPACITY = 'quota_plans'
|
||||||
|
|
||||||
|
QUOTAS_PLAN_CAPACITY: The maximum number of plan.
|
||||||
|
|
||||||
|
3. Init the default limit number of the resources about quotas data module.
|
||||||
|
|
||||||
|
The default limit number of the resources should be inited in the data module
|
||||||
|
table 'quotas' when the karbor api service start to run.
|
||||||
|
The default limit number of the resources can be set from the value of configurations.
|
||||||
|
The config 'quota_plans' need be added.
|
||||||
|
|
||||||
|
|
||||||
|
4. Update the reserved and in use number of the resources quota usages.
|
||||||
|
|
||||||
|
When a resource is requested, the specific quota about this resource is checked first.
|
||||||
|
If this check passes, the reserved number of this resource in data module 'quota_usages'
|
||||||
|
need be updated first according to requested resource number. If the resource is
|
||||||
|
created successfully, the in use number of the resources quota need be updated. At the
|
||||||
|
same time, the reserved number of this resource should be subtracted.
|
||||||
|
|
||||||
|
|
||||||
|
Alternatives
|
||||||
|
------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Data model impact
|
||||||
|
-----------------
|
||||||
|
1. quotas
|
||||||
|
|
||||||
|
+-------------------------+--------------+------+-----+---------+-------+
|
||||||
|
| Field | Type | Null | Key | Default | Extra |
|
||||||
|
+-------------------------+--------------+------+-----+---------+-------+
|
||||||
|
| id | varchar(36) | NO | PRI | NULL | |
|
||||||
|
+-------------------------+--------------+------+-----+---------+-------+
|
||||||
|
| project_id | varchar(255) | NO | | NULL | |
|
||||||
|
+-------------------------+--------------+------+-----+---------+-------+
|
||||||
|
| resource | varchar(255) | NO | | NULL | |
|
||||||
|
+-------------------------+--------------+------+-----+---------+-------+
|
||||||
|
| hard_limit | Interger | YES | | NULL | |
|
||||||
|
+-------------------------+--------------+------+-----+---------+-------+
|
||||||
|
| created_at | Datetime | YES | | NULL | |
|
||||||
|
+-------------------------+--------------+------+-----+---------+-------+
|
||||||
|
| updated_at | Datetime | YES | | NULL | |
|
||||||
|
+-------------------------+--------------+------+-----+---------+-------+
|
||||||
|
| deleted_at | Datetime | YES | | NULL | |
|
||||||
|
+-------------------------+--------------+------+-----+---------+-------+
|
||||||
|
|
||||||
|
2. quota_usages
|
||||||
|
|
||||||
|
+-------------------------+--------------+------+-----+---------+-------+
|
||||||
|
| Field | Type | Null | Key | Default | Extra |
|
||||||
|
+-------------------------+--------------+------+-----+---------+-------+
|
||||||
|
| id | varchar(36) | NO | PRI | NULL | |
|
||||||
|
+-------------------------+--------------+------+-----+---------+-------+
|
||||||
|
| project_id | varchar(255) | NO | | NULL | |
|
||||||
|
+-------------------------+--------------+------+-----+---------+-------+
|
||||||
|
| resource | varchar(255) | NO | | NULL | |
|
||||||
|
+-------------------------+--------------+------+-----+---------+-------+
|
||||||
|
| in_use | Interger | YES | | NULL | |
|
||||||
|
+-------------------------+--------------+------+-----+---------+-------+
|
||||||
|
| reserved | Interger | YES | | NULL | |
|
||||||
|
+-------------------------+--------------+------+-----+---------+-------+
|
||||||
|
| created_at | Datetime | YES | | NULL | |
|
||||||
|
+-------------------------+--------------+------+-----+---------+-------+
|
||||||
|
| updated_at | Datetime | YES | | NULL | |
|
||||||
|
+-------------------------+--------------+------+-----+---------+-------+
|
||||||
|
| deleted_at | Datetime | YES | | NULL | |
|
||||||
|
+-------------------------+--------------+------+-----+---------+-------+
|
||||||
|
|
||||||
|
REST API impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
1. Update quotas API, admin only.
|
||||||
|
The request JSON when updating a quota::
|
||||||
|
|
||||||
|
**post** : /v1/{project_id}/quotas/{user_project_id}
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"quota":
|
||||||
|
{
|
||||||
|
"plans": 100
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
The response JSON when updating a quota::
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"quota":{
|
||||||
|
"plans": 100
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2. Show quota API. Admin can query aother projects' quota.
|
||||||
|
The response JSON when showing a quota::
|
||||||
|
|
||||||
|
**get** : /v1/{project_id}/quotas/{user_project_id}
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
{
|
||||||
|
"quota": {
|
||||||
|
"plans": 100,
|
||||||
|
"id": "73f74f90a1754bd7ad658afb3272323f"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
3. Delete quota API. admin only.
|
||||||
|
The response JSON when deleting a quota::
|
||||||
|
|
||||||
|
**delete** : /v1/{project_id}/quotas/{user_project_id}
|
||||||
|
|
||||||
|
4. Show the detail of quota API. Admin can query aother projects' quota.
|
||||||
|
The response JSON when showing a quota::
|
||||||
|
|
||||||
|
**get** : /v1/{project_id}/quotas/{user_project_id}/detail
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"quota": {
|
||||||
|
"plans": {
|
||||||
|
"reserved": 0,
|
||||||
|
"limit": 100,
|
||||||
|
"in_use": 1
|
||||||
|
},
|
||||||
|
"id": "73f74f90a1754bd7ad658afb3272323f"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
5. Show the default of quota API. Admin can query aother projects' quota.
|
||||||
|
The response JSON when showing a quota::
|
||||||
|
|
||||||
|
**get** : /v1/{project_id}/quotas/{user_project_id}/defaults
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"quota": {
|
||||||
|
"plans": 50,
|
||||||
|
"id": "73f74f90a1754bd7ad658afb3272323f"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
6. Update quota class API, admin only.
|
||||||
|
The request JSON when updating a quota class::
|
||||||
|
|
||||||
|
**post** : /v1/{project_id}/quota_classes/{class_name}
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"quota_class": {
|
||||||
|
"plans": 120
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
The response JSON when updating a quota class::
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"quota_class": {
|
||||||
|
"plans": 120
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
7. Show quota class API.
|
||||||
|
The response JSON when showing a quota class::
|
||||||
|
|
||||||
|
**get** : /v1/{project_id}/quota_classes/{class_name}
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"quota_class": {
|
||||||
|
"plans": 120,
|
||||||
|
"id": "default"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Security impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Notifications impact
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Other end user impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Performance Impact
|
||||||
|
------------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Other deployer impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Developer impact
|
||||||
|
----------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
|
||||||
|
Implementation
|
||||||
|
==============
|
||||||
|
|
||||||
|
Assignee(s)
|
||||||
|
-----------
|
||||||
|
|
||||||
|
|
||||||
|
Work Items
|
||||||
|
----------
|
||||||
|
|
||||||
|
* Add a new RESTful API about quotas
|
||||||
|
* Add database data module of quotas
|
||||||
|
* Add quotas API to karbor client
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
============
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Testing
|
||||||
|
=======
|
||||||
|
|
||||||
|
Unit tests in Karbor.
|
||||||
|
|
||||||
|
|
||||||
|
Documentation Impact
|
||||||
|
====================
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
|
||||||
|
[1] https://docs.openstack.org/horizon/latest/admin/set-quotas.html
|
||||||
|
|
||||||
|
[2] https://docs.openstack.org/nova/latest/user/quotas.html
|
||||||
|
|
Loading…
Reference in New Issue