else:
return unicode(self.name)
+ def _metadata_format_ok(self, metadata):
+ """
+ Check the format of the provided metadata is as expected.
+ metadata must use the following format:
+ {
+ "Status" : "Status (should be SUCCESS or FAILURE)"
+ "UniqueId" : "Some ID, must be unique for Count>1",
+ "Data" : "Arbitrary Data",
+ "Reason" : "Reason String"
+ }
+ """
+ expected_keys = ['Data', 'Reason', 'Status', 'UniqueId']
+ return sorted(metadata.keys()) == expected_keys
+
def metadata_update(self, metadata):
'''
- Update the resource metadata
+ Validate and update the resource metadata
'''
- self.metadata = metadata
+ if self._metadata_format_ok(metadata):
+ self.metadata = metadata
+ else:
+ logger.error("Metadata failed validation for %s" % self.name)
+ raise ValueError("Metadata format invalid")
WAIT_STATUSES = (
resource = stack.resources['WaitHandle']
self.assertEqual(resource.state, 'CREATE_COMPLETE')
- test_metadata = {'foo': 'bar', 'baz': 'quux', 'blarg': 'wibble'}
+ test_metadata = {'Data': 'foo', 'Reason': 'bar',
+ 'Status': 'SUCCESS', 'UniqueId': '123'}
resource.metadata_update(test_metadata)
self.assertEqual(resource.metadata, test_metadata)
stack.delete()
self.m.VerifyAll()
+
+ def test_metadata_update_invalid(self):
+ stack = self.create_stack()
+ self.m.ReplayAll()
+ stack.create()
+
+ resource = stack.resources['WaitHandle']
+ self.assertEqual(resource.state, 'CREATE_COMPLETE')
+
+ # metadata_update should raise a ValueError if the metadata
+ # is missing any of the expected keys
+ err1_metadata = {'Data': 'foo', 'Status': 'SUCCESS', 'UniqueId': '123'}
+ self.assertRaises(ValueError, resource.metadata_update, err1_metadata)
+
+ err1_metadata = {'Data': 'foo', 'Reason': 'bar', 'UniqueId': '1234'}
+ self.assertRaises(ValueError, resource.metadata_update, err1_metadata)
+
+ err1_metadata = {'Data': 'foo', 'Reason': 'bar', 'UniqueId': '1234'}
+ self.assertRaises(ValueError, resource.metadata_update, err1_metadata)
+
+ err1_metadata = {'data': 'foo', 'reason': 'bar',
+ 'status': 'SUCCESS', 'uniqueid': '1234'}
+ self.assertRaises(ValueError, resource.metadata_update, err1_metadata)
+
+ stack.delete()
+
+ self.m.VerifyAll()