Skip to content

Commit 2961fb5

Browse files
Add airgap option to cli docker triggering
1 parent 6b2e772 commit 2961fb5

File tree

4 files changed

+169
-22
lines changed

4 files changed

+169
-22
lines changed

redis_benchmarks_specification/__builder__/builder.py

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -312,28 +312,7 @@ def builder_process_stream(
312312
if "run_image" in build_config:
313313
run_image = build_config["run_image"]
314314
if docker_air_gap:
315-
airgap_key = "docker:air-gap:{}".format(run_image)
316-
logging.info(
317-
"DOCKER AIR GAP: storing run image named: {} in redis key {}".format(
318-
run_image, airgap_key
319-
)
320-
)
321-
run_image_binary_stream = io.BytesIO()
322-
run_image_docker = docker_client.images.get(run_image)
323-
for chunk in run_image_docker.save():
324-
run_image_binary_stream.write(chunk)
325-
# 7 days expire
326-
binary_exp_secs = 24 * 60 * 60 * 7
327-
res_airgap = conn.set(
328-
airgap_key,
329-
run_image_binary_stream.getbuffer(),
330-
ex=binary_exp_secs,
331-
)
332-
logging.info(
333-
"DOCKER AIR GAP: result of set bin data to {}: {}".format(
334-
airgap_key, res_airgap
335-
)
336-
)
315+
store_airgap_image_redis(conn, docker_client, run_image)
337316

338317
compiler = build_config["compiler"]
339318
cpp_compiler = build_config["cpp_compiler"]
@@ -535,6 +514,31 @@ def builder_process_stream(
535514
return previous_id, new_builds_count, build_stream_fields_arr
536515

537516

517+
def store_airgap_image_redis(conn, docker_client, run_image):
518+
airgap_key = "docker:air-gap:{}".format(run_image)
519+
logging.info(
520+
"DOCKER AIR GAP: storing run image named: {} in redis key {}".format(
521+
run_image, airgap_key
522+
)
523+
)
524+
run_image_binary_stream = io.BytesIO()
525+
run_image_docker = docker_client.images.get(run_image)
526+
for chunk in run_image_docker.save():
527+
run_image_binary_stream.write(chunk)
528+
# 7 days expire
529+
binary_exp_secs = 24 * 60 * 60 * 7
530+
res_airgap = conn.set(
531+
airgap_key,
532+
run_image_binary_stream.getbuffer(),
533+
ex=binary_exp_secs,
534+
)
535+
logging.info(
536+
"DOCKER AIR GAP: result of set bin data to {}: {}".format(
537+
airgap_key, res_airgap
538+
)
539+
)
540+
541+
538542
def generate_benchmark_stream_request(
539543
id,
540544
conn,

redis_benchmarks_specification/__cli__/args.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,12 @@ def spec_cli_args(parser):
136136
parser.add_argument("--id", type=str, default="dockerhub")
137137
parser.add_argument("--mnt_point", type=str, default="")
138138
parser.add_argument("--trigger-unstable-commits", type=bool, default=True)
139+
parser.add_argument(
140+
"--docker-dont-air-gap",
141+
default=False,
142+
action="store_true",
143+
help="Dont store the docker images in redis keys.",
144+
)
139145
parser.add_argument(
140146
"--use-tags",
141147
default=False,

redis_benchmarks_specification/__cli__/cli.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import subprocess
1313
import sys
1414
import tempfile
15+
16+
import docker
1517
import git
1618
import packaging
1719
import redis
@@ -20,6 +22,7 @@
2022

2123
from redis_benchmarks_specification.__builder__.builder import (
2224
generate_benchmark_stream_request,
25+
store_airgap_image_redis,
2326
)
2427
from redis_benchmarks_specification.__common__.github import (
2528
update_comment_if_needed,
@@ -92,6 +95,10 @@ def trigger_tests_dockerhub_cli_command_logic(args, project_name, project_versio
9295
server_name = args.server_name
9396
build_stream_fields["server_name"] = server_name
9497
build_stream_fields["mnt_point"] = args.mnt_point
98+
if args.docker_dont_air_gap is False:
99+
docker_client = docker.from_env()
100+
store_airgap_image_redis(conn, docker_client, args.run_image)
101+
95102
if result is True:
96103
benchmark_stream_id = conn.xadd(
97104
STREAM_KEYNAME_NEW_BUILD_EVENTS, build_stream_fields

utils/tests/test_self_contained_coordinator_memtier.py

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -502,6 +502,7 @@ def test_dockerhub_via_cli():
502502
)
503503
parser = spec_cli_args(parser)
504504
run_args = [
505+
"--docker-dont-air-gap",
505506
"--server_name",
506507
"valkey",
507508
"--run_image",
@@ -609,6 +610,135 @@ def test_dockerhub_via_cli():
609610
assert redis_version == rts.info(hash_key).labels["version"]
610611

611612

613+
def test_dockerhub_via_cli_airgap():
614+
if run_coordinator_tests_dockerhub():
615+
import argparse
616+
617+
db_port = int(os.getenv("DATASINK_PORT", "6379"))
618+
conn = redis.StrictRedis(port=db_port)
619+
conn.ping()
620+
conn.flushall()
621+
redis_version = "7.2.6"
622+
run_image = f"valkey/valkey:{redis_version}-bookworm"
623+
github_org = "valkey"
624+
github_repo = "valkey"
625+
626+
db_port = os.getenv("DATASINK_PORT", "6379")
627+
628+
# should error due to missing --use-tags or --use-branch
629+
parser = argparse.ArgumentParser(
630+
description="test",
631+
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
632+
)
633+
parser = spec_cli_args(parser)
634+
run_args = [
635+
"--server_name",
636+
"valkey",
637+
"--run_image",
638+
run_image,
639+
"--gh_org",
640+
github_org,
641+
"--gh_repo",
642+
github_repo,
643+
"--redis_port",
644+
"{}".format(db_port),
645+
]
646+
args = parser.parse_args(
647+
args=run_args,
648+
)
649+
try:
650+
trigger_tests_dockerhub_cli_command_logic(args, "tool", "v0")
651+
except SystemExit as e:
652+
assert e.code == 0
653+
654+
# confirm request was made via the cli
655+
assert conn.exists(STREAM_KEYNAME_NEW_BUILD_EVENTS)
656+
assert conn.xlen(STREAM_KEYNAME_NEW_BUILD_EVENTS) > 0
657+
running_platform = "fco-ThinkPad-T490"
658+
659+
build_runners_consumer_group_create(conn, running_platform, "0")
660+
datasink_conn = redis.StrictRedis(port=db_port)
661+
docker_client = docker.from_env()
662+
home = str(Path.home())
663+
stream_id = ">"
664+
topologies_map = get_topologies(
665+
"./redis_benchmarks_specification/setups/topologies/topologies.yml"
666+
)
667+
# we use a benchmark spec with smaller CPU limit for client given github machines only contain 2 cores
668+
# and we need 1 core for DB and another for CLIENT
669+
testsuite_spec_files = [
670+
"./utils/tests/test_data/test-suites/test-memtier-dockerhub.yml"
671+
]
672+
defaults_filename = "./utils/tests/test_data/test-suites/defaults.yml"
673+
(
674+
_,
675+
_,
676+
default_metrics,
677+
_,
678+
_,
679+
_,
680+
) = get_defaults(defaults_filename)
681+
682+
(
683+
result,
684+
stream_id,
685+
number_processed_streams,
686+
num_process_test_suites,
687+
) = self_contained_coordinator_blocking_read(
688+
conn,
689+
True,
690+
docker_client,
691+
home,
692+
stream_id,
693+
datasink_conn,
694+
testsuite_spec_files,
695+
topologies_map,
696+
running_platform,
697+
False,
698+
[],
699+
"",
700+
0,
701+
6399,
702+
1,
703+
True,
704+
5,
705+
default_metrics,
706+
"amd64",
707+
None,
708+
0,
709+
10000,
710+
"unstable",
711+
"",
712+
True,
713+
False,
714+
)
715+
716+
assert result == True
717+
assert number_processed_streams == 1
718+
assert num_process_test_suites == 1
719+
by_version_key = f"ci.benchmarks.redislabs/ci/{github_org}/{github_repo}/memtier_benchmark-1Mkeys-load-string-with-10B-values/by.version/{redis_version}/benchmark_end/oss-standalone/memory_maxmemory"
720+
assert datasink_conn.exists(by_version_key)
721+
rts = datasink_conn.ts()
722+
# check we have by version metrics
723+
assert "version" in rts.info(by_version_key).labels
724+
assert redis_version == rts.info(by_version_key).labels["version"]
725+
726+
# get all keys
727+
all_keys = datasink_conn.keys("*")
728+
by_hash_keys = []
729+
for key in all_keys:
730+
if "/by.hash/" in key.decode():
731+
by_hash_keys.append(key)
732+
733+
# ensure we have by hash keys
734+
assert len(by_hash_keys) > 0
735+
for hash_key in by_hash_keys:
736+
# ensure we have both version and hash info on the key
737+
assert "version" in rts.info(hash_key).labels
738+
assert "hash" in rts.info(hash_key).labels
739+
assert redis_version == rts.info(hash_key).labels["version"]
740+
741+
612742
def test_self_contained_coordinator_skip_build_variant():
613743
try:
614744
if run_coordinator_tests():

0 commit comments

Comments
 (0)