redisbench-admin 0.11.49__py3-none-any.whl → 0.11.51__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
redisbench_admin/cli.py CHANGED
@@ -36,15 +36,22 @@ LOG_FORMAT = "%(asctime)s %(levelname)-4s %(message)s"
36
36
  LOG_DATEFMT = "%Y-%m-%d %H:%M:%S"
37
37
 
38
38
 
39
- def populate_with_poetry_data():
39
+ def populate_with_project_data():
40
40
  project_name = "redisbench-admin"
41
41
  project_version = __version__
42
42
  project_description = None
43
43
  try:
44
- poetry_data = toml.load("pyproject.toml")["tool"]["poetry"]
45
- project_name = poetry_data["name"]
46
- project_version = poetry_data["version"]
47
- project_description = poetry_data["description"]
44
+ pyproject_toml = toml.load("pyproject.toml")
45
+ if 'project' in pyproject_toml:
46
+ project_data = pyproject_toml["project"]
47
+ project_name = project_data["name"]
48
+ project_version = project_data["version"]
49
+ project_description = project_data.get("description")
50
+ else:
51
+ poetry_data = pyproject_toml["tool"]["poetry"]
52
+ project_name = poetry_data["name"]
53
+ project_version = poetry_data["version"]
54
+ project_description = poetry_data["description"]
48
55
  except FileNotFoundError:
49
56
  pass
50
57
 
@@ -59,7 +66,7 @@ def main():
59
66
  )
60
67
  sys.exit(1)
61
68
  requested_tool = sys.argv[1]
62
- project_name, project_description, project_version = populate_with_poetry_data()
69
+ project_name, project_description, project_version = populate_with_project_data()
63
70
  parser = argparse.ArgumentParser(
64
71
  description=project_description,
65
72
  formatter_class=argparse.ArgumentDefaultsHelpFormatter,
@@ -76,7 +76,6 @@ def export_command_logic(args, project_name, project_version):
76
76
  exporter_timemetric_path,
77
77
  _,
78
78
  _,
79
- _,
80
79
  ) = get_defaults(exporter_spec_file)
81
80
  arch = args.architecture
82
81
  logging.info("Using the following architecture on the timeseries: {}".format(arch))
@@ -16,7 +16,7 @@ import botocore
16
16
  import daemonize
17
17
  from flask import Flask, request
18
18
 
19
- from redisbench_admin.cli import populate_with_poetry_data
19
+ from redisbench_admin.cli import populate_with_project_data
20
20
  from redisbench_admin.profilers.perf import Perf
21
21
  from redisbench_admin.profilers.perf_daemon_caller import PERF_DAEMON_LOGNAME
22
22
  from redisbench_admin.profilers.profilers_local import local_profilers_platform_checks
@@ -282,7 +282,7 @@ class PerfDaemon:
282
282
 
283
283
 
284
284
  def main():
285
- _, project_description, project_version = populate_with_poetry_data()
285
+ _, project_description, project_version = populate_with_project_data()
286
286
  project_name = "perf-daemon"
287
287
  parser = argparse.ArgumentParser(
288
288
  description=project_description,
@@ -48,82 +48,3 @@ def exists_check(error_message, local_module_file, status):
48
48
  "Confirmed that module artifact: '{}' exists!".format(local_module_file)
49
49
  )
50
50
  return error_message, status
51
-
52
-
53
- def redis_files_check(redis_server_binary_path, redis_conf_path):
54
- """
55
- Check if custom Redis server binary and config file paths exist.
56
-
57
- Args:
58
- redis_server_binary_path: Path to custom redis-server binary (can be None)
59
- redis_conf_path: Path to custom redis.conf file (can be None)
60
-
61
- Returns:
62
- tuple: (status, error_message) where status is True if all files exist
63
- """
64
- status = True
65
- error_message = ""
66
-
67
- if redis_server_binary_path is not None:
68
- # Convert relative paths to absolute paths
69
- redis_server_binary_path = os.path.abspath(os.path.expanduser(redis_server_binary_path))
70
- logging.info(
71
- "Checking if custom Redis server binary {} exists...".format(redis_server_binary_path)
72
- )
73
- if not os.path.exists(redis_server_binary_path):
74
- error_message = "Specified Redis server binary does not exist: {}".format(
75
- redis_server_binary_path
76
- )
77
- logging.error(error_message)
78
- status = False
79
- elif not os.path.isfile(redis_server_binary_path):
80
- error_message = "Specified Redis server binary path is not a file: {}".format(
81
- redis_server_binary_path
82
- )
83
- logging.error(error_message)
84
- status = False
85
- elif not os.access(redis_server_binary_path, os.X_OK):
86
- error_message = "Specified Redis server binary is not executable: {}".format(
87
- redis_server_binary_path
88
- )
89
- logging.error(error_message)
90
- status = False
91
- else:
92
- logging.info(
93
- "✅ Confirmed that Redis server binary: '{}' exists and is executable!".format(
94
- redis_server_binary_path
95
- )
96
- )
97
-
98
- if redis_conf_path is not None:
99
- # Convert relative paths to absolute paths
100
- redis_conf_path = os.path.abspath(os.path.expanduser(redis_conf_path))
101
- logging.info(
102
- "Checking if custom Redis config file {} exists...".format(redis_conf_path)
103
- )
104
- if not os.path.exists(redis_conf_path):
105
- error_message = "Specified Redis config file does not exist: {}".format(
106
- redis_conf_path
107
- )
108
- logging.error(error_message)
109
- status = False
110
- elif not os.path.isfile(redis_conf_path):
111
- error_message = "Specified Redis config file path is not a file: {}".format(
112
- redis_conf_path
113
- )
114
- logging.error(error_message)
115
- status = False
116
- elif not os.access(redis_conf_path, os.R_OK):
117
- error_message = "Specified Redis config file is not readable: {}".format(
118
- redis_conf_path
119
- )
120
- logging.error(error_message)
121
- status = False
122
- else:
123
- logging.info(
124
- "✅ Confirmed that Redis config file: '{}' exists and is readable!".format(
125
- redis_conf_path
126
- )
127
- )
128
-
129
- return status, error_message
@@ -41,7 +41,6 @@ class BenchmarkClass:
41
41
  self.exporter_timemetric_path,
42
42
  self.default_specs,
43
43
  self.clusterconfig,
