diff options
author | Gordon Chung <chungg@ca.ibm.com> | 2013-08-15 10:56:23 -0400 |
---|---|---|
committer | Gordon Chung <chungg@ca.ibm.com> | 2013-08-15 12:10:07 -0400 |
commit | 205170d5871ee780b57c24307bdc98bb12240ac8 (patch) | |
tree | 0833a5021da46cec7cc9126351c7d9e908066e82 | |
parent | 378f5759b08bc30aaef0ab2c41393dae41ac1fbc (diff) | |
download | pycadf-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
-rw-r--r-- | pycadf/audit/api.py | 29 | ||||
-rw-r--r-- | pycadf/tests/audit/test_api.py | 29 |
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') |