Skip to content

Commit

Permalink
heat engine : implement metadata_update per-resource
Browse files Browse the repository at this point in the history
Abstract updates to resource metadata so they are implemented per-resource,
with a generic implementation which is a no-op, since currently the only
resource which needs metadata update via the RPC API is WaitConditionHandle.
This allows resource-specific metadata validation and update logic to be more
easily added.

ref bug 1097813

Change-Id: I094e74b6cd8cb2436f05beed9629fc3c3a34e622
Signed-off-by: Steven Hardy <shardy@redhat.com>
  • Loading branch information
Steven Hardy committed Jan 14, 2013
1 parent 41a1c8d commit 25f20dc
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 6 deletions.
7 changes: 7 additions & 0 deletions heat/engine/resource.py
Expand Up @@ -429,6 +429,13 @@ def handle_update(self):
raise NotImplementedError("Update not implemented for Resource %s"
% type(self))

def metadata_update(self, metadata):
'''
No-op for resources which don't explicitly override this method
'''
logger.warning("Resource %s does not implement metadata update" %
self.name)


class GenericResource(Resource):
properties_schema = {}
Expand Down
6 changes: 6 additions & 0 deletions heat/engine/resources/wait_condition.py
Expand Up @@ -113,6 +113,12 @@ def FnGetRefId(self):
else:
return unicode(self.name)

def metadata_update(self, metadata):
'''
Update the resource metadata
'''
self.metadata = metadata


WAIT_STATUSES = (
WAITING,
Expand Down
2 changes: 1 addition & 1 deletion heat/engine/service.py
Expand Up @@ -439,7 +439,7 @@ def metadata_update(self, context, stack_identity,
raise AttributeError("Resource not found %s" % resource_name)

resource = stack[resource_name]
resource.metadata = metadata
resource.metadata_update(metadata)

return resource.metadata

Expand Down
5 changes: 4 additions & 1 deletion heat/tests/test_engine_service.py
Expand Up @@ -660,10 +660,13 @@ def test_stack_resources_list_nonexist_stack(self):

def test_metadata(self):
test_metadata = {'foo': 'bar', 'baz': 'quux', 'blarg': 'wibble'}
pre_update_meta = self.stack['WebServer'].metadata
result = self.man.metadata_update(self.ctx,
dict(self.stack_identity),
'WebServer', test_metadata)
self.assertEqual(result, test_metadata)
# metadata_update is a no-op for all resources except
# WaitConditionHandle so we don't expect this to have changed
self.assertEqual(result, pre_update_meta)

def test_metadata_err_stack(self):
test_metadata = {'foo': 'bar', 'baz': 'quux', 'blarg': 'wibble'}
Expand Down
25 changes: 21 additions & 4 deletions heat/tests/test_waitcondition.py
Expand Up @@ -178,10 +178,6 @@ def create_stack(self, stack_name='test_stack2', params={}):
uuid.uuid4().AndReturn('STACKABCD1234')
self.m.ReplayAll()
stack.store()
return stack

def test_handle(self):
stack = self.create_stack()

# Stub waitcondition status so all goes CREATE_COMPLETE
self.m.StubOutWithMock(wc.WaitCondition, '_get_status_reason')
Expand All @@ -199,6 +195,11 @@ def test_handle(self):
self.m.StubOutWithMock(wc.WaitConditionHandle, 'identifier')
wc.WaitConditionHandle.identifier().MultipleTimes().AndReturn(id)

return stack

def test_handle(self):
stack = self.create_stack()

# Stub time to a fixed value so we can get an expected signature
t = time.gmtime(1354196977)
self.m.StubOutWithMock(time, 'gmtime')
Expand Down Expand Up @@ -229,3 +230,19 @@ def test_handle(self):
stack.delete()

self.m.VerifyAll()

def test_metadata_update(self):
stack = self.create_stack()
self.m.ReplayAll()
stack.create()

resource = stack.resources['WaitHandle']
self.assertEqual(resource.state, 'CREATE_COMPLETE')

test_metadata = {'foo': 'bar', 'baz': 'quux', 'blarg': 'wibble'}
resource.metadata_update(test_metadata)
self.assertEqual(resource.metadata, test_metadata)

stack.delete()

self.m.VerifyAll()

0 comments on commit 25f20dc

Please sign in to comment.