summaryrefslogtreecommitdiff
path: root/pycadf
diff options
context:
space:
mode:
authorGordon Chung <chungg@ca.ibm.com>2013-08-15 10:56:23 -0400
committerGordon Chung <chungg@ca.ibm.com>2013-08-15 12:10:07 -0400
commit205170d5871ee780b57c24307bdc98bb12240ac8 (patch)
tree0833a5021da46cec7cc9126351c7d9e908066e82 /pycadf
parent378f5759b08bc30aaef0ab2c41393dae41ac1fbc (diff)
downloadpycadf-205170d5871ee780b57c24307bdc98bb12240ac8.tar.gz
add support for no response and failed request audit0.1.3
when no response is given, set outcome to unknown when request is not audited (req missing cadf_model), do audit on response add docstring to explain functions Change-Id: I622ea05aae477b9897e0968d52faf60dbbc4f819
Diffstat (limited to 'pycadf')
-rw-r--r--pycadf/audit/api.py29
-rw-r--r--pycadf/tests/audit/test_api.py29
2 files changed, 50 insertions, 8 deletions
diff --git a/pycadf/audit/api.py b/pycadf/audit/api.py
index e898a78..85851e5 100644
--- a/pycadf/audit/api.py
+++ b/pycadf/audit/api.py
@@ -201,6 +201,10 @@ class OpenStackAuditApi(object):
return event
def append_audit_event(self, req):
+ """Append a CADF event to req.environ['cadf_event']
+ Also, stores model in request for future process and includes a
+ CADF correlation id.
+ """
correlation_id = identifier.generate_uuid()
req.environ['CADF_EVENT_CORRELATION_ID'] = correlation_id
event = self.create_event(req, correlation_id)
@@ -212,18 +216,27 @@ class OpenStackAuditApi(object):
req.environ['cadf_event'] = event.as_dict()
def mod_audit_event(self, req, response):
- if response.status_int >= 200 and response.status_int < 400:
- result = taxonomy.OUTCOME_SUCCESS
+ """Modifies CADF event in request based on response.
+ If no event exists, a new event is created.
+ """
+ if response:
+ if response.status_int >= 200 and response.status_int < 400:
+ result = taxonomy.OUTCOME_SUCCESS
+ else:
+ result = taxonomy.OUTCOME_FAILURE
else:
- result = taxonomy.OUTCOME_FAILURE
- if req.cadf_model:
- req.cadf_model.outcome = result
- req.cadf_model.reason = \
- reason.Reason(reasonType='HTTP',
- reasonCode=str(response.status_int))
+ result = taxonomy.UNKNOWN
+ if hasattr(req, 'cadf_model'):
req.cadf_model.add_reporterstep(
reporterstep.Reporterstep(
role=cadftype.REPORTER_ROLE_MODIFIER,
reporter='target',
reporterTime=timestamp.get_utc_now()))
+ else:
+ self.append_audit_event(req)
+ req.cadf_model.outcome = result
+ if response:
+ req.cadf_model.reason = \
+ reason.Reason(reasonType='HTTP',
+ reasonCode=str(response.status_int))
req.environ['cadf_event'] = req.cadf_model.as_dict()
diff --git a/pycadf/tests/audit/test_api.py b/pycadf/tests/audit/test_api.py
index 90f2ba4..aa4eda3 100644
--- a/pycadf/tests/audit/test_api.py
+++ b/pycadf/tests/audit/test_api.py
@@ -161,3 +161,32 @@ class TestAuditApi(base.TestCase):
self.assertEqual(len(payload2['reporterchain']), 2)
self.assertEqual(payload2['reporterchain'][1]['role'], 'modifier')
self.assertEqual(payload2['reporterchain'][1]['reporter'], 'target')
+
+ def test_no_response(self):
+ req = self.api_request('GET', 'http://host:8774/v2/public/servers')
+ payload = req.environ['cadf_event']
+ self.audit_api.mod_audit_event(req, None)
+ payload2 = req.environ['cadf_event']
+ self.assertEqual(payload['id'], payload2['id'])
+ self.assertEqual(payload['tags'], payload2['tags'])
+ self.assertEqual(payload2['outcome'], 'unknown')
+ self.assertNotIn('reason', payload2)
+ self.assertEqual(len(payload2['reporterchain']), 2)
+ self.assertEqual(payload2['reporterchain'][1]['role'], 'modifier')
+ self.assertEqual(payload2['reporterchain'][1]['reporter'], 'target')
+
+ def test_missing_req(self):
+ self.ENV_HEADERS['REQUEST_METHOD'] = 'GET'
+ req = webob.Request.blank('http://host:8774/v2/public/servers',
+ environ=self.ENV_HEADERS)
+ self.assertNotIn('cadf_event', req.environ)
+ self.audit_api.mod_audit_event(req, webob.Response())
+ self.assertIn('cadf_event', req.environ)
+ self.assertIn('CADF_EVENT_CORRELATION_ID', req.environ)
+ payload = req.environ['cadf_event']
+ self.assertEqual(payload['outcome'], 'success')
+ self.assertEqual(payload['reason']['reasonType'], 'HTTP')
+ self.assertEqual(payload['reason']['reasonCode'], '200')
+ self.assertEqual(len(payload['reporterchain']), 1)
+ self.assertEqual(payload['reporterchain'][0]['role'], 'observer')
+ self.assertEqual(payload['reporterchain'][0]['reporter'], 'target')