44
- _,
45
44
  ) = prepare_benchmark_definitions(args)
46
45
 
47
46
  def populate_remote_envs_timeout(self):
@@ -149,7 +149,6 @@ def run_local_command_logic(args, project_name, project_version):
149
149
  exporter_timemetric_path,
150
150
  default_specs,
151
151
  clusterconfig,
152
- _,
153
152
  ) = prepare_benchmark_definitions(args)
154
153
 
155
154
  return_code = 0
@@ -148,7 +148,7 @@ def create_run_remote_arguments(parser):
148
148
  "--spin-test",
149
149
  default=False,
150
150
  action="store_true",
151
- help="Setup standalone Redis server, run INFO SERVER, print output as markdown and exit (reads install_steps from defaults.yml)",
151
+ help="Setup standalone Redis server, run INFO SERVER, print output as markdown and exit",
152
152
  )
153
153
 
154
154
  return parser
@@ -105,8 +105,6 @@ def remote_db_spin(
105
105
  continue_on_module_check_error=False,
106
106
  keyspace_check_timeout=60,
107
107
  architecture="x86_64",
108
- custom_redis_server_path=None,
109
- custom_redis_conf_path=None,
110
108
  ):
111
109
  (
112
110
  _,
@@ -116,116 +114,6 @@ def remote_db_spin(
116
114
  modules_configuration_parameters_map,
117
115
  ) = extract_redis_dbconfig_parameters(benchmark_config, "dbconfig")
118
116
 
119
- # Execute install_steps from dbconfig and clientconfig if present
120
- from redisbench_admin.run_remote.standalone import execute_install_steps
121
-
122
- if benchmark_config is not None:
123
- execute_install_steps(
124
- benchmark_config, server_public_ip, username, private_key, db_ssh_port
125
- )
126
-
127
- # Copy custom Redis files to remote host if provided
128
- remote_redis_server_path = None
129
- remote_redis_conf_path = None
130
-
131
- if custom_redis_server_path or custom_redis_conf_path:
132
- from redisbench_admin.utils.remote import copy_file_to_remote_setup
133
- import os
134
-
135
- if custom_redis_conf_path:
136
- # Convert relative paths to absolute paths
137
- custom_redis_conf_path = os.path.abspath(
138
- os.path.expanduser(custom_redis_conf_path)
139
- )
140
-
141
- if not os.path.exists(custom_redis_conf_path):
142
- logging.error(
143
- f"❌ Custom redis.conf file not found: {custom_redis_conf_path}"
144
- )
145
- return_code = 1
146
- return (None, None, None, [], [], return_code, None, None)
147
-
148
- remote_redis_conf_path = "/tmp/redis.conf"
149
- logging.info(
150
- f"📁 Copying custom redis.conf from {custom_redis_conf_path} to {remote_redis_conf_path}"
151
- )
152
-
153
- copy_result = copy_file_to_remote_setup(
154
- server_public_ip,
155
- username,
156
- private_key,
157
- custom_redis_conf_path,
158
- remote_redis_conf_path,
159
- None,
160
- db_ssh_port,
161
- False, # don't continue on error
162
- )
163
-
164
- if not copy_result:
165
- logging.error("❌ Failed to copy redis.conf to remote host")
166
- return_code = 1
167
- return (None, None, None, [], [], return_code, None, None)
168
- else:
169
- logging.info(
170
- f"✅ Successfully copied redis.conf to {remote_redis_conf_path}"
171
- )
172
-
173
- if custom_redis_server_path:
174
- # Convert relative paths to absolute paths
175
- custom_redis_server_path = os.path.abspath(
176
- os.path.expanduser(custom_redis_server_path)
177
- )
178
-
179
- if not os.path.exists(custom_redis_server_path):
180
- logging.error(
181
- f"❌ Custom redis-server binary not found: {custom_redis_server_path}"
182
- )
183
- return_code = 1
184
- return (None, None, None, [], [], return_code, None, None)
185
-
186
- remote_redis_server_path = "/tmp/redis-server"
187
- logging.info(
188
- f"📁 Copying custom redis-server binary from {custom_redis_server_path} to {remote_redis_server_path}"
189
- )
190
-
191
- copy_result = copy_file_to_remote_setup(
192
- server_public_ip,
193
- username,
194
- private_key,
195
- custom_redis_server_path,
196
- remote_redis_server_path,
197
- None,
198
- db_ssh_port,
199
- False, # don't continue on error
200
- )
201
-
202
- if not copy_result:
203
- logging.error("❌ Failed to copy redis-server binary to remote host")
204
- return_code = 1
205
- return (None, None, None, [], [], return_code, None, None)
206
-
207
- # Make the binary executable
208
- chmod_commands = [f"chmod +x {remote_redis_server_path}"]
209
- chmod_results = execute_remote_commands(
210
- server_public_ip, username, private_key, chmod_commands, db_ssh_port
211
- )
212
-
213
- recv_exit_status, stdout, stderr = chmod_results[0]
214
- if recv_exit_status != 0:
215
- logging.warning(
216
- f"⚠️ Failed to make redis-server binary executable: {stderr}"
217
- )
218
- else:
219
- logging.info(
220
- f"✅ Successfully copied and made executable: {remote_redis_server_path}"
221
- )
222
-
223
- # Update the custom paths to use the remote paths
224
- if remote_redis_server_path:
225
- custom_redis_server_path = remote_redis_server_path
226
- if remote_redis_conf_path:
227
- custom_redis_conf_path = remote_redis_conf_path
228
-
229
117
  full_logfiles = []
230
118
  cluster_enabled = False
231
119
  if setup_type == "oss-cluster":
@@ -319,8 +207,6 @@ def remote_db_spin(
319
207
  db_ssh_port,
320
208
  modules_configuration_parameters_map,
321
209
  redis_7,
322
- custom_redis_server_path,
323
- custom_redis_conf_path,
324
210
  )
325
211
  full_logfiles.append(full_logfile)
326
212
  local_redis_conn, ssh_tunnel = ssh_tunnel_redisconn(
@@ -4,7 +4,6 @@
4
4
  # All rights reserved.
5
5
  #
6
6
  import logging
7
- import os
8
7
  import random
9
8
  import string
10
9
  import sys
@@ -35,7 +34,7 @@ from redisbench_admin.run.common import (
35
34
  )
36
35
  from redisbench_admin.run.git import git_vars_crosscheck
37
36
  from redisbench_admin.run.grafana import generate_artifacts_table_grafana_redis
38
- from redisbench_admin.run.modules import redis_modules_check, redis_files_check
37
+ from redisbench_admin.run.modules import redis_modules_check
39
38
  from redisbench_admin.run.redistimeseries import (
40
39
  timeseries_test_sucess_flow,
41
40
  timeseries_test_failure_flow,
@@ -229,25 +228,6 @@ def run_remote_command_logic(args, project_name, project_version):
229
228
  )
230
229
  )
231
230
 
232
- # Validate Redis server binary and config file paths early
233
- redis_files_check_status, redis_error_message = redis_files_check(
234
- args.redis_server_binary, args.redis_conf
235
- )
236
- if redis_files_check_status is False:
237
- if webhook_notifications_active:
238
- failure_reason = redis_error_message
239
- generate_failure_notification(
240
- webhook_client_slack,
241
- ci_job_name,
242
- ci_job_link,
243
- failure_reason,
244
- tf_github_org,
245
- tf_github_repo,
246
- tf_github_branch,
247
- None,
248
- )
249
- exit(1)
250
-
251
231
  common_properties_log(
252
232
  tf_bin_path,
253
233
  tf_github_actor,
@@ -290,31 +270,6 @@ def run_remote_command_logic(args, project_name, project_version):
290
270
  logging.error("❌ --spin-test requires server_public_ip in --inventory")
291
271
  exit(1)
292
272
 
293
- # Load benchmark config from defaults.yml
294
- benchmark_config = None
295
-
296
- # Try to load defaults.yml
297
- defaults_file = (
298
- args.defaults_filename
299
- if hasattr(args, "defaults_filename")
300
- else "defaults.yml"
301
- )
302
- if os.path.exists(defaults_file):
303
- try:
304
- import yaml
305
-
306
- with open(defaults_file, "r") as config_file:
307
- defaults_config = yaml.safe_load(config_file)
308
- if defaults_config:
309
- benchmark_config = defaults_config
310
- logging.info(f"📋 Loaded configuration from {defaults_file}")
311
- except Exception as e:
312
- logging.warning(f"⚠️ Failed to load defaults config: {e}")
313
- else:
314
- logging.info(
315
- f"📋 No {defaults_file} found - proceeding without install_steps"
316
- )
317
-
318
273
  # Run spin test
319
274
  success = spin_test_standalone_redis(
320
275
  server_public_ip=server_public_ip,
@@ -327,7 +282,6 @@ def run_remote_command_logic(args, project_name, project_version):
327
282
  modules_configuration_parameters_map=None,
328
283
  custom_redis_conf_path=args.redis_conf,
329
284
  custom_redis_server_path=args.redis_server_binary,
330
- benchmark_config=benchmark_config,
331
285
  )
332
286
 
333
287
  exit(0 if success else 1)
@@ -339,7 +293,6 @@ def run_remote_command_logic(args, project_name, project_version):
339
293
  exporter_timemetric_path,
340
294
  default_specs,
341
295
  clusterconfig,
342
- _,
343
296
  ) = prepare_benchmark_definitions(args)
344
297
 
345
298
  return_code = 0
@@ -685,8 +638,6 @@ def run_remote_command_logic(args, project_name, project_version):
685
638
  continue_on_module_check_error,
686
639
  60,
687
640
  architecture,
688
- args.redis_server_binary,
689
- args.redis_conf,
690
641
  )
