Skip to content

Commit cfb2650

Browse files
Add timeout option to SQL CLI tool. (opensearch-project#1076)
* Add timeout option to SQL CLI tool. Signed-off-by: Yury-Fridlyand <yuryf@bitquilltech.com> * Fix test. Signed-off-by: Yury-Fridlyand <yuryf@bitquilltech.com> * Extend help message. Signed-off-by: Yury-Fridlyand <yuryf@bitquilltech.com> Signed-off-by: Yury-Fridlyand <yuryf@bitquilltech.com>
1 parent 334cd46 commit cfb2650

File tree

4 files changed

+23
-11
lines changed

4 files changed

+23
-11
lines changed

sql-cli/src/opensearch_sql_cli/main.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,14 @@
7171
default="sql",
7272
help="SQL OR PPL",
7373
)
74+
@click.option(
75+
"-t",
76+
"--timeout",
77+
"response_timeout",
78+
type=click.INT,
79+
default=10,
80+
help="Timeout in seconds to await a response from the server"
81+
)
7482
def cli(
7583
endpoint,
7684
query,
@@ -83,6 +91,7 @@ def cli(
8391
always_use_pager,
8492
use_aws_authentication,
8593
query_language,
94+
response_timeout
8695
):
8796
"""
8897
Provide endpoint for OpenSearch client.
@@ -114,12 +123,9 @@ def cli(
114123
sys.exit(0)
115124

116125
# use console to interact with user
117-
opensearchsql_cli = OpenSearchSqlCli(
118-
clirc_file=clirc,
119-
always_use_pager=always_use_pager,
120-
use_aws_authentication=use_aws_authentication,
121-
query_language=query_language,
122-
)
126+
opensearchsql_cli = OpenSearchSqlCli(clirc_file=clirc, always_use_pager=always_use_pager,
127+
use_aws_authentication=use_aws_authentication, query_language=query_language,
128+
response_timeout=response_timeout)
123129
opensearchsql_cli.connect(endpoint, http_auth)
124130
opensearchsql_cli.run_cli()
125131

sql-cli/src/opensearch_sql_cli/opensearch_connection.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ def __init__(
2727
http_auth=None,
2828
use_aws_authentication=False,
2929
query_language="sql",
30+
response_timeout=10
3031
):
3132
"""Initialize an OpenSearchConnection instance.
3233
@@ -45,6 +46,7 @@ def __init__(
4546
self.http_auth = http_auth
4647
self.use_aws_authentication = use_aws_authentication
4748
self.query_language = query_language
49+
self.response_timeout = response_timeout
4850

4951
def get_indices(self):
5052
if self.client:
@@ -167,14 +169,14 @@ def execute_query(self, query, output_format="jdbc", explain=False, use_console=
167169
data = self.client.transport.perform_request(
168170
url="/_plugins/_sql/_explain" if explain else "/_plugins/_sql/",
169171
method="POST",
170-
params=None if explain else {"format": output_format},
172+
params=None if explain else {"format": output_format, "request_timeout": self.response_timeout},
171173
body={"query": final_query},
172174
)
173175
else:
174176
data = self.client.transport.perform_request(
175177
url="/_plugins/_ppl/_explain" if explain else "/_plugins/_ppl/",
176178
method="POST",
177-
params=None if explain else {"format": output_format},
179+
params=None if explain else {"format": output_format, "request_timeout": self.response_timeout},
178180
body={"query": final_query},
179181
)
180182
return data

sql-cli/src/opensearch_sql_cli/opensearchsql_cli.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@
4343
class OpenSearchSqlCli:
4444
"""OpenSearchSqlCli instance is used to build and run the OpenSearch SQL CLI."""
4545

46-
def __init__(self, clirc_file=None, always_use_pager=False, use_aws_authentication=False, query_language="sql"):
46+
def __init__(self, clirc_file=None, always_use_pager=False, use_aws_authentication=False, query_language="sql",
47+
response_timeout=10):
4748
# Load conf file
4849
config = self.config = get_config(clirc_file)
4950
literal = self.literal = self._get_literals()
@@ -53,6 +54,7 @@ def __init__(self, clirc_file=None, always_use_pager=False, use_aws_authenticati
5354
self.query_language = query_language
5455
self.always_use_pager = always_use_pager
5556
self.use_aws_authentication = use_aws_authentication
57+
self.response_timeout = response_timeout
5658
self.keywords_list = literal["keywords"]
5759
self.functions_list = literal["functions"]
5860
self.syntax_style = config["main"]["syntax_style"]
@@ -169,7 +171,7 @@ def echo_via_pager(self, text, color=None):
169171

170172
def connect(self, endpoint, http_auth=None):
171173
self.opensearch_executor = OpenSearchConnection(
172-
endpoint, http_auth, self.use_aws_authentication, self.query_language
174+
endpoint, http_auth, self.use_aws_authentication, self.query_language, self.response_timeout
173175
)
174176
self.opensearch_executor.set_connection()
175177

sql-cli/tests/test_opensearchsql_cli.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
QUERY_WITH_CTRL_D = "select * from %s;\r\x04\r" % TEST_INDEX_NAME
1919
USE_AWS_CREDENTIALS = False
2020
QUERY_LANGUAGE = "sql"
21+
RESPONSE_TIMEOUT = 10
2122

2223

2324
@pytest.fixture()
@@ -34,7 +35,8 @@ def test_connect(self, cli):
3435
) as mock_set_connectiuon:
3536
cli.connect(endpoint=ENDPOINT)
3637

37-
mock_OpenSearchConnection.assert_called_with(ENDPOINT, AUTH, USE_AWS_CREDENTIALS, QUERY_LANGUAGE)
38+
mock_OpenSearchConnection.assert_called_with(ENDPOINT, AUTH, USE_AWS_CREDENTIALS, QUERY_LANGUAGE,
39+
RESPONSE_TIMEOUT)
3840
mock_set_connectiuon.assert_called()
3941

4042
@estest

0 commit comments

Comments
 (0)