33import os
44import re
55import sys
6- from collections import defaultdict
7- from collections import OrderedDict
6+ from collections import defaultdict , OrderedDict
87
98import click
109import jinja2
1110import requests
12- from packaging import version
1311import validators
14-
12+ from packaging import version
1513
1614OS_URI = "https://releases.openstack.org/{}"
1715RPM_OS_URI_MAPPING = {
5654 re .compile (r"^[-_\w]+[-_]tempest[-_]plugin$" ), # *-tempest-plugin
5755]
5856OPENEULER_DEFAULT_REPLACE = re .compile (r"[._]" )
59- PROXY = {}
57+ REQUESTS_ARGS = {}
6058
6159
6260class ReleasesConfig :
6361 def __init__ (self , content , arch ):
6462 if not isinstance (content , str ):
6563 raise RuntimeError ('Input Error' )
6664 self .releases = [r .strip () for r in content .split (',' ) if r ]
67- self .releases_config = dict ()
65+ self .releases_config = {}
6866 for release in self .releases :
6967 from_os_version , to_os_version = release .split ('/' , 1 )
70- self .releases_config [release ] = dict ()
71- self .releases_config [release ]['rpm_os_ver_uri' ] = list ()
68+ self .releases_config [release ] = {}
69+ self .releases_config [release ]['rpm_os_ver_uri' ] = []
7270 self .releases_config [release ]['os_ver_uri' ] = [
7371 OS_URI .format (from_os_version ), ]
7472 # Get URL template
7573 for _to_version_tuple in RPM_OS_URI_MAPPING .keys ():
7674 if to_os_version in _to_version_tuple :
77- _url = RPM_OS_URI_MAPPING . get ( _to_version_tuple )
75+ _url = RPM_OS_URI_MAPPING [ _to_version_tuple ]
7876 if isinstance (_url , dict ):
7977 _url = _url [from_os_version ]
8078 break
8179 # openstack vs openstack
8280 else :
83- self .release_config [release ]['os_ver_url' ].append (
81+ self .releases_config [release ]['os_ver_url' ].append (
8482 OS_URI .format (to_os_version ))
8583 return
8684
@@ -134,18 +132,18 @@ def render(self):
134132 for pkg_name , pkg_info in _value ['data' ].items ():
135133 output += "{:<30} {:<15} {:<15} {:<15}\n " .format (
136134 pkg_name ,
137- pkg_info . get ( 'base_package_version' ) ,
138- str (pkg_info . get ( 'comparison_package_version' ) ),
139- pkg_info . get ( 'status' ) )
135+ pkg_info [ 'base_package_version' ] ,
136+ str (pkg_info [ 'comparison_package_version' ] ),
137+ pkg_info [ 'status' ] )
140138 output += "\n "
141139 if "html" == self .file_format :
142- SHA_TZ = datetime .timezone (
140+ sha_tz = datetime .timezone (
143141 datetime .timedelta (hours = 8 ),
144142 name = 'Asia/Shanghai' ,
145143 )
146144 utc_now = datetime .datetime .utcnow ().replace (
147145 tzinfo = datetime .timezone .utc )
148- xian_now = utc_now .astimezone (SHA_TZ )
146+ xian_now = utc_now .astimezone (sha_tz )
149147 output = jinja2 .Environment (
150148 loader = jinja2 .FileSystemLoader (
151149 self .template_path )).get_template (self .template ).render (
@@ -170,7 +168,7 @@ def __init__(self, _rpm_os_ver_uri_list):
170168 def rpm_versions (self ):
171169 results = dict ()
172170 for _rpm_os_ver_uri in self .rpm_os_ver_uri_list :
173- r = requests .get (_rpm_os_ver_uri , proxies = PROXY , verify = False )
171+ r = requests .get (_rpm_os_ver_uri , ** REQUESTS_ARGS )
174172 if r .status_code != requests .codes .ok :
175173 raise RuntimeError ('CAN NOT GET {}' .format (_rpm_os_ver_uri ))
176174 uri_content = r .content .decode ()
@@ -189,25 +187,24 @@ def rpm_versions(self):
189187 results [pkg_name ] = pkg_info
190188 else :
191189 # if current version < new version, then update it
192- if version .parse (results . get ( pkg_name ). get ( 'version' ) ) \
190+ if version .parse (results [ pkg_name ][ 'version' ] ) \
193191 < version .parse (pkg_ver ):
194- results . get ( pkg_name ) .update (version = pkg_ver )
192+ results [ pkg_name ] .update (version = pkg_ver )
195193 return results
196194
197195
198196class UpstreamVersions :
199197 def __init__ (self , _os_ver_uri ):
200198 self .url_os_content = requests .get (_os_ver_uri ,
201- proxies = PROXY ,
202- verify = False ).content .decode ()
199+ ** REQUESTS_ARGS ).content .decode ()
203200
204201 @property
205202 def upstream_versions (self ):
206203 # get all links, which ends .tar.gz from HTML
207204 links = re .findall (r'https://.*\.tar\.gz' , self .url_os_content )
208205 results = dict ()
209206 for pkg_link in links :
210- # get name and package informations from link
207+ # get name and package information from link
211208 tmp = pkg_link .split ("/" )
212209 pkg_full_name = tmp [4 ]
213210 pkg_name = pkg_full_name [0 :pkg_full_name .rfind ('-' )]
@@ -220,9 +217,9 @@ def upstream_versions(self):
220217 results [pkg_name ] = pkg_info
221218 else :
222219 # if current versions < new version, then update it
223- if version .parse (results . get ( pkg_name ). get ( 'version' ) ) \
220+ if version .parse (results [ pkg_name ][ 'version' ] ) \
224221 < version .parse (pkg_ver ):
225- results . get ( pkg_name ) .update (version = pkg_ver )
222+ results [ pkg_name ] .update (version = pkg_ver )
226223 return results
227224
228225
@@ -248,7 +245,7 @@ def sanitize_base_pkg_name(_base_pkg_name, str_to_replace):
248245 "+python3-" : "python3-{}" .format (default_replace ),
249246 "+openstack-" : "openstack-{}" .format (default_replace )
250247 }
251- return cases . get ( str_to_replace )
248+ return cases [ str_to_replace ]
252249
253250 def is_in_comp_data (_base_pkg_name , _replacement ):
254251 if sanitize_base_pkg_name (_base_pkg_name , replacement ) \
@@ -298,25 +295,25 @@ def filter_upstream(_base_pkg_name):
298295 overall_status = STATUS_NONE
299296 for base_pkg_name in filter (filter_upstream , self ._base_data .keys ()):
300297 comp_pkg_name = self .get_pair (base_pkg_name , self ._comp_data )
301- base_pkg_ver = self ._base_data . get ( base_pkg_name ). get ( 'version' )
298+ base_pkg_ver = self ._base_data [ base_pkg_name ][ 'version' ]
302299 # if to comparison package and base package have pair
303300 if comp_pkg_name is not None :
304- comp_pkg_info = self ._comp_data . get ( comp_pkg_name )
305- comp_pkg_ver = comp_pkg_info . get ( 'version' )
301+ comp_pkg_info = self ._comp_data [ comp_pkg_name ]
302+ comp_pkg_ver = comp_pkg_info [ 'version' ]
306303 status = set_status (base_pkg_ver , comp_pkg_ver )
307- pkg_infos = dict (comparison_package_version = comp_pkg_ver ,
308- base_package_version = base_pkg_ver ,
309- status = status [1 ], status_id = status [0 ])
304+ pkg_info = dict (comparison_package_version = comp_pkg_ver ,
305+ base_package_version = base_pkg_ver ,
306+ status = status [1 ], status_id = status [0 ])
310307 if status == STATUS_OUTDATED :
311308 overall_status = STATUS_OUTDATED
312309 paired += 1
313310 del self ._comp_data [comp_pkg_name ]
314311 else :
315- pkg_infos = dict (comparison_package_version = None ,
316- base_package_version = base_pkg_ver ,
317- status = STATUS_MISSING [1 ],
318- status_id = STATUS_MISSING [0 ])
319- result_data [base_pkg_name ] = pkg_infos
312+ pkg_info = dict (comparison_package_version = None ,
313+ base_package_version = base_pkg_ver ,
314+ status = STATUS_MISSING [1 ],
315+ status_id = STATUS_MISSING [0 ])
316+ result_data [base_pkg_name ] = pkg_info
320317
321318 result_data = OrderedDict (sorted (result_data .items (),
322319 key = lambda x :
@@ -328,53 +325,53 @@ def filter_upstream(_base_pkg_name):
328325
329326
330327@click .command (context_settings = dict (help_option_names = ['-h' , '--help' ]))
331- @click .option ('-r' , '--releases' , is_flag = False , metavar = '<release-distro> ' ,
332- type = click .STRING , required = True ,
333- help = 'Comma separated releases with openstack or '
334- 'distribution of openEuler to check, for example: '
335- 'rocky/20.03-LTS-SP2,rocky/ train' )
336- @click .option ('-t' , '--file-type' , default = 'html' ,
328+ @click .option ('-r' , '--releases' , default = 'train/20.03-LTS-SP3 ' ,
329+ type = click .STRING , required = False , show_default = True ,
330+ help = 'Comma separated releases with openstack/openEuler '
331+ 'to check, for example: '
332+ 'rocky/20.03-LTS-SP2,train/20.03-LTS-SP3 ' )
333+ @click .option ('-t' , '--file-type' , default = 'html' , required = False ,
337334 show_default = True , help = 'Output file format' ,
338335 type = click .Choice (['txt' , 'html' ]))
339- @click .option ('-n' , '--file-name-os ' , default = 'index.html' ,
336+ @click .option ('-n' , '--file-name' , default = 'index.html' ,
340337 required = False , show_default = True ,
341338 help = 'Output file name of openstack version checker' )
342339@click .option ('-a' , '--arch' , default = 'aarch64' ,
343340 required = False , show_default = True ,
344341 type = click .Choice (['aarch64' , 'x86_64' ]),
345342 help = 'CPU architecture of distribution' )
346343@click .option ('-p' , '--proxy' , required = False , help = 'HTTP proxy url' )
347- def run (releases , file_type , file_name_os , arch , proxy ):
348- if releases :
349- releases_config = ReleasesConfig (releases , arch )
344+ @click .option ('-b' , '--bypass-ssl-verify' , default = False ,
345+ required = False , show_default = True , is_flag = True ,
346+ help = 'Bypass SSL verify' )
347+ def run (releases , file_type , file_name , arch , proxy , bypass_ssl_verify ):
350348 if isinstance (proxy , str ) and validators .url (proxy ):
351- PROXY .update ({'http' : proxy , 'https' : proxy })
349+ REQUESTS_ARGS .update ({'proxies' : {'http' : proxy , 'https' : proxy }})
350+ REQUESTS_ARGS .update ({'verify' : not bypass_ssl_verify })
351+ releases_config = ReleasesConfig (releases , arch )
352+ ver_data = {}
352353
353- ver_data = dict ()
354354 for release in releases_config .releases :
355- _release_config = releases_config .releases_config . get ( release )
356- from_os_uri = _release_config . get ( 'os_ver_uri' ) [0 ]
355+ _release_config = releases_config .releases_config [ release ]
356+ from_os_uri = _release_config [ 'os_ver_uri' ] [0 ]
357357 from_os_data = UpstreamVersions (from_os_uri ).upstream_versions
358358 # openstack version check openEuler
359- _rpm_os_ver_uri = _release_config . get ( 'rpm_os_ver_uri' )
359+ _rpm_os_ver_uri = _release_config [ 'rpm_os_ver_uri' ]
360360 if _rpm_os_ver_uri :
361361 to_os_data = RPMVersions (_rpm_os_ver_uri ).rpm_versions
362362 # openstack version check openstack
363363 else :
364- to_os_uri = _release_config . get ( 'os_ver_uri' ) [- 1 ]
364+ to_os_uri = _release_config [ 'os_ver_uri' ] [- 1 ]
365365 to_os_data = UpstreamVersions (to_os_uri ).upstream_versions
366366
367367 ver_data [release ] = VersionsComparator (from_os_data ,
368368 to_os_data ).compared_data
369- ver_data [release ]['apt' ] = _release_config . get (
370- 'os_ver_uri' ) + _release_config . get ( 'rpm_os_ver_uri' )
369+ ver_data [release ]['apt' ] = _release_config [ 'os_ver_uri' ] + \
370+ _release_config [ 'rpm_os_ver_uri' ]
371371
372372 Renderer (ver_data , "template_os_checker.j2" , file_type ,
373- file_name_os ).render ()
373+ file_name ).render ()
374374
375375
376376if __name__ == '__main__' :
377- if len (sys .argv ) == 1 :
378- run .main (['--help' ])
379- else :
380- run ()
377+ run ()
0 commit comments