691
642
  if benchmark_type == "read-only":
692
643
  ro_benchmark_set(
@@ -13,6 +13,7 @@ from redisbench_admin.utils.remote import (
13
13
  )
14
14
  from redisbench_admin.utils.ssh import SSHSession
15
15
  from redisbench_admin.utils.utils import redis_server_config_module_part
16
+ import tempfile
16
17
 
17
18
 
18
19
  def ensure_redis_server_available(server_public_ip, username, private_key, port=22):
@@ -276,22 +277,9 @@ def spin_up_standalone_remote_redis(
276
277
  port=22,
277
278
  modules_configuration_parameters_map={},
278
279
  redis_7=True,
279
- custom_redis_server_path=None,
280
- custom_redis_conf_path=None,
281
280
  ):
282
- # Ensure redis-server is available before trying to start it (only if not using custom binary)
283
- if custom_redis_server_path is None:
284
- ensure_redis_server_available(server_public_ip, username, private_key, port)
285
- else:
286
- logging.info(
287
- "🔧 Using custom Redis binary - skipping system Redis installation"
288
- )
289
-
290
- # Log what paths we're using
291
- logging.info("🔧 Redis command generation:")
292
- logging.info(f" - Custom server path: {custom_redis_server_path}")
293
- logging.info(f" - Custom config path: {custom_redis_conf_path}")
294
- logging.info(f" - Module files: {remote_module_files}")
281
+ # Ensure redis-server is available before trying to start it
282
+ ensure_redis_server_available(server_public_ip, username, private_key, port)
295
283
 
296
284
  full_logfile, initial_redis_cmd = generate_remote_standalone_redis_cmd(
297
285
  logfile,
@@ -300,8 +288,6 @@ def spin_up_standalone_remote_redis(
300
288
  temporary_dir,
301
289
  modules_configuration_parameters_map,
302
290
  redis_7,
303
- custom_redis_server_path=custom_redis_server_path,
304
- custom_redis_conf_path=custom_redis_conf_path,
305
291
  )
306
292
 
307
293
  # start redis-server
@@ -471,86 +457,6 @@ def generate_remote_standalone_redis_cmd(
471
457
  return full_logfile, initial_redis_cmd
472
458
 
473
459
 
474
- def execute_install_steps(
475
- benchmark_config, server_public_ip, username, private_key, db_ssh_port
476
- ):
477
- """
478
- Execute install_steps from dbconfig and clientconfig sections.
479
-
480
- Args:
481
- benchmark_config: The benchmark configuration dictionary
482
- server_public_ip: IP address of the remote server
483
- username: SSH username
484
- private_key: Path to SSH private key
485
- db_ssh_port: SSH port
486
- """
487
- install_commands = []
488
-
489
- # Extract install_steps from dbconfig
490
- if "dbconfig" in benchmark_config:
491
- dbconfig = benchmark_config["dbconfig"]
492
- if isinstance(dbconfig, list):
493
- for config_item in dbconfig:
494
- if "install_steps" in config_item:
495
- steps = config_item["install_steps"]
496
- if isinstance(steps, list):
497
- install_commands.extend(steps)
498
- logging.info(f"📦 Found {len(steps)} install steps in dbconfig")
499
- elif isinstance(dbconfig, dict):
500
- if "install_steps" in dbconfig:
501
- steps = dbconfig["install_steps"]
502
- if isinstance(steps, list):
503
- install_commands.extend(steps)
504
- logging.info(f"📦 Found {len(steps)} install steps in dbconfig")
505
-
506
- # Extract install_steps from clientconfig
507
- if "clientconfig" in benchmark_config:
508
- clientconfig = benchmark_config["clientconfig"]
509
- if isinstance(clientconfig, list):
510
- for config_item in clientconfig:
511
- if "install_steps" in config_item:
512
- steps = config_item["install_steps"]
513
- if isinstance(steps, list):
514
- install_commands.extend(steps)
515
- logging.info(
516
- f"📦 Found {len(steps)} install steps in clientconfig"
517
- )
518
- elif isinstance(clientconfig, dict):
519
- if "install_steps" in clientconfig:
520
- steps = clientconfig["install_steps"]
521
- if isinstance(steps, list):
522
- install_commands.extend(steps)
523
- logging.info(f"📦 Found {len(steps)} install steps in clientconfig")
524
-
525
- # Execute all install commands
526
- if install_commands:
527
- logging.info(f"🔧 Executing {len(install_commands)} installation commands...")
528
- for i, command in enumerate(install_commands, 1):
529
- logging.info(f"📋 Step {i}/{len(install_commands)}: {command}")
530
-
531
- install_result = execute_remote_commands(
532
- server_public_ip, username, private_key, install_commands, db_ssh_port
533
- )
534
-
535
- # Check results
536
- for i, (recv_exit_status, stdout, stderr) in enumerate(install_result):
537
- if recv_exit_status != 0:
538
- logging.warning(
539
- f"⚠️ Install step {i+1} returned exit code {recv_exit_status}"
540
- )
541
- logging.warning(f"Command: {install_commands[i]}")
542
- if stderr:
543
- logging.warning(f"STDERR: {''.join(stderr).strip()}")
544
- if stdout:
545
- logging.warning(f"STDOUT: {''.join(stdout).strip()}")
546
- else:
547
- logging.info(f"✅ Install step {i+1} completed successfully")
548
-
549
- logging.info("🎯 All installation steps completed")
550
- else:
551
- logging.info("📦 No install_steps found in configuration")
552
-
553
-
554
460
  def spin_test_standalone_redis(
555
461
  server_public_ip,
556
462
  username,
@@ -562,7 +468,6 @@ def spin_test_standalone_redis(
562
468
  modules_configuration_parameters_map=None,
563
469
  custom_redis_conf_path=None,
564
470
  custom_redis_server_path=None,
565
- benchmark_config=None,
566
471
  ):
567
472
  """
568
473
  Setup standalone Redis server, run INFO SERVER, print output as markdown and exit.
@@ -589,12 +494,6 @@ def spin_test_standalone_redis(
589
494
  server_public_ip, username, private_key, create_dir_commands, db_ssh_port
590
495
  )
591
496
 
592
- # Execute install_steps from dbconfig and clientconfig if present
593
- if benchmark_config is not None:
594
- execute_install_steps(
595
- benchmark_config, server_public_ip, username, private_key, db_ssh_port
596
- )
597
-
598
497
  # Ensure Redis server is available (only if not using custom binary)
599
498
  if custom_redis_server_path is None:
600
499
  ensure_redis_server_available(
@@ -610,21 +509,14 @@ def spin_test_standalone_redis(
610
509
  remote_redis_server_path = None
611
510
 
612
511
  if custom_redis_conf_path:
613
- # Convert relative paths to absolute paths
614
- custom_redis_conf_path = os.path.abspath(
615
- os.path.expanduser(custom_redis_conf_path)
616
- )
617
-
618
512
  if not os.path.exists(custom_redis_conf_path):
619
513
  logging.error(
620
514
  f"❌ Custom redis.conf file not found: {custom_redis_conf_path}"
621
515
  )
622
516
  return False
623
517
 
624
- remote_redis_conf_path = "/tmp/redis.conf"
625
- logging.info(
626
- f"📁 Copying custom redis.conf from {custom_redis_conf_path} to {remote_redis_conf_path}"
627
- )
518
+ remote_redis_conf_path = f"{temporary_dir}/redis.conf"
519
+ logging.info(f"📁 Copying custom redis.conf to remote host...")
628
520
 
629
521
  copy_result = copy_file_to_remote_setup(
630
522
  server_public_ip,
@@ -640,27 +532,16 @@ def spin_test_standalone_redis(
640
532
  if not copy_result:
641
533
  logging.error("❌ Failed to copy redis.conf to remote host")
642
534
  return False
643
- else:
644
- logging.info(
645
- f"✅ Successfully copied redis.conf to {remote_redis_conf_path}"
646
- )
647
535
 
648
536
  if custom_redis_server_path:
649
- # Convert relative paths to absolute paths
650
- custom_redis_server_path = os.path.abspath(
651
- os.path.expanduser(custom_redis_server_path)
652
- )
653
-
654
537
  if not os.path.exists(custom_redis_server_path):
655
538
  logging.error(
656
539
  f"❌ Custom redis-server binary not found: {custom_redis_server_path}"
657
540
  )
658
541
  return False
659
542
 
660
- remote_redis_server_path = "/tmp/redis-server"
661
- logging.info(
662
- f"📁 Copying custom redis-server binary from {custom_redis_server_path} to {remote_redis_server_path}"
663
- )
543
+ remote_redis_server_path = f"{temporary_dir}/redis-server"
544
+ logging.info(f"📁 Copying custom redis-server binary to remote host...")
664
545
 
665
546
  copy_result = copy_file_to_remote_setup(
666
547
  server_public_ip,
@@ -689,9 +570,7 @@ def spin_test_standalone_redis(
689
570
  f"⚠️ Failed to make redis-server binary executable: {stderr}"
690
571
  )
691
572
  else:
692
- logging.info(
693
- f"✅ Successfully copied and made executable: {remote_redis_server_path}"
694
- )
573
+ logging.info("✅ Redis-server binary made executable")
695
574
 
696
575
  # Copy modules if provided
697
576
  remote_module_files = None
@@ -718,14 +597,7 @@ def spin_test_standalone_redis(
718
597
 
719
598
  # Generate Redis startup command
720
599
  logfile = "redis-spin-test.log"
721
-
722
- # Log what paths we're using
723
- logging.info("🔧 Redis command generation:")
724
- logging.info(f" - Custom server path: {remote_redis_server_path}")
725
- logging.info(f" - Custom config path: {remote_redis_conf_path}")
726
- logging.info(f" - Module files: {remote_module_files}")
727
-
728
- _, redis_cmd = generate_remote_standalone_redis_cmd(
600
+ full_logfile, redis_cmd = generate_remote_standalone_redis_cmd(
729
601
  logfile,
730
602
  redis_configuration_parameters,
731
603
  remote_module_files,
@@ -817,8 +689,8 @@ def spin_test_standalone_redis(
817
689
  "Disk Space",
818
690
  ]
819
691
 
820
- for label, (recv_exit_status, stdout, stderr) in zip(
821
- system_labels, system_results
692
+ for i, (label, (recv_exit_status, stdout, stderr)) in enumerate(
693
+ zip(system_labels, system_results)
822
694
  ):
823
695
  if recv_exit_status == 0 and stdout:
824
696
  output = "".join(stdout).strip()
@@ -75,12 +75,11 @@ def prepare_benchmark_definitions(args):
75
75
  exporter_timemetric_path,
76
76
  default_specs,
77
77
  clusterconfig,
78
- default_dbconfig,
79
78
  ) = get_defaults(defaults_filename)
80
79
  for usecase_filename in files:
81
80
  with open(usecase_filename, "r", encoding="utf8") as stream:
82
81
  test_result, benchmark_config, test_name = get_final_benchmark_config(
83
- default_kpis, default_remote, stream, usecase_filename, default_dbconfig
82
+ default_kpis, default_remote, stream, usecase_filename
84
83
  )
85
84
  result &= test_result
86
85
  if test_result:
@@ -92,7 +91,6 @@ def prepare_benchmark_definitions(args):
92
91
  exporter_timemetric_path,
93
92
  default_specs,
94
93
  clusterconfig,
95
- default_dbconfig,
96
94
  )
97
95
 
98
96
 
@@ -118,7 +116,6 @@ def get_defaults(defaults_filename):
118
116
  default_remote = None
119
117
  default_specs = None
120
118
  cluster_config = None
121
- default_dbconfig = None
122
119
  if os.path.exists(defaults_filename):
123
120
  with open(defaults_filename, "r") as stream:
124
121
  logging.info(
@@ -131,7 +128,6 @@ def get_defaults(defaults_filename):
131
128
  exporter_timemetric_path,
132
129
  default_specs,
133
130
  cluster_config,
134
- default_dbconfig,
135
131
  ) = process_default_yaml_properties_file(
136
132
  default_kpis,
137
133
  default_remote,
@@ -147,13 +143,10 @@ def get_defaults(defaults_filename):
147
143
  exporter_timemetric_path,
148
144
  default_specs,
149
145
  cluster_config,
150
- default_dbconfig,
151
146
  )
152
147
 
153
148
 
154
- def get_final_benchmark_config(
155
- default_kpis, default_remote, stream, usecase_filename, default_dbconfig=None
156
- ):
149
+ def get_final_benchmark_config(default_kpis, default_remote, stream, usecase_filename):
157
150
  result = False
158
151
  benchmark_config = None
159
152
  test_name = None
@@ -170,12 +163,6 @@ def get_final_benchmark_config(
170
163
  merge_default_and_specific_properties_dict_type(
171
164
  benchmark_config, default_remote, kpis_keyname, usecase_filename
172
165
  )
173
- # Merge dbconfig from defaults
174
- dbconfig_keyname = "dbconfig"
175
- if default_dbconfig is not None:
176
- merge_dbconfig_properties(
177
- benchmark_config, default_dbconfig, dbconfig_keyname, usecase_filename
178
- )
179
166
  test_name = benchmark_config["name"]
180
167
  result = True
181
168
  except Exception as e:
@@ -189,56 +176,6 @@ def get_final_benchmark_config(
189
176
  return result, benchmark_config, test_name
190
177
 
191
178
 
192
- def merge_dbconfig_properties(
193
- benchmark_config, default_dbconfig, dbconfig_keyname, usecase_filename
194
- ):
195
- """
196
- Merge dbconfig properties from defaults with benchmark-specific dbconfig.
197
- Handles both list and dict formats for dbconfig sections.
198
- """
199
- if dbconfig_keyname not in benchmark_config:
200
- # No local dbconfig, use defaults entirely
201
- benchmark_config[dbconfig_keyname] = default_dbconfig
202
- logging.info(
203
- f"Using exclusively default '{dbconfig_keyname}' properties from {usecase_filename}"
204
- )
205
- else:
206
- # Merge defaults with local dbconfig
207
- local_dbconfig = benchmark_config[dbconfig_keyname]
208
-
209
- # Convert both to list format for consistent merging
210
- if isinstance(default_dbconfig, dict):
211
- default_list = [default_dbconfig]
212
- else:
213
- default_list = default_dbconfig
214
-
215
- if isinstance(local_dbconfig, dict):
216
- local_list = [local_dbconfig]
217
- else:
218
- local_list = local_dbconfig
219
-
220
- # Merge: defaults first, then local (local takes precedence for conflicts)
221
- merged_list = []
222
-
223
- # Add all default items
224
- for item in default_list:
225
- merged_list.append(item)
226
-
227
- # Add local items
228
- for item in local_list:
229
- merged_list.append(item)
230
-
231
- # Convert back to original format if local was dict
232
- if isinstance(local_dbconfig, dict) and len(merged_list) == 1:
233
- benchmark_config[dbconfig_keyname] = merged_list[0]
234
- else:
235
- benchmark_config[dbconfig_keyname] = merged_list
236
-
237
- logging.info(
238
- f"Merged default and local '{dbconfig_keyname}' properties for {usecase_filename}"
239
- )
240
-
241
-
242
179
  def merge_default_and_specific_properties_dict_type(
243
180
  benchmark_config, default_properties, propertygroup_keyname, usecase_filename
244
181
  ):
@@ -348,7 +285,6 @@ def process_default_yaml_properties_file(
348
285
  default_config = yaml.safe_load(stream)
349
286
  default_specs = None
350
287
  cluster_config = None
351
- default_dbconfig = None
352
288
  default_metrics, exporter_timemetric_path = extract_exporter_metrics(default_config)
353
289
  if "remote" in default_config:
354
290
  logging.info(
@@ -364,13 +300,6 @@ def process_default_yaml_properties_file(
364
300
  )
365
301
  )
366
302
  default_kpis = default_config["kpis"]
367
- if "dbconfig" in default_config:
368
- logging.info(
369
- "Loading default DBCONFIG specifications from file: {}".format(
370
- defaults_filename
371
- )
372
- )
373
- default_dbconfig = default_config["dbconfig"]
374
303
  if "spec" in default_config:
375
304
  logging.info(
376
305
  "Loading default setup SPECs from file: {}".format(defaults_filename)
@@ -390,7 +319,6 @@ def process_default_yaml_properties_file(
390
319
  exporter_timemetric_path,
391
320
  default_specs,
392
321
  cluster_config,
393
- default_dbconfig,
394
322
  )
395
323
 
396
324
 
@@ -57,46 +57,8 @@ def get_git_root(path):
57
57
 
58
58
  def view_bar_simple(a, b):
59
59
  res = a / int(b) * 100
60
- # Only update progress every 5% to reduce output frequency
61
- if not hasattr(view_bar_simple, "last_percent"):
62
- view_bar_simple.last_percent = 0
63
-
64
- if res - view_bar_simple.last_percent >= 5.0 or res >= 100.0:
65
- sys.stdout.write("\r Complete percent: %.2f %%" % res)
66
- sys.stdout.flush()
67
- view_bar_simple.last_percent = res
68
-
69
-
70
- class ProgressCallback:
71
- """A more configurable progress callback for file transfers"""
72
-
73
- def __init__(self, update_threshold=5.0, show_bytes=False):
74
- """
75
- Args:
76
- update_threshold: Minimum percentage change before showing update (default: 5.0%)
77
- show_bytes: Whether to show bytes transferred (default: False)
78
- """
79
- self.last_percent = 0
80
- self.update_threshold = update_threshold
81
- self.show_bytes = show_bytes
82
-
83
- def __call__(self, transferred, total):
84
- percent = (transferred / total) * 100
85
-
86
- if (
87
- percent - self.last_percent >= self.update_threshold
88
- or percent >= 100.0
89
- or self.last_percent == 0
90
- ):
91
-
92
- if self.show_bytes:
93
- sys.stdout.write(
94
- f"\r Progress: {percent:.1f}% ({transferred}/{total} bytes)"
95
- )
96
- else:
97
- sys.stdout.write(f"\r Complete percent: {percent:.2f}%%")
98
- sys.stdout.flush()
99
- self.last_percent = percent
60
+ sys.stdout.write("\r Complete percent: %.2f %%" % res)
61
+ sys.stdout.flush()
100
62
 
101
63
 
102
64
  def copy_file_to_remote_setup(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: redisbench-admin
3
- Version: 0.11.49
3
+ Version: 0.11.51
4
4
  Summary: Redis benchmark run helper. A wrapper around Redis and Redis Modules benchmark tools ( ftsb_redisearch, memtier_benchmark, redis-benchmark, aibench, etc... ).
5
5
  Author: filipecosta90
6
6
  Author-email: filipecosta.90@gmail.com
@@ -1,5 +1,5 @@
1
1
  redisbench_admin/__init__.py,sha256=kLgzVDw4-frGXtbJH_WKiwWcXaUZYisYBKYYOeSJWvU,473
2
- redisbench_admin/cli.py,sha256=LAS5qnqScXKhxHYfXWB0mvAYaUYrSurIwadhexEa9g4,7740
2
+ redisbench_admin/cli.py,sha256=nJjxJVw9vdK6sHmY_0WsBaMx_zyvfKMWHb1-QItVJkY,8073
3
3
  redisbench_admin/commands/__init__.py,sha256=mzVrEtqefFdopyzR-W6xx3How95dyZfToGKm1-_YzeY,95
4
4
  redisbench_admin/commands/commands.json.py,sha256=mzVrEtqefFdopyzR-W6xx3How95dyZfToGKm1-_YzeY,95
5
5
  redisbench_admin/compare/__init__.py,sha256=DtBXRp0Q01XgCFmY-1OIePMyyYihVNAjZ1Y8zwqSDN0,101
@@ -15,7 +15,7 @@ redisbench_admin/export/__init__.py,sha256=DtBXRp0Q01XgCFmY-1OIePMyyYihVNAjZ1Y8z
15
15
  redisbench_admin/export/args.py,sha256=v_WjJCNz_LeIFMNwSN6XwRmvSx1K2ys8XS1gK50EM_4,3508
16
16
  redisbench_admin/export/common/__init__.py,sha256=DtBXRp0Q01XgCFmY-1OIePMyyYihVNAjZ1Y8zwqSDN0,101
17
17
  redisbench_admin/export/common/common.py,sha256=LnvXjMLlJRzMTxiFIjrfRFfDx9JJm88OZHu7lnTOpFA,4331
18
- redisbench_admin/export/export.py,sha256=E_suYdkQopVn6HGYMUGl0OvzKlaWcQbemFzdFxSwKy4,11293
18
+ redisbench_admin/export/export.py,sha256=u00NjaCbWhCJ319leVlP4ZkqiqZt5FN4Gbag4Poo23M,11274
19
19
  redisbench_admin/export/google_benchmark/__init__.py,sha256=DtBXRp0Q01XgCFmY-1OIePMyyYihVNAjZ1Y8zwqSDN0,101
20
20
  redisbench_admin/export/google_benchmark/google_benchmark_json_format.py,sha256=OuMaMmmma5VvXA0rcLIQSMxIq81oa5I3xYDFhbWj-IA,1804
21
21
  redisbench_admin/export/memtier_benchmark/__init__.py,sha256=DtBXRp0Q01XgCFmY-1OIePMyyYihVNAjZ1Y8zwqSDN0,101
@@ -33,7 +33,7 @@ redisbench_admin/grafana_api/app.py,sha256=F4bw7ToO9bHB6mj6y9EhiTBxSNzFBHJfWJT7A
33
33
  redisbench_admin/grafana_api/args.py,sha256=7chFoUcTASHsSYLgzGWH6VEP_gtdnvK3AgLC_sR4D6o,1212
34
34
  redisbench_admin/grafana_api/grafana_api.py,sha256=dG17GCYmWRILmy7h3-OiBeGzuNGnRGUv-jqR-7MRiws,1613
35
35
  redisbench_admin/profilers/__init__.py,sha256=DtBXRp0Q01XgCFmY-1OIePMyyYihVNAjZ1Y8zwqSDN0,101
36
- redisbench_admin/profilers/daemon.py,sha256=Y4ZbbH-cRHJk9cvpsb60UZFq_HVHWXtatb7T2vtlRKo,12973
36
+ redisbench_admin/profilers/daemon.py,sha256=xm1P5c0Lv91kllT4DRLDJH4azGuPHtnpgNeGjC6ecpc,12975
37
37
  redisbench_admin/profilers/flamegraph.pl,sha256=Za5XE-1gb_U-nzqwoyRwfe1TB182c64gITa-2klWTTA,35898
38
38
  redisbench_admin/profilers/perf.py,sha256=HtzzMVsXEJa1H7tOAfKlbFYDn2KnxAG_IU9yKPKZB7w,27772
39
39
  redisbench_admin/profilers/perf_daemon_caller.py,sha256=nD97cXmX3JytyafvNMmhUBq40uYrf6vtjdJ1TXZbvVY,4948
@@ -184,7 +184,7 @@ redisbench_admin/run/grafana.py,sha256=iMDgMyJKinpZMTD43rZ1IcRGkadjFjCxaB48mYWkv
184
184
  redisbench_admin/run/memtier_benchmark/__init__.py,sha256=DtBXRp0Q01XgCFmY-1OIePMyyYihVNAjZ1Y8zwqSDN0,101
185
185
  redisbench_admin/run/memtier_benchmark/memtier_benchmark.py,sha256=wTd2olovvFBZ98mOSr6DM5BJsdaiuPteEZzBqeSgbkE,4246
186
186
  redisbench_admin/run/metrics.py,sha256=8EQdcZbCiFB_kIR1WtUQNOPV8y74bZ8Dj51Cv0aR4nk,7556
187
- redisbench_admin/run/modules.py,sha256=ZMV8IKJAzkSqxIk8vDQq-sOYn2fE1Que6w7I9D4P9xQ,4773
187
+ redisbench_admin/run/modules.py,sha256=9To85oDw2tmUNmTDxOgvKls_46oZRcd2cCt6xNjIWiA,1691
188
188
  redisbench_admin/run/redis_benchmark/__init__.py,sha256=DtBXRp0Q01XgCFmY-1OIePMyyYihVNAjZ1Y8zwqSDN0,101
189
189
  redisbench_admin/run/redis_benchmark/redis_benchmark.py,sha256=e-Az2uTlt3z2W4uzlUsdxeT8GITpxpGb-Mjb6JxrSWc,6848
190
190
  redisbench_admin/run/redisgraph_benchmark_go/__init__.py,sha256=DtBXRp0Q01XgCFmY-1OIePMyyYihVNAjZ1Y8zwqSDN0,101
@@ -200,7 +200,7 @@ redisbench_admin/run/ycsb/ycsb.py,sha256=cs5saVH7C4YpDvzhoa15PwEho59qTVR1E90v_FY
200
200
  redisbench_admin/run_async/__init__.py,sha256=DtBXRp0Q01XgCFmY-1OIePMyyYihVNAjZ1Y8zwqSDN0,101
201
201
  redisbench_admin/run_async/async_env.py,sha256=tE1turaaZNHfOaSpGxh62EJWp88zoQFUf3sMbaS7JRA,2408
202
202
  redisbench_admin/run_async/async_terraform.py,sha256=ngOQnECUuC20pZwiJItaiBnzlwT2DiKciPTHtqLURe4,11299
203
- redisbench_admin/run_async/benchmark.py,sha256=ea1V_lNYzsa4EXbh0_Ecsf3IFPlnNzo29Pdho35BgLg,1645
203
+ redisbench_admin/run_async/benchmark.py,sha256=S-dsaWGjgsPQxj8sXAACnbtNw5zlJnRFoo53ULbrMEY,1630
204
204
  redisbench_admin/run_async/log.py,sha256=cD7zfXt0VEmy0b7452HvcAxX_9kVj6Vm213yNdUHP20,95
205
205
  redisbench_admin/run_async/render_files.py,sha256=NMagmx-2hsMET_XN8tkmQz55g-azqW7SjAqaq4GL8F0,2676
206
206
  redisbench_admin/run_async/run_async.py,sha256=g2ZOQqj9vXZYaRyNpJZtgfYyY9tMuRmEv3Hh3qWOUs8,14525
@@ -209,34 +209,34 @@ redisbench_admin/run_local/args.py,sha256=LPpqtx1cH1dkkeHjYlaFnAp_TijxnzPZFO2CmY
209
209
  redisbench_admin/run_local/local_client.py,sha256=gwawMDOBrf7m--uyxu8kMZC5LBiLjbUBSKvzVOdOAas,124
210
210
  redisbench_admin/run_local/local_db.py,sha256=9vINqKOs-wDMFEuEHT0I8KO9YnEo_h4NWNk5da3LwSY,7518
211
211
  redisbench_admin/run_local/local_helpers.py,sha256=JyqLW2-Sbm35BXjxxfOB1yK7ADdLfcVrq08NLNdIwac,7026
212
- redisbench_admin/run_local/run_local.py,sha256=OrzfzCvOcQ1JLGfNZcChE1SsQCUDMHctzOHNF6a-xtA,34845
212
+ redisbench_admin/run_local/run_local.py,sha256=QHnGfVAaVuct7t0WrWyQpbirC3MWX7fQF5-kXU_pJBs,34834
213
213
  redisbench_admin/run_remote/__init__.py,sha256=DtBXRp0Q01XgCFmY-1OIePMyyYihVNAjZ1Y8zwqSDN0,101
214
- redisbench_admin/run_remote/args.py,sha256=P7azI3m5jJJBovD9rLCvFWjVNveMcu7FVZbEUjdDn0c,4866
214
+ redisbench_admin/run_remote/args.py,sha256=Ef32mg1yNYYHL5g59SzIWZqFB__RNLLriPqiucVyoNg,4826
215
215
  redisbench_admin/run_remote/consts.py,sha256=bCMkwyeBD-EmOpoHKni7LjWy5WuaxGJhGhqpi4AL0RQ,386
216
216
  redisbench_admin/run_remote/log.py,sha256=cD7zfXt0VEmy0b7452HvcAxX_9kVj6Vm213yNdUHP20,95
217
217
  redisbench_admin/run_remote/notifications.py,sha256=-W9fLaftEFNfplBl2clHk37jbYxliDbHftQ62khN31k,2157
218
218
  redisbench_admin/run_remote/remote_client.py,sha256=rRmDro1weto01wzqYpId8NMPoizEzSyudXBCjYrBVMs,14128
219
- redisbench_admin/run_remote/remote_db.py,sha256=VNsJmJf7803gsCd_lhwCb37V-xd_mC25TdDMiB3diW8,18972
219
+ redisbench_admin/run_remote/remote_db.py,sha256=EEDeiOZk-godr5EINscEkOJLGWUN3gFfH6RaBzAKbak,14566
220
220
  redisbench_admin/run_remote/remote_env.py,sha256=Ux_0QT1unNRlKl3cakzjG5Px1uuxOOfBoF_pnalx_T8,4936
221
221
  redisbench_admin/run_remote/remote_failures.py,sha256=IOo6DyxarcwwMPCeN4gWB2JrhuC9iBLwq0nCROqr5ak,1567
222
222
  redisbench_admin/run_remote/remote_helpers.py,sha256=skWeGyDJBmyx_UwUekT3N3_nOJvF2-Hvu-E7vKlO9gg,10598
223
- redisbench_admin/run_remote/run_remote.py,sha256=c5utaihKGY42nBTPFraIkW0yYRDHzf1LxsBgCJfNJP4,77264
224
- redisbench_admin/run_remote/standalone.py,sha256=dEidNJIprjRiFQqAAM-drYsks2ZZLjRKLs0Y4bfKe-w,33338
223
+ redisbench_admin/run_remote/run_remote.py,sha256=tZqCu1fTfB5gWooVIEsSDoaVfnVRfxeCpn-RLmYI3IM,75476
224
+ redisbench_admin/run_remote/standalone.py,sha256=OGau_7MpQihbn0U4qa0QmGZnwQ_gJhuxuWiQm9zpp7M,27970
225
225
  redisbench_admin/run_remote/terraform.py,sha256=vV3eWXNwj7vsnFNqUgCir5ueZS4VYopEyzWiTtoSq0Q,4018
226
226
  redisbench_admin/utils/__init__.py,sha256=DtBXRp0Q01XgCFmY-1OIePMyyYihVNAjZ1Y8zwqSDN0,101
227
- redisbench_admin/utils/benchmark_config.py,sha256=71n2gm8ObeCBzNWQ0MLO7zRjIvmIzg7xuSE2-CZygcw,23869
227
+ redisbench_admin/utils/benchmark_config.py,sha256=bC2C6rnj89wkkSlOXyyfe0N15unn_M1t1zfskfVkb98,21387
228
228
  redisbench_admin/utils/local.py,sha256=zUvyVI9LZMT3qyxs1pO3mXL6Bt_1z9EZUGppaRcWNRA,3890
229
229
  redisbench_admin/utils/redisearch.py,sha256=lchUEzpt0zB1rHwlDlw9LLifAnxFWcLP-PePw7TjL-0,1602
230
230
  redisbench_admin/utils/redisgraph_benchmark_go.py,sha256=os7EJt6kBxsFJLKkSoANbjMT7-cEq4-Ns-49alk2Tf8,2048
231
- redisbench_admin/utils/remote.py,sha256=ewjSUX8xsQYolzVPXfaA7y1PWGWL7emwG4W9jspn14Y,43547
231
+ redisbench_admin/utils/remote.py,sha256=RAQ2VxfmlK7swN7ujCuwSI2soGSycjnxbQw_IrLxIFE,42205
232
232
  redisbench_admin/utils/results.py,sha256=uKk3uNJ--bSXlUj_HGQ2OaV6MVqmXJVM8xTzFV6EOw4,3267
233
233
  redisbench_admin/utils/ssh.py,sha256=QW4AwlocMHJt05QMdN_4f8WeDmxiEwR80ny8VBThq6k,6533
234
234
  redisbench_admin/utils/utils.py,sha256=XVSvo1_DdcYwk2jOxL3VPVPbnDnhGYt8ieYfANo6rTo,15085
235
235
  redisbench_admin/watchdog/__init__.py,sha256=cD7zfXt0VEmy0b7452HvcAxX_9kVj6Vm213yNdUHP20,95
236
236
  redisbench_admin/watchdog/args.py,sha256=nKsG1G6ATOZlAMHMtT9u3kXxduKCbejSZ5x8oB_ynZ8,1312
237
237
  redisbench_admin/watchdog/watchdog.py,sha256=0wWYge3x_OMxWrzazNhJif2NK4tKsI963HVZqjczRag,6189
238
- redisbench_admin-0.11.49.dist-info/LICENSE,sha256=AAMtfs82zOOvmG68vILivm6lxi2rcOlGObmA8jzxQvw,10768
239
- redisbench_admin-0.11.49.dist-info/METADATA,sha256=MvW4DsC1oIANjXhnvv5FF6O0HCL_POECirbx8tRDM14,5596
240
- redisbench_admin-0.11.49.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
241
- redisbench_admin-0.11.49.dist-info/entry_points.txt,sha256=UUawXk_AS-PlieKJ1QxPQXGsRLb6OW_F0MtmA1W0KE8,113
242
- redisbench_admin-0.11.49.dist-info/RECORD,,
238
+ redisbench_admin-0.11.51.dist-info/LICENSE,sha256=AAMtfs82zOOvmG68vILivm6lxi2rcOlGObmA8jzxQvw,10768
239
+ redisbench_admin-0.11.51.dist-info/METADATA,sha256=s_FfOPCdXONq0UaPdnaTg_mkhJChk3X9XECkYrzpf4w,5596
240
+ redisbench_admin-0.11.51.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
241
+ redisbench_admin-0.11.51.dist-info/entry_points.txt,sha256=UUawXk_AS-PlieKJ1QxPQXGsRLb6OW_F0MtmA1W0KE8,113
242
+ redisbench_admin-0.11.51.dist-info/RECORD,,