summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnurag Bandyopadhyay <angbpy@gmail.com>2023-05-08 13:31:57 +0530
committerGitHub <noreply@github.com>2023-05-08 11:01:57 +0300
commitcfdcfd87acdc10bedba6230b0cbe7dcf44b4652a (patch)
tree441cd541023347c2ac3b2c161fc93c64970b3865
parent906e41349d8751f721c452494cdcdb5455258719 (diff)
downloadredis-py-cfdcfd87acdc10bedba6230b0cbe7dcf44b4652a.tar.gz
Add support for cluster myshardid (#2704)
* feat: adding support for cluster myshardid * lint fix * fix: comment fix and async test * fix: adding version check * fix lint: * linters --------- Co-authored-by: Anuragkillswitch <70265851+Anuragkillswitch@users.noreply.github.com> Co-authored-by: dvora-h <67596500+dvora-h@users.noreply.github.com> Co-authored-by: dvora-h <dvora.heller@redis.com>
-rw-r--r--redis/cluster.py8
-rw-r--r--redis/commands/cluster.py9
-rw-r--r--tests/test_asyncio/test_cluster.py7
-rw-r--r--tests/test_cluster.py7
4 files changed, 30 insertions, 1 deletions
diff --git a/redis/cluster.py b/redis/cluster.py
index 3ecc2da..2ab173d 100644
--- a/redis/cluster.py
+++ b/redis/cluster.py
@@ -113,6 +113,13 @@ def parse_cluster_shards(resp, **options):
return shards
+def parse_cluster_myshardid(resp, **options):
+ """
+ Parse CLUSTER MYSHARDID response.
+ """
+ return resp.decode("utf-8")
+
+
PRIMARY = "primary"
REPLICA = "replica"
SLOT_ID = "slot-id"
@@ -341,6 +348,7 @@ class AbstractRedisCluster:
CLUSTER_COMMANDS_RESPONSE_CALLBACKS = {
"CLUSTER SLOTS": parse_cluster_slots,
"CLUSTER SHARDS": parse_cluster_shards,
+ "CLUSTER MYSHARDID": parse_cluster_myshardid,
}
RESULT_CALLBACKS = dict_merge(
diff --git a/redis/commands/cluster.py b/redis/commands/cluster.py
index a23a94a..cd93a85 100644
--- a/redis/commands/cluster.py
+++ b/redis/commands/cluster.py
@@ -45,7 +45,6 @@ from .redismodules import RedisModuleCommands
if TYPE_CHECKING:
from redis.asyncio.cluster import TargetNodesT
-
# Not complete, but covers the major ones
# https://redis.io/commands
READ_COMMANDS = frozenset(
@@ -634,6 +633,14 @@ class ClusterManagementCommands(ManagementCommands):
"""
return self.execute_command("CLUSTER SHARDS", target_nodes=target_nodes)
+ def cluster_myshardid(self, target_nodes=None):
+ """
+ Returns the shard ID of the node.
+
+ For more information see https://redis.io/commands/cluster-myshardid/
+ """
+ return self.execute_command("CLUSTER MYSHARDID", target_nodes=target_nodes)
+
def cluster_links(self, target_node: "TargetNodesT") -> ResponseT:
"""
Each node in a Redis Cluster maintains a pair of long-lived TCP link with each
diff --git a/tests/test_asyncio/test_cluster.py b/tests/test_asyncio/test_cluster.py
index 2d6099f..17aa879 100644
--- a/tests/test_asyncio/test_cluster.py
+++ b/tests/test_asyncio/test_cluster.py
@@ -1006,6 +1006,13 @@ class TestClusterRedisCommands:
myid = await r.cluster_myid(node)
assert len(myid) == 40
+ @skip_if_server_version_lt("7.2.0")
+ @skip_if_redis_enterprise()
+ async def test_cluster_myshardid(self, r: RedisCluster) -> None:
+ node = r.get_random_node()
+ myshardid = await r.cluster_myshardid(node)
+ assert len(myshardid) == 40
+
@skip_if_redis_enterprise()
async def test_cluster_slots(self, r: RedisCluster) -> None:
mock_all_nodes_resp(r, default_cluster_slots)
diff --git a/tests/test_cluster.py b/tests/test_cluster.py
index 8371cc5..705e753 100644
--- a/tests/test_cluster.py
+++ b/tests/test_cluster.py
@@ -1162,6 +1162,13 @@ class TestClusterRedisCommands:
for attribute in node.keys():
assert attribute in attributes
+ @skip_if_server_version_lt("7.2.0")
+ @skip_if_redis_enterprise()
+ def test_cluster_myshardid(self, r):
+ myshardid = r.cluster_myshardid()
+ assert isinstance(myshardid, str)
+ assert len(myshardid) > 0
+
@skip_if_redis_enterprise()
def test_cluster_addslots(self, r):
node = r.get_random_node()