From b021f5a15e61ac4217b533443eba0a1c56c03ef3 Mon Sep 17 00:00:00 2001 From: Chayim Date: Sun, 25 Jul 2021 09:07:30 +0300 Subject: Implements CLIENT KILL laddr filter (#1506) --- redis/client.py | 6 +++++- tests/test_commands.py | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/redis/client.py b/redis/client.py index db4778c..ef3c82c 100755 --- a/redis/client.py +++ b/redis/client.py @@ -1210,7 +1210,8 @@ class Redis: "Disconnects the client at ``address`` (ip:port)" return self.execute_command('CLIENT KILL', address) - def client_kill_filter(self, _id=None, _type=None, addr=None, skipme=None): + def client_kill_filter(self, _id=None, _type=None, addr=None, + skipme=None, laddr=None): """ Disconnects client(s) using a variety of filter options :param id: Kills a client by its unique ID field @@ -1218,6 +1219,7 @@ class Redis: 'master', 'slave' or 'pubsub' :param addr: Kills a client by its 'address:port' :param skipme: If True, then the client calling the command + :param laddr: Kills a cient by its 'local (bind) address:port' will not get killed even if it is identified by one of the filter options. If skipme is not provided, the server defaults to skipme=True """ @@ -1239,6 +1241,8 @@ class Redis: args.extend((b'ID', _id)) if addr is not None: args.extend((b'ADDR', addr)) + if laddr is not None: + args.extend((b'LADDR', laddr)) if not args: raise DataError("CLIENT KILL ... ... " " must specify at least one filter") diff --git a/tests/test_commands.py b/tests/test_commands.py index 362e7ab..18f37d1 100644 --- a/tests/test_commands.py +++ b/tests/test_commands.py @@ -395,6 +395,26 @@ class TestRedisCommands: # we don't know which client ours will be assert 'redis_py_test' in [c['name'] for c in clients] + @skip_if_server_version_lt('6.2.0') + def test_client_kill_filter_by_laddr(self, r, r2): + r.client_setname('redis-py-c1') + r2.client_setname('redis-py-c2') + clients = [client for client in r.client_list() + if client.get('name') in ['redis-py-c1', 'redis-py-c2']] + assert len(clients) == 2 + + clients_by_name = dict([(client.get('name'), client) + for client in clients]) + + client_2_addr = clients_by_name['redis-py-c2'].get('laddr') + resp = r.client_kill_filter(laddr=client_2_addr) + assert resp == 1 + + clients = [client for client in r.client_list() + if client.get('name') in ['redis-py-c1', 'redis-py-c2']] + assert len(clients) == 1 + assert clients[0].get('name') == 'redis-py-c1' + @skip_if_server_version_lt('2.9.50') def test_client_pause(self, r): assert r.client_pause(1) -- cgit v1.2.1