Skip to content

Commit e2ad8a4

Browse files
fix: adapt event_type to be fetched from descriptop (#109)
1 parent b5ac77f commit e2ad8a4

4 files changed

Lines changed: 23 additions & 31 deletions

File tree

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "sap-cloud-sdk"
3-
version = "0.23.2"
3+
version = "0.24.0"
44
description = "SAP Cloud SDK for Python"
55
readme = "README.md"
66
license = "Apache-2.0"

src/sap_cloud_sdk/core/auditlog_ng/client.py

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -152,14 +152,12 @@ def __init__(
152152
def send(
153153
self,
154154
event: Message,
155-
event_type: Optional[str] = None,
156155
format: str = "protobuf-binary",
157156
) -> str:
158157
"""Send an audit log event.
159158
160159
Args:
161160
event: Protobuf message (audit event).
162-
event_type: Event type name (defaults to message type name).
163161
format: Serialization format (``"protobuf-binary"`` or ``"json"``).
164162
165163
Returns:
@@ -193,16 +191,11 @@ def send(
193191

194192
event_id = str(uuid.uuid4())
195193

196-
if event_type is None:
197-
descriptor = getattr(event, "DESCRIPTOR", None)
198-
descriptor_name = getattr(descriptor, "name", None)
199-
if not isinstance(descriptor_name, str) or not descriptor_name:
200-
raise ValueError(
201-
"Could not determine event type from message descriptor"
202-
)
203-
event_type = descriptor_name
204-
205-
event_type = f"sap.als.AuditEvent.{event_type}.v2"
194+
descriptor = getattr(event, "DESCRIPTOR", None)
195+
descriptor_full_name = getattr(descriptor, "full_name", None)
196+
if not isinstance(descriptor_full_name, str) or not descriptor_full_name:
197+
raise ValueError("Could not determine event type from message descriptor")
198+
event_type = descriptor_full_name
206199

207200
if format == "json":
208201
mime_type = "application/json"
@@ -226,9 +219,9 @@ def send(
226219

227220
return event_id
228221

229-
def send_json(self, event: Message, event_type: Optional[str] = None) -> str:
222+
def send_json(self, event: Message) -> str:
230223
"""Send event in JSON format."""
231-
return self.send(event, event_type, format="json")
224+
return self.send(event, format="json")
232225

233226
def flush(self) -> None:
234227
"""Flush pending events (for batch mode)."""

src/sap_cloud_sdk/core/auditlog_ng/user-guide.md

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -125,17 +125,16 @@ event.object_id = "resource-001"
125125
**Binary protobuf:**
126126

127127
```python
128-
event_id = client.send(event, "DataAccess")
128+
event_id = client.send(event)
129129
print(f"Sent event with ID: {event_id}")
130130
```
131131

132132
**JSON format:**
133133

134134
```python
135-
event_id = client.send_json(event, "DataAccess")
135+
event_id = client.send_json(event)
136136
```
137137

138-
> The `event_type` argument is optional. If omitted, the client derives it from the protobuf descriptor name (e.g., `"sap.als.AuditEvent.DataAccess.v2"`).
139138

140139
### Step 5: Close the Client
141140

@@ -177,7 +176,7 @@ class AgentAuditLogger:
177176
event.object_type = "resource"
178177
event.object_id = resource
179178

180-
event_id = self.client.send(event, "DataAccess")
179+
event_id = self.client.send(event)
181180
return event_id
182181

183182
def shutdown(self):
@@ -213,7 +212,7 @@ with create_client(
213212
cert_file="/path/to/cert.pem",
214213
key_file="/path/to/key.pem",
215214
) as client:
216-
event_id = client.send(event, "DataAccess")
215+
event_id = client.send(event)
217216
```
218217

219218
---

tests/core/unit/auditlog_ng/unit/test_client.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,10 @@ def _make_mocked_client(
6767
)
6868

6969

70-
def _make_mock_event(tenant_id="tenant-123", descriptor_name="DataAccess"):
70+
def _make_mock_event(tenant_id="tenant-123", descriptor_full_name="sap.auditlog.auditevent.v2.DataAccess"):
7171
event = MagicMock()
7272
event.common.tenant_id = tenant_id
73-
event.DESCRIPTOR.name = descriptor_name
73+
event.DESCRIPTOR.full_name = descriptor_full_name
7474
event.SerializeToString.return_value = b"\x00\x01\x02"
7575
return event
7676

@@ -160,14 +160,14 @@ def test_send_binary_success(self):
160160
client, mock_logger, _, mock_validate, patcher, _ = _make_mocked_client()
161161
try:
162162
event = _make_mock_event()
163-
event_id = client.send(event, "DataAccess")
163+
event_id = client.send(event)
164164

165165
assert isinstance(event_id, str)
166166
mock_validate.assert_called_once_with(event)
167167
mock_logger.emit.assert_called_once()
168168

169169
_, kwargs = mock_logger.emit.call_args
170-
assert kwargs["event_name"] == "sap.als.AuditEvent.DataAccess.v2"
170+
assert kwargs["event_name"] == "sap.auditlog.auditevent.v2.DataAccess"
171171
assert kwargs["body"] == b"\x00\x01\x02"
172172
assert (
173173
kwargs["attributes"]["sap.auditlogging.mime_type"]
@@ -182,7 +182,7 @@ def test_send_json_success(self):
182182
client, mock_logger, _, mock_validate, patcher, _ = _make_mocked_client()
183183
try:
184184
event = _make_mock_event()
185-
event_id = client.send_json(event, "DataAccess")
185+
event_id = client.send_json(event)
186186

187187
assert isinstance(event_id, str)
188188
mock_logger.emit.assert_called_once()
@@ -198,11 +198,11 @@ def test_send_json_success(self):
198198
def test_send_uses_descriptor_name_when_event_type_missing(self):
199199
client, mock_logger, _, _, patcher, _ = _make_mocked_client()
200200
try:
201-
event = _make_mock_event(descriptor_name="ConfigurationChange")
201+
event = _make_mock_event(descriptor_full_name="sap.auditlog.auditevent.v2.ConfigurationChange")
202202
client.send(event)
203203

204204
_, kwargs = mock_logger.emit.call_args
205-
assert kwargs["event_name"] == "sap.als.AuditEvent.ConfigurationChange.v2"
205+
assert kwargs["event_name"] == "sap.auditlog.auditevent.v2.ConfigurationChange"
206206
finally:
207207
patcher.stop()
208208

@@ -212,13 +212,13 @@ def test_send_on_closed_client_raises(self):
212212
client.close()
213213

214214
with pytest.raises(RuntimeError, match="Client is closed"):
215-
client.send(_make_mock_event(), "DataAccess")
215+
client.send(_make_mock_event())
216216

217217
def test_send_invalid_format_raises(self):
218218
client, _, _, _, patcher, _ = _make_mocked_client()
219219
try:
220220
with pytest.raises(ValueError, match="format must be"):
221-
client.send(_make_mock_event(), "DataAccess", format="xml")
221+
client.send(_make_mock_event(), format="xml")
222222
finally:
223223
patcher.stop()
224224

@@ -230,7 +230,7 @@ def test_send_validation_failure_raises_validation_error(self):
230230
)
231231
try:
232232
with pytest.raises(ValidationError, match="Audit event validation failed"):
233-
client.send(_make_mock_event(), "DataAccess")
233+
client.send(_make_mock_event())
234234

235235
mock_logger.emit.assert_not_called()
236236
finally:
@@ -242,7 +242,7 @@ def test_send_invalid_tenant_id_raises(self):
242242
event = _make_mock_event(tenant_id="bad tenant id")
243243

244244
with pytest.raises(ValueError):
245-
client.send(event, "DataAccess")
245+
client.send(event)
246246

247247
mock_logger.emit.assert_not_called()
248248
finally:

0 commit comments

Comments
 (0)