summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Washenberger <mark.washenberger@rackspace.com>2011-05-17 13:46:15 -0400
committerMark Washenberger <mark.washenberger@rackspace.com>2011-05-17 13:46:15 -0400
commit34b1461fa567f5ffba89b893b8082df050a64a5e (patch)
tree68e48f9ff2784d76ac6d4e9b1241a7c1cd8c97d7
parent8cf2087747ab87fec0e1f7cc3d57ed1fa5065749 (diff)
add ram limits to instance quotas
-rw-r--r--nova/db/api.py2
-rw-r--r--nova/db/sqlalchemy/api.py5
-rw-r--r--nova/quota.py26
3 files changed, 21 insertions, 12 deletions
diff --git a/nova/db/api.py b/nova/db/api.py
index ef8aa1143..f341ffeb5 100644
--- a/nova/db/api.py
+++ b/nova/db/api.py
@@ -403,7 +403,7 @@ def instance_create(context, values):
def instance_data_get_for_project(context, project_id):
- """Get (instance_count, core_count) for project."""
+ """Get (instance_count, core_count, ram_count) for project."""
return IMPL.instance_data_get_for_project(context, project_id)
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index ea0bbb06e..6d34a87ca 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -802,12 +802,13 @@ def instance_create(context, values):
def instance_data_get_for_project(context, project_id):
session = get_session()
result = session.query(func.count(models.Instance.id),
- func.sum(models.Instance.vcpus)).\
+ func.sum(models.Instance.vcpus),
+ func.sum(models.Instance.memory_mb)).\
filter_by(project_id=project_id).\
filter_by(deleted=False).\
first()
# NOTE(vish): convert None to 0
- return (result[0] or 0, result[1] or 0)
+ return (result[0] or 0, result[1] or 0, result[2] or 0)
@require_context
diff --git a/nova/quota.py b/nova/quota.py
index a93cd0766..b37fa5ba4 100644
--- a/nova/quota.py
+++ b/nova/quota.py
@@ -28,6 +28,8 @@ flags.DEFINE_integer('quota_instances', 10,
'number of instances allowed per project')
flags.DEFINE_integer('quota_cores', 20,
'number of instance cores allowed per project')
+flags.DEFINE_integer('quota_ram', 50 * 1024,
+ 'megabytes of instance ram allowed per project')
flags.DEFINE_integer('quota_volumes', 10,
'number of volumes allowed per project')
flags.DEFINE_integer('quota_gigabytes', 1000,
@@ -45,12 +47,15 @@ flags.DEFINE_integer('quota_max_injected_file_path_bytes', 255,
def get_quota(context, project_id):
- rval = {'instances': FLAGS.quota_instances,
- 'cores': FLAGS.quota_cores,
- 'volumes': FLAGS.quota_volumes,
- 'gigabytes': FLAGS.quota_gigabytes,
- 'floating_ips': FLAGS.quota_floating_ips,
- 'metadata_items': FLAGS.quota_metadata_items}
+ rval = {
+ 'instances': FLAGS.quota_instances,
+ 'cores': FLAGS.quota_cores,
+ 'ram': FLAGS.quota_ram,
+ 'volumes': FLAGS.quota_volumes,
+ 'gigabytes': FLAGS.quota_gigabytes,
+ 'floating_ips': FLAGS.quota_floating_ips,
+ 'metadata_items': FLAGS.quota_metadata_items,
+ }
quota = db.quota_get_all_by_project(context, project_id)
for key in rval.keys():
@@ -70,15 +75,18 @@ def allowed_instances(context, num_instances, instance_type):
project_id = context.project_id
context = context.elevated()
num_cores = num_instances * instance_type['vcpus']
- used_instances, used_cores = db.instance_data_get_for_project(context,
- project_id)
+ num_ram = num_instances * instance_type['memory_mb']
+ usage = db.instance_data_get_for_project(context, project_id)
+ used_instances, used_cores, used_ram = usage
quota = get_quota(context, project_id)
allowed_instances = _get_request_allotment(num_instances, used_instances,
quota['instances'])
allowed_cores = _get_request_allotment(num_cores, used_cores,
quota['cores'])
+ allowed_ram = _get_request_allotment(num_ram, used_ram, quota['ram'])
allowed_instances = min(allowed_instances,
- int(allowed_cores // instance_type['vcpus']))
+ allowed_cores // instance_type['vcpus'],
+ allowed_ram // instance_type['memory_mb'])
return min(num_instances, allowed_instances)