1919SERVICE_TEST_PATH = {}
2020MAIN_REPO_SWAGGER = 'https://github.com/Azure/azure-rest-api-specs/tree/main'
2121PR_URL = 'https://github.com/Azure/azure-rest-api-specs/pull/'
22+ FAILED_RESULT = []
2223
2324def my_print (cmd ):
2425 print ('== ' + cmd + ' ==\n ' )
@@ -32,6 +33,11 @@ def print_check(cmd, path=''):
3233 sp .check_call (cmd , shell = True )
3334
3435
36+ def print_call (cmd ):
37+ my_print (cmd )
38+ sp .call (cmd , shell = True )
39+
40+
3541def version_sort (versions : List [str ]) -> List [str ]:
3642 versions_package = [parse (version ) for version in versions ]
3743 versions_package .sort ()
@@ -57,16 +63,17 @@ def __init__(self, host="https://pypi.org", package_name='', track_config='',
5763 self .cli_version = cli_version
5864 self .bot_warning = ''
5965 self .multi_api = multi_api
66+ self .package_size = '' # Byte
6067
6168 def get_package_name (self ):
6269 return self ._package_name
6370
64- def project_html (self ):
71+ def project_html (self , folder : str ):
6572 self .pypi_link = "{host}/pypi/{project_name}" .format (
6673 host = self ._host ,
6774 project_name = self ._package_name
6875 )
69- response = self ._session .get (self .pypi_link + "/#history" )
76+ response = self ._session .get (self .pypi_link + folder )
7077
7178 return response
7279
@@ -87,6 +94,16 @@ def get_release_info(self, response, xpath, type):
8794
8895 return strip_info
8996
97+ def get_latest_package_size (self ):
98+ response = self .project_html ("/json" )
99+ try :
100+ response .raise_for_status ()
101+ result = response .json ()
102+ version = self .track2_latest_version if self .track2_latest_version != 'NA' else self .track1_latest_version
103+ self .package_size = result ['releases' ][version ][0 ]['size' ]
104+ except :
105+ self .package_size = 'failed'
106+
90107 def get_release_dict (self , response ):
91108 version_list = self .get_release_info (response , xpath = '//p[@class="release__version"]/text()' , type = 'version' )
92109 self .version_handler (version_list )
@@ -95,14 +112,22 @@ def get_release_dict(self, response):
95112 self .version_date_dict = dict (zip (version_list , data_list ))
96113 self .version_date_dict ['NA' ] = 'NA'
97114
115+ self .get_latest_package_size ()
116+
117+ def output_package_size (self ) -> str :
118+ if isinstance (self .package_size , int ):
119+ return '%.3f' % float (self .package_size / 1024 / 1024 )
120+ else :
121+ return self .package_size
122+
98123 def write_to_list (self ):
99- response = self .project_html ()
124+ response = self .project_html ("/#history" )
100125 if 199 < response .status_code < 400 :
101126 self .get_release_dict (response )
102127 self .bot_analysis ()
103128 return '{package_name},{pypi_link},{track1_latest_version},{track1_latest_release_date},' \
104129 '{track1_ga_version},{track2_latest_version},{track2_latest_release_date},{track2_ga_version},' \
105- '{cli_version},{track_config},{bot},{readme_link},{multiapi},' .format (
130+ '{cli_version},{track_config},{bot},{readme_link},{multiapi},{whl_size}, ' .format (
106131 package_name = self ._package_name ,
107132 pypi_link = self .pypi_link ,
108133 track1_latest_version = self .track1_latest_version ,
@@ -115,7 +140,8 @@ def write_to_list(self):
115140 track_config = self .track_config ,
116141 bot = self .bot_warning ,
117142 readme_link = self .rm_link ,
118- multiapi = self .multi_api )
143+ multiapi = self .multi_api ,
144+ whl_size = self .output_package_size ())
119145 else :
120146 self .pypi_link = 'NA'
121147 return
@@ -206,8 +232,11 @@ def sdk_info_from_pypi(sdk_info, cli_dependency):
206232 if sdk_name == 'azure-mgmt-resource' :
207233 test_result = run_playback_test ('resources' )
208234 else :
209- service_name = [k for k , v in SERVICE_TEST_PATH .items () if sdk_name in v ][0 ]
210- test_result = run_playback_test (service_name )
235+ try :
236+ service_name = [k for k , v in SERVICE_TEST_PATH .items () if sdk_name in v ][0 ]
237+ test_result = run_playback_test (service_name )
238+ except :
239+ print (f'[Error] fail to play back test recordings: { sdk_name } ' )
211240 text_to_write += test_result
212241 all_sdk_status .append (text_to_write )
213242
@@ -284,6 +313,7 @@ def write_to_csv(sdk_status_list, csv_name):
284313 'bot advice,'
285314 'readme link,'
286315 'multi api,'
316+ 'whl size(MB),'
287317 'test coverage,'
288318 'passed,'
289319 'failed,'
@@ -330,6 +360,16 @@ def read_file(file_name):
330360 return content
331361
332362
363+ def find_test_path (line : str , service_name : str ) -> bool :
364+ line = line .strip ('\n ' ) + '\n '
365+ try :
366+ SERVICE_TEST_PATH [service_name ] = re .findall ('output-folder: \$\(python-sdks-folder\)/(.*?)\n ' , line )[0 ]
367+ return True
368+ except :
369+ FAILED_RESULT .append ('[Fail to find sdk path] ' + line )
370+ return False
371+
372+
333373def sdk_info_from_swagger ():
334374 sdk_name_re = re .compile (r'azure-mgmt-[a-z]+-*([a-z])+' )
335375 sdk_folder_re = re .compile ('output-folder: \$\(python-sdks-folder\)/' )
@@ -339,7 +379,7 @@ def sdk_info_from_swagger():
339379 readme_folders = glob .glob (target_file_pattern )
340380 my_print (f'total readme folders: { len (readme_folders )} ' )
341381 for folder in readme_folders :
342- sdk_folder_path = False
382+ found_sdk_folder = False
343383 multi_api = ''
344384 linux_folder = Path (folder ).as_posix ()
345385 service_name = re .findall (r'specification/(.*?)/resource-manager/' , linux_folder )[0 ]
@@ -355,21 +395,19 @@ def sdk_info_from_swagger():
355395 track_config += 1
356396 if readme_python == 'NA' and sdk_name_re .search (line ) is not None and package_name == '' :
357397 package_name = sdk_name_re .search (line ).group ()
358- if sdk_folder_re .search (line ) and sdk_folder_path == False :
359- SERVICE_TEST_PATH [service_name ] = re .findall ('output-folder: \$\(python-sdks-folder\)/(.*?)\n ' , line )[0 ]
360- sdk_folder_path = True
398+ if sdk_folder_re .search (line ) and not found_sdk_folder :
399+ found_sdk_folder = find_test_path (line , service_name )
361400
362401 if readme_python != 'NA' :
363402 readme_python_text = read_file (readme_python )
364403 for text in readme_python_text :
365404 if sdk_name_re .search (text ) is not None :
366405 package_name = sdk_name_re .search (text ).group ()
367- if sdk_folder_re .search (text ) and sdk_folder_path == False :
368- SERVICE_TEST_PATH [service_name ] = re .findall ('output-folder: \$\(python-sdks-folder\)/(.*?)\n ' , text )[0 ]
369- sdk_folder_path = True
406+ if sdk_folder_re .search (text ) and not found_sdk_folder :
407+ found_sdk_folder = find_test_path (text , service_name )
370408 if 'batch:' in text and multi_api == '' :
371409 multi_api = 'fake'
372- print (f'*********{ service_name } is fake 1111 ' )
410+ print (f'*********{ service_name } is fake ' )
373411 if 'multiapiscript: true' in text :
374412 multi_api = 'True'
375413
@@ -391,27 +429,9 @@ def sdk_info_from_swagger():
391429
392430
393431def commit_to_github ():
394- print_check ('git add .' )
395- print_check ('git commit -m \" update excel\" ' )
396- print_check ('git push -f origin HEAD' )
397-
398-
399- def count_sdk_status ():
400- cli_dependency = get_cli_dependency ()
401- sdk_info = sdk_info_from_swagger ()
402- all_sdk_status = sdk_info_from_pypi (sdk_info , cli_dependency )
403-
404- out_file = 'release_sdk_status.csv'
405- write_to_csv (all_sdk_status , out_file )
406- commit_to_github ()
407-
408-
409- def get_all_readme_html () -> List [str ]:
410- swagger_folder = os .getenv ('SWAGGER_REPO' )
411- readme_folders = glob .glob (f'{ swagger_folder } /specification/*/resource-manager' )
412- my_print (f'total readme folders: { len (readme_folders )} ' )
413- service_name = [Path (item ).parts [- 2 ] for item in readme_folders ]
414- return [f'{ MAIN_REPO_SWAGGER } /specification/{ item } /resource-manager' for item in service_name ]
432+ print_call ('git add .' )
433+ print_call ('git commit -m \" update excel\" ' )
434+ print_call ('git push -f origin HEAD' )
415435
416436
417437def get_latest_pr_from_readme (rest_repo : Repository , service_html : str ):
@@ -432,35 +452,20 @@ def get_latest_pr_from_readme(rest_repo: Repository, service_html: str):
432452 return latest_pr_number_int [- 1 ]
433453
434454
435- def trigger_pipeline (readme_html : List [str ]) -> None :
436- g = Github (os .getenv ('TOKEN' )) # please fill user_token
437- rest_repo = g .get_repo ('Azure/azure-rest-api-specs' )
438- record = set ()
439- for item in readme_html :
440- num = get_latest_pr_from_readme (rest_repo , item )
441- pr = rest_repo .get_pull (num )
442- # TODO: skip too old PR
443-
444- # avoid duplicated trigger
445- if num not in record :
446- pr .create_issue_comment (body = '/azp run' )
447- record .add (num )
448- time .sleep (300 )
449- my_print (f'get latest PR "{ PR_URL } { num } " from { item } and comment "/azp run" successfully' )
450- else :
451- my_print (f'get latest PR "{ PR_URL } { num } " from { item } and but it is already triggered' )
455+ def log_failed ():
456+ print ('\n ' .join (FAILED_RESULT ))
452457
453458
454- def trigger_swagger_pipeline () -> None :
455- readme_html_all = get_all_readme_html ()
456- trigger_pipeline (readme_html_all )
459+ def main ():
460+ cli_dependency = get_cli_dependency ()
461+ sdk_info = sdk_info_from_swagger ()
462+ all_sdk_status = sdk_info_from_pypi (sdk_info , cli_dependency )
457463
464+ out_file = 'release_sdk_status.csv'
465+ write_to_csv (all_sdk_status , out_file )
466+ commit_to_github ()
458467
459- def main ():
460- if os .environ .get ('AZP_RUN' ) in ('yes' , 'true' ):
461- trigger_swagger_pipeline ()
462- else :
463- count_sdk_status ()
468+ log_failed ()
464469
465470
466471if __name__ == '__main__' :
0 commit comments