Commit d1086483 authored by Robert Schmidt's avatar Robert Schmidt

Handle parameter reading and test case execution together

For reasons I don't understand, the XML option reading and actual test
case execution are at different places in the code. This is problematic,
because what this led to is that options are not passed as function
arguments, but indirectly through class members. This led to a lot of
"indirect code"; it's a total mess

To improve this, move them together, so that parameters can be passed
directly as function arguments later on.

Because we reference the globals, mark them inside
ExecuteActionWithParam(). That is a Python antipattern, but necessary at
this moment. I believe that we can remove the following globals over
time:

- SSH (with new cls_cmd, which we don't need to pass)
- EPC (replaced through a class similar to ue_module, i.e., refer to
  core networks on specific hosts through an ID, instead of a global)
- HTML (should use templating, where individual functions give back a
  dictionary of what they want to print, and a final pass assembles the
  entire HTML file)
- RAN/SCA/PHYSIM/CLUSTER/ldpc (can be replaced with stateless scripts
  build/run eNB/gNB on a specific node)
parent e9f9718f
...@@ -102,7 +102,16 @@ def AssignParams(params_dict): ...@@ -102,7 +102,16 @@ def AssignParams(params_dict):
def GetParametersFromXML(action): def ExecuteActionWithParam(action):
global SSH
global EPC
global RAN
global HTML
global CONTAINERS
global SCA
global PHYSIM
global CLUSTER
global ldpc
if action == 'Build_eNB' or action == 'Build_Image' or action == 'Build_Proxy' or action == "Build_Cluster_Image" or action == "Build_Run_Tests": if action == 'Build_eNB' or action == 'Build_Image' or action == 'Build_Proxy' or action == "Build_Cluster_Image" or action == "Build_Run_Tests":
RAN.Build_eNB_args=test.findtext('Build_eNB_args') RAN.Build_eNB_args=test.findtext('Build_eNB_args')
CONTAINERS.imageKind=test.findtext('kind') CONTAINERS.imageKind=test.findtext('kind')
...@@ -139,6 +148,23 @@ def GetParametersFromXML(action): ...@@ -139,6 +148,23 @@ def GetParametersFromXML(action):
proxy_commit = test.findtext('proxy_commit') proxy_commit = test.findtext('proxy_commit')
if proxy_commit is not None: if proxy_commit is not None:
CONTAINERS.proxyCommit = proxy_commit CONTAINERS.proxyCommit = proxy_commit
if action == 'Build_eNB':
RAN.BuildeNB(HTML)
elif action == 'Build_Image':
success = CONTAINERS.BuildImage(HTML)
if not success:
RAN.prematureExit = True
elif action == 'Build_Proxy':
success = CONTAINERS.BuildProxy(HTML)
if not success:
RAN.prematureExit = True
elif action == 'Build_Cluster_Image':
if not CLUSTER.BuildClusterImage(HTML):
RAN.prematureExit = True
elif action == 'Build_Run_Tests':
success = CONTAINERS.BuildRunTests(HTML)
if not success:
RAN.prematureExit = True
elif action == 'Initialize_eNB': elif action == 'Initialize_eNB':
RAN.eNB_Trace=test.findtext('eNB_Trace') RAN.eNB_Trace=test.findtext('eNB_Trace')
...@@ -174,6 +200,7 @@ def GetParametersFromXML(action): ...@@ -174,6 +200,7 @@ def GetParametersFromXML(action):
cmd_prefix = test.findtext('cmd_prefix') cmd_prefix = test.findtext('cmd_prefix')
if cmd_prefix is not None: RAN.cmd_prefix = cmd_prefix if cmd_prefix is not None: RAN.cmd_prefix = cmd_prefix
RAN.InitializeeNB(HTML, EPC)
elif action == 'Terminate_eNB': elif action == 'Terminate_eNB':
eNB_instance=test.findtext('eNB_instance') eNB_instance=test.findtext('eNB_instance')
...@@ -201,6 +228,7 @@ def GetParametersFromXML(action): ...@@ -201,6 +228,7 @@ def GetParametersFromXML(action):
RAN.air_interface[RAN.eNB_instance] = 'lte-softmodem' RAN.air_interface[RAN.eNB_instance] = 'lte-softmodem'
else: else:
RAN.air_interface[RAN.eNB_instance] = air_interface.lower() +'-softmodem' RAN.air_interface[RAN.eNB_instance] = air_interface.lower() +'-softmodem'
RAN.TerminateeNB(HTML, EPC)
elif action == 'Initialize_UE' or action == 'Attach_UE' or action == 'Detach_UE' or action == 'Terminate_UE' or action == 'CheckStatusUE' or action == 'DataEnable_UE' or action == 'DataDisable_UE': elif action == 'Initialize_UE' or action == 'Attach_UE' or action == 'Detach_UE' or action == 'Terminate_UE' or action == 'CheckStatusUE' or action == 'DataEnable_UE' or action == 'DataDisable_UE':
CiTestObj.ue_ids = test.findtext('id').split(' ') CiTestObj.ue_ids = test.findtext('id').split(' ')
...@@ -211,6 +239,20 @@ def GetParametersFromXML(action): ...@@ -211,6 +239,20 @@ def GetParametersFromXML(action):
sys.exit("Mismatch in number of Nodes and UIs") sys.exit("Mismatch in number of Nodes and UIs")
else: else:
CiTestObj.nodes = [None] * len(CiTestObj.ue_ids) CiTestObj.nodes = [None] * len(CiTestObj.ue_ids)
if action == 'Initialize_UE':
CiTestObj.InitializeUE(HTML)
elif action == 'Attach_UE':
CiTestObj.AttachUE(HTML, RAN, EPC, CONTAINERS)
elif action == 'Detach_UE':
CiTestObj.DetachUE(HTML)
elif action == 'Terminate_UE':
CiTestObj.TerminateUE(HTML)
elif action == 'CheckStatusUE':
CiTestObj.CheckStatusUE(HTML)
elif action == 'DataEnable_UE':
CiTestObj.DataEnableUE(HTML)
elif action == 'DataDisable_UE':
CiTestObj.DataDisableUE(HTML)
elif action == 'Ping': elif action == 'Ping':
CiTestObj.ping_args = test.findtext('ping_args') CiTestObj.ping_args = test.findtext('ping_args')
...@@ -224,6 +266,7 @@ def GetParametersFromXML(action): ...@@ -224,6 +266,7 @@ def GetParametersFromXML(action):
else: else:
CiTestObj.nodes = [None] * len(CiTestObj.ue_ids) CiTestObj.nodes = [None] * len(CiTestObj.ue_ids)
ping_rttavg_threshold = test.findtext('ping_rttavg_threshold') or '' ping_rttavg_threshold = test.findtext('ping_rttavg_threshold') or ''
CiTestObj.Ping(HTML,RAN,EPC,CONTAINERS)
elif action == 'Iperf' or action == 'Iperf2_Unidir': elif action == 'Iperf' or action == 'Iperf2_Unidir':
CiTestObj.iperf_args = test.findtext('iperf_args') CiTestObj.iperf_args = test.findtext('iperf_args')
...@@ -249,14 +292,10 @@ def GetParametersFromXML(action): ...@@ -249,14 +292,10 @@ def GetParametersFromXML(action):
if CiTestObj.iperf_options != 'check' and CiTestObj.iperf_options != 'sink': if CiTestObj.iperf_options != 'check' and CiTestObj.iperf_options != 'sink':
logging.error('test-case has wrong option ' + CiTestObj.iperf_options) logging.error('test-case has wrong option ' + CiTestObj.iperf_options)
CiTestObj.iperf_options = 'check' CiTestObj.iperf_options = 'check'
if action == 'Iperf':
elif action == 'Iperf2_Unidir': CiTestObj.Iperf(HTML,RAN,EPC,CONTAINERS)
CiTestObj.iperf_args = test.findtext('iperf_args') elif action == 'Iperf2_Unidir':
CiTestObj.ue_ids = test.findtext('id').split(' ') CiTestObj.Iperf2_Unidir(HTML,RAN,EPC,CONTAINERS)
CiTestObj.svr_id = test.findtext('svr_id') or None
CiTestObj.iperf_packetloss_threshold = test.findtext('iperf_packetloss_threshold')
CiTestObj.iperf_bitrate_threshold = test.findtext('iperf_bitrate_threshold') or '90'
CiTestObj.iperf_profile = test.findtext('iperf_profile') or 'balanced'
elif action == 'IdleSleep': elif action == 'IdleSleep':
string_field = test.findtext('idle_sleep_time_in_sec') string_field = test.findtext('idle_sleep_time_in_sec')
...@@ -264,6 +303,7 @@ def GetParametersFromXML(action): ...@@ -264,6 +303,7 @@ def GetParametersFromXML(action):
CiTestObj.idle_sleep_time = 5 CiTestObj.idle_sleep_time = 5
else: else:
CiTestObj.idle_sleep_time = int(string_field) CiTestObj.idle_sleep_time = int(string_field)
CiTestObj.IdleSleep(HTML)
elif action == 'Build_PhySim': elif action == 'Build_PhySim':
ldpc.buildargs = test.findtext('physim_build_args') ldpc.buildargs = test.findtext('physim_build_args')
...@@ -275,33 +315,54 @@ def GetParametersFromXML(action): ...@@ -275,33 +315,54 @@ def GetParametersFromXML(action):
ldpc.forced_workspace_cleanup=True ldpc.forced_workspace_cleanup=True
else: else:
ldpc.forced_workspace_cleanup=False ldpc.forced_workspace_cleanup=False
HTML=ldpc.Build_PhySim(HTML,CONST)
if ldpc.exitStatus==1:
RAN.prematureExit = True
elif action == 'Deploy_Run_PhySim':
PHYSIM.Deploy_PhySim(HTML, RAN)
elif action == 'Initialize_MME': elif action == 'Initialize_MME':
string_field = test.findtext('option') string_field = test.findtext('option')
if (string_field is not None): if (string_field is not None):
EPC.mmeConfFile = string_field EPC.mmeConfFile = string_field
EPC.InitializeMME(HTML)
elif action == 'Initialize_HSS' or action == 'Initialize_SPGW': elif action == 'Initialize_HSS' or action == 'Initialize_SPGW':
pass if action == 'Initialize_HSS':
EPC.InitializeHSS(HTML)
elif action == 'Initialize_SPGW':
EPC.InitializeSPGW(HTML)
elif action == 'Terminate_HSS' or action == 'Terminate_MME' or action == 'Terminate_SPGW': elif action == 'Terminate_HSS' or action == 'Terminate_MME' or action == 'Terminate_SPGW':
pass if action == 'Terminate_HSS':
EPC.TerminateHSS(HTML)
elif action == 'Terminate_MME':
EPC.TerminateMME(HTML)
elif action == 'Terminate_SPGW':
EPC.TerminateSPGW(HTML)
elif action == 'Deploy_EPC': elif action == 'Deploy_EPC':
string_field = test.findtext('parameters') string_field = test.findtext('parameters')
if (string_field is not None): if (string_field is not None):
EPC.yamlPath = string_field EPC.yamlPath = string_field
EPC.DeployEpc(HTML)
elif action == 'Undeploy_EPC':
EPC.UndeployEpc(HTML)
elif action == 'Initialize_5GCN': elif action == 'Initialize_5GCN':
string_field = test.findtext('args') string_field = test.findtext('args')
if (string_field is not None): if (string_field is not None):
EPC.cfgDeploy = string_field EPC.cfgDeploy = string_field
EPC.cnID = test.findtext('cn_id') EPC.cnID = test.findtext('cn_id')
EPC.Initialize5GCN(HTML)
elif action == 'Terminate_5GCN': elif action == 'Terminate_5GCN':
string_field = test.findtext('args') string_field = test.findtext('args')
if (string_field is not None): if (string_field is not None):
EPC.cfgUnDeploy = string_field EPC.cfgUnDeploy = string_field
EPC.cnID = test.findtext('cn_id') EPC.cnID = test.findtext('cn_id')
EPC.Terminate5GCN(HTML)
elif action == 'Deploy_Object' or action == 'Undeploy_Object' or action == "Create_Workspace": elif action == 'Deploy_Object' or action == 'Undeploy_Object' or action == "Create_Workspace":
eNB_instance=test.findtext('eNB_instance') eNB_instance=test.findtext('eNB_instance')
...@@ -326,22 +387,47 @@ def GetParametersFromXML(action): ...@@ -326,22 +387,47 @@ def GetParametersFromXML(action):
string_field = test.findtext('services') string_field = test.findtext('services')
if string_field is not None: if string_field is not None:
CONTAINERS.services[CONTAINERS.eNB_instance] = string_field CONTAINERS.services[CONTAINERS.eNB_instance] = string_field
if action == 'Deploy_Object':
CONTAINERS.DeployObject(HTML)
if CONTAINERS.exitStatus==1:
CiTestObj.AutoTerminateeNB(HTML,RAN,EPC,CONTAINERS)
RAN.prematureExit = True
elif action == 'Undeploy_Object':
CONTAINERS.UndeployObject(HTML, RAN)
if CONTAINERS.exitStatus == 1:
CiTestObj.AutoTerminateeNB(HTML,RAN,EPC,CONTAINERS)
RAN.prematureExit = True
elif action == 'Create_Workspace':
CONTAINERS.Create_Workspace(HTML)
elif action == 'Run_CUDATest' or action == 'Run_NRulsimTest' or action == 'Run_T2Test': elif action == 'Run_CUDATest' or action == 'Run_NRulsimTest' or action == 'Run_T2Test':
ldpc.runargs = test.findtext('physim_run_args') ldpc.runargs = test.findtext('physim_run_args')
ldpc.runsim = test.findtext('physim_run') ldpc.runsim = test.findtext('physim_run')
ldpc.timethrs = test.findtext('physim_time_threshold') ldpc.timethrs = test.findtext('physim_time_threshold')
if action == 'Run_CUDATest':
HTML=ldpc.Run_CUDATest(HTML,CONST,id)
elif action == 'Run_NRulsimTest':
HTML=ldpc.Run_NRulsimTest(HTML,CONST,id)
elif action == 'Run_T2Test':
HTML=ldpc.Run_T2Test(HTML,CONST,id)
if ldpc.exitStatus==1:
RAN.prematureExit = True
elif action == 'LicenceAndFormattingCheck': elif action == 'LicenceAndFormattingCheck':
pass ret = SCA.LicenceAndFormattingCheck(HTML)
if ret != 0:
RAN.prematureExit = True
elif action == 'Cppcheck_Analysis': elif action == 'Cppcheck_Analysis':
pass SCA.CppCheckAnalysis(HTML)
elif action == 'Push_Local_Registry': elif action == 'Push_Local_Registry':
string_field = test.findtext('registry_svr_id') string_field = test.findtext('registry_svr_id')
if (string_field is not None): if (string_field is not None):
CONTAINERS.registrySvrId = string_field CONTAINERS.registrySvrId = string_field
success = CONTAINERS.Push_Image_to_Local_Registry(HTML)
if not success:
RAN.prematureExit = True
elif action == 'Pull_Local_Registry': elif action == 'Pull_Local_Registry':
string_field = test.findtext('test_svr_id') string_field = test.findtext('test_svr_id')
...@@ -351,15 +437,24 @@ def GetParametersFromXML(action): ...@@ -351,15 +437,24 @@ def GetParametersFromXML(action):
string_field = test.findtext('images_to_pull') string_field = test.findtext('images_to_pull')
if (string_field is not None): if (string_field is not None):
CONTAINERS.imageToPull = string_field.split() CONTAINERS.imageToPull = string_field.split()
success = CONTAINERS.Pull_Image_from_Local_Registry(HTML)
if not success:
RAN.prematureExit = True
elif action == 'Clean_Test_Server_Images': elif action == 'Clean_Test_Server_Images':
string_field = test.findtext('test_svr_id') string_field = test.findtext('test_svr_id')
if (string_field is not None): if (string_field is not None):
CONTAINERS.testSvrId = string_field CONTAINERS.testSvrId = string_field
success = CONTAINERS.Clean_Test_Server_Images(HTML)
if not success:
RAN.prematureExit = True
elif action == 'Custom_Command': elif action == 'Custom_Command':
RAN.node = test.findtext('node') RAN.node = test.findtext('node')
RAN.command = test.findtext('command') RAN.command = test.findtext('command')
RAN.command_fail = test.findtext('command_fail') in ['True', 'true', 'Yes', 'yes'] RAN.command_fail = test.findtext('command_fail') in ['True', 'true', 'Yes', 'yes']
RAN.CustomCommand(HTML)
elif action == 'Pull_Cluster_Image': elif action == 'Pull_Cluster_Image':
string_field = test.findtext('images_to_pull') string_field = test.findtext('images_to_pull')
if (string_field is not None): if (string_field is not None):
...@@ -367,8 +462,11 @@ def GetParametersFromXML(action): ...@@ -367,8 +462,11 @@ def GetParametersFromXML(action):
string_field = test.findtext('test_svr_id') string_field = test.findtext('test_svr_id')
if (string_field is not None): if (string_field is not None):
CLUSTER.testSvrId = string_field CLUSTER.testSvrId = string_field
if not CLUSTER.PullClusterImage(HTML,RAN):
RAN.prematureExit = True
else: else:
logging.warning(f"unknown action {action} from option-parsing point-of-view") logging.warning(f"unknown action {action}, skip step")
#check if given test is in list #check if given test is in list
...@@ -672,136 +770,10 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re ...@@ -672,136 +770,10 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
if (CheckClassValidity(xml_class_list, action, id) == False): if (CheckClassValidity(xml_class_list, action, id) == False):
continue continue
CiTestObj.ShowTestID() CiTestObj.ShowTestID()
GetParametersFromXML(action)
try: try:
if action == 'Build_eNB': ExecuteActionWithParam(action)
RAN.BuildeNB(HTML) if RAN.prematureExit:
elif action == 'Custom_Command': CiTestObj.AutoTerminateeNB(HTML,RAN,EPC,CONTAINERS)
RAN.CustomCommand(HTML)
if RAN.prematureExit:
CiTestObj.AutoTerminateeNB(HTML,RAN,EPC,CONTAINERS)
elif action == 'Initialize_eNB':
RAN.InitializeeNB(HTML, EPC)
if RAN.prematureExit:
CiTestObj.AutoTerminateeNB(HTML,RAN,EPC,CONTAINERS)
elif action == 'Terminate_eNB':
RAN.TerminateeNB(HTML, EPC)
elif action == 'Initialize_UE':
CiTestObj.InitializeUE(HTML)
elif action == 'Terminate_UE':
CiTestObj.TerminateUE(HTML)
elif action == 'Attach_UE':
CiTestObj.AttachUE(HTML, RAN, EPC, CONTAINERS)
elif action == 'Detach_UE':
CiTestObj.DetachUE(HTML)
elif action == 'DataDisable_UE':
CiTestObj.DataDisableUE(HTML)
elif action == 'DataEnable_UE':
CiTestObj.DataEnableUE(HTML)
elif action == 'CheckStatusUE':
CiTestObj.CheckStatusUE(HTML)
elif action == 'Ping':
CiTestObj.Ping(HTML,RAN,EPC,CONTAINERS)
elif action == 'Iperf':
CiTestObj.Iperf(HTML,RAN,EPC,CONTAINERS)
elif action == 'Iperf2_Unidir':
CiTestObj.Iperf2_Unidir(HTML,RAN,EPC,CONTAINERS)
elif action == 'Initialize_HSS':
EPC.InitializeHSS(HTML)
elif action == 'Terminate_HSS':
EPC.TerminateHSS(HTML)
elif action == 'Initialize_MME':
EPC.InitializeMME(HTML)
elif action == 'Terminate_MME':
EPC.TerminateMME(HTML)
elif action == 'Initialize_SPGW':
EPC.InitializeSPGW(HTML)
elif action == 'Terminate_SPGW':
EPC.TerminateSPGW(HTML)
elif action == 'Initialize_5GCN':
EPC.Initialize5GCN(HTML)
elif action == 'Terminate_5GCN':
EPC.Terminate5GCN(HTML)
elif action == 'Deploy_EPC':
EPC.DeployEpc(HTML)
elif action == 'Undeploy_EPC':
EPC.UndeployEpc(HTML)
elif action == 'IdleSleep':
CiTestObj.IdleSleep(HTML)
elif action == 'Build_PhySim':
HTML=ldpc.Build_PhySim(HTML,CONST)
if ldpc.exitStatus==1:
RAN.prematureExit = True
elif action == 'Run_CUDATest':
HTML=ldpc.Run_CUDATest(HTML,CONST,id)
if ldpc.exitStatus==1:
RAN.prematureExit = True
elif action == 'Run_T2Test':
HTML=ldpc.Run_T2Test(HTML,CONST,id)
if ldpc.exitStatus==1:
RAN.prematureExit = True
elif action == 'Run_NRulsimTest':
HTML=ldpc.Run_NRulsimTest(HTML,CONST,id)
if ldpc.exitStatus==1:
RAN.prematureExit = True
elif action == 'Pull_Cluster_Image':
if not CLUSTER.PullClusterImage(HTML,RAN):
RAN.prematureExit = True
elif action == 'Build_Cluster_Image':
if not CLUSTER.BuildClusterImage(HTML):
RAN.prematureExit = True
elif action == 'Build_Image':
success = CONTAINERS.BuildImage(HTML)
if not success:
RAN.prematureExit = True
elif action == 'Build_Run_Tests':
success = CONTAINERS.BuildRunTests(HTML)
if not success:
RAN.prematureExit = True
elif action == 'Build_Proxy':
success = CONTAINERS.BuildProxy(HTML)
if not success:
RAN.prematureExit = True
elif action == 'Push_Local_Registry':
success = CONTAINERS.Push_Image_to_Local_Registry(HTML)
if not success:
RAN.prematureExit = True
elif action == 'Pull_Local_Registry':
success = CONTAINERS.Pull_Image_from_Local_Registry(HTML)
if not success:
RAN.prematureExit = True
elif action == 'Clean_Test_Server_Images':
success = CONTAINERS.Clean_Test_Server_Images(HTML)
if not success:
RAN.prematureExit = True
elif action == 'Create_Workspace':
CONTAINERS.Create_Workspace(HTML)
elif action == 'Deploy_Object':
CONTAINERS.DeployObject(HTML)
if CONTAINERS.exitStatus==1:
CiTestObj.AutoTerminateeNB(HTML,RAN,EPC,CONTAINERS)
RAN.prematureExit = True
elif action == 'Undeploy_Object':
CONTAINERS.UndeployObject(HTML, RAN)
if CONTAINERS.exitStatus == 1:
CiTestObj.AutoTerminateeNB(HTML,RAN,EPC,CONTAINERS)
RAN.prematureExit = True
elif action == 'Cppcheck_Analysis':
SCA.CppCheckAnalysis(HTML)
elif action == 'LicenceAndFormattingCheck':
ret = SCA.LicenceAndFormattingCheck(HTML)
if ret != 0:
RAN.prematureExit = True
elif action == 'Deploy_Run_PhySim':
PHYSIM.Deploy_PhySim(HTML, RAN)
elif action == 'IperfFromContainer':
CONTAINERS.IperfFromContainer(HTML, RAN, CiTestObj)
if CONTAINERS.exitStatus==1:
RAN.prematureExit = True
elif action == 'Push_Images_To_Test_Servers':
logging.debug('To be implemented')
else:
sys.exit('Invalid class (action) from xml')
except Exception as e: except Exception as e:
s = traceback.format_exc() s = traceback.format_exc()
logging.error(f'while running CI, an exception occurred:\n{s}') logging.error(f'while running CI, an exception occurred:\n{s}')
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment