feat(ci): adding automation for 5G NR SA L2 simulator with Proxy
- Adding new templates for nFAPI in gNB and NR-UE images - Better entrypoint for NR-UE (alignment on others) - New Test method: StatsFromGenObject - At deployment, image name, size and date are printed - Initial scenario with 1 NR-UE and just ping operations - Trigger new child sub-pipeline for L2-sim-5G tests Signed-off-by: Raphael Defosseux <raphael.defosseux@eurecom.fr>
This commit is contained in:
@@ -238,6 +238,26 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
stage ("5G L2 Simulators") {
|
||||||
|
when { expression {doMandatoryTests} }
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
triggerSlaveJob ('RAN-L2-Sim-Test-5G', 'Test-L2-Sim-Container-4G')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
script {
|
||||||
|
finalizeSlaveJob('RAN-L2-Sim-Test-5G')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
failure {
|
||||||
|
script {
|
||||||
|
currentBuild.result = 'FAILURE'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
stage ("NSA B200 Sanity Check") {
|
stage ("NSA B200 Sanity Check") {
|
||||||
when { expression {doMandatoryTests} }
|
when { expression {doMandatoryTests} }
|
||||||
steps {
|
steps {
|
||||||
|
|||||||
@@ -93,6 +93,7 @@ class Containerize():
|
|||||||
self.allImagesSize = {}
|
self.allImagesSize = {}
|
||||||
self.collectInfo = {}
|
self.collectInfo = {}
|
||||||
|
|
||||||
|
self.deployedContainers = []
|
||||||
self.tsharkStarted = False
|
self.tsharkStarted = False
|
||||||
self.pingContName = ''
|
self.pingContName = ''
|
||||||
self.pingOptions = ''
|
self.pingOptions = ''
|
||||||
@@ -680,12 +681,28 @@ class Containerize():
|
|||||||
cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml ps -a'
|
cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml ps -a'
|
||||||
count = 0
|
count = 0
|
||||||
healthy = 0
|
healthy = 0
|
||||||
|
newContainers = []
|
||||||
while (count < 10):
|
while (count < 10):
|
||||||
count += 1
|
count += 1
|
||||||
containerStatus = []
|
containerStatus = []
|
||||||
deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=30)
|
deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=30)
|
||||||
healthy = 0
|
healthy = 0
|
||||||
for state in deployStatus.split('\n'):
|
for state in deployStatus.split('\n'):
|
||||||
|
res = re.search('Name|----------', state)
|
||||||
|
if res is not None:
|
||||||
|
continue
|
||||||
|
if len(state) == 0:
|
||||||
|
continue
|
||||||
|
res = re.search('^(?P<container_name>[a-zA-Z0-9\-\_]+) ', state)
|
||||||
|
if res is not None:
|
||||||
|
cName = res.group('container_name')
|
||||||
|
found = False
|
||||||
|
for alreadyDeployed in self.deployedContainers:
|
||||||
|
if cName == alreadyDeployed:
|
||||||
|
found = True
|
||||||
|
if not found:
|
||||||
|
newContainers.append(cName)
|
||||||
|
self.deployedContainers.append(cName)
|
||||||
if re.search('Up \(healthy\)', state) is not None:
|
if re.search('Up \(healthy\)', state) is not None:
|
||||||
healthy += 1
|
healthy += 1
|
||||||
if re.search('rfsim4g-db-init.*Exit 0', state) is not None:
|
if re.search('rfsim4g-db-init.*Exit 0', state) is not None:
|
||||||
@@ -696,16 +713,33 @@ class Containerize():
|
|||||||
else:
|
else:
|
||||||
time.sleep(10)
|
time.sleep(10)
|
||||||
|
|
||||||
|
imagesInfo = ''
|
||||||
|
for newCont in newContainers:
|
||||||
|
cmd = 'docker inspect -f "{{.Config.Image}}" ' + newCont
|
||||||
|
imageName = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=30)
|
||||||
|
imageName = str(imageName).strip()
|
||||||
|
cmd = 'docker image inspect --format "{{.RepoTags}}\t{{.Size}}\t{{.Created}}" ' + imageName
|
||||||
|
imagesInfo += subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=30)
|
||||||
|
|
||||||
|
html_queue = SimpleQueue()
|
||||||
|
html_cell = '<pre style="background-color:white">\n'
|
||||||
|
for imageInfo in imagesInfo.split('\n'):
|
||||||
|
html_cell += imageInfo[:-11] + '\n'
|
||||||
|
html_cell += '\n'
|
||||||
|
for cState in containerStatus:
|
||||||
|
html_cell += cState + '\n'
|
||||||
|
html_cell += '</pre>'
|
||||||
|
html_queue.put(html_cell)
|
||||||
if count == 100 and healthy == self.nb_healthy[0]:
|
if count == 100 and healthy == self.nb_healthy[0]:
|
||||||
if self.tsharkStarted == False:
|
if self.tsharkStarted == False:
|
||||||
logging.debug('Starting tshark on public network')
|
logging.debug('Starting tshark on public network')
|
||||||
self.CaptureOnDockerNetworks()
|
self.CaptureOnDockerNetworks()
|
||||||
HTML.CreateHtmlTestRow('n/a', 'OK', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRowQueue('n/a', 'OK', 1, html_queue)
|
||||||
for cState in containerStatus:
|
for cState in containerStatus:
|
||||||
logging.debug(cState)
|
logging.debug(cState)
|
||||||
logging.info('\u001B[1m Deploying OAI Object(s) PASS\u001B[0m')
|
logging.info('\u001B[1m Deploying OAI Object(s) PASS\u001B[0m')
|
||||||
else:
|
else:
|
||||||
HTML.CreateHtmlTestRow('Could not deploy in time', 'KO', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRowQueue('Could not deploy in time', 'KO', 1, html_queue)
|
||||||
for cState in containerStatus:
|
for cState in containerStatus:
|
||||||
logging.debug(cState)
|
logging.debug(cState)
|
||||||
logging.error('\u001B[1m Deploying OAI Object(s) FAILED\u001B[0m')
|
logging.error('\u001B[1m Deploying OAI Object(s) FAILED\u001B[0m')
|
||||||
@@ -724,10 +758,12 @@ class Containerize():
|
|||||||
cmd = 'sudo nohup tshark -f "(host 192.168.61.11 and icmp) or (not host 192.168.61.11 and not host 192.168.61.30 and not arp and not port 53 and not port 2152)"'
|
cmd = 'sudo nohup tshark -f "(host 192.168.61.11 and icmp) or (not host 192.168.61.11 and not host 192.168.61.30 and not arp and not port 53 and not port 2152)"'
|
||||||
elif re.search('5g.*rfsimulator', self.yamlPath[0]) is not None:
|
elif re.search('5g.*rfsimulator', self.yamlPath[0]) is not None:
|
||||||
cmd = 'sudo nohup tshark -f "(host 192.168.72.135 and icmp) or (not host 192.168.72.135 and not host 192.168.71.150 and not arp and not port 53 and not port 2152 and not port 2153)"'
|
cmd = 'sudo nohup tshark -f "(host 192.168.72.135 and icmp) or (not host 192.168.72.135 and not host 192.168.71.150 and not arp and not port 53 and not port 2152 and not port 2153)"'
|
||||||
|
elif re.search('5g_l2sim', self.yamlPath[0]) is not None:
|
||||||
|
cmd = 'sudo nohup tshark -f "(host 192.168.72.135 and icmp) or (not host 192.168.72.135 and not arp and not port 53 and not port 2152 and not port 2153)"'
|
||||||
else:
|
else:
|
||||||
return
|
return
|
||||||
for name in networkNames.split('\n'):
|
for name in networkNames.split('\n'):
|
||||||
if re.search('rfsim', name) is not None:
|
if re.search('rfsim', name) is not None or re.search('l2sim', name) is not None:
|
||||||
cmd += ' -i ' + name
|
cmd += ' -i ' + name
|
||||||
cmd += ' -w /tmp/capture_'
|
cmd += ' -w /tmp/capture_'
|
||||||
ymlPath = self.yamlPath[0].split('/')
|
ymlPath = self.yamlPath[0].split('/')
|
||||||
@@ -779,7 +815,7 @@ class Containerize():
|
|||||||
# Analyzing log file(s)!
|
# Analyzing log file(s)!
|
||||||
listOfPossibleRanContainers = ['enb', 'gnb', 'cu', 'du']
|
listOfPossibleRanContainers = ['enb', 'gnb', 'cu', 'du']
|
||||||
for container in listOfPossibleRanContainers:
|
for container in listOfPossibleRanContainers:
|
||||||
filename = self.yamlPath[0] + '/rfsim?g-oai-' + container + '.log'
|
filename = self.yamlPath[0] + '/*-oai-' + container + '.log'
|
||||||
cmd = 'ls ' + filename
|
cmd = 'ls ' + filename
|
||||||
containerStatus = True
|
containerStatus = True
|
||||||
try:
|
try:
|
||||||
@@ -801,7 +837,7 @@ class Containerize():
|
|||||||
|
|
||||||
listOfPossibleUeContainers = ['lte-ue*', 'nr-ue*']
|
listOfPossibleUeContainers = ['lte-ue*', 'nr-ue*']
|
||||||
for container in listOfPossibleUeContainers:
|
for container in listOfPossibleUeContainers:
|
||||||
filename = self.yamlPath[0] + '/rfsim?g-oai-' + container + '.log'
|
filename = self.yamlPath[0] + '/*-oai-' + container + '.log'
|
||||||
cmd = 'ls ' + filename
|
cmd = 'ls ' + filename
|
||||||
containerStatus = True
|
containerStatus = True
|
||||||
try:
|
try:
|
||||||
@@ -849,6 +885,7 @@ class Containerize():
|
|||||||
logging.error('\u001B[1m Undeploying OAI Object(s) FAILED\u001B[0m')
|
logging.error('\u001B[1m Undeploying OAI Object(s) FAILED\u001B[0m')
|
||||||
return
|
return
|
||||||
|
|
||||||
|
self.deployedContainers = []
|
||||||
# Cleaning any created tmp volume
|
# Cleaning any created tmp volume
|
||||||
cmd = 'docker volume prune --force || true'
|
cmd = 'docker volume prune --force || true'
|
||||||
logging.debug(cmd)
|
logging.debug(cmd)
|
||||||
@@ -861,6 +898,40 @@ class Containerize():
|
|||||||
HTML.CreateHtmlTestRow('n/a', 'KO', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow('n/a', 'KO', CONST.ALL_PROCESSES_OK)
|
||||||
logging.info('\u001B[1m Undeploying OAI Object(s) FAIL\u001B[0m')
|
logging.info('\u001B[1m Undeploying OAI Object(s) FAIL\u001B[0m')
|
||||||
|
|
||||||
|
def StatsFromGenObject(self, HTML):
|
||||||
|
self.exitStatus = 0
|
||||||
|
ymlPath = self.yamlPath[0].split('/')
|
||||||
|
logPath = '../cmake_targets/log/' + ymlPath[1]
|
||||||
|
|
||||||
|
# if the containers are running, recover the logs!
|
||||||
|
cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml ps --all'
|
||||||
|
logging.debug(cmd)
|
||||||
|
deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=30)
|
||||||
|
cmd = 'docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}" '
|
||||||
|
anyLogs = False
|
||||||
|
for state in deployStatus.split('\n'):
|
||||||
|
res = re.search('Name|----------', state)
|
||||||
|
if res is not None:
|
||||||
|
continue
|
||||||
|
if len(state) == 0:
|
||||||
|
continue
|
||||||
|
res = re.search('^(?P<container_name>[a-zA-Z0-9\-\_]+) ', state)
|
||||||
|
if res is not None:
|
||||||
|
anyLogs = True
|
||||||
|
cmd += res.group('container_name') + ' '
|
||||||
|
message = ''
|
||||||
|
if anyLogs:
|
||||||
|
logging.debug(cmd)
|
||||||
|
stats = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=30)
|
||||||
|
for statLine in stats.split('\n'):
|
||||||
|
logging.debug(statLine)
|
||||||
|
message += statLine + '\n'
|
||||||
|
|
||||||
|
html_queue = SimpleQueue()
|
||||||
|
html_cell = '<pre style="background-color:white">\n' + message + '</pre>'
|
||||||
|
html_queue.put(html_cell)
|
||||||
|
HTML.CreateHtmlTestRowQueue(self.pingOptions, 'OK', 1, html_queue)
|
||||||
|
|
||||||
def PingFromContainer(self, HTML, RAN, UE):
|
def PingFromContainer(self, HTML, RAN, UE):
|
||||||
self.exitStatus = 0
|
self.exitStatus = 0
|
||||||
ymlPath = self.yamlPath[0].split('/')
|
ymlPath = self.yamlPath[0].split('/')
|
||||||
|
|||||||
@@ -3156,10 +3156,12 @@ class OaiCiTest():
|
|||||||
nrFoundDCI = 0
|
nrFoundDCI = 0
|
||||||
nrCRCOK = 0
|
nrCRCOK = 0
|
||||||
mbms_messages = 0
|
mbms_messages = 0
|
||||||
|
nbPduSessAccept = 0
|
||||||
|
nbPduDiscard = 0
|
||||||
HTML.htmlUEFailureMsg=''
|
HTML.htmlUEFailureMsg=''
|
||||||
global_status = CONST.ALL_PROCESSES_OK
|
global_status = CONST.ALL_PROCESSES_OK
|
||||||
for line in ue_log_file.readlines():
|
for line in ue_log_file.readlines():
|
||||||
result = re.search('nr_synchro_time', str(line))
|
result = re.search('nr_synchro_time|Starting NR UE soft modem', str(line))
|
||||||
if result is not None:
|
if result is not None:
|
||||||
nrUEFlag = True
|
nrUEFlag = True
|
||||||
if nrUEFlag:
|
if nrUEFlag:
|
||||||
@@ -3172,6 +3174,15 @@ class OaiCiTest():
|
|||||||
result = re.search('CRC OK', str(line))
|
result = re.search('CRC OK', str(line))
|
||||||
if result is not None:
|
if result is not None:
|
||||||
nrCRCOK += 1
|
nrCRCOK += 1
|
||||||
|
result = re.search('Received PDU Session Establishment Accept', str(line))
|
||||||
|
if result is not None:
|
||||||
|
nbPduSessAccept += 1
|
||||||
|
result = re.search('warning: discard PDU, sn out of window', str(line))
|
||||||
|
if result is not None:
|
||||||
|
nbPduDiscard += 1
|
||||||
|
result = re.search('--nfapi 5 --node-number 2 --sa', str(line))
|
||||||
|
if result is not None:
|
||||||
|
frequency_found = True
|
||||||
result = re.search('Exiting OAI softmodem', str(line))
|
result = re.search('Exiting OAI softmodem', str(line))
|
||||||
if result is not None:
|
if result is not None:
|
||||||
exitSignalReceived = True
|
exitSignalReceived = True
|
||||||
@@ -3302,21 +3313,29 @@ class OaiCiTest():
|
|||||||
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
|
||||||
if nrUEFlag:
|
if nrUEFlag:
|
||||||
if nrDecodeMib > 0:
|
if nrDecodeMib > 0:
|
||||||
statMsg = 'UE showed ' + str(nrDecodeMib) + ' MIB decode message(s)'
|
statMsg = 'UE showed ' + str(nrDecodeMib) + ' "MIB decode" message(s)'
|
||||||
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
||||||
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
|
||||||
if nrFoundDCI > 0:
|
if nrFoundDCI > 0:
|
||||||
statMsg = 'UE showed ' + str(nrFoundDCI) + ' DCI found message(s)'
|
statMsg = 'UE showed ' + str(nrFoundDCI) + ' "DCI found" message(s)'
|
||||||
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
||||||
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
|
||||||
if nrCRCOK > 0:
|
if nrCRCOK > 0:
|
||||||
statMsg = 'UE showed ' + str(nrCRCOK) + ' PDSCH decoding message(s)'
|
statMsg = 'UE showed ' + str(nrCRCOK) + ' "PDSCH decoding" message(s)'
|
||||||
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
||||||
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
|
||||||
if not frequency_found:
|
if not frequency_found:
|
||||||
statMsg = 'NR-UE could NOT synch!'
|
statMsg = 'NR-UE could NOT synch!'
|
||||||
logging.error('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
logging.error('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
||||||
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
|
||||||
|
if nbPduSessAccept > 0:
|
||||||
|
statMsg = 'UE showed ' + str(nbPduSessAccept) + ' "Received PDU Session Establishment Accept" message(s)'
|
||||||
|
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
||||||
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
|
||||||
|
if nbPduDiscard > 0:
|
||||||
|
statMsg = 'UE showed ' + str(nbPduDiscard) + ' "warning: discard PDU, sn out of window" message(s)'
|
||||||
|
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
||||||
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
|
||||||
if uciStatMsgCount > 0:
|
if uciStatMsgCount > 0:
|
||||||
statMsg = 'UE showed ' + str(uciStatMsgCount) + ' "uci->stat" message(s)'
|
statMsg = 'UE showed ' + str(uciStatMsgCount) + ' "uci->stat" message(s)'
|
||||||
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
||||||
|
|||||||
+3
-1
@@ -391,7 +391,7 @@ def GetParametersFromXML(action):
|
|||||||
if (string_field is not None):
|
if (string_field is not None):
|
||||||
CONTAINERS.yamlPath[CONTAINERS.eNB_instance] = string_field
|
CONTAINERS.yamlPath[CONTAINERS.eNB_instance] = string_field
|
||||||
|
|
||||||
elif action == 'DeployGenObject' or action == 'UndeployGenObject':
|
elif action == 'DeployGenObject' or action == 'UndeployGenObject' or action == 'StatsFromGenObject':
|
||||||
string_field=test.findtext('yaml_path')
|
string_field=test.findtext('yaml_path')
|
||||||
if (string_field is not None):
|
if (string_field is not None):
|
||||||
CONTAINERS.yamlPath[0] = string_field
|
CONTAINERS.yamlPath[0] = string_field
|
||||||
@@ -931,6 +931,8 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
|||||||
CONTAINERS.IperfFromContainer(HTML, RAN)
|
CONTAINERS.IperfFromContainer(HTML, RAN)
|
||||||
if CONTAINERS.exitStatus==1:
|
if CONTAINERS.exitStatus==1:
|
||||||
RAN.prematureExit = True
|
RAN.prematureExit = True
|
||||||
|
elif action == 'StatsFromGenObject':
|
||||||
|
CONTAINERS.StatsFromGenObject(HTML)
|
||||||
else:
|
else:
|
||||||
sys.exit('Invalid class (action) from xml')
|
sys.exit('Invalid class (action) from xml')
|
||||||
if RAN.prematureExit:
|
if RAN.prematureExit:
|
||||||
|
|||||||
+21
-8
@@ -677,13 +677,13 @@ class RANManagement():
|
|||||||
# if T tracer was run with option 0 (no logs), analyze logs
|
# if T tracer was run with option 0 (no logs), analyze logs
|
||||||
# from textlog, otherwise do normal analysis (e.g., option 2)
|
# from textlog, otherwise do normal analysis (e.g., option 2)
|
||||||
result = re.search('T_stdout 0', str(self.Initialize_eNB_args))
|
result = re.search('T_stdout 0', str(self.Initialize_eNB_args))
|
||||||
enbLogFile = self.eNBLogFiles[int(self.eNB_instance)]
|
|
||||||
raw_record_file = enbLogFile.replace('.log', '_record.raw')
|
|
||||||
replay_log_file = enbLogFile.replace('.log', '_replay.log')
|
|
||||||
if (result is not None):
|
if (result is not None):
|
||||||
logging.debug('\u001B[1m Replaying RAW record file\u001B[0m')
|
logging.debug('\u001B[1m Replaying RAW record file\u001B[0m')
|
||||||
mySSH.open(lIpAddr, lUserName, lPassWord)
|
mySSH.open(lIpAddr, lUserName, lPassWord)
|
||||||
mySSH.command('cd ' + lSourcePath + '/common/utils/T/tracer/', '\$', 5)
|
mySSH.command('cd ' + lSourcePath + '/common/utils/T/tracer/', '\$', 5)
|
||||||
|
enbLogFile = self.eNBLogFiles[int(self.eNB_instance)]
|
||||||
|
raw_record_file = enbLogFile.replace('.log', '_record.raw')
|
||||||
|
replay_log_file = enbLogFile.replace('.log', '_replay.log')
|
||||||
extracted_txt_file = enbLogFile.replace('.log', '_extracted_messages.txt')
|
extracted_txt_file = enbLogFile.replace('.log', '_extracted_messages.txt')
|
||||||
extracted_log_file = enbLogFile.replace('.log', '_extracted_messages.log')
|
extracted_log_file = enbLogFile.replace('.log', '_extracted_messages.log')
|
||||||
mySSH.command('./extract_config -i ' + lSourcePath + '/cmake_targets/' + raw_record_file + ' > ' + lSourcePath + '/cmake_targets/' + extracted_txt_file, '\$', 5)
|
mySSH.command('./extract_config -i ' + lSourcePath + '/cmake_targets/' + raw_record_file + ' > ' + lSourcePath + '/cmake_targets/' + extracted_txt_file, '\$', 5)
|
||||||
@@ -706,8 +706,6 @@ class RANManagement():
|
|||||||
mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/*stats.log', '.')
|
mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/*stats.log', '.')
|
||||||
mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/*.pickle', '.')
|
mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/*.pickle', '.')
|
||||||
mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/*.png', '.')
|
mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/*.png', '.')
|
||||||
mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/'+raw_record_file, '.')
|
|
||||||
mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/'+replay_log_file, '.')
|
|
||||||
#
|
#
|
||||||
copyin_res = mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/' + fileToAnalyze, '.')
|
copyin_res = mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/' + fileToAnalyze, '.')
|
||||||
if (copyin_res == -1):
|
if (copyin_res == -1):
|
||||||
@@ -723,9 +721,7 @@ class RANManagement():
|
|||||||
mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, './nrL1_stats.log', self.eNBSourceCodePath + '/cmake_targets/')
|
mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, './nrL1_stats.log', self.eNBSourceCodePath + '/cmake_targets/')
|
||||||
mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, './nrMAC_stats.log', self.eNBSourceCodePath + '/cmake_targets/')
|
mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, './nrMAC_stats.log', self.eNBSourceCodePath + '/cmake_targets/')
|
||||||
mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, './gnb_stats_monitor.pickle', self.eNBSourceCodePath + '/cmake_targets/')
|
mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, './gnb_stats_monitor.pickle', self.eNBSourceCodePath + '/cmake_targets/')
|
||||||
mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, './gnb_stats_monitor.png', self.eNBSourceCodePath + '/cmake_targets/')#RH 21/02/2002 this does not work, there are more than 1 png file
|
mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, './gnb_stats_monitor.png', self.eNBSourceCodePath + '/cmake_targets/')
|
||||||
mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword,'./'+raw_record_file, self.eNBSourceCodePath + '/cmake_targets/')
|
|
||||||
mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword,'./'+replay_log_file, self.eNBSourceCodePath + '/cmake_targets/')
|
|
||||||
#
|
#
|
||||||
mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, './' + fileToAnalyze, self.eNBSourceCodePath + '/cmake_targets/')
|
mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, './' + fileToAnalyze, self.eNBSourceCodePath + '/cmake_targets/')
|
||||||
logging.debug('\u001B[1m Analyzing ' + nodeB_prefix + 'NB logfile \u001B[0m ' + fileToAnalyze)
|
logging.debug('\u001B[1m Analyzing ' + nodeB_prefix + 'NB logfile \u001B[0m ' + fileToAnalyze)
|
||||||
@@ -826,6 +822,8 @@ class RANManagement():
|
|||||||
RealTimeProcessingIssue = False
|
RealTimeProcessingIssue = False
|
||||||
DLRetxIssue = False
|
DLRetxIssue = False
|
||||||
ULRetxIssue = False
|
ULRetxIssue = False
|
||||||
|
nrRrcRcfgComplete = 0
|
||||||
|
harqFeedbackPast = 0
|
||||||
|
|
||||||
line_cnt=0 #log file line counter
|
line_cnt=0 #log file line counter
|
||||||
for line in enb_log_file.readlines():
|
for line in enb_log_file.readlines():
|
||||||
@@ -1002,6 +1000,13 @@ class RANManagement():
|
|||||||
#remove 1- all useless char before relevant info (ulsch or dlsch) 2- trailing char
|
#remove 1- all useless char before relevant info (ulsch or dlsch) 2- trailing char
|
||||||
dlsch_ulsch_stats[k]=re.sub(r'^.*\]\s+', r'' , line.rstrip())
|
dlsch_ulsch_stats[k]=re.sub(r'^.*\]\s+', r'' , line.rstrip())
|
||||||
|
|
||||||
|
result = re.search('Received NR_RRCReconfigurationComplete from UE', str(line))
|
||||||
|
if result is not None:
|
||||||
|
nrRrcRcfgComplete += 1
|
||||||
|
result = re.search('HARQ feedback is in the past', str(line))
|
||||||
|
if result is not None:
|
||||||
|
harqFeedbackPast += 1
|
||||||
|
|
||||||
|
|
||||||
#count "problem receiving samples" msg
|
#count "problem receiving samples" msg
|
||||||
result = re.search('\[PHY\]\s+problem receiving samples', str(line))
|
result = re.search('\[PHY\]\s+problem receiving samples', str(line))
|
||||||
@@ -1089,6 +1094,14 @@ class RANManagement():
|
|||||||
statMsg = nodeB_prefix + 'NB ran with TX Write thread enabled'
|
statMsg = nodeB_prefix + 'NB ran with TX Write thread enabled'
|
||||||
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
||||||
htmleNBFailureMsg += statMsg + '\n'
|
htmleNBFailureMsg += statMsg + '\n'
|
||||||
|
if nrRrcRcfgComplete > 0:
|
||||||
|
statMsg = nodeB_prefix + 'NB showed ' + str(nrRrcRcfgComplete) + ' "Received NR_RRCReconfigurationComplete from UE" message(s)'
|
||||||
|
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
||||||
|
htmleNBFailureMsg += statMsg + '\n'
|
||||||
|
if harqFeedbackPast > 0:
|
||||||
|
statMsg = nodeB_prefix + 'NB showed ' + str(harqFeedbackPast) + ' "HARQ feedback is in the past" message(s)'
|
||||||
|
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
||||||
|
htmleNBFailureMsg += statMsg + '\n'
|
||||||
#FR1 NSA test : add new markers to make sure gNB is used
|
#FR1 NSA test : add new markers to make sure gNB is used
|
||||||
if NSA_RAPROC_PUSCH_check:
|
if NSA_RAPROC_PUSCH_check:
|
||||||
statMsg = '[RAPROC] PUSCH with TC_RNTI message check for ' + nodeB_prefix + 'NB : PASS '
|
statMsg = '[RAPROC] PUSCH with TC_RNTI message check for ' + nodeB_prefix + 'NB : PASS '
|
||||||
|
|||||||
@@ -46,3 +46,4 @@
|
|||||||
- UndeployGenObject
|
- UndeployGenObject
|
||||||
- PingFromContainer
|
- PingFromContainer
|
||||||
- IperfFromContainer
|
- IperfFromContainer
|
||||||
|
- StatsFromGenObject
|
||||||
|
|||||||
@@ -0,0 +1,115 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
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>l2sim-5gnr-tdd</htmlTabRef>
|
||||||
|
<htmlTabName>Testing 5G NR L2 sim - TDD gNB</htmlTabName>
|
||||||
|
<htmlTabIcon>wrench</htmlTabIcon>
|
||||||
|
<repeatCount>2</repeatCount>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
100001
|
||||||
|
000000
|
||||||
|
000001
|
||||||
|
000002
|
||||||
|
000003
|
||||||
|
000011
|
||||||
|
200000
|
||||||
|
020001
|
||||||
|
020002
|
||||||
|
200001
|
||||||
|
100001
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="000000">
|
||||||
|
<class>DeployGenObject</class>
|
||||||
|
<desc>Deploy MySql Database</desc>
|
||||||
|
<yaml_path>yaml_files/5g_l2sim_tdd</yaml_path>
|
||||||
|
<services>mysql</services>
|
||||||
|
<nb_healthy>1</nb_healthy>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="000001">
|
||||||
|
<class>DeployGenObject</class>
|
||||||
|
<desc>Deploy OAI 5G CoreNetwork</desc>
|
||||||
|
<yaml_path>yaml_files/5g_l2sim_tdd</yaml_path>
|
||||||
|
<services>oai-nrf oai-amf oai-smf oai-spgwu oai-ext-dn</services>
|
||||||
|
<nb_healthy>6</nb_healthy>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="000002">
|
||||||
|
<class>DeployGenObject</class>
|
||||||
|
<desc>Deploy OAI 5G gNB L2 sim SA</desc>
|
||||||
|
<yaml_path>yaml_files/5g_l2sim_tdd</yaml_path>
|
||||||
|
<services>oai-gnb</services>
|
||||||
|
<nb_healthy>7</nb_healthy>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="000003">
|
||||||
|
<class>DeployGenObject</class>
|
||||||
|
<desc>Deploy OAI 5G NR-UE L2 sim SA and Proxy</desc>
|
||||||
|
<yaml_path>yaml_files/5g_l2sim_tdd</yaml_path>
|
||||||
|
<services>proxy oai-nr-ue0</services>
|
||||||
|
<nb_healthy>9</nb_healthy>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="000011">
|
||||||
|
<class>IdleSleep</class>
|
||||||
|
<desc>Sleep</desc>
|
||||||
|
<idle_sleep_time_in_sec>10</idle_sleep_time_in_sec>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="020001">
|
||||||
|
<class>PingFromContainer</class>
|
||||||
|
<desc>Ping ext-dn from NR-UE</desc>
|
||||||
|
<container_name>l2sim-oai-nr-ue0</container_name>
|
||||||
|
<options>-I oaitun_ue1 -c 20 192.168.72.135</options>
|
||||||
|
<loss_threshold>5</loss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="020002">
|
||||||
|
<class>PingFromContainer</class>
|
||||||
|
<desc>Ping NR-UE from ext-dn</desc>
|
||||||
|
<container_name>l2sim-oai-ext-dn</container_name>
|
||||||
|
<options>-c 20 12.1.1.2</options>
|
||||||
|
<loss_threshold>5</loss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="100001">
|
||||||
|
<class>UndeployGenObject</class>
|
||||||
|
<desc>Undeploy all OAI 5G stack</desc>
|
||||||
|
<yaml_path>yaml_files/5g_l2sim_tdd</yaml_path>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="200000">
|
||||||
|
<class>StatsFromGenObject</class>
|
||||||
|
<desc>Statistics before Traffic Test</desc>
|
||||||
|
<yaml_path>yaml_files/5g_l2sim_tdd</yaml_path>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="200001">
|
||||||
|
<class>StatsFromGenObject</class>
|
||||||
|
<desc>Statistics after Traffic Test</desc>
|
||||||
|
<yaml_path>yaml_files/5g_l2sim_tdd</yaml_path>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
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>l2sim-5gnr-down</htmlTabRef>
|
||||||
|
<htmlTabName>CleanUp 5G L2 sim - TDD gNB</htmlTabName>
|
||||||
|
<htmlTabIcon>trash</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
100002
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="100002">
|
||||||
|
<class>UndeployGenObject</class>
|
||||||
|
<desc>Undeploy all OAI 5G stack</desc>
|
||||||
|
<yaml_path>yaml_files/5g_l2sim_tdd</yaml_path>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,322 @@
|
|||||||
|
version: '3.8'
|
||||||
|
services:
|
||||||
|
oai-nrf:
|
||||||
|
container_name: "l2sim-oai-nrf"
|
||||||
|
image: oai-nrf:latest
|
||||||
|
environment:
|
||||||
|
- NRF_INTERFACE_NAME_FOR_SBI=eth0
|
||||||
|
- NRF_INTERFACE_PORT_FOR_SBI=80
|
||||||
|
- NRF_INTERFACE_HTTP2_PORT_FOR_SBI=9090
|
||||||
|
- NRF_API_VERSION=v1
|
||||||
|
- INSTANCE=0
|
||||||
|
- PID_DIRECTORY=/var/run
|
||||||
|
networks:
|
||||||
|
public_net:
|
||||||
|
ipv4_address: 192.168.71.130
|
||||||
|
volumes:
|
||||||
|
- ../5g_rfsimulator/nrf-healthcheck.sh:/openair-nrf/bin/nrf-healthcheck.sh
|
||||||
|
healthcheck:
|
||||||
|
test: /bin/bash -c "/openair-nrf/bin/nrf-healthcheck.sh"
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
mysql:
|
||||||
|
container_name: "l2sim-mysql"
|
||||||
|
image: mysql:5.7
|
||||||
|
volumes:
|
||||||
|
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||||
|
- ../5g_rfsimulator/mysql-healthcheck.sh:/tmp/mysql-healthcheck.sh
|
||||||
|
environment:
|
||||||
|
- TZ=Europe/Paris
|
||||||
|
- MYSQL_DATABASE=oai_db
|
||||||
|
- MYSQL_USER=test
|
||||||
|
- MYSQL_PASSWORD=test
|
||||||
|
- MYSQL_ROOT_PASSWORD=linux
|
||||||
|
healthcheck:
|
||||||
|
test: /bin/bash -c "/tmp/mysql-healthcheck.sh"
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
networks:
|
||||||
|
public_net:
|
||||||
|
ipv4_address: 192.168.71.131
|
||||||
|
oai-amf:
|
||||||
|
container_name: "l2sim-oai-amf"
|
||||||
|
image: oai-amf:latest
|
||||||
|
environment:
|
||||||
|
- TZ=Europe/paris
|
||||||
|
- INSTANCE=0
|
||||||
|
- PID_DIRECTORY=/var/run
|
||||||
|
- MCC=208
|
||||||
|
- MNC=99
|
||||||
|
- REGION_ID=128
|
||||||
|
- AMF_SET_ID=1
|
||||||
|
- SERVED_GUAMI_MCC_0=208
|
||||||
|
- SERVED_GUAMI_MNC_0=99
|
||||||
|
- SERVED_GUAMI_REGION_ID_0=128
|
||||||
|
- SERVED_GUAMI_AMF_SET_ID_0=1
|
||||||
|
- SERVED_GUAMI_MCC_1=460
|
||||||
|
- SERVED_GUAMI_MNC_1=11
|
||||||
|
- SERVED_GUAMI_REGION_ID_1=10
|
||||||
|
- SERVED_GUAMI_AMF_SET_ID_1=1
|
||||||
|
- PLMN_SUPPORT_MCC=208
|
||||||
|
- PLMN_SUPPORT_MNC=99
|
||||||
|
- PLMN_SUPPORT_TAC=0x0001
|
||||||
|
- SST_0=1
|
||||||
|
- SD_0=1
|
||||||
|
- SST_1=1
|
||||||
|
- SD_1=12
|
||||||
|
- AMF_INTERFACE_NAME_FOR_NGAP=eth0
|
||||||
|
- AMF_INTERFACE_NAME_FOR_N11=eth0
|
||||||
|
- SMF_INSTANCE_ID_0=1
|
||||||
|
- SMF_FQDN_0=oai-smf
|
||||||
|
- SMF_IPV4_ADDR_0=0.0.0.0
|
||||||
|
- SMF_HTTP_VERSION_0=v1
|
||||||
|
- SELECTED_0=true
|
||||||
|
- SMF_INSTANCE_ID_1=2
|
||||||
|
- SMF_FQDN_1=oai-smf
|
||||||
|
- SMF_IPV4_ADDR_1=0.0.0.0
|
||||||
|
- SMF_HTTP_VERSION_1=v1
|
||||||
|
- SELECTED_1=false
|
||||||
|
- MYSQL_SERVER=192.168.71.131
|
||||||
|
- MYSQL_USER=root
|
||||||
|
- MYSQL_PASS=linux
|
||||||
|
- MYSQL_DB=oai_db
|
||||||
|
- OPERATOR_KEY=c42449363bbad02b66d16bc975d77cc1
|
||||||
|
- NRF_IPV4_ADDRESS=192.168.71.130
|
||||||
|
- NRF_PORT=80
|
||||||
|
- NF_REGISTRATION=yes
|
||||||
|
- SMF_SELECTION=yes
|
||||||
|
- USE_FQDN_DNS=yes
|
||||||
|
- NRF_API_VERSION=v1
|
||||||
|
- NRF_FQDN=oai-nrf
|
||||||
|
- EXTERNAL_AUSF=no
|
||||||
|
- AUSF_IPV4_ADDRESS=0.0.0.0
|
||||||
|
- AUSF_PORT=80
|
||||||
|
- AUSF_API_VERSION=v1
|
||||||
|
- AUSF_FQDN=localhost
|
||||||
|
depends_on:
|
||||||
|
- oai-nrf
|
||||||
|
- mysql
|
||||||
|
volumes:
|
||||||
|
- ../5g_rfsimulator/amf-healthcheck.sh:/openair-amf/bin/amf-healthcheck.sh
|
||||||
|
healthcheck:
|
||||||
|
test: /bin/bash -c "/openair-amf/bin/amf-healthcheck.sh"
|
||||||
|
interval: 10s
|
||||||
|
timeout: 15s
|
||||||
|
retries: 5
|
||||||
|
networks:
|
||||||
|
public_net:
|
||||||
|
ipv4_address: 192.168.71.132
|
||||||
|
oai-smf:
|
||||||
|
container_name: "l2sim-oai-smf"
|
||||||
|
image: oai-smf:latest
|
||||||
|
environment:
|
||||||
|
- TZ=Europe/Paris
|
||||||
|
- INSTANCE=0
|
||||||
|
- PID_DIRECTORY=/var/run
|
||||||
|
- SMF_INTERFACE_NAME_FOR_N4=eth0
|
||||||
|
- SMF_INTERFACE_NAME_FOR_SBI=eth0
|
||||||
|
- SMF_INTERFACE_PORT_FOR_SBI=80
|
||||||
|
- SMF_INTERFACE_HTTP2_PORT_FOR_SBI=9090
|
||||||
|
- SMF_API_VERSION=v1
|
||||||
|
- DEFAULT_DNS_IPV4_ADDRESS=192.168.18.129
|
||||||
|
- DEFAULT_DNS_SEC_IPV4_ADDRESS=4.4.4.4
|
||||||
|
- AMF_IPV4_ADDRESS=0.0.0.0
|
||||||
|
- AMF_PORT=80
|
||||||
|
- AMF_API_VERSION=v1
|
||||||
|
- AMF_FQDN=oai-amf
|
||||||
|
- UDM_IPV4_ADDRESS=127.0.0.1
|
||||||
|
- UDM_PORT=80
|
||||||
|
- UDM_API_VERSION=v1
|
||||||
|
- UDM_FQDN=localhost
|
||||||
|
- UPF_IPV4_ADDRESS=192.168.71.134
|
||||||
|
- UPF_FQDN_0=oai-spgwu
|
||||||
|
- NRF_IPV4_ADDRESS=192.168.71.130
|
||||||
|
- NRF_PORT=80
|
||||||
|
- NRF_API_VERSION=v1
|
||||||
|
- NRF_FQDN=oai-nrf
|
||||||
|
- REGISTER_NRF=yes
|
||||||
|
- DISCOVER_UPF=yes
|
||||||
|
- USE_FQDN_DNS=yes
|
||||||
|
- DNN_NI0=oai
|
||||||
|
- DNN_NI2=oai.ipv4
|
||||||
|
depends_on:
|
||||||
|
- oai-nrf
|
||||||
|
- oai-amf
|
||||||
|
volumes:
|
||||||
|
- ../5g_rfsimulator/smf-healthcheck.sh:/openair-smf/bin/smf-healthcheck.sh
|
||||||
|
healthcheck:
|
||||||
|
test: /bin/bash -c "/openair-smf/bin/smf-healthcheck.sh"
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
networks:
|
||||||
|
public_net:
|
||||||
|
ipv4_address: 192.168.71.133
|
||||||
|
oai-spgwu:
|
||||||
|
container_name: "l2sim-oai-spgwu"
|
||||||
|
image: oai-spgwu-tiny:latest
|
||||||
|
environment:
|
||||||
|
- TZ=Europe/Paris
|
||||||
|
- PID_DIRECTORY=/var/run
|
||||||
|
- SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP=eth0
|
||||||
|
- SGW_INTERFACE_NAME_FOR_SX=eth0
|
||||||
|
- PGW_INTERFACE_NAME_FOR_SGI=eth0
|
||||||
|
- NETWORK_UE_NAT_OPTION=yes
|
||||||
|
- NETWORK_UE_IP=12.1.1.0/24
|
||||||
|
- SPGWC0_IP_ADDRESS=192.168.71.133
|
||||||
|
- BYPASS_UL_PFCP_RULES=no
|
||||||
|
- MCC=208
|
||||||
|
- MNC=99
|
||||||
|
- MNC03=099
|
||||||
|
- TAC=1
|
||||||
|
- GTP_EXTENSION_HEADER_PRESENT=yes
|
||||||
|
- GW_ID=1
|
||||||
|
- REALM=openairinterface.org
|
||||||
|
- ENABLE_5G_FEATURES=yes
|
||||||
|
- REGISTER_NRF=yes
|
||||||
|
- USE_FQDN_NRF=yes
|
||||||
|
- UPF_FQDN_5G=oai-spgwu
|
||||||
|
- NRF_IPV4_ADDRESS=192.168.71.130
|
||||||
|
- NRF_PORT=80
|
||||||
|
- NRF_API_VERSION=v1
|
||||||
|
- NRF_FQDN=oai-nrf
|
||||||
|
- NSSAI_SST_0=1
|
||||||
|
- NSSAI_SD_0=1
|
||||||
|
- DNN_0=oai
|
||||||
|
depends_on:
|
||||||
|
- oai-nrf
|
||||||
|
- oai-smf
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- SYS_ADMIN
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
privileged: true
|
||||||
|
volumes:
|
||||||
|
- ../5g_rfsimulator/spgwu-healthcheck.sh:/openair-spgwu-tiny/bin/spgwu-healthcheck.sh
|
||||||
|
healthcheck:
|
||||||
|
test: /bin/bash -c "/openair-spgwu-tiny/bin/spgwu-healthcheck.sh"
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
networks:
|
||||||
|
public_net:
|
||||||
|
ipv4_address: 192.168.71.134
|
||||||
|
traffic_net:
|
||||||
|
ipv4_address: 192.168.72.134
|
||||||
|
oai-ext-dn:
|
||||||
|
image: ubuntu:bionic
|
||||||
|
privileged: true
|
||||||
|
container_name: "l2sim-oai-ext-dn"
|
||||||
|
entrypoint: /bin/bash -c \
|
||||||
|
"apt update; apt install -y procps iptables iproute2 iperf iputils-ping;"\
|
||||||
|
"ip route add 12.1.1.0/24 via 192.168.72.134 dev eth0; sleep infinity"
|
||||||
|
depends_on:
|
||||||
|
- oai-spgwu
|
||||||
|
networks:
|
||||||
|
traffic_net:
|
||||||
|
ipv4_address: 192.168.72.135
|
||||||
|
healthcheck:
|
||||||
|
test: /bin/bash -c "ping -c 2 192.168.72.134"
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
oai-gnb:
|
||||||
|
image: oai-gnb:develop
|
||||||
|
privileged: true
|
||||||
|
container_name: "l2sim-oai-gnb"
|
||||||
|
network_mode: "host"
|
||||||
|
environment:
|
||||||
|
TZ: Europe/Paris
|
||||||
|
USE_SA_NFAPI_VNF: 'yes'
|
||||||
|
GNB_NAME: gnb-l2sim-vnf
|
||||||
|
TAC: 1
|
||||||
|
MCC: '208'
|
||||||
|
MNC: '99'
|
||||||
|
MNC_LENGTH: 2
|
||||||
|
NSSAI_SST: 1
|
||||||
|
NSSAI_SD0: 1
|
||||||
|
NSSAI_SD1: 112233
|
||||||
|
AMF_IP_ADDRESS: 192.168.71.132
|
||||||
|
GNB_NGA_IF_NAME: eno1
|
||||||
|
GNB_NGA_IP_ADDRESS: 192.168.18.193
|
||||||
|
GNB_NGU_IF_NAME: eno1
|
||||||
|
GNB_NGU_IP_ADDRESS: 192.168.18.193
|
||||||
|
LOCAL_S_IF_NAME: 'lo:'
|
||||||
|
REMOTE_S_ADDRESS: 127.0.0.1
|
||||||
|
LOCAL_S_ADDRESS: 127.0.0.2
|
||||||
|
USE_ADDITIONAL_OPTIONS: --sa --nfapi 2 --emulate-l1 --log_config.global_log_options level,time,thread_id,nocolor
|
||||||
|
depends_on:
|
||||||
|
- oai-spgwu
|
||||||
|
- oai-amf
|
||||||
|
healthcheck:
|
||||||
|
test: /bin/bash -c "pgrep nr-softmodem"
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
|
||||||
|
proxy:
|
||||||
|
image: oai-lte-multi-ue-proxy:latest
|
||||||
|
privileged: true
|
||||||
|
container_name: "l2sim-proxy"
|
||||||
|
network_mode: "host"
|
||||||
|
environment:
|
||||||
|
TZ: Europe/Paris
|
||||||
|
command: "/oai-lte-multi-ue-proxy/bin/proxy 1 --nr"
|
||||||
|
depends_on:
|
||||||
|
- oai-gnb
|
||||||
|
healthcheck:
|
||||||
|
test: /bin/bash -c "pgrep proxy"
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
|
||||||
|
oai-nr-ue0:
|
||||||
|
image: oai-nr-ue:develop
|
||||||
|
privileged: true
|
||||||
|
container_name: "l2sim-oai-nr-ue0"
|
||||||
|
network_mode: "host"
|
||||||
|
environment:
|
||||||
|
TZ: Europe/Paris
|
||||||
|
USE_NFAPI: 'yes'
|
||||||
|
OPENAIR_DIR: /opt/oai-nr-ue
|
||||||
|
FULL_IMSI: '208990100001100'
|
||||||
|
FULL_KEY: 'fec86ba6eb707ed08905757b1bb44b8f'
|
||||||
|
OPC: 'C42449363BBAD02B66D16BC975D77CC1'
|
||||||
|
DNN: oai
|
||||||
|
NSSAI_SST: 1
|
||||||
|
NSSAI_SD: 1
|
||||||
|
NR_UE_NFAPI_IF_NAME: eno1
|
||||||
|
GNB_IP_ADDRESS: 127.0.0.1
|
||||||
|
NR_UE_IP_ADDRESS: 127.0.0.1
|
||||||
|
USE_ADDITIONAL_OPTIONS: --nokrnmod 1 --nfapi 5 --node-number 2 --sa --emulate-l1 --log_config.global_log_options level,time,thread_id,nocolor
|
||||||
|
volumes:
|
||||||
|
- ../../../openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results:/opt/oai-nr-ue/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results
|
||||||
|
depends_on:
|
||||||
|
- oai-gnb
|
||||||
|
- proxy
|
||||||
|
healthcheck:
|
||||||
|
test: /bin/bash -c "pgrep nr-uesoftmodem"
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
|
||||||
|
networks:
|
||||||
|
public_net:
|
||||||
|
driver: bridge
|
||||||
|
name: l2sim-oai-public-net
|
||||||
|
ipam:
|
||||||
|
config:
|
||||||
|
- subnet: 192.168.71.128/26
|
||||||
|
driver_opts:
|
||||||
|
com.docker.network.bridge.name: "l2sim-public"
|
||||||
|
traffic_net:
|
||||||
|
driver: bridge
|
||||||
|
name: l2sim-oai-traffic-net
|
||||||
|
ipam:
|
||||||
|
config:
|
||||||
|
- subnet: 192.168.72.128/26
|
||||||
|
driver_opts:
|
||||||
|
com.docker.network.bridge.name: "l2sim-traffic"
|
||||||
@@ -29,7 +29,8 @@ FROM ran-base:latest AS nr-ue-base
|
|||||||
|
|
||||||
FROM ran-build:latest AS nr-ue-build
|
FROM ran-build:latest AS nr-ue-build
|
||||||
|
|
||||||
RUN cp /oai-ran/docker/scripts/nr_ue_entrypoint.sh /oai-ran/docker/scripts/entrypoint.sh
|
RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/nr_ue_parameters.yaml && \
|
||||||
|
cp /oai-ran/docker/scripts/nr_ue_entrypoint.sh /oai-ran/docker/scripts/entrypoint.sh
|
||||||
|
|
||||||
#start from scratch for target executable
|
#start from scratch for target executable
|
||||||
FROM registry.access.redhat.com/ubi8/ubi:latest as oai-nr-ue
|
FROM registry.access.redhat.com/ubi8/ubi:latest as oai-nr-ue
|
||||||
@@ -62,7 +63,10 @@ COPY --from=nr-ue-build \
|
|||||||
./
|
./
|
||||||
|
|
||||||
WORKDIR /opt/oai-nr-ue/etc
|
WORKDIR /opt/oai-nr-ue/etc
|
||||||
COPY --from=nr-ue-build /oai-ran/ci-scripts/conf_files/nr-ue-sim.conf .
|
COPY --from=nr-ue-build \
|
||||||
|
/oai-ran/ci-scripts/conf_files/nr-ue-sim.conf \
|
||||||
|
/oai-ran/docker/etc/nr-ue.nfapi.conf \
|
||||||
|
./
|
||||||
|
|
||||||
COPY --from=nr-ue-build \
|
COPY --from=nr-ue-build \
|
||||||
/oai-ran/cmake_targets/ran_build/build/liboai_eth_transpro.so \
|
/oai-ran/cmake_targets/ran_build/build/liboai_eth_transpro.so \
|
||||||
@@ -118,5 +122,5 @@ WORKDIR /opt/oai-nr-ue/etc
|
|||||||
COPY --from=nr-ue-build /oai-ran/ci-scripts/conf_files/ue.* .
|
COPY --from=nr-ue-build /oai-ran/ci-scripts/conf_files/ue.* .
|
||||||
|
|
||||||
WORKDIR /opt/oai-nr-ue
|
WORKDIR /opt/oai-nr-ue
|
||||||
CMD ["/opt/oai-nr-ue/bin/nr-uesoftmodem.Rel15", "-O", "/opt/oai-nr-ue/etc/nr-ue-sim.conf"]
|
CMD ["/opt/oai-nr-ue/bin/nr-uesoftmodem.Rel15", "-O", "/opt/oai-nr-ue/etc/nr-ue.conf"]
|
||||||
ENTRYPOINT ["/opt/oai-nr-ue/bin/entrypoint.sh"]
|
ENTRYPOINT ["/opt/oai-nr-ue/bin/entrypoint.sh"]
|
||||||
|
|||||||
@@ -29,7 +29,8 @@ FROM ran-base:latest AS nr-ue-base
|
|||||||
|
|
||||||
FROM ran-build:latest AS nr-ue-build
|
FROM ran-build:latest AS nr-ue-build
|
||||||
|
|
||||||
RUN cp /oai-ran/docker/scripts/nr_ue_entrypoint.sh /oai-ran/docker/scripts/entrypoint.sh
|
RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/nr_ue_parameters.yaml && \
|
||||||
|
cp /oai-ran/docker/scripts/nr_ue_entrypoint.sh /oai-ran/docker/scripts/entrypoint.sh
|
||||||
|
|
||||||
#start from scratch for target executable
|
#start from scratch for target executable
|
||||||
FROM ubuntu:bionic as oai-nr-ue
|
FROM ubuntu:bionic as oai-nr-ue
|
||||||
@@ -67,7 +68,10 @@ COPY --from=nr-ue-build \
|
|||||||
./
|
./
|
||||||
|
|
||||||
WORKDIR /opt/oai-nr-ue/etc
|
WORKDIR /opt/oai-nr-ue/etc
|
||||||
COPY --from=nr-ue-build /oai-ran/ci-scripts/conf_files/nr-ue-sim.conf .
|
COPY --from=nr-ue-build \
|
||||||
|
/oai-ran/ci-scripts/conf_files/nr-ue-sim.conf \
|
||||||
|
/oai-ran/docker/etc/nr-ue.nfapi.conf \
|
||||||
|
./
|
||||||
|
|
||||||
COPY --from=nr-ue-build \
|
COPY --from=nr-ue-build \
|
||||||
/oai-ran/cmake_targets/ran_build/build/liboai_eth_transpro.so \
|
/oai-ran/cmake_targets/ran_build/build/liboai_eth_transpro.so \
|
||||||
@@ -106,5 +110,5 @@ RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so /usr/local/lib/liboai
|
|||||||
ldconfig
|
ldconfig
|
||||||
|
|
||||||
WORKDIR /opt/oai-nr-ue
|
WORKDIR /opt/oai-nr-ue
|
||||||
CMD ["/opt/oai-nr-ue/bin/nr-uesoftmodem.Rel15", "-O", "/opt/oai-nr-ue/etc/nr-ue-sim.conf"]
|
CMD ["/opt/oai-nr-ue/bin/nr-uesoftmodem.Rel15", "-O", "/opt/oai-nr-ue/etc/nr-ue.conf"]
|
||||||
ENTRYPOINT ["/opt/oai-nr-ue/bin/entrypoint.sh"]
|
ENTRYPOINT ["/opt/oai-nr-ue/bin/entrypoint.sh"]
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
# Import
|
# Import
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
|
import glob
|
||||||
import re
|
import re
|
||||||
import yaml
|
import yaml
|
||||||
import os
|
import os
|
||||||
@@ -33,7 +34,8 @@ def main():
|
|||||||
#read yaml input parameters
|
#read yaml input parameters
|
||||||
f = open(f'{sys.argv[1]}',)
|
f = open(f'{sys.argv[1]}',)
|
||||||
data = yaml.full_load(f)
|
data = yaml.full_load(f)
|
||||||
dir = os.listdir(f'{data[0]["paths"]["source_dir"]}')
|
initial_path = f'{data[0]["paths"]["source_dir"]}'
|
||||||
|
dir = glob.glob(initial_path + '/**/*.conf', recursive=True)
|
||||||
|
|
||||||
#identify configs, read and replace corresponding values
|
#identify configs, read and replace corresponding values
|
||||||
for config in data[1]["configurations"]:
|
for config in data[1]["configurations"]:
|
||||||
@@ -42,7 +44,10 @@ def main():
|
|||||||
print('================================================')
|
print('================================================')
|
||||||
print('filePrefix = ' + filePrefix)
|
print('filePrefix = ' + filePrefix)
|
||||||
print('outputfilename = ' + outputfilename)
|
print('outputfilename = ' + outputfilename)
|
||||||
|
found = False
|
||||||
for inputfile in dir:
|
for inputfile in dir:
|
||||||
|
if found:
|
||||||
|
continue
|
||||||
if inputfile.find(filePrefix) >=0:
|
if inputfile.find(filePrefix) >=0:
|
||||||
prefix_outputfile = {"cu.band7.tm1.25PRB": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
prefix_outputfile = {"cu.band7.tm1.25PRB": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
||||||
"du.band7.tm1.25PRB": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
"du.band7.tm1.25PRB": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
||||||
@@ -58,10 +63,13 @@ def main():
|
|||||||
"gnb.sa.band66.fr1.106PRB.usrpn300.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
"gnb.sa.band66.fr1.106PRB.usrpn300.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
||||||
"gNB_SA_CU.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
"gNB_SA_CU.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
||||||
"gNB_SA_DU.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
"gNB_SA_DU.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
||||||
|
"proxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
||||||
|
"proxy_nr-ue.nfapi.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
||||||
"ue.nfapi": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
"ue.nfapi": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
||||||
"ue_sim_ci": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}'
|
"ue_sim_ci": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}'
|
||||||
}
|
}
|
||||||
print('inputfile = ' + inputfile)
|
print('inputfile = ' + inputfile)
|
||||||
|
found = True
|
||||||
if filePrefix in prefix_outputfile:
|
if filePrefix in prefix_outputfile:
|
||||||
outputfile1 = prefix_outputfile[filePrefix]
|
outputfile1 = prefix_outputfile[filePrefix]
|
||||||
|
|
||||||
@@ -69,7 +77,7 @@ def main():
|
|||||||
if not os.path.exists(directory):
|
if not os.path.exists(directory):
|
||||||
os.makedirs(directory, exist_ok=True)
|
os.makedirs(directory, exist_ok=True)
|
||||||
|
|
||||||
with open(f'{data[0]["paths"]["source_dir"]}{inputfile}', mode='r') as inputfile, \
|
with open(f'{inputfile}', mode='r') as inputfile, \
|
||||||
open(outputfile1, mode='w') as outputfile:
|
open(outputfile1, mode='w') as outputfile:
|
||||||
for line in inputfile:
|
for line in inputfile:
|
||||||
count = 0
|
count = 0
|
||||||
|
|||||||
@@ -11,8 +11,9 @@ THREAD_PARALLEL_CONFIG=${THREAD_PARALLEL_CONFIG:-PARALLEL_SINGLE_THREAD}
|
|||||||
if [[ -v USE_NSA_TDD_MONO ]]; then cp $PREFIX/etc/gnb.nsa.tdd.conf $PREFIX/etc/gnb.conf; fi
|
if [[ -v USE_NSA_TDD_MONO ]]; then cp $PREFIX/etc/gnb.nsa.tdd.conf $PREFIX/etc/gnb.conf; fi
|
||||||
if [[ -v USE_SA_TDD_MONO ]]; then cp $PREFIX/etc/gnb.sa.tdd.conf $PREFIX/etc/gnb.conf; fi
|
if [[ -v USE_SA_TDD_MONO ]]; then cp $PREFIX/etc/gnb.sa.tdd.conf $PREFIX/etc/gnb.conf; fi
|
||||||
if [[ -v USE_SA_FDD_MONO ]]; then cp $PREFIX/etc/gnb.sa.fdd.conf $PREFIX/etc/gnb.conf; fi
|
if [[ -v USE_SA_FDD_MONO ]]; then cp $PREFIX/etc/gnb.sa.fdd.conf $PREFIX/etc/gnb.conf; fi
|
||||||
if [[ -v USE_SA_CU ]]; then ln -s $PREFIX/etc/gnb.sa.cu.conf $PREFIX/etc/gnb.conf; fi
|
if [[ -v USE_SA_CU ]]; then cp $PREFIX/etc/gnb.sa.cu.conf $PREFIX/etc/gnb.conf; fi
|
||||||
if [[ -v USE_SA_TDD_CU ]]; then cp $PREFIX/etc/gnb.sa.du.tdd.conf $PREFIX/etc/gnb.conf; fi
|
if [[ -v USE_SA_TDD_CU ]]; then cp $PREFIX/etc/gnb.sa.du.tdd.conf $PREFIX/etc/gnb.conf; fi
|
||||||
|
if [[ -v USE_SA_NFAPI_VNF ]]; then cp $PREFIX/etc/gnb.sa.nfapi.vnf.conf $PREFIX/etc/gnb.conf; fi
|
||||||
# Sometimes, the templates are not enough. We mount a conf file on $PREFIX/etc. It can be a template itself.
|
# Sometimes, the templates are not enough. We mount a conf file on $PREFIX/etc. It can be a template itself.
|
||||||
if [[ -v USE_VOLUMED_CONF ]]; then cp $PREFIX/etc/mounted.conf $PREFIX/etc/gnb.conf; fi
|
if [[ -v USE_VOLUMED_CONF ]]; then cp $PREFIX/etc/mounted.conf $PREFIX/etc/gnb.conf; fi
|
||||||
|
|
||||||
|
|||||||
@@ -202,3 +202,39 @@
|
|||||||
- key: remote_n_portd
|
- key: remote_n_portd
|
||||||
env: "@F1_CU_D_PORT@"
|
env: "@F1_CU_D_PORT@"
|
||||||
|
|
||||||
|
- filePrefix: proxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf
|
||||||
|
outputfilename: "gnb.sa.nfapi.vnf.conf"
|
||||||
|
config:
|
||||||
|
- key: Active_gNBs
|
||||||
|
env: "@GNB_NAME@"
|
||||||
|
- key: gNB_name
|
||||||
|
env: "@GNB_NAME@"
|
||||||
|
- key: mcc
|
||||||
|
env: "@MCC@"
|
||||||
|
- key: mnc
|
||||||
|
env: "@MNC@"
|
||||||
|
- key: mnc_length
|
||||||
|
env: "@MNC_LENGTH@"
|
||||||
|
- key: tracking_area_code
|
||||||
|
env: "@TAC@"
|
||||||
|
- key: sst
|
||||||
|
env: "@NSSAI_SST@"
|
||||||
|
- key: ipv4
|
||||||
|
env: "@AMF_IP_ADDRESS@"
|
||||||
|
- key: GNB_INTERFACE_NAME_FOR_NG_AMF
|
||||||
|
env: "@GNB_NGA_IF_NAME@"
|
||||||
|
- key: GNB_IPV4_ADDRESS_FOR_NG_AMF
|
||||||
|
env: "@GNB_NGA_IP_ADDRESS@"
|
||||||
|
- key: GNB_INTERFACE_NAME_FOR_NGU
|
||||||
|
env: "@GNB_NGU_IF_NAME@"
|
||||||
|
- key: GNB_IPV4_ADDRESS_FOR_NGU
|
||||||
|
env: "@GNB_NGU_IP_ADDRESS@"
|
||||||
|
- key: parallel_config
|
||||||
|
env: "@THREAD_PARALLEL_CONFIG@"
|
||||||
|
- key: local_s_if_name
|
||||||
|
env: "@LOCAL_S_IF_NAME@"
|
||||||
|
- key: remote_s_address
|
||||||
|
env: "@REMOTE_S_ADDRESS@"
|
||||||
|
- key: local_s_address
|
||||||
|
env: "@LOCAL_S_ADDRESS@"
|
||||||
|
|
||||||
|
|||||||
@@ -5,12 +5,22 @@ set -euo pipefail
|
|||||||
PREFIX=/opt/oai-nr-ue
|
PREFIX=/opt/oai-nr-ue
|
||||||
|
|
||||||
# Based another env var, pick one template to use
|
# Based another env var, pick one template to use
|
||||||
#if [[ -v USE_NFAPI ]]; then cp $PREFIX/etc/ue.nfapi.conf $PREFIX/etc/ue.conf; fi
|
if [[ -v USE_NFAPI ]]; then cp $PREFIX/etc/nr-ue.nfapi.conf $PREFIX/etc/nr-ue.conf; fi
|
||||||
|
# Sometimes, the templates are not enough. We mount a conf file on $PREFIX/etc. It can be a template itself.
|
||||||
|
if [[ -v USE_VOLUMED_CONF ]]; then cp $PREFIX/etc/mounted.conf $PREFIX/etc/nr-ue.conf; fi
|
||||||
|
# if none, pick the default
|
||||||
|
if [ ! -f $PREFIX/etc/nr-ue.conf ]; then cp $PREFIX/etc/nr-ue-sim.conf $PREFIX/etc/nr-ue.conf; fi
|
||||||
|
|
||||||
# Only this template will be manipulated and the USIM one!
|
# Only this template will be manipulated
|
||||||
CONFIG_FILES=`ls $PREFIX/etc/ue.conf $PREFIX/etc/nr-ue-sim.conf || true`
|
CONFIG_FILES=`ls $PREFIX/etc/nr-ue.conf || true`
|
||||||
|
|
||||||
for c in ${CONFIG_FILES}; do
|
for c in ${CONFIG_FILES}; do
|
||||||
|
# Sometimes templates have no pattern to be replaced.
|
||||||
|
if ! grep -oP '@[a-zA-Z0-9_]+@' ${c}; then
|
||||||
|
echo "Configuration is already set"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
|
||||||
# grep variable names (format: ${VAR}) from template to be rendered
|
# grep variable names (format: ${VAR}) from template to be rendered
|
||||||
VARS=$(grep -oP '@[a-zA-Z0-9_]+@' ${c} | sort | uniq | xargs)
|
VARS=$(grep -oP '@[a-zA-Z0-9_]+@' ${c} | sort | uniq | xargs)
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,49 @@
|
|||||||
|
#/*
|
||||||
|
# * 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
|
||||||
|
# */
|
||||||
|
|
||||||
|
---
|
||||||
|
- paths:
|
||||||
|
source_dir: "ci-scripts/conf_files/"
|
||||||
|
dest_dir: docker/etc
|
||||||
|
|
||||||
|
- configurations:
|
||||||
|
- filePrefix: proxy_nr-ue.nfapi.conf
|
||||||
|
outputfilename: "nr-ue.nfapi.conf"
|
||||||
|
config:
|
||||||
|
- key: imsi
|
||||||
|
env: "@FULL_IMSI@"
|
||||||
|
- key: key
|
||||||
|
env: "@FULL_KEY@"
|
||||||
|
- key: opc
|
||||||
|
env: "@OPC@"
|
||||||
|
- key: dnn
|
||||||
|
env: "@DNN@"
|
||||||
|
- key: nssai_sst
|
||||||
|
env: "@NSSAI_SST@"
|
||||||
|
- key: nssai_sd
|
||||||
|
env: "@NSSAI_SD@"
|
||||||
|
- key: remote_n_address
|
||||||
|
env: "@GNB_IP_ADDRESS@"
|
||||||
|
- key: local_n_address
|
||||||
|
env: "@NR_UE_IP_ADDRESS@"
|
||||||
|
- key: local_n_if_name
|
||||||
|
env: "@NR_UE_NFAPI_IF_NAME@"
|
||||||
|
|
||||||
Reference in New Issue
Block a user