summaryrefslogtreecommitdiff
path: root/nova/tests/unit/api/openstack/compute/test_quota_classes.py
diff options
context:
space:
mode:
Diffstat (limited to 'nova/tests/unit/api/openstack/compute/test_quota_classes.py')
-rw-r--r--nova/tests/unit/api/openstack/compute/test_quota_classes.py224
1 files changed, 224 insertions, 0 deletions
diff --git a/nova/tests/unit/api/openstack/compute/test_quota_classes.py b/nova/tests/unit/api/openstack/compute/test_quota_classes.py
index bdb33a7e1a..463f8344c0 100644
--- a/nova/tests/unit/api/openstack/compute/test_quota_classes.py
+++ b/nova/tests/unit/api/openstack/compute/test_quota_classes.py
@@ -12,12 +12,19 @@
# 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 copy
+from unittest import mock
+
+from oslo_limit import fixture as limit_fixture
import webob
from nova.api.openstack.compute import quota_classes \
as quota_classes_v21
from nova import exception
+from nova.limit import local as local_limit
+from nova.limit import placement as placement_limit
+from nova import objects
from nova import test
from nova.tests.unit.api.openstack import fakes
@@ -156,3 +163,220 @@ class QuotaClassSetsTestV257(QuotaClassSetsTestV250):
for resource in quota_classes_v21.FILTERED_QUOTAS_2_57:
self.quota_resources.pop(resource, None)
self.filtered_quotas.extend(quota_classes_v21.FILTERED_QUOTAS_2_57)
+
+
+class NoopQuotaClassesTest(test.NoDBTestCase):
+ quota_driver = "nova.quota.NoopQuotaDriver"
+
+ def setUp(self):
+ super(NoopQuotaClassesTest, self).setUp()
+ self.flags(driver=self.quota_driver, group="quota")
+ self.controller = quota_classes_v21.QuotaClassSetsController()
+
+ def test_show_v21(self):
+ req = fakes.HTTPRequest.blank("")
+ response = self.controller.show(req, "test_class")
+ expected_response = {
+ 'quota_class_set': {
+ 'id': 'test_class',
+ 'cores': -1,
+ 'fixed_ips': -1,
+ 'floating_ips': -1,
+ 'injected_file_content_bytes': -1,
+ 'injected_file_path_bytes': -1,
+ 'injected_files': -1,
+ 'instances': -1,
+ 'key_pairs': -1,
+ 'metadata_items': -1,
+ 'ram': -1,
+ 'security_group_rules': -1,
+ 'security_groups': -1
+ }
+ }
+ self.assertEqual(expected_response, response)
+
+ def test_show_v257(self):
+ req = fakes.HTTPRequest.blank("", version='2.57')
+ response = self.controller.show(req, "default")
+ expected_response = {
+ 'quota_class_set': {
+ 'id': 'default',
+ 'cores': -1,
+ 'instances': -1,
+ 'key_pairs': -1,
+ 'metadata_items': -1,
+ 'ram': -1,
+ 'server_group_members': -1,
+ 'server_groups': -1,
+ }
+ }
+ self.assertEqual(expected_response, response)
+
+ def test_update_v21_still_rejects_badrequests(self):
+ req = fakes.HTTPRequest.blank("")
+ body = {'quota_class_set': {'instances': 50, 'cores': 50,
+ 'ram': 51200, 'unsupported': 12}}
+ self.assertRaises(exception.ValidationError, self.controller.update,
+ req, 'test_class', body=body)
+
+ @mock.patch.object(objects.Quotas, "update_class")
+ def test_update_v21(self, mock_update):
+ req = fakes.HTTPRequest.blank("")
+ body = {'quota_class_set': {'ram': 51200}}
+ response = self.controller.update(req, 'default', body=body)
+ expected_response = {
+ 'quota_class_set': {
+ 'cores': -1,
+ 'fixed_ips': -1,
+ 'floating_ips': -1,
+ 'injected_file_content_bytes': -1,
+ 'injected_file_path_bytes': -1,
+ 'injected_files': -1,
+ 'instances': -1,
+ 'key_pairs': -1,
+ 'metadata_items': -1,
+ 'ram': -1,
+ 'security_group_rules': -1,
+ 'security_groups': -1
+ }
+ }
+ self.assertEqual(expected_response, response)
+ mock_update.assert_called_once_with(req.environ['nova.context'],
+ "default", "ram", 51200)
+
+ @mock.patch.object(objects.Quotas, "update_class")
+ def test_update_v257(self, mock_update):
+ req = fakes.HTTPRequest.blank("", version='2.57')
+ body = {'quota_class_set': {'ram': 51200}}
+ response = self.controller.update(req, 'default', body=body)
+ expected_response = {
+ 'quota_class_set': {
+ 'cores': -1,
+ 'instances': -1,
+ 'key_pairs': -1,
+ 'metadata_items': -1,
+ 'ram': -1,
+ 'server_group_members': -1,
+ 'server_groups': -1,
+ }
+ }
+ self.assertEqual(expected_response, response)
+ mock_update.assert_called_once_with(req.environ['nova.context'],
+ "default", "ram", 51200)
+
+
+class UnifiedLimitsQuotaClassesTest(NoopQuotaClassesTest):
+ quota_driver = "nova.quota.UnifiedLimitsDriver"
+
+ def setUp(self):
+ super(UnifiedLimitsQuotaClassesTest, self).setUp()
+ # Set server_groups so all config options get a different value
+ # but we also test as much as possible with the default config
+ self.flags(driver="nova.quota.UnifiedLimitsDriver", group='quota')
+ reglimits = {local_limit.SERVER_METADATA_ITEMS: 128,
+ local_limit.INJECTED_FILES: 5,
+ local_limit.INJECTED_FILES_CONTENT: 10 * 1024,
+ local_limit.INJECTED_FILES_PATH: 255,
+ local_limit.KEY_PAIRS: 100,
+ local_limit.SERVER_GROUPS: 12,
+ local_limit.SERVER_GROUP_MEMBERS: 10}
+ self.useFixture(limit_fixture.LimitFixture(reglimits, {}))
+
+ @mock.patch.object(placement_limit, "get_legacy_default_limits")
+ def test_show_v21(self, mock_default):
+ mock_default.return_value = {"instances": 1, "cores": 2, "ram": 3}
+ req = fakes.HTTPRequest.blank("")
+ response = self.controller.show(req, "test_class")
+ expected_response = {
+ 'quota_class_set': {
+ 'id': 'test_class',
+ 'cores': 2,
+ 'fixed_ips': -1,
+ 'floating_ips': -1,
+ 'ram': 3,
+ 'injected_file_content_bytes': 10240,
+ 'injected_file_path_bytes': 255,
+ 'injected_files': 5,
+ 'instances': 1,
+ 'key_pairs': 100,
+ 'metadata_items': 128,
+ 'security_group_rules': -1,
+ 'security_groups': -1,
+ }
+ }
+ self.assertEqual(expected_response, response)
+
+ @mock.patch.object(placement_limit, "get_legacy_default_limits")
+ def test_show_v257(self, mock_default):
+ mock_default.return_value = {"instances": 1, "cores": 2, "ram": 3}
+ req = fakes.HTTPRequest.blank("", version='2.57')
+ response = self.controller.show(req, "default")
+ expected_response = {
+ 'quota_class_set': {
+ 'id': 'default',
+ 'cores': 2,
+ 'instances': 1,
+ 'ram': 3,
+ 'key_pairs': 100,
+ 'metadata_items': 128,
+ 'server_group_members': 10,
+ 'server_groups': 12,
+ }
+ }
+ self.assertEqual(expected_response, response)
+
+ def test_update_still_rejects_badrequests(self):
+ req = fakes.HTTPRequest.blank("")
+ body = {'quota_class_set': {'instances': 50, 'cores': 50,
+ 'ram': 51200, 'unsupported': 12}}
+ self.assertRaises(exception.ValidationError, self.controller.update,
+ req, 'test_class', body=body)
+
+ @mock.patch.object(placement_limit, "get_legacy_default_limits")
+ @mock.patch.object(objects.Quotas, "update_class")
+ def test_update_v21(self, mock_update, mock_default):
+ mock_default.return_value = {"instances": 1, "cores": 2, "ram": 3}
+ req = fakes.HTTPRequest.blank("")
+ body = {'quota_class_set': {'ram': 51200}}
+ response = self.controller.update(req, 'default', body=body)
+ expected_response = {
+ 'quota_class_set': {
+ 'cores': 2,
+ 'fixed_ips': -1,
+ 'floating_ips': -1,
+ 'injected_file_content_bytes': 10240,
+ 'injected_file_path_bytes': 255,
+ 'injected_files': 5,
+ 'instances': 1,
+ 'key_pairs': 100,
+ 'metadata_items': 128,
+ 'ram': 3,
+ 'security_group_rules': -1,
+ 'security_groups': -1
+ }
+ }
+ self.assertEqual(expected_response, response)
+ # TODO(johngarbutt) we should be proxying to keystone
+ self.assertEqual(0, mock_update.call_count)
+
+ @mock.patch.object(placement_limit, "get_legacy_default_limits")
+ @mock.patch.object(objects.Quotas, "update_class")
+ def test_update_v257(self, mock_update, mock_default):
+ mock_default.return_value = {"instances": 1, "cores": 2, "ram": 3}
+ req = fakes.HTTPRequest.blank("", version='2.57')
+ body = {'quota_class_set': {'ram': 51200}}
+ response = self.controller.update(req, 'default', body=body)
+ expected_response = {
+ 'quota_class_set': {
+ 'cores': 2,
+ 'instances': 1,
+ 'ram': 3,
+ 'key_pairs': 100,
+ 'metadata_items': 128,
+ 'server_group_members': 10,
+ 'server_groups': 12,
+ }
+ }
+ self.assertEqual(expected_response, response)
+ # TODO(johngarbutt) we should be proxying to keystone
+ self.assertEqual(0, mock_update.call_count)