summaryrefslogtreecommitdiffstats
path: root/nova/tests
diff options
context:
space:
mode:
Diffstat (limited to 'nova/tests')
-rw-r--r--nova/tests/api/openstack/compute/contrib/test_quota_classes.py163
-rw-r--r--nova/tests/api/openstack/compute/contrib/test_quotas.py8
-rw-r--r--nova/tests/api/openstack/compute/test_extensions.py1
-rw-r--r--nova/tests/policy.json1
-rw-r--r--nova/tests/test_quota.py190
5 files changed, 356 insertions, 7 deletions
diff --git a/nova/tests/api/openstack/compute/contrib/test_quota_classes.py b/nova/tests/api/openstack/compute/contrib/test_quota_classes.py
new file mode 100644
index 000000000..e29d266e3
--- /dev/null
+++ b/nova/tests/api/openstack/compute/contrib/test_quota_classes.py
@@ -0,0 +1,163 @@
+# Copyright 2012 OpenStack LLC.
+# All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+import webob
+from lxml import etree
+
+from nova.api.openstack import wsgi
+from nova.api.openstack.compute.contrib import quota_classes
+from nova import test
+from nova.tests.api.openstack import fakes
+
+
+def quota_set(class_name):
+ return {'quota_class_set': {'id': class_name, 'metadata_items': 128,
+ 'volumes': 10, 'gigabytes': 1000, 'ram': 51200,
+ 'floating_ips': 10, 'instances': 10, 'injected_files': 5,
+ 'cores': 20, 'injected_file_content_bytes': 10240}}
+
+
+class QuotaClassSetsTest(test.TestCase):
+
+ def setUp(self):
+ super(QuotaClassSetsTest, self).setUp()
+ self.controller = quota_classes.QuotaClassSetsController()
+
+ def test_format_quota_set(self):
+ raw_quota_set = {
+ 'instances': 10,
+ 'cores': 20,
+ 'ram': 51200,
+ 'volumes': 10,
+ 'floating_ips': 10,
+ 'metadata_items': 128,
+ 'gigabytes': 1000,
+ 'injected_files': 5,
+ 'injected_file_content_bytes': 10240}
+
+ quota_set = self.controller._format_quota_set('test_class',
+ raw_quota_set)
+ qs = quota_set['quota_class_set']
+
+ self.assertEqual(qs['id'], 'test_class')
+ self.assertEqual(qs['instances'], 10)
+ self.assertEqual(qs['cores'], 20)
+ self.assertEqual(qs['ram'], 51200)
+ self.assertEqual(qs['volumes'], 10)
+ self.assertEqual(qs['gigabytes'], 1000)
+ self.assertEqual(qs['floating_ips'], 10)
+ self.assertEqual(qs['metadata_items'], 128)
+ self.assertEqual(qs['injected_files'], 5)
+ self.assertEqual(qs['injected_file_content_bytes'], 10240)
+
+ def test_quotas_show_as_admin(self):
+ req = fakes.HTTPRequest.blank(
+ '/v2/fake4/os-quota-class-sets/test_class',
+ use_admin_context=True)
+ res_dict = self.controller.show(req, 'test_class')
+
+ self.assertEqual(res_dict, quota_set('test_class'))
+
+ def test_quotas_show_as_unauthorized_user(self):
+ req = fakes.HTTPRequest.blank(
+ '/v2/fake4/os-quota-class-sets/test_class')
+ self.assertRaises(webob.exc.HTTPForbidden, self.controller.show,
+ req, 'test_class')
+
+ def test_quotas_update_as_admin(self):
+ body = {'quota_class_set': {'instances': 50, 'cores': 50,
+ 'ram': 51200, 'volumes': 10,
+ 'gigabytes': 1000, 'floating_ips': 10,
+ 'metadata_items': 128, 'injected_files': 5,
+ 'injected_file_content_bytes': 10240}}
+
+ req = fakes.HTTPRequest.blank(
+ '/v2/fake4/os-quota-class-sets/test_class',
+ use_admin_context=True)
+ res_dict = self.controller.update(req, 'test_class', body)
+
+ self.assertEqual(res_dict, body)
+
+ def test_quotas_update_as_user(self):
+ body = {'quota_class_set': {'instances': 50, 'cores': 50,
+ 'ram': 51200, 'volumes': 10,
+ 'gigabytes': 1000, 'floating_ips': 10,
+ 'metadata_items': 128, 'injected_files': 5,
+ 'injected_file_content_bytes': 10240}}
+
+ req = fakes.HTTPRequest.blank(
+ '/v2/fake4/os-quota-class-sets/test_class')
+ self.assertRaises(webob.exc.HTTPForbidden, self.controller.update,
+ req, 'test_class', body)
+
+
+class QuotaTemplateXMLSerializerTest(test.TestCase):
+ def setUp(self):
+ super(QuotaTemplateXMLSerializerTest, self).setUp()
+ self.serializer = quota_classes.QuotaClassTemplate()
+ self.deserializer = wsgi.XMLDeserializer()
+
+ def test_serializer(self):
+ exemplar = dict(quota_class_set=dict(
+ id='test_class',
+ metadata_items=10,
+ injected_file_content_bytes=20,
+ volumes=30,
+ gigabytes=40,
+ ram=50,
+ floating_ips=60,
+ instances=70,
+ injected_files=80,
+ cores=90))
+ text = self.serializer.serialize(exemplar)
+
+ print text
+ tree = etree.fromstring(text)
+
+ self.assertEqual('quota_class_set', tree.tag)
+ self.assertEqual('test_class', tree.get('id'))
+ self.assertEqual(len(exemplar['quota_class_set']) - 1, len(tree))
+ for child in tree:
+ self.assertTrue(child.tag in exemplar['quota_class_set'])
+ self.assertEqual(int(child.text),
+ exemplar['quota_class_set'][child.tag])
+
+ def test_deserializer(self):
+ exemplar = dict(quota_class_set=dict(
+ metadata_items='10',
+ injected_file_content_bytes='20',
+ volumes='30',
+ gigabytes='40',
+ ram='50',
+ floating_ips='60',
+ instances='70',
+ injected_files='80',
+ cores='90'))
+ intext = ("<?xml version='1.0' encoding='UTF-8'?>\n"
+ '<quota_class_set>'
+ '<metadata_items>10</metadata_items>'
+ '<injected_file_content_bytes>20'
+ '</injected_file_content_bytes>'
+ '<volumes>30</volumes>'
+ '<gigabytes>40</gigabytes>'
+ '<ram>50</ram>'
+ '<floating_ips>60</floating_ips>'
+ '<instances>70</instances>'
+ '<injected_files>80</injected_files>'
+ '<cores>90</cores>'
+ '</quota_class_set>')
+
+ result = self.deserializer.deserialize(intext)['body']
+ self.assertEqual(result, exemplar)
diff --git a/nova/tests/api/openstack/compute/contrib/test_quotas.py b/nova/tests/api/openstack/compute/contrib/test_quotas.py
index 980871779..46753b883 100644
--- a/nova/tests/api/openstack/compute/contrib/test_quotas.py
+++ b/nova/tests/api/openstack/compute/contrib/test_quotas.py
@@ -31,11 +31,6 @@ def quota_set(id):
'injected_file_content_bytes': 10240}}
-def quota_set_list():
- return {'quota_set_list': [quota_set('1234'), quota_set('5678'),
- quota_set('update_me')]}
-
-
class QuotaSetsTest(test.TestCase):
def setUp(self):
@@ -54,8 +49,7 @@ class QuotaSetsTest(test.TestCase):
'injected_files': 5,
'injected_file_content_bytes': 10240}
- quota_set = quotas.QuotaSetsController()._format_quota_set('1234',
- raw_quota_set)
+ quota_set = self.controller._format_quota_set('1234', raw_quota_set)
qs = quota_set['quota_set']
self.assertEqual(qs['id'], '1234')
diff --git a/nova/tests/api/openstack/compute/test_extensions.py b/nova/tests/api/openstack/compute/test_extensions.py
index 62136fd5d..d9b5379c0 100644
--- a/nova/tests/api/openstack/compute/test_extensions.py
+++ b/nova/tests/api/openstack/compute/test_extensions.py
@@ -173,6 +173,7 @@ class ExtensionControllerTest(ExtensionTestCase):
"Keypairs",
"Multinic",
"Networks",
+ "QuotaClasses",
"Quotas",
"Rescue",
"SchedulerHints",
diff --git a/nova/tests/policy.json b/nova/tests/policy.json
index d2e647f9f..e726b8bf0 100644
--- a/nova/tests/policy.json
+++ b/nova/tests/policy.json
@@ -101,6 +101,7 @@
"compute_extension:multinic": [],
"compute_extension:networks": [],
"compute_extension:quotas": [],
+ "compute_extension:quota_classes": [],
"compute_extension:rescue": [],
"compute_extension:security_groups": [],
"compute_extension:server_action_list": [],
diff --git a/nova/tests/test_quota.py b/nova/tests/test_quota.py
index a3ec9727b..ca4fd265c 100644
--- a/nova/tests/test_quota.py
+++ b/nova/tests/test_quota.py
@@ -32,6 +32,196 @@ from nova.scheduler import driver as scheduler_driver
FLAGS = flags.FLAGS
+class GetQuotaTestCase(test.TestCase):
+ def setUp(self):
+ super(GetQuotaTestCase, self).setUp()
+ self.flags(quota_instances=10,
+ quota_cores=20,
+ quota_ram=50 * 1024,
+ quota_volumes=10,
+ quota_gigabytes=1000,
+ quota_floating_ips=10,
+ quota_metadata_items=128,
+ quota_max_injected_files=5,
+ quota_max_injected_file_content_bytes=10 * 1024)
+ self.context = context.RequestContext('admin', 'admin', is_admin=True)
+
+ def _stub_class(self):
+ def fake_quota_class_get_all_by_name(context, quota_class):
+ result = dict(class_name=quota_class)
+ if quota_class == 'test_class':
+ result.update(
+ instances=5,
+ cores=10,
+ ram=25 * 1024,
+ volumes=5,
+ gigabytes=500,
+ floating_ips=5,
+ metadata_items=64,
+ injected_files=2,
+ injected_file_content_bytes=5 * 1024,
+ invalid_quota=100,
+ )
+ return result
+
+ self.stubs.Set(db, 'quota_class_get_all_by_name',
+ fake_quota_class_get_all_by_name)
+
+ def _stub_project(self, override=False):
+ def fake_quota_get_all_by_project(context, project_id):
+ result = dict(project_id=project_id)
+ if override:
+ result.update(
+ instances=2,
+ cores=5,
+ ram=12 * 1024,
+ volumes=2,
+ gigabytes=250,
+ floating_ips=2,
+ metadata_items=32,
+ injected_files=1,
+ injected_file_content_bytes=2 * 1024,
+ invalid_quota=50,
+ )
+ return result
+
+ self.stubs.Set(db, 'quota_get_all_by_project',
+ fake_quota_get_all_by_project)
+
+ def test_default_quotas(self):
+ result = quota._get_default_quotas()
+ self.assertEqual(result, dict(
+ instances=10,
+ cores=20,
+ ram=50 * 1024,
+ volumes=10,
+ gigabytes=1000,
+ floating_ips=10,
+ metadata_items=128,
+ injected_files=5,
+ injected_file_content_bytes=10 * 1024,
+ ))
+
+ def test_default_quotas_unlimited(self):
+ self.flags(quota_instances=-1,
+ quota_cores=-1,
+ quota_ram=-1,
+ quota_volumes=-1,
+ quota_gigabytes=-1,
+ quota_floating_ips=-1,
+ quota_metadata_items=-1,
+ quota_max_injected_files=-1,
+ quota_max_injected_file_content_bytes=-1)
+ result = quota._get_default_quotas()
+ self.assertEqual(result, dict(
+ instances=None,
+ cores=None,
+ ram=None,
+ volumes=None,
+ gigabytes=None,
+ floating_ips=None,
+ metadata_items=None,
+ injected_files=None,
+ injected_file_content_bytes=None,
+ ))
+
+ def test_class_quotas_noclass(self):
+ self._stub_class()
+ result = quota.get_class_quotas(self.context, 'noclass')
+ self.assertEqual(result, dict(
+ instances=10,
+ cores=20,
+ ram=50 * 1024,
+ volumes=10,
+ gigabytes=1000,
+ floating_ips=10,
+ metadata_items=128,
+ injected_files=5,
+ injected_file_content_bytes=10 * 1024,
+ ))
+
+ def test_class_quotas(self):
+ self._stub_class()
+ result = quota.get_class_quotas(self.context, 'test_class')
+ self.assertEqual(result, dict(
+ instances=5,
+ cores=10,
+ ram=25 * 1024,
+ volumes=5,
+ gigabytes=500,
+ floating_ips=5,
+ metadata_items=64,
+ injected_files=2,
+ injected_file_content_bytes=5 * 1024,
+ ))
+
+ def test_project_quotas_defaults_noclass(self):
+ self._stub_class()
+ self._stub_project()
+ result = quota.get_project_quotas(self.context, 'admin')
+ self.assertEqual(result, dict(
+ instances=10,
+ cores=20,
+ ram=50 * 1024,
+ volumes=10,
+ gigabytes=1000,
+ floating_ips=10,
+ metadata_items=128,
+ injected_files=5,
+ injected_file_content_bytes=10 * 1024,
+ ))
+
+ def test_project_quotas_overrides_noclass(self):
+ self._stub_class()
+ self._stub_project(True)
+ result = quota.get_project_quotas(self.context, 'admin')
+ self.assertEqual(result, dict(
+ instances=2,
+ cores=5,
+ ram=12 * 1024,
+ volumes=2,
+ gigabytes=250,
+ floating_ips=2,
+ metadata_items=32,
+ injected_files=1,
+ injected_file_content_bytes=2 * 1024,
+ ))
+
+ def test_project_quotas_defaults_withclass(self):
+ self._stub_class()
+ self._stub_project()
+ self.context.quota_class = 'test_class'
+ result = quota.get_project_quotas(self.context, 'admin')
+ self.assertEqual(result, dict(
+ instances=5,
+ cores=10,
+ ram=25 * 1024,
+ volumes=5,
+ gigabytes=500,
+ floating_ips=5,
+ metadata_items=64,
+ injected_files=2,
+ injected_file_content_bytes=5 * 1024,
+ ))
+
+ def test_project_quotas_overrides_withclass(self):
+ self._stub_class()
+ self._stub_project(True)
+ self.context.quota_class = 'test_class'
+ result = quota.get_project_quotas(self.context, 'admin')
+ self.assertEqual(result, dict(
+ instances=2,
+ cores=5,
+ ram=12 * 1024,
+ volumes=2,
+ gigabytes=250,
+ floating_ips=2,
+ metadata_items=32,
+ injected_files=1,
+ injected_file_content_bytes=2 * 1024,
+ ))
+
+
class QuotaTestCase(test.TestCase):
class StubImageService(object):