Merge remote-tracking branch 'develop'
This commit is contained in:
@@ -34,7 +34,7 @@
|
|||||||
import sys # arg
|
import sys # arg
|
||||||
import re # reg
|
import re # reg
|
||||||
import yaml
|
import yaml
|
||||||
|
import constants as CONST
|
||||||
|
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
# Parsing Command Line Arguements
|
# Parsing Command Line Arguements
|
||||||
|
|||||||
+83
-33
@@ -27,61 +27,111 @@
|
|||||||
# pexpect
|
# pexpect
|
||||||
#---------------------------------------------------------------------
|
#---------------------------------------------------------------------
|
||||||
|
|
||||||
|
#to use isfile
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
#to use logging.info()
|
#to use logging.info()
|
||||||
import logging
|
import logging
|
||||||
#to create a SSH object locally in the methods
|
#to create a SSH object locally in the methods
|
||||||
import sshconnection
|
import sshconnection
|
||||||
#time.sleep
|
#time.sleep
|
||||||
import time
|
import time
|
||||||
|
#to load cots_ue dictionary
|
||||||
|
import yaml
|
||||||
|
|
||||||
class CotsUe:
|
class CotsUe:
|
||||||
def __init__(self,model,UEIPAddr,UEUserName,UEPassWord):
|
def __init__(self,ADBIPAddr,ADBUserName,ADBPassWord):
|
||||||
self.model = model
|
self.cots_id = '' #cots id from yaml oppo, s10 etc...
|
||||||
self.UEIPAddr = UEIPAddr
|
self.ADBIPAddr = ADBIPAddr
|
||||||
self.UEUserName = UEUserName
|
self.ADBUserName = ADBUserName
|
||||||
self.UEPassWord = UEPassWord
|
self.ADBPassWord = ADBPassWord
|
||||||
self.runargs = '' #on of off to toggle airplane mode on/off
|
self.cots_run_mode = '' #on of off to toggle airplane mode on/off
|
||||||
|
self.__cots_cde_dict_file = 'cots_ue_ctl.yaml'
|
||||||
self.__SetAirplaneRetry = 3
|
self.__SetAirplaneRetry = 3
|
||||||
|
|
||||||
|
|
||||||
#-----------------$
|
#-----------------$
|
||||||
#PUBLIC Methods$
|
#PUBLIC Methods$
|
||||||
#-----------------$
|
#-----------------$
|
||||||
|
|
||||||
def Check_Airplane(self):
|
def Check_Airplane(self):
|
||||||
mySSH = sshconnection.SSHConnection()
|
mySSH = sshconnection.SSHConnection()
|
||||||
mySSH.open(self.UEIPAddr, self.UEUserName, self.UEPassWord)
|
mySSH.open(self.ADBIPAddr, self.ADBUserName, self.ADBPassWord)
|
||||||
status=mySSH.cde_check_value('sudo adb shell settings get global airplane_mode_on ', ['0','1'],5)
|
status=mySSH.cde_check_value('adb shell settings get global airplane_mode_on ', ['0','1'],5)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
return status
|
return status
|
||||||
|
|
||||||
|
#simply check if the device id exists in the dictionary
|
||||||
def Set_Airplane(self,target_state_str):
|
#returns true if it exists, false otherwise
|
||||||
mySSH = sshconnection.SSHConnection()
|
def Check_Exists(self,target_id):
|
||||||
mySSH.open(self.UEIPAddr, self.UEUserName, self.UEPassWord)
|
#load cots commands dictionary
|
||||||
mySSH.command('sudo adb start-server','$',5)
|
if (os.path.isfile(self.__cots_cde_dict_file)):
|
||||||
logging.info("Toggling COTS UE Airplane mode to : "+target_state_str)
|
yaml_file=self.__cots_cde_dict_file
|
||||||
current_state = self.Check_Airplane()
|
elif (os.path.isfile('ci-scripts/'+self.__cots_cde_dict_file)):
|
||||||
if target_state_str.lower()=="on":
|
yaml_file='ci-scripts/'+self.__cots_cde_dict_file
|
||||||
target_state=1
|
|
||||||
else:
|
else:
|
||||||
target_state=0
|
logging.error("COTS UE dictionary yaml file cannot be found")
|
||||||
if current_state != target_state:
|
sys.exit("COTS UE dictionary yaml file cannot be found")
|
||||||
#toggle state
|
|
||||||
retry = 0
|
#load cots commands dictionary
|
||||||
while (current_state!=target_state) and (retry < self.__SetAirplaneRetry):
|
with open(yaml_file,'r') as file:
|
||||||
mySSH.command('sudo adb shell am start -a android.settings.AIRPLANE_MODE_SETTINGS', '\$', 5)
|
cots_ue_ctl = yaml.load(file,Loader=yaml.FullLoader)
|
||||||
mySSH.command('sudo adb shell input keyevent 20', '\$', 5)
|
#check if ue id is in the dictionary
|
||||||
mySSH.command('sudo adb shell input tap 968 324', '\$', 5)
|
if target_id in cots_ue_ctl:
|
||||||
time.sleep(1)
|
return True
|
||||||
current_state = self.Check_Airplane()
|
else:
|
||||||
retry+=1
|
return False
|
||||||
|
|
||||||
|
def Set_Airplane(self, target_id, target_state_str):
|
||||||
|
#loading cots commands dictionary
|
||||||
|
|
||||||
|
if (os.path.isfile(self.__cots_cde_dict_file)):
|
||||||
|
yaml_file=self.__cots_cde_dict_file
|
||||||
|
elif (os.path.isfile('ci-scripts/'+self.__cots_cde_dict_file)):
|
||||||
|
yaml_file='ci-scripts/'+self.__cots_cde_dict_file
|
||||||
|
else:
|
||||||
|
logging.error("COTS UE dictionary yaml file cannot be found")
|
||||||
|
sys.exit("COTS UE dictionary yaml file cannot be found")
|
||||||
|
|
||||||
|
#load cots commands dictionary
|
||||||
|
with open(yaml_file,'r') as file:
|
||||||
|
cots_ue_ctl = yaml.load(file,Loader=yaml.FullLoader)
|
||||||
|
#check if ue id is in the dictionary
|
||||||
|
if target_id in cots_ue_ctl:
|
||||||
|
mySSH = sshconnection.SSHConnection()
|
||||||
|
mySSH.open(self.ADBIPAddr, self.ADBUserName, self.ADBPassWord)
|
||||||
|
logging.info(str(self.ADBIPAddr)+' '+str(self.ADBUserName)+' '+str(self.ADBPassWord))
|
||||||
|
mySSH.command('adb start-server','\$',5)
|
||||||
|
mySSH.command('adb devices','\$',5)
|
||||||
|
logging.info("Toggling COTS UE Airplane mode to : "+target_state_str)
|
||||||
|
#get current state
|
||||||
|
current_state = self.Check_Airplane()
|
||||||
|
if target_state_str.lower()=="on":
|
||||||
|
target_state=1
|
||||||
|
else:
|
||||||
|
target_state=0
|
||||||
if current_state != target_state:
|
if current_state != target_state:
|
||||||
logging.error("ATTENTION : Could not toggle to : "+target_state_str)
|
#toggle state
|
||||||
logging.error("Current state is : "+ str(current_state))
|
retry = 0
|
||||||
|
while (current_state!=target_state) and (retry < self.__SetAirplaneRetry):
|
||||||
|
#loop over the command list from dictionary for the selected ue, to switch to required state
|
||||||
|
for i in range (0,len(cots_ue_ctl[target_id])):
|
||||||
|
mySSH.command(cots_ue_ctl[target_id][i], '\$', 5)
|
||||||
|
time.sleep(1)
|
||||||
|
current_state = self.Check_Airplane()
|
||||||
|
retry+=1
|
||||||
|
#could not toggle despite the retry
|
||||||
|
if current_state != target_state:
|
||||||
|
logging.error("ATTENTION : Could not toggle to : "+target_state_str)
|
||||||
|
logging.error("Current state is : "+ str(current_state))
|
||||||
|
else:
|
||||||
|
logging.info("Airplane mode is already "+ target_state_str)
|
||||||
|
mySSH.command('adb kill-server','\$',5)
|
||||||
|
mySSH.close()
|
||||||
|
#ue id is NOT in the dictionary
|
||||||
else:
|
else:
|
||||||
print("Airplane mode is already "+ target_state_str)
|
logging.error("COTS UE Id from XML could not be found in UE YAML dictionary " + self.__cots_cde_dict_file)
|
||||||
mySSH.command('sudo adb kill-server','$',5)
|
sys.exit("COTS UE Id from XML could not be found in UE YAML dictionary " + self.__cots_cde_dict_file)
|
||||||
mySSH.close()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
9d690a12: #oppo
|
||||||
|
- adb shell input keyevent KEYCODE_POWER
|
||||||
|
- adb shell input swipe 300 700 300 0
|
||||||
|
- adb shell am start -a android.settings.AIRPLANE_MODE_SETTINGS
|
||||||
|
- adb shell input keyevent 20
|
||||||
|
- adb shell input tap 968 324
|
||||||
|
002: #s10
|
||||||
|
- adb shell input keyevent KEYCODE_POWER
|
||||||
|
- adb shell input swipe 200 900 200 300
|
||||||
|
- adb shell am start -a android.settings.AIRPLANE_MODE_SETTINGS
|
||||||
|
- adb shell input tap 968 324
|
||||||
|
003: #s20
|
||||||
|
- adb shell input keyevent KEYCODE_POWER
|
||||||
|
- adb shell input swipe 200 900 200 300
|
||||||
|
- adb shell am start -a android.settings.AIRPLANE_MODE_SETTINGS
|
||||||
|
- adb shell input tap 968 324
|
||||||
|
004: #xperia
|
||||||
|
- tbd
|
||||||
|
- tbd
|
||||||
|
- tbd
|
||||||
+90
-48
@@ -285,21 +285,29 @@ class OaiCiTest():
|
|||||||
SSH.command('ssh ' + self.UEDevicesRemoteUser[idx] + '@' + self.UEDevicesRemoteServer[idx] + ' ' + self.UEDevicesOffCmd[idx], '\$', 60)
|
SSH.command('ssh ' + self.UEDevicesRemoteUser[idx] + '@' + self.UEDevicesRemoteServer[idx] + ' ' + self.UEDevicesOffCmd[idx], '\$', 60)
|
||||||
SSH.close()
|
SSH.close()
|
||||||
return
|
return
|
||||||
# enable data service
|
|
||||||
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell "svc data enable"', '\$', 60)
|
|
||||||
|
|
||||||
# The following commands are deprecated since we no longer work on Android 7+
|
#RH quick add-on to integrate cots control defined by yaml
|
||||||
# SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell settings put global airplane_mode_on 1', '\$', 10)
|
#if device_id exists in yaml dictionary, we execute the new procedure defined in cots_ue class
|
||||||
# SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true', '\$', 60)
|
#otherwise we use the legacy procedure
|
||||||
# a dedicated script has to be installed inside the UE
|
if COTS_UE.Check_Exists(device_id):
|
||||||
# airplane mode on means call /data/local/tmp/off
|
#switch device to Airplane mode ON (ie Radio OFF)
|
||||||
if device_id == '84B7N16418004022':
|
COTS_UE.Set_Airplane(device_id, 'ON')
|
||||||
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell "su - root -c /data/local/tmp/off"', '\$', 60)
|
|
||||||
else:
|
else:
|
||||||
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/off', '\$', 60)
|
# enable data service
|
||||||
#airplane mode off means call /data/local/tmp/on
|
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell "svc data enable"', '\$', 60)
|
||||||
logging.debug('\u001B[1mUE (' + device_id + ') Initialize Completed\u001B[0m')
|
|
||||||
SSH.close()
|
# The following commands are deprecated since we no longer work on Android 7+
|
||||||
|
# SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell settings put global airplane_mode_on 1', '\$', 10)
|
||||||
|
# SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true', '\$', 60)
|
||||||
|
# a dedicated script has to be installed inside the UE
|
||||||
|
# airplane mode on means call /data/local/tmp/off
|
||||||
|
if device_id == '84B7N16418004022':
|
||||||
|
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell "su - root -c /data/local/tmp/off"', '\$', 60)
|
||||||
|
else:
|
||||||
|
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/off', '\$', 60)
|
||||||
|
#airplane mode off means call /data/local/tmp/on
|
||||||
|
logging.debug('\u001B[1mUE (' + device_id + ') Initialize Completed\u001B[0m')
|
||||||
|
SSH.close()
|
||||||
except:
|
except:
|
||||||
os.kill(os.getppid(),signal.SIGUSR1)
|
os.kill(os.getppid(),signal.SIGUSR1)
|
||||||
|
|
||||||
@@ -790,7 +798,13 @@ class OaiCiTest():
|
|||||||
try:
|
try:
|
||||||
SSH.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword)
|
SSH.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword)
|
||||||
if self.ADBCentralized:
|
if self.ADBCentralized:
|
||||||
if device_id == '84B7N16418004022':
|
#RH quick add on to integrate cots control defined by yaml
|
||||||
|
#if device Id exists in yaml dictionary, we execute the new procedure defined in cots_ue class
|
||||||
|
#otherwise we use the legacy procedure
|
||||||
|
if COTS_UE.Check_Exists(device_id):
|
||||||
|
#switch device to Airplane mode OFF (ie Radio ON)
|
||||||
|
COTS_UE.Set_Airplane(device_id, 'OFF')
|
||||||
|
elif device_id == '84B7N16418004022':
|
||||||
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell "su - root -c /data/local/tmp/on"', '\$', 60)
|
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell "su - root -c /data/local/tmp/on"', '\$', 60)
|
||||||
else:
|
else:
|
||||||
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/on', '\$', 60)
|
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/on', '\$', 60)
|
||||||
@@ -827,7 +841,13 @@ class OaiCiTest():
|
|||||||
if count == 15 or count == 30:
|
if count == 15 or count == 30:
|
||||||
logging.debug('\u001B[1;30;43m Retry UE (' + device_id + ') Flight Mode Off \u001B[0m')
|
logging.debug('\u001B[1;30;43m Retry UE (' + device_id + ') Flight Mode Off \u001B[0m')
|
||||||
if self.ADBCentralized:
|
if self.ADBCentralized:
|
||||||
if device_id == '84B7N16418004022':
|
#RH quick add on to intgrate cots control defined by yaml
|
||||||
|
#if device id exists in yaml dictionary, we execute the new procedure defined in cots_ue class
|
||||||
|
#otherwise we use the legacy procedure
|
||||||
|
if COTS_UE.Check_Exists(device_id):
|
||||||
|
#switch device to Airplane mode ON (ie Radio OFF)
|
||||||
|
COTS_UE.Set_Airplane(device_id, 'ON')
|
||||||
|
elif device_id == '84B7N16418004022':
|
||||||
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell "su - root -c /data/local/tmp/off"', '\$', 60)
|
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell "su - root -c /data/local/tmp/off"', '\$', 60)
|
||||||
else:
|
else:
|
||||||
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/off', '\$', 60)
|
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/off', '\$', 60)
|
||||||
@@ -835,7 +855,13 @@ class OaiCiTest():
|
|||||||
SSH.command('ssh ' + self.UEDevicesRemoteUser[idx] + '@' + self.UEDevicesRemoteServer[idx] + ' ' + self.UEDevicesOffCmd[idx], '\$', 60)
|
SSH.command('ssh ' + self.UEDevicesRemoteUser[idx] + '@' + self.UEDevicesRemoteServer[idx] + ' ' + self.UEDevicesOffCmd[idx], '\$', 60)
|
||||||
time.sleep(0.5)
|
time.sleep(0.5)
|
||||||
if self.ADBCentralized:
|
if self.ADBCentralized:
|
||||||
if device_id == '84B7N16418004022':
|
#RH quick add on to integrate cots control defined by yaml
|
||||||
|
#if device id exists in yaml dictionary, we execute the new procedre defined incots_ue class
|
||||||
|
#otherwise we use the legacy procedure
|
||||||
|
if COTS_UE.Check_Exists(device_id):
|
||||||
|
#switch device to Airplane mode OFF (ie Radio ON)
|
||||||
|
COTS_UE.Set_Airplane(device_id, 'OFF')
|
||||||
|
elif device_id == '84B7N16418004022':
|
||||||
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell "su - root -c /data/local/tmp/on"', '\$', 60)
|
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell "su - root -c /data/local/tmp/on"', '\$', 60)
|
||||||
else:
|
else:
|
||||||
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/on', '\$', 60)
|
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/on', '\$', 60)
|
||||||
@@ -918,7 +944,13 @@ class OaiCiTest():
|
|||||||
try:
|
try:
|
||||||
SSH.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword)
|
SSH.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword)
|
||||||
if self.ADBCentralized:
|
if self.ADBCentralized:
|
||||||
if device_id == '84B7N16418004022':
|
#RH quick add on to integrate cots control defined by yaml
|
||||||
|
#if device id exists in yaml dictionary, we execute the new procedure defined in cots_ue class
|
||||||
|
#otherwise we use the legacy procedure
|
||||||
|
if COTS_UE.Check_Exists(device_id):
|
||||||
|
#switch device to Airplane mode ON (ie Radio OFF)
|
||||||
|
COTS_UE.Set_Airplane(device_id,'ON')
|
||||||
|
elif device_id == '84B7N16418004022':
|
||||||
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell "su - root -c /data/local/tmp/off"', '\$', 60)
|
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell "su - root -c /data/local/tmp/off"', '\$', 60)
|
||||||
else:
|
else:
|
||||||
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/off', '\$', 60)
|
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/off', '\$', 60)
|
||||||
@@ -2697,7 +2729,13 @@ class OaiCiTest():
|
|||||||
SSH.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword)
|
SSH.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword)
|
||||||
# back in airplane mode on (ie radio off)
|
# back in airplane mode on (ie radio off)
|
||||||
if self.ADBCentralized:
|
if self.ADBCentralized:
|
||||||
if device_id == '84B7N16418004022':
|
#RH quick add on to intgrate cots control defined by yaml
|
||||||
|
#if device Id exists in yaml dictionary, we execute the new procedure defined in cots_ue class
|
||||||
|
#otherwise we use the legacy procedure
|
||||||
|
if COTS_UE.Check_Exists(device_id):
|
||||||
|
#switch device to Airplane mode ON (ie Radio OFF)
|
||||||
|
COTS_UE.Set_Airplane(device_id, 'ON')
|
||||||
|
elif device_id == '84B7N16418004022':
|
||||||
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell "su - root -c /data/local/tmp/off"', '\$', 60)
|
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell "su - root -c /data/local/tmp/off"', '\$', 60)
|
||||||
else:
|
else:
|
||||||
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/off', '\$', 60)
|
SSH.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/off', '\$', 60)
|
||||||
@@ -3133,7 +3171,7 @@ def GetParametersFromXML(action):
|
|||||||
else:
|
else:
|
||||||
RAN.backgroundBuild=False
|
RAN.backgroundBuild=False
|
||||||
|
|
||||||
if action == 'WaitEndBuild_eNB':
|
elif action == 'WaitEndBuild_eNB':
|
||||||
RAN.Build_eNB_args=test.findtext('Build_eNB_args')
|
RAN.Build_eNB_args=test.findtext('Build_eNB_args')
|
||||||
eNB_instance=test.findtext('eNB_instance')
|
eNB_instance=test.findtext('eNB_instance')
|
||||||
if (eNB_instance is None):
|
if (eNB_instance is None):
|
||||||
@@ -3144,7 +3182,7 @@ def GetParametersFromXML(action):
|
|||||||
if (RAN.eNB_serverId is None):
|
if (RAN.eNB_serverId is None):
|
||||||
RAN.eNB_serverId='0'
|
RAN.eNB_serverId='0'
|
||||||
|
|
||||||
if action == 'Initialize_eNB':
|
elif action == 'Initialize_eNB':
|
||||||
RAN.Initialize_eNB_args=test.findtext('Initialize_eNB_args')
|
RAN.Initialize_eNB_args=test.findtext('Initialize_eNB_args')
|
||||||
eNB_instance=test.findtext('eNB_instance')
|
eNB_instance=test.findtext('eNB_instance')
|
||||||
if (eNB_instance is None):
|
if (eNB_instance is None):
|
||||||
@@ -3164,7 +3202,7 @@ def GetParametersFromXML(action):
|
|||||||
else :
|
else :
|
||||||
RAN.air_interface[RAN.eNB_instance] = 'ocp-enb'
|
RAN.air_interface[RAN.eNB_instance] = 'ocp-enb'
|
||||||
|
|
||||||
if action == 'Terminate_eNB':
|
elif action == 'Terminate_eNB':
|
||||||
eNB_instance=test.findtext('eNB_instance')
|
eNB_instance=test.findtext('eNB_instance')
|
||||||
if (eNB_instance is None):
|
if (eNB_instance is None):
|
||||||
RAN.eNB_instance=0
|
RAN.eNB_instance=0
|
||||||
@@ -3183,21 +3221,21 @@ def GetParametersFromXML(action):
|
|||||||
else :
|
else :
|
||||||
RAN.air_interface[RAN.eNB_instance] = 'ocp-enb'
|
RAN.air_interface[RAN.eNB_instance] = 'ocp-enb'
|
||||||
|
|
||||||
if action == 'Attach_UE':
|
elif action == 'Attach_UE':
|
||||||
nbMaxUEtoAttach = test.findtext('nbMaxUEtoAttach')
|
nbMaxUEtoAttach = test.findtext('nbMaxUEtoAttach')
|
||||||
if (nbMaxUEtoAttach is None):
|
if (nbMaxUEtoAttach is None):
|
||||||
CiTestObj.nbMaxUEtoAttach = -1
|
CiTestObj.nbMaxUEtoAttach = -1
|
||||||
else:
|
else:
|
||||||
CiTestObj.nbMaxUEtoAttach = int(nbMaxUEtoAttach)
|
CiTestObj.nbMaxUEtoAttach = int(nbMaxUEtoAttach)
|
||||||
|
|
||||||
if action == 'CheckStatusUE':
|
elif action == 'CheckStatusUE':
|
||||||
expectedNBUE = test.findtext('expectedNbOfConnectedUEs')
|
expectedNBUE = test.findtext('expectedNbOfConnectedUEs')
|
||||||
if (expectedNBUE is None):
|
if (expectedNBUE is None):
|
||||||
CiTestObj.expectedNbOfConnectedUEs = -1
|
CiTestObj.expectedNbOfConnectedUEs = -1
|
||||||
else:
|
else:
|
||||||
CiTestObj.expectedNbOfConnectedUEs = int(expectedNBUE)
|
CiTestObj.expectedNbOfConnectedUEs = int(expectedNBUE)
|
||||||
|
|
||||||
if action == 'Build_OAI_UE':
|
elif action == 'Build_OAI_UE':
|
||||||
CiTestObj.Build_OAI_UE_args = test.findtext('Build_OAI_UE_args')
|
CiTestObj.Build_OAI_UE_args = test.findtext('Build_OAI_UE_args')
|
||||||
CiTestObj.clean_repository = test.findtext('clean_repository')
|
CiTestObj.clean_repository = test.findtext('clean_repository')
|
||||||
if (CiTestObj.clean_repository == 'false'):
|
if (CiTestObj.clean_repository == 'false'):
|
||||||
@@ -3205,7 +3243,7 @@ def GetParametersFromXML(action):
|
|||||||
else:
|
else:
|
||||||
CiTestObj.clean_repository = True
|
CiTestObj.clean_repository = True
|
||||||
|
|
||||||
if action == 'Initialize_OAI_UE':
|
elif action == 'Initialize_OAI_UE':
|
||||||
CiTestObj.Initialize_OAI_UE_args = test.findtext('Initialize_OAI_UE_args')
|
CiTestObj.Initialize_OAI_UE_args = test.findtext('Initialize_OAI_UE_args')
|
||||||
UE_instance = test.findtext('UE_instance')
|
UE_instance = test.findtext('UE_instance')
|
||||||
if (UE_instance is None):
|
if (UE_instance is None):
|
||||||
@@ -3223,7 +3261,7 @@ def GetParametersFromXML(action):
|
|||||||
#CiTestObj.air_interface = 'ocp-enb'
|
#CiTestObj.air_interface = 'ocp-enb'
|
||||||
logging.error('OCP UE -- NOT SUPPORTED')
|
logging.error('OCP UE -- NOT SUPPORTED')
|
||||||
|
|
||||||
if action == 'Terminate_OAI_UE':
|
elif action == 'Terminate_OAI_UE':
|
||||||
UE_instance=test.findtext('UE_instance')
|
UE_instance=test.findtext('UE_instance')
|
||||||
if (UE_instance is None):
|
if (UE_instance is None):
|
||||||
CiTestObj.UE_instance = '0'
|
CiTestObj.UE_instance = '0'
|
||||||
@@ -3240,11 +3278,11 @@ def GetParametersFromXML(action):
|
|||||||
#CiTestObj.air_interface = 'ocp-enb'
|
#CiTestObj.air_interface = 'ocp-enb'
|
||||||
logging.error('OCP UE -- NOT SUPPORTED')
|
logging.error('OCP UE -- NOT SUPPORTED')
|
||||||
|
|
||||||
if action == 'Ping' or action == 'Ping_CatM_module':
|
elif (action == 'Ping') or (action == 'Ping_CatM_module'):
|
||||||
CiTestObj.ping_args = test.findtext('ping_args')
|
CiTestObj.ping_args = test.findtext('ping_args')
|
||||||
CiTestObj.ping_packetloss_threshold = test.findtext('ping_packetloss_threshold')
|
CiTestObj.ping_packetloss_threshold = test.findtext('ping_packetloss_threshold')
|
||||||
|
|
||||||
if action == 'Iperf':
|
elif action == 'Iperf':
|
||||||
CiTestObj.iperf_args = test.findtext('iperf_args')
|
CiTestObj.iperf_args = test.findtext('iperf_args')
|
||||||
CiTestObj.iperf_packetloss_threshold = test.findtext('iperf_packetloss_threshold')
|
CiTestObj.iperf_packetloss_threshold = test.findtext('iperf_packetloss_threshold')
|
||||||
CiTestObj.iperf_profile = test.findtext('iperf_profile')
|
CiTestObj.iperf_profile = test.findtext('iperf_profile')
|
||||||
@@ -3262,14 +3300,14 @@ def GetParametersFromXML(action):
|
|||||||
logging.debug('ERROR: test-case has wrong option ' + CiTestObj.iperf_options)
|
logging.debug('ERROR: test-case has wrong option ' + CiTestObj.iperf_options)
|
||||||
CiTestObj.iperf_options = 'check'
|
CiTestObj.iperf_options = 'check'
|
||||||
|
|
||||||
if action == 'IdleSleep':
|
elif action == 'IdleSleep':
|
||||||
string_field = test.findtext('idle_sleep_time_in_sec')
|
string_field = test.findtext('idle_sleep_time_in_sec')
|
||||||
if (string_field is None):
|
if (string_field is None):
|
||||||
CiTestObj.idle_sleep_time = 5
|
CiTestObj.idle_sleep_time = 5
|
||||||
else:
|
else:
|
||||||
CiTestObj.idle_sleep_time = int(string_field)
|
CiTestObj.idle_sleep_time = int(string_field)
|
||||||
|
|
||||||
if action == 'Perform_X2_Handover':
|
elif action == 'Perform_X2_Handover':
|
||||||
string_field = test.findtext('x2_ho_options')
|
string_field = test.findtext('x2_ho_options')
|
||||||
if (string_field is None):
|
if (string_field is None):
|
||||||
CiTestObj.x2_ho_options = 'network'
|
CiTestObj.x2_ho_options = 'network'
|
||||||
@@ -3280,7 +3318,7 @@ def GetParametersFromXML(action):
|
|||||||
else:
|
else:
|
||||||
CiTestObj.x2_ho_options = string_field
|
CiTestObj.x2_ho_options = string_field
|
||||||
|
|
||||||
if action == 'Build_PhySim':
|
elif action == 'Build_PhySim':
|
||||||
ldpc.buildargs = test.findtext('physim_build_args')
|
ldpc.buildargs = test.findtext('physim_build_args')
|
||||||
forced_workspace_cleanup = test.findtext('forced_workspace_cleanup')
|
forced_workspace_cleanup = test.findtext('forced_workspace_cleanup')
|
||||||
if (forced_workspace_cleanup is None):
|
if (forced_workspace_cleanup is None):
|
||||||
@@ -3291,11 +3329,9 @@ def GetParametersFromXML(action):
|
|||||||
else:
|
else:
|
||||||
ldpc.forced_workspace_cleanup=False
|
ldpc.forced_workspace_cleanup=False
|
||||||
|
|
||||||
if action == 'Run_PhySim':
|
else: # ie action == 'Run_PhySim':
|
||||||
ldpc.runargs = test.findtext('physim_run_args')
|
ldpc.runargs = test.findtext('physim_run_args')
|
||||||
|
|
||||||
if action == 'COTS_UE_Airplane':
|
|
||||||
COTS_UE.runargs = test.findtext('cots_ue_airplane_args')
|
|
||||||
|
|
||||||
#check if given test is in list
|
#check if given test is in list
|
||||||
#it is in list if one of the strings in 'list' is at the beginning of 'test'
|
#it is in list if one of the strings in 'list' is at the beginning of 'test'
|
||||||
@@ -3320,15 +3356,21 @@ def receive_signal(signum, frame):
|
|||||||
|
|
||||||
#loading xml action list from yaml
|
#loading xml action list from yaml
|
||||||
import yaml
|
import yaml
|
||||||
xml_class_list_file=''
|
xml_class_list_file='xml_class_list.yml'
|
||||||
if (os.path.isfile('xml_class_list.yml')):
|
if (os.path.isfile(xml_class_list_file)):
|
||||||
xml_class_list_file='xml_class_list.yml'
|
yaml_file=xml_class_list_file
|
||||||
if (os.path.isfile('ci-scripts/xml_class_list.yml')):
|
elif (os.path.isfile('ci-scripts/'+xml_class_list_file)):
|
||||||
xml_class_list_file='ci-scripts/xml_class_list.yml'
|
yaml_file='ci-scripts/'+xml_class_list_file
|
||||||
with open(xml_class_list_file,'r') as file:
|
else:
|
||||||
# The FullLoader parameter handles the conversion from YAML
|
logging.error("XML action list yaml file cannot be found")
|
||||||
# scalar values to Python the dictionary format
|
sys.exit("XML action list yaml file cannot be found")
|
||||||
xml_class_list = yaml.load(file,Loader=yaml.FullLoader)
|
|
||||||
|
with open(yaml_file,'r') as f:
|
||||||
|
# The FullLoader parameter handles the conversion-$
|
||||||
|
#from YAML scalar values to Python dictionary format$
|
||||||
|
xml_class_list = yaml.load(f,Loader=yaml.FullLoader)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
mode = ''
|
mode = ''
|
||||||
|
|
||||||
@@ -3375,8 +3417,9 @@ if py_param_file_present == True:
|
|||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
# COTS UE instanciation
|
# COTS UE instanciation
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
#COTS_UE instanciation can only be done here for the moment, due to code architecture
|
#COTS_UE instanciation and ADB server init
|
||||||
COTS_UE=cls_cots_ue.CotsUe('oppo', CiTestObj.UEIPAddress, CiTestObj.UEUserName,CiTestObj.UEPassword)
|
#ue id and ue mode are retrieved from xml
|
||||||
|
COTS_UE=cls_cots_ue.CotsUe(CiTestObj.ADBIPAddress, CiTestObj.ADBUserName,CiTestObj.ADBPassword)
|
||||||
|
|
||||||
|
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
@@ -3613,7 +3656,8 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
|||||||
GetParametersFromXML(action)
|
GetParametersFromXML(action)
|
||||||
if action == 'Initialize_UE' or action == 'Attach_UE' or action == 'Detach_UE' or action == 'Ping' or action == 'Iperf' or action == 'Reboot_UE' or action == 'DataDisable_UE' or action == 'DataEnable_UE' or action == 'CheckStatusUE':
|
if action == 'Initialize_UE' or action == 'Attach_UE' or action == 'Detach_UE' or action == 'Ping' or action == 'Iperf' or action == 'Reboot_UE' or action == 'DataDisable_UE' or action == 'DataEnable_UE' or action == 'CheckStatusUE':
|
||||||
if (CiTestObj.ADBIPAddress != 'none'):
|
if (CiTestObj.ADBIPAddress != 'none'):
|
||||||
terminate_ue_flag = False
|
#in these cases, having no devices is critical, GetAllUEDevices function has to manage it as a critical error, reason why terminate_ue_flag is set to True
|
||||||
|
terminate_ue_flag = True
|
||||||
CiTestObj.GetAllUEDevices(terminate_ue_flag)
|
CiTestObj.GetAllUEDevices(terminate_ue_flag)
|
||||||
if action == 'Build_eNB':
|
if action == 'Build_eNB':
|
||||||
RAN.BuildeNB()
|
RAN.BuildeNB()
|
||||||
@@ -3688,8 +3732,6 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
|||||||
if ldpc.exitStatus==1:sys.exit()
|
if ldpc.exitStatus==1:sys.exit()
|
||||||
elif action == 'Run_PhySim':
|
elif action == 'Run_PhySim':
|
||||||
HTML=ldpc.Run_PhySim(HTML,CONST,id)
|
HTML=ldpc.Run_PhySim(HTML,CONST,id)
|
||||||
elif action == 'COTS_UE_Airplane':
|
|
||||||
COTS_UE.Set_Airplane(COTS_UE.runargs)
|
|
||||||
else:
|
else:
|
||||||
sys.exit('Invalid class (action) from xml')
|
sys.exit('Invalid class (action) from xml')
|
||||||
CiTestObj.FailReportCnt += 1
|
CiTestObj.FailReportCnt += 1
|
||||||
|
|||||||
+18
-12
@@ -90,6 +90,7 @@ class RANManagement():
|
|||||||
self.epcPcapFile = ''
|
self.epcPcapFile = ''
|
||||||
self.htmlObj = None
|
self.htmlObj = None
|
||||||
self.epcObj = None
|
self.epcObj = None
|
||||||
|
self.runtime_stats= ''
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -614,7 +615,7 @@ class RANManagement():
|
|||||||
logging.debug('\u001B[1m Analyzing eNB replay logfile \u001B[0m')
|
logging.debug('\u001B[1m Analyzing eNB replay logfile \u001B[0m')
|
||||||
logStatus = self.AnalyzeLogFile_eNB(extracted_log_file)
|
logStatus = self.AnalyzeLogFile_eNB(extracted_log_file)
|
||||||
if self.htmlObj is not None:
|
if self.htmlObj is not None:
|
||||||
self.htmlObj.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
self.htmlObj.CreateHtmlTestRow(self.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
self.eNBLogFiles[int(self.eNB_instance)] = ''
|
self.eNBLogFiles[int(self.eNB_instance)] = ''
|
||||||
else:
|
else:
|
||||||
analyzeFile = False
|
analyzeFile = False
|
||||||
@@ -643,10 +644,10 @@ class RANManagement():
|
|||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
if self.htmlObj is not None:
|
if self.htmlObj is not None:
|
||||||
self.htmlObj.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
self.htmlObj.CreateHtmlTestRow(self.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
else:
|
else:
|
||||||
if self.htmlObj is not None:
|
if self.htmlObj is not None:
|
||||||
self.htmlObj.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
self.htmlObj.CreateHtmlTestRow(self.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
self.eNBmbmsEnables[int(self.eNB_instance)] = False
|
self.eNBmbmsEnables[int(self.eNB_instance)] = False
|
||||||
self.eNBstatuses[int(self.eNB_instance)] = -1
|
self.eNBstatuses[int(self.eNB_instance)] = -1
|
||||||
|
|
||||||
@@ -712,16 +713,20 @@ class RANManagement():
|
|||||||
if runTime != '':
|
if runTime != '':
|
||||||
result = re.search('Time executing user inst', str(line))
|
result = re.search('Time executing user inst', str(line))
|
||||||
if result is not None:
|
if result is not None:
|
||||||
userTime = 'to be decoded - 1'
|
fields=line.split(':')
|
||||||
|
userTime = 'userTime : ' + fields[1].replace('\n','')
|
||||||
result = re.search('Time executing system inst', str(line))
|
result = re.search('Time executing system inst', str(line))
|
||||||
if result is not None:
|
if result is not None:
|
||||||
systemTime = 'to be decoded - 2'
|
fields=line.split(':')
|
||||||
|
systemTime = 'systemTime : ' + fields[1].replace('\n','')
|
||||||
result = re.search('Max. Phy. memory usage:', str(line))
|
result = re.search('Max. Phy. memory usage:', str(line))
|
||||||
if result is not None:
|
if result is not None:
|
||||||
maxPhyMemUsage = 'to be decoded - 3'
|
fields=line.split(':')
|
||||||
|
maxPhyMemUsage = 'maxPhyMemUsage : ' + fields[1].replace('\n','')
|
||||||
result = re.search('Number of context switch.*process origin', str(line))
|
result = re.search('Number of context switch.*process origin', str(line))
|
||||||
if result is not None:
|
if result is not None:
|
||||||
nbContextSwitches = 'to be decoded - 4'
|
fields=line.split(':')
|
||||||
|
nbContextSwitches = 'nbContextSwitches : ' + fields[1].replace('\n','')
|
||||||
if X2HO_state == CONST.X2_HO_REQ_STATE__IDLE:
|
if X2HO_state == CONST.X2_HO_REQ_STATE__IDLE:
|
||||||
result = re.search('target eNB Receives X2 HO Req X2AP_HANDOVER_REQ', str(line))
|
result = re.search('target eNB Receives X2 HO Req X2AP_HANDOVER_REQ', str(line))
|
||||||
if result is not None:
|
if result is not None:
|
||||||
@@ -978,11 +983,12 @@ class RANManagement():
|
|||||||
global_status = CONST.ENB_PROCESS_REALTIME_ISSUE
|
global_status = CONST.ENB_PROCESS_REALTIME_ISSUE
|
||||||
if self.htmlObj is not None:
|
if self.htmlObj is not None:
|
||||||
self.htmlObj.htmleNBFailureMsg=htmleNBFailureMsg
|
self.htmlObj.htmleNBFailureMsg=htmleNBFailureMsg
|
||||||
# Runtime statistics
|
# Runtime statistics for console output and HTML
|
||||||
if runTime != '':
|
if runTime != '':
|
||||||
logging.debug(runTime)
|
logging.debug(runTime)
|
||||||
logging.debug('Time executing user inst : ' + userTime)
|
logging.debug(userTime)
|
||||||
logging.debug('Time executing system inst : ' + systemTime)
|
logging.debug(systemTime)
|
||||||
logging.debug('Max Physical Memory Usage : ' + maxPhyMemUsage)
|
logging.debug(maxPhyMemUsage)
|
||||||
logging.debug('Nb Context Switches : ' + nbContextSwitches)
|
logging.debug(nbContextSwitches)
|
||||||
|
self.runtime_stats='<pre>'+runTime + '\n'+ userTime + '\n' + systemTime + '\n' + maxPhyMemUsage + '\n' + nbContextSwitches+'</pre>'
|
||||||
return global_status
|
return global_status
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
- COTS_UE_Airplane
|
|
||||||
- Build_PhySim
|
- Build_PhySim
|
||||||
- Run_PhySim
|
- Run_PhySim
|
||||||
- Build_eNB
|
- Build_eNB
|
||||||
|
|||||||
+16
-8
@@ -21,19 +21,27 @@
|
|||||||
|
|
||||||
-->
|
-->
|
||||||
<testCaseList>
|
<testCaseList>
|
||||||
<htmlTabRef>test-airplane-mode</htmlTabRef>
|
<htmlTabRef>epc-closure</htmlTabRef>
|
||||||
<htmlTabName>AirplaneToggle</htmlTabName>
|
<htmlTabName>EPC-Closure</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>log-out</htmlTabIcon>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
010000
|
060000 060001 060002
|
||||||
</TestCaseRequestedList>
|
</TestCaseRequestedList>
|
||||||
<TestCaseExclusionList></TestCaseExclusionList>
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
<testCase id="010000">
|
<testCase id="060000">
|
||||||
<class>COTS_UE_Airplane</class>
|
<class>Terminate_HSS</class>
|
||||||
<desc>Toggle COTS Airplane mode ON</desc>
|
<desc>Terminate HSS</desc>
|
||||||
<cots_ue_airplane_args>ON</cots_ue_airplane_args>
|
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="060001">
|
||||||
|
<class>Terminate_MME</class>
|
||||||
|
<desc>Terminate MME</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="060002">
|
||||||
|
<class>Terminate_SPGW</class>
|
||||||
|
<desc>Terminate SPGW</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
</testCaseList>
|
</testCaseList>
|
||||||
+15
-17
@@ -21,30 +21,28 @@
|
|||||||
|
|
||||||
-->
|
-->
|
||||||
<testCaseList>
|
<testCaseList>
|
||||||
<htmlTabRef>test-fr1-tm1</htmlTabRef>
|
<htmlTabRef>epc-start-tab</htmlTabRef>
|
||||||
<htmlTabName>Test-FR1-TM1</htmlTabName>
|
<htmlTabName>EPC-Start</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>log-in</htmlTabIcon>
|
||||||
<repeatCount>1</repeatCount>
|
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
070001
|
000100 000101 000102
|
||||||
070000
|
|
||||||
</TestCaseRequestedList>
|
</TestCaseRequestedList>
|
||||||
<TestCaseExclusionList>
|
<TestCaseExclusionList>
|
||||||
</TestCaseExclusionList>
|
</TestCaseExclusionList>
|
||||||
|
|
||||||
<testCase id="070000">
|
<testCase id="000100">
|
||||||
<class>Terminate_eNB</class>
|
<class>Initialize_HSS</class>
|
||||||
<desc>Terminate eNB</desc>
|
<desc>Initialize HSS</desc>
|
||||||
<eNB_instance>0</eNB_instance>
|
|
||||||
<eNB_serverId>0</eNB_serverId>
|
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="070001">
|
<testCase id="000101">
|
||||||
<class>Terminate_eNB</class>
|
<class>Initialize_MME</class>
|
||||||
<desc>Terminate gNB</desc>
|
<desc>Initialize MME</desc>
|
||||||
<eNB_instance>1</eNB_instance>
|
</testCase>
|
||||||
<eNB_serverId>1</eNB_serverId>
|
|
||||||
|
<testCase id="000102">
|
||||||
|
<class>Initialize_SPGW</class>
|
||||||
|
<desc>Initialize SPGW</desc>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
</testCaseList>
|
</testCaseList>
|
||||||
|
|
||||||
@@ -0,0 +1,117 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
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-FR1-TM1</htmlTabRef>
|
||||||
|
<htmlTabName>FR1</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
010000
|
||||||
|
030000
|
||||||
|
040000
|
||||||
|
010001
|
||||||
|
000001
|
||||||
|
050000
|
||||||
|
050001
|
||||||
|
070001
|
||||||
|
070000
|
||||||
|
010002
|
||||||
|
010003
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="010000">
|
||||||
|
<class>Initialize_UE</class>
|
||||||
|
<desc>Initialize UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="010003">
|
||||||
|
<class>Terminate_UE</class>
|
||||||
|
<desc>Terminate UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="010001">
|
||||||
|
<class>Attach_UE</class>
|
||||||
|
<desc>Attach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="010002">
|
||||||
|
<class>Detach_UE</class>
|
||||||
|
<desc>Detach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="030000">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize eNB</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.fr1.25PRB.usrpb210.conf</Initialize_eNB_args>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
<eNB_serverId>0</eNB_serverId>
|
||||||
|
<air_interface>lte</air_interface>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="040000">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize gNB</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf -E</Initialize_eNB_args>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
<eNB_serverId>1</eNB_serverId>
|
||||||
|
<air_interface>nr</air_interface>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="000001">
|
||||||
|
<class>IdleSleep</class>
|
||||||
|
<desc>Sleep</desc>
|
||||||
|
<idle_sleep_time_in_sec>20</idle_sleep_time_in_sec>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="050000">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>Ping: 20pings in 20sec</desc>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>0</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="050001">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>Ping: 5pings in 1sec</desc>
|
||||||
|
<ping_args>-c 5 -i 0.2</ping_args>
|
||||||
|
<ping_packetloss_threshold>0</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070000">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate eNB</desc>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
<eNB_serverId>0</eNB_serverId>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070001">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate gNB</desc>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
<eNB_serverId>1</eNB_serverId>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
|
|
||||||
@@ -16,6 +16,7 @@ This page is valid on tags starting from **`2019.w09`**.
|
|||||||
|
|
||||||
# Soft Modem Build Script
|
# Soft Modem Build Script
|
||||||
|
|
||||||
|
The OAI EPC is developed in a distinct project with it's own [documentation](https://github.com/OPENAIRINTERFACE/openair-epc-fed/wiki) , it is not described here.
|
||||||
|
|
||||||
OAI softmodem sources, which aim to implement 3GPP compliant UEs, eNodeB and gNodeB can be downloaded from the Eurecom [gitlab repository](./GET_SOURCES.md).
|
OAI softmodem sources, which aim to implement 3GPP compliant UEs, eNodeB and gNodeB can be downloaded from the Eurecom [gitlab repository](./GET_SOURCES.md).
|
||||||
|
|
||||||
|
|||||||
+1
-7
@@ -33,12 +33,8 @@ holds the source code for (eNB RAN + UE RAN).
|
|||||||
For legal issues (licenses), the core network (EPC) source code is now moved away from
|
For legal issues (licenses), the core network (EPC) source code is now moved away from
|
||||||
the above openairinterface5g git repository.
|
the above openairinterface5g git repository.
|
||||||
|
|
||||||
* A very old version of the EPC is located under the same GitLab Eurecom server (splitted into 2 Git repos):
|
|
||||||
* [openair-cn](https://gitlab.eurecom.fr/oai/openair-cn.git) with apache license
|
|
||||||
* [xtables-addons-oai](https://gitlab.eurecom.fr/oai/xtables-addons-oai.git) with GPL license
|
|
||||||
* **These repositories are no more maintained.**
|
|
||||||
* A more recent version is available under our GitHub domain:
|
* A more recent version is available under our GitHub domain:
|
||||||
* [OAI GitHub openair-cn](https://github.com/OPENAIRINTERFACE/openair-cn)
|
* [OAI GitHub openair-cn domain](https://github.com/OPENAIRINTERFACE)
|
||||||
* Check its wiki pages for more details
|
* Check its wiki pages for more details
|
||||||
|
|
||||||
Configure git with your name/email address (only important if you are developer and want to contribute/push code to Git Repository):
|
Configure git with your name/email address (only important if you are developer and want to contribute/push code to Git Repository):
|
||||||
@@ -80,8 +76,6 @@ you do not have account on gitlab.eurecom.fr, please register yourself to gitlab
|
|||||||
* `git clone git@gitlab.eurecom.fr:oai/openairinterface5g.git`
|
* `git clone git@gitlab.eurecom.fr:oai/openairinterface5g.git`
|
||||||
* Clone with user name/password prompt:
|
* Clone with user name/password prompt:
|
||||||
* `git clone https://YOUR_USERNAME@gitlab.eurecom.fr/oai/openairinterface5g.git`
|
* `git clone https://YOUR_USERNAME@gitlab.eurecom.fr/oai/openairinterface5g.git`
|
||||||
* `git clone https://YOUR_USERNAME@gitlab.eurecom.fr/oai/openair-cn.git`
|
|
||||||
* `git clone https://YOUR_USERNAME@gitlab.eurecom.fr/oai/xtables-addons-oai.git` (optional, openair-cn build script can do it for you)
|
|
||||||
|
|
||||||
# Which branch to checkout?
|
# Which branch to checkout?
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,45 @@
|
|||||||
|
## Table of Contents ##
|
||||||
|
|
||||||
|
1. [Legacy 1 Bench](#legacy-1-bench)
|
||||||
|
2. [Legacy 2 Bench](#legacy-2-bench)
|
||||||
|
3. [Next Bench for DEV](#next-bench-for-dev)
|
||||||
|
4. [Next Bench for CI](#next-bench-for-ci)
|
||||||
|
5. [Indoor Live Network Bench](#indoor-live-network-bench)
|
||||||
|
6. [Outdoor Live Network Bench](#outdoor-live-network-bench)
|
||||||
|
|
||||||
|
|
||||||
|
## Legacy 1 Bench
|
||||||
|
|
||||||
|
**Purpose** : FDD Band 7 and Band 13, LTE-M
|
||||||
|
**Note** : Legacy1 and Legacy2 are duplicated so that they can run in parallel, thus avoiding a CI bottleneck
|
||||||
|
**Note** : Faraday Cages 1 and 2 are physically the same cage
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Legacy 2 Bench
|
||||||
|
|
||||||
|
**Purpose** : TDD Band 40, TM2 2xTX 2xRX
|
||||||
|
**Note** : CN can run in a container, could also run on Massive
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Next Bench for DEV
|
||||||
|
|
||||||
|
**Note** : Benetel CI can also run on this bench at night
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## Next Bench for CI
|
||||||
|
|
||||||
|
**Note** : The current test running on Caracal could run on this bench with a N300/N300 setup
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Indoor Live Network Bench
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Outdoor Live Network Bench
|
||||||
|
|
||||||
|

|
||||||
@@ -1,4 +1,4 @@
|
|||||||
STATUS 2020/07/30 : under continuous improvement ; updated the configuration files links with CI approved reference files
|
STATUS 2020/09/10 : updated the status of interop (end to end UL/DL traffic)
|
||||||
|
|
||||||
|
|
||||||
## Table of Contents ##
|
## Table of Contents ##
|
||||||
@@ -220,17 +220,16 @@ Execute:
|
|||||||
- **gNB** (on the gNB host)
|
- **gNB** (on the gNB host)
|
||||||
|
|
||||||
|
|
||||||
|
**ATTENTION** : for the gNB execution,
|
||||||
|
The **-E** option is required to enable the tri-quarter sampling rate when using a B2xx serie USRP
|
||||||
|
The **-E** option is **NOT supported** when using a a N300 USRP
|
||||||
|
|
||||||
Execute:
|
Execute:
|
||||||
```
|
```
|
||||||
~/openairinterface5g/cmake_targets/ran_build/build$ sudo ./nr-softmodem -O **YOUR_GNB_CONF_FILE** -E | tee **YOUR_LOG_FILE**
|
~/openairinterface5g/cmake_targets/ran_build/build$ sudo ./nr-softmodem -O **YOUR_GNB_CONF_FILE** -E | tee **YOUR_LOG_FILE**
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
**ATTENTION** : for the gNB execution,
|
|
||||||
The -E option is required to enable the tri-quarter sampling rate when using a B2xx serie USRP
|
|
||||||
The -E opton is not needed when using a a N300 USRP
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Test Case
|
## Test Case
|
||||||
|
|
||||||
@@ -377,13 +376,11 @@ The following parts have been validated with FR1 COTS UE:
|
|||||||
PDCCH DCI format 1_1 and correponding PDSCH are decoded correctlyby the phone
|
PDCCH DCI format 1_1 and correponding PDSCH are decoded correctlyby the phone
|
||||||
ACK/NACK (PUCCH format 0) are successfully received at gNB
|
ACK/NACK (PUCCH format 0) are successfully received at gNB
|
||||||
|
|
||||||
- On going:
|
- **End-to end UL / DL traffic with HARQ procedures validated (ping, iperf)**
|
||||||
validation of HARQ procedures
|
|
||||||
Integration with higher layers to replace dummy data with real traffic
|
|
||||||
|
|
||||||
- Known limitations as of May 2020:
|
- Known limitations as of September 2020:
|
||||||
only dummy DL traffic
|
DL traffic : 3Mbps
|
||||||
no UL traffic
|
UL traffic : 1Mbps
|
||||||
no end-to-end traffic possible
|
some packet losses might still occur even in ideal channel conditions
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Executable
BIN
Binary file not shown.
BIN
Binary file not shown.
|
After Width: | Height: | Size: 248 KiB |
Executable
BIN
Binary file not shown.
|
After Width: | Height: | Size: 105 KiB |
Executable
BIN
Binary file not shown.
|
After Width: | Height: | Size: 119 KiB |
Executable
BIN
Binary file not shown.
|
After Width: | Height: | Size: 154 KiB |
Executable
BIN
Binary file not shown.
|
After Width: | Height: | Size: 181 KiB |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 164 KiB |
@@ -0,0 +1,92 @@
|
|||||||
|
#/*
|
||||||
|
# * 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
|
||||||
|
# */
|
||||||
|
#---------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Dockerfile for the Open-Air-Interface eNB service
|
||||||
|
# Valid for RHEL7 in the OpenShift context (v4.4)
|
||||||
|
#
|
||||||
|
#---------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
ARG REGISTRY=localhost
|
||||||
|
FROM $REGISTRY/oai-build-base:latest.el7 AS builder
|
||||||
|
|
||||||
|
ARG GIT_TAG=v1.1.1
|
||||||
|
|
||||||
|
WORKDIR /root
|
||||||
|
|
||||||
|
RUN if [ "$EURECOM_PROXY" == true ]; then git config --global http.proxy http://:@proxy.eurecom.fr:8080; fi
|
||||||
|
|
||||||
|
RUN git clone --depth=1 --branch=$GIT_TAG https://gitlab.eurecom.fr/oai/openairinterface5g.git
|
||||||
|
COPY patches patches/
|
||||||
|
RUN patch -p1 -d openairinterface5g < patches/disable_building_nasmesh_and_rbtool.patch \
|
||||||
|
&& patch -p1 -d openairinterface5g < patches/disable_sched_fifo_fail_exits.patch
|
||||||
|
RUN cd openairinterface5g/cmake_targets \
|
||||||
|
&& ln -sf /usr/local/bin/asn1c_oai /usr/local/bin/asn1c \
|
||||||
|
&& ln -sf /usr/local/share/asn1c_oai /usr/local/share/asn1c \
|
||||||
|
&& ./build_oai -c --eNB -w USRP --verbose-compile
|
||||||
|
|
||||||
|
|
||||||
|
FROM registry.redhat.io/ubi7/ubi
|
||||||
|
LABEL name="oai-enb" \
|
||||||
|
version="$GIT_TAG" \
|
||||||
|
maintainer="Frank A. Zdarsky <fzdarsky@redhat.com>" \
|
||||||
|
io.k8s.description="openairinterface5g eNB $GIT_TAG." \
|
||||||
|
io.openshift.tags="oai,enb" \
|
||||||
|
io.openshift.non-scalable="true"
|
||||||
|
|
||||||
|
RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm \
|
||||||
|
&& REPOLIST="rhel-7-server-optional-rpms" \
|
||||||
|
&& PKGLIST="boost libconfig lksctp-tools protobuf-c iproute iputils procps-ng bind-utils xforms nettle libyaml libusb" \
|
||||||
|
# && yum -y upgrade-minimal --setopt=tsflags=nodocs --security --sec-severity=Critical --sec-severity=Important && \
|
||||||
|
&& yum -y install --enablerepo ${REPOLIST} --setopt=tsflag=nodocs ${PKGLIST} \
|
||||||
|
&& yum -y clean all \
|
||||||
|
&& rm -rf /var/cache/yum
|
||||||
|
|
||||||
|
ENV APP_ROOT=/opt/oai-enb
|
||||||
|
ENV PATH=${APP_ROOT}:${PATH} HOME=${APP_ROOT}
|
||||||
|
COPY --from=builder /root/openairinterface5g/cmake_targets/lte_build_oai/build/lte-softmodem ${APP_ROOT}/bin/
|
||||||
|
COPY --from=builder /root/openairinterface5g/cmake_targets/lte_build_oai/build/*.so* /lib64
|
||||||
|
COPY --from=builder /usr/local/lib64 /lib64
|
||||||
|
COPY --from=builder /usr/local/bin/uhd_* /usr/local/bin
|
||||||
|
COPY --from=builder /usr/local/share/uhd /usr/local/share/uhd
|
||||||
|
RUN cd /lib64 \
|
||||||
|
&& ln -sf liboai_eth_transpro.so liboai_transpro.so \
|
||||||
|
&& ln -sf liboai_usrpdevif.so liboai_device.so \
|
||||||
|
&& ln -sf libuhd.so.3.13 libuhd.so.3 \
|
||||||
|
&& ln -sf libuhd.so.3 libuhd.so
|
||||||
|
COPY scripts ${APP_ROOT}/bin/
|
||||||
|
COPY configs ${APP_ROOT}/etc/
|
||||||
|
RUN chmod -R u+x ${APP_ROOT} && \
|
||||||
|
chgrp -R 0 ${APP_ROOT} && \
|
||||||
|
chmod -R g=u ${APP_ROOT} /etc/passwd
|
||||||
|
USER 10001
|
||||||
|
WORKDIR ${APP_ROOT}
|
||||||
|
|
||||||
|
EXPOSE 2152/udp # S1U, GTP/UDP
|
||||||
|
EXPOSE 22100/tcp # ?
|
||||||
|
EXPOSE 36412/udp # S1C, SCTP/UDP
|
||||||
|
EXPOSE 36422/udp # X2C, SCTP/UDP
|
||||||
|
EXPOSE 50000/udp # IF5 / ORI (control)
|
||||||
|
EXPOSE 50001/udp # IF5 / ECPRI (data)
|
||||||
|
|
||||||
|
CMD ["/opt/oai-enb/bin/lte-softmodem", "-O", "/opt/oai-enb/etc/enb.conf"]
|
||||||
|
ENTRYPOINT ["/opt/oai-enb/bin/entrypoint.sh"]
|
||||||
Reference in New Issue
Block a user