"""Deploy : vsperf_deploy_client""" #pylint: disable=import-error import configparser import sys from pathlib import Path import grpc from proto import vsperf_pb2 from proto import vsperf_pb2_grpc CHUNK_SIZE = 1024 * 1024 # 1MB HEADER = r""" _ _ ___ ____ ____ ____ ____ ___ __ ____ ____ _ _ ____ ( \/ )/ __)( _ \( ___)( _ \( ___) / __)( ) (_ _)( ___)( \( )(_ _) \ / \__ \ )___/ )__) ) / )__) ( (__ )(__ _)(_ )__) ) ( )( \/ (___/(__) (____)(_)\_)(__) \___)(____)(____)(____)(_)\_) (__) """ COLORS = { 'blue': '\033[94m', 'pink': '\033[95m', 'green': '\033[92m', } DUT_CHECK = 0 TGEN_CHECK = 0 def colorize(string, color): """Colorized HEADER""" if color not in COLORS: return string return COLORS[color] + string + '\033[0m' class VsperfClient(): """ This class reprsents the VSPERF-client. It talks to vsperf-docker to perform installation, configuration and test-execution """ # pylint: disable=R0904,no-else-break # pylint: disable=W0603,invalid-name # pylint: disable=R1710 def __init__(self): """read vsperfclient.conf""" self.cfp = 'vsperfclient.conf' self.config = configparser.RawConfigParser() self.config.read(self.cfp) self.stub = None self.dut_check = 0 self.tgen_check = 0 def get_mode(self): """read the mode for the client""" return self.config.get('Mode', 'mode') def get_deploy_channel_info(self): """get the channel data""" return (self.config.get('DeployServer', 'ip'), self.config.get('DeployServer', 'port')) def get_test_channel_info(self): """get the channel for tgen""" return (self.config.get('TestServer', 'ip'), self.config.get('TestServer', 'port')) def create_stub(self, channel): """create stub to talk to controller""" self.stub = vsperf_pb2_grpc.ControllerStub(channel) def host_connect(self): """provice dut-host credential to controller""" global DUT_CHECK hostinfo = vsperf_pb2.HostInfo(ip=self.config.get('Host', 'ip'), uname=self.config.get('Host', 'uname'), pwd=self.config.get('Host', 'pwd')) connect_reply = self.stub.HostConnect(hostinfo) DUT_CHECK = 1 print(connect_reply.message) def tgen_connect(self): """provide tgen-host credential to controller""" global TGEN_CHECK tgeninfo = vsperf_pb2.HostInfo(ip=self.config.get('TGen', 'ip'), uname=self.config.get('TGen', 'uname'), pwd=self.config.get('TGen', 'pwd')) connect_reply = self.stub.TGenHostConnect(tgeninfo) TGEN_CHECK = 1 print(connect_reply.message) def host_connect_both(self): """provice dut-host credential to controller""" global DUT_CHECK hostinfo = vsperf_pb2.HostInfo(ip=self.config.get('Host', 'ip'), uname=self.config.get('Host', 'uname'), pwd=self.config.get('Host', 'pwd')) connect_reply = self.stub.HostConnect(hostinfo) client = VsperfClient() client.automatically_test_dut_connect() DUT_CHECK = 1 print(connect_reply.message) def tgen_connect_both(self): """provide tgen-host credential to controller""" global TGEN_CHECK tgeninfo = vsperf_pb2.HostInfo(ip=self.config.get('TGen', 'ip'), uname=self.config.get('TGen', 'uname'), pwd=self.config.get('TGen', 'pwd')) connect_reply = self.stub.TGenHostConnect(tgeninfo) TGEN_CHECK = 1 client = VsperfClient() client.automatically_test_tgen_connect() print(connect_reply.message) @classmethod def automatically_test_dut_connect(cls): """handle automatic connection with tgen""" client = VsperfClient() ip_add, port = client.get_test_channel_info() channel = grpc.insecure_channel(ip_add + ':' + port) client.create_stub(channel) client.host_testcontrol_connect() @classmethod def automatically_test_tgen_connect(cls): """handle automatic connection with tgen""" client = VsperfClient() ip_add, port = client.get_test_channel_info() channel = grpc.insecure_channel(ip_add + ':' + port) client.create_stub(channel) client.tgen_testcontrol_connect() def exit_section(self): """exit""" @classmethod def section_execute(cls, menuitems, client, ip_add, port): """it will use to enter into sub-option""" channel = grpc.insecure_channel(ip_add + ':' + port) while True: client.create_stub(channel) while True: # os.system('clear') print(colorize(HEADER, 'blue')) print(colorize('version 0.1\n', 'pink')) for item in menuitems: print(colorize("[" + str(menuitems.index(item)) + "]", 'green') + list(item.keys())[0]) choice = input(">> ") try: if int(choice) < 0: raise ValueError if (int(choice) >= 0) and (int(choice) < (len(menuitems) - 1)): list(menuitems[int(choice)].values())[0]() else: break except (ValueError, IndexError): pass break @classmethod def get_user_trex_conf_location(cls): """Ask user for t-rex configuration location""" while True: filename_1 = str(input("Provide correct location for your t-rex configuration " \ "file where trex_cfg.yaml exist\n" \ "***************** Make Sure You Choose Correct" \ " File for Upload*******************\n" \ "Provide location: \n")) user_file = Path("{}".format(filename_1.strip())) if user_file.is_file(): break else: print("**************File Does Not Exist*****************\n") continue return filename_1 def upload_tgen_config(self): """t-rex config file as a chunk to controller""" if TGEN_CHECK == 0: return print("TGen-Host is not Connected [!]" \ "\nMake sure to establish connection with TGen-Host.") default_location = self.config.get('ConfFile', 'tgenpath') if not default_location: filename = self.get_user_trex_conf_location() else: user_preference = str(input("Use location specified in vsperfclient.conf?[Y/N] :")) while True: if 'y' in user_preference.lower().strip(): filename = self.config.get('ConfFile', 'tgenpath') user_file = Path("{}".format(filename.strip())) if user_file.is_file(): break else: print("**************File Does Not Exist*****************\n") user_preference = 'n' continue elif 'n' in user_preference.lower().strip(): filename = self.get_user_trex_conf_location() break else: print("Invalid Input") user_preference = str(input("Use location specified in vsperfclient.conf?" \ "[Y/N] : ")) continue filename = filename.strip() chunks = self.get_file_chunks_1(filename) upload_status = self.stub.TGenUploadConfigFile(chunks) print(upload_status.Message) def vsperf_install(self): """vsperf install on dut-host""" hostinfo = vsperf_pb2.HostInfo(ip=self.config.get('Host', 'ip'), uname=self.config.get('Host', 'uname'), pwd=self.config.get('Host', 'pwd')) install_reply = self.stub.VsperfInstall(hostinfo) print(install_reply.message) def collectd_install(self): """collectd install on dut-host""" hostinfo = vsperf_pb2.HostInfo(ip=self.config.get('Host', 'ip'), uname=self.config.get('Host', 'uname'), pwd=self.config.get('Host', 'pwd')) install_reply = self.stub.CollectdInstall(hostinfo) print(install_reply.message) def tgen_install(self): """install t-rex on Tgen host""" tgeninfo = vsperf_pb2.HostInfo(ip=self.config.get('TGen', 'ip'), uname=self.config.get('TGen', 'uname'), pwd=self.config.get('TGen', 'pwd')) install_reply = self.stub.TGenInstall(tgeninfo) print(install_reply.message) @classmethod def get_user_conf_location(cls): """get user input for test configuration file""" while True: filename_1 = str(input("Provide correct location for your test configuration " \ "file where it exist\n" \ "***************** Make Sure You Choose Correct" \ " Test File for Upload*******************\n" \ "Provide location: \n")) user_file = Path("{}".format(filename_1.strip())) if user_file.is_file(): break else: print("**************File Does Not Exist*****************\n") continue return filename_1 def upload_config(self): """transfer config file as a chunk to controller""" if DUT_CHECK == 0: return print("DUT-Host is not Connected [!]" \ "\nMake sure to establish connection with DUT-Host.") default_location = self.config.get('ConfFile', 'path') if not default_location: filename = self.get_user_conf_location() else: user_preference = str(input("Use location specified in vsperfclient.conf?[Y/N] :")) while True: if 'y' in user_preference.lower().strip(): filename = self.config.get('ConfFile', 'path') user_file = Path("{}".format(filename.strip())) if user_file.is_file(): break else: print("**************File Does Not Exist*****************\n") user_preference = 'n' continue elif 'n' in user_preference.lower().strip(): filename = self.get_user_conf_location() break else: print("Invalid Input") user_preference = str(input("Use location specified in vsperfclient.conf?" \ "[Y/N] : ")) continue filename = filename.strip() upload_param = self.get_file_chunks(filename) upload_status = self.stub.UploadConfigFile(upload_param) print(upload_status.Message) def start_test(self): """start test parameter, test config file and test name""" test_control = vsperf_pb2.ControlVsperf(testtype=self.config.get('Testcase', 'test'), \ conffile=self.config.get('Testcase', 'conffile')) control_reply = self.stub.StartTest(test_control) print(control_reply.message) def start_tgen(self): """start t-rex traffic generetor on tgen-host""" tgen_control = vsperf_pb2.ControlTGen(params=self.config.get('TGen', 'params')) control_reply = self.stub.StartTGen(tgen_control) print(control_reply.message) @classmethod def get_file_chunks(cls, filename): """convert file into chunk to stream between client and controller with filename""" with open(filename, 'rb') as f_1: while True: file_path = filename file_path_list = file_path.split("/") test_filename = file_path_list[(len(file_path_list)-1)] piece = f_1.read(CHUNK_SIZE) if not piece: return None return vsperf_pb2.ConfFileTest(Content=piece, Filename=test_filename) @classmethod def get_file_chunks_1(cls, filename): """Convert file into chunks""" with open(filename, 'rb') as f: while True: piece = f.read(CHUNK_SIZE) if len(piece) == 0: return yield vsperf_pb2.ConfFile(Content=piece) def test_status(self): """check the test_status""" test_check = vsperf_pb2.StatusQuery( testtype=self.config.get('Testcase', 'test')) check_result_reply = self.stub.TestStatus(test_check) print(check_result_reply.message) def vsperf_terminate(self): """after running test terminate vsperf on dut host""" hostinfo = vsperf_pb2.HostInfo(ip=self.config.get('Host', 'ip'), uname=self.config.get('Host', 'uname'), pwd=self.config.get('Host', 'pwd')) termination_reply = self.stub.TerminateVsperf(hostinfo) print(termination_reply.message) def start_beats(self): """start beats on dut-host before running test""" hostinfo = vsperf_pb2.HostInfo(ip=self.config.get('Host', 'ip'), uname=self.config.get('Host', 'uname'), pwd=self.config.get('Host', 'pwd')) status_reply = self.stub.StartBeats(hostinfo) print(status_reply.message) def remove_vsperf(self): """remove vsperf from dut-host""" hostinfo = vsperf_pb2.HostInfo(ip=self.config.get('Host', 'ip'), uname=self.config.get('Host', 'uname'), pwd=self.config.get('Host', 'pwd')) status_reply = self.stub.RemoveVsperf(hostinfo) print(status_reply.message) def remove_result_folder(self): """remove resutl folder from dut-host""" hostinfo = vsperf_pb2.HostInfo(ip=self.config.get('Host', 'ip'), uname=self.config.get('Host', 'uname'), pwd=self.config.get('Host', 'pwd')) status_reply = self.stub.RemoveResultFolder(hostinfo) print(status_reply.message) def remove_config_files(self): """remove all config files""" hostinfo = vsperf_pb2.HostInfo(ip=self.config.get('Host', 'ip'), uname=self.config.get('Host', 'uname'), pwd=self.config.get('Host', 'pwd')) status_reply = self.stub.RemoveUploadedConfig(hostinfo) print(status_reply.message) def remove_collectd(self): """remove collectd from dut-host""" hostinfo = vsperf_pb2.HostInfo(ip=self.config.get('Host', 'ip'), uname=self.config.get('Host', 'uname'), pwd=self.config.get('Host', 'pwd')) status_reply = self.stub.RemoveCollectd(hostinfo) print(status_reply.message) def remove_everything(self): """remove everything from dut host""" hostinfo = vsperf_pb2.HostInfo(ip=self.config.get('Host', 'ip'), uname=self.config.get('Host', 'uname'), pwd=self.config.get('Host', 'pwd')) status_reply = self.stub.RemoveEverything(hostinfo) print(status_reply.message) def sanity_nic_check(self): """nic is available on tgen host check""" tgeninfo = vsperf_pb2.HostInfo(ip=self.config.get('TGen', 'ip'), uname=self.config.get('TGen', 'uname'), pwd=self.config.get('TGen', 'pwd')) status_reply = self.stub.SanityNICCheck(tgeninfo) print(status_reply.message) def sanity_collectd_check(self): """check collecd properly running""" hostinfo = vsperf_pb2.HostInfo(ip=self.config.get('Host', 'ip'), uname=self.config.get('Host', 'uname'), pwd=self.config.get('Host', 'pwd')) status_reply = self.stub.SanityCollectdCheck(hostinfo) print(status_reply.message) def cpu_allocation_check(self): """check cpu allocation""" hostinfo = vsperf_pb2.HostInfo(ip=self.config.get('Host', 'ip'), uname=self.config.get('Host', 'uname'), pwd=self.config.get('Host', 'pwd')) status_reply = self.stub.SanityCPUAllocationCheck(hostinfo) print(status_reply.message) def sanity_vnf_path(self): """vnf path available on dut host""" hostinfo = vsperf_pb2.HostInfo(ip=self.config.get('Host', 'ip'), uname=self.config.get('Host', 'uname'), pwd=self.config.get('Host', 'pwd')) status_reply = self.stub.SanityVNFpath(hostinfo) print(status_reply.message) def sanity_vsperf_check(self): """check vsperf correctly installed""" hostinfo = vsperf_pb2.HostInfo(ip=self.config.get('Host', 'ip'), uname=self.config.get('Host', 'uname'), pwd=self.config.get('Host', 'pwd')) status_reply = self.stub.SanityVSPERFCheck(hostinfo) print(status_reply.message) def sanity_dut_tgen_conn_check(self): """check the connection between dut-host and tgen-host""" hostinfo = vsperf_pb2.HostInfo(ip=self.config.get('Host', 'ip'), uname=self.config.get('Host', 'uname'), pwd=self.config.get('Host', 'pwd')) status_reply = self.stub.SanityTgenConnDUTCheck(hostinfo) print(status_reply.message) def dut_test_availability(self): """dut-host is free for test check""" hostinfo = vsperf_pb2.HostInfo(ip=self.config.get('Host', 'ip'), uname=self.config.get('Host', 'uname'), pwd=self.config.get('Host', 'pwd')) status_reply = self.stub.DUTvsperfTestAvailability(hostinfo) print(status_reply.message) def get_test_conf_from_dut(self): """get the vsperf test config file from dut host for user to check""" hostinfo = vsperf_pb2.HostInfo(ip=self.config.get('Host', 'ip'), uname=self.config.get('Host', 'uname'), pwd=self.config.get('Host', 'pwd')) status_reply = self.stub.GetVSPERFConffromDUT(hostinfo) print(status_reply.message) def dut_hugepage_config(self): """setup hugepages on dut-host""" configparam = vsperf_pb2.HugepConf(hpmax=self.config.get('HugepageConfig', 'HpMax'), \ hprequested=self.config.get('HugepageConfig',\ 'HpRequested')) config_status_reply = self.stub.DutHugepageConfig(configparam) print(config_status_reply.message) @classmethod def get_user_collectd_conf_location(cls): """get collectd configuration file location from user""" while True: filename_1 = str(input("Provide correct location for your collectd configuration " \ "file where collectd.conf exist\n" \ "***************** Make Sure You Choose Correct" \ " File for Upload*******************\n" \ "Provide location: \n")) user_file = Path("{}".format(filename_1.strip())) if user_file.is_file(): break else: print("**************File Does Not Exist*****************\n") continue return filename_1 def host_testcontrol_connect(self): """provice dut-host credential to test controller""" global DUT_CHECK hostinfo = vsperf_pb2.HostInfo(ip=self.config.get('Host', 'ip'), uname=self.config.get('Host', 'uname'), pwd=self.config.get('Host', 'pwd')) self.stub.HostConnect(hostinfo) def tgen_testcontrol_connect(self): """provide tgen-host credential to test controller""" global TGEN_CHECK tgeninfo = vsperf_pb2.HostInfo(ip=self.config.get('TGen', 'ip'), uname=self.config.get('TGen', 'uname'), pwd=self.config.get('TGen', 'pwd')) self.stub.TGenHostConnect(tgeninfo) def upload_collectd_config(self): """collectd config file chunks forwarded to controller""" if DUT_CHECK == 0: return print("DUT-Host is not Connected [!]" \ "\nMake sure to establish connection with DUT-Host.") default_location = self.config.get('ConfFile', 'collectdpath') if not default_location: filename = self.get_user_collectd_conf_location() else: user_preference = str(input("Use location specified in vsperfclient.conf?[Y/N] :")) while True: if 'y' in user_preference.lower().strip(): filename = self.config.get('ConfFile', 'collectdpath') user_file = Path("{}".format(filename.strip())) if user_file.is_file(): break else: print("**************File Does Not Exist*****************\n") user_preference = 'n' continue elif 'n' in user_preference.lower().strip(): filename = self.get_user_collectd_conf_location() break else: print("Invalid Input") user_preference = str(input("Use location specified in vsperfclient.conf?" \ "[Y/N] : ")) continue filename = filename.strip() chunks = self.get_file_chunks_1(filename) upload_status = self.stub.CollectdUploadConfig(chunks) print(upload_status.Message) def dut_check_dependecies(self): """check_dependecies on dut-host""" hostinfo = vsperf_pb2.HostInfo(ip=self.config.get('Host', 'ip'), uname=self.config.get('Host', 'uname'), pwd=self.config.get('Host', 'pwd')) check_reply = self.stub.CheckDependecies(hostinfo) print(check_reply.message) @classmethod def establish_connection_both(cls): """ This Function use to establish connection for vsperf to both the deploy server \ and testcontrol server """ client = VsperfClient() ip_add, port = client.get_deploy_channel_info() print("Establish connection for vsperf") menuitems_connection = [ {"Connect to DUT Host": client.host_connect_both}, {"Connect to TGen Host": client.tgen_connect_both}, {"Return to Previous Menu": client.exit_section} ] client.section_execute(menuitems_connection, client, ip_add, port) @classmethod def establish_connection_deploy(cls): """ This Function use to establish connection for vsperf to either using the dploy or using the testcontrol server """ client = VsperfClient() ip_add, port = client.get_deploy_channel_info() print("Establish connection for vsperf") menuitems_connection = [ {"Connect to DUT Host": client.host_connect}, {"Connect to TGen Host": client.tgen_connect}, {"Return to Previous Menu": client.exit_section} ] client.section_execute(menuitems_connection, client, ip_add, port) @classmethod def establish_connection_test(cls): """ This Function use to establish connection for vsperf to either using the dploy or using the testcontrol server """ client = VsperfClient() ip_add, port = client.get_test_channel_info() print("Establish connection for vsperf") menuitems_connection = [ {"Connect to DUT Host": client.host_connect}, {"Connect to TGen Host": client.tgen_connect}, {"Return to Previous Menu": client.exit_section} ] client.section_execute(menuitems_connection, client, ip_add, port) @classmethod def vsperf_setup(cls): """setup sub-options""" client = VsperfClient() ip_add, port = client.get_deploy_channel_info() print("Prerequisites Installation for VSPERF") menuitems_setup = [ {"Install VSPERF": client.vsperf_install}, {"Install TGen ": client.tgen_install}, {"Install Collectd": client.collectd_install}, {"Return to Previous Menu": client.exit_section} ] client.section_execute(menuitems_setup, client, ip_add, port) @classmethod def upload_config_files(cls): """all the upload sub-options""" client = VsperfClient() ip_add, port = client.get_deploy_channel_info() menuitems_setup = [ {"Upload TGen Configuration File": client.upload_tgen_config}, {"Upload Collectd Configuration File": client.upload_collectd_config}, {"Return to Previous Menu": client.exit_section} ] client.section_execute(menuitems_setup, client, ip_add, port) @classmethod def manage_sysparam_config(cls): """manage system parameter on dut host before run test""" client = VsperfClient() ip_add, port = client.get_deploy_channel_info() menuitems_setup = [ {"DUT-Host hugepages configuration": client.dut_hugepage_config}, {"Check VSPERF Dependencies on DUT-Host": client.dut_check_dependecies}, {"Return to Previous Menu": client.exit_section} ] client.section_execute(menuitems_setup, client, ip_add, port) @classmethod def test_status_check(cls): """after running test , test status related sub-options""" client = VsperfClient() ip_add, port = client.get_test_channel_info() menuitems_setup = [ {"Test status": client.test_status}, {"Get Test Configuration file from DUT-host": client.get_test_conf_from_dut}, {"Return to Previous Menu": client.exit_section} ] client.section_execute(menuitems_setup, client, ip_add, port) @classmethod def sanity_check_options(cls): """all sanity check sub-options""" client = VsperfClient() ip_add, port = client.get_test_channel_info() menuitems_setup = [ {"Check installed VSPERF": client.sanity_vsperf_check}, {"Check Test Config's VNF path is available on DUT-Host": client.sanity_vnf_path}, {"Check NIC PCIs is available on Traffic Generator": client.sanity_nic_check}, {"Check CPU allocation on DUT-Host": client.cpu_allocation_check}, {"Check installed Collectd": client.sanity_collectd_check}, {"Check Connection between DUT-Host and Traffic Generator Host": client.sanity_dut_tgen_conn_check}, {"Return to Previous Menu": client.exit_section} ] client.section_execute(menuitems_setup, client, ip_add, port) @classmethod def run_test(cls): """run test sub-options""" print("**Before user Run Tests we highly recommend user to perform Sanity Checks.......") client = VsperfClient() ip_add, port = client.get_test_channel_info() menuitems_setup = [ {"Upload Test Configuration File": client.upload_config}, {"Perform Sanity Checks before running tests": client.sanity_check_options}, {"Check if DUT-HOST is available": client.dut_test_availability}, {"Start TGen ": client.start_tgen}, {"Start Beats": client.start_beats}, {"Start Test": client.start_test}, {"Return to Previous Menu": client.exit_section} ] client.section_execute(menuitems_setup, client, ip_add, port) @classmethod def clean_up(cls): """clean-up sub-options""" print( "*******************************************************************\n\n\ IF you are performing Test on IntelPOD 12 - Node 4, Be careful during removal\n\n\ *******************************************************************") client = VsperfClient() ip_add, port = client.get_test_channel_info() menuitems_setup = [ {"Remove VSPERF": client.remove_vsperf}, {"Terminate VSPERF": client.vsperf_terminate}, {"Remove Results from DUT-Host": client.remove_result_folder}, {"Remove Uploaded Configuration File": client.remove_config_files}, {"Remove Collectd": client.remove_collectd}, {"Remove Everything": client.remove_everything}, {"Return to Previous Menu": client.exit_section} ] client.section_execute(menuitems_setup, client, ip_add, port) def run(): """It will run the actul primary options""" client = VsperfClient() client_mode = client.get_mode() print(client_mode) if "deploy" in client_mode.lower().strip(): menuitems = [ {"Establish Connections": client.establish_connection_deploy}, {"Installation": client.vsperf_setup}, {"Upload Configuration Files": client.upload_config_files}, {"Manage DUT-System Configuration": client.manage_sysparam_config}, {"Exit": sys.exit} ] #ip_add, port = client.get_channel_info() #channel = grpc.insecure_channel(ip_add + ':' + port) while True: # os.system('clear') print(colorize(HEADER, 'blue')) print(colorize('version 0.1\n', 'pink')) for item in menuitems: print(colorize("[" + str(menuitems.index(item)) + "]", 'green') + list(item.keys())[0]) choice = input(">> ") try: if int(choice) < 0: raise ValueError list(menuitems[int(choice)].values())[0]() except (ValueError, IndexError): pass elif "test" in client_mode.lower().strip(): menuitems = [ {"Establish Connections": client.establish_connection_test}, {"Run Test": client.run_test}, {"Test Status": client.test_status_check}, {"Clean-Up": client.clean_up}, {"Exit": sys.exit} ] #ip_add, port = client.get_channel_info() #channel = grpc.insecure_channel(ip_add + ':' + port) while True: # os.system('clear') print(colorize(HEADER, 'blue')) print(colorize('version 0.1\n', 'pink')) for item in menuitems: print(colorize("[" + str(menuitems.index(item)) + "]", 'green') + list(item.keys())[0]) choice = input(">> ") try: if int(choice) < 0: raise ValueError list(menuitems[int(choice)].values())[0]() except (ValueError, IndexError): pass elif "together" in client_mode.lower().strip(): menuitems = [ {"Establish Connections": client.establish_connection_both}, {"Installation": client.vsperf_setup}, {"Upload Configuration Files": client.upload_config_files}, {"Manage DUT-System Configuration": client.manage_sysparam_config}, {"Run Test": client.run_test}, {"Test Status": client.test_status_check}, {"Clean-Up": client.clean_up}, {"Exit": sys.exit} ] #ip_add, port = client.get_channel_info() #channel = grpc.insecure_channel(ip_add + ':' + port) while True: # os.system('clear') print(colorize(HEADER, 'blue')) print(colorize('version 0.1\n', 'pink')) for item in menuitems: print(colorize("[" + str(menuitems.index(item)) + "]", 'green') + list(item.keys())[0]) choice = input(">> ") try: if int(choice) < 0: raise ValueError list(menuitems[int(choice)].values())[0]() except (ValueError, IndexError): pass else: print("You have not defined client mode in vsperfclient.conf [!]") if __name__ == '__main__': run()