diff --git a/examples/python/client_example.py b/examples/python/client_example.py deleted file mode 100755 index 35d9ea5a8b..0000000000 --- a/examples/python/client_example.py +++ /dev/null @@ -1,90 +0,0 @@ -# Copyright Valkey GLIDE Project Contributors - SPDX Identifier: Apache-2.0 - -import asyncio -from typing import Optional, Union - -from glide import ( - AllNodes, - BaseClientConfiguration, - GlideClient, - GlideClusterClient, - Logger, - LogLevel, - NodeAddress, -) - - -def set_console_logger(level: LogLevel = LogLevel.WARN): - Logger.set_logger_config(level) - - -def set_file_logger(level: LogLevel = LogLevel.WARN, file: Optional[str] = None): - if file is None: - from datetime import datetime, timezone - - curr_time = datetime.now(timezone.utc) - curr_time_str = curr_time.strftime("%Y-%m-%dT%H:%M:%SZ") - file = f"{curr_time_str}-glide.log" - Logger.set_logger_config(level, file) - - -async def send_set_and_get(client: Union[GlideClient, GlideClusterClient]): - set_response = await client.set("foo", "bar") - print(f"Set response is = {set_response!r}") - get_response = await client.get("foo") - print(f"Get response is = {get_response!r}") - - -async def test_standalone_client(host: str = "localhost", port: int = 6379): - # When in Redis is in standalone mode, add address of the primary node, - # and any replicas you'd like to be able to read from. - addresses = [NodeAddress(host, port)] - # Check `GlideClientConfiguration/GlideClusterClientConfiguration` for additional options. - config = BaseClientConfiguration( - addresses=addresses, - client_name="test_standalone_client", - # if the server use TLS, you'll need to enable it. Otherwise the connection attempt will time out silently. - # use_tls=True - ) - client = await GlideClient.create(config) - - # Send SET and GET - await send_set_and_get(client) - # Send PING to the primary node - pong = await client.custom_command(["PING"]) - assert isinstance(pong, bytes) - print(f"PONG response is = {pong.decode()}") - - -async def test_cluster_client(host: str = "localhost", port: int = 6379): - # When in Redis is cluster mode, add address of any nodes, and the client will find all nodes in the cluster. - addresses = [NodeAddress(host, port)] - # Check `GlideClientConfiguration/GlideClusterClientConfiguration` for additional options. - config = BaseClientConfiguration( - addresses=addresses, - client_name="test_cluster_client", - # if the cluster nodes use TLS, you'll need to enable it. Otherwise the connection attempt will time out silently. - # use_tls=True - ) - client = await GlideClusterClient.create(config) - - # Send SET and GET - await send_set_and_get(client) - # Send PING to all primaries (according to Redis's PING request_policy) - pong = await client.custom_command(["PING"]) - assert isinstance(pong, bytes) - print(f"PONG response is = {pong.decode()}") - # Send INFO REPLICATION with routing option to all nodes - info_repl_resps = await client.custom_command(["INFO", "REPLICATION"], AllNodes()) - print(f"INFO REPLICATION responses from all nodes are = {info_repl_resps!r}") - - -async def main(): - set_console_logger(LogLevel.DEBUG) - set_file_logger(LogLevel.DEBUG) - await test_standalone_client() - await test_cluster_client() - - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/examples/python/cluster_example.py b/examples/python/cluster_example.py new file mode 100644 index 0000000000..74761329b1 --- /dev/null +++ b/examples/python/cluster_example.py @@ -0,0 +1,81 @@ +import asyncio + +from glide import ( + AllNodes, + ClosingError, + GlideClusterClient, + GlideClusterClientConfiguration, + InfoSection, + Logger, + LogLevel, + NodeAddress, + RequestError, +) + + +async def create_client( + host: str = "localhost", port: int = 6379 +) -> GlideClusterClient: + # When in Redis is cluster mode, add address of any nodes, and the client will find all nodes in the cluster. + addresses = [NodeAddress(host, port)] + # Check `GlideClusterClientConfiguration` for additional options. + config = GlideClusterClientConfiguration( + addresses=addresses, + client_name="test_cluster_client", + # if the cluster nodes use TLS, you'll need to enable it. Otherwise the connection attempt will time out silently. + # use_tls=True + ) + return await GlideClusterClient.create(config) + + +async def app_logic(client: GlideClusterClient): + # Send SET and GET + set_response = await client.set("foo", "bar") + print(f"Set response is = {set_response!r}") + get_response = await client.get("foo") + assert isinstance(get_response, bytes) + print(f"Get response is = {get_response.decode()!r}") + # Send PING to all primaries (according to Redis's PING request_policy) + pong = await client.ping() + print(f"PONG response is = {pong}") + # Send INFO REPLICATION with routing option to all nodes + info_repl_resps = await client.info([InfoSection.REPLICATION], AllNodes()) + print(f"INFO REPLICATION responses from all nodes are=\n{info_repl_resps!r}") + + +async def exec_app_logic(): + while True: + try: + client = await create_client() + return await app_logic(client) + except asyncio.CancelledError: + raise + except ClosingError as e: + # If the error message contains "NOAUTH", raise the exception + # because it indicates a critical authentication issue. + if "NOAUTH" in str(e): + raise e + print(f"Client has closed and needs to be re-created: {e}") + except RequestError as e: + print(f"RequestError encountered: {e}") + raise e + except Exception as e: + print(f"Unexpected error: {e}") + raise e + finally: + try: + await client.close() + except Exception: + pass + # Optionally, handle or log closure errors + + +def main(): + Logger.set_logger_config(LogLevel.INFO) + # Optional - set logger to write to file + # Logger.set_logger_config(LogLevel.INFO, file) + asyncio.run(exec_app_logic()) + + +if __name__ == "__main__": + main() diff --git a/examples/python/standalone_example.py b/examples/python/standalone_example.py new file mode 100644 index 0000000000..14486268d2 --- /dev/null +++ b/examples/python/standalone_example.py @@ -0,0 +1,69 @@ +import asyncio + +from glide import ( + ClosingError, + GlideClient, + GlideClientConfiguration, + GlideClusterClient, + GlideClusterClientConfiguration, + Logger, + LogLevel, + NodeAddress, + RequestError, +) + + +async def create_client(host: str = "localhost", port: int = 6379) -> GlideClient: + addresses = [NodeAddress(host, port)] + config = GlideClientConfiguration(addresses) + return await GlideClient.create(config) + + +async def app_logic(client: GlideClient): + # Send SET and GET + set_response = await client.set("foo", "bar") + print(f"Set response is = {set_response!r}") + get_response = await client.get("foo") + assert isinstance(get_response, bytes) + print(f"Get response is = {get_response.decode()!r}") + # Send PING to the primary node + pong = await client.ping() + print(f"PONG response is = {pong}") + + +async def exec_app_logic(): + while True: + try: + client = await create_client() + return await app_logic(client) + except asyncio.CancelledError: + raise + except ClosingError as e: + # If the error message contains "NOAUTH", raise the exception + # because it indicates a critical authentication issue. + if "NOAUTH" in str(e): + raise e + print(f"Client has closed and needs to be re-created: {e}") + except RequestError as e: + print(f"RequestError encountered: {e}") + raise e + except Exception as e: + print(f"Unexpected error: {e}") + raise e + finally: + try: + await client.close() + except Exception: + pass + # Optionally, handle or log closure errors + + +def main(): + Logger.set_logger_config(LogLevel.INFO) + # Optional - set logger to write to file + # Logger.set_logger_config(LogLevel.INFO, file) + asyncio.run(exec_app_logic()) + + +if __name__ == "__main__": + main()