Skip to content

Commit be97e9c

Browse files
artemrysArtem Rys
authored andcommitted
feat: add get_log_level method
1 parent e946ec4 commit be97e9c

File tree

4 files changed

+107
-1
lines changed

4 files changed

+107
-1
lines changed

solnlib/conf_manager.py

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ def get_conf(self, name: str, refresh: bool = False) -> ConfFile:
456456
try:
457457
conf = self._confs[name]
458458
except KeyError:
459-
raise ConfManagerException("Config file: %s does not exist." % name)
459+
raise ConfManagerException(f"Config file: {name} does not exist.")
460460

461461
return ConfFile(
462462
name,
@@ -498,3 +498,60 @@ def create_conf(self, name: str) -> ConfFile:
498498
self._realm,
499499
**self._context,
500500
)
501+
502+
503+
def get_log_level(
504+
*,
505+
logger: logging.Logger,
506+
session_key: str,
507+
app_name: str,
508+
conf_name: str,
509+
log_level_field: str = "loglevel",
510+
default_log_level: str = "INFO",
511+
) -> str:
512+
"""This function returns the log level for the addon from configuration
513+
file.
514+
515+
Arguments:
516+
logger: Logger.
517+
session_key: Splunk access token.
518+
app_name: Add-on name.
519+
conf_name: Configuration file name where logging stanza is.
520+
log_level_field: Logging level field name under logging stanza.
521+
default_log_level: Default log level to return in case of errors.
522+
523+
Returns:
524+
Log level defined under `logging.log_level_field` field in `conf_name`
525+
file. In case of any error, `default_log_level` will be returned.
526+
527+
Examples:
528+
>>> from solnlib import conf_manager
529+
>>> log_level = conf_manager.get_log_level(
530+
>>> logger,
531+
>>> "session_key",
532+
>>> "ADDON_NAME",
533+
>>> "splunk_ta_addon_settings",
534+
>>> )
535+
"""
536+
try:
537+
cfm = ConfManager(
538+
session_key,
539+
app_name,
540+
realm=f"__REST_CREDENTIAL__#{app_name}#configs/conf-{conf_name}",
541+
)
542+
conf = cfm.get_conf(conf_name)
543+
except ConfManagerException:
544+
logger.error(
545+
f"Failed to fetch configuration file {conf_name}, "
546+
f"taking {default_log_level} as log level."
547+
)
548+
return default_log_level
549+
try:
550+
logging_details = conf.get("logging")
551+
return logging_details.get(log_level_field, default_log_level)
552+
except ConfStanzaNotExistException:
553+
logger.error(
554+
f'"logging" stanza does not exist under {conf_name}, '
555+
f"taking {default_log_level} as log level."
556+
)
557+
return default_log_level
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
[logging]
2+
log_level = DEBUG

tests/integration/test_conf_manager.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import os.path as op
1818
import sys
19+
from unittest import mock
1920

2021
import pytest
2122

@@ -53,3 +54,32 @@ def test_conf_manager():
5354
with pytest.raises(conf_manager.ConfStanzaNotExistException):
5455
conf.delete("test_stanza")
5556
conf.reload()
57+
58+
59+
def test_get_log_level():
60+
session_key = context.get_session_key()
61+
expected_log_level = "DEBUG"
62+
63+
log_level = conf_manager.get_log_level(
64+
logger=mock.MagicMock(),
65+
session_key=session_key,
66+
app_name="solnlib_demo",
67+
conf_name="splunk_ta_addon_settings",
68+
log_level_field="log_level",
69+
)
70+
71+
assert expected_log_level == log_level
72+
73+
74+
def test_get_log_level_incorrect_log_level_field():
75+
session_key = context.get_session_key()
76+
expected_log_level = "INFO"
77+
78+
log_level = conf_manager.get_log_level(
79+
logger=mock.MagicMock(),
80+
session_key=session_key,
81+
app_name="solnlib_demo",
82+
conf_name="splunk_ta_addon_settings",
83+
)
84+
85+
assert expected_log_level == log_level

tests/unit/test_conf_manager.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#
1616

1717
import hashlib
18+
from unittest import mock
1819

1920
import common
2021
import pytest
@@ -204,3 +205,19 @@ def mock_stanza_submit(self, stanza):
204205
with pytest.raises(conf_manager.ConfStanzaNotExistException):
205206
conf.delete("test_stanza")
206207
conf.reload()
208+
209+
210+
@mock.patch.object(conf_manager, "ConfManager")
211+
def test_get_log_level_when_error_getting_conf(mock_conf_manager_class):
212+
mock_conf_manager = mock_conf_manager_class.return_value
213+
mock_conf_manager.get_conf.side_effect = conf_manager.ConfManagerException
214+
expected_log_level = "INFO"
215+
216+
log_level = conf_manager.get_log_level(
217+
logger=mock.MagicMock(),
218+
session_key="session_key",
219+
app_name="app_name",
220+
conf_name="conf_name",
221+
)
222+
223+
assert expected_log_level == log_level

0 commit comments

Comments
 (0)