summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/compute/api.py4
-rw-r--r--nova/tests/test_utils.py21
-rw-r--r--nova/utils.py8
3 files changed, 32 insertions, 1 deletions
diff --git a/nova/compute/api.py b/nova/compute/api.py
index c7ca0640d..22ee82bbf 100644
--- a/nova/compute/api.py
+++ b/nova/compute/api.py
@@ -1182,8 +1182,10 @@ class API(base.Base):
# NOTE(ameade): we still need to support integer ids for ec2
if uuidutils.is_uuid_like(instance_id):
instance = self.db.instance_get_by_uuid(context, instance_id)
- else:
+ elif utils.is_int_like(instance_id):
instance = self.db.instance_get(context, instance_id)
+ else:
+ raise exception.InstanceNotFound(instance_id=instance_id)
check_policy(context, 'get', instance)
diff --git a/nova/tests/test_utils.py b/nova/tests/test_utils.py
index 2c46b27bd..9eab72c5b 100644
--- a/nova/tests/test_utils.py
+++ b/nova/tests/test_utils.py
@@ -757,3 +757,24 @@ class LastBytesTestCase(test.TestCase):
content = '1234567890'
flo.write(content)
self.assertEqual((content, 0), utils.last_bytes(flo, 1000))
+
+
+class IntLikeTestCase(test.TestCase):
+
+ def test_is_int_like(self):
+ self.assertTrue(utils.is_int_like(1))
+ self.assertTrue(utils.is_int_like("1"))
+ self.assertTrue(utils.is_int_like("514"))
+ self.assertTrue(utils.is_int_like("0"))
+
+ self.assertFalse(utils.is_int_like(1.1))
+ self.assertFalse(utils.is_int_like("1.1"))
+ self.assertFalse(utils.is_int_like("1.1.1"))
+ self.assertFalse(utils.is_int_like(None))
+ self.assertFalse(utils.is_int_like("0."))
+ self.assertFalse(utils.is_int_like("aaaaaa"))
+ self.assertFalse(utils.is_int_like("...."))
+ self.assertFalse(utils.is_int_like("1g"))
+ self.assertFalse(
+ utils.is_int_like("0cc3346e-9fef-4445-abe6-5d2b2690ec64"))
+ self.assertFalse(utils.is_int_like("a1"))
diff --git a/nova/utils.py b/nova/utils.py
index 115791b64..75cba0a7c 100644
--- a/nova/utils.py
+++ b/nova/utils.py
@@ -859,6 +859,14 @@ def bool_from_str(val):
val.lower() == 'y'
+def is_int_like(val):
+ """Check if a value looks like an int."""
+ try:
+ return str(int(val)) == str(val)
+ except Exception:
+ return False
+
+
def is_valid_boolstr(val):
"""Check if the provided string is a valid bool string or not."""
val = str(val).lower()