Path: blob/master/benchmark/benchmark_parkpow.py
641 views
import argparse1import datetime23import requests456def parse_arguments():7parser = argparse.ArgumentParser(description="Measure ParkPow load time.")8parser.add_argument(9"--url",10help="The base URL of the ParkPow website. Defaults to localhost.",11default="http://127.0.0.1:8000",12)13parser.add_argument("--email", help="The email address to be used for login")14parser.add_argument(15"--password", help="The corresponding password for the provided email."16)17return parser.parse_args()181920def login(session, url, email, password):21login_url = f"{url}/accounts/login/"2223res1 = session.get(login_url)24csrf_token = res1.cookies["csrftoken"]25res2 = session.post(26login_url,27data={"login": email, "password": password, "csrfmiddlewaretoken": csrf_token},28)29return "dashboard" in res2.url303132def _get_load_time_or_none(res):33if res.status_code == 200:34return res.elapsed.microseconds / 100035else:36return None373839def get_first_plate(session, url):40_url = f"{url}/api/v1/vehicles/"41res = session.get(_url)42if res.status_code == 200:43return res.json()["results"][0]["license_plate"]44return False454647def get_first_camera(session, url):48_url = f"{url}/api/v1/visit-list/"49res = session.get(_url)50if res.status_code == 200:51return res.json()["results"][0]["start_cam"]["name"]525354def get_load_time(session, url, path="dashboard", days=1):55url = f"{url}/{path}/"5657time_delta = datetime.timedelta(days=days)58dt_from = datetime.datetime.now() - time_delta5960res = session.get(url, params={"from": dt_from})6162return _get_load_time_or_none(res)636465def get_load_time_search_plate(session, url, plate, path="dashboard", days=1):66url = f"{url}/{path}/"67time_delta = datetime.timedelta(days=days)6869dt_from = datetime.datetime.now() - time_delta70res = session.get(url, params={"from": dt_from, "plate": plate})7172return _get_load_time_or_none(res)737475def get_load_time_filter_by_camera(session, url, camera_name, path="dashboard", days=1):76url = f"{url}/{path}/"77time_delta = datetime.timedelta(days=days)7879dt_from = datetime.datetime.now() - time_delta80res = session.get(url, params={"from": dt_from, "camera_name": camera_name})8182return _get_load_time_or_none(res)838485def get_result(session, url, path, plate, camera):86for day in [1, 7, 14, 30, 60]:87load_time = get_load_time(session, url, path, day)88load_time_plate = get_load_time_search_plate(session, url, plate, path, day)89load_time_camera = get_load_time_filter_by_camera(90session, url, camera, path, day91)9293load_time_str = f"{load_time}ms" if load_time else "failed to load"94load_time_plate_str = (95f"{load_time_plate}ms" if load_time_plate else "failed to load"96)97load_time_camera_str = (98f"{load_time_camera}ms" if load_time_camera else "failed to load"99)100101yield dict(102day=day,103no_filter=load_time_str,104filter_plate=load_time_plate_str,105filter_camera=load_time_camera_str,106)107108109def print_table(title, results):110if not results:111return112print("| -------------------------------------------------------------------- |")113print(f"|{title.center(70)}|")114print("| -------------------------------------------------------------------- |")115print("| Range | Without filter | License plate search | Filter 1 camera |")116print("| --------- | --------------- | -------------------- | --------------- |")117for result in results:118print(119"| {day:2n} day(s) | {no_filter:^15s} | {filter_plate:^20s} | {filter_camera:^15s} |".format(120**result121)122)123print("| -------------------------------------------------------------------- |")124125126def main():127session = requests.session()128args = parse_arguments()129130if not args.email or not args.password:131print("Provide a valid credential with --email and --password. Exiting...")132return133134# Login135print("Logging in...")136if not login(session, args.url, args.email, args.password):137print("Login failed. Exiting...")138return139140print()141142plate = get_first_plate(session, args.url)143camera = get_first_camera(session, args.url)144145if not plate:146print("Failed to get a plate to search")147return148149if not camera:150print("Failed to get a camera for filtering")151return152153# Dashboard154results = get_result(session, args.url, "dashboard", plate, camera)155print_table("Dashboard", results)156157print()158print()159160# Dashboard statistics161results = get_result(session, args.url, "dashboard/?statistics=true", plate, camera)162print_table("Dashboard Statistics", results)163164print()165print()166167# Dashboard chart168results = get_result(session, args.url, "dashboard/?chart-data=true", plate, camera)169print_table("Dashboard Chart", results)170171print()172print()173174# Alert175results = get_result(session, args.url, "alerts", plate, camera)176print_table("Alert", results)177178179if __name__ == "__main__":180main()181182183