Skip to content

Commit f6bdafe

Browse files
feat: check sever version (#146)
1 parent 81f69f4 commit f6bdafe

File tree

4 files changed

+93
-0
lines changed

4 files changed

+93
-0
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## 0.15.0 [unreleased]
44

5+
### Features
6+
7+
1. [#146](https://github.com/InfluxCommunity/influxdb3-python/pull/146): Add function to get InfluxDB version.
8+
59
## 0.14.0 [2025-06-18]
610

711
### Features

influxdb_client_3/__init__.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,33 @@ async def query_async(self, query: str, language: str = "sql", mode: str = "all"
467467
except ArrowException as e:
468468
raise InfluxDB3ClientQueryError(f"Error while executing query: {e}")
469469

470+
def get_server_version(self) -> str:
471+
"""
472+
Get the version of the connected InfluxDB server.
473+
474+
This method makes a ping request to the server and extracts the version information
475+
from either the response headers or response body.
476+
477+
:return: The version string of the InfluxDB server.
478+
:rtype: str
479+
"""
480+
version = None
481+
(resp_body, _, header) = self._client.api_client.call_api(
482+
resource_path="/ping",
483+
method="GET",
484+
response_type=object
485+
)
486+
487+
for key, value in header.items():
488+
if key.lower() == "x-influxdb-version":
489+
version = value
490+
break
491+
492+
if version is None and isinstance(resp_body, dict):
493+
version = resp_body['version']
494+
495+
return version
496+
470497
def close(self):
471498
"""Close the client and clean up resources."""
472499
self._write_api.close()

tests/test_influxdb_client_3.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,22 @@
1+
import re
12
import unittest
23
from unittest.mock import patch
34

5+
from pytest_httpserver import HTTPServer
6+
47
from influxdb_client_3 import InfluxDBClient3, WritePrecision, DefaultWriteOptions, Point, WriteOptions, WriteType
58
from influxdb_client_3.exceptions import InfluxDB3ClientQueryError
9+
from influxdb_client_3.write_client.rest import ApiException
610
from tests.util import asyncio_run
711
from tests.util.mocks import ConstantFlightServer, ConstantData, ErrorFlightServer
812

913

14+
def http_server():
15+
httpserver = HTTPServer()
16+
httpserver.start()
17+
return httpserver
18+
19+
1020
class TestInfluxDBClient3(unittest.TestCase):
1121

1222
@patch('influxdb_client_3._InfluxDBClient')
@@ -22,6 +32,11 @@ def setUp(self, mock_query_api, mock_write_api, mock_influx_db_client):
2232
database="my_db",
2333
token="my_token"
2434
)
35+
self.http_server = http_server()
36+
37+
def tearDown(self):
38+
if self.http_server is not None:
39+
self.http_server.stop()
2540

2641
def test_init(self):
2742
self.assertEqual(self.client._org, "my_org")
@@ -226,6 +241,49 @@ async def test_async_query_with_arrow_error(self):
226241
await c.query_async("SELECT * FROM my_data")
227242
self.assertIn("Error while executing query", str(err.exception))
228243

244+
def test_get_version_header_success(self):
245+
server = self.http_server
246+
server.expect_request(re.compile(".*")).respond_with_json(
247+
headers={"X-Influxdb-Version": "1.8.2"},
248+
response_json={"version": "3.0"}
249+
)
250+
version = InfluxDBClient3(
251+
host=f'http://{server.host}:{server.port}', org="ORG", database="DB", token="TOKEN"
252+
).get_server_version()
253+
assert version == "1.8.2"
254+
255+
def test_get_version_in_body_success(self):
256+
server = self.http_server
257+
server.expect_request('/ping').respond_with_json(
258+
response_json={"version": "3.0"},
259+
)
260+
version = InfluxDBClient3(
261+
host=f'http://{server.host}:{server.port}', org="ORG", database="DB", token="TOKEN"
262+
).get_server_version()
263+
assert version == "3.0"
264+
265+
def test_get_version_empty(self):
266+
server = self.http_server
267+
server.expect_request("/ping").respond_with_data(
268+
headers={"abc": "1.8.2"},
269+
)
270+
271+
version = InfluxDBClient3(
272+
host=f'http://{server.host}:{server.port}', org="ORG", database="DB", token="TOKEN"
273+
).get_server_version()
274+
assert version is None
275+
276+
def test_get_version_fail(self):
277+
server = self.http_server
278+
server.expect_request("/ping").respond_with_json(
279+
response_json={"error": "error"},
280+
status=400
281+
)
282+
with self.assertRaises(ApiException):
283+
InfluxDBClient3(
284+
host=f'http://{server.host}:{server.port}', org="ORG", database="DB", token="TOKEN"
285+
).get_server_version()
286+
229287

230288
if __name__ == '__main__':
231289
unittest.main()

tests/test_influxdb_client_3_integration.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,3 +274,7 @@ async def test_verify_query_async(self):
274274
result_list = result.to_pylist()
275275
for item in data:
276276
assert lp_to_py_object(item) in result_list, f"original lp data \"{item}\" should be in result list"
277+
278+
def test_get_server_version(self):
279+
version = self.client.get_server_version()
280+
assert version is not None

0 commit comments

Comments
 (0)