Jump to: navigation, search

Difference between revisions of "DomainQuotaManagementAndEnforcement"

(Usage Tracking and Limit Checking)
m
 
(43 intermediate revisions by 4 users not shown)
Line 1: Line 1:
 +
* '''Launchpad Entry''': [https://blueprints.launchpad.net/keystone/+spec/domain-quota-management-and-enforcement Domain Quota Management]
 +
* '''Created''': 03 March 2013
 +
* '''Contributors''': [https://launchpad.net/~yehia-beyh Yehia Beyh], [https://launchpad.net/~glaucimar-aguiar  Glaucimar Aguiar ], [https://launchpad.net/~tiago-martins Tiago Martins], [https://blueprints.launchpad.net/~the-akshat Akshat Kakkar] [https://launchpad.net/~ulrich-schwickerath Ulrich Schwickerath],
 +
 
== Introduction ==
 
== Introduction ==
In Keystone v3 (Grizzly release), the Domains feature encapsulates users and projects into logical entities that can represent accounts, organizations, etc. However, currently there is no capability or mechanism to manage or enforce quotas at the domain level. Assigning or updating quota values or limits to a domain will allow the cloud administrator to evaluate domain lists and consumption. In order to achieve these capabilities it will be required to implement quota management and quota monitoring for Keystone domains, by which domain usage can be managed and enforced.
+
In Keystone v3 (Grizzly release), Domains encapsulates users and projects into logical entities that can represent accounts, organizations, etc. Currently there is no capability or mechanism to manage or enforce quotas at domain level. Assigning or updating quota values or limits to a domain will allow the cloud administrator to evaluate domain lists and consumption. In order to achieve these capabilities it will be required to implement quota management for Keystone domains.
 +
The goal of this blueprint is to support quotas at the OpenStack Domain level. The design of the feature models, as far as possible, the style of project quotas.
 +
This blueprint is a contribution from CERN, BARC and Hewlett-Packard.
  
The goal of this blueprint is to support quotas at the OpenStack Domain level. The design of the feature models, as far as possible, the style of project (tenant) quotas.
 
  
 
== Openstack Quotas ==
 
== Openstack Quotas ==
A quota sets a limit on the value of some property of an OpenStack service, e.g. In Nova the number of instances that can be created.  Currently in OpenStack, quotas are applied at the project or tenant level. There is also a Grizzly blueprint to introduce quotas at the user level.
+
Today OpenStack services make usage of quotas to limit the project resources.
 +
For examplethe “Instances” quota represents the number of instances that can be created in a project. The table below summarizes the existing project quotas.
 +
 
 +
{| class="wikitable"
 +
|-
 +
! quotas !! type !! default values !! description
 +
|-
 +
| nova.instances || reservable|| 10|| number of instances allowed per project
 +
|-
 +
| nova.cores|| reservable|| 20|| number of instance cores allowed per project
 +
|-
 +
| nova.ram || reservable || 50*1024|| megabytes of instance ram allowed per project
 +
|-
 +
| nova.floating_ips || reservable || 10 || number of floating ips allowed per project
 +
|-
 +
| nova.fixed_ips|| reservable|| -1 || number of fixed ips allowed per project
 +
|-
 +
| nova.metadata_items|| absolute || 128|| number of metadata items allowed per instance
 +
|-
 +
| nova.injected_files || absolute|| 5 || number of injected files allowed
 +
|-
 +
| nova.injected_files_content_bytes|| absolute || 10*1024 || number of bytes allowed per injected file
 +
|-
 +
| nova.injected_file_path_bytes || absolute|| 255 || number of bytes allowed per injected file path
 +
|-
 +
| nova.security_groups || reservable || 10 || number of security groups per project
 +
|-
 +
| nova.security_groups_rules || countable || 20 || number of security rules per security group
 +
|-
 +
| nova.key_pairs|| countable || 100 || number of key pairs per user
 +
|-
 +
| cinder.volumes || reservable || 10 || number of volumes allowed per project
 +
|-
 +
| cinder.snapshots || reservable || 10 || number of volume snapshots allowed per project
 +
|-
 +
| cinder.gigabytes || reservable || 1000 || number of volume gigabytes (snapshots are also included) per project
 +
|-
 +
| quantum.network || countable || 10 || Number of networks allowed per tenant
 +
|-
 +
| quantum.subnet || countable || 10 || Number of subnets allowed per tenant
 +
|-
 +
| quantum.port || countable || 50 || number of ports allowed per tenant
 +
|}
 +
 
 +
== User Stories ==
 +
Domain Quotas might impact partitioned OpenStack deployments (regions, cells, etc). Here we consider only the impact on regions. These can be
 +
# Per–Region domain quotas
 +
# Across region domain quotas
 +
 
 +
The 1st approach works similar to the current implementation of quotas per project; in a multi-region scenario, the domain quotas are enforced by each service in a non-centralized fashion. The 2nd approach, a domain quota is shared dynamically among regions, e.g. if a service from a given region needs more quota than the others, it requests more quotas.
 +
This blueprint addresses the per–region domain quotas. The user stories are listed below:
 +
:* As a cloud administrator, I want to create a domain with default domain quotas
 +
:* As a cloud/domain administrator, I want to see the domain quotas for a domain in a region
 +
:* As a cloud administrator, I want to update the quotas for a domain in a region
 +
:* As a cloud administrator, I want to delete the quotas for a domain in a region
  
=== Nova ===
+
Since quotas deals with sensible aspects of resource consumption, we identified the need to log the interactions of users when they manage domain quotas.
For projects, quota controls are available to limit the  
 
* Number of instances which may be launched
 
* Number of processor cores which may be allocated
 
* Publicly accessible IP addresses
 
* Amount of RAM that can be allocated in MB
 
* Number of files that can be injected
 
* Maximal size of injected files in bytes
 
* Number of security groups that may be created
 
* Number of rules per security group
 
  
=== Cinder ===
+
== Design ==
From Folsom onwards, the following quotas are managed by Cinder not Nova.
+
Our proposal have 2 main blocks: one in keystone we are calling the Domain Quota Proxy (DQP), the other  we are calling Domain Quota Driver (DQD). The DQP is responsible to give to user one point of domain quota management, so it acts as a proxy.  The DQP is a discrete extesion that can be improved to serve as a single point of management for other quotas. The DQD is a piece of code located in the quota module of Nova, Cinder and Quantum projects, and it's designed in the same fashion as the other drivers present in such module.
* Number of volumes which may be created
 
* Total size of all volumes within a project as measured in GB
 
  
===Quantum Quotas ===
 
For projects, quota controls are available to limit the number of
 
* networks allowed per tenant
 
* subnets allowed per tenant,
 
* ports allowed per tenant,
 
* routers allowed per tenant
 
* floating IPs allowed per tenant
 
  
=== Swift Quotas ===
+
[[File:Domainquota.png|600x269px]]
Swift Quota is a production-ready project that is mainly used for controlling the usage of account and containers in OpenStack Swift.  
 
* Number of containers per account (example: an account cannot have more than 5 containers)
 
* Number of objects per container (example: a container cannot have more than 100 objects)
 
* Storage capacity per container (example: the size of a container cannot be larger than 100 GB)
 
  
== User Stories ==
 
* As cloud administrator Paul, I want to limit resource usage for a given Organization represented as a Domain.
 
* As cloud administrator Paul, I want to manage resource usage for each Organization.
 
* As organization administrator Mary, I want to track resource usage for my Organization
 
  
== Design ==
+
Quota modules need to be refactored to add DQD. Also we should extend the services REST API to provide domain quotas usage to Domain Quota Proxy. The DQP is designed to be implemented as a discrete extension and not included in the default pipeline of Keystone.  The Domain Quota Driver design is similar to the current quota driver from quota.py module, given the possibility to the user to option to use it or not; they will be responsible to enforce all quotas listed in the table above in the context of domains.
Usage against Quota limits must be tracked, so if there is a Domain Limit on some property then there must be a corresponding and Domain Usage. Thus, for a Domain Quota, if there is Nova Limit there must also be a Nova Usage and similarly for Cinder and Quantum.  
+
 
 +
===REST API===
 +
This gives an option of '''getting''' quota for specific domain.
 +
<pre><nowiki>
 +
GET v3/{domain-id}/quotas
 +
Content-Type application/json
 +
Accept application/json
 +
</nowiki></pre>
 +
Request:
 +
<pre><nowiki>
 +
{
 +
    "quotas": {
 +
        "region": "regionOne",
 +
        "services": [
 +
            "nova",
 +
            "cinder"
 +
        ]
 +
    }
 +
}
 +
</nowiki></pre>
 +
Normal Response Code: 200<br/>
 +
Error Response Codes: Unauthorized (401), Not Found (404)<br/>
 +
Response:<br/>
 +
<pre><nowiki>
 +
{
 +
    "quotas": [
 +
        [
 +
            {
 +
                "domain-id": "72415820-8b69-11e0-9b19-734f6acf67565",
 +
                "region": "RegionOne"
 +
            },
 +
            {
 +
                "nova": {
 +
                    "instances": 10,
 +
                    "cores": 20,
 +
                    "ram": 1024,
 +
                    "fixed_ips": -1,
 +
                    "floating_ips": 10,
 +
                    "metada_items": 128,
 +
                    "injected_files": 5,
 +
                    "injected_files_content_bytes": 1024,
 +
                    "injected_file_path_bytes": 255,
 +
                    "security_groups": 10,
 +
                    "security_groups_rules": 20,
 +
                    "key_pairs": 100
 +
                },
 +
                "cinder": {
 +
                    "volumes": 20,
 +
                    "snapshots": 10,
 +
                    "gigabytes": 2048
 +
                }
 +
            }
 +
        ]
 +
    ]
 +
}
 +
</nowiki></pre>
 +
 
 +
This gives an option of '''updating''' quota for specific domain.
 +
<pre><nowiki>
 +
POST v3/{domain-id}/quotas
 +
Content-Type application/json
 +
Accept application/json
 +
</nowiki></pre>
 +
Request
 +
<pre><nowiki>
 +
{
 +
  "quotas":{
 +
          "region":"RegionOne",
 +
          "nova":{
 +
                  "floating_ips": 30
 +
          }
 +
    }
 +
}</nowiki></pre>
 +
Normal Response Code: 200<br/>
 +
Error Response Codes: Unauthorized (401), Not Found (404)<br/>
 +
Response:<br/>
 +
<pre><nowiki>
 +
{
 +
    "quotas": [
 +
        [
 +
            {
 +
                "domain-id": "72415820-8b69-11e0-9b19-734f6acf67565",
 +
                "region": "RegionOne"
 +
            },
 +
            {
 +
                "nova": {
 +
                    "instances": 10,
 +
                    "cores": 20,
 +
                    "ram": 1024,
 +
                    "fixed_ips": -1,
 +
                    "floating_ips": 30,
 +
                    "metada_items": 128,
 +
                    "injected_files": 5,
 +
                    "injected_files_content_bytes": 1024,
 +
                    "injected_file_path_bytes": 255,
 +
                    "security_groups": 10,
 +
                    "security_groups_rules": 20,
 +
                    "key_pairs": 100
 +
                }
 +
            }
 +
        ]
 +
    ]
 +
}
 +
</nowiki></pre>
  
=== Domain Quotas Conceptual Model ===
+
This gives an option of '''deleting''' quota for specific domain.
 +
<pre><nowiki>
 +
DELETE v3/{domain-id}/quotas
 +
Content-Type application/json
 +
Accept application/json
 +
</nowiki></pre>
 +
Request:
 +
<pre><nowiki>
 +
{
 +
    "quotas": {
 +
        "region": "regionOne",
 +
        "services": [
 +
            "nova",
 +
            "cinder"
 +
        ]
 +
    }
 +
}
 +
</nowiki></pre>
 +
Normal Response Code: 200<br/>
 +
Error Response Codes: Unauthorized (401), Not Found (404)<br/>
 +
Response:<br/>
 +
<pre><nowiki>
 +
{
 +
    "quotas": [
 +
        [
 +
            {
 +
                "domain-id": "72415820-8b69-11e0-9b19-734f6acf67565",
 +
                "region": "RegionOne"
 +
            },
 +
            {
 +
                "nova": {
 +
                    "instances": 10,
 +
                    "cores": 20,
 +
                    "ram": 1024,
 +
                    "fixed_ips": -1,
 +
                    "floating_ips": 10,
 +
                    "metada_items": 128,
 +
                    "injected_files": 5,
 +
                    "injected_files_content_bytes": 1024,
 +
                    "injected_file_path_bytes": 255,
 +
                    "security_groups": 10,
 +
                    "security_groups_rules": 20,
 +
                    "key_pairs": 100
 +
                },
 +
                "cinder": {
 +
                    "volumes": 20,
 +
                    "snapshots": 10,
 +
                    "gigabytes": 2048
 +
                }
 +
            }
 +
        ]
 +
    ]
 +
}
 +
</nowiki></pre>
  
[[Image:DomainQuotasConceptualModel.jpg]]
+
== Implementation ==
 +
Tables are made generic enough so as to accommodate quotas for any resource of any service.  'quotas' table is capable enough to store quota for any entity (and not just domain). Entity for which a quota is set is called as child in generic terms. Entity responsible for managing quota of a child is called parent. A child and a parent, need not be described just by a single field like user-id alone. There can be multiple fields (like user-id, role, project-id, etc.) and its values which in combination describes a child or a parent. This can be seen as best represented in general by a dictionary. For simple DB implementation, it is suggested to store this dictionary as separate key-value data in separate tables. These tables are 'child_field_data' and 'parent_field_data' tables.
  
=== Quota Operations on Domains ===
+
Details of fields of various DB tables is mentioned below,
The quota operations for domains will be part of the Keystone api. This is because domains can span services that are installed on different regions, and it is Keystone that maintains the service catalog of endpoints. This is in contrast to the existing project (tenant) quota operations which are tied to a single service because projects do not span services.
 
Quota Setting Operations
 
  
These operations use quota-sets and usage-sets. A quota_set is a set of name-value pairs that define the domain limits for on service properties.  A usage_set is a time-stamped set of name-value pairs that show the actual usage of the quota-limited service properties.
 
  
==== Create Domain Quota ====
+
'''Quota Table'''
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
! Verb !! URI !! Description
+
! Column || Description  
 +
|-
 +
| id || primary key
 +
|-
 +
| resource|| resource name
 +
|-
 +
| ceiling||absolute quota limit
 +
|-
 +
| available||indicates available quota. Calculated as 'ceiling' – (resources used by corresponding child )
 +
|-
 +
|  created_at||time at which the record is created
 +
|-
 +
|  created_by||dictionary having minimum keys as user and role. This indicates who created the record.
 +
|-
 +
|  closed_at||time at which the record is created
 
|-
 
|-
| POST || v3/{domain_id}/os-domain-quotas || Uses the request body quota-set to create a quota_set and a corresponding empty usage_set for the domain. Fails if an attempt is to set some quota lower than the current usage. Can be called by Cloud admin only.
+
| closed_by||dictionary having minimum keys as user and role.. This indicates who closed the record.
 
|}
 
|}
  
