Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Get valkey/redis version using client's info command #2276

Merged
Merged
Show file tree
Hide file tree
Changes from 19 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
74dd3dc
Get valkey/redis version using cli command
prateek-kumar-improving Sep 11, 2024
75ed97f
Change log updated
prateek-kumar-improving Sep 11, 2024
147643f
Add validation
prateek-kumar-improving Sep 11, 2024
f94d35d
Type updated for addresses field
prateek-kumar-improving Sep 11, 2024
c00d7bd
Refactor node js code to get version using client's info command
prateek-kumar-improving Sep 12, 2024
69a5f04
Merge branch 'main' into node-get-version-using-cli-command
prateek-kumar-improving Sep 12, 2024
4fd56c9
Merge branch 'main' into node-get-version-using-cli-command
prateek-kumar-improving Sep 12, 2024
cb4e11f
Update RedisCluster to ValkeyServer
prateek-kumar-improving Sep 12, 2024
baa1a0d
Formatting fixed
prateek-kumar-improving Sep 12, 2024
4cd703f
Formatting fixed
prateek-kumar-improving Sep 12, 2024
23ce215
common function moved to TestUtilities
prateek-kumar-improving Sep 12, 2024
131677f
Common function refactored
prateek-kumar-improving Sep 12, 2024
21a3519
Documentation updated
prateek-kumar-improving Sep 12, 2024
a3e8319
fix for cluster client
prateek-kumar-improving Sep 12, 2024
b1a9643
Formatting callback function parameter
prateek-kumar-improving Sep 12, 2024
ee4cd15
refactoring pubSub callback call
prateek-kumar-improving Sep 12, 2024
4fa5191
Pub sub cluster client parameter updated
prateek-kumar-improving Sep 12, 2024
39171e6
Merge branch 'main' into node-get-version-using-cli-command
prateek-kumar-improving Sep 12, 2024
0a95e8c
formatting fixed
prateek-kumar-improving Sep 12, 2024
fdd3112
Change log updated
prateek-kumar-improving Sep 12, 2024
21aa6ac
Change log updated
prateek-kumar-improving Sep 12, 2024
9d43017
callback refactored
prateek-kumar-improving Sep 12, 2024
43b7d96
initFromExistingCluster cluster_mode added
prateek-kumar-improving Sep 12, 2024
c96fc9d
Merge branch 'main' into node-get-version-using-cli-command
prateek-kumar-improving Sep 12, 2024
c861846
clients closed
prateek-kumar-improving Sep 12, 2024
29d4f6c
Glide cluster client closed
prateek-kumar-improving Sep 12, 2024
8d38dfe
Files formatted
prateek-kumar-improving Sep 12, 2024
e244aaa
Cluster mode added in client close
prateek-kumar-improving Sep 12, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#### Changes
* Node: Get valkey/redis version using cli command ([#2276]https://github.com/valkey-io/valkey-glide/pull/2276)
Yury-Fridlyand marked this conversation as resolved.
Show resolved Hide resolved
* Python: Replace instances of Redis with Valkey ([#2266](https://github.com/valkey-io/valkey-glide/pull/2266))
* Java: Replace instances of Redis with Valkey ([#2268](https://github.com/valkey-io/valkey-glide/pull/2268))
* Node: Replace instances of Redis with Valkey ([#2260](https://github.com/valkey-io/valkey-glide/pull/2260))
Expand Down
5 changes: 3 additions & 2 deletions node/tests/GlideClient.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ import {
flushAndCloseClient,
generateLuaLibCode,
getClientConfigurationOption,
getServerVersion,
parseCommandLineArgs,
parseEndpoints,
transactionTest,
Expand All @@ -57,12 +58,12 @@ describe("GlideClient", () => {
beforeAll(async () => {
const standaloneAddresses =
parseCommandLineArgs()["standalone-endpoints"];
// Connect to cluster or create a new one based on the parsed addresses
cluster = standaloneAddresses
? await ValkeyCluster.initFromExistingCluster(
parseEndpoints(standaloneAddresses),
getServerVersion,
)
: await ValkeyCluster.createCluster(false, 1, 1);
: await ValkeyCluster.createCluster(false, 1, 1, getServerVersion);
}, 20000);

afterEach(async () => {
Expand Down
13 changes: 12 additions & 1 deletion node/tests/GlideClusterClient.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ import {
generateLuaLibCode,
getClientConfigurationOption,
getFirstResult,
getServerVersion,
intoArray,
intoString,
parseCommandLineArgs,
Expand All @@ -68,9 +69,19 @@ describe("GlideClusterClient", () => {
cluster = clusterAddresses
? await ValkeyCluster.initFromExistingCluster(
parseEndpoints(clusterAddresses),
async (addresses: [string, number][]) => {
Yury-Fridlyand marked this conversation as resolved.
Show resolved Hide resolved
return getServerVersion(addresses, true);
},
)
: // setting replicaCount to 1 to facilitate tests routed to replicas
await ValkeyCluster.createCluster(true, 3, 1);
await ValkeyCluster.createCluster(
true,
3,
1,
async (addresses: [string, number][]) => {
return getServerVersion(addresses, true);
},
Yury-Fridlyand marked this conversation as resolved.
Show resolved Hide resolved
);
}, 20000);

afterEach(async () => {
Expand Down
14 changes: 12 additions & 2 deletions node/tests/PubSub.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import {
import ValkeyCluster from "../../utils/TestUtils";
import {
flushAndCloseClient,
getServerVersion,
parseCommandLineArgs,
parseEndpoints,
} from "./TestUtilities";
Expand Down Expand Up @@ -66,13 +67,22 @@ describe("PubSub", () => {
cmdCluster = standaloneAddresses
? await ValkeyCluster.initFromExistingCluster(
parseEndpoints(standaloneAddresses),
getServerVersion,
)
: await ValkeyCluster.createCluster(false, 1, 1);
: await ValkeyCluster.createCluster(false, 1, 1, getServerVersion);
cmeCluster = clusterAddresses
? await ValkeyCluster.initFromExistingCluster(
parseEndpoints(clusterAddresses),
getServerVersion,
)
: await ValkeyCluster.createCluster(true, 3, 1);
: await ValkeyCluster.createCluster(
true,
3,
1,
async (addresses: [string, number][]) => {
return getServerVersion(addresses, true);
},
);
}, 40000);
afterEach(async () => {
await flushAndCloseClient(false, cmdCluster.getAddresses());
Expand Down
41 changes: 40 additions & 1 deletion node/tests/TestUtilities.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,13 @@ import {
GeospatialData,
GlideClient,
GlideClusterClient,
GlideReturnType,
GlideString,
InfBoundary,
InfoOptions,
InsertPosition,
ListDirection,
ProtocolVersion,
GlideReturnType,
ReturnTypeMap,
ScoreFilter,
SignedEncoding,
Expand Down Expand Up @@ -1756,3 +1757,41 @@ export async function transactionTest(
responseData.push(["wait(1, 200)", 1]);
return responseData;
}

/**
* This function gets server version using info command in glide client.
*
* @param addresses - Addresses containing host and port for the valkey server.
* @returns Server version for valkey server
*/
export async function getServerVersion(
addresses: [string, number][],
clusterMode = false,
): Promise<string> {
let info = "";
if (clusterMode) {
const glideClusterClient = await GlideClusterClient.createClient(
getClientConfigurationOption(addresses, ProtocolVersion.RESP2),
);
info = getFirstResult(
await glideClusterClient.info({ sections: [InfoOptions.Server] }),
).toString();
} else {
const glideClient = await GlideClient.createClient(
getClientConfigurationOption(addresses, ProtocolVersion.RESP2),
);
info = await glideClient.info([InfoOptions.Server]);
}
Yury-Fridlyand marked this conversation as resolved.
Show resolved Hide resolved

let version = "";
const redisVersionKey = "redis_version:";
const valkeyVersionKey = "valkey_version:";

if (info.includes(valkeyVersionKey)) {
version = info.split(valkeyVersionKey)[1].split("\n")[0];
} else if (info.includes(redisVersionKey)) {
version = info.split(redisVersionKey)[1].split("\n")[0];
}

return version;
}
42 changes: 9 additions & 33 deletions utils/TestUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* Copyright Valkey GLIDE Project Contributors - SPDX Identifier: Apache-2.0
*/

import { exec, execFile } from "child_process";
import { execFile } from "child_process";
import { lt } from "semver";

const PY_SCRIPT_PATH = __dirname + "/cluster_manager.py";
Expand All @@ -21,9 +21,9 @@ function parseOutput(input: string): {
.split(",")
.map((address) => address.split(":"))
.map((address) => [address[0], Number(address[1])]) as [
string,
number
][];
string,
number
][];

if (clusterFolder === undefined || ports === undefined) {
throw new Error(`Insufficient data in input: ${input}`);
Expand All @@ -50,33 +50,11 @@ export class ValkeyCluster {
this.version = version;
}

private static async detectVersion(): Promise<string> {
return new Promise<string>((resolve, reject) => {
const extractVersion = (stdout: string): string =>
stdout.split("v=")[1].split(" ")[0];

// First, try with `valkey-server -v`
exec("valkey-server -v", (error, stdout) => {
if (error) {
// If `valkey-server` fails, try `redis-server -v`
exec("redis-server -v", (error, stdout) => {
if (error) {
reject(error);
} else {
resolve(extractVersion(stdout));
}
});
} else {
resolve(extractVersion(stdout));
}
});
});
}

public static createCluster(
cluster_mode: boolean,
shardCount: number,
replicaCount: number,
getVersionCallback: (addresses: [string, number][]) => Promise<string>,
Yury-Fridlyand marked this conversation as resolved.
Show resolved Hide resolved
loadModule?: string[]
): Promise<ValkeyCluster> {
return new Promise<ValkeyCluster>((resolve, reject) => {
Expand All @@ -98,20 +76,17 @@ export class ValkeyCluster {
}
}

console.log(command);
Yury-Fridlyand marked this conversation as resolved.
Show resolved Hide resolved
execFile(
"python3",
[PY_SCRIPT_PATH, ...command.split(" ")],
(error, stdout, stderr) => {
if (error) {
console.error(stderr);
Yury-Fridlyand marked this conversation as resolved.
Show resolved Hide resolved
reject(error);
} else {
const { clusterFolder, addresses: ports } =
Yury-Fridlyand marked this conversation as resolved.
Show resolved Hide resolved
parseOutput(stdout);

resolve(
ValkeyCluster.detectVersion().then(
getVersionCallback(ports).then(
Yury-Fridlyand marked this conversation as resolved.
Show resolved Hide resolved
(ver) =>
new ValkeyCluster(ver, ports, clusterFolder)
)
Expand All @@ -123,9 +98,10 @@ export class ValkeyCluster {
}

public static async initFromExistingCluster(
addresses: [string, number][]
addresses: [string, number][],
getVersionCallback: (addresses: [string, number][]) => Promise<string>
Yury-Fridlyand marked this conversation as resolved.
Show resolved Hide resolved
): Promise<ValkeyCluster> {
return ValkeyCluster.detectVersion().then(
return getVersionCallback(addresses).then(
(ver) => new ValkeyCluster(ver, addresses, "")
);
}
Expand Down
Loading