summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRick Harris <rconradharris@gmail.com>2011-09-21 16:29:36 +0000
committerRick Harris <rconradharris@gmail.com>2011-09-21 16:29:36 +0000
commitec2a93ca94e3d8ce436858380fc2c46963c76e05 (patch)
tree7ef167c96c10ccb5c307b6cbc31930edc462693d
parent275f58c5649653632b8c28b66b59ff19d2cdf366 (diff)
downloadnova-ec2a93ca94e3d8ce436858380fc2c46963c76e05.tar.gz
nova-ec2a93ca94e3d8ce436858380fc2c46963c76e05.tar.xz
nova-ec2a93ca94e3d8ce436858380fc2c46963c76e05.zip
Adding flavor filtering
-rw-r--r--nova/api/openstack/flavors.py8
-rw-r--r--nova/db/api.py5
-rw-r--r--nova/db/sqlalchemy/api.py10
-rw-r--r--nova/tests/test_instance_types.py37
4 files changed, 56 insertions, 4 deletions
diff --git a/nova/api/openstack/flavors.py b/nova/api/openstack/flavors.py
index d83c0d52f..0fd31abb5 100644
--- a/nova/api/openstack/flavors.py
+++ b/nova/api/openstack/flavors.py
@@ -43,8 +43,14 @@ class Controller(object):
def _get_flavors(self, req, is_detail=True):
"""Helper function that returns a list of flavor dicts."""
+ filters = {}
+ if 'minRam' in req.params:
+ filters['min_memory_mb'] = req.params['minRam']
+ if 'minDisk' in req.params:
+ filters['min_local_gb'] = req.params['minDisk']
+
ctxt = req.environ['nova.context']
- inst_types = db.api.instance_type_get_all(ctxt)
+ inst_types = db.api.instance_type_get_all(ctxt, filters=filters)
builder = self._get_view_builder(req)
items = [builder.build(inst_type, is_detail=is_detail)
for inst_type in inst_types]
diff --git a/nova/db/api.py b/nova/db/api.py
index 8c4c78374..f776953db 100644
--- a/nova/db/api.py
+++ b/nova/db/api.py
@@ -1349,9 +1349,10 @@ def instance_type_create(context, values):
return IMPL.instance_type_create(context, values)
-def instance_type_get_all(context, inactive=False):
+def instance_type_get_all(context, inactive=False, filters=None):
"""Get all instance types."""
- return IMPL.instance_type_get_all(context, inactive)
+ return IMPL.instance_type_get_all(
+ context, inactive=inactive, filters=filters)
def instance_type_get(context, id):
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index a42ee8616..3aa5c59bb 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -3322,16 +3322,24 @@ def _dict_with_extra_specs(inst_type_query):
@require_context
-def instance_type_get_all(context, inactive=False):
+def instance_type_get_all(context, inactive=False, filters=None):
"""
Returns all instance types.
"""
+ filters = filters or {}
session = get_session()
partial = session.query(models.InstanceTypes)\
.options(joinedload('extra_specs'))
if not inactive:
partial = partial.filter_by(deleted=False)
+ if 'min_memory_mb' in filters:
+ partial = partial.filter(
+ models.InstanceTypes.memory_mb >= filters['min_memory_mb'])
+ if 'min_local_gb' in filters:
+ partial = partial.filter(
+ models.InstanceTypes.local_gb >= filters['min_local_gb'])
+
inst_types = partial.order_by("name").all()
return [_dict_with_extra_specs(i) for i in inst_types]
diff --git a/nova/tests/test_instance_types.py b/nova/tests/test_instance_types.py
index 09f532239..1ed34fba3 100644
--- a/nova/tests/test_instance_types.py
+++ b/nova/tests/test_instance_types.py
@@ -161,3 +161,40 @@ class InstanceTypeTestCase(test.TestCase):
self.assertRaises(exception.InstanceTypeNotFound,
instance_types.get_instance_type_by_name,
self._nonexistent_flavor_id())
+
+
+class InstanceTypeFilteringTest(test.TestCase):
+ """Test cases for the filter option available for instance_type_get_all"""
+ def setUp(self):
+ super(InstanceTypeFilteringTest, self).setUp()
+ self.context = context.get_admin_context()
+
+ def assertFilterResults(self, filters, expected):
+ inst_types = db.api.instance_type_get_all(
+ self.context, filters=filters)
+ inst_names = [i['name'] for i in inst_types]
+ self.assertEqual(inst_names, expected)
+
+ def test_no_filters(self):
+ filters = None
+ expected = ['m1.large', 'm1.medium', 'm1.small', 'm1.tiny',
+ 'm1.xlarge']
+ self.assertFilterResults(filters, expected)
+
+ def test_min_memory_mb_filter(self):
+ """Exclude tiny instance which is 512 MB"""
+ filters = dict(min_memory_mb=513)
+ expected = ['m1.large', 'm1.medium', 'm1.small', 'm1.xlarge']
+ self.assertFilterResults(filters, expected)
+
+ def test_min_local_gb_filter(self):
+ """Exclude everything but large and xlarge which have >= 80 GB"""
+ filters = dict(min_local_gb=80)
+ expected = ['m1.large', 'm1.xlarge']
+ self.assertFilterResults(filters, expected)
+
+ def test_min_memory_mb_AND_local_gb_filter(self):
+ """Exclude everything but large and xlarge which have >= 80 GB"""
+ filters = dict(min_memory_mb=16384, min_local_gb=80)
+ expected = ['m1.xlarge']
+ self.assertFilterResults(filters, expected)