Normal Response Code: 200. Error Response Codes: Unauthorized (401), Forbidden (403), Conflict (409)
+
'''Child_Field_Data Table'''
This operation requires a request body. This operation returns a response.
 
 
 
==== Show Domain Quota ====
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
! Verb !! URI !! Description
+
! Column || Description  
 
|-
 
|-
| GET || v3/{domain_id}/os-domain-quotas || Returns the current quota-set for the domain. Can only be called by cloud admin or an admin for the domain.
+
| id || primary key
|}
+
|-
 
+
| quota_id || foreign key to quotas table. This helps in getting the quota for a child mentioned in this table.
Normal Response Code: 200. Error Response Codes: Unauthorized (401), Forbidden (403)
 
This operation does not require a request body. This operation returns a response.
 
 
==== Update Domain Quota ====
 
{| class="wikitable"
 
 
|-
 
|-
! Verb !! URI !! Description
+
| key || name of an attribute of child, like user-id, role-id, etc.
 
|-
 
|-
| PATCH || v3/{domain_id}/os-domain-quotas || Uses the request body quota-set to update the quota_set for the domain.  Fails if an attempt is to set some quota lower than the current usage. Can be called by Cloud admin only.
+
| value || value of the attribute of child.
 
|}
 
|}
  
Normal Response Code: 200. Error Response Codes: Unauthorized (401), Forbidden (403), Conflict (409)
+
'''Parent_Field_Data Table'''
This operation requires a request body. This operation returns a response.
 
 
 
