Skip to content

Commit cb81cc6

Browse files
committed
[container_benchmark] add container image pre pull management
Signed-off-by: Jan Rodák <[email protected]>
1 parent e395050 commit cb81cc6

File tree

6 files changed

+91
-2
lines changed

6 files changed

+91
-2
lines changed

projects/container_bench/testing/config.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,13 @@ prepare:
100100
- glibc-static
101101
- golang
102102

103+
container_images:
104+
pull_images: true
105+
dir: "{@remote_host.base_work_dir}/images"
106+
images:
107+
- "quay.io/podman/hello:latest"
108+
- "registry.fedoraproject.org/fedora:latest"
109+
103110
podman:
104111
# Custom binary or repo version must be disabled for matbenchmarking
105112
custom_binary:
@@ -149,6 +156,7 @@ cleanup:
149156
podman: true
150157
exec_time: true
151158
venv: true
159+
container_images: false
152160

153161
podman_machine:
154162
delete: true

projects/container_bench/testing/config_manager.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,17 @@ class ConfigKeys:
5757
PREPARE_DNF_INSTALL_DEPENDENCIES = "prepare.dnf.install_dependencies"
5858
PREPARE_DNF_ENABLE_DOCKER_REPO = "prepare.dnf.enable_docker_repo"
5959
PREPARE_DNF_DEPENDENCIES = "prepare.dnf.dependencies"
60+
PREPARE_CONTAINER_IMAGES_PULL_IMAGES = "prepare.container_images.pull_images"
61+
PREPARE_CONTAINER_IMAGES_IMAGES = "prepare.container_images.images"
62+
PREPARE_CONTAINER_IMAGES_IMAGES_DIR = "prepare.container_images.dir"
6063

6164
# Additional cleanup configuration
6265
CLEANUP_FILES_EXEC_TIME = "cleanup.files.exec_time"
6366
CLEANUP_FILES_VENV = "cleanup.files.venv"
6467
CLEANUP_PODMAN_MACHINE_DELETE = "cleanup.podman_machine.delete"
6568
CLEANUP_DOCKER_SERVICE_STOP = "cleanup.docker_service.stop"
6669
CLEANUP_DOCKER_DESKTOP_STOP = "cleanup.docker_desktop.stop"
70+
CLEANUP_CONTAINER_IMAGES = "cleanup.files.container_images"
6771

6872
# Additional remote host configuration
6973
REMOTE_HOST_DOCKER_ENABLED = "remote_host.docker.enabled"
@@ -193,6 +197,17 @@ def get_dnf_config():
193197
'dependencies': config.project.get_config(ConfigKeys.PREPARE_DNF_DEPENDENCIES, print=False),
194198
}
195199

200+
@staticmethod
201+
def get_container_images_config():
202+
return {
203+
'pull_images': config.project.get_config(
204+
ConfigKeys.PREPARE_CONTAINER_IMAGES_PULL_IMAGES, print=False),
205+
'images': config.project.get_config(
206+
ConfigKeys.PREPARE_CONTAINER_IMAGES_IMAGES, print=False),
207+
'dir': config.project.get_config(
208+
ConfigKeys.PREPARE_CONTAINER_IMAGES_IMAGES_DIR, print=False),
209+
}
210+
196211
@staticmethod
197212
def get_extended_cleanup_config():
198213
return {
@@ -205,6 +220,8 @@ def get_extended_cleanup_config():
205220
ConfigKeys.CLEANUP_DOCKER_SERVICE_STOP, print=False),
206221
'docker_desktop_stop': config.project.get_config(
207222
ConfigKeys.CLEANUP_DOCKER_DESKTOP_STOP, print=False),
223+
'container_images': config.project.get_config(
224+
ConfigKeys.CLEANUP_CONTAINER_IMAGES, print=False),
208225
}
209226

210227
@staticmethod

projects/container_bench/testing/container_engine.py

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from pathlib import Path
12
import remote_access
23
import json
34
import logging
@@ -75,6 +76,32 @@ def get_command(self):
7576

7677
return cmd
7778

