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
wangjie
OpenXG-RAN
Commits
b6daabc2
Commit
b6daabc2
authored
Apr 13, 2021
by
hardy
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
tentative to improve Module control encapsulation
parent
8def7528
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
88 additions
and
59 deletions
+88
-59
ci-scripts/ci_ueinfra.yaml
ci-scripts/ci_ueinfra.yaml
+4
-1
ci-scripts/cls_module_ue.py
ci-scripts/cls_module_ue.py
+45
-28
ci-scripts/cls_oaicitest.py
ci-scripts/cls_oaicitest.py
+6
-6
ci-scripts/main.py
ci-scripts/main.py
+1
-1
ci-scripts/xml_files/fr1_nsa_quectel.xml
ci-scripts/xml_files/fr1_nsa_quectel.xml
+32
-23
No files found.
ci-scripts/ci_ueinfra.yaml
View file @
b6daabc2
...
@@ -2,9 +2,12 @@ idefix:
...
@@ -2,9 +2,12 @@ idefix:
ID
:
idefix
ID
:
idefix
State
:
enabled
State
:
enabled
Kind
:
quectel
Kind
:
quectel
Process
:
quectel-CM
Process
:
Name
:
quectel-CM
Cmd
:
/home/oaicicd/quectel-CM/quectel-CM -s oai.ipv4 -4
WakeupScript
:
ci_ctl_qtel.py /dev/ttyUSB2 wup
WakeupScript
:
ci_ctl_qtel.py /dev/ttyUSB2 wup
DetachScript
:
ci_ctl_qtel.py /dev/ttyUSB2 detach
DetachScript
:
ci_ctl_qtel.py /dev/ttyUSB2 detach
PLMN
:
22201
UENetwork
:
wwan0
UENetwork
:
wwan0
HostIPAddress
:
192.168.18.188
HostIPAddress
:
192.168.18.188
HostUsername
:
oaicicd
HostUsername
:
oaicicd
...
...
ci-scripts/cls_module_ue.py
View file @
b6daabc2
...
@@ -56,7 +56,8 @@ class Module_UE:
...
@@ -56,7 +56,8 @@ class Module_UE:
for
k
,
v
in
Module
.
items
():
for
k
,
v
in
Module
.
items
():
setattr
(
self
,
k
,
v
)
setattr
(
self
,
k
,
v
)
self
.
UEIPAddress
=
""
self
.
UEIPAddress
=
""
#dictionary linking command names and related module scripts
self
.
cmd_dict
=
{
"wup"
:
self
.
WakeupScript
,
"detach"
:
self
.
DetachScript
}
#dictionary of function scripts
...
@@ -65,56 +66,72 @@ class Module_UE:
...
@@ -65,56 +66,72 @@ class Module_UE:
#-----------------$
#-----------------$
#this method checks if the specified Process is running on the server hosting the module
#this method checks if the specified Process is running on the server hosting the module
def
CheckIsModule
(
self
):
#if not it will be started
def
CheckCMProcess
(
self
):
HOST
=
self
.
HostIPAddress
HOST
=
self
.
HostIPAddress
COMMAND
=
"ps aux | grep "
+
self
.
Process
+
" | grep -v grep "
COMMAND
=
"ps aux | grep "
+
self
.
Process
[
'Name'
]
+
" | grep -v grep "
logging
.
debug
(
COMMAND
)
logging
.
debug
(
COMMAND
)
ssh
=
subprocess
.
Popen
([
"ssh"
,
"%s"
%
HOST
,
COMMAND
],
shell
=
False
,
stdout
=
subprocess
.
PIPE
,
stderr
=
subprocess
.
PIPE
)
ssh
=
subprocess
.
Popen
([
"ssh"
,
"%s"
%
HOST
,
COMMAND
],
shell
=
False
,
stdout
=
subprocess
.
PIPE
,
stderr
=
subprocess
.
PIPE
)
result
=
ssh
.
stdout
.
readlines
()
result
=
ssh
.
stdout
.
readlines
()
if
len
(
result
)
!=
0
:
if
len
(
result
)
!=
0
:
logging
.
debug
(
self
.
Process
+
" process found"
)
logging
.
debug
(
self
.
Process
[
'Name'
]
+
" process found"
)
return
True
return
True
else
:
else
:
#start process and check again
logging
.
debug
(
self
.
Process
+
" process NOT found"
)
logging
.
debug
(
self
.
Process
[
'Name'
]
+
" process NOT found"
)
return
False
#starting the process
logging
.
debug
(
'Starting '
+
self
.
Process
[
'Name'
])
mySSH
=
sshconnection
.
SSHConnection
()
mySSH
.
open
(
self
.
HostIPAddress
,
self
.
HostUsername
,
self
.
HostPassword
)
mySSH
.
command
(
'echo '
+
self
.
HostPassword
+
' | sudo -S '
+
self
.
Process
[
'Cmd'
]
+
' &'
,
'\$'
,
5
)
mySSH
.
close
()
#checking the process
HOST
=
self
.
HostIPAddress
COMMAND
=
"ps aux | grep "
+
self
.
Process
[
'Name'
]
+
" | grep -v grep "
logging
.
debug
(
COMMAND
)
ssh
=
subprocess
.
Popen
([
"ssh"
,
"%s"
%
HOST
,
COMMAND
],
shell
=
False
,
stdout
=
subprocess
.
PIPE
,
stderr
=
subprocess
.
PIPE
)
result
=
ssh
.
stdout
.
readlines
()
if
len
(
result
)
!=
0
:
logging
.
debug
(
self
.
Process
[
'Name'
]
+
" process found"
)
return
True
else
:
logging
.
debug
(
self
.
Process
[
'Name'
]
+
" process NOT found"
)
return
False
#Wakeup/Detach can probably be improved with encapsulation of the command such def Command(self, command)
#Generic command function, using function pointers dictionary
#this method wakes up the module by calling the specified python script
def
Command
(
self
,
cmd
):
def
WakeUp
(
self
):
mySSH
=
sshconnection
.
SSHConnection
()
mySSH
=
sshconnection
.
SSHConnection
()
mySSH
.
open
(
self
.
HostIPAddress
,
self
.
HostUsername
,
self
.
HostPassword
)
mySSH
.
open
(
self
.
HostIPAddress
,
self
.
HostUsername
,
self
.
HostPassword
)
mySSH
.
command
(
'echo '
+
self
.
HostPassword
+
' | sudo -S python3 '
+
self
.
WakeupScript
+
' '
,
'\$'
,
5
)
mySSH
.
command
(
'echo '
+
self
.
HostPassword
+
' | sudo -S python3 '
+
self
.
cmd_dict
[
cmd
]
,
'\$'
,
5
)
time
.
sleep
(
5
)
time
.
sleep
(
5
)
logging
.
debug
(
"Module
wake-up"
)
logging
.
debug
(
"Module
"
+
cmd
)
mySSH
.
close
()
mySSH
.
close
()
#this method detaches the module by calling the specified python script
def
Detach
(
self
):
mySSH
=
sshconnection
.
SSHConnection
()
mySSH
.
open
(
self
.
HostIPAddress
,
self
.
HostUsername
,
self
.
HostPassword
)
mySSH
.
command
(
'echo '
+
self
.
HostPassword
+
' | sudo -S python3 '
+
self
.
DetachScript
+
' '
,
'\$'
,
5
)
time
.
sleep
(
5
)
logging
.
debug
(
"Module detach"
)
mySSH
.
close
()
#this method retrieves the Module IP address (not the Host IP address)
#this method retrieves the Module IP address (not the Host IP address)
def
GetModuleIPAddress
(
self
):
def
GetModuleIPAddress
(
self
):
HOST
=
self
.
HostIPAddress
HOST
=
self
.
HostIPAddress
COMMAND
=
"ip a show dev "
+
self
.
UENetwork
+
" | grep inet | grep "
+
self
.
UENetwork
response
=
[]
ssh
=
subprocess
.
Popen
([
"ssh"
,
"%s"
%
HOST
,
COMMAND
],
shell
=
False
,
stdout
=
subprocess
.
PIPE
,
stderr
=
subprocess
.
PIPE
)
tentative
=
10
response
=
ssh
.
stdout
.
readlines
()
while
(
len
(
response
)
==
0
)
and
(
tentative
>
0
):
if
len
(
response
)
!=
0
:
COMMAND
=
"ip a show dev "
+
self
.
UENetwork
+
" | grep inet | grep "
+
self
.
UENetwork
logging
.
debug
(
COMMAND
)
ssh
=
subprocess
.
Popen
([
"ssh"
,
"%s"
%
HOST
,
COMMAND
],
shell
=
False
,
stdout
=
subprocess
.
PIPE
,
stderr
=
subprocess
.
PIPE
)
response
=
ssh
.
stdout
.
readlines
()
tentative
-=
1
time
.
sleep
(
10
)
if
(
tentative
==
0
)
and
(
len
(
response
)
==
0
):
logging
.
debug
(
'
\u001B
[1;37;41m Module IP Address Not Found! Time expired
\u001B
[0m'
)
return
-
1
else
:
#check response
result
=
re
.
search
(
'inet (?P<moduleipaddress>[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)'
,
response
[
0
].
decode
(
"utf-8"
)
)
result
=
re
.
search
(
'inet (?P<moduleipaddress>[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)'
,
response
[
0
].
decode
(
"utf-8"
)
)
if
result
is
not
None
:
if
result
is
not
None
:
if
result
.
group
(
'moduleipaddress'
)
is
not
None
:
if
result
.
group
(
'moduleipaddress'
)
is
not
None
:
self
.
UEIPAddress
=
result
.
group
(
'moduleipaddress'
)
self
.
UEIPAddress
=
result
.
group
(
'moduleipaddress'
)
logging
.
debug
(
'
\u001B
[1mUE Module IP Address is '
+
self
.
UEIPAddress
+
'
\u001B
[0m'
)
logging
.
debug
(
'
\u001B
[1mUE Module IP Address is '
+
self
.
UEIPAddress
+
'
\u001B
[0m'
)
return
0
else
:
else
:
logging
.
debug
(
'
\u001B
[1;37;41m Module IP Address Not Found!
\u001B
[0m'
)
logging
.
debug
(
'
\u001B
[1;37;41m Module IP Address Not Found!
\u001B
[0m'
)
else
:
return
-
1
logging
.
debug
(
'
\u001B
[1;37;41m Module IP Address Not Found!
\u001B
[0m'
)
else
:
logging
.
debug
(
'
\u001B
[1;37;41m Module IP Address Not Found!
\u001B
[0m'
)
...
...
ci-scripts/cls_oaicitest.py
View file @
b6daabc2
...
@@ -386,13 +386,13 @@ class OaiCiTest():
...
@@ -386,13 +386,13 @@ class OaiCiTest():
else
:
#if an ID is specified, it is a module from the yaml infrastructure file
else
:
#if an ID is specified, it is a module from the yaml infrastructure file
#RH
#RH
Module_UE
=
cls_module_ue
.
Module_UE
(
InfraUE
.
ci_ue_infra
[
self
.
ue_id
])
Module_UE
=
cls_module_ue
.
Module_UE
(
InfraUE
.
ci_ue_infra
[
self
.
ue_id
])
is_module
=
Module_UE
.
Check
IsModule
()
is_module
=
Module_UE
.
Check
CMProcess
()
if
is_module
:
if
is_module
:
Module_UE
.
WakeUp
(
)
Module_UE
.
Command
(
"wup"
)
Module_UE
.
GetModuleIPAddress
()
Module_UE
.
GetModuleIPAddress
()
HTML
.
CreateHtmlTestRow
(
Module_UE
.
UEIPAddress
,
'OK'
,
CONST
.
ALL_PROCESSES_OK
)
HTML
.
CreateHtmlTestRow
(
Module_UE
.
UEIPAddress
,
'OK'
,
CONST
.
ALL_PROCESSES_OK
)
self
.
UEIPAddresses
.
append
(
Module_UE
.
UEIPAddress
)
self
.
UEIPAddresses
.
append
(
Module_UE
.
UEIPAddress
)
logging
.
debug
(
'UEs IP addresses : '
+
self
.
UEIPAddresse
s
)
logging
.
debug
(
'UE IP addresss : '
+
Module_UE
.
UEIPAddres
s
)
def
InitializeOAIUE
(
self
,
HTML
,
RAN
,
EPC
,
COTS_UE
):
def
InitializeOAIUE
(
self
,
HTML
,
RAN
,
EPC
,
COTS_UE
):
if
self
.
UEIPAddress
==
''
or
self
.
UEUserName
==
''
or
self
.
UEPassword
==
''
or
self
.
UESourceCodePath
==
''
:
if
self
.
UEIPAddress
==
''
or
self
.
UEUserName
==
''
or
self
.
UEPassword
==
''
or
self
.
UESourceCodePath
==
''
:
...
@@ -1039,7 +1039,7 @@ class OaiCiTest():
...
@@ -1039,7 +1039,7 @@ class OaiCiTest():
except
:
except
:
os
.
kill
(
os
.
getppid
(),
signal
.
SIGUSR1
)
os
.
kill
(
os
.
getppid
(),
signal
.
SIGUSR1
)
def
DetachUE
(
self
,
HTML
,
RAN
,
EPC
,
COTS_UE
):
def
DetachUE
(
self
,
HTML
,
RAN
,
EPC
,
COTS_UE
,
InfraUE
):
if
self
.
ue_id
==
''
:
#no ID specified, then it is a COTS controlled by ADB
if
self
.
ue_id
==
''
:
#no ID specified, then it is a COTS controlled by ADB
if
self
.
ADBIPAddress
==
''
or
self
.
ADBUserName
==
''
or
self
.
ADBPassword
==
''
:
if
self
.
ADBIPAddress
==
''
or
self
.
ADBUserName
==
''
or
self
.
ADBPassword
==
''
:
HELP
.
GenericHelp
(
CONST
.
Version
)
HELP
.
GenericHelp
(
CONST
.
Version
)
...
@@ -1073,9 +1073,9 @@ class OaiCiTest():
...
@@ -1073,9 +1073,9 @@ class OaiCiTest():
cnt
+=
1
cnt
+=
1
else
:
#if an ID is specified, it is a module from the yaml infrastructure file
else
:
#if an ID is specified, it is a module from the yaml infrastructure file
Module_UE
=
cls_module_ue
.
Module_UE
(
InfraUE
.
ci_ue_infra
[
self
.
ue_id
])
Module_UE
=
cls_module_ue
.
Module_UE
(
InfraUE
.
ci_ue_infra
[
self
.
ue_id
])
is_module
=
Module_UE
.
Check
IsModule
()
is_module
=
Module_UE
.
Check
CMProcess
()
if
is_module
:
if
is_module
:
Module_UE
.
Detach
(
)
Module_UE
.
Command
(
"detach"
)
Module_UE
.
GetModuleIPAddress
()
Module_UE
.
GetModuleIPAddress
()
HTML
.
CreateHtmlTestRow
(
Module_UE
.
UEIPAddress
,
'OK'
,
CONST
.
ALL_PROCESSES_OK
)
HTML
.
CreateHtmlTestRow
(
Module_UE
.
UEIPAddress
,
'OK'
,
CONST
.
ALL_PROCESSES_OK
)
...
...
ci-scripts/main.py
View file @
b6daabc2
...
@@ -717,7 +717,7 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
...
@@ -717,7 +717,7 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
elif
action
==
'Attach_UE'
:
elif
action
==
'Attach_UE'
:
CiTestObj
.
AttachUE
(
HTML
,
RAN
,
EPC
,
COTS_UE
)
CiTestObj
.
AttachUE
(
HTML
,
RAN
,
EPC
,
COTS_UE
)
elif
action
==
'Detach_UE'
:
elif
action
==
'Detach_UE'
:
CiTestObj
.
DetachUE
(
HTML
,
RAN
,
EPC
,
COTS_UE
)
CiTestObj
.
DetachUE
(
HTML
,
RAN
,
EPC
,
COTS_UE
,
InfraUE
)
elif
action
==
'DataDisable_UE'
:
elif
action
==
'DataDisable_UE'
:
CiTestObj
.
DataDisableUE
(
HTML
)
CiTestObj
.
DataDisableUE
(
HTML
)
elif
action
==
'DataEnable_UE'
:
elif
action
==
'DataEnable_UE'
:
...
...
ci-scripts/xml_files/fr1_nsa_quectel.xml
View file @
b6daabc2
...
@@ -29,7 +29,7 @@
...
@@ -29,7 +29,7 @@
040000
040000
000001
000001
010000
010000
00000
1
00000
2
050000
050000
050001
050001
000001
000001
...
@@ -37,6 +37,8 @@
...
@@ -37,6 +37,8 @@
000001
000001
070001
070001
000001
000001
010002
000001
080001
080001
080000
080000
...
@@ -46,14 +48,14 @@
...
@@ -46,14 +48,14 @@
<testCase
id=
"010000"
>
<testCase
id=
"010000"
>
<class>
Initialize_UE
</class>
<class>
Initialize_UE
</class>
<desc>
Initialize Quectel
</desc>
<desc>
Initialize Quectel
</desc>
<id>
idefix
</id>
<id>
idefix
</id>
</testCase>
</testCase>
<testCase
id=
"010002"
>
<testCase
id=
"010002"
>
<class>
Detach_UE
</class>
<class>
Detach_UE
</class>
<desc>
Detach UE
</desc>
<desc>
Detach UE
</desc>
<id>
idefix
</id>
<id>
idefix
</id>
</testCase>
</testCase>
...
@@ -64,13 +66,13 @@
...
@@ -64,13 +66,13 @@
<eNB_instance>
0
</eNB_instance>
<eNB_instance>
0
</eNB_instance>
<eNB_serverId>
0
</eNB_serverId>
<eNB_serverId>
0
</eNB_serverId>
<air_interface>
lte
</air_interface>
<air_interface>
lte
</air_interface>
</testCase>
</testCase>
<testCase
id=
"040000"
>
<testCase
id=
"040000"
>
<class>
Initialize_eNB
</class>
<class>
Initialize_eNB
</class>
<desc>
Initialize gNB
</desc>
<desc>
Initialize gNB
</desc>
<Initialize_eNB_args>
-O ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrp
b210.conf -E
</Initialize_eNB_args>
<Initialize_eNB_args>
-O ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrp
n310.conf -q
</Initialize_eNB_args>
<eNB_instance>
1
</eNB_instance>
<eNB_instance>
1
</eNB_instance>
<eNB_serverId>
1
</eNB_serverId>
<eNB_serverId>
1
</eNB_serverId>
<air_interface>
nr
</air_interface>
<air_interface>
nr
</air_interface>
...
@@ -79,9 +81,16 @@
...
@@ -79,9 +81,16 @@
<testCase
id=
"000001"
>
<testCase
id=
"000001"
>
<class>
IdleSleep
</class>
<class>
IdleSleep
</class>
<desc>
Sleep
</desc>
<desc>
Sleep
</desc>
<idle_sleep_time_in_sec>
10
</idle_sleep_time_in_sec>
<idle_sleep_time_in_sec>
5
</idle_sleep_time_in_sec>
</testCase>
</testCase>
<testCase
id=
"000002"
>
<class>
IdleSleep
</class>
<desc>
Sleep
</desc>
<idle_sleep_time_in_sec>
30
</idle_sleep_time_in_sec>
</testCase>
<testCase
id=
"050000"
>
<testCase
id=
"050000"
>
<class>
Ping
</class>
<class>
Ping
</class>
<desc>
Ping: 20pings in 20sec
</desc>
<desc>
Ping: 20pings in 20sec
</desc>
...
@@ -98,25 +107,25 @@
...
@@ -98,25 +107,25 @@
<ping_packetloss_threshold>
50
</ping_packetloss_threshold>
<ping_packetloss_threshold>
50
</ping_packetloss_threshold>
</testCase>
</testCase>
<testCase
id=
"070000"
>
<testCase
id=
"070000"
>
<class>
Iperf
</class>
<class>
Iperf
</class>
<desc>
iperf (DL/20Mbps/UDP)(20 sec)(single-ue profile)
</desc>
<desc>
iperf (DL/20Mbps/UDP)(20 sec)(single-ue profile)
</desc>
<iperf_args>
-u -b 20M -t 20 -i 1
</iperf_args>
<iperf_args>
-u -b 20M -t 20 -i 1
</iperf_args>
<direction>
DL
</direction>
<direction>
DL
</direction>
<id>
idefix
</id>
<id>
idefix
</id>
<iperf_packetloss_threshold>
50
</iperf_packetloss_threshold>
<iperf_packetloss_threshold>
50
</iperf_packetloss_threshold>
<iperf_profile>
single-ue
</iperf_profile>
<iperf_profile>
single-ue
</iperf_profile>
</testCase>
</testCase>
<testCase
id=
"070001"
>
<testCase
id=
"070001"
>
<class>
Iperf
</class>
<class>
Iperf
</class>
<desc>
iperf (UL/3Mbps/UDP)(20 sec)(single-ue profile)
</desc>
<desc>
iperf (UL/3Mbps/UDP)(20 sec)(single-ue profile)
</desc>
<iperf_args>
-u -b 3M -t 20 -i 1
</iperf_args>
<iperf_args>
-u -b 3M -t 20 -i 1
</iperf_args>
<direction>
UL
</direction>
<direction>
UL
</direction>
<id>
idefix
</id>
<id>
idefix
</id>
<iperf_packetloss_threshold>
50
</iperf_packetloss_threshold>
<iperf_packetloss_threshold>
50
</iperf_packetloss_threshold>
<iperf_profile>
single-ue
</iperf_profile>
<iperf_profile>
single-ue
</iperf_profile>
</testCase>
</testCase>
<testCase
id=
"080000"
>
<testCase
id=
"080000"
>
...
...
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