'''Example 1. quota-set  Response: JSON'''
 
 
 
<pre><nowiki>
 
{'quota_set':  {'domain_id': 72415820-8b69-11e0-9b19-734f6acf67565,
 
                {'nova_quota_set':
 
                  {'volumes': 200,
 
                  'floating_ips': 100,
 
                  'instances': 500,
 
                  'injected_files': 50,
 
                  'cores': 600}},
 
                {'cinder_quota_set':
 
                  {'volumes': 100,
 
                  'gigabytes': 120000}},
 
                {'quantum_quota_set':
 
                  {'networks': 150,
 
                  'subnets': 150,
 
    'routers': 30}},
 
                {'swift_quota_set':
 
                  {'containers': 20,
 
                  'objects': 100
 
    'storage_capacity': 1000}}
 
  }
 
  }
 
</nowiki></pre>
 
 
 
==== Delete Domain Quota ====
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
! Verb !! URI !! Description
+
! Column || Description  
 
|-
 
|-
| DELETE || v3/{domain_id}/os-domain-quotas || Deletes any existing quota_set and usage_set for the domain. Can be called by Cloud admin only.
+
| id || primary key
|}
+
|-
 
+
| quota_id || foreign key to quota table. This helps in getting the child information managed by the parent mentioned in this table (or vice-versa).
Normal Response Code: 200. Error Response Codes: Unauthorized (401), Forbidden (403).
 
