From 2075f94b56660c97ad6e5c0829687f9d2d1803f1 Mon Sep 17 00:00:00 2001 From: Steven Hardy Date: Tue, 12 Mar 2013 09:50:33 +0000 Subject: [PATCH] heat engine : Add validation of stack names 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 | 7 +++++-- heat/tests/test_parser.py | 42 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/heat/engine/parser.py b/heat/engine/parser.py index 16dbec51..0f383af6 100644 --- a/heat/engine/parser.py +++ b/heat/engine/parser.py @@ -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 diff --git a/heat/tests/test_parser.py b/heat/tests/test_parser.py index 1f2b9091..8a349edd 100644 --- a/heat/tests/test_parser.py +++ b/heat/tests/test_parser.py @@ -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({})) -- 2.45.2