77import subprocess as sp
88from typing import List , Dict
99from github import Github
10+ from functools import wraps
1011from github .Repository import Repository
1112import time
1213from packaging .version import parse
1920FAILED_RESULT = []
2021SKIP_TEXT = '-, -, -, -\n '
2122
23+
24+ def return_origin_path (func ):
25+ @wraps (func )
26+ def wrapper (* args , ** kwargs ):
27+ current_path = os .getcwd ()
28+ result = func (* args , ** kwargs )
29+ os .chdir (current_path )
30+ return result
31+
32+ return wrapper
33+
34+
2235def my_print (cmd ):
2336 print ('== ' + cmd + ' ==\n ' )
2437
2538
39+ def print_exec (cmd : str ):
40+ my_print (cmd )
41+ sp .call (cmd , shell = True )
42+
43+
2644def print_check (cmd , path = '' ):
2745 my_print (cmd )
2846 if path :
@@ -36,6 +54,10 @@ def print_call(cmd):
3654 sp .call (cmd , shell = True )
3755
3856
57+ def start_test_proxy ():
58+ print_check ('pwsh {}/eng/common/testproxy/docker-start-proxy.ps1 \" start\" ' .format (os .getenv ('SDK_REPO' )))
59+
60+
3961def version_sort (versions : List [str ]) -> List [str ]:
4062 versions_package = [parse (version ) for version in versions ]
4163 versions_package .sort ()
@@ -126,21 +148,21 @@ def write_to_list(self, sdk_folder: str) -> str:
126148 return '{sdk_folder}/{package_name},{pypi_link},{track1_latest_version},{track1_latest_release_date},' \
127149 '{track1_ga_version},{track2_latest_version},{track2_latest_release_date},{track2_ga_version},' \
128150 '{cli_version},{track_config},{bot},{readme_link},{multiapi},{whl_size},' .format (
129- sdk_folder = sdk_folder .split ('/' )[0 ],
130- package_name = self ._package_name ,
131- pypi_link = self .pypi_link ,
132- track1_latest_version = self .track1_latest_version ,
133- track1_latest_release_date = self .version_date_dict [self .track1_latest_version ],
134- track1_ga_version = self .track1_ga_version ,
135- track2_latest_version = self .track2_latest_version ,
136- track2_latest_release_date = self .version_date_dict [self .track2_latest_version ],
137- track2_ga_version = self .track2_ga_version ,
138- cli_version = self .cli_version ,
139- track_config = self .track_config ,
140- bot = self .bot_warning ,
141- readme_link = self .rm_link ,
142- multiapi = self .multi_api ,
143- whl_size = self .output_package_size ())
151+ sdk_folder = sdk_folder .split ('/' )[0 ],
152+ package_name = self ._package_name ,
153+ pypi_link = self .pypi_link ,
154+ track1_latest_version = self .track1_latest_version ,
155+ track1_latest_release_date = self .version_date_dict [self .track1_latest_version ],
156+ track1_ga_version = self .track1_ga_version ,
157+ track2_latest_version = self .track2_latest_version ,
158+ track2_latest_release_date = self .version_date_dict [self .track2_latest_version ],
159+ track2_ga_version = self .track2_ga_version ,
160+ cli_version = self .cli_version ,
161+ track_config = self .track_config ,
162+ bot = self .bot_warning ,
163+ readme_link = self .rm_link ,
164+ multiapi = self .multi_api ,
165+ whl_size = self .output_package_size ())
144166 else :
145167 self .pypi_link = 'NA'
146168 return ''
@@ -155,7 +177,7 @@ def find_track2_ga_version(self, versions: List[str]) -> None:
155177 self .track2_ga_version = version
156178 break
157179
158- def handle_cli_version (self , track1_versions : List [str ], track2_versions : List [str ]) -> None :
180+ def handle_cli_version (self , track1_versions : List [str ], track2_versions : List [str ]) -> None :
159181 if self .cli_version == 'NA' :
160182 return
161183 if self .cli_version in track1_versions :
@@ -209,9 +231,61 @@ def bot_analysis(self):
209231 self .bot_warning += 'Need to add track2 config.'
210232
211233
234+ def sdk_code_path (service_name , sdk_name ) -> str :
235+ return str (Path (os .getenv ('SDK_REPO' ) + f'/sdk/{ service_name } /{ sdk_name } ' ))
236+
237+
238+ @return_origin_path
239+ def install_package_locally (service_name , sdk_name ):
240+ os .chdir (sdk_code_path (service_name , sdk_name ))
241+ print_check ('pip install -e .' )
242+ print_exec ('pip install -r dev_requirements.txt' )
243+
244+
245+ @return_origin_path
246+ def run_test_proc (sdk_name , service_name , sdk_folder ):
247+ # run test
248+ if os .getenv ('SKIP_COVERAGE' ) in ('true' , 'yes' ):
249+ return SKIP_TEXT
250+
251+ coverage_path = '' .join ([os .getenv ('SDK_REPO' ), '/sdk/' , sdk_folder ])
252+ service_path = coverage_path .split ('/azure/mgmt' )[0 ]
253+ os .chdir (sdk_code_path (service_name , sdk_name ))
254+ try :
255+ print_check (f'pytest --collect-only' )
256+ except :
257+ print ('live test run done, do not find any test !!!' )
258+ return '-, -, -, -\n '
259+ if os .path .exists (coverage_path + '/operations' ) and os .path .exists (coverage_path + '/models' ):
260+ operations_path = coverage_path + '/operations'
261+ models_path = coverage_path + '/models'
262+ try :
263+ start_time = int (time .time ())
264+ print_check (f'pytest tests -s --cov={ operations_path } --cov={ models_path } >result.txt' , path = service_path )
265+ cost_time = int (time .time ()) - start_time
266+ my_print (f'{ service_name } play_back cost { cost_time } seconds({ cost_time // 60 } minutes)' )
267+ except Exception as e :
268+ print (f'{ service_name } test ERROR' )
269+ return '-, 0, 0, 0\n '
270+ else :
271+ try :
272+ print_check (f'pytest tests -s >result.txt' , path = service_path )
273+ except Exception as e :
274+ return '-, 0, 0, 0\n '
275+ if os .path .exists (service_path + '/result.txt' ):
276+ return get_test_result (service_path + '/result.txt' )
277+
278+
279+ def run_test (sdk_name , service_name , sdk_folder ):
280+ install_package_locally (service_name , sdk_name )
281+ test_result = run_test_proc (sdk_name , service_name , sdk_folder )
282+ return test_result
283+
284+
212285def sdk_info_from_pypi (sdk_info : List [Dict [str , str ]], cli_dependency ):
213286 all_sdk_status = []
214- add_certificate (str (Path ('../venv-sdk/lib/python3.8/site-packages/certifi/cacert.pem' )))
287+ add_certificate ()
288+ start_test_proxy ()
215289 for package in sdk_info :
216290 sdk_name = package ['package_name' ]
217291 if sdk_name in cli_dependency .keys ():
@@ -230,7 +304,7 @@ def sdk_info_from_pypi(sdk_info: List[Dict[str, str]], cli_dependency):
230304 if pypi_ins .pypi_link != 'NA' :
231305 test_result = SKIP_TEXT
232306 try :
233- test_result = run_playback_test ( service_name , sdk_folder )
307+ test_result = run_test ( sdk_name , service_name , sdk_folder )
234308 except :
235309 print (f'[Error] fail to play back test recordings: { sdk_name } ' )
236310 text_to_write += test_result
@@ -260,40 +334,6 @@ def get_test_result(txt_path):
260334 return f'{ coverage } , { passed } , { failed } , { skipped } \n '
261335
262336
263- def run_playback_test (service_name : str , sdk_folder : str ):
264- if os .getenv ('SKIP_COVERAGE' ) in ('true' , 'yes' ):
265- return SKIP_TEXT
266-
267- # eg: coverage_path='$(pwd)/sdk-repo/sdk/containerregistry/azure-mgmt-containerregistry/azure/mgmt/containerregistry/'
268- coverage_path = '' .join ([os .getenv ('SDK_REPO' ), '/sdk/' , sdk_folder ])
269- service_path = coverage_path .split ('/azure/mgmt' )[0 ]
270- test_path = service_path + '/tests'
271- if os .path .exists (test_path ):
272- print_check ('pip install -r dev_requirements.txt' , path = service_path )
273- print_check ('pip install -e .' , path = service_path )
274- # print_check('python setup.py install', path=service_path)
275- if os .path .exists (coverage_path + '/operations' ) and os .path .exists (coverage_path + '/models' ):
276- operations_path = coverage_path + '/operations'
277- models_path = coverage_path + '/models'
278- try :
279- start_time = int (time .time ())
280- print_check (f'pytest -s tests --cov={ operations_path } --cov={ models_path } >result.txt' , path = service_path )
281- cost_time = int (time .time ()) - start_time
282- my_print (f'{ service_name } play_back cost { cost_time } seconds({ cost_time // 60 } minutes)' )
283- except Exception as e :
284- print (f'{ service_name } test ERROR' )
285- return '-, 0, 0, 0\n '
286- else :
287- try :
288- print_check (f'pytest -s tests >result.txt' , path = service_path )
289- except Exception as e :
290- return '-, 0, 0, 0\n '
291- if os .path .exists (service_path + '/result.txt' ):
292- return get_test_result (service_path + '/result.txt' )
293-
294- return SKIP_TEXT
295-
296-
297337def write_to_csv (sdk_status_list , csv_name ):
298338 with open (csv_name , 'w' ) as file_out :
299339 file_out .write ('foler/package name,'
0 commit comments