This operation does not require a request body. This operation does not return a response.
 
 
 
==== Show Domain Usage ====
 
{| class="wikitable"
 
 
|-
 
|-
! Verb !! URI !! Description
+
| key || name of an attribute of parent, like user-id, role-id, etc.
 
|-
 
|-
|GET || v3/{domain_id}/os-domain-usage || Returns the usage_set for the domain. Can be called by Cloud admin or an admin for the domain.
+
| value || value of the attribute of parent.
 
|}
 
|}
 
Normal Response Code: 200. Error Response Codes: Unauthorized (401), Forbidden (403)
 
This operation does not require a request body. This operation returns a response.
 
 
'''Example 2. usage-set  Response: JSON'''
 
 
<pre><nowiki>
 
 
{'usage_set':  {'domain_id': 83201710-7d95-71d0-2b23-834f6daf59571,
 
                'timestamp': 2013-01-05T10:45:00Z,
 
                {'nova_usage_set':
 
                  {'volumes': 20,
 
                  'floating_ips': 90,
 
                  'instances': 234,
 
                  'injected_files': 22,
 
                  'cores': 234}},
 
                {'cinder_usage_set':
 
                  {'volumes': 70,
 
                  'gigabytes': 95000}},
 
                {'quantum_usage_set':
 
                  {'networks': 23,
 
                  'subnets': 23,
 
        'routers': 23}},
 
                {'swift_usage_set':
 
                  {'containers': 11,
 
                  'objects': 76
 
    'storage_capacity': 145}}
 
  }
 
                    }
 
