Add Quotas to Karbor

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.

  1. The resources need to limit.

    QUOTAS_PLAN_CAPACITY = ‘quota_plans’

    QUOTAS_PLAN_CAPACITY: The maximum number of plan.

  2. 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.

  3. 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  
  1. 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

Creative Commons Attribution 3.0 License

Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.