Skip to content

Commit 4c58e0a

Browse files
authored
Support gardenlinux in the mirror script (#974)
Signed-off-by: Christian Berendt <berendt@osism.tech>
1 parent 4d2b1b1 commit 4c58e0a

File tree

3 files changed

+83
-33
lines changed

3 files changed

+83
-33
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
.tox
2+
__pycache__
23
clouds.yml
34
secure.yml
4-
__pycache__
5+
tmp

contrib/mirror.py

Lines changed: 80 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from minio.error import S3Error
1414
from os import listdir
1515
from os.path import isfile, join
16+
from pathlib import Path
1617
from urllib.parse import urlparse
1718

1819

@@ -22,7 +23,13 @@
2223
@app.command()
2324
def main(
2425
debug: bool = typer.Option(False, "--debug", help="Enable debug logging"),
25-
dry_run: bool = typer.Option(False, "--dry-run", help="Do not perform any changes"),
26+
upload: bool = typer.Option(True, "--upload/--no-upload", help="Upload images"),
27+
download: bool = typer.Option(
28+
True, "--download/--no-download", help="Download images"
29+
),
30+
delete: bool = typer.Option(
31+
True, "--delete/--no-delete", help="Delete images after upload"
32+
),
2633
images: str = typer.Option(
2734
"etc/images/", help="Path to the directory containing all image files"
2835
),
@@ -59,8 +66,7 @@ def main(
5966
result = client.bucket_exists(minio_bucket)
6067
if not result:
6168
logger.error(f"Create bucket '{minio_bucket}' first")
62-
if not dry_run:
63-
sys.exit(1)
69+
sys.exit(1)
6470

6571
onlyfiles = []
6672
for f in listdir(images):
@@ -87,7 +93,7 @@ def main(
8793
continue
8894

8995
if not image["shortname"].startswith(
90-
("almalinux", "centos", "debian", "rocky", "ubuntu")
96+
("almalinux", "centos", "debian", "rocky", "ubuntu", "gardenlinux")
9197
):
9298
continue
9399

@@ -97,56 +103,99 @@ def main(
97103

98104
logger.debug(f"source: {version['url']}")
99105

100-
path = urlparse(version["mirror_url"])
101-
url = urlparse(version["mirror_url"])
106+
source_path = urlparse(version["url"])
107+
mirror_path = urlparse(version["mirror_url"])
108+
109+
mirror_dirname = f"openstack-images/{image['shortname']}"
110+
mirror_filename, mirror_fileextension = os.path.splitext(
111+
os.path.basename(mirror_path.path)
112+
)
113+
_, mirror_fileextension2 = os.path.splitext(mirror_filename)
114+
115+
if not image["shortname"].startswith("gardenlinux"):
116+
mirror_filename = f"{version['version']}-{image['shortname']}"
102117

103-
dirname = f"openstack-images/{image['shortname']}"
104-
filename, fileextension = os.path.splitext(os.path.basename(path.path))
105-
_, fileextension2 = os.path.splitext(filename)
118+
if mirror_fileextension not in [".bz2", ".zip", ".xz", ".gz"]:
119+
mirror_filename += mirror_fileextension
106120

107-
filename = f"{version['version']}-{image['shortname']}"
121+
if mirror_fileextension2 == ".tar":
122+
mirror_filename = os.path.basename(mirror_path.path)
108123

109-
if fileextension not in [".bz2", ".zip", ".xz", ".gz"]:
110-
filename += fileextension
124+
logger.debug(f"mirror dirname: {mirror_dirname}")
125+
logger.debug(f"mirror filename: {mirror_filename}")
111126

112-
if fileextension2 == ".tar":
113-
filename = os.path.basename(url.path)
127+
source_filename, source_fileextension = os.path.splitext(
128+
os.path.basename(source_path.path)
129+
)
130+
_, source_fileextension2 = os.path.splitext(source_filename)
114131

115-
logger.debug(f"dirname: {dirname}")
116-
logger.debug(f"filename: {filename}")
132+
if source_fileextension not in [".bz2", ".zip", ".xz", ".gz"]:
133+
source_filename += source_fileextension
134+
else:
135+
mirror_dirname = os.path.join(mirror_dirname, version["version"])
136+
137+
if source_fileextension2 == ".tar":
138+
source_filename = os.path.basename(source_path.path)
139+
140+
logger.debug(f"source filename: {source_filename}")
117141

118142
try:
119-
client.stat_object(minio_bucket, os.path.join(dirname, filename))
120-
logger.info(f"File {filename} available in bucket {dirname}")
143+
client.stat_object(
144+
minio_bucket, os.path.join(mirror_dirname, mirror_filename)
145+
)
146+
logger.info(
147+
f"File {mirror_filename} available in bucket {mirror_dirname}"
148+
)
121149
except S3Error:
122-
logger.info(f"File {filename} not yet available in bucket {dirname}")
123-
124-
if not dry_run:
125-
if not isfile(os.path.basename(path.path)):
150+
logger.info(
151+
f"File {mirror_filename} not yet available in bucket {mirror_dirname}"
152+
)
153+
154+
if download:
155+
if not isfile(os.path.basename(source_filename)):
156+
logger.info(
157+
f"File {source_filename} not available on local filesystem"
158+
)
126159
logger.info(f"Downloading {version['url']}")
127160
response = requests.get(
128161
version["url"], stream=True, allow_redirects=True
129162
)
130-
with open(os.path.basename(path.path), "wb") as fp:
163+
with open(source_filename, "wb") as fp:
131164
shutil.copyfileobj(response.raw, fp)
132165
del response
133166

134-
if fileextension in [".bz2", ".zip", ".xz", ".gz"]:
135-
logger.info(f"Decompressing {os.path.basename(path.path)}")
167+
if source_fileextension in [".bz2", ".zip", ".xz", ".gz"]:
168+
logger.info(f"Decompressing {source_filename}")
169+
Path("tmp").mkdir(exist_ok=True)
136170
patoolib.extract_archive(
137-
os.path.basename(path.path), outdir="."
171+
os.path.basename(source_filename), outdir="tmp"
138172
)
139-
os.remove(os.path.basename(path.path))
173+
os.remove(source_filename)
174+
shutil.copy(
175+
os.path.join("tmp", mirror_filename), mirror_filename
176+
)
177+
else:
178+
os.rename(source_filename, mirror_filename)
179+
else:
180+
logger.info(
181+
f"Not downloading {source_filename} to local filesystem (download disabled)"
182+
)
183+
184+
if upload:
185+
logger.info(
186+
f"Uploading {mirror_filename} to bucket {mirror_dirname}"
187+
)
140188

141-
logger.info(f"Uploading {filename} to bucket {dirname}")
142189
client.fput_object(
143-
minio_bucket, os.path.join(dirname, filename), filename
190+
minio_bucket,
191+
os.path.join(mirror_dirname, mirror_filename),
192+
mirror_filename,
144193
)
145194

146-
os.remove(filename)
195+
os.remove(mirror_filename)
147196
else:
148197
logger.info(
149-
f"Not uploading {filename} to bucket {dirname} (dry-run enabled)"
198+
f"Not uploading {mirror_filename} to bucket {mirror_dirname} (upload disabled)"
150199
)
151200

152201

etc/images/gardenlinux.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ images:
2626
versions:
2727
- version: '1592.14'
2828
url: https://github.com/gardenlinux/gardenlinux/releases/download/1592.14/openstack-gardener_prod-amd64-1592.14-730f446c.tar.xz
29-
mirror_url: https://nbg1.your-objectstorage.com/osism/openstack-images/gardenlinux/1592.14/openstack-gardener_prod-amd64-1592.14-730f446c
29+
mirror_url: https://nbg1.your-objectstorage.com/osism/openstack-images/gardenlinux/1592.14/openstack-gardener_prod-amd64-1592.14-730f446c.qcow2
3030
checksum: "sha256:71b5a12e172d35bdbb85fe3861b2a35e7dd6b242c8c0a4b986a1c341340e4e23"
3131
build_date: 2025-09-17
3232
- version: '1877.5'

0 commit comments

Comments
 (0)