</nowiki></pre>
 
 
==== Usage Tracking and Limit Checking ====
 
Domain quotas require changes to the implementation of operations that can modify a service property that has a quota limit. The list of operations include allocate a new floating IP address, create a server, delete a network etc.
 
 
Each operation will require two changes. Firstl, each operation that can modify a service property has to record the change in usage table for the appropriate domain.  Second, before a service property can be increased, the current usage must be checked against the quota limit for the domain.
 
  
  
+
For history tracking, updates done in table <<nowiki />quota will be stored in the corresponding history table h_quota.<br/>
  
 
== Open Stack Quota References ==
 
== Open Stack Quota References ==

Latest revision as of 16:12, 17 October 2013

Introduction

In Keystone v3 (Grizzly release), Domains encapsulates users and projects into logical entities that can represent accounts, organizations, etc. Currently there is no capability or mechanism to manage or enforce quotas at domain level. Assigning or updating quota values or limits to a domain will allow the cloud administrator to evaluate domain lists and consumption. In order to achieve these capabilities it will be required to implement quota management for Keystone domains. The goal of this blueprint is to support quotas at the OpenStack Domain level. The design of the feature models, as far as possible, the style of project quotas. This blueprint is a contribution from CERN, BARC and Hewlett-Packard.


Openstack Quotas

Today OpenStack services make usage of quotas to limit the project resources. For example, the “Instances” quota represents the number of instances that can be created in a project. The table below summarizes the existing project quotas.

