diff options
| author | Rick Harris <rconradharris@gmail.com> | 2011-09-21 16:29:36 +0000 |
|---|---|---|
| committer | Rick Harris <rconradharris@gmail.com> | 2011-09-21 16:29:36 +0000 |
| commit | ec2a93ca94e3d8ce436858380fc2c46963c76e05 (patch) | |
| tree | 7ef167c96c10ccb5c307b6cbc31930edc462693d | |
| parent | 275f58c5649653632b8c28b66b59ff19d2cdf366 (diff) | |
| download | nova-ec2a93ca94e3d8ce436858380fc2c46963c76e05.tar.gz nova-ec2a93ca94e3d8ce436858380fc2c46963c76e05.tar.xz nova-ec2a93ca94e3d8ce436858380fc2c46963c76e05.zip | |
Adding flavor filtering
| -rw-r--r-- | nova/api/openstack/flavors.py | 8 | ||||
| -rw-r--r-- | nova/db/api.py | 5 | ||||
| -rw-r--r-- | nova/db/sqlalchemy/api.py | 10 | ||||
| -rw-r--r-- | nova/tests/test_instance_types.py | 37 |
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) |
