Skip to content

Commit

Permalink
Merge "Stop stack updates from exceeding resource limit"
Browse files Browse the repository at this point in the history
  • Loading branch information
Jenkins authored and openstack-gerrit committed Sep 22, 2013
2 parents 9831689 + 89bb14f commit b21ce20
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 0 deletions.
2 changes: 2 additions & 0 deletions heat/engine/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,8 @@ def update_stack(self, cnxt, stack_identity, template, params,
# Now parse the template and any parameters for the updated
# stack definition.
tmpl = parser.Template(template, files=files)
if len(tmpl[tpl.RESOURCES]) > cfg.CONF.max_resources_per_stack:
raise exception.StackResourceLimitExceeded()
stack_name = current_stack.name
common_params = api.extract_args(args)
env = environment.Environment(params)
Expand Down
70 changes: 70 additions & 0 deletions heat/tests/test_engine_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -578,6 +578,76 @@ def test_stack_update(self):
self.assertTrue(result['stack_id'])
self.m.VerifyAll()

def test_stack_update_equals(self):
stack_name = 'test_stack_update_equals_resource_limit'
params = {}
res._register_class('GenericResourceType',
generic_rsrc.GenericResource)
tpl = {'Resources': {
'A': {'Type': 'GenericResourceType'},
'B': {'Type': 'GenericResourceType'},
'C': {'Type': 'GenericResourceType'}}}

template = parser.Template(tpl)

old_stack = parser.Stack(self.ctx, stack_name, template)
sid = old_stack.store()
s = db_api.stack_get(self.ctx, sid)

stack = parser.Stack(self.ctx, stack_name, template)

self.m.StubOutWithMock(parser, 'Stack')
self.m.StubOutWithMock(parser.Stack, 'load')
parser.Stack.load(self.ctx, stack=s).AndReturn(old_stack)

self.m.StubOutWithMock(parser, 'Template')
self.m.StubOutWithMock(environment, 'Environment')

parser.Template(template, files=None).AndReturn(stack.t)
environment.Environment(params).AndReturn(stack.env)
parser.Stack(self.ctx, stack.name,
stack.t, stack.env).AndReturn(stack)

self.m.StubOutWithMock(stack, 'validate')
stack.validate().AndReturn(None)

self.m.StubOutWithMock(threadgroup, 'ThreadGroup')
threadgroup.ThreadGroup().AndReturn(DummyThreadGroup())

self.m.ReplayAll()

cfg.CONF.set_override('max_resources_per_stack', 3)

result = self.man.update_stack(self.ctx, old_stack.identifier(),
template, params, None, {})
self.assertEqual(old_stack.identifier(), result)
self.assertTrue(isinstance(result, dict))
self.assertTrue(result['stack_id'])
self.assertEquals(3, old_stack.root_stack.total_resources())
self.m.VerifyAll()

def test_stack_update_exceeds_resource_limit(self):
stack_name = 'test_stack_update_exceeds_resource_limit'
params = {}
res._register_class('GenericResourceType',
generic_rsrc.GenericResource)
tpl = {'Resources': {
'A': {'Type': 'GenericResourceType'},
'B': {'Type': 'GenericResourceType'},
'C': {'Type': 'GenericResourceType'}}}

template = parser.Template(tpl)

old_stack = parser.Stack(self.ctx, stack_name, template)
sid = old_stack.store()
s = db_api.stack_get(self.ctx, sid)

cfg.CONF.set_override('max_resources_per_stack', 2)

self.assertRaises(exception.StackResourceLimitExceeded,
self.man.update_stack, self.ctx,
old_stack.identifier(), template, params, None, {})

def test_stack_update_verify_err(self):
stack_name = 'service_update_verify_err_test_stack'
params = {'foo': 'bar'}
Expand Down

0 comments on commit b21ce20

Please sign in to comment.