quotas type default values description
nova.instances reservable 10 number of instances allowed per project
nova.cores reservable 20 number of instance cores allowed per project
nova.ram reservable 50*1024 megabytes of instance ram allowed per project
nova.floating_ips reservable 10 number of floating ips allowed per project
nova.fixed_ips reservable -1 number of fixed ips allowed per project
nova.metadata_items absolute 128 number of metadata items allowed per instance
nova.injected_files absolute 5 number of injected files allowed
nova.injected_files_content_bytes absolute 10*1024 number of bytes allowed per injected file
nova.injected_file_path_bytes absolute 255 number of bytes allowed per injected file path
nova.security_groups reservable 10 number of security groups per project
nova.security_groups_rules countable 20 number of security rules per security group
nova.key_pairs countable 100 number of key pairs per user
cinder.volumes reservable 10 number of volumes allowed per project
cinder.snapshots reservable 10 number of volume snapshots allowed per project
cinder.gigabytes reservable 1000 number of volume gigabytes (snapshots are also included) per project
quantum.network countable 10 Number of networks allowed per tenant
quantum.subnet countable 10 Number of subnets allowed per tenant
quantum.port countable 50 number of ports allowed per tenant

User Stories

Domain Quotas might impact partitioned OpenStack deployments (regions, cells, etc). Here we consider only the impact on regions. These can be

  1. Per–Region domain quotas
  2. Across region domain quotas

The 1st approach works similar to the current implementation of quotas per project; in a multi-region scenario, the domain quotas are enforced by each service in a non-centralized fashion. The 2nd approach, a domain quota is shared dynamically among regions, e.g. if a service from a given region needs more quota than the others, it requests more quotas. This blueprint addresses the per–region domain quotas. The user stories are listed below:

  • As a cloud administrator, I want to create a domain with default domain quotas
  • As a cloud/domain administrator, I want to see the domain quotas for a domain in a region
  • As a cloud administrator, I want to update the quotas for a domain in a region
  • As a cloud administrator, I want to delete the quotas for a domain in a region

Since quotas deals with sensible aspects of resource consumption, we identified the need to log the interactions of users when they manage domain quotas.

Design

Our proposal have 2 main blocks: one in keystone we are calling the Domain Quota Proxy (DQP), the other we are calling Domain Quota Driver (DQD). The DQP is responsible to give to user one point of domain quota management, so it acts as a proxy. The DQP is a discrete extesion that can be improved to serve as a single point of management for other quotas. The DQD is a piece of code located in the quota module of Nova, Cinder and Quantum projects, and it's designed in the same fashion as the other drivers present in such module.


Domainquota.png


Quota modules need to be refactored to add DQD. Also we should extend the services REST API to provide domain quotas usage to Domain Quota Proxy. The DQP is designed to be implemented as a discrete extension and not included in the default pipeline of Keystone. The Domain Quota Driver design is similar to the current quota driver from quota.py module, given the possibility to the user to option to use it or not; they will be responsible to enforce all quotas listed in the table above in the context of domains.

REST API

This gives an option of getting quota for specific domain.

GET v3/{domain-id}/quotas
Content-Type application/json
Accept application/json

Request:

{
    "quotas": {
        "region": "regionOne",
        "services": [
            "nova",
            "cinder"
        ]
    }
}

Normal Response Code: 200
Error Response Codes: Unauthorized (401), Not Found (404)
Response:

{
    "quotas": [
        [
            {
                "domain-id": "72415820-8b69-11e0-9b19-734f6acf67565",
                "region": "RegionOne"
            },
            {
                "nova": {
                    "instances": 10,
                    "cores": 20,
                    "ram": 1024,
                    "fixed_ips": -1,
                    "floating_ips": 10,
                    "metada_items": 128,
                    "injected_files": 5,
                    "injected_files_content_bytes": 1024,
                    "injected_file_path_bytes": 255,
                    "security_groups": 10,
                    "security_groups_rules": 20,
                    "key_pairs": 100
                },
                "cinder": {
                    "volumes": 20,
                    "snapshots": 10,
                    "gigabytes": 2048
                }
            }
        ]
    ]
}

This gives an option of updating quota for specific domain.

POST v3/{domain-id}/quotas
Content-Type application/json
Accept application/json

Request

{
   "quotas":{
           "region":"RegionOne",
           "nova":{
                   "floating_ips": 30
           }
    }
}

Normal Response Code: 200
Error Response Codes: Unauthorized (401), Not Found (404)
Response:

