diff --git a/splunklib/searchcommands/search_command.py b/splunklib/searchcommands/search_command.py index e66f70c3..ba2a4dc0 100644 --- a/splunklib/searchcommands/search_command.py +++ b/splunklib/searchcommands/search_command.py @@ -340,24 +340,29 @@ def service(self): of :code:`None` is returned. """ + if self._service is not None: return self._service metadata = self._metadata if metadata is None: + self.logger.warning("Missing metadata for service creation.") return None try: searchinfo = self._metadata.searchinfo except AttributeError: + self.logger.warning("Missing searchinfo in metadata for service creation.") return None splunkd_uri = searchinfo.splunkd_uri - if splunkd_uri is None: + if splunkd_uri is None or splunkd_uri == "" or splunkd_uri == " ": + self.logger.warning(f"Incorrect value for Splunkd URI: {splunkd_uri!r} in metadata") return None + uri = urlsplit(splunkd_uri, allow_fragments=False) self._service = Service( diff --git a/tests/searchcommands/test_search_command.py b/tests/searchcommands/test_search_command.py index c8fe7d80..849a8888 100755 --- a/tests/searchcommands/test_search_command.py +++ b/tests/searchcommands/test_search_command.py @@ -22,14 +22,17 @@ import codecs import os import re +import logging from io import TextIOWrapper +from unittest.mock import MagicMock, patch import pytest import splunklib from splunklib.searchcommands import Configuration, StreamingCommand from splunklib.searchcommands.decorators import ConfigurationSetting, Option +from splunklib.searchcommands.internals import ObjectView from splunklib.searchcommands.search_command import SearchCommand from splunklib.client import Service from splunklib.utils import ensure_binary @@ -265,6 +268,52 @@ def test_process_scpv2(self): _package_directory = os.path.dirname(os.path.abspath(__file__)) +class TestSearchCommandService(TestCase): + def setUp(self): + TestCase.setUp(self) + self.command = SearchCommand() + console_handler = logging.StreamHandler() + console_handler.setLevel(logging.WARNING) + self.command.logger.addHandler(console_handler) + + def test_service_exists(self): + self.command._service = Service() + self.assertIsNotNone(self.command.service) + + def test_service_not_exists(self): + self.assertIsNone(self.command.service) + + def test_missing_metadata(self): + with self.assertLogs(self.command.logger, level='WARNING') as log: + service = self.command.service + self.assertIsNone(service) + self.assertTrue(any("Missing metadata for service creation." in message for message in log.output)) + + def test_missing_searchinfo(self): + with self.assertLogs(self.command.logger, level='WARNING') as log: + self.command._metadata = ObjectView({}) + self.assertIsNone(self.command.service) + self.assertTrue(any("Missing searchinfo in metadata for service creation." in message for message in log.output)) + + + def test_missing_splunkd_uri(self): + with self.assertLogs(self.command.logger, level='WARNING') as log: + metadata = ObjectView({"searchinfo": ObjectView({"splunkd_uri": ""})}) + self.command._metadata = metadata + self.assertIsNone(self.command.service) + self.assertTrue(any("Incorrect value for Splunkd URI: '' in metadata" in message for message in log.output)) + + + + def test_service_returns_valid_service_object(self): + metadata = ObjectView({"searchinfo":ObjectView({"splunkd_uri":"https://127.0.0.1:8089", + "session_key":"mock_session_key", + "app":"search", + })}) + self.command._metadata = metadata + self.assertIsInstance(self.command.service, Service) + + if __name__ == "__main__": main()