]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
heat engine : Add validation of stack names
authorSteven Hardy <shardy@redhat.com>
Tue, 12 Mar 2013 09:50:33 +0000 (09:50 +0000)
committerSteven Hardy <shardy@redhat.com>
Tue, 12 Mar 2013 14:25:30 +0000 (14:25 +0000)
Add regex validation of stack names, aligns us with stack names
allowed by AWS, with the addition of "." and "_" characters

fixes bug 1103447

Change-Id: I8fab0d3ad03379dfc2a18dc016e66ca8fee6cc86

heat/engine/parser.py
heat/tests/test_parser.py

index 16dbec51bdaaa8c9fac7f23fb3d59e00b2935da8..0f383af63910663506ad5f4fa8a4b3adcd9cf414 100644 (file)
@@ -15,6 +15,7 @@
 
 import eventlet
 import functools
+import re
 
 from heat.common import exception
 from heat.engine import dependencies
@@ -68,8 +69,10 @@ class Stack(object):
         stack is already in the database.
         '''
 
-        if '/' in stack_name:
-            raise ValueError(_('Stack name may not contain "/"'))
+        if re.match("[a-zA-Z][a-zA-Z0-9_.-]*$", stack_name) is None:
+            raise ValueError(_("Invalid stack name %s" % stack_name
+                               + ", must contain only alphanumeric or "
+                               + "\"_-.\" characters, must start with alpha"))
 
         self.id = stack_id
         self.context = context
index 1f2b90919b16f50460f71cfda96cb11973bbbfdd..8a349edd1bafbc7067550e23e809e1dc0552b172 100644 (file)
@@ -1082,3 +1082,45 @@ class StackTest(unittest.TestCase):
         self.assertEqual(self.stack['AResource'].properties['Foo'], 'abc')
 
         self.m.VerifyAll()
+
+    def test_stack_name_valid(self):
+        stack = parser.Stack(None, 's', parser.Template({}))
+        stack = parser.Stack(None, 'stack123', parser.Template({}))
+        stack = parser.Stack(None, 'test.stack', parser.Template({}))
+        stack = parser.Stack(None, 'test_stack', parser.Template({}))
+        stack = parser.Stack(None, 'TEST', parser.Template({}))
+        stack = parser.Stack(None, 'test-stack', parser.Template({}))
+
+    def test_stack_name_invalid(self):
+        self.assertRaises(ValueError, parser.Stack, None, '_foo',
+                          parser.Template({}))
+        self.assertRaises(ValueError, parser.Stack, None, '1bad',
+                          parser.Template({}))
+        self.assertRaises(ValueError, parser.Stack, None, '.kcats',
+                          parser.Template({}))
+        self.assertRaises(ValueError, parser.Stack, None, 'test stack',
+                          parser.Template({}))
+        self.assertRaises(ValueError, parser.Stack, None, ' teststack',
+                          parser.Template({}))
+        self.assertRaises(ValueError, parser.Stack, None, '^-^',
+                          parser.Template({}))
+        self.assertRaises(ValueError, parser.Stack, None, '\"stack\"',
+                          parser.Template({}))
+        self.assertRaises(ValueError, parser.Stack, None, '1234',
+                          parser.Template({}))
+        self.assertRaises(ValueError, parser.Stack, None, 'cat|dog',
+                          parser.Template({}))
+        self.assertRaises(ValueError, parser.Stack, None, '$(foo)',
+                          parser.Template({}))
+        self.assertRaises(ValueError, parser.Stack, None, 'test/stack',
+                          parser.Template({}))
+        self.assertRaises(ValueError, parser.Stack, None, 'test\stack',
+                          parser.Template({}))
+        self.assertRaises(ValueError, parser.Stack, None, 'test::stack',
+                          parser.Template({}))
+        self.assertRaises(ValueError, parser.Stack, None, 'test;stack',
+                          parser.Template({}))
+        self.assertRaises(ValueError, parser.Stack, None, 'test~stack',
+                          parser.Template({}))
+        self.assertRaises(ValueError, parser.Stack, None, '#test',
+                          parser.Template({}))