{
    "quotas": [
        [
            {
                "domain-id": "72415820-8b69-11e0-9b19-734f6acf67565",
                "region": "RegionOne"
            },
            {
                "nova": {
                    "instances": 10,
                    "cores": 20,
                    "ram": 1024,
                    "fixed_ips": -1,
                    "floating_ips": 30,
                    "metada_items": 128,
                    "injected_files": 5,
                    "injected_files_content_bytes": 1024,
                    "injected_file_path_bytes": 255,
                    "security_groups": 10,
                    "security_groups_rules": 20,
                    "key_pairs": 100
                }
            }
        ]
    ]
}

This gives an option of deleting quota for specific domain.

DELETE v3/{domain-id}/quotas
Content-Type application/json
Accept application/json

Request:

{
    "quotas": {
        "region": "regionOne",
        "services": [
            "nova",
            "cinder"
        ]
    }
}

Normal Response Code: 200
Error Response Codes: Unauthorized (401), Not Found (404)
Response:

{
    "quotas": [
        [
            {
                "domain-id": "72415820-8b69-11e0-9b19-734f6acf67565",
                "region": "RegionOne"
            },
            {
                "nova": {
                    "instances": 10,
                    "cores": 20,
                    "ram": 1024,
                    "fixed_ips": -1,
                    "floating_ips": 10,
                    "metada_items": 128,
                    "injected_files": 5,
                    "injected_files_content_bytes": 1024,
                    "injected_file_path_bytes": 255,
                    "security_groups": 10,
                    "security_groups_rules": 20,
                    "key_pairs": 100
                },
                "cinder": {
                    "volumes": 20,
                    "snapshots": 10,
                    "gigabytes": 2048
                }
            }
        ]
    ]
}

Implementation

Tables are made generic enough so as to accommodate quotas for any resource of any service. 'quotas' table is capable enough to store quota for any entity (and not just domain). Entity for which a quota is set is called as child in generic terms. Entity responsible for managing quota of a child is called parent. A child and a parent, need not be described just by a single field like user-id alone. There can be multiple fields (like user-id, role, project-id, etc.) and its values which in combination describes a child or a parent. This can be seen as best represented in general by a dictionary. For simple DB implementation, it is suggested to store this dictionary as separate key-value data in separate tables. These tables are 'child_field_data' and 'parent_field_data' tables.

Details of fields of various DB tables is mentioned below,


Quota Table

Column Description
id primary key
resource resource name
ceiling absolute quota limit
available indicates available quota. Calculated as 'ceiling' – (resources used by corresponding child )
created_at time at which the record is created
created_by dictionary having minimum keys as user and role. This indicates who created the record.
closed_at time at which the record is created
closed_by dictionary having minimum keys as user and role.. This indicates who closed the record.

Child_Field_Data Table

Column Description
id primary key
quota_id foreign key to quotas table. This helps in getting the quota for a child mentioned in this table.
key name of an attribute of child, like user-id, role-id, etc.
value value of the attribute of child.

Parent_Field_Data Table

Column Description
id primary key
quota_id foreign key to quota table. This helps in getting the child information managed by the parent mentioned in this table (or vice-versa).
key name of an attribute of parent, like user-id, role-id, etc.
value value of the attribute of parent.


For history tracking, updates done in table <quota will be stored in the corresponding history table h_quota.

Open Stack Quota References

This is a list of URLs of work on quotas within OpenStack.

Topic URI Notes
Per-user quotas support https://blueprints.launchpad.net/nova/+spec/per-user-quotas Blocked to be re-introduced in Grizzly
Stores Quotas centrally in Keystone http://wiki.openstack.org/KeystoneStoreQuotaData
Quantum Quotas http://docs.openstack.org/api/openstack-network/2.0/content/List_Quotas.html
Swift Quotas https://blueprints.launchpad.net/swift/+spec/storage-quotas Implementation status unknown
Quota Project: An effective way to manage the usage of your Swift-based storage cloud http://www.zmanda.com/blogs/?cat=22
Update Limits and Quotas to Key On volume_type https://blueprints.launchpad.net/cinder/+spec/quotas-limits-by-voltype Not started, grizzly-3 target
Demystifying OpenStack Folsom Quotas http://ops.anthonygoddard.com/OpenStack/demystifying-openstack-folsom-quotas/ Explains Cinder/Nova quota separation
per-user quotas support https://blueprints.launchpad.net/nova/+spec/per-user-quotas Blocked by bug https://bugs.launchpad.net/nova/+bug/1034384. It will be re-introduced into Grizzly