From ea5285fd5080e5fec20a8763ef98e6ffa9c7dea1 Mon Sep 17 00:00:00 2001 From: Vladimir Kuklin Date: Mon, 21 Apr 2014 21:42:14 +0400 Subject: [PATCH] Ignore nova limits set to '-1' In case nova server has quotas turned off, e.g. when it uses NoopQuotaDriver, nova-api returns '-1' for corresponding resources which obviously means 'INFINITY'. In this case we should not check resource template for any limits and should pass resource creation as-is. Change-Id: Idaf485719e384f3a613031c7ff272d55798e6e77 Closes-Bug: #1310710 Co-Authored-By: Dmitry Borodaenko --- heat/engine/resources/server.py | 41 ++++++++++++++++++++------------- heat/tests/test_server.py | 9 ++++++++ 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/heat/engine/resources/server.py b/heat/engine/resources/server.py index b3a9d86bd2..c7c03837a2 100644 --- a/heat/engine/resources/server.py +++ b/heat/engine/resources/server.py @@ -848,6 +848,15 @@ class Server(stack_user.StackUser): if new_metadata is None: self.metadata = self.parsed_template('Metadata') + @staticmethod + def _check_maximum(count, maximum, msg): + ''' + Check a count against a maximum, unless maximum is -1 which indicates + that there is no limit + ''' + if maximum != -1 and count > maximum: + raise exception.StackValidationFailed(message=msg) + def validate(self): ''' Validate any of the provided params @@ -926,28 +935,28 @@ class Server(stack_user.StackUser): # than the maximum number allowed in the provider's absolute # limits if metadata is not None: - if len(metadata) > limits['maxServerMeta']: - msg = _('Instance metadata must not contain greater than %s ' - 'entries. This is the maximum number allowed by your ' - 'service provider') % limits['maxServerMeta'] - raise exception.StackValidationFailed(message=msg) + msg = _('Instance metadata must not contain greater than %s ' + 'entries. This is the maximum number allowed by your ' + 'service provider') % limits['maxServerMeta'] + self._check_maximum(len(metadata), + limits['maxServerMeta'], msg) # verify the number of personality files and the size of each # personality file against the provider's absolute limits if personality is not None: - if len(personality) > limits['maxPersonality']: - msg = _("The personality property may not contain " - "greater than %s entries.") % limits['maxPersonality'] - raise exception.StackValidationFailed(message=msg) + msg = _("The personality property may not contain " + "greater than %s entries.") % limits['maxPersonality'] + self._check_maximum(len(personality), + limits['maxPersonality'], msg) for path, contents in personality.items(): - if len(bytes(contents)) > limits['maxPersonalitySize']: - msg = (_("The contents of personality file \"%(path)s\" " - "is larger than the maximum allowed personality " - "file size (%(max_size)s bytes).") % - {'path': path, - 'max_size': limits['maxPersonalitySize']}) - raise exception.StackValidationFailed(message=msg) + msg = (_("The contents of personality file \"%(path)s\" " + "is larger than the maximum allowed personality " + "file size (%(max_size)s bytes).") % + {'path': path, + 'max_size': limits['maxPersonalitySize']}) + self._check_maximum(len(bytes(contents)), + limits['maxPersonalitySize'], msg) def handle_delete(self): ''' diff --git a/heat/tests/test_server.py b/heat/tests/test_server.py index d5408c2d9f..567a712a9b 100644 --- a/heat/tests/test_server.py +++ b/heat/tests/test_server.py @@ -694,6 +694,15 @@ class ServersTest(HeatTestCase): disk_config=None, reservation_id=None, files={}, admin_pass='foo') + def test_check_maximum(self): + msg = 'test_check_maximum' + self.assertIsNone(servers.Server._check_maximum(1, 1, msg)) + self.assertIsNone(servers.Server._check_maximum(1000, -1, msg)) + error = self.assertRaises(exception.StackValidationFailed, + servers.Server._check_maximum, + 2, 1, msg) + self.assertEqual(msg, str(error)) + def test_server_validate(self): stack_name = 'srv_val' (t, stack) = self._setup_test_stack(stack_name)