Skip to content

Commit

Permalink
heat engine : Add validation of stack names
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Steven Hardy committed Mar 12, 2013
1 parent 16cd203 commit 2075f94
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 2 deletions.
7 changes: 5 additions & 2 deletions heat/engine/parser.py
Expand Up @@ -15,6 +15,7 @@

import eventlet
import functools
import re

from heat.common import exception
from heat.engine import dependencies
Expand Down Expand Up @@ -68,8 +69,10 @@ def __init__(self, context, stack_name, tmpl, parameters=None,
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
Expand Down
42 changes: 42 additions & 0 deletions heat/tests/test_parser.py
Expand Up @@ -1082,3 +1082,45 @@ def test_update_by_reference_and_rollback_2(self):
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({}))

0 comments on commit 2075f94

Please sign in to comment.