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>
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 = {}
else:
return unicode(self.name)
+ def metadata_update(self, metadata):
+ '''
+ Update the resource metadata
+ '''
+ self.metadata = metadata
+
WAIT_STATUSES = (
WAITING,
raise AttributeError("Resource not found %s" % resource_name)
resource = stack[resource_name]
- resource.metadata = metadata
+ resource.metadata_update(metadata)
return resource.metadata
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'}
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')
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')
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()