From b1c73defbae4461335d56087983999a59b6675f7 Mon Sep 17 00:00:00 2001 From: Sylvain-Royer Date: Wed, 18 Jun 2025 11:53:08 +0900 Subject: [PATCH 1/3] Fix parseNodesFromClusterInfoReply to be able to handle non XXX.XXX.X.XX:PPPP formated ips. For example, ipv6 ips. --- redisinsight/api/src/modules/redis/utils/reply.util.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/redisinsight/api/src/modules/redis/utils/reply.util.ts b/redisinsight/api/src/modules/redis/utils/reply.util.ts index 8f6b89c73d..9b2281612a 100644 --- a/redisinsight/api/src/modules/redis/utils/reply.util.ts +++ b/redisinsight/api/src/modules/redis/utils/reply.util.ts @@ -115,8 +115,12 @@ export const parseNodesFromClusterInfoReply = ( // fields = [id, endpoint, flags, master, pingSent, pongRecv, configEpoch, linkState, slot] const fields = line.split(' '); const [id, endpoint, , master, , , , linkState, slot] = fields; - const host = endpoint.split(':')[0]; - const port = endpoint.split(':')[1].split('@')[0]; + + const hostAndPort = endpoint.split('@')[0] + const lastColonIndex = hostAndPort.lastIndexOf(':'); + + const host = hostAndPort.substring(0, lastColonIndex); + const port = hostAndPort.substring(lastColonIndex + 1); nodes.push({ id, host, From 1cfed262e50362230f78ac33bb7438e26e5473e4 Mon Sep 17 00:00:00 2001 From: Sylvain-Royer Date: Wed, 18 Jun 2025 12:07:01 +0900 Subject: [PATCH 2/3] Add unit tests related to ipv6. --- redisinsight/api/src/__mocks__/redis-info.ts | 5 ++++ .../modules/redis/utils/reply.util.spec.ts | 30 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/redisinsight/api/src/__mocks__/redis-info.ts b/redisinsight/api/src/__mocks__/redis-info.ts index 1c67ab7fb3..8a24d99ecb 100644 --- a/redisinsight/api/src/__mocks__/redis-info.ts +++ b/redisinsight/api/src/__mocks__/redis-info.ts @@ -109,6 +109,11 @@ export const mockRedisClusterNodesResponse: string = '07c37dfeb235213a872192d90877d0cd55635b91 127.0.0.1:30004@31004 slave e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca 0 1426238317239 4 connected\n' + 'e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca 127.0.0.1:30001@31001 myself,master - 0 0 1 connected 0-16383'; +// eslint-disable-next-line max-len +export const mockRedisClusterNodesResponseIPv6: string = + '07c37dfeb235213a872192d90877d0cd55635b91 2001:db8::1:7001@17001 slave e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca 0 1426238317239 4 connected\n' + + 'e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca 2001:db8::2:7002@17002 myself,master - 0 0 1 connected 0-16383'; + export const mockStandaloneRedisInfoReply: string = `${ mockRedisServerInfoResponse }\r\n${mockRedisClientsInfoResponse}\r\n${mockRedisMemoryInfoResponse}\r\n${ diff --git a/redisinsight/api/src/modules/redis/utils/reply.util.spec.ts b/redisinsight/api/src/modules/redis/utils/reply.util.spec.ts index e796e3dce2..a539790cf3 100644 --- a/redisinsight/api/src/modules/redis/utils/reply.util.spec.ts +++ b/redisinsight/api/src/modules/redis/utils/reply.util.spec.ts @@ -1,5 +1,6 @@ import { mockRedisClusterNodesResponse, + mockRedisClusterNodesResponseIPv6, mockRedisServerInfoResponse, } from 'src/__mocks__'; import { flatMap } from 'lodash'; @@ -38,6 +39,28 @@ const mockRedisClusterNodes: IRedisClusterNode[] = [ }, ]; +// IPv6 expected results +const mockRedisClusterNodesIPv6: IRedisClusterNode[] = [ + { + id: '07c37dfeb235213a872192d90877d0cd55635b91', + host: '2001:db8::1', + port: 7001, + replicaOf: 'e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca', + linkState: RedisClusterNodeLinkState.Connected, + slot: undefined, + }, + { + id: 'e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca', + host: '2001:db8::2', + port: 7002, + replicaOf: undefined, + linkState: RedisClusterNodeLinkState.Connected, + slot: '0-16383', + }, +]; + + + const mockIncorrectString = '$6\r\nfoobar\r\n'; describe('convertArrayReplyToObject', () => { @@ -86,4 +109,11 @@ describe('parseNodesFromClusterInfoReply', () => { expect(result).toEqual([]); }); + it('should parse IPv6 addresses correctly', async () => { + const result = parseNodesFromClusterInfoReply( + mockRedisClusterNodesResponseIPv6, + ); + + expect(result).toEqual(mockRedisClusterNodesIPv6); + }); }); From 752cb6098fc031f1d914a3196a88ed18a4650808 Mon Sep 17 00:00:00 2001 From: Sylvain Royer Date: Mon, 30 Jun 2025 10:04:21 +0900 Subject: [PATCH 3/3] update documentation. --- redisinsight/api/src/modules/redis/utils/reply.util.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/redisinsight/api/src/modules/redis/utils/reply.util.ts b/redisinsight/api/src/modules/redis/utils/reply.util.ts index 9b2281612a..cc98121135 100644 --- a/redisinsight/api/src/modules/redis/utils/reply.util.ts +++ b/redisinsight/api/src/modules/redis/utils/reply.util.ts @@ -86,8 +86,9 @@ export const convertMultilineReplyToObject = ( * Parse and return all endpoints from the nodes list returned by "cluster info" command * @Input * ``` - * 08418e3514990489e48fa05d642efc33e205f5 172.31.100.211:6379@16379 myself,master - 0 1698694904000 1 connected 0-5460\n - * d2dee846c715a917ec9a4963e8885b06130f9f 172.31.100.212:6379@16379 master - 0 1698694905285 2 connected 5461-10922\n + * 08418e3514990489e48fa05d642efc33e205f5 172.31.100.211:6379@16379 myself,master - 0 1698694904000 1 connected 0-5460 + * d2dee846c715a917ec9a4963e8885b06130f9f 172.31.100.212:6379@16379 master - 0 1698694905285 2 connected 5461-10922 + * 3e92457ab813ad7a62dacf768ec7309210feaf [2001:db8::1]:7001@17001 master - 0 1698694906000 3 connected 10923-16383 * ``` * @Output * ``` @@ -99,6 +100,10 @@ export const convertMultilineReplyToObject = ( * { * host: "172.31.100.212", * port: 6379 + * }, + * { + * host: "2001:db8::1", + * port: 7001 * } * ] * ```