diff --git a/ci-scripts/cls_containerize.py b/ci-scripts/cls_containerize.py
index 16fc89613d..235b5cdce9 100644
--- a/ci-scripts/cls_containerize.py
+++ b/ci-scripts/cls_containerize.py
@@ -267,8 +267,6 @@ class Containerize():
self.dockerfileprefix = ''
self.host = ''
- #checkers from xml
- self.ran_checkers={}
self.num_attempts = 1
self.flexricTag = ''
diff --git a/ci-scripts/cls_loganalysis.py b/ci-scripts/cls_loganalysis.py
index 0003b8be69..2369f1115f 100644
--- a/ci-scripts/cls_loganalysis.py
+++ b/ci-scripts/cls_loganalysis.py
@@ -38,3 +38,97 @@ class ContainsString:
if re.search(needle, line):
return True, ""
return False, f"could not find '{needle}' in logs"
+
+class RetxCheck():
+ def _parseList(s):
+ if not s:
+ return []
+ return [int(n) for n in s.split(",")]
+
+ def _get_ul_dl(s):
+ dl, ul = (None, None)
+ for o in s.split(";", 1):
+ if o.startswith("dl="):
+ dl = o[3:]
+ elif o.startswith("ul="):
+ ul = o[3:]
+ else:
+ raise ValueError(f"unrecognized option {s}: needs format '[ul=,dl=]X,Y,...[;ul=Z,V,...]'")
+ return dl, ul
+
+ def _parseRetxCheckers(options):
+ if not "=" in options:
+ dlul = RetxCheck._parseList(options)
+ return dlul, dlul
+ dl, ul = RetxCheck._get_ul_dl(options)
+ return RetxCheck._parseList(dl), RetxCheck._parseList(ul)
+
+ def _analyzeUeRetx(rounds, checkers, regex):
+ 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 _filter_retx_rounds(l):
+ # map to round number if False, else None
+ l = [i+1 if x is False else None for i, x in enumerate(l)]
+ # filter out None
+ return [x for x in l if x is not None]
+
+ def run(file, options):
+ # aggregate statistics per UE
+ dlsch_ulsch_stats = {}
+ status = True
+ with open(file, "r") as f:
+ for line in f.readlines():
+ keys = {'dlsch_rounds','ulsch_rounds'}
+ for k in keys:
+ result = re.search(k, line)
+ if result is None:
+ continue
+ result = re.search('UE (?:RNTI )?([0-9a-f]{4})', line)
+ if result is None:
+ logging.error(f'did not find RNTI while matching key {k}')
+ status = False
+ continue
+ rnti = result.group(1)
+ if not rnti in dlsch_ulsch_stats:
+ dlsch_ulsch_stats[rnti] = {}
+ dlsch_ulsch_stats[rnti][k]=re.sub(r'^.*\]\s+', r'' , line.rstrip())
+
+ dl, ul = RetxCheck._parseRetxCheckers(options)
+ msgs = []
+ for ue in dlsch_ulsch_stats:
+ dlulstat = dlsch_ulsch_stats[ue]
+
+ for key in dlulstat:
+ msgs.append(dlulstat[key])
+
+ retx_dl = RetxCheck._analyzeUeRetx(dlulstat['dlsch_rounds'], dl, r'^.*dlsch_rounds\s+(\d+)\/(\d+)\/(\d+)\/(\d+),\s+dlsch_errors\s+(\d+)')
+ retx_ul = RetxCheck._analyzeUeRetx(dlulstat['ulsch_rounds'], ul, r'^.*ulsch_rounds\s+(\d+)\/(\d+)\/(\d+)\/(\d+),\s+ulsch_errors\s+(\d+)')
+
+ if False in retx_dl or False in retx_ul:
+ dlstr = RetxCheck._filter_retx_rounds(retx_dl)
+ ulstr = RetxCheck._filter_retx_rounds(retx_ul)
+ msg = f"UE {ue}: retx rounds"
+ if dlstr:
+ msg = f"{msg} DL {dlstr}"
+ if ulstr:
+ msg = f"{msg} UL {ulstr}"
+ msg = f"{msg} exceeded threshold"
+ msgs.append('!!! Failure: ' + msg)
+ logging.error(f'\u001B[1;37;41m {msg}\u001B[0m')
+ status = False
+ else:
+ msg = f"UE {ue} retransmissions within bounds"
+ logging.debug(msg)
+ return status, "\n".join(msgs)
diff --git a/ci-scripts/main.py b/ci-scripts/main.py
index bbce96f304..3b40941b91 100644
--- a/ci-scripts/main.py
+++ b/ci-scripts/main.py
@@ -108,13 +108,6 @@ def ExecuteActionWithParam(action, ctx, node):
success = RAN.InitializeeNB(ctx, node, HTML)
elif action == 'Terminate_eNB':
- #retx checkers
- string_field = test.findtext('d_retx_th')
- if (string_field is not None):
- RAN.ran_checkers['d_retx_th'] = [float(x) for x in string_field.split(',')]
- string_field=test.findtext('u_retx_th')
- if (string_field is not None):
- RAN.ran_checkers['u_retx_th'] = [float(x) for x in string_field.split(',')]
services = []
analysis = test.find("analysis")
if analysis is not None:
diff --git a/ci-scripts/ran.py b/ci-scripts/ran.py
index 27b309cafd..864c2463a5 100644
--- a/ci-scripts/ran.py
+++ b/ci-scripts/ran.py
@@ -67,8 +67,6 @@ class RANManagement():
self.eNBOptions = ['', '', '']
self.eNBstatuses = [-1, -1, -1]
self.runtime_stats= ''
- #checkers from xml
- self.ran_checkers={}
self.cmd_prefix = '' # prefix before {lte,nr}-softmodem
self.node = ''
self.command = ''
@@ -176,25 +174,6 @@ class RANManagement():
HTML.CreateHtmlDataLogTable(datalog_rt_stats)
return success
- 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={}):
if (not os.path.isfile(eNBlogFile)):
return -1
@@ -239,8 +218,6 @@ class RANManagement():
nbContextSwitches = ''
#NSA FR1 check
NSA_RAPROC_PUSCH_check = 0
- #dlsch and ulsch statistics (dictionary)
- dlsch_ulsch_stats = {}
#count "problem receiving samples" msg
pb_receiving_samples_cnt = 0
#count "removing UE" msg
@@ -392,22 +369,6 @@ class RANManagement():
if result is not None:
NSA_RAPROC_PUSCH_check = 1
- # Collect information on UE DLSCH and ULSCH statistics
- keys = {'dlsch_rounds','ulsch_rounds'}
- for k in keys:
- result = re.search(k, line)
- if result is None:
- continue
- result = re.search('UE (?:RNTI )?([0-9a-f]{4})', line)
- if result is None:
- logging.error(f'did not find RNTI while matching key {k}')
- continue
- rnti = result.group(1)
-
- #remove 1- all useless char before relevant info (ulsch or dlsch) 2- trailing char
- 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))
if result is not None:
nrRrcRcfgComplete += 1
@@ -505,23 +466,6 @@ class RANManagement():
logging.debug(statMsg)
htmleNBFailureMsg += htmlMsg
- #ulsch and dlsch statistics and checkers
- for ue in dlsch_ulsch_stats:
- dlulstat = dlsch_ulsch_stats[ue]
- #print statistics into html
- statMsg=''
- for key in dlulstat:
- statMsg += dlulstat[key] + '\n'
- logging.debug(dlulstat[key])
- htmleNBFailureMsg += statMsg
-
- retx_status[ue] = {}
- dlcheckers = [] if 'd_retx_th' not in checkers else checkers['d_retx_th']
- retx_status[ue]['dl'] = self._analyzeUeRetx(dlulstat['dlsch_rounds'], dlcheckers, r'^.*dlsch_rounds\s+(\d+)\/(\d+)\/(\d+)\/(\d+),\s+dlsch_errors\s+(\d+)')
- ulcheckers = [] if 'u_retx_th' not in checkers else checkers['u_retx_th']
- retx_status[ue]['ul'] = self._analyzeUeRetx(dlulstat['ulsch_rounds'], ulcheckers, r'^.*ulsch_rounds\s+(\d+)\/(\d+)\/(\d+)\/(\d+),\s+ulsch_errors\s+(\d+)')
-
-
if not showedByeMsg:
logging.debug('\u001B[1;37;41m ' + nodeB_prefix + 'NB did not show "Bye." message at end, it likely did not stop properly! \u001B[0m')
htmleNBFailureMsg += 'No Bye. message found, did not stop properly\n'
@@ -557,16 +501,6 @@ class RANManagement():
logging.debug(statMsg)
htmleNBFailureMsg += htmlMsg
- for ue in retx_status:
- msg = f"retransmissions for UE {ue}: DL {retx_status[ue]['dl']} UL {retx_status[ue]['ul']}"
- if False in retx_status[ue]['dl'] or False in retx_status[ue]['ul']:
- msg = 'Failure: ' + msg
- logging.error(f'\u001B[1;37;41m {msg}\u001B[0m')
- htmleNBFailureMsg += f'{msg}\n'
- global_status = CONST.ENB_RETX_ISSUE
- else:
- logging.debug(msg)
-
if RealTimeProcessingIssue:
logging.debug('\u001B[1;37;41m ' + nodeB_prefix + 'NB ended with real time processing issue! \u001B[0m')
htmleNBFailureMsg += 'Fail due to real time processing issue\n'
diff --git a/ci-scripts/tests/log-analysis.py b/ci-scripts/tests/log-analysis.py
index dba7e9caf4..d7e754a054 100644
--- a/ci-scripts/tests/log-analysis.py
+++ b/ci-scripts/tests/log-analysis.py
@@ -12,6 +12,9 @@ sys.path.append('./') # to find OAI imports below
import cls_loganalysis
class TestLogAnalysis(unittest.TestCase):
+ def setUp(self):
+ self.maxDiff = None
+
def test_no_file(self):
f = "/total/fantasy/path/file.log"
result, _ = cls_loganalysis.Default.run(f, None)
@@ -22,5 +25,74 @@ class TestLogAnalysis(unittest.TestCase):
result, _ = cls_loganalysis.Default.run(f, None)
self.assertTrue(result)
+ def test_retx_check_good(self):
+ f = "tests/log-analysis/retx-check-good.log"
+ opt = "dl=1,0,0,0;ul=1,0,0,0"
+ result, log = cls_loganalysis.RetxCheck.run(f, opt)
+ expected = """UE f40a: dlsch_rounds 86/0/0/0, dlsch_errors 0, pucch0_DTX 0, BLER 0.00052 MCS (0) 0 CCE fail 3
+UE f40a: ulsch_rounds 518/0/0/0, ulsch_errors 0, ulsch_DTX 0, BLER 0.00000 MCS (0) 0 (Qm 2 deltaMCS 0 dB) NPRB 5 SNR 51.0 dB CCE fail 0"""
+ self.assertTrue(result)
+ self.assertEqual(log, expected)
+
+ def test_retx_check_good_single_val(self):
+ f = "tests/log-analysis/retx-check-good.log"
+ opt = "1,0,0,0"
+ result, log = cls_loganalysis.RetxCheck.run(f, opt)
+ expected = """UE f40a: dlsch_rounds 86/0/0/0, dlsch_errors 0, pucch0_DTX 0, BLER 0.00052 MCS (0) 0 CCE fail 3
+UE f40a: ulsch_rounds 518/0/0/0, ulsch_errors 0, ulsch_DTX 0, BLER 0.00000 MCS (0) 0 (Qm 2 deltaMCS 0 dB) NPRB 5 SNR 51.0 dB CCE fail 0"""
+ self.assertTrue(result)
+ self.assertEqual(log, expected)
+
+ def test_retx_check_good_ul_only(self):
+ f = "tests/log-analysis/retx-check-good.log"
+ opt = "ul=1,0,0,0"
+ result, log = cls_loganalysis.RetxCheck.run(f, opt)
+ expected = """UE f40a: dlsch_rounds 86/0/0/0, dlsch_errors 0, pucch0_DTX 0, BLER 0.00052 MCS (0) 0 CCE fail 3
+UE f40a: ulsch_rounds 518/0/0/0, ulsch_errors 0, ulsch_DTX 0, BLER 0.00000 MCS (0) 0 (Qm 2 deltaMCS 0 dB) NPRB 5 SNR 51.0 dB CCE fail 0"""
+ self.assertTrue(result)
+ self.assertEqual(log, expected)
+
+ def test_retx_check_bad(self):
+ f = "tests/log-analysis/retx-check-bad.log"
+ opt = "dl=10,100,100,100;ul=10,100,100,100"
+ result, log = cls_loganalysis.RetxCheck.run(f, opt)
+ expected = """UE a491: dlsch_rounds 13/1/0/0, dlsch_errors 0, pucch0_DTX 0, BLER 0.11000 MCS (0) 0 CCE fail 0
+UE a491: ulsch_rounds 23/1/0/0, ulsch_errors 0, ulsch_DTX 1, BLER 0.08447 MCS (0) 0 (Qm 2 deltaMCS 0 dB) NPRB 5 SNR 34.0 dB CCE fail 0
+UE bf9b: dlsch_rounds 370/368/368/368, dlsch_errors 368, pucch0_DTX 1377, BLER 1.00000 MCS (0) 0 CCE fail 64
+UE bf9b: ulsch_rounds 150/148/147/147, ulsch_errors 147, ulsch_DTX 589, BLER 1.00000 MCS (0) 0 (Qm 2 deltaMCS 0 dB) NPRB 104 SNR 38.0 dB CCE fail 0
+!!! Failure: UE bf9b: retx rounds DL [1] UL [1] exceeded threshold
+UE 257a: dlsch_rounds 68071/142/14/0, dlsch_errors 0, pucch0_DTX 10, BLER 0.00427 MCS (1) 25 CCE fail 0
+UE 257a: ulsch_rounds 41777/2863/10/0, ulsch_errors 0, ulsch_DTX 17, BLER 0.11456 MCS (1) 10 (Qm 4 deltaMCS 0 dB) NPRB 5 SNR 29.0 dB CCE fail 0"""
+ self.assertFalse(result)
+ self.assertEqual(log, expected)
+
+ def test_retx_check_dl_only_bad(self):
+ f = "tests/log-analysis/retx-check-bad.log"
+ opt = "dl=10,80,100,100"
+ result, log = cls_loganalysis.RetxCheck.run(f, opt)
+ expected = """UE a491: dlsch_rounds 13/1/0/0, dlsch_errors 0, pucch0_DTX 0, BLER 0.11000 MCS (0) 0 CCE fail 0
+UE a491: ulsch_rounds 23/1/0/0, ulsch_errors 0, ulsch_DTX 1, BLER 0.08447 MCS (0) 0 (Qm 2 deltaMCS 0 dB) NPRB 5 SNR 34.0 dB CCE fail 0
+UE bf9b: dlsch_rounds 370/368/368/368, dlsch_errors 368, pucch0_DTX 1377, BLER 1.00000 MCS (0) 0 CCE fail 64
+UE bf9b: ulsch_rounds 150/148/147/147, ulsch_errors 147, ulsch_DTX 589, BLER 1.00000 MCS (0) 0 (Qm 2 deltaMCS 0 dB) NPRB 104 SNR 38.0 dB CCE fail 0
+!!! Failure: UE bf9b: retx rounds DL [1, 2] exceeded threshold
+UE 257a: dlsch_rounds 68071/142/14/0, dlsch_errors 0, pucch0_DTX 10, BLER 0.00427 MCS (1) 25 CCE fail 0
+UE 257a: ulsch_rounds 41777/2863/10/0, ulsch_errors 0, ulsch_DTX 17, BLER 0.11456 MCS (1) 10 (Qm 4 deltaMCS 0 dB) NPRB 5 SNR 29.0 dB CCE fail 0"""
+ self.assertFalse(result)
+ self.assertEqual(log, expected)
+
+ def test_retx_check_ul_bad(self):
+ f = "tests/log-analysis/retx-check-bad.log"
+ opt = "dl=100,100,100,100;ul=10,100,100,100"
+ result, log = cls_loganalysis.RetxCheck.run(f, opt)
+ expected = """UE a491: dlsch_rounds 13/1/0/0, dlsch_errors 0, pucch0_DTX 0, BLER 0.11000 MCS (0) 0 CCE fail 0
+UE a491: ulsch_rounds 23/1/0/0, ulsch_errors 0, ulsch_DTX 1, BLER 0.08447 MCS (0) 0 (Qm 2 deltaMCS 0 dB) NPRB 5 SNR 34.0 dB CCE fail 0
+UE bf9b: dlsch_rounds 370/368/368/368, dlsch_errors 368, pucch0_DTX 1377, BLER 1.00000 MCS (0) 0 CCE fail 64
+UE bf9b: ulsch_rounds 150/148/147/147, ulsch_errors 147, ulsch_DTX 589, BLER 1.00000 MCS (0) 0 (Qm 2 deltaMCS 0 dB) NPRB 104 SNR 38.0 dB CCE fail 0
+!!! Failure: UE bf9b: retx rounds UL [1] exceeded threshold
+UE 257a: dlsch_rounds 68071/142/14/0, dlsch_errors 0, pucch0_DTX 10, BLER 0.00427 MCS (1) 25 CCE fail 0
+UE 257a: ulsch_rounds 41777/2863/10/0, ulsch_errors 0, ulsch_DTX 17, BLER 0.11456 MCS (1) 10 (Qm 4 deltaMCS 0 dB) NPRB 5 SNR 29.0 dB CCE fail 0"""
+ self.assertFalse(result)
+ self.assertEqual(log, expected)
+
if __name__ == '__main__':
unittest.main()
diff --git a/ci-scripts/tests/log-analysis/retx-check-bad.log b/ci-scripts/tests/log-analysis/retx-check-bad.log
new file mode 100644
index 0000000000..7651da78cf
--- /dev/null
+++ b/ci-scripts/tests/log-analysis/retx-check-bad.log
@@ -0,0 +1,54 @@
+9185541.336575 [NR_RRC] I UE 1 Logical Channel DL-DCCH, Generate SecurityModeCommand (bytes 3)
+9185541.356794 [NR_RRC] A [UL] (cellID bc614e, UE ID 1 RNTI a491) Received Security Mode Complete
+9185541.357264 [NR_RRC] I UE 1: Logical Channel DL-DCCH, Generate NR UECapabilityEnquiry (bytes 8, xid 2)
+9185541.373199 [NR_RRC] A [UL] (cellID bc614e, UE ID 1 RNTI a491) Received UE capabilities
+9185541.373330 [NR_RRC] I Send message to ngap: NGAP_UE_CAPABILITIES_IND
+9185541.373356 [NR_RRC] A [DL] (cellID bc614e, UE ID 1 RNTI a491) Send DL Information Transfer [53 bytes]
+9185541.373368 [NR_RRC] I Send message to sctp: NGAP_InitialContextSetupResponse
+9185541.390034 [NR_MAC] I Frame.Slot 384.0
+UE RNTI a491 CU-UE-ID 1 in-sync PH 59 dB PCMAX 21 dBm, average RSRP -101 (4 meas)
+UE a491: CQI 2, RI 2, PMI (0,0)
+UE a491: dlsch_rounds 13/1/0/0, dlsch_errors 0, pucch0_DTX 0, BLER 0.11000 MCS (0) 0 CCE fail 0
+UE a491: ulsch_rounds 23/1/0/0, ulsch_errors 0, ulsch_DTX 1, BLER 0.08447 MCS (0) 0 (Qm 2 deltaMCS 0 dB) NPRB 5 SNR 34.0 dB CCE fail 0
+UE a491: MAC: TX 367 RX 3664 bytes
+UE a491: LCID 1: TX 213 RX 1649 bytes
+
+9185559.310044 [NR_MAC] I Frame.Slot 128.0
+UE RNTI bf9b CU-UE-ID 1 in-sync PH 48 dB PCMAX 21 dBm
+UE bf9b: dlsch_rounds 370/368/368/368, dlsch_errors 368, pucch0_DTX 1377, BLER 1.00000 MCS (0) 0 CCE fail 64
+UE bf9b: ulsch_rounds 150/148/147/147, ulsch_errors 147, ulsch_DTX 589, BLER 1.00000 MCS (0) 0 (Qm 2 deltaMCS 0 dB) NPRB 104 SNR 38.0 dB CCE fail 0
+UE bf9b: MAC: TX 10145 RX 82 bytes
+UE bf9b: LCID 1: TX 5283 RX 53 bytes
+
+9185582.350069 [NR_MAC] I Frame.Slot 384.0
+UE RNTI 257a CU-UE-ID 2 in-sync PH 48 dB PCMAX 21 dBm, average RSRP -83 (16 meas)
+UE 257a: CQI 15, RI 2, PMI (0,1)
+UE 257a: UL-RI 2, TPMI 0
+UE 257a: dlsch_rounds 153/1/0/0, dlsch_errors 0, pucch0_DTX 0, BLER 0.00000 MCS (1) 0 CCE fail 0
+UE 257a: ulsch_rounds 562/2/1/0, ulsch_errors 0, ulsch_DTX 3, BLER 0.00000 MCS (1) 0 (Qm 2 deltaMCS 0 dB) NPRB 5 SNR 29.5 dB CCE fail 0
+UE 257a: MAC: TX 13416 RX 26519 bytes
+UE 257a: LCID 1: TX 523 RX 2046 bytes
+UE 257a: LCID 2: TX 0 RX 0 bytes
+UE 257a: LCID 4: TX 9800 RX 9945 bytes
+
+9185687.310202 [NR_MAC] I Frame.Slot 640.0
+UE RNTI 257a CU-UE-ID 2 in-sync PH 61 dB PCMAX 21 dBm, average RSRP -83 (16 meas)
+UE 257a: CQI 15, RI 2, PMI (0,1)
+UE 257a: UL-RI 2, TPMI 0
+UE 257a: dlsch_rounds 64992/129/13/0, dlsch_errors 0, pucch0_DTX 10, BLER 0.00242 MCS (1) 27 CCE fail 0
+UE 257a: ulsch_rounds 39328/2610/8/0, ulsch_errors 0, ulsch_DTX 14, BLER 0.11139 MCS (1) 9 (Qm 4 deltaMCS 0 dB) NPRB 273 SNR 25.5 dB CCE fail 0
+UE 257a: MAC: TX 3344707955 RX 818603547 bytes
+UE 257a: LCID 1: TX 832 RX 4312 bytes
+UE 257a: LCID 2: TX 0 RX 0 bytes
+UE 257a: LCID 4: TX 3322610250 RX 815642955 bytes
+
+9185692.430254 [NR_MAC] I Frame.Slot 128.0
+UE RNTI 257a CU-UE-ID 2 in-sync PH 48 dB PCMAX 21 dBm, average RSRP -84 (16 meas)
+UE 257a: CQI 15, RI 2, PMI (0,1)
+UE 257a: UL-RI 2, TPMI 0
+UE 257a: dlsch_rounds 68071/142/14/0, dlsch_errors 0, pucch0_DTX 10, BLER 0.00427 MCS (1) 25 CCE fail 0
+UE 257a: ulsch_rounds 41777/2863/10/0, ulsch_errors 0, ulsch_DTX 17, BLER 0.11456 MCS (1) 10 (Qm 4 deltaMCS 0 dB) NPRB 5 SNR 29.0 dB CCE fail 0
+UE 257a: MAC: TX 3424886787 RX 879242724 bytes
+UE 257a: LCID 1: TX 847 RX 4422 bytes
+UE 257a: LCID 2: TX 0 RX 0 bytes
+UE 257a: LCID 4: TX 3401067134 RX 875911216 bytes
diff --git a/ci-scripts/tests/log-analysis/retx-check-good.log b/ci-scripts/tests/log-analysis/retx-check-good.log
new file mode 100644
index 0000000000..c586c615f3
--- /dev/null
+++ b/ci-scripts/tests/log-analysis/retx-check-good.log
@@ -0,0 +1,8 @@
+7799905.793901 [NR_MAC] I Frame.Slot 256.0
+UE RNTI f40a CU-UE-ID 2 in-sync PH 48 dB PCMAX 20 dBm, average RSRP -44 (16 meas)
+UE f40a: dlsch_rounds 86/0/0/0, dlsch_errors 0, pucch0_DTX 0, BLER 0.00052 MCS (0) 0 CCE fail 3
+UE f40a: ulsch_rounds 518/0/0/0, ulsch_errors 0, ulsch_DTX 0, BLER 0.00000 MCS (0) 0 (Qm 2 deltaMCS 0 dB) NPRB 5 SNR 51.0 dB CCE fail 0
+UE f40a: MAC: TX 3836 RX 13684 bytes
+UE f40a: LCID 1: TX 530 RX 281 bytes
+UE f40a: LCID 2: TX 3 RX 35 bytes
+UE f40a: LCID 4: TX 1886 RX 2100 bytes
diff --git a/ci-scripts/xml_files/container_5g_fdd_rfsim.xml b/ci-scripts/xml_files/container_5g_fdd_rfsim.xml
index b4383feeaf..eb616d9e35 100644
--- a/ci-scripts/xml_files/container_5g_fdd_rfsim.xml
+++ b/ci-scripts/xml_files/container_5g_fdd_rfsim.xml
@@ -113,8 +113,6 @@
Undeploy all OAI 5G stack
localhost
ci-scripts/yaml_files/5g_fdd_rfsimulator
- 1,0,0,0
- 1,0,0,0