summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/db/sqlalchemy/api.py1
-rw-r--r--nova/tests/test_db_api.py188
2 files changed, 188 insertions, 1 deletions
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index 4f8201f70..081d6ede8 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -3554,7 +3554,6 @@ def instance_type_get_all(context, inactive=False, filters=None):
query = query.filter(or_(*the_filter))
else:
query = query.filter(the_filter[0])
- del filters['is_public']
inst_types = query.order_by("name").all()
diff --git a/nova/tests/test_db_api.py b/nova/tests/test_db_api.py
index 0dd41ff34..07195ae22 100644
--- a/nova/tests/test_db_api.py
+++ b/nova/tests/test_db_api.py
@@ -1847,6 +1847,194 @@ class ServiceTestCase(test.TestCase, ModelsObjectComparatorMixin):
self.ctxt, 'non-exists-host', 'a')
+class InstanceTypeTestCase(test.TestCase, ModelsObjectComparatorMixin):
+
+ def setUp(self):
+ super(InstanceTypeTestCase, self).setUp()
+ self.ctxt = context.get_admin_context()
+
+ def _get_base_values(self):
+ return {
+ 'name': 'fake_name',
+ 'memory_mb': 512,
+ 'vcpus': 1,
+ 'root_gb': 10,
+ 'ephemeral_gb': 10,
+ 'flavorid': 'fake_flavor',
+ 'swap': 0,
+ 'rxtx_factor': 0.5,
+ 'vcpu_weight': 1,
+ 'disabled': False,
+ 'is_public': True
+ }
+
+ def _create_inst_type(self, values):
+ v = self._get_base_values()
+ v.update(values)
+ return db.instance_type_create(self.ctxt, v)
+
+ def test_instance_type_create(self):
+ inst_type = self._create_inst_type({})
+ ignored_keys = ['id', 'deleted', 'deleted_at', 'updated_at',
+ 'created_at', 'extra_specs']
+
+ self.assertFalse(inst_type['id'] is None)
+ self._assertEqualObjects(inst_type, self._get_base_values(),
+ ignored_keys)
+
+ def test_instance_type_destroy(self):
+ specs1 = {'a': '1', 'b': '2'}
+ inst_type1 = self._create_inst_type({'name': 'name1', 'flavorid': 'a1',
+ 'extra_specs': specs1})
+ specs2 = {'c': '4', 'd': '3'}
+ inst_type2 = self._create_inst_type({'name': 'name2', 'flavorid': 'a2',
+ 'extra_specs': specs2})
+
+ db.instance_type_destroy(self.ctxt, 'name1')
+
+ self.assertRaises(exception.InstanceTypeNotFound,
+ db.instance_type_get, self.ctxt, inst_type1['id'])
+ real_specs1 = db.instance_type_extra_specs_get(self.ctxt,
+ inst_type1['flavorid'])
+ self._assertEqualObjects(real_specs1, {})
+
+ r_inst_type2 = db.instance_type_get(self.ctxt, inst_type2['id'])
+ self._assertEqualObjects(inst_type2, r_inst_type2, 'extra_specs')
+
+ def test_instance_type_create_duplicate_name(self):
+ self._create_inst_type({})
+ self.assertRaises(exception.InstanceTypeExists,
+ self._create_inst_type,
+ {'flavorid': 'some_random_flavor'})
+
+ def test_instance_type_create_duplicate_flavorid(self):
+ self._create_inst_type({})
+ self.assertRaises(exception.InstanceTypeIdExists,
+ self._create_inst_type,
+ {'name': 'some_random_name'})
+
+ def test_instance_type_create_with_extra_specs(self):
+ extra_specs = dict(a='abc', b='def', c='ghi')
+ inst_type = self._create_inst_type({'extra_specs': extra_specs})
+ ignored_keys = ['id', 'deleted', 'deleted_at', 'updated_at',
+ 'created_at', 'extra_specs']
+
+ self._assertEqualObjects(inst_type, self._get_base_values(),
+ ignored_keys)
+ self._assertEqualObjects(extra_specs, inst_type['extra_specs'])
+
+ def test_instance_type_get_all(self):
+ # NOTE(boris-42): Remove base instance types
+ for it in db.instance_type_get_all(self.ctxt):
+ db.instance_type_destroy(self.ctxt, it['name'])
+
+ instance_types = [
+ {'root_gb': 600, 'memory_mb': 100, 'disabled': True,
+ 'is_public': True, 'name': 'a1', 'flavorid': 'f1'},
+ {'root_gb': 500, 'memory_mb': 200, 'disabled': True,
+ 'is_public': True, 'name': 'a2', 'flavorid': 'f2'},
+ {'root_gb': 400, 'memory_mb': 300, 'disabled': False,
+ 'is_public': True, 'name': 'a3', 'flavorid': 'f3'},
+ {'root_gb': 300, 'memory_mb': 400, 'disabled': False,
+ 'is_public': False, 'name': 'a4', 'flavorid': 'f4'},
+ {'root_gb': 200, 'memory_mb': 500, 'disabled': True,
+ 'is_public': False, 'name': 'a5', 'flavorid': 'f5'},
+ {'root_gb': 100, 'memory_mb': 600, 'disabled': True,
+ 'is_public': False, 'name': 'a6', 'flavorid': 'f6'}
+ ]
+ instance_types = [self._create_inst_type(it) for it in instance_types]
+
+ lambda_filters = {
+ 'min_memory_mb': lambda it, v: it['memory_mb'] >= v,
+ 'min_root_gb': lambda it, v: it['root_gb'] >= v,
+ 'disabled': lambda it, v: it['disabled'] == v,
+ 'is_public': lambda it, v: (v is None or it['is_public'] == v)
+ }
+
+ mem_filts = [{'min_memory_mb': x} for x in [100, 350, 550, 650]]
+ root_filts = [{'min_root_gb': x} for x in [100, 350, 550, 650]]
+ disabled_filts = [{'disabled': x} for x in [True, False]]
+ is_public_filts = [{'is_public': x} for x in [True, False, None]]
+
+ def assert_multi_filter_instance_type_get(filters=None):
+ if filters is None:
+ filters = {}
+
+ expected_it = instance_types
+ for name, value in filters.iteritems():
+ filt = lambda it: lambda_filters[name](it, value)
+ expected_it = filter(filt, expected_it)
+
+ real_it = db.instance_type_get_all(self.ctxt, filters=filters)
+ self._assertEqualListsOfObjects(expected_it, real_it)
+
+ #no filter
+ assert_multi_filter_instance_type_get()
+
+ #test only with one filter
+ for filt in mem_filts:
+ assert_multi_filter_instance_type_get(filt)
+ for filt in root_filts:
+ assert_multi_filter_instance_type_get(filt)
+ for filt in disabled_filts:
+ assert_multi_filter_instance_type_get(filt)
+ for filt in is_public_filts:
+ assert_multi_filter_instance_type_get(filt)
+
+ #test all filters together
+ for mem in mem_filts:
+ for root in root_filts:
+ for disabled in disabled_filts:
+ for is_public in is_public_filts:
+ filts = [f.items() for f in
+ [mem, root, disabled, is_public]]
+ filts = dict(reduce(lambda x, y: x + y, filts, []))
+ assert_multi_filter_instance_type_get(filts)
+
+ def test_instance_type_get(self):
+ inst_types = [{'name': 'abc', 'flavorid': '123'},
+ {'name': 'def', 'flavorid': '456'},
+ {'name': 'ghi', 'flavorid': '789'}]
+ inst_types = [self._create_inst_type(t) for t in inst_types]
+
+ for inst_type in inst_types:
+ inst_type_by_id = db.instance_type_get(self.ctxt, inst_type['id'])
+ self._assertEqualObjects(inst_type, inst_type_by_id)
+
+ def test_instance_type_get_by_name(self):
+ inst_types = [{'name': 'abc', 'flavorid': '123'},
+ {'name': 'def', 'flavorid': '456'},
+ {'name': 'ghi', 'flavorid': '789'}]
+ inst_types = [self._create_inst_type(t) for t in inst_types]
+
+ for inst_type in inst_types:
+ inst_type_by_name = db.instance_type_get_by_name(self.ctxt,
+ inst_type['name'])
+ self._assertEqualObjects(inst_type, inst_type_by_name)
+
+ def test_instance_type_get_by_name_not_found(self):
+ self._create_inst_type({})
+ self.assertRaises(exception.InstanceTypeNotFoundByName,
+ db.instance_type_get_by_name, self.ctxt, 'nonexists')
+
+ def test_instance_type_get_by_flavor_id(self):
+ inst_types = [{'name': 'abc', 'flavorid': '123'},
+ {'name': 'def', 'flavorid': '456'},
+ {'name': 'ghi', 'flavorid': '789'}]
+ inst_types = [self._create_inst_type(t) for t in inst_types]
+
+ for inst_type in inst_types:
+ params = (self.ctxt, inst_type['flavorid'])
+ inst_type_by_flavorid = db.instance_type_get_by_flavor_id(*params)
+ self._assertEqualObjects(inst_type, inst_type_by_flavorid)
+
+ def test_instance_type_get_by_flavor_not_found(self):
+ self._create_inst_type({})
+ self.assertRaises(exception.FlavorNotFound,
+ db.instance_type_get_by_flavor_id,
+ self.ctxt, 'nonexists')
+
+
class TestFixedIPGetByNetworkHost(test.TestCase):
def test_not_found_exception(self):
ctxt = context.get_admin_context()