79+
def store_container_images_as_tar(self):
80+
container_images_config = ConfigManager.get_container_images_config()
81+
pull_images = container_images_config['pull_images']
82+
images = container_images_config['images']
83+
images_dir = container_images_config['dir']
84+
dest = Path(images_dir)
85+
86+
if not pull_images:
87+
logging.info("Skipping pulling container images as per configuration.")
88+
return
89+
90+
if not remote_access.exists(dest):
91+
logging.info(f"Creating images directory at {dest} ...")
92+
remote_access.create_remote_directory(dest)
93+
94+
for image in images:
95+
logging.info(f"Pulling container image: {image} ...")
96+
image_filename = image.replace("/", "_").replace(":", "_").replace(".", "_") + ".tar"
97+
if remote_access.exists(dest / image_filename):
98+
continue
99+
cmd = f"{self.get_command()} pull {image}"
100+
remote_access.run_with_ansible_ssh_conf(self.base_work_dir, cmd)
101+
cmd = f"{self.get_command()} save -o {dest / image_filename} {image}"
102+
remote_access.run_with_ansible_ssh_conf(self.base_work_dir, cmd)
103+
self.rm_images(images)
104+
78105
def is_rootful(self):
79106
if ConfigManager.is_linux():
80107
return self.podman_config['linux_rootful']
@@ -100,10 +127,10 @@ def cleanup(self):
100127

101128
return ret.returncode == 0
102129

103-
def rm_image(self, image):
130+
def rm_images(self, images):
104131
ret = remote_access.run_with_ansible_ssh_conf(
105132
self.base_work_dir,
106-
f"{self.get_command()} image rm {image}",
133+
f"{self.get_command()} image rm {' '.join(images)}",
107134
check=False,
108135
capture_stdout=True,
109136
capture_stderr=True,

projects/container_bench/testing/prepare.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ def cleanup():
4949
logging.info("Cleaning up Podman files")
5050
utils.cleanup_podman_files(remote_access.prepare())
5151

52+
if cleanup_config['container_images']:
53+
logging.info("Cleaning up container images")
54+
utils.cleanup_container_images(remote_access.prepare())
55+
5256
cleanup_docker_platform()
5357
return 0
5458

@@ -119,6 +123,7 @@ def prepare_docker_platform():
119123
docker_desktop.start()
120124

121125
docker = ContainerEngine("docker")
126+
docker.store_container_images_as_tar()
122127
docker.cleanup()
123128

124129

@@ -162,6 +167,7 @@ def prepare_podman_platform():
162167

163168
logging.info("cleaning up podman")
164169
podman = ContainerEngine("podman")
170+
podman.store_container_images_as_tar()
165171
podman.cleanup()
166172

167173
return 0

projects/container_bench/testing/remote_access.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,3 +302,24 @@ def exists(path):
302302
return exists_windows(path)
303303
else:
304304
return exists_unix(path)
305+
306+
307+
def create_remote_directory(path):
308+
if config.project.get_config("remote_host.run_locally", print=False):
309+
path.mkdir(parents=True, exist_ok=True)
310+
return
311+
312+
base_work_dir = prepare()
313+
314+
if ConfigManager.is_windows():
315+
run_with_ansible_ssh_conf_windows(
316+
base_work_dir,
317+
f"New-Item -ItemType Directory -Path '{path}' -Force",
318+
check=True,
319+
)
320+
else:
321+
run_with_ansible_ssh_conf_unix(
322+
base_work_dir,
323+
f"mkdir -p {shlex.quote(str(path))}",
324+
check=True,
325+
)

projects/container_bench/testing/utils.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,16 @@ def cleanup_podman_files(base_work_dir):
9696
prepare.remove_remote_file(base_work_dir, dest, recursive=True)
9797

9898

99+
def cleanup_container_images(base_work_dir):
100+
container_images_config = ConfigManager.get_container_images_config()
101+
images_dir = container_images_config['dir']
102+
dest = Path(images_dir)
103+
104+
if remote_access.exists(dest):
105+
logging.info(f"Removing container images directory {dest} ...")
106+
prepare.remove_remote_file(base_work_dir, dest, recursive=True)
107+
108+
99109
def parse_platform(platform_str):
100110
p = SimpleNamespace()
101111
p.container_engine = platform_str

0 commit comments

Comments
 (0)