diff options
author | Gordon Chung <chungg@ca.ibm.com> | 2013-10-16 13:50:06 -0400 |
---|---|---|
committer | Gordon Chung <chungg@ca.ibm.com> | 2013-10-17 14:17:21 -0400 |
commit | d280b091320ab27a7de1325f1dc895016bb1c7a1 (patch) | |
tree | 28d3700a5c476af8f13c65b2bb17a0da503b78aa | |
parent | 1f2ec374ea27a6ce4db4009b0a36097286908cef (diff) | |
download | pycadf-d280b091320ab27a7de1325f1dc895016bb1c7a1.tar.gz |
observer and reporter should be valid Resource
- fix observer and reporter attributes to be valid Resource type
- add check that Resource id shortform for initiator and target do
not reference themselves
Fixes: Bug # 1240067
Change-Id: Iab5b6c129d512039073cc8c2ab7b75ac7c819624
-rw-r--r-- | pycadf/audit/api.py | 4 | ||||
-rw-r--r-- | pycadf/event.py | 13 | ||||
-rw-r--r-- | pycadf/reporterstep.py | 4 | ||||
-rw-r--r-- | pycadf/resource.py | 8 | ||||
-rw-r--r-- | pycadf/tests/audit/test_api.py | 10 | ||||
-rw-r--r-- | pycadf/tests/test_cadf_spec.py | 28 |
6 files changed, 44 insertions, 23 deletions
diff --git a/pycadf/audit/api.py b/pycadf/audit/api.py index c947d42..a77fabb 100644 --- a/pycadf/audit/api.py +++ b/pycadf/audit/api.py @@ -232,7 +232,7 @@ class OpenStackAuditApi(object): action=action, initiator=initiator, target=target, - observer='target') + observer=resource.Resource(id='target')) event.add_tag(tag.generate_name_value_tag('correlation_id', correlation_id)) return event @@ -263,7 +263,7 @@ class OpenStackAuditApi(object): req.cadf_model.add_reporterstep( reporterstep.Reporterstep( role=cadftype.REPORTER_ROLE_MODIFIER, - reporter='target', + reporter=resource.Resource(id='target'), reporterTime=timestamp.get_utc_now())) else: self.append_audit_event(req) diff --git a/pycadf/event.py b/pycadf/event.py index ff39338..e9a91e4 100644 --- a/pycadf/event.py +++ b/pycadf/event.py @@ -77,15 +77,16 @@ class Event(cadftype.CADFAbstractType): lambda x: timestamp.is_valid(x)) initiator = cadftype.ValidatorDescriptor( EVENT_KEYNAME_INITIATOR, - (lambda x: isinstance(x, resource.Resource) and - x.is_valid())) + (lambda x: isinstance(x, resource.Resource) and x.is_valid() + and x.id != 'initiator')) initiatorId = cadftype.ValidatorDescriptor( EVENT_KEYNAME_INITIATORID, lambda x: identifier.is_valid(x)) action = cadftype.ValidatorDescriptor( EVENT_KEYNAME_ACTION, lambda x: cadftaxonomy.is_valid_action(x)) target = cadftype.ValidatorDescriptor( - EVENT_KEYNAME_TARGET, (lambda x: isinstance(x, resource.Resource) and - x.is_valid())) + EVENT_KEYNAME_TARGET, + (lambda x: isinstance(x, resource.Resource) and x.is_valid() + and x.id != 'target')) targetId = cadftype.ValidatorDescriptor( EVENT_KEYNAME_TARGETID, lambda x: identifier.is_valid(x)) outcome = cadftype.ValidatorDescriptor( @@ -98,9 +99,7 @@ class Event(cadftype.CADFAbstractType): basestring)) observer = cadftype.ValidatorDescriptor( EVENT_KEYNAME_OBSERVER, - (lambda x: isinstance(x, resource.Resource) or - (isinstance(x, basestring) and - (x == 'initiator' or x == 'target')))) + (lambda x: isinstance(x, resource.Resource) and x.is_valid())) def __init__(self, eventType=cadftype.EVENTTYPE_ACTIVITY, id=None, eventTime=None, diff --git a/pycadf/reporterstep.py b/pycadf/reporterstep.py index 1f620b8..94c7d75 100644 --- a/pycadf/reporterstep.py +++ b/pycadf/reporterstep.py @@ -42,9 +42,7 @@ class Reporterstep(cadftype.CADFAbstractType): lambda x: cadftype.is_valid_reporter_role(x)) reporter = cadftype.ValidatorDescriptor( REPORTERSTEP_KEYNAME_REPORTER, - (lambda x: isinstance(x, resource.Resource) or - (isinstance(x, basestring) and - (x == 'initiator' or x == 'target')))) + (lambda x: isinstance(x, resource.Resource) and x.is_valid())) reporterId = cadftype.ValidatorDescriptor( REPORTERSTEP_KEYNAME_REPORTERID, lambda x: identifier.is_valid(x)) reporterTime = cadftype.ValidatorDescriptor( diff --git a/pycadf/resource.py b/pycadf/resource.py index 879899e..2566bb0 100644 --- a/pycadf/resource.py +++ b/pycadf/resource.py @@ -151,8 +151,8 @@ class Resource(cadftype.CADFAbstractType): # self validate this cadf:Resource type against schema def is_valid(self): - return ( - hasattr(self, RESOURCE_KEYNAME_TYPEURI) and - hasattr(self, RESOURCE_KEYNAME_ID) - ) + return (hasattr(self, RESOURCE_KEYNAME_ID) and + (getattr(self, RESOURCE_KEYNAME_ID) == "target" or + getattr(self, RESOURCE_KEYNAME_ID) == "initiator" or + hasattr(self, RESOURCE_KEYNAME_TYPEURI))) # TODO(mrutkows): validate the Resource's attribute types diff --git a/pycadf/tests/audit/test_api.py b/pycadf/tests/audit/test_api.py index 7e07b4d..bac6f4d 100644 --- a/pycadf/tests/audit/test_api.py +++ b/pycadf/tests/audit/test_api.py @@ -87,7 +87,7 @@ class TestAuditApi(base.TestCase): 'Confirmed') self.assertNotIn('reason', payload) self.assertNotIn('reporterchain', payload) - self.assertEqual(payload['observer'], 'target') + self.assertEqual(payload['observer']['id'], 'target') def test_get_read(self): req = self.api_request('GET', @@ -184,7 +184,8 @@ class TestAuditApi(base.TestCase): self.assertEqual(payload2['reason']['reasonCode'], '200') self.assertEqual(len(payload2['reporterchain']), 1) self.assertEqual(payload2['reporterchain'][0]['role'], 'modifier') - self.assertEqual(payload2['reporterchain'][0]['reporter'], 'target') + self.assertEqual(payload2['reporterchain'][0]['reporter']['id'], + 'target') def test_no_response(self): req = self.api_request('GET', 'http://host:8774/v2/public/servers') @@ -197,7 +198,8 @@ class TestAuditApi(base.TestCase): self.assertNotIn('reason', payload2) self.assertEqual(len(payload2['reporterchain']), 1) self.assertEqual(payload2['reporterchain'][0]['role'], 'modifier') - self.assertEqual(payload2['reporterchain'][0]['reporter'], 'target') + self.assertEqual(payload2['reporterchain'][0]['reporter']['id'], + 'target') def test_missing_req(self): self.ENV_HEADERS['REQUEST_METHOD'] = 'GET' @@ -211,7 +213,7 @@ class TestAuditApi(base.TestCase): self.assertEqual(payload['outcome'], 'success') self.assertEqual(payload['reason']['reasonType'], 'HTTP') self.assertEqual(payload['reason']['reasonCode'], '200') - self.assertEqual(payload['observer'], 'target') + self.assertEqual(payload['observer']['id'], 'target') self.assertNotIn('reporterchain', payload) diff --git a/pycadf/tests/test_cadf_spec.py b/pycadf/tests/test_cadf_spec.py index 480ec38..23bee22 100644 --- a/pycadf/tests/test_cadf_spec.py +++ b/pycadf/tests/test_cadf_spec.py @@ -150,7 +150,7 @@ class TestCADFSpec(testtools.TestCase): action='read', target=resource.Resource(typeURI='storage'), targetId=identifier.generate_uuid(), - observer='target', + observer=resource.Resource(id='target'), outcome='success', reason=reason.Reason(reasonType='HTTP', reasonCode='200'), @@ -178,7 +178,7 @@ class TestCADFSpec(testtools.TestCase): action='read', target=resource.Resource(typeURI='storage'), targetId=identifier.generate_uuid(), - observer='target', + observer=resource.Resource(id='target'), outcome='success') time.sleep(1) ev2 = event.Event(eventType='activity', @@ -187,7 +187,29 @@ class TestCADFSpec(testtools.TestCase): action='read', target=resource.Resource(typeURI='storage'), targetId=identifier.generate_uuid(), - observer='target', + observer=resource.Resource(id='target'), outcome='success') self.assertNotEqual(ev.id, ev2.id) self.assertNotEqual(ev.eventTime, ev2.eventTime) + + def test_event_resource_shortform(self): + self.assertRaises(ValueError, + lambda: event.Event( + eventType='activity', + initiator=resource.Resource(typeURI='storage'), + initiatorId=identifier.generate_uuid(), + action='read', + target=resource.Resource(id='target'), + targetId=identifier.generate_uuid(), + observer=resource.Resource(id='target'), + outcome='success')) + self.assertRaises(ValueError, + lambda: event.Event( + eventType='activity', + initiator=resource.Resource(id='initiator'), + initiatorId=identifier.generate_uuid(), + action='read', + target=resource.Resource(typeURI='storage'), + targetId=identifier.generate_uuid(), + observer=resource.Resource(id='target'), + outcome='success')) |