Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lizhongxiao
OpenXG-RAN
Commits
bfc45da9
Commit
bfc45da9
authored
Aug 08, 2023
by
Robert Schmidt
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/ci-iperf-html-e1' into integration_2023_w31
parents
8dff8ff1
7b297eb2
Changes
23
Show whitespace changes
Inline
Side-by-side
Showing
23 changed files
with
685 additions
and
384 deletions
+685
-384
ci-scripts/Jenkinsfile-GitLab-Container
ci-scripts/Jenkinsfile-GitLab-Container
+0
-19
ci-scripts/cls_containerize.py
ci-scripts/cls_containerize.py
+1
-1
ci-scripts/cls_oai_html.py
ci-scripts/cls_oai_html.py
+2
-2
ci-scripts/cls_oaicitest.py
ci-scripts/cls_oaicitest.py
+73
-322
ci-scripts/conf_files/gnb-cucp.sa.f1.quectel.conf
ci-scripts/conf_files/gnb-cucp.sa.f1.quectel.conf
+219
-0
ci-scripts/conf_files/gnb-cuup.sa.f1.quectel.conf
ci-scripts/conf_files/gnb-cuup.sa.f1.quectel.conf
+78
-0
ci-scripts/conf_files/gnb-du.sa.band78.106prb.usrpb200.conf
ci-scripts/conf_files/gnb-du.sa.band78.106prb.usrpb200.conf
+3
-12
ci-scripts/doGitLabMerge.sh
ci-scripts/doGitLabMerge.sh
+0
-2
ci-scripts/xml_files/container_lte_b200_fdd_05Mhz_tm1.xml
ci-scripts/xml_files/container_lte_b200_fdd_05Mhz_tm1.xml
+2
-0
ci-scripts/xml_files/container_lte_b200_fdd_05Mhz_tm1_if4_5.xml
...ipts/xml_files/container_lte_b200_fdd_05Mhz_tm1_if4_5.xml
+3
-0
ci-scripts/xml_files/container_lte_b200_fdd_10Mhz_tm1.xml
ci-scripts/xml_files/container_lte_b200_fdd_10Mhz_tm1.xml
+1
-0
ci-scripts/xml_files/container_lte_b200_fdd_10Mhz_tm1_cdrx.xml
...ripts/xml_files/container_lte_b200_fdd_10Mhz_tm1_cdrx.xml
+1
-0
ci-scripts/xml_files/container_lte_b200_fdd_20Mhz_tm1.xml
ci-scripts/xml_files/container_lte_b200_fdd_20Mhz_tm1.xml
+1
-0
ci-scripts/xml_files/container_lte_b200_tdd_05Mhz_tm1.xml
ci-scripts/xml_files/container_lte_b200_tdd_05Mhz_tm1.xml
+1
-0
ci-scripts/xml_files/container_lte_b200_tdd_05Mhz_tm1_if4_5.xml
...ipts/xml_files/container_lte_b200_tdd_05Mhz_tm1_if4_5.xml
+1
-0
ci-scripts/xml_files/container_lte_b200_tdd_10Mhz_tm1.xml
ci-scripts/xml_files/container_lte_b200_tdd_10Mhz_tm1.xml
+1
-0
ci-scripts/xml_files/container_lte_b200_tdd_20Mhz_tm1_default_scheduler.xml
...es/container_lte_b200_tdd_20Mhz_tm1_default_scheduler.xml
+3
-0
ci-scripts/xml_files/container_sa_e1_b200_quectel.xml
ci-scripts/xml_files/container_sa_e1_b200_quectel.xml
+166
-0
ci-scripts/xml_files/container_sa_e1_b200_terminate.xml
ci-scripts/xml_files/container_sa_e1_b200_terminate.xml
+48
-0
ci-scripts/xml_files/container_sa_f1_b200_quectel.xml
ci-scripts/xml_files/container_sa_f1_b200_quectel.xml
+13
-17
ci-scripts/xml_files/container_sa_f1_b200_terminate.xml
ci-scripts/xml_files/container_sa_f1_b200_terminate.xml
+0
-7
ci-scripts/yaml_files/sa_e1_b200_gnb/docker-compose.yml
ci-scripts/yaml_files/sa_e1_b200_gnb/docker-compose.yml
+68
-0
ci-scripts/yaml_files/sa_f1_b200_gnb/docker-compose.yml
ci-scripts/yaml_files/sa_f1_b200_gnb/docker-compose.yml
+0
-2
No files found.
ci-scripts/Jenkinsfile-GitLab-Container
View file @
bfc45da9
...
...
@@ -103,7 +103,6 @@ pipeline {
gitCommitAuthorEmailAddr
=
sh
returnStdout:
true
,
script:
'git log -n1 --pretty=format:%ae ${GIT_COMMIT}'
gitCommitAuthorEmailAddr
=
gitCommitAuthorEmailAddr
.
trim
()
echo
"GitLab Usermail is ${gitCommitAuthorEmailAddr}"
sh
"git log -n1 --pretty=format:\"%s\" > .git/CI_COMMIT_MSG"
}
}
}
...
...
@@ -525,24 +524,6 @@ pipeline {
}
}
post
{
always
{
script
{
def
eSubject
=
JOB_NAME
+
' - Build # '
+
BUILD_ID
+
' - '
+
currentBuild
.
result
+
'!'
def
eBody
=
"Hi,\n\n"
eBody
+=
"Here are attached HTML report files for "
+
JOB_NAME
+
" - Build # "
+
BUILD_ID
+
" - "
+
currentBuild
.
result
+
"!\n\n"
eBody
+=
"Regards,\n"
eBody
+=
"OAI CI Team"
emailext
attachmentsPattern:
'*results*.html'
,
body:
eBody
,
replyTo:
'no-reply@openairinterface.org'
,
subject:
eSubject
,
to:
gitCommitAuthorEmailAddr
if
(
fileExists
(
'.git/CI_COMMIT_MSG'
))
{
sh
"rm -f .git/CI_COMMIT_MSG"
}
}
}
success
{
script
{
def
message
=
"OAI "
+
JOB_NAME
+
" build ("
+
BUILD_ID
+
"): passed ("
+
BUILD_URL
+
")"
...
...
ci-scripts/cls_containerize.py
View file @
bfc45da9
...
...
@@ -904,7 +904,7 @@ class Containerize():
cnt
=
0
while
(
cnt
<
20
):
mySSH
.
command
(
'docker logs '
+
containerName
+
' | egrep --text --color=never -i "wait|sync|Starting"'
,
'\$'
,
30
)
result
=
re
.
search
(
'got sync|Starting F1AP at CU|Got sync|Waiting for RUs to be configured'
,
mySSH
.
getBefore
())
result
=
re
.
search
(
'got sync|Starting
E1AP at CU UP|Starting
F1AP at CU|Got sync|Waiting for RUs to be configured'
,
mySSH
.
getBefore
())
if
result
is
None
:
time
.
sleep
(
6
)
cnt
+=
1
...
...
ci-scripts/cls_oai_html.py
View file @
bfc45da9
...
...
@@ -469,8 +469,8 @@ class HTMLManagement():
self
.
htmlFile
.
write
(
' <td bgcolor = "orange" >'
)
else
:
self
.
htmlFile
.
write
(
' <td>'
)
for
i
in
infoList
:
self
.
htmlFile
.
write
(
f' <pre>
{
i
}
</pre>'
)
for
i
in
infoList
:
# add custom style to have elements side-by-side to reduce need for vertical space
self
.
htmlFile
.
write
(
f' <pre
style="display: inline flow-root list-item; margin: 0 3px 0 3px; min-width: 24em;"
>
{
i
}
</pre>'
)
self
.
htmlFile
.
write
(
' </td>'
)
self
.
htmlFile
.
write
(
' </tr>
\n
'
)
...
...
ci-scripts/cls_oaicitest.py
View file @
bfc45da9
...
...
@@ -43,7 +43,7 @@ import logging
import
datetime
import
signal
import
statistics
as
stat
from
multiprocessing
import
Process
,
Lock
,
SimpleQueue
from
multiprocessing
import
SimpleQueue
import
concurrent.futures
#import our libs
...
...
@@ -494,15 +494,6 @@ class OaiCiTest():
messages
=
[
f
.
result
()
for
f
in
futures
]
HTML
.
CreateHtmlTestRowQueue
(
'NA'
,
'OK'
,
messages
)
def
ping_iperf_wrong_exit
(
self
,
lock
,
UE_IPAddress
,
device_id
,
statusQueue
,
message
):
logging
.
error
(
f"ue
{
device_id
}
{
UE_IPAddress
}
:
{
message
}
"
)
lock
.
acquire
()
statusQueue
.
put
(
-
1
)
statusQueue
.
put
(
device_id
)
statusQueue
.
put
(
UE_IPAddress
)
statusQueue
.
put
(
message
)
lock
.
release
()
def
Ping_common
(
self
,
EPC
,
ue
,
RAN
):
# Launch ping on the EPC side (true for ltebox and old open-air-cn)
ping_status
=
0
...
...
@@ -617,7 +608,7 @@ class OaiCiTest():
def
Iperf_ComputeModifiedBW
(
self
,
idx
,
ue_num
):
result
=
re
.
search
(
'-b (?P<iperf_bandwidth>[0-9\.]+)[KMG]'
,
str
(
self
.
iperf_args
))
if
result
is
None
:
logging
.
debug
(
'
\u001B
[1;37;41m Iperf bandwidth Not Found!
\u001B
[0m'
)
logging
.
error
(
'
\u001B
[1;37;41m Iperf bandwidth Not Found!
\u001B
[0m'
)
sys
.
exit
(
1
)
iperf_bandwidth
=
result
.
group
(
'iperf_bandwidth'
)
if
self
.
iperf_profile
==
'balanced'
:
...
...
@@ -635,11 +626,11 @@ class OaiCiTest():
iperf_bandwidth_str_new
=
f"-b
{
'%.2f'
%
iperf_bandwidth_new
}
"
result
=
re
.
sub
(
iperf_bandwidth_str
,
iperf_bandwidth_str_new
,
str
(
self
.
iperf_args
))
if
result
is
None
:
logging
.
debug
(
'
\u001B
[1;37;41m Calculate Iperf bandwidth Failed!
\u001B
[0m'
)
logging
.
error
(
'
\u001B
[1;37;41m Calculate Iperf bandwidth Failed!
\u001B
[0m'
)
sys
.
exit
(
1
)
return
result
def
Iperf_analyzeV2TCPOutput
(
self
,
lock
,
UE_IPAddress
,
device_id
,
statusQueue
,
iperf_real_options
,
EPC
,
SSH
,
filename
):
def
Iperf_analyzeV2TCPOutput
(
self
,
SSH
,
filename
):
SSH
.
command
(
f'awk -f /tmp/tcp_iperf_stats.awk
{
filename
}
'
,
'\$'
,
5
)
result
=
re
.
search
(
'Avg Bitrate : (?P<average>[0-9\.]+ Mbits\/sec) Max Bitrate : (?P<maximum>[0-9\.]+ Mbits\/sec) Min Bitrate : (?P<minimum>[0-9\.]+ Mbits\/sec)'
,
SSH
.
getBefore
())
...
...
@@ -647,44 +638,34 @@ class OaiCiTest():
avgbitrate
=
result
.
group
(
'average'
)
maxbitrate
=
result
.
group
(
'maximum'
)
minbitrate
=
result
.
group
(
'minimum'
)
lock
.
acquire
()
logging
.
debug
(
f'
\u001B
[1;37;44m TCP iperf result (
{
UE_IPAddress
}
)
\u001B
[0m'
)
msg
=
'TCP Stats :
\n
'
if
avgbitrate
is
not
None
:
logging
.
debug
(
f'
\u001B
[1;34m Avg Bitrate :
{
avgbitrate
}
\u001B
[0m'
)
msg
+=
f'Avg Bitrate :
{
avgbitrate
}
\n
'
if
maxbitrate
is
not
None
:
logging
.
debug
(
f'
\u001B
[1;34m Max Bitrate :
{
maxbitrate
}
\u001B
[0m'
)
msg
+=
f'Max Bitrate :
{
maxbitrate
}
\n
'
if
minbitrate
is
not
None
:
logging
.
debug
(
f'
\u001B
[1;34m Min Bitrate :
{
minbitrate
}
\u001B
[0m'
)
msg
+=
f'Min Bitrate :
{
minbitrate
}
\n
'
statusQueue
.
put
(
0
)
statusQueue
.
put
(
device_id
)
statusQueue
.
put
(
UE_IPAddress
)
statusQueue
.
put
(
msg
)
lock
.
release
()
return
(
True
,
msg
)
return
0
return
(
False
,
"could not analyze log file"
)
def
Iperf_analyzeV2Output
(
self
,
lock
,
UE_IPAddress
,
device_id
,
statusQueue
,
iperf_real_options
,
EPC
,
SSH
):
def
Iperf_analyzeV2Output
(
self
,
iperf_real_options
,
EPC
,
SSH
):
result
=
re
.
search
(
'-u'
,
str
(
iperf_real_options
))
if
result
is
None
:
logging
.
debug
(
'Into Iperf_analyzeV2TCPOutput client'
)
filename
=
f'
{
EPC
.
SourceCodePath
}
/scripts/iperf_
{
self
.
testCase_id
}
_
{
device_id
}
.log'
response
=
self
.
Iperf_analyzeV2TCPOutput
(
lock
,
UE_IPAddress
,
device_id
,
statusQueue
,
iperf_real_options
,
EPC
,
SSH
,
filename
)
logging
.
debug
(
f'Iperf_analyzeV2TCPOutput response returned value =
{
response
}
'
)
response
=
self
.
Iperf_analyzeV2TCPOutput
(
SSH
,
filename
)
return
response
result
=
re
.
search
(
'Server Report:'
,
SSH
.
getBefore
())
if
result
is
None
:
result
=
re
.
search
(
'read failed: Connection refused'
,
SSH
.
getBefore
())
if
result
is
not
None
:
logging
.
debug
(
'
\u001B
[1;37;41m Could not connect to iperf server!
\u001B
[0m'
)
msg
=
'Could not connect to iperf server!'
return
(
False
,
msg
)
else
:
logging
.
debug
(
'
\u001B
[1;37;41m Server Report and Connection refused Not Found!
\u001B
[0m'
)
return
-
1
msg
=
'Server Report and Connection refused Not Found!'
return
(
False
,
msg
)
# Computing the requested bandwidth in float
result
=
re
.
search
(
'-b (?P<iperf_bandwidth>[0-9\.]+)[KMG]'
,
str
(
iperf_real_options
))
if
result
is
not
None
:
...
...
@@ -708,14 +689,11 @@ class OaiCiTest():
bitrate
=
result
.
group
(
'bitrate'
)
packetloss
=
result
.
group
(
'packetloss'
)
jitter
=
result
.
group
(
'jitter'
)
lock
.
acquire
()
logging
.
debug
(
f'
\u001B
[1;37;44m iperf result
{
UE_IPAddress
}
\u001B
[0m'
)
iperfStatus
=
True
msg
=
f'Req Bitrate :
{
req_bandwidth
}
\n
'
logging
.
debug
(
f'
\u001B
[1;34m Req Bitrate :
{
req_bandwidth
}
\u001B
[0m'
)
if
bitrate
is
not
None
:
msg
+=
f'Bitrate :
{
bitrate
}
\n
'
logging
.
debug
(
f'
\u001B
[1;34m Bitrate :
{
bitrate
}
\u001B
[0m'
)
result
=
re
.
search
(
'(?P<real_bw>[0-9\.]+) [KMG]bits/sec'
,
str
(
bitrate
))
if
result
is
not
None
:
actual_bw
=
float
(
str
(
result
.
group
(
'real_bw'
)))
...
...
@@ -731,50 +709,37 @@ class OaiCiTest():
br_loss
=
100
*
actual_bw
/
req_bw
bitperf
=
'%.2f '
%
br_loss
msg
+=
f'Bitrate Perf:
{
bitperf
}
%
\n
'
logging
.
debug
(
f'
\u001B
[1;34m Bitrate Perf:
{
bitperf
}
%
\u001B
[0m'
)
if
packetloss
is
not
None
:
msg
+=
f'Packet Loss :
{
packetloss
}
%
\n
'
logging
.
debug
(
f'
\u001B
[1;34m Packet Loss :
{
packetloss
}
%
\u001B
[0m'
)
if
float
(
packetloss
)
>
float
(
self
.
iperf_packetloss_threshold
):
msg
+=
'Packet Loss too high!
\n
'
logging
.
debug
(
'
\u001B
[1;37;41m Packet Loss too high
\u001B
[0m'
)
iperfStatus
=
False
if
jitter
is
not
None
:
msg
+=
f'Jitter :
{
jitter
}
\n
'
logging
.
debug
(
f'
\u001B
[1;34m Jitter :
{
jitter
}
\u001B
[0m'
)
if
(
iperfStatus
):
statusQueue
.
put
(
0
)
else
:
statusQueue
.
put
(
-
1
)
statusQueue
.
put
(
device_id
)
statusQueue
.
put
(
UE_IPAddress
)
statusQueue
.
put
(
msg
)
lock
.
release
()
return
0
return
(
iperfStatus
,
msg
)
else
:
return
-
2
return
(
False
,
"could not analyze server log"
)
def
Iperf_analyzeV2BIDIR
(
self
,
lock
,
UE_IPAddress
,
device_id
,
statusQueue
,
server_filename
,
client_filename
):
def
Iperf_analyzeV2BIDIR
(
self
,
server_filename
,
client_filename
):
#check the 2 files are here
if
(
not
os
.
path
.
isfile
(
client_filename
))
or
(
not
os
.
path
.
isfile
(
server_filename
)):
self
.
ping_iperf_wrong_exit
(
lock
,
UE_IPAddress
,
device_id
,
statusQueue
,
'Bidir TCP : Client or Server Log File not present'
)
return
return
(
False
,
'Bidir TCP: Client or Server Log File not present'
)
#check the 2 files size
if
(
os
.
path
.
getsize
(
client_filename
)
==
0
)
and
(
os
.
path
.
getsize
(
server_filename
)
==
0
):
self
.
ping_iperf_wrong_exit
(
lock
,
UE_IPAddress
,
device_id
,
statusQueue
,
'Bidir TCP : Client and Server Log File are empty'
)
return
return
(
False
,
'Bidir TCP: Client and Server Log File are empty'
)
report_msg
=
'TCP BIDIR Report:
\n
'
report_msg
=
'
'
#if client is not empty, all the info is in, otherwise we ll use the server file to get some partial info
client_filesize
=
os
.
path
.
getsize
(
client_filename
)
if
client_filesize
==
0
:
report_msg
+=
"Client file (UE) present but !!! EMPTY !!!
\n
"
report_msg
+=
"Partial report from server file
\n
"
report_msg
+=
"Partial report from server file"
filename
=
server_filename
else
:
report_msg
+=
"Report from client file (UE)
\n
"
report_msg
+=
"Report from client file (UE)"
filename
=
client_filename
report
=
[]
#used to check if relevant lines were found
...
...
@@ -784,32 +749,19 @@ class OaiCiTest():
result
=
re
.
search
(
rf'^\[\s+\d+\](?P<direction>\[.+\]).*\s+(?P<bitrate>[0-9\.]+ [KMG]bits\/sec).*\s+(?P<role>\bsender|receiver\b)'
,
str
(
line
))
if
result
is
not
None
:
report
.
append
(
str
(
line
))
report_msg
+=
result
.
group
(
'role'
)
+
' '
+
result
.
group
(
'direction'
)
+
'
\t
= '
+
result
.
group
(
'bitrate'
)
+
'
\n
'
if
len
(
report
)
>
0
:
lock
.
acquire
()
statusQueue
.
put
(
0
)
statusQueue
.
put
(
device_id
)
statusQueue
.
put
(
UE_IPAddress
)
statusQueue
.
put
(
report_msg
)
logging
.
debug
(
f'
\u001B
[1;37;45m TCP Bidir Iperf Result (
{
UE_IPAddress
}
)
\u001B
[0m'
)
for
rLine
in
report_msg
.
split
(
'
\n
'
):
logging
.
debug
(
f'
\u001B
[1;35m
{
rLine
}
\u001B
[0m'
)
lock
.
release
()
else
:
self
.
ping_iperf_wrong_exit
(
lock
,
UE_IPAddress
,
device_id
,
statusQueue
,
'Bidir TCP : Could not analyze from Log file'
)
report_msg
+=
f"
\n
{
result
.
group
(
'role'
)
}
{
result
.
group
(
'direction'
)
}
\t
:
{
result
.
group
(
'bitrate'
)
}
"
if
len
(
report
)
==
0
:
return
(
False
,
'Bidir TCP: Could not analyze from Log file'
)
return
(
True
,
report_msg
)
def
Iperf_analyzeV2Server
(
self
,
lock
,
UE_IPAddress
,
device_id
,
statusQueue
,
iperf_real_options
,
filename
,
type
):
def
Iperf_analyzeV2Server
(
self
,
iperf_real_options
,
filename
,
type
):
if
(
not
os
.
path
.
isfile
(
filename
)):
self
.
ping_iperf_wrong_exit
(
lock
,
UE_IPAddress
,
device_id
,
statusQueue
,
'Could not analyze from server log'
)
return
return
(
False
,
'Could not analyze from server log'
)
# Computing the requested bandwidth in float
result
=
re
.
search
(
'-b (?P<iperf_bandwidth>[0-9\.]+)[KMG]'
,
str
(
iperf_real_options
))
if
result
is
None
:
logging
.
debug
(
'Iperf bandwidth Not Found!'
)
self
.
ping_iperf_wrong_exit
(
lock
,
UE_IPAddress
,
device_id
,
statusQueue
,
'Could not compute Iperf bandwidth!'
)
return
return
(
False
,
'Could not compute Iperf bandwidth!'
)
else
:
req_bandwidth
=
result
.
group
(
'iperf_bandwidth'
)
req_bw
=
float
(
req_bandwidth
)
...
...
@@ -856,6 +808,8 @@ class OaiCiTest():
br_sum
=
curr_br
+
br_sum
ji_sum
=
float
(
ji
[
0
])
+
ji_sum
server_file
.
close
()
if
(
row_idx
>
0
):
br_sum
=
br_sum
/
row_idx
ji_sum
=
ji_sum
/
row_idx
...
...
@@ -876,87 +830,25 @@ class OaiCiTest():
pl
=
float
(
100
*
pl_sum
/
ps_sum
)
packetloss
=
'%2.1f '
%
(
pl
)
packetloss
+=
'%'
#checking packet loss compliance
if
float
(
pl
)
>
float
(
self
.
iperf_packetloss_threshold
):
pal_too_high_msg
=
'Packet Loss too high : tested = '
+
packetloss
+
', target = '
+
self
.
iperf_packetloss_threshold
+
'%'
else
:
pal_too_high_msg
=
'Packet Loss value is within acceptance range'
#checking bitrate perf compliance
if
float
(
br_loss
)
<
float
(
self
.
iperf_bitrate_threshold
):
bit_too_low_msg
=
'Bitrate too low : tested = '
+
bitperf
+
', target = '
+
self
.
iperf_bitrate_threshold
+
'%'
else
:
bit_too_low_msg
=
'Bitrate perf value is within acceptance range'
lock
.
acquire
()
if
(
float
(
br_loss
)
<
float
(
self
.
iperf_bitrate_threshold
))
and
(
float
(
pl
)
>
float
(
self
.
iperf_packetloss_threshold
)):
statusQueue
.
put
(
-
1
)
elif
(
float
(
br_loss
)
<
float
(
self
.
iperf_bitrate_threshold
))
or
(
float
(
pl
)
>
float
(
self
.
iperf_packetloss_threshold
)):
statusQueue
.
put
(
1
)
else
:
statusQueue
.
put
(
0
)
statusQueue
.
put
(
device_id
)
statusQueue
.
put
(
UE_IPAddress
)
result
=
float
(
br_loss
)
>=
float
(
self
.
iperf_bitrate_threshold
)
and
float
(
pl
)
<=
float
(
self
.
iperf_packetloss_threshold
)
req_msg
=
f'Req Bitrate :
{
req_bandwidth
}
'
bir_msg
=
f'Bitrate :
{
bitrate
}
'
brl_msg
=
f'Bitrate Perf:
{
bitperf
}
'
if
float
(
br_loss
)
<
float
(
self
.
iperf_bitrate_threshold
):
brl_msg
+=
f' (too low! <
{
self
.
iperf_bitrate_threshold
}
%)'
jit_msg
=
f'Jitter :
{
jitter
}
'
pal_msg
=
f'Packet Loss :
{
packetloss
}
'
statusQueue
.
put
(
f'
{
req_msg
}
\n
{
bir_msg
}
\n
{
brl_msg
}
\n
{
jit_msg
}
\n
{
pal_msg
}
\n
{
pal_too_high_msg
}
\n
{
bit_too_low_msg
}
\n
'
)
logging
.
debug
(
f'
\u001B
[1;37;45m iperf result (
{
UE_IPAddress
}
)
\u001B
[0m'
)
logging
.
debug
(
f'
\u001B
[1;35m
{
req_msg
}
\u001B
[0m'
)
logging
.
debug
(
f'
\u001B
[1;35m
{
bir_msg
}
\u001B
[0m'
)
logging
.
debug
(
f'
\u001B
[1;35m
{
brl_msg
}
\u001B
[0m'
)
logging
.
debug
(
f'
\u001B
[1;35m
{
jit_msg
}
\u001B
[0m'
)
logging
.
debug
(
f'
\u001B
[1;35m
{
pal_msg
}
\u001B
[0m'
)
logging
.
debug
(
f'
\u001B
[1;35m
{
pal_too_high_msg
}
\u001B
[0m'
)
logging
.
debug
(
f'
\u001B
[1;35m
{
bit_too_low_msg
}
\u001B
[0m'
)
lock
.
release
()
else
:
self
.
ping_iperf_wrong_exit
(
lock
,
UE_IPAddress
,
device_id
,
statusQueue
,
'Could not analyze from server log'
)
server_file
.
close
()
def
Iperf_analyzeV3Output
(
self
,
lock
,
UE_IPAddress
,
device_id
,
statusQueue
,
SSH
):
result
=
re
.
search
(
'(?P<bitrate>[0-9\.]+ [KMG]bits\/sec) +(?:|[0-9\.]+ ms +\d+\/\d+ \((?P<packetloss>[0-9\.]+)%\)) +(?:|receiver)
\r\n
(?:|\[ *\d+\] Sent \d+ datagrams)
\r\n
iperf Done\.'
,
SSH
.
getBefore
())
if
result
is
None
:
result
=
re
.
search
(
'(?P<error>iperf: error - [a-zA-Z0-9 :]+)'
,
SSH
.
getBefore
())
lock
.
acquire
()
statusQueue
.
put
(
-
1
)
statusQueue
.
put
(
device_id
)
statusQueue
.
put
(
UE_IPAddress
)
if
result
is
not
None
:
logging
.
debug
(
f"
\u001B
[1;37;41m
{
result
.
group
(
'error'
)
}
\u001B
[0m"
)
statusQueue
.
put
(
result
.
group
(
'error'
))
else
:
logging
.
debug
(
'
\u001B
[1;37;41m Bitrate and/or Packet Loss Not Found!
\u001B
[0m'
)
statusQueue
.
put
(
'Bitrate and/or Packet Loss Not Found!'
)
lock
.
release
()
bitrate
=
result
.
group
(
'bitrate'
)
packetloss
=
result
.
group
(
'packetloss'
)
lock
.
acquire
()
logging
.
debug
(
f'
\u001B
[1;37;44m iperf result (
{
UE_IPAddress
}
)
\u001B
[0m'
)
logging
.
debug
(
f'
\u001B
[1;34m Bitrate :
{
bitrate
}
\u001B
[0m'
)
msg
=
f'Bitrate :
{
bitrate
}
\n
'
iperfStatus
=
True
if
packetloss
is
not
None
:
logging
.
debug
(
f'
\u001B
[1;34m Packet Loss :
{
packetloss
}
%
\u001B
[0m'
)
msg
+=
f'Packet Loss :
{
packetloss
}
%
\n
'
if
float
(
packetloss
)
>
float
(
self
.
iperf_packetloss_threshold
):
logging
.
debug
(
'
\u001B
[1;37;41m Packet Loss too high
\u001B
[0m'
)
msg
+=
'Packet Loss too high!
\n
'
iperfStatus
=
False
if
(
iperfStatus
):
statusQueue
.
put
(
0
)
if
float
(
pl
)
>
float
(
self
.
iperf_packetloss_threshold
):
pal_msg
+=
f' (too high! >
{
self
.
iperf_packetloss_threshold
}
%)'
return
(
result
,
f'
{
req_msg
}
\n
{
bir_msg
}
\n
{
brl_msg
}
\n
{
jit_msg
}
\n
{
pal_msg
}
'
)
else
:
statusQueue
.
put
(
-
1
)
statusQueue
.
put
(
device_id
)
statusQueue
.
put
(
UE_IPAddress
)
statusQueue
.
put
(
msg
)
lock
.
release
()
return
(
False
,
'Could not analyze from server log'
)
def
Iperf_Module
(
self
,
lock
,
statusQueue
,
EPC
,
ue
,
RAN
,
idx
,
ue_num
):
def
Iperf_Module
(
self
,
EPC
,
ue
,
RAN
,
idx
,
ue_num
):
ueIP
=
ue
.
getIP
()
if
not
ueIP
:
return
(
False
,
f"UE
{
ue
.
getName
()
}
has no IP address"
)
SSH
=
sshconnection
.
SSHConnection
()
server_filename
=
f'iperf_server_
{
self
.
testCase_id
}
_
{
ue
.
getName
()
}
.log'
client_filename
=
f'iperf_client_
{
self
.
testCase_id
}
_
{
ue
.
getName
()
}
.log'
...
...
@@ -987,16 +879,18 @@ class OaiCiTest():
# hack: the ADB UEs don't have iperf in $PATH, so we need to hardcode for the moment
iperf_ue
=
'/data/local/tmp/iperf'
if
re
.
search
(
'adb'
,
ue
.
getName
())
else
'iperf'
ue_header
=
f'UE
{
ue
.
getName
()
}
(
{
ueIP
}
)'
if
self
.
iperf_direction
==
"DL"
:
logging
.
debug
(
"Iperf in DL requested"
)
cmd
=
cls_cmd
.
getConnection
(
ue
.
getHost
())
cmd
.
run
(
f'rm
{
server_filename
}
'
)
cmd
.
run
(
f'
{
ue
.
getCmdPrefix
()
}
{
iperf_ue
}
-s -B
{
ue
.
getIP
()
}
{
udpSwitch
}
-i 1 -t
{
iperf_time
*
1.5
}
{
port
}
&> /tmp/
{
server_filename
}
&'
)
cmd
.
run
(
f'
{
ue
.
getCmdPrefix
()
}
{
iperf_ue
}
-s -B
{
ue
IP
}
{
udpSwitch
}
-i 1 -t
{
iperf_time
*
1.5
}
{
port
}
&> /tmp/
{
server_filename
}
&'
)
cmd
.
close
()
cmd
=
cls_cmd
.
getConnection
(
EPC
.
IPAddress
)
cmd
.
run
(
f'rm
{
EPC
.
SourceCodePath
}
/
{
client_filename
}
'
)
cmd
.
run
(
f'
{
cn_iperf_prefix
}
iperf -c
{
ue
.
getIP
()
}
{
iperf_opt
}
{
port
}
&>
{
EPC
.
SourceCodePath
}
/
{
client_filename
}
'
,
timeout
=
iperf_time
*
1.5
)
cmd
.
run
(
f'
{
cn_iperf_prefix
}
iperf -c
{
ue
IP
}
{
iperf_opt
}
{
port
}
&>
{
EPC
.
SourceCodePath
}
/
{
client_filename
}
'
,
timeout
=
iperf_time
*
1.5
)
cmd
.
copyin
(
f'
{
EPC
.
SourceCodePath
}
/
{
client_filename
}
'
,
client_filename
)
cmd
.
close
()
...
...
@@ -1005,10 +899,10 @@ class OaiCiTest():
cmd
.
close
()
if
udpIperf
:
s
elf
.
Iperf_analyzeV2Server
(
lock
,
ue
.
getIP
(),
ue
.
getName
(),
statusQueue
,
iperf_opt
,
server_filename
,
1
)
s
tatus
,
msg
=
self
.
Iperf_analyzeV2Server
(
iperf_opt
,
server_filename
,
1
)
else
:
cmd
=
cls_cmd
.
getConnection
(
EPC
.
IPAddress
)
s
elf
.
Iperf_analyzeV2TCPOutput
(
lock
,
ue
.
getIP
(),
ue
.
getName
(),
statusQueue
,
iperf_opt
,
EPC
,
cmd
,
f"
{
EPC
.
SourceCodePath
}
/
{
client_filename
}
"
)
s
tatus
,
msg
=
self
.
Iperf_analyzeV2TCPOutput
(
cmd
,
f"
{
EPC
.
SourceCodePath
}
/
{
client_filename
}
"
)
cmd
.
close
()
elif
self
.
iperf_direction
==
"UL"
:
...
...
@@ -1020,7 +914,7 @@ class OaiCiTest():
cmd
=
cls_cmd
.
getConnection
(
ue
.
getHost
())
cmd
.
run
(
f'rm /tmp/
{
client_filename
}
'
)
cmd
.
run
(
f'
{
ue
.
getCmdPrefix
()
}
{
iperf_ue
}
-B
{
ue
.
getIP
()
}
-c
{
cn_target_ip
}
{
iperf_opt
}
{
port
}
&> /tmp/
{
client_filename
}
'
,
timeout
=
iperf_time
*
1.5
)
cmd
.
run
(
f'
{
ue
.
getCmdPrefix
()
}
{
iperf_ue
}
-B
{
ue
IP
}
-c
{
cn_target_ip
}
{
iperf_opt
}
{
port
}
&> /tmp/
{
client_filename
}
'
,
timeout
=
iperf_time
*
1.5
)
cmd
.
copyin
(
f'/tmp/
{
client_filename
}
'
,
client_filename
)
cmd
.
close
()
...
...
@@ -1029,10 +923,10 @@ class OaiCiTest():
cmd
.
close
()
if
udpIperf
:
s
elf
.
Iperf_analyzeV2Server
(
lock
,
ue
.
getIP
(),
ue
.
getName
(),
statusQueue
,
iperf_opt
,
server_filename
,
1
)
s
tatus
,
msg
=
self
.
Iperf_analyzeV2Server
(
iperf_opt
,
server_filename
,
1
)
else
:
cmd
=
cls_cmd
.
getConnection
(
ue
.
getHost
())
s
elf
.
Iperf_analyzeV2TCPOutput
(
lock
,
ue
.
getIP
(),
ue
.
getName
(),
statusQueue
,
iperf_opt
,
EPC
,
cmd
,
f"/tmp/
{
client_filename
}
"
)
s
tatus
,
msg
=
self
.
Iperf_analyzeV2TCPOutput
(
cmd
,
f"/tmp/
{
client_filename
}
"
)
cmd
.
close
()
elif
self
.
iperf_direction
==
"BIDIR"
:
...
...
@@ -1044,7 +938,7 @@ class OaiCiTest():
cmd
=
cls_cmd
.
getConnection
(
ue
.
getHost
())
cmd
.
run
(
f'rm /tmp/
{
client_filename
}
'
)
cmd
.
run
(
f'iperf3 -B
{
ue
.
getIP
()
}
-c
{
cn_target_ip
}
{
iperf_opt
}
{
port
}
&> /tmp/
{
client_filename
}
'
,
timeout
=
iperf_time
*
1.5
)
cmd
.
run
(
f'iperf3 -B
{
ue
IP
}
-c
{
cn_target_ip
}
{
iperf_opt
}
{
port
}
&> /tmp/
{
client_filename
}
'
,
timeout
=
iperf_time
*
1.5
)
cmd
.
copyin
(
f'/tmp/
{
client_filename
}
'
,
client_filename
)
cmd
.
close
()
...
...
@@ -1052,129 +946,32 @@ class OaiCiTest():
cmd
.
copyin
(
f'
{
EPC
.
SourceCodePath
}
/
{
server_filename
}
'
,
server_filename
)
cmd
.
close
()
s
elf
.
Iperf_analyzeV2BIDIR
(
lock
,
ue
.
getHost
(),
ue
.
getName
(),
statusQueue
,
server_filename
,
client_filename
)
s
tatus
,
msg
=
self
.
Iperf_analyzeV2BIDIR
(
server_filename
,
client_filename
)
elif
self
.
iperf_direction
==
"IPERF3"
:
cmd
=
cls_cmd
.
getConnection
(
ue
.
getHost
())
cmd
.
run
(
f'rm /tmp/
{
server_filename
}
'
,
reportNonZero
=
False
)
port
=
f'
{
5002
+
idx
}
'
cmd
.
run
(
f'
{
ue
.
getCmdPrefix
()
}
iperf3 -B
{
ue
.
getIP
()
}
-c
{
cn_target_ip
}
-p
{
port
}
{
iperf_opt
}
--get-server-output &> /tmp/
{
server_filename
}
'
,
timeout
=
iperf_time
*
1.5
)
cmd
.
run
(
f'
{
ue
.
getCmdPrefix
()
}
iperf3 -B
{
ue
IP
}
-c
{
cn_target_ip
}
-p
{
port
}
{
iperf_opt
}
--get-server-output &> /tmp/
{
server_filename
}
'
,
timeout
=
iperf_time
*
1.5
)
cmd
.
copyin
(
f'/tmp/
{
server_filename
}
'
,
server_filename
)
cmd
.
close
()
if
udpIperf
:
s
elf
.
Iperf_analyzeV2Server
(
lock
,
ue
.
getIP
(),
ue
.
getName
(),
statusQueue
,
iperf_opt
,
server_filename
,
1
)
s
tatus
,
msg
=
self
.
Iperf_analyzeV2Server
(
iperf_opt
,
server_filename
,
1
)
else
:
cmd
=
cls_cmd
.
getConnection
(
EPC
.
IPAddress
)
s
elf
.
Iperf_analyzeV2TCPOutput
(
lock
,
ue
.
getIP
(),
ue
.
getName
(),
statusQueue
,
iperf_opt
,
EPC
,
cmd
,
f'/tmp/
{
server_filename
}
'
)
s
tatus
,
msg
=
self
.
Iperf_analyzeV2TCPOutput
(
cmd
,
f'/tmp/
{
server_filename
}
'
)
cmd
.
close
()
else
:
raise
Exception
(
"Incorrect or missing IPERF direction in XML"
)
def
IperfNoS1
(
self
,
HTML
,
RAN
,
EPC
,
CONTAINERS
):
SSH
=
sshconnection
.
SSHConnection
()
if
RAN
.
eNBIPAddress
==
''
or
RAN
.
eNBUserName
==
''
or
RAN
.
eNBPassword
==
''
or
self
.
UEIPAddress
==
''
or
self
.
UEUserName
==
''
or
self
.
UEPassword
==
''
:
HELP
.
GenericHelp
(
CONST
.
Version
)
sys
.
exit
(
'Insufficient Parameter'
)
check_eNB
=
True
check_OAI_UE
=
True
server_on_enb
=
re
.
search
(
'-R'
,
str
(
self
.
iperf_args
))
if
server_on_enb
is
not
None
:
iServerIPAddr
=
RAN
.
eNBIPAddress
iServerUser
=
RAN
.
eNBUserName
iServerPasswd
=
RAN
.
eNBPassword
iClientIPAddr
=
self
.
UEIPAddress
iClientUser
=
self
.
UEUserName
iClientPasswd
=
self
.
UEPassword
else
:
iServerIPAddr
=
self
.
UEIPAddress
iServerUser
=
self
.
UEUserName
iServerPasswd
=
self
.
UEPassword
iClientIPAddr
=
RAN
.
eNBIPAddress
iClientUser
=
RAN
.
eNBUserName
iClientPasswd
=
RAN
.
eNBPassword
if
self
.
iperf_options
!=
'sink'
:
# Starting the iperf server
SSH
.
open
(
iServerIPAddr
,
iServerUser
,
iServerPasswd
)
# args SHALL be "-c client -u any"
# -c 10.0.1.2 -u -b 1M -t 30 -i 1 -fm -B 10.0.1.1
# -B 10.0.1.1 -u -s -i 1 -fm
server_options
=
re
.
sub
(
'-u.*$'
,
'-u -s -i 1 -fm'
,
str
(
self
.
iperf_args
))
server_options
=
server_options
.
replace
(
'-c'
,
'-B'
)
SSH
.
command
(
f'rm -f /tmp/tmp_iperf_server_
{
self
.
testCase_id
}
.log'
,
'\$'
,
5
)
SSH
.
command
(
f'echo $USER; nohup iperf
{
server_options
}
> /tmp/tmp_iperf_server_
{
self
.
testCase_id
}
.log 2>&1 &'
,
iServerUser
,
5
)
time
.
sleep
(
0.5
)
SSH
.
close
()
# Starting the iperf client
modified_options
=
self
.
Iperf_ComputeModifiedBW
(
0
,
1
)
modified_options
=
modified_options
.
replace
(
'-R'
,
''
)
iperf_time
=
self
.
Iperf_ComputeTime
()
SSH
.
open
(
iClientIPAddr
,
iClientUser
,
iClientPasswd
)
SSH
.
command
(
f'rm -f /tmp/tmp_iperf_
{
self
.
testCase_id
}
.log'
,
'\$'
,
5
)
iperf_status
=
SSH
.
command
(
f'stdbuf -o0 iperf
{
modified_options
}
2>&1 | stdbuf -o0 tee /tmp/tmp_iperf_
{
self
.
testCase_id
}
.log'
,
'\$'
,
int
(
iperf_time
)
*
5.0
)
status_queue
=
SimpleQueue
()
lock
=
Lock
()
if
iperf_status
<
0
:
message
=
'iperf on OAI UE crashed due to TIMEOUT !'
logging
.
debug
(
f'
\u001B
[1;37;41m
{
message
}
\u001B
[0m'
)
clientStatus
=
-
2
else
:
if
self
.
iperf_options
==
'sink'
:
clientStatus
=
0
status_queue
.
put
(
0
)
status_queue
.
put
(
'OAI-UE'
)
status_queue
.
put
(
'10.0.1.2'
)
status_queue
.
put
(
'Sink Test : no check'
)
else
:
clientStatus
=
self
.
Iperf_analyzeV2Output
(
lock
,
'10.0.1.2'
,
'OAI-UE'
,
status_queue
,
modified_options
,
EPC
,
SSH
)
SSH
.
close
()
# Stopping the iperf server
if
self
.
iperf_options
!=
'sink'
:
SSH
.
open
(
iServerIPAddr
,
iServerUser
,
iServerPasswd
)
SSH
.
command
(
'killall --signal SIGKILL iperf'
,
'\$'
,
5
)
time
.
sleep
(
0.5
)
SSH
.
close
()
logging
.
info
(
f'
\u001B
[1;37;45m iperf result for
{
ue_header
}
\u001B
[0m'
)
for
l
in
msg
.
split
(
'
\n
'
):
logging
.
info
(
f'
\u001B
[1;35m
{
l
}
\u001B
[0m'
)
return
(
status
,
f'
{
ue_header
}
\n
{
msg
}
'
)
if
(
clientStatus
==
-
1
):
if
(
os
.
path
.
isfile
(
f'iperf_server_
{
self
.
testCase_id
}
.log'
)):
os
.
remove
(
f'iperf_server_
{
self
.
testCase_id
}
.log'
)
SSH
.
copyin
(
iServerIPAddr
,
iServerUser
,
iServerPasswd
,
f'/tmp/tmp_iperf_server_
{
self
.
testCase_id
}
.log'
,
f'iperf_server_
{
self
.
testCase_id
}
_OAI-UE.log'
)
filename
=
f'iperf_server_
{
self
.
testCase_id
}
_OAI-UE.log'
self
.
Iperf_analyzeV2Server
(
lock
,
'10.0.1.2'
,
'OAI-UE'
,
status_queue
,
modified_options
,
filename
,
0
)
# copying on the EPC server for logCollection
if
(
clientStatus
==
-
1
):
copyin_res
=
SSH
.
copyin
(
iServerIPAddr
,
iServerUser
,
iServerPasswd
,
f'/tmp/tmp_iperf_server_
{
self
.
testCase_id
}
.log'
,
f'iperf_server_
{
self
.
testCase_id
}
_OAI-UE.log'
)
if
(
copyin_res
==
0
):
SSH
.
copyout
(
EPC
.
IPAddress
,
EPC
.
UserName
,
EPC
.
Password
,
f'iperf_server_
{
self
.
testCase_id
}
_OAI-UE.log'
,
f'
{
EPC
.
SourceCodePath
}
/scripts'
)
copyin_res
=
SSH
.
copyin
(
iClientIPAddr
,
iClientUser
,
iClientPasswd
,
f'/tmp/tmp_iperf_
{
self
.
testCase_id
}
.log'
,
f'iperf_
{
self
.
testCase_id
}
_OAI-UE.log'
)
if
(
copyin_res
==
0
):
SSH
.
copyout
(
EPC
.
IPAddress
,
EPC
.
UserName
,
EPC
.
Password
,
f'iperf_
{
self
.
testCase_id
}
_OAI-UE.log'
,
f'
{
EPC
.
SourceCodePath
}
/scripts'
)
iperf_noperf
=
False
if
status_queue
.
empty
():
iperf_status
=
False
else
:
iperf_status
=
True
messages
=
[]
while
(
not
status_queue
.
empty
()):
count
=
status_queue
.
get
()
if
(
count
<
0
):
iperf_status
=
False
if
(
count
>
0
):
iperf_noperf
=
True
device_id
=
status_queue
.
get
()
ip_addr
=
status_queue
.
get
()
message
=
status_queue
.
get
()
messages
.
append
(
f'UE (
{
device_id
}
)
\n
IP Address :
{
ip_addr
}
\n
{
message
}
'
)
if
(
iperf_noperf
and
iperf_status
):
HTML
.
CreateHtmlTestRowQueue
(
self
.
iperf_args
,
'PERF NOT MET'
,
messages
)
elif
(
iperf_status
):
HTML
.
CreateHtmlTestRowQueue
(
self
.
iperf_args
,
'OK'
,
messages
)
else
:
HTML
.
CreateHtmlTestRowQueue
(
self
.
iperf_args
,
'KO'
,
messages
)
self
.
AutoTerminateUEandeNB
(
HTML
,
RAN
,
EPC
,
CONTAINERS
)
def
IperfNoS1
(
self
,
HTML
,
RAN
,
EPC
,
CONTAINERS
):
raise
'IperfNoS1 not implemented'
def
Iperf
(
self
,
HTML
,
RAN
,
EPC
,
CONTAINERS
):
result
=
re
.
search
(
'noS1'
,
str
(
RAN
.
Initialize_eNB_args
))
...
...
@@ -1187,60 +984,14 @@ class OaiCiTest():
logging
.
debug
(
f'Iperf: iperf_args "
{
self
.
iperf_args
}
" iperf_direction "
{
self
.
iperf_direction
}
" iperf_packetloss_threshold "
{
self
.
iperf_packetloss_threshold
}
" iperf_bitrate_threshold "
{
self
.
iperf_bitrate_threshold
}
" iperf_profile "
{
self
.
iperf_profile
}
" iperf_options "
{
self
.
iperf_options
}
"'
)
ues
=
[]
for
ue_name
in
self
.
ue_ids
:
ue
=
cls_module_ue
.
Module_UE
(
ue_name
)
if
not
ue
.
getIP
():
logging
.
error
(
"no IP addresses returned"
)
HTML
.
CreateHtmlTestRow
(
self
.
ping_args
,
'KO'
,
CONST
.
UE_IP_ADDRESS_ISSUE
)
self
.
AutoTerminateUEandeNB
(
HTML
,
RAN
,
EPC
,
CONTAINERS
)
ues
.
append
(
ue
)
ues
=
[
cls_module_ue
.
Module_UE
(
n
.
strip
())
for
n
in
self
.
ue_ids
]
logging
.
debug
(
ues
)
self
.
dummyIperfVersion
=
'2.0.10'
#cmd = 'iperf --version'
#logging.debug(cmd + '\n')
#iperfStdout = subprocess.check_output(cmd, shell=True, universal_newlines=True)
#result = re.search('iperf version 2.0.5', str(iperfStdout.strip()))
#if result is not None:
# dummyIperfVersion = '2.0.5'
#result = re.search('iperf version 2.0.10', str(iperfStdout.strip()))
#if result is not None:
# dummyIperfVersion = '2.0.10'
multi_jobs
=
[]
ue_num
=
len
(
ues
)
i
=
0
lock
=
Lock
()
status_queue
=
SimpleQueue
()
for
ue
in
ues
:
p
=
Process
(
target
=
self
.
Iperf_Module
,
args
=
(
lock
,
status_queue
,
EPC
,
ue
,
RAN
,
i
,
ue_num
))
p
.
daemon
=
True
p
.
start
()
multi_jobs
.
append
(
p
)
i
=
i
+
1
for
job
in
multi_jobs
:
job
.
join
()
if
(
status_queue
.
empty
()):
HTML
.
CreateHtmlTestRow
(
self
.
iperf_args
,
'KO'
,
CONST
.
ALL_PROCESSES_OK
)
self
.
AutoTerminateUEandeNB
(
HTML
,
RAN
,
EPC
,
CONTAINERS
)
else
:
iperf_status
=
True
iperf_noperf
=
False
messages
=
[]
while
(
not
status_queue
.
empty
()):
count
=
status_queue
.
get
()
if
(
count
<
0
):
iperf_status
=
False
if
(
count
>
0
):
iperf_noperf
=
True
device_id
=
status_queue
.
get
()
ip_addr
=
status_queue
.
get
()
msg
=
status_queue
.
get
()
messages
.
append
(
f'UE (
{
device_id
}
)
\n
IP Address :
{
ip_addr
}
\n
{
msg
}
'
)
if
(
iperf_noperf
and
iperf_status
):
HTML
.
CreateHtmlTestRowQueue
(
self
.
iperf_args
,
'PERF NOT MET'
,
messages
)
elif
(
iperf_status
):
with
concurrent
.
futures
.
ThreadPoolExecutor
()
as
executor
:
futures
=
[
executor
.
submit
(
self
.
Iperf_Module
,
EPC
,
ue
,
RAN
,
i
,
len
(
ues
))
for
i
,
ue
in
enumerate
(
ues
)]
results
=
[
f
.
result
()
for
f
in
futures
]
# each result in results is a tuple, first member goes to successes, second to messages
successes
,
messages
=
map
(
list
,
zip
(
*
results
))
if
len
(
successes
)
==
len
(
ues
)
and
all
(
successes
):
HTML
.
CreateHtmlTestRowQueue
(
self
.
iperf_args
,
'OK'
,
messages
)
else
:
HTML
.
CreateHtmlTestRowQueue
(
self
.
iperf_args
,
'KO'
,
messages
)
...
...
ci-scripts/conf_files/gnb-cucp.sa.f1.quectel.conf
0 → 100644
View file @
bfc45da9
Active_gNBs
= (
"gNB-OAI"
);
# Asn1_verbosity, choice in: none, info, annoying
Asn1_verbosity
=
"none"
;
Num_Threads_PUSCH
=
8
;
sa
=
1
;
gNBs
=
(
{
//////////
Identification
parameters
:
gNB_CU_ID
=
0
xe00
;
# cell_type = "CELL_MACRO_GNB";
gNB_name
=
"gNB-OAI"
;
//
Tracking
area
code
,
0
x0000
and
0
xfffe
are
reserved
values
tracking_area_code
=
1
;
plmn_list
= ({
mcc
=
222
;
mnc
=
01
;
mnc_length
=
2
;
snssaiList
= ({
sst
=
1
,
sd
=
0
xffffff
}) });
nr_cellid
=
12345678
L
;
force_256qam_off
=
1
;
tr_s_preference
=
"f1"
;
local_s_if_name
=
"eth0"
;
local_s_address
=
"192.168.68.194"
;
remote_s_address
=
"192.168.68.195"
;
local_s_portc
=
501
;
local_s_portd
=
2153
;
remote_s_portc
=
500
;
remote_s_portd
=
2153
;
ssb_SubcarrierOffset
=
0
;
min_rxtxtime
=
6
;
servingCellConfigCommon
= (
{
#spCellConfigCommon
physCellId
=
0
;
# downlinkConfigCommon
#frequencyInfoDL
# this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
absoluteFrequencySSB
=
641280
;
dl_frequencyBand
=
78
;
# this is 3600 MHz
dl_absoluteFrequencyPointA
=
640008
;
#scs-SpecificCarrierList
dl_offstToCarrier
=
0
;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
dl_subcarrierSpacing
=
1
;
dl_carrierBandwidth
=
106
;
#initialDownlinkBWP
#genericParameters
# this is RBstart=27,L=48 (275*(L-1))+RBstart
initialDLBWPlocationAndBandwidth
=
28875
;
# 6366 12925 12956 28875 12952
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing
=
1
;
#pdcch-ConfigCommon
initialDLBWPcontrolResourceSetZero
=
11
;
initialDLBWPsearchSpaceZero
=
0
;
#uplinkConfigCommon
#frequencyInfoUL
ul_frequencyBand
=
78
;
#scs-SpecificCarrierList
ul_offstToCarrier
=
0
;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
ul_subcarrierSpacing
=
1
;
ul_carrierBandwidth
=
106
;
pMax
=
20
;
#initialUplinkBWP
#genericParameters
initialULBWPlocationAndBandwidth
=
28875
;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing
=
1
;
#rach-ConfigCommon
#rach-ConfigGeneric
prach_ConfigurationIndex
=
98
;
#prach_msg1_FDM
#0 = one, 1=two, 2=four, 3=eight
prach_msg1_FDM
=
0
;
prach_msg1_FrequencyStart
=
0
;
zeroCorrelationZoneConfig
=
13
;
preambleReceivedTargetPower
= -
96
;
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
preambleTransMax
=
6
;
#powerRampingStep
# 0=dB0,1=dB2,2=dB4,3=dB6
powerRampingStep
=
1
;
#ra_ReponseWindow
#1,2,4,8,10,20,40,80
ra_ResponseWindow
=
4
;
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
=
4
;
#oneHalf (0..15) 4,8,12,16,...60,64
ssb_perRACH_OccasionAndCB_PreamblesPerSSB
=
14
;
#ra_ContentionResolutionTimer
#(0..7) 8,16,24,32,40,48,56,64
ra_ContentionResolutionTimer
=
7
;
rsrp_ThresholdSSB
=
19
;
#prach-RootSequenceIndex_PR
#1 = 839, 2 = 139
prach_RootSequenceIndex_PR
=
2
;
prach_RootSequenceIndex
=
1
;
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
#
msg1_SubcarrierSpacing
=
1
,
# restrictedSetConfig
# 0=unrestricted, 1=restricted type A, 2=restricted type B
restrictedSetConfig
=
0
,
msg3_DeltaPreamble
=
1
;
p0_NominalWithGrant
=-
90
;
# pucch-ConfigCommon setup :
# pucchGroupHopping
# 0 = neither, 1= group hopping, 2=sequence hopping
pucchGroupHopping
=
0
;
hoppingId
=
40
;
p0_nominal
= -
90
;
# ssb_PositionsInBurs_BitmapPR
# 1=short, 2=medium, 3=long
ssb_PositionsInBurst_PR
=
2
;
ssb_PositionsInBurst_Bitmap
=
1
;
# ssb_periodicityServingCell
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
ssb_periodicityServingCell
=
2
;
# dmrs_TypeA_position
# 0 = pos2, 1 = pos3
dmrs_TypeA_Position
=
0
;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
subcarrierSpacing
=
1
;
#tdd-UL-DL-ConfigurationCommon
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
referenceSubcarrierSpacing
=
1
;
# pattern1
# dl_UL_TransmissionPeriodicity
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
dl_UL_TransmissionPeriodicity
=
6
;
nrofDownlinkSlots
=
7
;
nrofDownlinkSymbols
=
6
;
nrofUplinkSlots
=
2
;
nrofUplinkSymbols
=
4
;
ssPBCH_BlockPower
= -
25
;
}
);
# ------- SCTP definitions
SCTP
:
{
# Number of streams to use in input/output
SCTP_INSTREAMS
=
2
;
SCTP_OUTSTREAMS
=
2
;
};
//////////
AMF
parameters
:
amf_ip_address
= ( {
ipv4
=
"172.21.16.137"
;
ipv6
=
"192:168:30::17"
;
active
=
"yes"
;
preference
=
"ipv4"
;
}
);
E1_INTERFACE
=
(
{
type
=
"cp"
;
ipv4_cucp
=
"192.168.68.194"
;
port_cucp
=
38462
;
ipv4_cuup
=
"192.168.68.196"
;
port_cuup
=
38462
;
}
)
NETWORK_INTERFACES
:
{
GNB_INTERFACE_NAME_FOR_NG_AMF
=
"eth0"
;
GNB_IPV4_ADDRESS_FOR_NG_AMF
=
"192.168.68.194"
;
};
}
);
security
= {
# preferred ciphering algorithms
# the first one of the list that an UE supports in chosen
# valid values: nea0, nea1, nea2, nea3
ciphering_algorithms
= (
"nea0"
);
# preferred integrity algorithms
# the first one of the list that an UE supports in chosen
# valid values: nia0, nia1, nia2, nia3
integrity_algorithms
= (
"nia2"
,
"nia0"
);
# setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
# what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
drb_ciphering
=
"yes"
;
drb_integrity
=
"no"
;
};
log_config
: {
global_log_level
=
"info"
;
};
ci-scripts/conf_files/gnb-cuup.sa.f1.quectel.conf
0 → 100644
View file @
bfc45da9
Active_gNBs
= (
"gNB-OAI"
);
# Asn1_verbosity, choice in: none, info, annoying
Asn1_verbosity
=
"none"
;
sa
=
1
;
gNBs
=
(
{
//////////
Identification
parameters
:
gNB_CU_ID
=
0
xe00
;
# cell_type = "CELL_MACRO_GNB";
gNB_name
=
"gNB-OAI"
;
//
Tracking
area
code
,
0
x0000
and
0
xfffe
are
reserved
values
tracking_area_code
=
1
;
plmn_list
= ({
mcc
=
222
;
mnc
=
01
;
mnc_length
=
2
;
snssaiList
= ({
sst
=
1
,
sd
=
0
xffffff
}) });
tr_s_preference
=
"f1"
;
local_s_if_name
=
"lo"
;
local_s_address
=
"192.168.68.196"
;
remote_s_address
=
"192.168.68.195"
;
local_s_portc
=
501
;
local_s_portd
=
2153
;
remote_s_portc
=
500
;
remote_s_portd
=
2153
;
# ------- SCTP definitions
SCTP
:
{
# Number of streams to use in input/output
SCTP_INSTREAMS
=
2
;
SCTP_OUTSTREAMS
=
2
;
};
E1_INTERFACE
=
(
{
type
=
"up"
;
ipv4_cucp
=
"192.168.68.194"
;
ipv4_cuup
=
"192.168.68.196"
;
}
)
NETWORK_INTERFACES
:
{
GNB_INTERFACE_NAME_FOR_NG_AMF
=
"demo-oai"
;
GNB_IPV4_ADDRESS_FOR_NG_AMF
=
"192.168.68.196"
;
GNB_INTERFACE_NAME_FOR_NGU
=
"demo-oai"
;
GNB_IPV4_ADDRESS_FOR_NGU
=
"192.168.68.196"
;
GNB_PORT_FOR_S1U
=
2152
;
# Spec 2152
};
}
);
security
= {
# preferred ciphering algorithms
# the first one of the list that an UE supports in chosen
# valid values: nea0, nea1, nea2, nea3
ciphering_algorithms
= (
"nea0"
);
# preferred integrity algorithms
# the first one of the list that an UE supports in chosen
# valid values: nia0, nia1, nia2, nia3
integrity_algorithms
= (
"nia2"
,
"nia0"
);
# setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
# what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
drb_ciphering
=
"yes"
;
drb_integrity
=
"no"
;
};
log_config
: {
global_log_level
=
"info"
;
};
ci-scripts/conf_files/gnb-du.sa.band78.106prb.usrpb200.conf
View file @
bfc45da9
...
...
@@ -218,15 +218,6 @@ THREAD_STRUCT = (
}
);
log_config
:
{
global_log_level
=
"info"
;
hw_log_level
=
"info"
;
phy_log_level
=
"info"
;
mac_log_level
=
"info"
;
rlc_log_level
=
"info"
;
pdcp_log_level
=
"info"
;
rrc_log_level
=
"info"
;
f1ap_log_level
=
"debug"
;
ngap_log_level
=
"debug"
;
};
log_config
: {
global_log_level
=
"info"
;
};
ci-scripts/doGitLabMerge.sh
View file @
bfc45da9
...
...
@@ -135,8 +135,6 @@ then
exit
$STATUS
fi
git log
-n1
--pretty
=
format:
\"
%s
\"
>
.git/CI_COMMIT_MSG
git merge
--ff
$TARGET_COMMIT_ID
-m
"Temporary merge for CI"
STATUS
=
`
git status | egrep
-c
"You have unmerged paths.|fix conflicts"
`
...
...
ci-scripts/xml_files/container_lte_b200_fdd_05Mhz_tm1.xml
View file @
bfc45da9
...
...
@@ -120,6 +120,7 @@ Replaces xml_files/enb_usrp210_band7_test_05mhz_tm1.xml
<desc>
iperf (5MHz - DL/15Mbps/UDP)(30 sec)(balanced profile)
</desc>
<iperf_args>
-u -b 15M -t 30 -i 1
</iperf_args>
<iperf_packetloss_threshold>
50
</iperf_packetloss_threshold>
<iperf_bitrate_threshold>
50
</iperf_bitrate_threshold>
<direction>
DL
</direction>
<id>
adb_ue_1 adb_ue_2
</id>
</testCase>
...
...
@@ -178,6 +179,7 @@ Replaces xml_files/enb_usrp210_band7_test_05mhz_tm1.xml
<desc>
iperf (5MHz - UL/9Mbps/UDP)(30 sec)(single-ue profile)
</desc>
<iperf_args>
-u -b 9M -t 30 -i 1
</iperf_args>
<iperf_packetloss_threshold>
50
</iperf_packetloss_threshold>
<iperf_bitrate_threshold>
50
</iperf_bitrate_threshold>
<iperf_profile>
single-ue
</iperf_profile>
<direction>
UL
</direction>
<id>
adb_ue_1
</id>
...
...
ci-scripts/xml_files/container_lte_b200_fdd_05Mhz_tm1_if4_5.xml
View file @
bfc45da9
...
...
@@ -128,6 +128,7 @@
<desc>
iperf (5MHz - DL/15Mbps/UDP)(30 sec)(balanced profile)
</desc>
<iperf_args>
-u -b 15M -t 30 -i 1
</iperf_args>
<iperf_packetloss_threshold>
50
</iperf_packetloss_threshold>
<iperf_bitrate_threshold>
50
</iperf_bitrate_threshold>
<direction>
DL
</direction>
<id>
adb_ue_1 adb_ue_2
</id>
</testCase>
...
...
@@ -156,6 +157,7 @@
<desc>
iperf (5MHz - UL/9Mbps/UDP)(30 sec)(balanced profile)
</desc>
<iperf_args>
-u -b 9M -t 30 -i 1
</iperf_args>
<iperf_packetloss_threshold>
50
</iperf_packetloss_threshold>
<iperf_bitrate_threshold>
50
</iperf_bitrate_threshold>
<iperf_profile>
balanced
</iperf_profile>
<direction>
UL
</direction>
<id>
adb_ue_1 adb_ue_2
</id>
...
...
@@ -166,6 +168,7 @@
<desc>
iperf (5MHz - UL/9Mbps/UDP)(30 sec)(single-ue profile)
</desc>
<iperf_args>
-u -b 9M -t 30 -i 1
</iperf_args>
<iperf_packetloss_threshold>
50
</iperf_packetloss_threshold>
<iperf_bitrate_threshold>
50
</iperf_bitrate_threshold>
<iperf_profile>
single-ue
</iperf_profile>
<direction>
UL
</direction>
<id>
adb_ue_1
</id>
...
...
ci-scripts/xml_files/container_lte_b200_fdd_10Mhz_tm1.xml
View file @
bfc45da9
...
...
@@ -114,6 +114,7 @@ Replaces xml_files/enb_usrp210_band7_test_10mhz_tm1.xml
<desc>
iperf (10MHz - DL/30Mbps/UDP)(30 sec)(balanced profile)
</desc>
<iperf_args>
-u -b 30M -t 30 -i 1
</iperf_args>
<iperf_packetloss_threshold>
50
</iperf_packetloss_threshold>
<iperf_bitrate_threshold>
50
</iperf_bitrate_threshold>
<iperf_profile>
balanced
</iperf_profile>
<direction>
DL
</direction>
<id>
adb_ue_1 adb_ue_2
</id>
...
...
ci-scripts/xml_files/container_lte_b200_fdd_10Mhz_tm1_cdrx.xml
View file @
bfc45da9
...
...
@@ -107,6 +107,7 @@ Replaces xml_files/enb_usrp210_band7_test_10mhz_tm1.xml
<desc>
iperf (10MHz - DL/30Mbps/UDP)(30 sec)(balanced profile)
</desc>
<iperf_args>
-u -b 30M -t 30 -i 1
</iperf_args>
<iperf_packetloss_threshold>
50
</iperf_packetloss_threshold>
<iperf_bitrate_threshold>
50
</iperf_bitrate_threshold>
<iperf_profile>
balanced
</iperf_profile>
<direction>
DL
</direction>
<id>
adb_ue_1 adb_ue_2
</id>
...
...
ci-scripts/xml_files/container_lte_b200_fdd_20Mhz_tm1.xml
View file @
bfc45da9
...
...
@@ -113,6 +113,7 @@ Replaces xml_files/enb_usrp210_band7_test_10mhz_tm1.xml
<desc>
iperf (20MHz - DL/70Mbps/UDP)(30 sec)(balanced profile)
</desc>
<iperf_args>
-u -b 70M -t 30 -i 1
</iperf_args>
<iperf_packetloss_threshold>
50
</iperf_packetloss_threshold>
<iperf_bitrate_threshold>
50
</iperf_bitrate_threshold>
<iperf_profile>
balanced
</iperf_profile>
<direction>
DL
</direction>
<id>
adb_ue_1 adb_ue_2
</id>
...
...
ci-scripts/xml_files/container_lte_b200_tdd_05Mhz_tm1.xml
View file @
bfc45da9
...
...
@@ -121,6 +121,7 @@ Replaces xml_files/enb_usrp210_band40_test_05mhz_tm1.xml
<desc>
iperf (5MHz - DL/6.5Mbps/UDP)(30 sec)(balanced)
</desc>
<iperf_args>
-u -b 6.5M -t 30 -i 1
</iperf_args>
<iperf_packetloss_threshold>
50
</iperf_packetloss_threshold>
<iperf_bitrate_threshold>
50
</iperf_bitrate_threshold>
<iperf_profile>
balanced
</iperf_profile>
<direction>
DL
</direction>
<id>
adb_ue_1 adb_ue_2
</id>
...
...
ci-scripts/xml_files/container_lte_b200_tdd_05Mhz_tm1_if4_5.xml
View file @
bfc45da9
...
...
@@ -129,6 +129,7 @@
<desc>
iperf (5MHz - DL/6.5Mbps/UDP)(30 sec)(balanced)
</desc>
<iperf_args>
-u -b 6.5M -t 30 -i 1
</iperf_args>
<iperf_packetloss_threshold>
50
</iperf_packetloss_threshold>
<iperf_bitrate_threshold>
50
</iperf_bitrate_threshold>
<iperf_profile>
balanced
</iperf_profile>
<direction>
DL
</direction>
<id>
adb_ue_1 adb_ue_2
</id>
...
...
ci-scripts/xml_files/container_lte_b200_tdd_10Mhz_tm1.xml
View file @
bfc45da9
...
...
@@ -111,6 +111,7 @@ Replaces xml_files/enb_usrp210_band40_test_10mhz_tm1.xml
<desc>
iperf (10MHz - DL/13.5Mbps/UDP)(30 sec)(balanced)
</desc>
<iperf_args>
-u -b 13.5M -t 30 -i 1
</iperf_args>
<iperf_packetloss_threshold>
50
</iperf_packetloss_threshold>
<iperf_bitrate_threshold>
50
</iperf_bitrate_threshold>
<iperf_profile>
balanced
</iperf_profile>
<direction>
DL
</direction>
<id>
adb_ue_1 adb_ue_2
</id>
...
...
ci-scripts/xml_files/container_lte_b200_tdd_20Mhz_tm1_default_scheduler.xml
View file @
bfc45da9
...
...
@@ -113,6 +113,7 @@ Replaces xml_files/enb_usrp210_band40_test_20mhz_tm1_default_scheduler.xml
<desc>
iperf (20MHz - DL/27.5Mbps/UDP)(30 sec)(balanced)
</desc>
<iperf_args>
-u -b 27.5M -t 30 -i 1
</iperf_args>
<iperf_packetloss_threshold>
50
</iperf_packetloss_threshold>
<iperf_bitrate_threshold>
50
</iperf_bitrate_threshold>
<iperf_profile>
balanced
</iperf_profile>
<direction>
DL
</direction>
<id>
adb_ue_1 adb_ue_2
</id>
...
...
@@ -123,6 +124,7 @@ Replaces xml_files/enb_usrp210_band40_test_20mhz_tm1_default_scheduler.xml
<desc>
iperf (20MHz - DL/27.5Mbps/UDP)(30 sec)(single-ue)
</desc>
<iperf_args>
-u -b 27.5M -t 30 -i 1
</iperf_args>
<iperf_packetloss_threshold>
50
</iperf_packetloss_threshold>
<iperf_bitrate_threshold>
50
</iperf_bitrate_threshold>
<iperf_profile>
single-ue
</iperf_profile>
<direction>
DL
</direction>
<id>
adb_ue_1
</id>
...
...
@@ -133,6 +135,7 @@ Replaces xml_files/enb_usrp210_band40_test_20mhz_tm1_default_scheduler.xml
<desc>
iperf (20MHz - DL/27.5Mbps/UDP)(30 sec)(unbalanced)
</desc>
<iperf_args>
-u -b 27.5M -t 30 -i 1
</iperf_args>
<iperf_packetloss_threshold>
50
</iperf_packetloss_threshold>
<iperf_bitrate_threshold>
50
</iperf_bitrate_threshold>
<iperf_profile>
unbalanced
</iperf_profile>
<direction>
DL
</direction>
<id>
adb_ue_1 adb_ue_2
</id>
...
...
ci-scripts/xml_files/container_sa_e1_b200_quectel.xml
0 → 100644
View file @
bfc45da9
<!--
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The OpenAirInterface Software Alliance licenses this file to You under
the OAI Public License, Version 1.1 (the "License"); you may not use this file
except in compliance with the License.
You may obtain a copy of the License at
http://www.openairinterface.org/?page_id=698
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
For more information about the OpenAirInterface (OAI) Software Alliance:
contact@openairinterface.org
-->
<testCaseList>
<htmlTabRef>
TEST-SA-FR1-F1-E1-B200
</htmlTabRef>
<htmlTabName>
40 MHz TDD F1+E1 SA
</htmlTabName>
<htmlTabIcon>
tasks
</htmlTabIcon>
<repeatCount>
1
</repeatCount>
<TestCaseRequestedList>
333333
300000
310000
330101
330102
330103
310001
350000
370001
370000
370002
310011
310002
330201
200000
</TestCaseRequestedList>
<TestCaseExclusionList></TestCaseExclusionList>
<testCase
id=
"333333"
>
<class>
Pull_Local_Registry
</class>
<desc>
Pull Images from Local Registry
</desc>
<test_svr_id>
0
</test_svr_id>
<images_to_pull>
oai-gnb oai-nr-cuup
</images_to_pull>
</testCase>
<testCase
id=
"310000"
>
<class>
Initialize_UE
</class>
<desc>
Initialize Quectel
</desc>
<id>
idefix
</id>
</testCase>
<testCase
id=
"310002"
>
<class>
Terminate_UE
</class>
<desc>
Terminate Quectel
</desc>
<id>
idefix
</id>
</testCase>
<testCase
id=
"310001"
>
<class>
Attach_UE
</class>
<desc>
Attach Quectel
</desc>
<id>
idefix
</id>
</testCase>
<testCase
id=
"310011"
>
<class>
Detach_UE
</class>
<desc>
Detach Quectel
</desc>
<id>
idefix
</id>
</testCase>
<testCase
id=
"330101"
>
<class>
Deploy_Object
</class>
<desc>
Deploy gNB-CU-CP in a container
</desc>
<yaml_path>
ci-scripts/yaml_files/sa_e1_b200_gnb
</yaml_path>
<eNB_instance>
0
</eNB_instance>
<eNB_serverId>
0
</eNB_serverId>
<services>
gnb_cucp
</services>
</testCase>
<testCase
id=
"330102"
>
<class>
Deploy_Object
</class>
<desc>
Deploy gNB-CU-UP in a container
</desc>
<yaml_path>
ci-scripts/yaml_files/sa_e1_b200_gnb
</yaml_path>
<eNB_instance>
0
</eNB_instance>
<eNB_serverId>
0
</eNB_serverId>
<services>
gnb_cuup
</services>
</testCase>
<testCase
id=
"330103"
>
<class>
Deploy_Object
</class>
<desc>
Deploy gNB-DU (TDD/Band78/40MHz/B200) in a container
</desc>
<yaml_path>
ci-scripts/yaml_files/sa_e1_b200_gnb
</yaml_path>
<eNB_instance>
0
</eNB_instance>
<eNB_serverId>
0
</eNB_serverId>
<services>
gnb_du_tdd
</services>
</testCase>
<testCase
id=
"300000"
>
<class>
Custom_Command
</class>
<desc>
Disable Sleep States
</desc>
<node>
ofqot
</node>
<command>
sudo cpupower idle-set -D 0
</command>
</testCase>
<testCase
id=
"200000"
>
<class>
Custom_Command
</class>
<desc>
Enable Sleep States
</desc>
<node>
ofqot
</node>
<command>
sudo cpupower idle-set -E
</command>
</testCase>
<testCase
id=
"350000"
>
<class>
Ping
</class>
<desc>
Ping: 20pings in 20sec
</desc>
<id>
idefix
</id>
<ping_args>
-c 20 %cn_ip%
</ping_args>
<ping_packetloss_threshold>
1
</ping_packetloss_threshold>
<ping_rttavg_threshold>
25
</ping_rttavg_threshold>
</testCase>
<testCase
id=
"370000"
>
<class>
Iperf
</class>
<desc>
iperf (DL/80Mbps/UDP)(30 sec)
</desc>
<iperf_args>
-u -b 80M -t 30 -i 1 -fm
</iperf_args>
<direction>
DL
</direction>
<id>
idefix
</id>
<iperf_packetloss_threshold>
10
</iperf_packetloss_threshold>
<iperf_bitrate_threshold>
95
</iperf_bitrate_threshold>
<iperf_profile>
single-ue
</iperf_profile>
</testCase>
<testCase
id=
"370001"
>
<class>
Iperf
</class>
<desc>
iperf (UL/8Mbps/UDP)(30 sec)
</desc>
<iperf_args>
-u -b 8M -t 30 -i 1 -fm
</iperf_args>
<direction>
UL
</direction>
<id>
idefix
</id>
<iperf_packetloss_threshold>
1
</iperf_packetloss_threshold>
<iperf_bitrate_threshold>
95
</iperf_bitrate_threshold>
<iperf_profile>
single-ue
</iperf_profile>
</testCase>
<testCase
id=
"370002"
>
<class>
Iperf
</class>
<desc>
iperf (BIDIR TCP)(10 sec)(single-ue profile)
</desc>
<iperf_args>
-t 20 --bidir
</iperf_args>
<direction>
BIDIR
</direction>
<id>
idefix
</id>
<iperf_profile>
single-ue
</iperf_profile>
</testCase>
<testCase
id=
"330201"
>
<class>
Undeploy_Object
</class>
<desc>
Undeploy CU-DU
</desc>
<yaml_path>
ci-scripts/yaml_files/sa_e1_b200_gnb
</yaml_path>
<eNB_instance>
0
</eNB_instance>
<eNB_serverId>
0
</eNB_serverId>
<d_retx_th>
10,100,100,100
</d_retx_th>
<u_retx_th>
10,100,100,100
</u_retx_th>
</testCase>
</testCaseList>
ci-scripts/xml_files/container_sa_e1_b200_terminate.xml
0 → 100644
View file @
bfc45da9
<!--
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The OpenAirInterface Software Alliance licenses this file to You under
the OAI Public License, Version 1.1 (the "License"); you may not use this file
except in compliance with the License.
You may obtain a copy of the License at
http://www.openairinterface.org/?page_id=698
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
For more information about the OpenAirInterface (OAI) Software Alliance:
contact@openairinterface.org
-->
<testCaseList>
<htmlTabRef>
TEST-SA-FR1-F1-E1-B200-terminate
</htmlTabRef>
<htmlTabName>
Tear-down
</htmlTabName>
<htmlTabIcon>
tasks
</htmlTabIcon>
<repeatCount>
1
</repeatCount>
<TestCaseRequestedList>
330201
222222
</TestCaseRequestedList>
<TestCaseExclusionList></TestCaseExclusionList>
<testCase
id=
"330201"
>
<class>
Undeploy_Object
</class>
<desc>
Undeploy CU-CP/CU-UP/DU
</desc>
<yaml_path>
ci-scripts/yaml_files/sa_e1_b200_gnb
</yaml_path>
<eNB_instance>
0
</eNB_instance>
<eNB_serverId>
0
</eNB_serverId>
</testCase>
<testCase
id=
"222222"
>
<class>
Clean_Test_Server_Images
</class>
<desc>
Clean Test Images on Test Server
</desc>
<test_svr_id>
0
</test_svr_id>
</testCase>
</testCaseList>
ci-scripts/xml_files/container_sa_f1_b200_quectel.xml
View file @
bfc45da9
...
...
@@ -42,19 +42,15 @@
110011
110001
150000
170001
170000
170002
110011
110002
100001
130201
200000
</TestCaseRequestedList>
<!--
070001
070000
070002
050002
050003
-->
<TestCaseExclusionList></TestCaseExclusionList>
<testCase
id=
"110000"
>
...
...
@@ -159,19 +155,19 @@
<testCase
id=
"170000"
>
<class>
Iperf
</class>
<desc>
iperf (DL/
125Mbps/UDP)(60 sec)(single-ue profile
)
</desc>
<iperf_args>
-u -b
125M -t 6
0 -i 1 -fm
</iperf_args>
<desc>
iperf (DL/
80Mbps/UDP)(30 sec
)
</desc>
<iperf_args>
-u -b
80M -t 3
0 -i 1 -fm
</iperf_args>
<direction>
DL
</direction>
<id>
idefix
</id>
<iperf_packetloss_threshold>
25
</iperf_packetloss_threshold>
<iperf_bitrate_threshold>
80
</iperf_bitrate_threshold>
<iperf_packetloss_threshold>
10
</iperf_packetloss_threshold>
<iperf_bitrate_threshold>
95
</iperf_bitrate_threshold>
<iperf_profile>
single-ue
</iperf_profile>
</testCase>
<testCase
id=
"170001"
>
<class>
Iperf
</class>
<desc>
iperf (UL/8Mbps/UDP)(
60 sec)(single-ue profile
)
</desc>
<iperf_args>
-u -b 8M -t
6
0 -i 1 -fm
</iperf_args>
<desc>
iperf (UL/8Mbps/UDP)(
30 sec
)
</desc>
<iperf_args>
-u -b 8M -t
3
0 -i 1 -fm
</iperf_args>
<direction>
UL
</direction>
<id>
idefix
</id>
<iperf_packetloss_threshold>
1
</iperf_packetloss_threshold>
...
...
@@ -181,8 +177,8 @@
<testCase
id=
"170002"
>
<class>
Iperf
</class>
<desc>
iperf (BIDIR TCP)(
1
0 sec)(single-ue profile)
</desc>
<iperf_args>
-t
1
0 --bidir
</iperf_args>
<desc>
iperf (BIDIR TCP)(
2
0 sec)(single-ue profile)
</desc>
<iperf_args>
-t
2
0 --bidir
</iperf_args>
<direction>
BIDIR
</direction>
<id>
idefix
</id>
<iperf_profile>
single-ue
</iperf_profile>
...
...
@@ -194,8 +190,8 @@
<yaml_path>
ci-scripts/yaml_files/sa_f1_b200_gnb
</yaml_path>
<eNB_instance>
0
</eNB_instance>
<eNB_serverId>
0
</eNB_serverId>
<d_retx_th>
1,100,100,100
</d_retx_th>
<u_retx_th>
1,100,100,100
</u_retx_th>
<d_retx_th>
1
0
,100,100,100
</d_retx_th>
<u_retx_th>
1
0
,100,100,100
</u_retx_th>
</testCase>
</testCaseList>
...
...
ci-scripts/xml_files/container_sa_f1_b200_terminate.xml
View file @
bfc45da9
...
...
@@ -27,7 +27,6 @@
<repeatCount>
1
</repeatCount>
<TestCaseRequestedList>
230201
222222
</TestCaseRequestedList>
<TestCaseExclusionList></TestCaseExclusionList>
...
...
@@ -39,10 +38,4 @@
<eNB_serverId>
0
</eNB_serverId>
</testCase>
<testCase
id=
"222222"
>
<class>
Clean_Test_Server_Images
</class>
<desc>
Clean Test Images on Test Server
</desc>
<test_svr_id>
0
</test_svr_id>
</testCase>
</testCaseList>
ci-scripts/yaml_files/sa_e1_b200_gnb/docker-compose.yml
0 → 100644
View file @
bfc45da9
version
:
'
3.8'
services
:
gnb_cucp
:
image
:
oai-gnb:latest
privileged
:
true
container_name
:
sa-cucp-gnb
environment
:
USE_ADDITIONAL_OPTIONS
:
--sa --log_config.global_log_options level,nocolor,time,line_num,function
volumes
:
-
../../conf_files/gnb-cucp.sa.f1.quectel.conf:/opt/oai-gnb/etc/gnb.conf
networks
:
public_net
:
ipv4_address
:
192.168.68.194
healthcheck
:
# pgrep does NOT work
test
:
/bin/bash -c "ps aux | grep -v grep | grep -c softmodem"
interval
:
10s
timeout
:
5s
retries
:
5
gnb_cuup
:
image
:
oai-nr-cuup:latest
privileged
:
true
container_name
:
sa-cuup-gnb
environment
:
USE_ADDITIONAL_OPTIONS
:
--sa --log_config.global_log_options level,nocolor,time,line_num,function
volumes
:
-
../../conf_files/gnb-cuup.sa.f1.quectel.conf:/opt/oai-gnb/etc/gnb.conf
networks
:
public_net
:
ipv4_address
:
192.168.68.196
healthcheck
:
# pgrep does NOT work
test
:
/bin/bash -c "ps aux | grep -v grep | grep -c nr-cuup"
interval
:
10s
timeout
:
5s
retries
:
5
gnb_du_tdd
:
image
:
oai-gnb:latest
privileged
:
true
container_name
:
sa-du-b200-gnb
environment
:
USE_B2XX
:
'
yes'
USE_ADDITIONAL_OPTIONS
:
--sa --RUs.[0].sdr_addrs serial=30C51D4 --continuous-tx -E --log_config.global_log_options level,nocolor,time,line_num,function --gNBs.[0].min_rxtxtime 2 --gNBs.[0].do_CSIRS 1 --gNBs.[0].do_SRS 1 --RUs.[0].att_rx 14 --RUs.[0].att_tx
14
volumes
:
-
../../conf_files/gnb-du.sa.band78.106prb.usrpb200.conf:/opt/oai-gnb/etc/gnb.conf
-
/dev:/dev
networks
:
public_net
:
ipv4_address
:
192.168.68.195
#entrypoint: /bin/bash -c "sleep infinity"
healthcheck
:
# pgrep does NOT work
test
:
/bin/bash -c "ps aux | grep -v grep | grep -c softmodem"
interval
:
10s
timeout
:
5s
retries
:
5
networks
:
public_net
:
name
:
sa-b200-gnb-net
ipam
:
config
:
-
subnet
:
192.168.68.192/26
driver_opts
:
com.docker.network.bridge.name
:
"
sa-gnb-net"
ci-scripts/yaml_files/sa_f1_b200_gnb/docker-compose.yml
View file @
bfc45da9
...
...
@@ -6,11 +6,9 @@ services:
privileged
:
true
container_name
:
sa-cu-gnb
environment
:
USE_B2XX
:
'
yes'
USE_ADDITIONAL_OPTIONS
:
--sa --log_config.global_log_options level,nocolor,time,line_num,function
volumes
:
-
../../conf_files/gnb-cu.sa.band78.106prb.usrpb200.conf:/opt/oai-gnb/etc/gnb.conf
-
/dev:/dev
networks
:
public_net
:
ipv4_address
:
192.168.68.194
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment