diff options
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.py | 224 |
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) |