Implement quota classes.
Allows entire classes of quotas to be associated with projects, which makes it easier to set specific quotas across multiple projects. TODO: * (?) Adding a mapping between projects and quota classes Change-Id: I6b6477481187d16af225d33c1989430e4071d5a8
This commit is contained in:
@@ -692,6 +692,10 @@ class ProjectQuotaNotFound(QuotaNotFound):
|
|||||||
message = _("Quota for project %(project_id)s could not be found.")
|
message = _("Quota for project %(project_id)s could not be found.")
|
||||||
|
|
||||||
|
|
||||||
|
class QuotaClassNotFound(QuotaNotFound):
|
||||||
|
message = _("Quota class %(class_name)s could not be found.")
|
||||||
|
|
||||||
|
|
||||||
class SecurityGroupNotFound(NotFound):
|
class SecurityGroupNotFound(NotFound):
|
||||||
message = _("Security group %(security_group_id)s not found.")
|
message = _("Security group %(security_group_id)s not found.")
|
||||||
|
|
||||||
|
|||||||
@@ -60,6 +60,11 @@ FLAGS = flags.FLAGS
|
|||||||
FLAGS.register_opts(quota_opts)
|
FLAGS.register_opts(quota_opts)
|
||||||
|
|
||||||
|
|
||||||
|
quota_resources = ['metadata_items', 'injected_file_content_bytes',
|
||||||
|
'volumes', 'gigabytes', 'ram', 'floating_ips', 'instances',
|
||||||
|
'injected_files', 'cores']
|
||||||
|
|
||||||
|
|
||||||
def _get_default_quotas():
|
def _get_default_quotas():
|
||||||
defaults = {
|
defaults = {
|
||||||
'instances': FLAGS.quota_instances,
|
'instances': FLAGS.quota_instances,
|
||||||
@@ -80,13 +85,29 @@ def _get_default_quotas():
|
|||||||
return defaults
|
return defaults
|
||||||
|
|
||||||
|
|
||||||
def get_project_quotas(context, project_id):
|
def get_class_quotas(context, quota_class, defaults=None):
|
||||||
rval = _get_default_quotas()
|
"""Update defaults with the quota class values."""
|
||||||
quota = db.quota_get_all_by_project(context, project_id)
|
|
||||||
for key in rval.keys():
|
if not defaults:
|
||||||
|
defaults = _get_default_quotas()
|
||||||
|
|
||||||
|
quota = db.quota_class_get_all_by_name(context, quota_class)
|
||||||
|
for key in defaults.keys():
|
||||||
if key in quota:
|
if key in quota:
|
||||||
rval[key] = quota[key]
|
defaults[key] = quota[key]
|
||||||
return rval
|
|
||||||
|
return defaults
|
||||||
|
|
||||||
|
|
||||||
|
def get_project_quotas(context, project_id):
|
||||||
|
defaults = _get_default_quotas()
|
||||||
|
if context.quota_class:
|
||||||
|
get_class_quotas(context, context.quota_class, defaults)
|
||||||
|
quota = db.quota_get_all_by_project(context, project_id)
|
||||||
|
for key in defaults.keys():
|
||||||
|
if key in quota:
|
||||||
|
defaults[key] = quota[key]
|
||||||
|
return defaults
|
||||||
|
|
||||||
|
|
||||||
def _get_request_allotment(requested, used, quota):
|
def _get_request_allotment(requested, used, quota):
|
||||||
|
|||||||
@@ -101,6 +101,7 @@
|
|||||||
"compute_extension:multinic": [],
|
"compute_extension:multinic": [],
|
||||||
"compute_extension:networks": [],
|
"compute_extension:networks": [],
|
||||||
"compute_extension:quotas": [],
|
"compute_extension:quotas": [],
|
||||||
|
"compute_extension:quota_classes": [],
|
||||||
"compute_extension:rescue": [],
|
"compute_extension:rescue": [],
|
||||||
"compute_extension:security_groups": [],
|
"compute_extension:security_groups": [],
|
||||||
"compute_extension:server_action_list": [],
|
"compute_extension:server_action_list": [],
|
||||||
|
|||||||
Reference in New Issue
Block a user