Commit eb78f3b9 authored by Remi Hardy's avatar Remi Hardy

Merge branch 'rh_ci_fr1' of https://gitlab.eurecom.fr/oai/openairinterface5g into rh_ci_fr1

parents b5e17fb2 e2b19083
...@@ -33,14 +33,17 @@ import logging ...@@ -33,14 +33,17 @@ import logging
import sshconnection import sshconnection
#time.sleep #time.sleep
import time import time
#to load cots_ue dictionary
import yaml
class CotsUe: class CotsUe:
def __init__(self,model,UEIPAddr,UEUserName,UEPassWord): def __init__(self,ADBIPAddr,ADBUserName,ADBPassWord):
self.model = model self.cots_id = '' #cots id from yaml oppo, s10 etc...
self.UEIPAddr = UEIPAddr self.ADBIPAddr = ADBIPAddr
self.UEUserName = UEUserName self.ADBUserName = ADBUserName
self.UEPassWord = UEPassWord self.ADBPassWord = ADBPassWord
self.runargs = '' #on of off to toggle airplane mode on/off self.cots_run_mode = '' #on of off to toggle airplane mode on/off
self.__cots_cde_dict_file = 'cots_ue_ctl.yaml'
self.__SetAirplaneRetry = 3 self.__SetAirplaneRetry = 3
#-----------------$ #-----------------$
...@@ -49,39 +52,50 @@ class CotsUe: ...@@ -49,39 +52,50 @@ class CotsUe:
def Check_Airplane(self): def Check_Airplane(self):
mySSH = sshconnection.SSHConnection() mySSH = sshconnection.SSHConnection()
mySSH.open(self.UEIPAddr, self.UEUserName, self.UEPassWord) mySSH.open(self.ADBIPAddr, self.ADBUserName, self.ADBPassWord)
status=mySSH.cde_check_value('sudo adb shell settings get global airplane_mode_on ', ['0','1'],5) status=mySSH.cde_check_value('sudo adb shell settings get global airplane_mode_on ', ['0','1'],5)
mySSH.close() mySSH.close()
return status return status
def Set_Airplane(self,target_state_str): def Set_Airplane(self, target_id, target_state_str):
mySSH = sshconnection.SSHConnection() #load cots commands dictionary
mySSH.open(self.UEIPAddr, self.UEUserName, self.UEPassWord) with open(self.__cots_cde_dict_file,'r') as file:
mySSH.command('sudo adb start-server','$',5) cots_ue_ctl = yaml.load(file,Loader=yaml.FullLoader)
logging.info("Toggling COTS UE Airplane mode to : "+target_state_str) #check if ue id is in the dictionary
current_state = self.Check_Airplane() if target_id in cots_ue_ctl:
if target_state_str.lower()=="on": mySSH = sshconnection.SSHConnection()
target_state=1 mySSH.open(self.ADBIPAddr, self.ADBUserName, self.ADBPassWord)
else: mySSH.command('sudo adb start-server','\$',5)
target_state=0 logging.info("Toggling COTS UE Airplane mode to : "+target_state_str)
if current_state != target_state: #get current state
#toggle state current_state = self.Check_Airplane()
retry = 0 if target_state_str.lower()=="on":
while (current_state!=target_state) and (retry < self.__SetAirplaneRetry): target_state=1
mySSH.command('sudo adb shell am start -a android.settings.AIRPLANE_MODE_SETTINGS', '\$', 5) else:
mySSH.command('sudo adb shell input keyevent 20', '\$', 5) target_state=0
mySSH.command('sudo adb shell input tap 968 324', '\$', 5)
time.sleep(1)
current_state = self.Check_Airplane()
retry+=1
if current_state != target_state: if current_state != target_state:
logging.error("ATTENTION : Could not toggle to : "+target_state_str) #toggle state
logging.error("Current state is : "+ str(current_state)) retry = 0
while (current_state!=target_state) and (retry < self.__SetAirplaneRetry):
#loop over the command list from dictionary for the selected ue, to switch to required state
for i in range (0,len(cots_ue_ctl[target_id])):
mySSH.command(cots_ue_ctl[target_id][i], '\$', 5)
time.sleep(1)
current_state = self.Check_Airplane()
retry+=1
#could not toggle despite the retry
if current_state != target_state:
logging.error("ATTENTION : Could not toggle to : "+target_state_str)
logging.error("Current state is : "+ str(current_state))
else:
print("Airplane mode is already "+ target_state_str)
mySSH.command('sudo adb kill-server','\$',5)
mySSH.close()
#ue id is NOT in the dictionary
else: else:
print("Airplane mode is already "+ target_state_str) logging.error("COTS UE Id from XML could not be found in UE YAML dictionary " + self.__cots_cde_dict_file)
mySSH.command('sudo adb kill-server','$',5) sys.exit("COTS UE Id from XML could not be found in UE YAML dictionary " + self.__cots_cde_dict_file)
mySSH.close()
......
oppo:
- adb shell am start -a android.settings.AIRPLANE_MODE_SETTINGS
- adb shell input keyevent 20
- adb shell input tap 968 324
s10:
- adb shell input keyevent KEYCODE_POWER
- adb shell input swipe 200 900 200 300
- adb shell am start -a android.settings.AIRPLANE_MODE_SETTINGS
- adb shell input tap 968 324
s20:
- adb shell input keyevent KEYCODE_POWER
- adb shell input swipe 200 900 200 300
- adb shell am start -a android.settings.AIRPLANE_MODE_SETTINGS
- adb shell input tap 968 324
xperia:
- tbd
- tbd
- tbd
...@@ -3295,7 +3295,8 @@ def GetParametersFromXML(action): ...@@ -3295,7 +3295,8 @@ def GetParametersFromXML(action):
ldpc.runargs = test.findtext('physim_run_args') ldpc.runargs = test.findtext('physim_run_args')
if action == 'COTS_UE_Airplane': if action == 'COTS_UE_Airplane':
COTS_UE.runargs = test.findtext('cots_ue_airplane_args') COTS_UE.cots_id = test.findtext('cots_id')
COTS_UE.cots_run_mode = test.findtext('cots_run_mode')
#check if given test is in list #check if given test is in list
#it is in list if one of the strings in 'list' is at the beginning of 'test' #it is in list if one of the strings in 'list' is at the beginning of 'test'
...@@ -3323,11 +3324,15 @@ import yaml ...@@ -3323,11 +3324,15 @@ import yaml
xml_class_list_file='' xml_class_list_file=''
if (os.path.isfile('xml_class_list.yml')): if (os.path.isfile('xml_class_list.yml')):
xml_class_list_file='xml_class_list.yml' xml_class_list_file='xml_class_list.yml'
if (os.path.isfile('ci-scripts/xml_class_list.yml')): elif (os.path.isfile('ci_scripts/xml_class_list.yml')):
xml_class_list_file='ci-scripts/xml_class_list.yml' xml_class_list_file='ci_scripts/xml_class_list.yml'
else:
logging.error("XML action list yaml file cannot be found")
sys.exit("XML action list yaml file cannot be found")
#file will be opened only if it exists
with open(xml_class_list_file,'r') as file: with open(xml_class_list_file,'r') as file:
# The FullLoader parameter handles the conversion from YAML # The FullLoader parameter handles the conversion
# scalar values to Python the dictionary format #from YAML scalar values to Python dictionary format
xml_class_list = yaml.load(file,Loader=yaml.FullLoader) xml_class_list = yaml.load(file,Loader=yaml.FullLoader)
mode = '' mode = ''
...@@ -3375,8 +3380,9 @@ if py_param_file_present == True: ...@@ -3375,8 +3380,9 @@ if py_param_file_present == True:
#----------------------------------------------------------- #-----------------------------------------------------------
# COTS UE instanciation # COTS UE instanciation
#----------------------------------------------------------- #-----------------------------------------------------------
#COTS_UE instanciation can only be done here for the moment, due to code architecture #COTS_UE instanciation and ADB server init
COTS_UE=cls_cots_ue.CotsUe('oppo', CiTestObj.UEIPAddress, CiTestObj.UEUserName,CiTestObj.UEPassword) #ue id and ue mode are retrieved from xml
COTS_UE=cls_cots_ue.CotsUe(CiTestObj.ADBIPAddress, CiTestObj.ADBUserName,CiTestObj.ADBPassword)
#----------------------------------------------------------- #-----------------------------------------------------------
...@@ -3689,7 +3695,8 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re ...@@ -3689,7 +3695,8 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
elif action == 'Run_PhySim': elif action == 'Run_PhySim':
HTML=ldpc.Run_PhySim(HTML,CONST,id) HTML=ldpc.Run_PhySim(HTML,CONST,id)
elif action == 'COTS_UE_Airplane': elif action == 'COTS_UE_Airplane':
COTS_UE.Set_Airplane(COTS_UE.runargs) #cots id and cots run mode were read from xml test file
COTS_UE.Set_Airplane(COTS_UE.cots_id, COTS_UE.cots_run_mode)
else: else:
sys.exit('Invalid class (action) from xml') sys.exit('Invalid class (action) from xml')
CiTestObj.FailReportCnt += 1 CiTestObj.FailReportCnt += 1
......
...@@ -90,6 +90,7 @@ class RANManagement(): ...@@ -90,6 +90,7 @@ class RANManagement():
self.epcPcapFile = '' self.epcPcapFile = ''
self.htmlObj = None self.htmlObj = None
self.epcObj = None self.epcObj = None
self.runtime_stats= ''
...@@ -614,7 +615,7 @@ class RANManagement(): ...@@ -614,7 +615,7 @@ class RANManagement():
logging.debug('\u001B[1m Analyzing eNB replay logfile \u001B[0m') logging.debug('\u001B[1m Analyzing eNB replay logfile \u001B[0m')
logStatus = self.AnalyzeLogFile_eNB(extracted_log_file) logStatus = self.AnalyzeLogFile_eNB(extracted_log_file)
if self.htmlObj is not None: if self.htmlObj is not None:
self.htmlObj.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK) self.htmlObj.CreateHtmlTestRow(self.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK)
self.eNBLogFiles[int(self.eNB_instance)] = '' self.eNBLogFiles[int(self.eNB_instance)] = ''
else: else:
analyzeFile = False analyzeFile = False
...@@ -643,10 +644,10 @@ class RANManagement(): ...@@ -643,10 +644,10 @@ class RANManagement():
return return
else: else:
if self.htmlObj is not None: if self.htmlObj is not None:
self.htmlObj.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK) self.htmlObj.CreateHtmlTestRow(self.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK)
else: else:
if self.htmlObj is not None: if self.htmlObj is not None:
self.htmlObj.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK) self.htmlObj.CreateHtmlTestRow(self.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK)
self.eNBmbmsEnables[int(self.eNB_instance)] = False self.eNBmbmsEnables[int(self.eNB_instance)] = False
self.eNBstatuses[int(self.eNB_instance)] = -1 self.eNBstatuses[int(self.eNB_instance)] = -1
...@@ -712,16 +713,20 @@ class RANManagement(): ...@@ -712,16 +713,20 @@ class RANManagement():
if runTime != '': if runTime != '':
result = re.search('Time executing user inst', str(line)) result = re.search('Time executing user inst', str(line))
if result is not None: if result is not None:
userTime = 'to be decoded - 1' fields=line.split(':')
userTime = 'userTime : ' + fields[1].replace('\n','')
result = re.search('Time executing system inst', str(line)) result = re.search('Time executing system inst', str(line))
if result is not None: if result is not None:
systemTime = 'to be decoded - 2' fields=line.split(':')
systemTime = 'systemTime : ' + fields[1].replace('\n','')
result = re.search('Max. Phy. memory usage:', str(line)) result = re.search('Max. Phy. memory usage:', str(line))
if result is not None: if result is not None:
maxPhyMemUsage = 'to be decoded - 3' fields=line.split(':')
maxPhyMemUsage = 'maxPhyMemUsage : ' + fields[1].replace('\n','')
result = re.search('Number of context switch.*process origin', str(line)) result = re.search('Number of context switch.*process origin', str(line))
if result is not None: if result is not None:
nbContextSwitches = 'to be decoded - 4' fields=line.split(':')
nbContextSwitches = 'nbContextSwitches : ' + fields[1].replace('\n','')
if X2HO_state == CONST.X2_HO_REQ_STATE__IDLE: if X2HO_state == CONST.X2_HO_REQ_STATE__IDLE:
result = re.search('target eNB Receives X2 HO Req X2AP_HANDOVER_REQ', str(line)) result = re.search('target eNB Receives X2 HO Req X2AP_HANDOVER_REQ', str(line))
if result is not None: if result is not None:
...@@ -978,11 +983,12 @@ class RANManagement(): ...@@ -978,11 +983,12 @@ class RANManagement():
global_status = CONST.ENB_PROCESS_REALTIME_ISSUE global_status = CONST.ENB_PROCESS_REALTIME_ISSUE
if self.htmlObj is not None: if self.htmlObj is not None:
self.htmlObj.htmleNBFailureMsg=htmleNBFailureMsg self.htmlObj.htmleNBFailureMsg=htmleNBFailureMsg
# Runtime statistics # Runtime statistics for console output and HTML
if runTime != '': if runTime != '':
logging.debug(runTime) logging.debug(runTime)
logging.debug('Time executing user inst : ' + userTime) logging.debug(userTime)
logging.debug('Time executing system inst : ' + systemTime) logging.debug(systemTime)
logging.debug('Max Physical Memory Usage : ' + maxPhyMemUsage) logging.debug(maxPhyMemUsage)
logging.debug('Nb Context Switches : ' + nbContextSwitches) logging.debug(nbContextSwitches)
self.runtime_stats=runTime + '\n' + userTime + '\n' + systemTime + '\n' + maxPhyMemUsage + '\n' + nbContextSwitches
return global_status return global_status
...@@ -32,7 +32,8 @@ ...@@ -32,7 +32,8 @@
<testCase id="010000"> <testCase id="010000">
<class>COTS_UE_Airplane</class> <class>COTS_UE_Airplane</class>
<desc>Toggle COTS Airplane mode ON</desc> <desc>Toggle COTS Airplane mode ON</desc>
<cots_ue_airplane_args>ON</cots_ue_airplane_args> <cots_id>oppo</cots_id>
<cots_run_mode>ON</cots_run_mode>
</testCase> </testCase>
......
## Table of Contents ##
1. [Legacy 1 Bench](#legacy-1-bench)
2. [Legacy 2 Bench](#legacy-2-bench)
3. [Next Bench for DEV](#next-bench-for-dev)
4. [Next Bench for CI](#next-bench-for-ci)
5. [Live Network Bench](#live-network-bench)
6. [Multi-RRU Bench](#multi-rru-bench)
## Legacy 1 Bench
![image info](./testbenches_doc_resources/legacy1.jpg)
## Legacy 2 Bench
![image info](./testbenches_doc_resources/legacy2.jpg)
## Next Bench for DEV
![image info](./testbenches_doc_resources/next_dev.jpg)
## Next Bench for CI
![image info](./testbenches_doc_resources/next_ci.jpg)
## Live Network Bench
![image info](./testbenches_doc_resources/live_network.jpg)
## Multi-RRU Bench
![image info](./testbenches_doc_resources/multi_rru.jpg)
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