Skip to content

Commit db93817

Browse files
committed
[system] Add CLI tool to update SeBS images
1 parent c33e023 commit db93817

File tree

1 file changed

+126
-0
lines changed

1 file changed

+126
-0
lines changed

tools/update_docker_images.py

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
#!/usr/bin/env python3
2+
3+
import argparse
4+
import docker
5+
import json
6+
import os
7+
from typing import Optional
8+
9+
PROJECT_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), os.path.pardir)
10+
DOCKER_DIR = os.path.join(PROJECT_DIR, "dockerfiles")
11+
12+
parser = argparse.ArgumentParser(description="Run local app experiments.")
13+
parser.add_argument(
14+
"--deployment", default=None, choices=["local", "aws", "azure", "gcp", "openwhisk"], action="store"
15+
)
16+
parser.add_argument("--type", default=None, choices=["build", "run", "manage", "function"], action="store")
17+
parser.add_argument("--language", default=None, choices=["python", "nodejs"], action="store")
18+
parser.add_argument("--language-version", default=None, type=str, action="store")
19+
args = parser.parse_args()
20+
config = json.load(open(os.path.join(PROJECT_DIR, "config", "systems.json"), "r"))
21+
repository = config["general"]["docker_repository"]
22+
client = docker.from_env()
23+
24+
def pull(image_name):
25+
26+
image_name = f'{repository}:{image_name}'
27+
previous_sha: Optional[str]
28+
try:
29+
img = client.images.get(image_name)
30+
previous_sha = img.attrs['Id']
31+
except docker.errors.ImageNotFound:
32+
previous_sha = None
33+
print(f"Ignoring not present image: {image_name}")
34+
return
35+
36+
img = client.images.pull(image_name)
37+
38+
if img.attrs['Id'] != previous_sha:
39+
print(f"Updated image: {image_name}")
40+
else:
41+
print(f"Image up-to-date: {image_name}")
42+
43+
def generic_pull(image_type, system, language=None, version=None):
44+
45+
if language is not None and version is not None:
46+
image_name = f"{image_type}.{system}.{language}.{version}"
47+
else:
48+
image_name = f"{image_type}.{system}"
49+
50+
pull(image_name)
51+
52+
benchmarks = {
53+
"python": [
54+
"110.dynamic-html",
55+
"120.uploader",
56+
"210.thumbnailer",
57+
"220.video-processing",
58+
"311.compression",
59+
"411.image-recognition",
60+
"501.graph-pagerank",
61+
"502.graph-mst",
62+
"503.graph-bfs",
63+
"504.dna-visualisation",
64+
],
65+
"nodejs": [
66+
"110.dynamic-html",
67+
"120.uploader",
68+
"210.thumbnailer"
69+
]
70+
}
71+
72+
def pull_function(image_type, system, language, language_version):
73+
74+
for bench in benchmarks[language]:
75+
image_name = f"{image_type}.{system}.{bench}.{language}-{language_version}"
76+
pull(image_name)
77+
78+
def pull_language(system, language, language_config):
79+
configs = []
80+
if "base_images" in language_config:
81+
for version, base_image in language_config["base_images"].items():
82+
if args.language_version is not None and args.language_version == version:
83+
configs.append([version, base_image])
84+
elif args.language_version is None:
85+
configs.append([version, base_image])
86+
else:
87+
configs.append([None, None])
88+
89+
for image in configs:
90+
if args.type is None:
91+
for image_type in language_config["images"]:
92+
93+
if image_type == "function":
94+
pull_function(image_type, system, language, image[0])
95+
else:
96+
generic_pull(image_type, system, language, image[0])
97+
else:
98+
generic_pull(args.type, system, language, image[0])
99+
100+
101+
def pull_systems(system, system_config):
102+
103+
if args.type == "manage":
104+
if "images" in system_config:
105+
generic_pull(args.type, system)
106+
else:
107+
print(f"Skipping manage image for {system}")
108+
else:
109+
if args.language:
110+
pull_language(system, args.language, system_config["languages"][args.language])
111+
else:
112+
for language, language_dict in system_config["languages"].items():
113+
pull_language(system, language, language_dict)
114+
# Build additional types
115+
if "images" in system_config:
116+
for image_type, image_config in system_config["images"].items():
117+
generic_pull(image_type, system)
118+
119+
120+
if args.deployment is None:
121+
for system, system_dict in config.items():
122+
if system == "general":
123+
continue
124+
pull_systems(system, system_dict)
125+
else:
126+
pull_systems(args.deployment, config[args.deployment])

0 commit comments

Comments
 (0)