From 7fd2de85b632575315df0dce2287b3a7b44492f1 Mon Sep 17 00:00:00 2001 From: Eric Fried Date: Tue, 10 Apr 2018 12:24:40 -0500 Subject: [PATCH] Make ResourceClass.normalize_name handle sharp S MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes ResourceClass.normalize_name to produce the same result in py2 and py3 even when sharp S ('ß') is part of the input. We do this by waiting until after replacing non-alphanumerics to upcase. Change-Id: I431fa29d36d0d633374973fc25168344042d6c1a Closes-Bug: #1762789 --- nova/rc_fields.py | 10 +++++----- nova/tests/unit/objects/test_fields.py | 9 ++------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/nova/rc_fields.py b/nova/rc_fields.py index 8481089a7154..add6c76a60e2 100644 --- a/nova/rc_fields.py +++ b/nova/rc_fields.py @@ -58,11 +58,11 @@ class ResourceClass(fields.StringField): def normalize_name(cls, rc_name): if rc_name is None: return None - norm_name = rc_name.upper() - cust_prefix = cls.CUSTOM_NAMESPACE - norm_name = cust_prefix + norm_name - # Replace some punctuation characters with underscores - norm_name = re.sub('[^0-9A-Z]+', '_', norm_name) + # Replace non-alphanumeric characters with underscores + norm_name = re.sub('[^0-9A-Za-z]+', '_', rc_name) + # Bug #1762789: Do .upper after replacing non alphanumerics. + norm_name = norm_name.upper() + norm_name = cls.CUSTOM_NAMESPACE + norm_name return norm_name diff --git a/nova/tests/unit/objects/test_fields.py b/nova/tests/unit/objects/test_fields.py index 7868ab81c5bd..289b625ddcf4 100644 --- a/nova/tests/unit/objects/test_fields.py +++ b/nova/tests/unit/objects/test_fields.py @@ -370,13 +370,8 @@ class TestResourceClass(TestString): py3. Make sure normalize_name handles it properly. """ name = u'Fu\xdfball' - if six.PY2: - self.assertEqual(u'CUSTOM_FU_BALL', - rc_fields.ResourceClass.normalize_name(name)) - else: - # TODO(efried): When bug #1762789 is resolved, remove this branch. - self.assertEqual(u'CUSTOM_FUSSBALL', - rc_fields.ResourceClass.normalize_name(name)) + self.assertEqual(u'CUSTOM_FU_BALL', + rc_fields.ResourceClass.normalize_name(name)) class TestInteger(TestField):