Skip to content

Commit 2bbf0b8

Browse files
authored
feature(v3) add audit event manager (#289)
See #280
1 parent 9a573a5 commit 2bbf0b8

File tree

5 files changed

+132
-0
lines changed

5 files changed

+132
-0
lines changed

cloudfoundry_client/client.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
from cloudfoundry_client.v2.spaces import SpaceManager as SpaceManagerV2
2929

3030
from cloudfoundry_client.v3.apps import AppManager
31+
from cloudfoundry_client.v3.audit_events import AuditEventManager
3132
from cloudfoundry_client.v3.buildpacks import BuildpackManager
3233
from cloudfoundry_client.v3.domains import DomainManager
3334
from cloudfoundry_client.v3.droplets import DropletManager
@@ -119,6 +120,7 @@ class V3(object):
119120
def __init__(self, cloud_controller_v3_url: str, credential_manager: "CloudFoundryClient"):
120121
target_endpoint = cloud_controller_v3_url.removesuffix("/v3")
121122
self.apps = AppManager(target_endpoint, credential_manager)
123+
self.audit_events = AuditEventManager(target_endpoint, credential_manager)
122124
self.buildpacks = BuildpackManager(target_endpoint, credential_manager)
123125
self.domains = DomainManager(target_endpoint, credential_manager)
124126
self.droplets = DropletManager(target_endpoint, credential_manager)
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from typing import TYPE_CHECKING
2+
3+
from cloudfoundry_client.v3.entities import EntityManager, Entity
4+
5+
if TYPE_CHECKING:
6+
from cloudfoundry_client.client import CloudFoundryClient
7+
8+
9+
class AuditEventManager(EntityManager[Entity]):
10+
def __init__(self, target_endpoint: str, client: "CloudFoundryClient"):
11+
super().__init__(target_endpoint, client, "/v3/audit_events")
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
{
2+
"pagination": {
3+
"total_results": 1,
4+
"total_pages": 1,
5+
"first": {
6+
"href": "https://api.example.org/v3/audit_events?page=1&per_page=2"
7+
},
8+
"last": {
9+
"href": "https://api.example.org/v3/audit_events?page=1&per_page=2"
10+
},
11+
"next": null,
12+
"previous": null
13+
},
14+
"resources": [
15+
{
16+
"guid": "a595fe2f-01ff-4965-a50c-290258ab8582",
17+
"created_at": "2016-06-08T16:41:23Z",
18+
"updated_at": "2016-06-08T16:41:26Z",
19+
"type": "audit.app.update",
20+
"actor": {
21+
"guid": "d144abe3-3d7b-40d4-b63f-2584798d3ee5",
22+
"type": "user",
23+
"name": "admin"
24+
},
25+
"target": {
26+
"guid": "2e3151ba-9a63-4345-9c5b-6d8c238f4e55",
27+
"type": "app",
28+
"name": "my-app"
29+
},
30+
"data": {
31+
"request": {
32+
"recursive": true
33+
}
34+
},
35+
"space": {
36+
"guid": "cb97dd25-d4f7-4185-9e6f-ad6e585c207c"
37+
},
38+
"organization": {
39+
"guid": "d9be96f5-ea8f-4549-923f-bec882e32e3c"
40+
},
41+
"links": {
42+
"self": {
43+
"href": "https://api.example.org//v3/audit_events/a595fe2f-01ff-4965-a50c-290258ab8582"
44+
}
45+
}
46+
}
47+
]
48+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
{
2+
"guid": "a595fe2f-01ff-4965-a50c-290258ab8582",
3+
"created_at": "2016-06-08T16:41:23Z",
4+
"updated_at": "2016-06-08T16:41:26Z",
5+
"type": "audit.app.update",
6+
"actor": {
7+
"guid": "d144abe3-3d7b-40d4-b63f-2584798d3ee5",
8+
"type": "user",
9+
"name": "admin"
10+
},
11+
"target": {
12+
"guid": "2e3151ba-9a63-4345-9c5b-6d8c238f4e55",
13+
"type": "app",
14+
"name": "my-app"
15+
},
16+
"data": {
17+
"request": {
18+
"recursive": true
19+
}
20+
},
21+
"space": {
22+
"guid": "cb97dd25-d4f7-4185-9e6f-ad6e585c207c"
23+
},
24+
"organization": {
25+
"guid": "d9be96f5-ea8f-4549-923f-bec882e32e3c"
26+
},
27+
"links": {
28+
"self": {
29+
"href": "https://api.example.org/v3/audit_events/a595fe2f-01ff-4965-a50c-290258ab8582"
30+
}
31+
}
32+
}

tests/v3/test_audit_events.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import unittest
2+
from http import HTTPStatus
3+
4+
from abstract_test_case import AbstractTestCase
5+
from cloudfoundry_client.v3.entities import Entity
6+
7+
8+
class TestAuditEvents(unittest.TestCase, AbstractTestCase):
9+
@classmethod
10+
def setUpClass(cls):
11+
cls.mock_client_class()
12+
13+
def setUp(self):
14+
self.build_client()
15+
16+
def test_list(self):
17+
self.client.get.return_value = self.mock_response(
18+
"/v3/audit_events",
19+
HTTPStatus.OK,
20+
None,
21+
"v3", "audit_events", "GET_response.json"
22+
)
23+
all_audit_events = [audit_event for audit_event in self.client.v3.audit_events.list()]
24+
self.client.get.assert_called_with(self.client.get.return_value.url)
25+
self.assertEqual(1, len(all_audit_events))
26+
self.assertEqual(all_audit_events[0]["type"], "audit.app.update")
27+
self.assertIsInstance(all_audit_events[0], Entity)
28+
29+
def test_get(self):
30+
self.client.get.return_value = self.mock_response(
31+
"/v3/audit_events/audit-event-id",
32+
HTTPStatus.OK,
33+
None,
34+
"v3", "audit_events", "GET_{id}_response.json"
35+
)
36+
result = self.client.v3.audit_events.get("audit-event-id")
37+
self.client.get.assert_called_with(self.client.get.return_value.url)
38+
self.assertIsNotNone(result)
39+
self.assertIsInstance(result, Entity)

0 commit comments

Comments
 (0)