1313from minio .error import S3Error
1414from os import listdir
1515from os .path import isfile , join
16+ from pathlib import Path
1617from urllib .parse import urlparse
1718
1819
2223@app .command ()
2324def 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
0 commit comments