Skip to content

Commit 2dcc277

Browse files
author
Dilyan Marinov
committed
vdk-structlog: add test for syslog
Signed-off-by: Dilyan Marinov <mdilyan@vmware.com>
1 parent 54652f8 commit 2dcc277

File tree

4 files changed

+60
-24
lines changed

4 files changed

+60
-24
lines changed

projects/vdk-plugins/vdk-structlog/src/vdk/plugin/structlog/structlog_plugin.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -311,11 +311,17 @@ def run_job(self, context: JobContext) -> Optional[ExecutionResult]:
311311
def run_step(self, context: JobContext, step: Step) -> Optional[StepResult]:
312312
root_logger = logging.getLogger()
313313
handler = root_logger.handlers[0]
314-
314+
metadata_filter = None
315315
# make sure the metadata filter executes last
316316
# so that step_name and step_type are filtered if necessary
317-
metadata_filter = [f for f in handler.filters if f.name == "metadata_filter"][0]
318-
handler.removeFilter(metadata_filter)
317+
metadata_filter_result = [
318+
f for f in handler.filters if f.name == "metadata_filter"
319+
]
320+
if metadata_filter_result:
321+
metadata_filter = metadata_filter_result[0]
322+
323+
if metadata_filter:
324+
handler.removeFilter(metadata_filter)
319325

320326
step_name_adder = AttributeAdder("vdk_step_name", step.name)
321327
step_type_adder = AttributeAdder("vdk_step_type", step.type)
@@ -324,7 +330,8 @@ def run_step(self, context: JobContext, step: Step) -> Optional[StepResult]:
324330

325331
# make sure the metadata filter executes last
326332
# so that step_name and step_type are filtered if necessary
327-
handler.addFilter(metadata_filter)
333+
if metadata_filter:
334+
handler.addFilter(metadata_filter)
328335
out: HookCallResult
329336
out = yield
330337
handler.removeFilter(step_name_adder)

projects/vdk-plugins/vdk-structlog/src/vdk/plugin/structlog/syslog_config.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
# Copyright 2021-2024 VMware, Inc.
22
# SPDX-License-Identifier: Apache-2.0
3-
43
import logging.handlers
54

65
from vdk.plugin.structlog.constants import SYSLOG_PROTOCOLS
@@ -36,7 +35,7 @@ def configure_syslog_handler(
3635
syslog_socktype = SYSLOG_PROTOCOLS[syslog_protocol.upper()]
3736
syslog_handler = logging.handlers.SysLogHandler(
3837
address=(syslog_host, syslog_port),
39-
facility=logging.handlers.SysLogHandler.LOG_USER,
38+
facility=logging.handlers.SysLogHandler.LOG_DAEMON,
4039
socktype=syslog_socktype,
4140
)
4241

projects/vdk-plugins/vdk-structlog/tests/test_structlog.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import logging
44
import os
55
import re
6+
import socket
7+
import threading
68
from unittest import mock
79

810
import pytest
@@ -108,6 +110,52 @@ def test_structlog(log_format):
108110
)
109111

110112

113+
def test_structlog_syslog():
114+
with mock.patch.dict(
115+
os.environ,
116+
{
117+
"VDK_STRUCTLOG_METADATA": f"timestamp,level,file_name,line_number,vdk_job_name,{BOUND_TEST_KEY},{EXTRA_TEST_KEY}",
118+
"VDK_STRUCTLOG_FORMAT": "console",
119+
"LOG_LEVEL_MODULE": "test_structlog=WARNING",
120+
"VDK_SYSLOG_HOST": "127.0.0.1",
121+
"VDK_SYSLOG_PORT": "8888",
122+
"VDK_SYSLOG_PROTOCOL": "UDP",
123+
"VDK_SYSLOG_ENABLED": "True",
124+
},
125+
):
126+
syslog_out = []
127+
128+
def start_syslog_server(host, port):
129+
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
130+
server_socket.bind((host, port))
131+
print(f"Syslog server listening on {host}:{port}")
132+
133+
while True:
134+
data, addr = server_socket.recvfrom(1024)
135+
syslog_out.append(f"{data.decode('utf-8')}")
136+
137+
server = threading.Thread(
138+
target=start_syslog_server, args=("127.0.0.1", 8888), daemon=True
139+
)
140+
server.start()
141+
142+
_run_job_and_get_logs()
143+
144+
assert len(syslog_out)
145+
146+
# assert log entries are formatted using the hardcoded formatter
147+
for log in syslog_out:
148+
assert re.search("\\[id:.*\\]", log)
149+
150+
# syslog_out[0] comes from vdk-core for some reason when the whole suite is run
151+
assert re.search("run_python_step", syslog_out[1])
152+
assert re.search("run", syslog_out[2])
153+
assert re.search("run", syslog_out[3])
154+
assert re.search("run", syslog_out[4])
155+
assert re.search("run_python_step", syslog_out[5])
156+
assert re.search("create_and_run_d", syslog_out[6])
157+
158+
111159
@pytest.mark.parametrize("log_format", ["console", "ltsv", "json"])
112160
def test_stock_fields_removal(log_format):
113161
stock_field_reps = STOCK_FIELD_REPRESENTATIONS[log_format]

projects/vdk-plugins/vdk-structlog/tests/test_syslog_config.py

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
# Copyright 2021-2024 VMware, Inc.
22
# SPDX-License-Identifier: Apache-2.0
3-
43
import logging.handlers
54
import socket
65
from unittest.mock import MagicMock
@@ -83,20 +82,3 @@ def test_configure_syslog_handler_invalid_protocol(mock_job_context):
8382
configure_syslog_handler(
8483
True, "localhost", 514, "invalid_protocol", "test_job", "12345"
8584
)
86-
87-
88-
@patch("logging.handlers.SysLogHandler")
89-
def test_syslog_handler_configuration(mock_syslog_handler, mock_job_context):
90-
configure_syslog_handler(
91-
True,
92-
"localhost",
93-
514,
94-
"UDP",
95-
mock_job_context.name,
96-
mock_job_context.core_context.state.get(),
97-
)
98-
mock_syslog_handler.assert_called_with(
99-
address=("localhost", 514),
100-
facility=logging.handlers.SysLogHandler.LOG_USER,
101-
socktype=socket.SOCK_DGRAM,
102-
)

0 commit comments

Comments
 (0)