summaryrefslogtreecommitdiff
path: root/pycadf
diff options
context:
space:
mode:
authorGordon Chung <chungg@ca.ibm.com>2013-10-16 13:50:06 -0400
committerGordon Chung <chungg@ca.ibm.com>2013-10-17 14:17:21 -0400
commitd280b091320ab27a7de1325f1dc895016bb1c7a1 (patch)
tree28d3700a5c476af8f13c65b2bb17a0da503b78aa /pycadf
parent1f2ec374ea27a6ce4db4009b0a36097286908cef (diff)
downloadpycadf-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
Diffstat (limited to 'pycadf')
-rw-r--r--pycadf/audit/api.py4
-rw-r--r--pycadf/event.py13
-rw-r--r--pycadf/reporterstep.py4
-rw-r--r--pycadf/resource.py8
-rw-r--r--pycadf/tests/audit/test_api.py10
-rw-r--r--pycadf/tests/test_cadf_spec.py28
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'))