Skip to content

Commit 732fa34

Browse files
Merge branch 'main' into develop
2 parents 5e2269d + 0eee07c commit 732fa34

File tree

8 files changed

+164
-84
lines changed

8 files changed

+164
-84
lines changed

poetry.lock

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
[tool.poetry]
1818
name = "solnlib"
19-
version = "5.1.0-beta.4"
19+
version = "5.1.2"
2020
description = "The Splunk Software Development Kit for Splunk Solutions"
2121
authors = ["Splunk <addonfactory@splunk.com>"]
2222
license = "Apache-2.0"

solnlib/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,4 @@
5656
"utils",
5757
]
5858

59-
__version__ = "5.1.0-beta.4"
59+
__version__ = "5.1.2"

solnlib/modular_input/event_writer.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -229,12 +229,11 @@ def __init__(
229229
else:
230230
self.logger = logging
231231

232-
if not all([scheme, host, port]):
233-
scheme, host, port = get_splunkd_access_info()
234-
235232
if hec_uri and hec_token:
236233
scheme, host, hec_port = utils.extract_http_scheme_host_port(hec_uri)
237234
else:
235+
if not all([scheme, host, port]):
236+
scheme, host, port = get_splunkd_access_info()
238237
hec_port, hec_token = self._get_hec_config(
239238
hec_input_name, session_key, scheme, host, port, **context
240239
)

solnlib/server_info.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,17 @@
2020
import json
2121
from typing import Any, Dict, Optional
2222

23-
from splunk.rest import getWebCertFile, getWebKeyFile
23+
try:
24+
from splunk.rest import getWebCertFile, getWebKeyFile
25+
except (ModuleNotFoundError, ImportError):
26+
27+
def getWebCertFile():
28+
return None
29+
30+
def getWebKeyFile():
31+
return None
32+
33+
2434
from splunklib import binding
2535
from solnlib import splunk_rest_client as rest_client
2636
from solnlib import utils

tests/unit/conftest.py

Lines changed: 0 additions & 6 deletions
This file was deleted.

tests/unit/test_modular_input_event_writer.py

Lines changed: 112 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import sys
1919

2020
import common
21+
import pytest
2122
from splunklib import binding
2223

2324
from solnlib.modular_input import ClassicEventWriter, HECEventWriter
@@ -85,7 +86,54 @@ def flush(self):
8586
assert mock_stdout.write_count == 1
8687

8788

88-
def test_hec_event_writer(monkeypatch):
89+
def create_hec_event_writer__create_from_input(hec=False):
90+
return HECEventWriter.create_from_input(
91+
"HECTestInput",
92+
"https://localhost:8089",
93+
common.SESSION_KEY,
94+
global_settings_schema=hec,
95+
)
96+
97+
98+
def create_hec_event_writer__create_from_token_with_session_key(hec=False):
99+
return HECEventWriter.create_from_token_with_session_key(
100+
"https://localhost:8089",
101+
common.SESSION_KEY,
102+
"https://localhost:8090",
103+
"test_token",
104+
global_settings_schema=hec,
105+
)
106+
107+
108+
def create_hec_event_writer__create_from_token(hec=False):
109+
return HECEventWriter.create_from_token(
110+
"https://localhost:8090", "test_token", global_settings_schema=hec
111+
)
112+
113+
114+
def create_hec_event_writer__create_from_token__external_host(hec=False):
115+
return HECEventWriter.create_from_token(
116+
"https://external:8090", "test_token", global_settings_schema=hec
117+
)
118+
119+
120+
def create_hec_event_writer__constructor(hec=False):
121+
return HECEventWriter(
122+
"HECTestInput", common.SESSION_KEY, global_settings_schema=hec
123+
)
124+
125+
126+
@pytest.mark.parametrize(
127+
"create_hec_event_writer, has_splunk_home",
128+
[
129+
(create_hec_event_writer__constructor, True),
130+
(create_hec_event_writer__create_from_input, True),
131+
(create_hec_event_writer__create_from_token_with_session_key, True),
132+
(create_hec_event_writer__create_from_token, True),
133+
(create_hec_event_writer__create_from_token__external_host, False),
134+
],
135+
)
136+
def test_hec_event_writer(monkeypatch, create_hec_event_writer, has_splunk_home):
89137
def mock_get(self, path_segment, owner=None, app=None, sharing=None, **query):
90138
if path_segment.endswith("/http"):
91139
return common.make_response_record(
@@ -120,42 +168,46 @@ def mock_get_hec_config(
120168
):
121169
return "8088", "87de04d1-0823-11e6-9c94-a45e60e"
122170

123-
common.mock_splunkhome(monkeypatch)
171+
if has_splunk_home:
172+
common.mock_splunkhome(monkeypatch)
173+
else:
174+
# simulate an environment that has no splunk installation
175+
monkeypatch.delenv("SPLUNK_HOME", raising=False)
176+
monkeypatch.delenv("SPLUNK_ETC", raising=False)
124177
monkeypatch.setattr(binding.Context, "get", mock_get)
125178
monkeypatch.setattr(binding.Context, "post", mock_post)
126179
monkeypatch.setattr(HECEventWriter, "_get_hec_config", mock_get_hec_config)
127180

128-
for i in range(4):
129-
ew = create_hec_event_writer(i)
130-
131-
events = []
132-
events.append(
133-
ew.create_event(
134-
data="This is a test data1.",
135-
time=1372274622.493,
136-
index="main",
137-
host="localhost",
138-
source="Splunk",
139-
sourcetype="misc",
140-
stanza="test_scheme://test",
141-
unbroken=True,
142-
done=False,
143-
)
181+
ew = create_hec_event_writer(hec=False)
182+
183+
events = []
184+
events.append(
185+
ew.create_event(
186+
data="This is a test data1.",
187+
time=1372274622.493,
188+
index="main",
189+
host="localhost",
190+
source="Splunk",
191+
sourcetype="misc",
192+
stanza="test_scheme://test",
193+
unbroken=True,
194+
done=False,
144195
)
145-
events.append(
146-
ew.create_event(
147-
data="This is a test data2.",
148-
time=1372274622.493,
149-
index="main",
150-
host="localhost",
151-
source="Splunk",
152-
sourcetype="misc",
153-
stanza="test_scheme://test",
154-
unbroken=True,
155-
done=True,
156-
)
196+
)
197+
events.append(
198+
ew.create_event(
199+
data="This is a test data2.",
200+
time=1372274622.493,
201+
index="main",
202+
host="localhost",
203+
source="Splunk",
204+
sourcetype="misc",
205+
stanza="test_scheme://test",
206+
unbroken=True,
207+
done=True,
157208
)
158-
ew.write_events(events)
209+
)
210+
ew.write_events(events)
159211

160212
# length of this list will indicate how many times post was called
161213
times_post_called = []
@@ -170,7 +222,7 @@ def mock_post_2(
170222
# test that there are 2 event batches created for write_event and post is called 2 times
171223
# max batch size is 1,000,000. If the max size is exceeded then a new batch is created.
172224
assert len(times_post_called) == 0
173-
ew = create_hec_event_writer(1)
225+
174226
events = []
175227

176228
# each event length will be ~500 characters, 3000 events length will equal ~1,500,000 characters
@@ -207,35 +259,31 @@ def mock_post_2(
207259
# test that post is called 2 times
208260
assert len(times_post_called) == 2
209261

210-
for i in range(4):
211-
ev = create_hec_event_writer(i)
212-
assert ev._rest_client.scheme == "https"
213-
for i in range(4):
214-
ev = create_hec_event_writer(i, hec=True)
215-
assert ev._rest_client.scheme == "http"
216-
217-
218-
def create_hec_event_writer(i, hec=False):
219-
if i == 1:
220-
return HECEventWriter.create_from_input(
221-
"HECTestInput",
222-
"https://localhost:8089",
223-
common.SESSION_KEY,
224-
global_settings_schema=hec,
225-
)
226-
elif i == 2:
227-
return HECEventWriter.create_from_token_with_session_key(
228-
"https://localhost:8089",
229-
common.SESSION_KEY,
230-
"https://localhost:8090",
231-
"test_token",
232-
global_settings_schema=hec,
233-
)
234-
elif i == 3:
235-
return HECEventWriter.create_from_token(
236-
"https://localhost:8090", "test_token", global_settings_schema=hec
237-
)
238-
else:
239-
return HECEventWriter(
240-
"HECTestInput", common.SESSION_KEY, global_settings_schema=hec
241-
)
262+
263+
@pytest.mark.parametrize(
264+
"create_hec_event_writer, hec, expected_scheme",
265+
[
266+
(create_hec_event_writer__constructor, True, "http"),
267+
(create_hec_event_writer__constructor, False, "https"),
268+
(create_hec_event_writer__create_from_input, True, "http"),
269+
(create_hec_event_writer__create_from_input, False, "https"),
270+
(create_hec_event_writer__create_from_token_with_session_key, True, "http"),
271+
(create_hec_event_writer__create_from_token_with_session_key, False, "https"),
272+
(create_hec_event_writer__create_from_token, True, "http"),
273+
(create_hec_event_writer__create_from_token, False, "https"),
274+
],
275+
)
276+
def test_hec_event_writer_gets_scheme_from_global_settings_if_requested(
277+
monkeypatch, create_hec_event_writer, hec, expected_scheme
278+
):
279+
common.mock_splunkhome(monkeypatch)
280+
281+
def mock_get_hec_config(
282+
self, hec_input_name, session_key, scheme, host, port, **context
283+
):
284+
return "8088", "87de04d1-0823-11e6-9c94-a45e60e"
285+
286+
monkeypatch.setattr(HECEventWriter, "_get_hec_config", mock_get_hec_config)
287+
288+
ev = create_hec_event_writer(hec)
289+
assert ev._rest_client.scheme == expected_scheme

tests/unit/test_server_info.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,3 +161,32 @@ def test_server_info_object_with_key_file(
161161
assert kwargs.get("cert_file") is None
162162
assert kwargs.get("key_file") is None
163163
assert kwargs.get("verify") is None
164+
165+
@patch("solnlib.server_info.os.environ", autospec=True, return_value="$SPLUNK_HOME")
166+
@patch(
167+
"solnlib.server_info.get_splunkd_access_info",
168+
autospec=True,
169+
return_value=("https", "127.0.0.1", "8089"),
170+
)
171+
@patch("solnlib.server_info.rest_client", autospec=True)
172+
def test_server_info_object_with_no_splunk_import(
173+
self,
174+
mock_rest_client,
175+
mock_splunkd,
176+
mock_os_env,
177+
):
178+
mock_rest_client.SplunkRestClient = MagicMock()
179+
180+
# we want to raise 'ModuleNotFoundError' when importing the required functions
181+
with patch.dict("sys.modules", {"splunk": ModuleNotFoundError}):
182+
server_info.ServerInfo(common.SESSION_KEY)
183+
184+
for call_arg in mock_rest_client.SplunkRestClient.call_args_list:
185+
_, kwargs = call_arg
186+
assert (
187+
kwargs.get("cert_file") is None
188+
) # comes from the empty function in except
189+
assert (
190+
kwargs.get("key_file") is None
191+
) # comes from the empty function in except
192+
assert kwargs.get("verify") is None

0 commit comments

Comments
 (0)