1- import unittest
2- import random
3- import time
4- import subprocess
5- import signal
61import concurrent .futures
72import csv
83import os
4+ import random
5+ import signal
6+ import subprocess
7+ import time
8+ import unittest
9+
10+ from csv2md .table import Table
911from selenium import webdriver
10- from selenium .webdriver .firefox .options import Options as FirefoxOptions
11- from selenium .webdriver .edge .options import Options as EdgeOptions
1212from selenium .webdriver .chrome .options import Options as ChromeOptions
13+ from selenium .webdriver .edge .options import Options as EdgeOptions
14+ from selenium .webdriver .firefox .options import Options as FirefoxOptions
1315from selenium .webdriver .remote .client_config import ClientConfig
14- from csv2md .table import Table
1516
1617BROWSER = {
1718 "chrome" : ChromeOptions (),
2728 timeout = 3600 ,
2829)
2930
30- FIELD_NAMES = ["Iteration" , "New request sessions" , "Sessions created time" , "Sessions failed to create" , "New pods scaled up" , "Total running sessions" , "Total running pods" , "Max sessions per pod" , "Gaps" , "Sessions closed" ]
31+ FIELD_NAMES = [
32+ "Iteration" ,
33+ "New request sessions" ,
34+ "Sessions created time" ,
35+ "Sessions failed to create" ,
36+ "New pods scaled up" ,
37+ "Total running sessions" ,
38+ "Total running pods" ,
39+ "Max sessions per pod" ,
40+ "Gaps" ,
41+ "Sessions closed" ,
42+ ]
43+
3144
3245def get_pod_count ():
3346 result = subprocess .run (["kubectl" , "get" , "pods" , "-A" , "--no-headers" ], capture_output = True , text = True )
3447 return len ([line for line in result .stdout .splitlines () if "selenium-node-" in line and "Running" in line ])
3548
49+
3650def create_session (browser_name ):
3751 options = BROWSER [browser_name ]
3852 options .set_capability ("platformName" , "Linux" )
39- return webdriver .Remote (command_executor = CLIENT_CONFIG .remote_server_addr , options = options , client_config = CLIENT_CONFIG )
53+ return webdriver .Remote (
54+ command_executor = CLIENT_CONFIG .remote_server_addr , options = options , client_config = CLIENT_CONFIG
55+ )
56+
4057
4158def wait_for_count_matches (sessions , timeout = 10 , interval = 5 ):
4259 elapsed = 0
@@ -48,20 +65,26 @@ def wait_for_count_matches(sessions, timeout=10, interval=5):
4865 time .sleep (interval )
4966 elapsed += interval
5067 if pod_count != len (sessions ):
51- print (f"WARN: Mismatch between pod count and session count after { timeout } seconds. Gaps: { pod_count - len (sessions )} " )
68+ print (
69+ f"WARN: Mismatch between pod count and session count after { timeout } seconds. Gaps: { pod_count - len (sessions )} "
70+ )
5271 else :
5372 print (f"PASS: Pod count matches session count after { elapsed } seconds." )
5473
74+
5575def close_all_sessions (sessions ):
5676 for session in sessions :
5777 session .quit ()
5878 sessions .clear ()
5979 return sessions
6080
81+
6182def create_sessions_in_parallel (new_request_sessions ):
6283 failed_jobs = 0
6384 with concurrent .futures .ThreadPoolExecutor () as executor :
64- futures = [executor .submit (create_session , random .choice (list (BROWSER .keys ()))) for _ in range (new_request_sessions )]
85+ futures = [
86+ executor .submit (create_session , random .choice (list (BROWSER .keys ()))) for _ in range (new_request_sessions )
87+ ]
6588 sessions = []
6689 for future in concurrent .futures .as_completed (futures ):
6790 try :
@@ -72,6 +95,7 @@ def create_sessions_in_parallel(new_request_sessions):
7295 print (f"Total failed jobs: { failed_jobs } " )
7396 return sessions
7497
98+
7599def randomly_quit_sessions (sessions , sublist_size ):
76100 if sessions :
77101 sessions_to_quit = random .sample (sessions , min (sublist_size , len (sessions )))
@@ -82,15 +106,18 @@ def randomly_quit_sessions(sessions, sublist_size):
82106 return len (sessions_to_quit )
83107 return 0
84108
109+
85110def get_result_file_name ():
86111 return f"tests/autoscaling_results"
87112
113+
88114def export_results_to_csv (output_file , field_names , results ):
89115 with open (output_file , mode = "w" ) as csvfile :
90116 writer = csv .DictWriter (csvfile , fieldnames = field_names )
91117 writer .writeheader ()
92118 writer .writerows (results )
93119
120+
94121def export_results_csv_to_md (csv_file , md_file ):
95122 with open (csv_file ) as f :
96123 table = Table .parse_csv (f )
0 commit comments