summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRick Harris <rconradharris@gmail.com>2011-09-22 16:42:20 +0000
committerTarmac <>2011-09-22 16:42:20 +0000
commit853aad905531fbdf6d5ddce4bc26b3caeebbc49f (patch)
treeee68427dd6123007ef6ca57fed367e5db32bc03c
parentf81b8e1efe0fdce003078b1ae328c7bee18e875d (diff)
parentb1daaa0b216d341c69421e4d9666e73860eec68c (diff)
downloadnova-853aad905531fbdf6d5ddce4bc26b3caeebbc49f.tar.gz
nova-853aad905531fbdf6d5ddce4bc26b3caeebbc49f.tar.xz
nova-853aad905531fbdf6d5ddce4bc26b3caeebbc49f.zip
This patch adds flavor filtering, specifically the ability to flavor on minRam, minDisk, or both, per the 1.1 OSAPI spec.
In addition, this patch refactors instance_type_get_all to return a *list* of instance_types instead of a *dict*. This makes it more consistent with the rest of the DB API.
-rw-r--r--nova/api/ec2/admin.py5
-rw-r--r--nova/api/openstack/flavors.py19
-rw-r--r--nova/compute/instance_types.py8
-rw-r--r--nova/db/api.py5
-rw-r--r--nova/db/sqlalchemy/api.py36
-rw-r--r--nova/tests/api/openstack/test_flavors.py283
-rw-r--r--nova/tests/db/fakes.py4
-rw-r--r--nova/tests/test_instance_types.py37
-rw-r--r--nova/tests/test_instance_types_extra_specs.py39
-rw-r--r--nova/tests/vmwareapi/db_fakes.py4
10 files changed, 357 insertions, 83 deletions
diff --git a/nova/api/ec2/admin.py b/nova/api/ec2/admin.py
index 75e029509..c1b1fa53a 100644
--- a/nova/api/ec2/admin.py
+++ b/nova/api/ec2/admin.py
@@ -126,8 +126,9 @@ class AdminController(object):
def describe_instance_types(self, context, **_kwargs):
"""Returns all active instance types data (vcpus, memory, etc.)"""
- return {'instanceTypeSet': [instance_dict(v) for v in
- db.instance_type_get_all(context).values()]}
+ inst_types = db.instance_type_get_all(context)
+ inst_type_dicts = [instance_dict(i) for i in inst_types]
+ return {'instanceTypeSet': inst_type_dicts}
def describe_user(self, _context, name, **_kwargs):
"""Returns user data, including access and secret keys."""
diff --git a/nova/api/openstack/flavors.py b/nova/api/openstack/flavors.py
index 8a310c900..b9dd96f4e 100644
--- a/nova/api/openstack/flavors.py
+++ b/nova/api/openstack/flavors.py
@@ -43,11 +43,24 @@ 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:
+ try:
+ filters['min_memory_mb'] = int(req.params['minRam'])
+ except ValueError:
+ pass # ignore bogus values per spec
+
+ if 'minDisk' in req.params:
+ try:
+ filters['min_local_gb'] = int(req.params['minDisk'])
+ except ValueError:
+ pass # ignore bogus values per spec
+
ctxt = req.environ['nova.context']
- flavors = 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(flavor, is_detail=is_detail)
- for flavor in flavors.values()]
+ items = [builder.build(inst_type, is_detail=is_detail)
+ for inst_type in inst_types]
return items
def show(self, req, id):
diff --git a/nova/compute/instance_types.py b/nova/compute/instance_types.py
index 824416514..ffbefb24c 100644
--- a/nova/compute/instance_types.py
+++ b/nova/compute/instance_types.py
@@ -91,8 +91,12 @@ def get_all_types(inactive=0):
Pass true as argument if you want deleted instance types returned also.
"""
- return db.instance_type_get_all(context.get_admin_context(), inactive)
-
+ ctxt = context.get_admin_context()
+ inst_types = db.instance_type_get_all(ctxt, inactive)
+ inst_type_dict = {}
+ for inst_type in inst_types:
+ inst_type_dict[inst_type['name']] = inst_type
+ return inst_type_dict
get_all_flavors = get_all_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 aa9fbda75..c91fa8c0d 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -3323,27 +3323,27 @@ 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 a dict describing all instance_types with name as key.
+ Returns all instance types.
"""
+ filters = filters or {}
session = get_session()
- if inactive:
- inst_types = session.query(models.InstanceTypes).\
- options(joinedload('extra_specs')).\
- order_by("name").\
- all()
- else:
- inst_types = session.query(models.InstanceTypes).\
- options(joinedload('extra_specs')).\
- filter_by(deleted=False).\
- order_by("name").\
- all()
- inst_dict = {}
- if inst_types:
- for i in inst_types:
- inst_dict[i['name']] = _dict_with_extra_specs(i)
- return inst_dict
+ 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]
@require_context
diff --git a/nova/tests/api/openstack/test_flavors.py b/nova/tests/api/openstack/test_flavors.py
index 348042bfe..743dddfc4 100644
--- a/nova/tests/api/openstack/test_flavors.py
+++ b/nova/tests/api/openstack/test_flavors.py
@@ -32,25 +32,43 @@ NS = "{http://docs.openstack.org/compute/api/v1.1}"
ATOMNS = "{http://www.w3.org/2005/Atom}"
-def stub_flavor(flavorid, name, memory_mb="256", local_gb="10"):
- return {
- "flavorid": str(flavorid),
- "name": name,
- "memory_mb": memory_mb,
- "local_gb": local_gb,
- }
+FAKE_FLAVORS = {
+ 'flavor 1': {
+ "flavorid": '1',
+ "name": 'flavor 1',
+ "memory_mb": '256',
+ "local_gb": '10'
+ },
+ 'flavor 2': {
+ "flavorid": '2',
+ "name": 'flavor 2',
+ "memory_mb": '512',
+ "local_gb": '20'
+ },
+}
-def return_instance_type_by_flavor_id(context, flavorid):
- return stub_flavor(flavorid, "flavor %s" % (flavorid,))
+def fake_instance_type_get_by_flavor_id(context, flavorid):
+ return FAKE_FLAVORS['flavor %s' % flavorid]
-def return_instance_types(context, num=2):
- instance_types = {}
- for i in xrange(1, num + 1):
- name = "flavor %s" % (i,)
- instance_types[name] = stub_flavor(i, name)
- return instance_types
+def fake_instance_type_get_all(context, inactive=False, filters=None):
+ def reject_min(db_attr, filter_attr):
+ return filter_attr in filters and\
+ int(flavor[db_attr]) < int(filters[filter_attr])
+
+ filters = filters or {}
+ for flavor in FAKE_FLAVORS.values():
+ if reject_min('memory_mb', 'min_memory_mb'):
+ continue
+ elif reject_min('local_gb', 'min_local_gb'):
+ continue
+
+ yield flavor
+
+
+def empty_instance_type_get_all(context, inactive=False, filters=None):
+ return {}
def return_instance_type_not_found(context, flavor_id):
@@ -63,9 +81,9 @@ class FlavorsTest(test.TestCase):
fakes.stub_out_networking(self.stubs)
fakes.stub_out_rate_limiting(self.stubs)
self.stubs.Set(nova.db.api, "instance_type_get_all",
- return_instance_types)
+ fake_instance_type_get_all)
self.stubs.Set(nova.db.api, "instance_type_get_by_flavor_id",
- return_instance_type_by_flavor_id)
+ fake_instance_type_get_by_flavor_id)
def tearDown(self):
self.stubs.UnsetAll()
@@ -89,10 +107,8 @@ class FlavorsTest(test.TestCase):
self.assertEqual(flavors, expected)
def test_get_empty_flavor_list_v1_0(self):
- def _return_empty(self):
- return {}
self.stubs.Set(nova.db.api, "instance_type_get_all",
- _return_empty)
+ empty_instance_type_get_all)
req = webob.Request.blank('/v1.0/flavors')
res = req.get_response(fakes.wsgi_app())
@@ -120,8 +136,8 @@ class FlavorsTest(test.TestCase):
{
"id": "2",
"name": "flavor 2",
- "ram": "256",
- "disk": "10",
+ "ram": "512",
+ "disk": "20",
"rxtx_cap": "",
"rxtx_quota": "",
"swap": "",
@@ -131,13 +147,13 @@ class FlavorsTest(test.TestCase):
self.assertEqual(flavors, expected)
def test_get_flavor_by_id_v1_0(self):
- req = webob.Request.blank('/v1.0/flavors/12')
+ req = webob.Request.blank('/v1.0/flavors/1')
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 200)
flavor = json.loads(res.body)["flavor"]
expected = {
- "id": "12",
- "name": "flavor 12",
+ "id": "1",
+ "name": "flavor 1",
"ram": "256",
"disk": "10",
"rxtx_cap": "",
@@ -155,15 +171,15 @@ class FlavorsTest(test.TestCase):
self.assertEqual(res.status_int, 404)
def test_get_flavor_by_id_v1_1(self):
- req = webob.Request.blank('/v1.1/fake/flavors/12')
+ req = webob.Request.blank('/v1.1/fake/flavors/1')
req.environ['api.version'] = '1.1'
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 200)
flavor = json.loads(res.body)
expected = {
"flavor": {
- "id": "12",
- "name": "flavor 12",
+ "id": "1",
+ "name": "flavor 1",
"ram": "256",
"disk": "10",
"rxtx_cap": "",
@@ -173,11 +189,11 @@ class FlavorsTest(test.TestCase):
"links": [
{
"rel": "self",
- "href": "http://localhost/v1.1/fake/flavors/12",
+ "href": "http://localhost/v1.1/fake/flavors/1",
},
{
"rel": "bookmark",
- "href": "http://localhost/fake/flavors/12",
+ "href": "http://localhost/fake/flavors/1",
},
],
},
@@ -255,8 +271,8 @@ class FlavorsTest(test.TestCase):
{
"id": "2",
"name": "flavor 2",
- "ram": "256",
- "disk": "10",
+ "ram": "512",
+ "disk": "20",
"rxtx_cap": "",
"rxtx_quota": "",
"swap": "",
@@ -277,9 +293,8 @@ class FlavorsTest(test.TestCase):
self.assertEqual(flavor, expected)
def test_get_empty_flavor_list_v1_1(self):
- def _return_empty(self):
- return {}
- self.stubs.Set(nova.db.api, "instance_type_get_all", _return_empty)
+ self.stubs.Set(nova.db.api, "instance_type_get_all",
+ empty_instance_type_get_all)
req = webob.Request.blank('/v1.1/fake/flavors')
res = req.get_response(fakes.wsgi_app())
@@ -288,6 +303,204 @@ class FlavorsTest(test.TestCase):
expected = []
self.assertEqual(flavors, expected)
+ def test_get_flavor_list_filter_min_ram_v1_1(self):
+ """Flavor lists may be filtered by minRam"""
+ req = webob.Request.blank('/v1.1/fake/flavors?minRam=512')
+ req.environ['api.version'] = '1.1'
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(res.status_int, 200)
+ flavor = json.loads(res.body)
+ expected = {
+ "flavors": [
+ {
+ "id": "2",
+ "name": "flavor 2",
+ "links": [
+ {
+ "rel": "self",
+ "href": "http://localhost/v1.1/fake/flavors/2",
+ },
+ {
+ "rel": "bookmark",
+ "href": "http://localhost/fake/flavors/2",
+ },
+ ],
+ },
+ ],
+ }
+ self.assertEqual(flavor, expected)
+
+ def test_get_flavor_list_filter_min_disk(self):
+ """Flavor lists may be filtered by minRam"""
+ req = webob.Request.blank('/v1.1/fake/flavors?minDisk=20')
+ req.environ['api.version'] = '1.1'
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(res.status_int, 200)
+ flavor = json.loads(res.body)
+ expected = {
+ "flavors": [
+ {
+ "id": "2",
+ "name": "flavor 2",
+ "links": [
+ {
+ "rel": "self",
+ "href": "http://localhost/v1.1/fake/flavors/2",
+ },
+ {
+ "rel": "bookmark",
+ "href": "http://localhost/fake/flavors/2",
+ },
+ ],
+ },
+ ],
+ }
+ self.assertEqual(flavor, expected)
+
+ def test_get_flavor_list_detail_min_ram_and_min_disk_v1_1(self):
+ """Tests that filtering work on flavor details and that minRam and
+ minDisk filters can be combined
+ """
+ req = webob.Request.blank(
+ '/v1.1/fake/flavors/detail?minRam=256&minDisk=20')
+ req.environ['api.version'] = '1.1'
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(res.status_int, 200)
+ flavor = json.loads(res.body)
+ expected = {
+ "flavors": [
+ {
+ "id": "2",
+ "name": "flavor 2",
+ "ram": "512",
+ "disk": "20",
+ "rxtx_cap": "",
+ "rxtx_quota": "",
+ "swap": "",
+ "vcpus": "",
+ "links": [
+ {
+ "rel": "self",
+ "href": "http://localhost/v1.1/fake/flavors/2",
+ },
+ {
+ "rel": "bookmark",
+ "href": "http://localhost/fake/flavors/2",
+ },
+ ],
+ },
+ ],
+ }
+ self.assertEqual(flavor, expected)
+
+ def test_get_flavor_list_detail_bogus_min_ram_v1_1(self):
+ """Tests that bogus minRam filtering values are ignored"""
+ req = webob.Request.blank(
+ '/v1.1/fake/flavors/detail?minRam=16GB')
+ req.environ['api.version'] = '1.1'
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(res.status_int, 200)
+ flavor = json.loads(res.body)
+ expected = {
+ "flavors": [
+ {
+ "id": "1",
+ "name": "flavor 1",
+ "ram": "256",
+ "disk": "10",
+ "rxtx_cap": "",
+ "rxtx_quota": "",
+ "swap": "",
+ "vcpus": "",
+ "links": [
+ {
+ "rel": "self",
+ "href": "http://localhost/v1.1/fake/flavors/1",
+ },
+ {
+ "rel": "bookmark",
+ "href": "http://localhost/fake/flavors/1",
+ },
+ ],
+ },
+ {
+ "id": "2",
+ "name": "flavor 2",
+ "ram": "512",
+ "disk": "20",
+ "rxtx_cap": "",
+ "rxtx_quota": "",
+ "swap": "",
+ "vcpus": "",
+ "links": [
+ {
+ "rel": "self",
+ "href": "http://localhost/v1.1/fake/flavors/2",
+ },
+ {
+ "rel": "bookmark",
+ "href": "http://localhost/fake/flavors/2",
+ },
+ ],
+ },
+ ],
+ }
+ self.assertEqual(flavor, expected)
+
+ def test_get_flavor_list_detail_bogus_min_disk_v1_1(self):
+ """Tests that bogus minDisk filtering values are ignored"""
+ req = webob.Request.blank(
+ '/v1.1/fake/flavors/detail?minDisk=16GB')
+ req.environ['api.version'] = '1.1'
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(res.status_int, 200)
+ flavor = json.loads(res.body)
+ expected = {
+ "flavors": [
+ {
+ "id": "1",
+ "name": "flavor 1",
+ "ram": "256",
+ "disk": "10",
+ "rxtx_cap": "",
+ "rxtx_quota": "",
+ "swap": "",
+ "vcpus": "",
+ "links": [
+ {
+ "rel": "self",
+ "href": "http://localhost/v1.1/fake/flavors/1",
+ },
+ {
+ "rel": "bookmark",
+ "href": "http://localhost/fake/flavors/1",
+ },
+ ],
+ },
+ {
+ "id": "2",
+ "name": "flavor 2",
+ "ram": "512",
+ "disk": "20",
+ "rxtx_cap": "",
+ "rxtx_quota": "",
+ "swap": "",
+ "vcpus": "",
+ "links": [
+ {
+ "rel": "self",
+ "href": "http://localhost/v1.1/fake/flavors/2",
+ },
+ {
+ "rel": "bookmark",
+ "href": "http://localhost/fake/flavors/2",
+ },
+ ],
+ },
+ ],
+ }
+ self.assertEqual(flavor, expected)
+
class FlavorsXMLSerializationTest(test.TestCase):
diff --git a/nova/tests/db/fakes.py b/nova/tests/db/fakes.py
index cdbfba63a..6e6253c1d 100644
--- a/nova/tests/db/fakes.py
+++ b/nova/tests/db/fakes.py
@@ -411,8 +411,8 @@ def stub_out_db_instance_api(stubs, injected=True):
'address_v6': 'fe80::a00:3',
'network_id': 'fake_flat'}
- def fake_instance_type_get_all(context, inactive=0):
- return INSTANCE_TYPES
+ def fake_instance_type_get_all(context, inactive=0, filters=None):
+ return INSTANCE_TYPES.values()
def fake_instance_type_get_by_name(context, name):
return INSTANCE_TYPES[name]
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)
diff --git a/nova/tests/test_instance_types_extra_specs.py b/nova/tests/test_instance_types_extra_specs.py
index 205601277..b4b642944 100644
--- a/nova/tests/test_instance_types_extra_specs.py
+++ b/nova/tests/test_instance_types_extra_specs.py
@@ -45,7 +45,7 @@ class InstanceTypeExtraSpecsTestCase(test.TestCase):
def tearDown(self):
# Remove the instance type from the database
- db.api.instance_type_purge(context.get_admin_context(), "cg1.4xlarge")
+ db.api.instance_type_purge(self.context, "cg1.4xlarge")
super(InstanceTypeExtraSpecsTestCase, self).tearDown()
def test_instance_type_specs_get(self):
@@ -55,7 +55,7 @@ class InstanceTypeExtraSpecsTestCase(test.TestCase):
xpus="2",
xpu_model="Tesla 2050")
actual_specs = db.api.instance_type_extra_specs_get(
- context.get_admin_context(),
+ self.context,
self.instance_type_id)
self.assertEquals(expected_specs, actual_specs)
@@ -64,11 +64,11 @@ class InstanceTypeExtraSpecsTestCase(test.TestCase):
cpu_model="Nehalem",
xpu_arch="fermi",
xpus="2")
- db.api.instance_type_extra_specs_delete(context.get_admin_context(),
+ db.api.instance_type_extra_specs_delete(self.context,
self.instance_type_id,
"xpu_model")
actual_specs = db.api.instance_type_extra_specs_get(
- context.get_admin_context(),
+ self.context,
self.instance_type_id)
self.assertEquals(expected_specs, actual_specs)
@@ -79,11 +79,11 @@ class InstanceTypeExtraSpecsTestCase(test.TestCase):
xpus="2",
xpu_model="Tesla 2050")
db.api.instance_type_extra_specs_update_or_create(
- context.get_admin_context(),
+ self.context,
self.instance_type_id,
dict(cpu_model="Sandy Bridge"))
actual_specs = db.api.instance_type_extra_specs_get(
- context.get_admin_context(),
+ self.context,
self.instance_type_id)
self.assertEquals(expected_specs, actual_specs)
@@ -96,18 +96,18 @@ class InstanceTypeExtraSpecsTestCase(test.TestCase):
net_arch="ethernet",
net_mbps="10000")
db.api.instance_type_extra_specs_update_or_create(
- context.get_admin_context(),
+ self.context,
self.instance_type_id,
dict(net_arch="ethernet",
net_mbps=10000))
actual_specs = db.api.instance_type_extra_specs_get(
- context.get_admin_context(),
+ self.context,
self.instance_type_id)
self.assertEquals(expected_specs, actual_specs)
def test_instance_type_get_with_extra_specs(self):
instance_type = db.api.instance_type_get(
- context.get_admin_context(),
+ self.context,
self.instance_type_id)
self.assertEquals(instance_type['extra_specs'],
dict(cpu_arch="x86_64",
@@ -116,13 +116,13 @@ class InstanceTypeExtraSpecsTestCase(test.TestCase):
xpus="2",
xpu_model="Tesla 2050"))
instance_type = db.api.instance_type_get(
- context.get_admin_context(),
+ self.context,
5)
self.assertEquals(instance_type['extra_specs'], {})
def test_instance_type_get_by_name_with_extra_specs(self):
instance_type = db.api.instance_type_get_by_name(
- context.get_admin_context(),
+ self.context,
"cg1.4xlarge")
self.assertEquals(instance_type['extra_specs'],
dict(cpu_arch="x86_64",
@@ -132,13 +132,13 @@ class InstanceTypeExtraSpecsTestCase(test.TestCase):
xpu_model="Tesla 2050"))
instance_type = db.api.instance_type_get_by_name(
- context.get_admin_context(),
+ self.context,
"m1.small")
self.assertEquals(instance_type['extra_specs'], {})
def test_instance_type_get_by_flavor_id_with_extra_specs(self):
instance_type = db.api.instance_type_get_by_flavor_id(
- context.get_admin_context(),
+ self.context,
105)
self.assertEquals(instance_type['extra_specs'],
dict(cpu_arch="x86_64",
@@ -148,7 +148,7 @@ class InstanceTypeExtraSpecsTestCase(test.TestCase):
xpu_model="Tesla 2050"))
instance_type = db.api.instance_type_get_by_flavor_id(
- context.get_admin_context(),
+ self.context,
2)
self.assertEquals(instance_type['extra_specs'], {})
@@ -159,7 +159,12 @@ class InstanceTypeExtraSpecsTestCase(test.TestCase):
xpus='2',
xpu_model="Tesla 2050")
- types = db.api.instance_type_get_all(context.get_admin_context())
+ types = db.api.instance_type_get_all(self.context)
- self.assertEquals(types['cg1.4xlarge']['extra_specs'], specs)
- self.assertEquals(types['m1.small']['extra_specs'], {})
+ name2specs = {}
+ for instance_type in types:
+ name = instance_type['name']
+ name2specs[name] = instance_type['extra_specs']
+
+ self.assertEquals(name2specs['cg1.4xlarge'], specs)
+ self.assertEquals(name2specs['m1.small'], {})
diff --git a/nova/tests/vmwareapi/db_fakes.py b/nova/tests/vmwareapi/db_fakes.py
index 0d896239a..575109f90 100644
--- a/nova/tests/vmwareapi/db_fakes.py
+++ b/nova/tests/vmwareapi/db_fakes.py
@@ -99,8 +99,8 @@ def stub_out_db_instance_api(stubs):
"""Stubs out the db.instance_get_fixed_address method."""
return '10.10.10.10'
- def fake_instance_type_get_all(context, inactive=0):
- return INSTANCE_TYPES
+ def fake_instance_type_get_all(context, inactive=0, filters=None):
+ return INSTANCE_TYPES.values()
def fake_instance_type_get_by_name(context, name):
return INSTANCE_TYPES[name]