Improve code for retx checkers
This commit is contained in:
+42
-60
@@ -748,6 +748,25 @@ class RANManagement():
|
|||||||
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S rm enb*.log core* enb_*record.raw enb_*.pcap gnb_*.pcap enb_*txt physim_*.log *stats.log *monitor.pickle *monitor*.png ping*.log* iperf*.log log/*/*.log log/*/*.pcap', '\$', 15)
|
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S rm enb*.log core* enb_*record.raw enb_*.pcap gnb_*.pcap enb_*txt physim_*.log *stats.log *monitor.pickle *monitor*.png ping*.log* iperf*.log log/*/*.log log/*/*.pcap', '\$', 15)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
|
|
||||||
|
def _analyzeUeRetx(self, rounds, checkers, regex):
|
||||||
|
if len(rounds) == 0 or len(checkers) == 0:
|
||||||
|
logging.warning(f'warning: rounds={rounds} checkers={checkers}')
|
||||||
|
return []
|
||||||
|
|
||||||
|
perc = list(0 for i in checkers) # results in %
|
||||||
|
stats = list(False for i in checkers) # status if succeeded
|
||||||
|
tmp = re.match(regex, rounds)
|
||||||
|
if tmp is None:
|
||||||
|
logging.error('_analyzeUeRetx: did not match regex for DL retx analysis')
|
||||||
|
return stats
|
||||||
|
retx_data = [float(x) for x in tmp.groups()]
|
||||||
|
for i in range(0, len(perc)):
|
||||||
|
#case where numerator > denumerator with denum ==0 is disregarded, cannot hapen in principle, will lead to 0%
|
||||||
|
perc[i] = 0 if (retx_data[i] == 0) else 100 * retx_data[i + 1] / retx_data[i]
|
||||||
|
#treating % > 100 , % > requirement
|
||||||
|
stats[i] = perc[i] < 100 and perc[i] <= checkers[i]
|
||||||
|
return stats
|
||||||
|
|
||||||
def AnalyzeLogFile_eNB(self, eNBlogFile, HTML, checkers={}):
|
def AnalyzeLogFile_eNB(self, eNBlogFile, HTML, checkers={}):
|
||||||
if (not os.path.isfile('./' + eNBlogFile)):
|
if (not os.path.isfile('./' + eNBlogFile)):
|
||||||
return -1
|
return -1
|
||||||
@@ -809,8 +828,7 @@ class RANManagement():
|
|||||||
gnb_markers ={'SgNBReleaseRequestAcknowledge': [],'FAILURE': [], 'scgFailureInformationNR-r15': [], 'SgNBReleaseRequest': [], 'Detected UL Failure on PUSCH':[]}
|
gnb_markers ={'SgNBReleaseRequestAcknowledge': [],'FAILURE': [], 'scgFailureInformationNR-r15': [], 'SgNBReleaseRequest': [], 'Detected UL Failure on PUSCH':[]}
|
||||||
nodeB_prefix_found = False
|
nodeB_prefix_found = False
|
||||||
RealTimeProcessingIssue = False
|
RealTimeProcessingIssue = False
|
||||||
DLRetxIssue = False
|
retx_status = {}
|
||||||
ULRetxIssue = False
|
|
||||||
nrRrcRcfgComplete = 0
|
nrRrcRcfgComplete = 0
|
||||||
harqFeedbackPast = 0
|
harqFeedbackPast = 0
|
||||||
showedByeMsg = False # last line is Bye. -> stopped properly
|
showedByeMsg = False # last line is Bye. -> stopped properly
|
||||||
@@ -993,7 +1011,8 @@ class RANManagement():
|
|||||||
rnti = result.group(1)
|
rnti = result.group(1)
|
||||||
|
|
||||||
#remove 1- all useless char before relevant info (ulsch or dlsch) 2- trailing char
|
#remove 1- all useless char before relevant info (ulsch or dlsch) 2- trailing char
|
||||||
dlsch_ulsch_stats[rnti+k]=re.sub(r'^.*\]\s+', r'' , line.rstrip())
|
if not rnti in dlsch_ulsch_stats: dlsch_ulsch_stats[rnti] = {}
|
||||||
|
dlsch_ulsch_stats[rnti][k]=re.sub(r'^.*\]\s+', r'' , line.rstrip())
|
||||||
|
|
||||||
result = re.search('Received NR_RRCReconfigurationComplete from UE', str(line))
|
result = re.search('Received NR_RRCReconfigurationComplete from UE', str(line))
|
||||||
if result is not None:
|
if result is not None:
|
||||||
@@ -1139,51 +1158,20 @@ class RANManagement():
|
|||||||
htmleNBFailureMsg += htmlMsg
|
htmleNBFailureMsg += htmlMsg
|
||||||
|
|
||||||
#ulsch and dlsch statistics and checkers
|
#ulsch and dlsch statistics and checkers
|
||||||
#print statistics into html
|
for ue in dlsch_ulsch_stats:
|
||||||
if len(dlsch_ulsch_stats)!=0: #check if dictionary is not empty
|
dlulstat = dlsch_ulsch_stats[ue]
|
||||||
#for each dictionary key, generate the msg for html as information
|
#print statistics into html
|
||||||
statMsg=''
|
statMsg=''
|
||||||
for key in dlsch_ulsch_stats:
|
for key in dlulstat:
|
||||||
statMsg += dlsch_ulsch_stats[key] + '\n'
|
statMsg += dlulstat[key] + '\n'
|
||||||
logging.debug(dlsch_ulsch_stats[key])
|
logging.debug(dlulstat[key])
|
||||||
htmleNBFailureMsg += statMsg
|
htmleNBFailureMsg += statMsg
|
||||||
|
|
||||||
#checker
|
retx_status[ue] = {}
|
||||||
if (len(dlsch_ulsch_stats)!=0) and (len(checkers)!=0):
|
dlcheckers = [] if 'd_retx_th' not in checkers else checkers['d_retx_th']
|
||||||
if 'd_retx_th' in checkers:
|
retx_status[ue]['dl'] = self._analyzeUeRetx(dlulstat['dlsch_rounds'], dlcheckers, r'^.*dlsch_rounds\s+(\d+)\/(\d+)\/(\d+)\/(\d+),\s+dlsch_errors\s+(\d+)')
|
||||||
dlsch_checker_status = list(0 for i in checkers['d_retx_th'])#status 0 / -1
|
ulcheckers = [] if 'u_retx_th' not in checkers else checkers['u_retx_th']
|
||||||
d_perc_retx = list(0 for i in checkers['d_retx_th'])#results in %
|
retx_status[ue]['ul'] = self._analyzeUeRetx(dlulstat['ulsch_rounds'], ulcheckers, r'^.*ulsch_rounds\s+(\d+)\/(\d+)\/(\d+)\/(\d+),\s+.*,\s+ulsch_errors\s+(\d+)')
|
||||||
|
|
||||||
if 'u_retx_th' in checkers:
|
|
||||||
ulsch_checker_status = list(0 for i in checkers['u_retx_th'])
|
|
||||||
u_perc_retx = list(0 for i in checkers['u_retx_th'])
|
|
||||||
|
|
||||||
#ul and dl retransmissions checkers
|
|
||||||
#NOTICE: DL and UL regex are different
|
|
||||||
|
|
||||||
if ('dlsch_rounds' in dlsch_ulsch_stats) and ('d_retx_th' in checkers):
|
|
||||||
tmp=re.match(r'^.*dlsch_rounds\s+(\d+)\/(\d+)\/(\d+)\/(\d+),\s+dlsch_errors\s+(\d+)',dlsch_ulsch_stats['dlsch_rounds'])
|
|
||||||
if tmp is not None :
|
|
||||||
#captures the different groups from the regex
|
|
||||||
retx_data=[float(x) for x in tmp.groups()]
|
|
||||||
for i in range(0,len(d_perc_retx)):
|
|
||||||
#case where numerator > denumerator with denum ==0 is disregarded, cannot hapen in principle, will lead to 0%
|
|
||||||
d_perc_retx[i] = 0 if (retx_data[i] == 0) else 100*retx_data[i+1]/retx_data[i]
|
|
||||||
#treating % > 100 , % > requirement
|
|
||||||
if (d_perc_retx[i] > 100) or (d_perc_retx[i] > checkers['d_retx_th'][i]): dlsch_checker_status[i] = -1
|
|
||||||
if -1 in dlsch_checker_status:
|
|
||||||
DLRetxIssue = True
|
|
||||||
|
|
||||||
if ('ulsch_rounds' in dlsch_ulsch_stats) and ('u_retx_th' in checkers):
|
|
||||||
tmp=re.match(r'^.*ulsch_rounds\s+(\d+)\/(\d+)\/(\d+)\/(\d+),\s+.*,\s+ulsch_errors\s+(\d+)',dlsch_ulsch_stats['ulsch_rounds'])
|
|
||||||
if tmp is not None :
|
|
||||||
retx_data=[float(x) for x in tmp.groups()]
|
|
||||||
for i in range(0,len(d_perc_retx)):
|
|
||||||
u_perc_retx[i] = 0 if (retx_data[i] == 0) else 100*retx_data[i+1]/retx_data[i]
|
|
||||||
if (u_perc_retx[i] > 100) or (u_perc_retx[i] > checkers['u_retx_th'][i]): ulsch_checker_status[i] = -1
|
|
||||||
if -1 in ulsch_checker_status:
|
|
||||||
ULRetxIssue = True
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#real time statistics
|
#real time statistics
|
||||||
@@ -1244,21 +1232,15 @@ class RANManagement():
|
|||||||
logging.debug(statMsg)
|
logging.debug(statMsg)
|
||||||
htmleNBFailureMsg += htmlMsg
|
htmleNBFailureMsg += htmlMsg
|
||||||
|
|
||||||
if DLRetxIssue:
|
for ue in retx_status:
|
||||||
retx_checker_status_str = ''
|
msg = f"retransmissions for UE {ue}: DL {retx_status[ue]['dl']} UL {retx_status[ue]['ul']}"
|
||||||
for status in dlsch_checker_status : retx_checker_status_str+=str(status)+ ' '
|
if False in retx_status[ue]['dl'] or False in retx_status[ue]['ul']:
|
||||||
logging.debug('\u001B[1;37;41m ' + nodeB_prefix + 'NB ended with too many retransmissions / errors issue in DL ! \u001B[0m')
|
msg = 'Failure: ' + msg
|
||||||
logging.debug('\u001B[1;37;41m Status : ' + retx_checker_status_str + ' \u001B[0m')
|
logging.error(f'\u001B[1;37;41m {msg}\u001B[0m')
|
||||||
htmleNBFailureMsg += 'Fail due to retransmissions / errors issue in DL, status : ' + retx_checker_status_str + '\n'
|
htmleNBFailureMsg += f'{msg}\n'
|
||||||
global_status = CONST.ENB_RETX_ISSUE
|
global_status = CONST.ENB_RETX_ISSUE
|
||||||
|
else:
|
||||||
if ULRetxIssue:
|
logging.debug(msg)
|
||||||
retx_checker_status_str = ''
|
|
||||||
for status in ulsch_checker_status : retx_checker_status_str+=str(status)+ ' '
|
|
||||||
logging.debug('\u001B[1;37;41m ' + nodeB_prefix + 'NB ended with too many retransmissions / errors issue in UL ! \u001B[0m')
|
|
||||||
logging.debug('\u001B[1;37;41m Status : ' + retx_checker_status_str + ' \u001B[0m')
|
|
||||||
htmleNBFailureMsg += 'Fail due to retransmissions / errors issue in UL, status : ' + retx_checker_status_str + '\n'
|
|
||||||
global_status = CONST.ENB_RETX_ISSUE
|
|
||||||
|
|
||||||
if RealTimeProcessingIssue:
|
if RealTimeProcessingIssue:
|
||||||
logging.debug('\u001B[1;37;41m ' + nodeB_prefix + 'NB ended with real time processing issue! \u001B[0m')
|
logging.debug('\u001B[1;37;41m ' + nodeB_prefix + 'NB ended with real time processing issue! \u001B[0m')
|
||||||
|
|||||||
Reference in New Issue
Block a user