diff options
Diffstat (limited to 'nova/tests')
| -rw-r--r-- | nova/tests/api/openstack/compute/contrib/test_quota_classes.py | 163 | ||||
| -rw-r--r-- | nova/tests/api/openstack/compute/contrib/test_quotas.py | 8 | ||||
| -rw-r--r-- | nova/tests/api/openstack/compute/test_extensions.py | 1 | ||||
| -rw-r--r-- | nova/tests/policy.json | 1 | ||||
| -rw-r--r-- | nova/tests/test_quota.py | 190 |
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): |
