Skip to content

Commit 2af81ec

Browse files
msyycrakshith91
authored andcommitted
[Release sdk status] add statistics for package size (Azure#22836)
* add parameter * trigger swagger pipeline and sheduled trigger * avoid duplicated trigger * debug * debug * debug * debug * debug * optmization * special case * special case * optimize track2 ga version rule * delete upload code * testproxy adaptation * new timeoutlimit * add package size * format * fix * add log * fix * fix git commit error
1 parent 133c5b5 commit 2af81ec

File tree

2 files changed

+66
-62
lines changed

2 files changed

+66
-62
lines changed

scripts/release_sdk_status/main.py

Lines changed: 66 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
SERVICE_TEST_PATH = {}
2020
MAIN_REPO_SWAGGER = 'https://github.com/Azure/azure-rest-api-specs/tree/main'
2121
PR_URL = 'https://github.com/Azure/azure-rest-api-specs/pull/'
22+
FAILED_RESULT = []
2223

2324
def 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+
3541
def 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+
333373
def 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

393431
def 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

417437
def 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

466471
if __name__ == '__main__':

scripts/release_sdk_status/release_sdk_status.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ jobs:
5454
export TOKEN=$(USR_TOKEN)
5555
export SWAGGER_REPO=$(pwd)/azure-rest-api-specs
5656
export SDK_REPO=$(pwd)/sdk-repo
57-
export AZP_RUN=$(AZP_RUN)
5857
export SKIP_COVERAGE=$(SKIP_COVERAGE)
5958
6059
# create virtual env

0 commit comments

Comments
 (0)