From ab71a7e0aa5665e8c34d3d6311ffd3e3d2207608 Mon Sep 17 00:00:00 2001 From: Zane Bitter Date: Thu, 22 Nov 2012 11:06:56 +0100 Subject: [PATCH] Add identifiers for Events Change-Id: I54b2d2bb56129314218f36889f0f525e88c9f146 Signed-off-by: Zane Bitter --- heat/engine/identifier.py | 45 +++++++++++++++++++++++++++++++++++ heat/tests/test_identifier.py | 35 +++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) diff --git a/heat/engine/identifier.py b/heat/engine/identifier.py index 094fbc02..02174101 100644 --- a/heat/engine/identifier.py +++ b/heat/engine/identifier.py @@ -167,3 +167,48 @@ class ResourceIdentifier(HeatIdentifier): ''' return HeatIdentifier(self.tenant, self.stack_name, self.stack_id, '/'.join(self._path_components()[:-2])) + + +class EventIdentifier(HeatIdentifier): + '''An identifier for an event''' + + (RESOURCE_NAME, EVENT_ID) = (ResourceIdentifier.RESOURCE_NAME, 'event_id') + + def __init__(self, tenant, stack_name, stack_id, path, + event_id=None): + ''' + Return a new Event identifier based on the identifier components of + the associated resource and the event ID. + ''' + if event_id is not None: + path = '/'.join([path.rstrip('/'), 'events', event_id]) + super(EventIdentifier, self).__init__(tenant, + stack_name, + stack_id, + path) + + def __getattr__(self, attr): + ''' + Return one of the components of the identity when accessed as an + attribute. + ''' + + if attr == self.RESOURCE_NAME: + return getattr(self.resource(), attr) + if attr == self.EVENT_ID: + return self._path_components()[-1] + + return HeatIdentifier.__getattr__(self, attr) + + def resource(self): + ''' + Return a HeatIdentifier for the owning resource + ''' + return ResourceIdentifier(self.tenant, self.stack_name, self.stack_id, + '/'.join(self._path_components()[:-2])) + + def stack(self): + ''' + Return a HeatIdentifier for the owning stack + ''' + return self.resource().stack() diff --git a/heat/tests/test_identifier.py b/heat/tests/test_identifier.py index 632acbd3..cf78a0ea 100644 --- a/heat/tests/test_identifier.py +++ b/heat/tests/test_identifier.py @@ -267,6 +267,41 @@ class ResourceIdentifierTest(unittest.TestCase): self.assertEqual(ri.resource_name, 'r') +@attr(tag=['unit', 'identifier']) +@attr(speed='fast') +class EventIdentifierTest(unittest.TestCase): + def test_event_init(self): + si = identifier.HeatIdentifier('t', 's', 'i') + pi = identifier.ResourceIdentifier(resource_name='p', **si) + ei = identifier.EventIdentifier(event_id='e', **pi) + self.assertEqual(ei.path, '/resources/p/events/e') + + def test_event_init_from_dict(self): + hi = identifier.HeatIdentifier('t', 's', 'i', '/resources/p/events/42') + ei = identifier.EventIdentifier(**hi) + self.assertEqual(ei, hi) + + def test_event_stack(self): + si = identifier.HeatIdentifier('t', 's', 'i') + pi = identifier.ResourceIdentifier(resource_name='r', **si) + ei = identifier.EventIdentifier(event_id='e', **pi) + self.assertEqual(ei.stack(), si) + + def test_event_resource(self): + si = identifier.HeatIdentifier('t', 's', 'i') + pi = identifier.ResourceIdentifier(resource_name='r', **si) + ei = identifier.EventIdentifier(event_id='e', **pi) + self.assertEqual(ei.resource(), pi) + + def test_resource_name(self): + ei = identifier.EventIdentifier('t', 's', 'i', '/resources/p', 'e') + self.assertEqual(ei.resource_name, 'p') + + def test_event_id(self): + ei = identifier.EventIdentifier('t', 's', 'i', '/resources/p', 'e') + self.assertEqual(ei.event_id, 'e') + + # allows testing of the test directly, shown below if __name__ == '__main__': sys.argv.append(__file__) -- 2.45.2