diff --git a/ci-scripts/conf_files/enb.band7.tm1.fr1.25PRB.usrpb210.conf b/ci-scripts/conf_files/enb.band7.tm1.fr1.25PRB.usrpb210.conf
old mode 100755
new mode 100644
diff --git a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf
old mode 100755
new mode 100644
diff --git a/ci-scripts/constants.py b/ci-scripts/constants.py
index c5698c5a3e..a0e1ac5c45 100644
--- a/ci-scripts/constants.py
+++ b/ci-scripts/constants.py
@@ -59,6 +59,7 @@ OAI_UE_PROCESS_NO_TUNNEL_INTERFACE = -24
OAI_UE_PROCESS_SEG_FAULT = -25
OAI_UE_PROCESS_NO_MBMS_MSGS = -26
OAI_UE_PROCESS_OK = +6
+INVALID_PARAMETER = -50
UE_STATUS_DETACHED = 0
UE_STATUS_DETACHING = 1
diff --git a/ci-scripts/epc.py b/ci-scripts/epc.py
index a1994c5ac3..5ddf0e9eb4 100644
--- a/ci-scripts/epc.py
+++ b/ci-scripts/epc.py
@@ -66,6 +66,7 @@ class EPCManagement():
self.MmeIPAddress = ''
self.containerPrefix = 'prod'
self.mmeConfFile = 'mme.conf'
+ self.yamlPath = ''
#-----------------------------------------------------------
@@ -404,15 +405,145 @@ class EPCManagement():
if self.htmlObj is not None:
self.htmlObj.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
+ def DeployEpc(self):
+ logging.debug('Trying to deploy')
+ if not re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
+ if self.htmlObj is not None:
+ self.htmlObj.CreateHtmlTestRow(self.Type, 'KO', CONST.INVALID_PARAMETER)
+ self.htmlObj.CreateHtmlTabFooter(False)
+ sys.exit('Deploy not possible with this EPC type: ' + self.Type)
+
+ if self.IPAddress == '' or self.UserName == '' or self.Password == '' or self.SourceCodePath == '' or self.Type == '':
+ HELP.GenericHelp(CONST.Version)
+ HELP.EPCSrvHelp(self.IPAddress, self.UserName, self.Password, self.SourceCodePath, self.Type)
+ sys.exit('Insufficient EPC Parameters')
+ mySSH = SSH.SSHConnection()
+ mySSH.open(self.IPAddress, self.UserName, self.Password)
+ mySSH.command('docker-compose --version', '\$', 5)
+ result = re.search('docker-compose version 1', mySSH.getBefore())
+ if result is None:
+ mySSH.close()
+ if self.htmlObj is not None:
+ self.htmlObj.CreateHtmlTestRow(self.Type, 'KO', CONST.INVALID_PARAMETER)
+ self.htmlObj.CreateHtmlTabFooter(False)
+ sys.exit('docker-compose not installed on ' + self.IPAddress)
+
+ mySSH.command('if [ -d ' + self.SourceCodePath + '/scripts ]; then echo ' + self.Password + ' | sudo -S rm -Rf ' + self.SourceCodePath + '/scripts ; fi', '\$', 5)
+ mySSH.command('if [ -d ' + self.SourceCodePath + '/logs ]; then echo ' + self.Password + ' | sudo -S rm -Rf ' + self.SourceCodePath + '/logs ; fi', '\$', 5)
+ mySSH.command('mkdir -p ' + self.SourceCodePath + '/scripts ' + self.SourceCodePath + '/logs', '\$', 5)
+
+ # deploying and configuring the cassandra database
+ # container names and services are currently hard-coded.
+ # they could be recovered by:
+ # - docker-compose config --services
+ # - docker-compose config | grep container_name
+ mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
+ mySSH.copyout(self.IPAddress, self.UserName, self.Password, './' + self.yamlPath + '/docker-compose.yml', self.SourceCodePath + '/scripts')
+ mySSH.command('wget --quiet https://raw.githubusercontent.com/OPENAIRINTERFACE/openair-hss/develop/src/hss_rel14/db/oai_db.cql', '\$', 5)
+ mySSH.command('docker-compose down', '\$', 60)
+ mySSH.command('docker-compose up -d db_init', '\$', 60)
+
+ # databases take time...
+ time.sleep(10)
+ cnt = 0
+ db_init_status = False
+ while (cnt < 10):
+ mySSH.command('docker logs prod-db-init', '\$', 5)
+ result = re.search('OK', mySSH.getBefore())
+ if result is not None:
+ cnt = 10
+ db_init_status = True
+ else:
+ time.sleep(5)
+ cnt += 1
+ mySSH.command('docker rm -f prod-db-init', '\$', 5)
+ if not db_init_status:
+ if self.htmlObj is not None:
+ self.htmlObj.CreateHtmlTestRow(self.Type, 'KO', CONST.INVALID_PARAMETER)
+ self.htmlObj.CreateHtmlTabFooter(False)
+ sys.exit('Cassandra DB deployment/configuration went wrong!')
+
+ # deploying EPC cNFs
+ mySSH.command('docker-compose up -d oai_spgwu', '\$', 60)
+
+ cnt = 0
+ while (cnt < 3):
+ mySSH.command('docker inspect --format=\'{{.State.Health.Status}}\' prod-cassandra prod-oai-hss prod-oai-mme prod-oai-spgwc prod-oai-spgwu-tiny', '\$', 10)
+ unhealthyNb = mySSH.getBefore().count('unhealthy')
+ healthyNb = mySSH.getBefore().count('healthy') - unhealthyNb
+ startingNb = mySSH.getBefore().count('starting')
+ if healthyNb == 5:
+ cnt = 10
+ else:
+ time.sleep(10)
+ logging.debug(' -- ' + str(healthyNb) + ' healthy container(s)')
+ logging.debug(' -- ' + str(unhealthyNb) + ' unhealthy container(s)')
+ logging.debug(' -- ' + str(startingNb) + ' still starting container(s)')
+ if healthyNb == 5:
+ mySSH.command('docker exec -d prod-oai-hss /bin/bash -c "nohup tshark -i eth0 -i eth1 -w /tmp/hss_check_run.pcap 2>&1 > /dev/null"', '\$', 5)
+ mySSH.command('docker exec -d prod-oai-mme /bin/bash -c "nohup tshark -i eth0 -i lo:s10 -w /tmp/mme_check_run.pcap 2>&1 > /dev/null"', '\$', 10)
+ mySSH.command('docker exec -d prod-oai-spgwc /bin/bash -c "nohup tshark -i eth0 -i lo:p5c -i lo:s5c -w /tmp/spgwc_check_run.pcap 2>&1 > /dev/null"', '\$', 10)
+ mySSH.command('docker exec -d prod-oai-spgwu-tiny /bin/bash -c "nohup tshark -i eth0 -w /tmp/spgwu_check_run.pcap 2>&1 > /dev/null"', '\$', 10)
+ mySSH.close()
+ logging.debug('Deployment OK')
+ self.htmlObj.CreateHtmlTestRow(self.Type, 'OK', CONST.ALL_PROCESSES_OK)
+ else:
+ mySSH.close()
+ logging.debug('Deployment went wrong')
+ self.htmlObj.CreateHtmlTestRow(self.Type, 'KO', CONST.INVALID_PARAMETER)
+
+ def UndeployEpc(self):
+ logging.debug('Trying to undeploy')
+ # No check down, we suppose everything done before.
+
+ mySSH = SSH.SSHConnection()
+ mySSH.open(self.IPAddress, self.UserName, self.Password)
+ # Recovering logs and pcap files
+ mySSH.command('cd ' + self.SourceCodePath + '/logs', '\$', 5)
+ mySSH.command('docker exec -it prod-oai-hss /bin/bash -c "killall --signal SIGINT oai_hss tshark"', '\$', 5)
+ mySSH.command('docker exec -it prod-oai-mme /bin/bash -c "killall --signal SIGINT tshark"', '\$', 5)
+ mySSH.command('docker exec -it prod-oai-spgwc /bin/bash -c "killall --signal SIGINT oai_spgwc tshark"', '\$', 5)
+ mySSH.command('docker exec -it prod-oai-spgwu-tiny /bin/bash -c "killall --signal SIGINT tshark"', '\$', 5)
+ mySSH.command('docker logs prod-oai-hss > hss_' + self.testCase_id + '.log', '\$', 5)
+ mySSH.command('docker logs prod-oai-mme > mme_' + self.testCase_id + '.log', '\$', 5)
+ mySSH.command('docker logs prod-oai-spgwc > spgwc_' + self.testCase_id + '.log', '\$', 5)
+ mySSH.command('docker logs prod-oai-spgwu > spgwu_' + self.testCase_id + '.log', '\$', 5)
+ mySSH.command('docker cp prod-oai-hss:/tmp/hss_check_run.pcap hss_' + self.testCase_id + '.pcap', '\$', 60)
+ mySSH.command('docker cp prod-oai-mme:/tmp/mme_check_run.pcap mme_' + self.testCase_id + '.pcap', '\$', 60)
+ mySSH.command('docker cp prod-oai-spgwc:/tmp/spgwc_check_run.pcap spgwc_' + self.testCase_id + '.pcap', '\$', 60)
+ mySSH.command('docker cp prod-oai-spgwu-tiny:/tmp/spgwu_check_run.pcap spgwu_' + self.testCase_id + '.pcap', '\$', 60)
+ # Remove all
+ mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
+ mySSH.command('docker-compose down', '\$', 60)
+ mySSH.command('docker inspect --format=\'{{.State.Health.Status}}\' prod-cassandra prod-oai-hss prod-oai-mme prod-oai-spgwc prod-oai-spgwu-tiny', '\$', 10)
+ noMoreContainerNb = mySSH.getBefore().count('No such object')
+ mySSH.command('docker inspect --format=\'{{.Name}}\' prod-oai-public-net prod-oai-private-net', '\$', 10)
+ noMoreNetworkNb = mySSH.getBefore().count('No such object')
+ mySSH.close()
+ if noMoreContainerNb == 5 and noMoreNetworkNb == 2:
+ logging.debug('Undeployment OK')
+ self.htmlObj.CreateHtmlTestRow(self.Type, 'OK', CONST.ALL_PROCESSES_OK)
+ else:
+ logging.debug('Undeployment went wrong')
+ self.htmlObj.CreateHtmlTestRow(self.Type, 'KO', CONST.INVALID_PARAMETER)
+
def LogCollectHSS(self):
mySSH = SSH.SSHConnection()
mySSH.open(self.IPAddress, self.UserName, self.Password)
mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
mySSH.command('rm -f hss.log.zip', '\$', 5)
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
- mySSH.command('docker cp ' + self.containerPrefix + '-oai-hss:/openair-hss/hss_check_run.log .', '\$', 60)
- mySSH.command('docker cp ' + self.containerPrefix + '-oai-hss:/tmp/hss_check_run.pcap .', '\$', 60)
- mySSH.command('zip hss.log.zip hss_check_run.*', '\$', 60)
+ mySSH.command('docker inspect prod-oai-hss', '\$', 10)
+ result = re.search('No such object', mySSH.getBefore())
+ if result is not None:
+ mySSH.command('cd ../logs', '\$', 5)
+ mySSH.command('rm -f hss.log.zip', '\$', 5)
+ mySSH.command('zip hss.log.zip hss_*.*', '\$', 60)
+ mySSH.command('mv hss.log.zip ../scripts', '\$', 60)
+ else:
+ mySSH.command('docker cp ' + self.containerPrefix + '-oai-hss:/openair-hss/hss_check_run.log .', '\$', 60)
+ mySSH.command('docker cp ' + self.containerPrefix + '-oai-hss:/tmp/hss_check_run.pcap .', '\$', 60)
+ mySSH.command('zip hss.log.zip hss_check_run.*', '\$', 60)
elif re.match('OAI', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
mySSH.command('zip hss.log.zip hss*.log', '\$', 60)
mySSH.command('echo ' + self.Password + ' | sudo -S rm hss*.log', '\$', 5)
@@ -432,9 +563,17 @@ class EPCManagement():
mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
mySSH.command('rm -f mme.log.zip', '\$', 5)
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
- mySSH.command('docker cp ' + self.containerPrefix + '-oai-mme:/openair-mme/mme_check_run.log .', '\$', 60)
- mySSH.command('docker cp ' + self.containerPrefix + '-oai-mme:/tmp/mme_check_run.pcap .', '\$', 60)
- mySSH.command('zip mme.log.zip mme_check_run.*', '\$', 60)
+ mySSH.command('docker inspect prod-oai-mme', '\$', 10)
+ result = re.search('No such object', mySSH.getBefore())
+ if result is not None:
+ mySSH.command('cd ../logs', '\$', 5)
+ mySSH.command('rm -f mme.log.zip', '\$', 5)
+ mySSH.command('zip mme.log.zip mme_*.*', '\$', 60)
+ mySSH.command('mv mme.log.zip ../scripts', '\$', 60)
+ else:
+ mySSH.command('docker cp ' + self.containerPrefix + '-oai-mme:/openair-mme/mme_check_run.log .', '\$', 60)
+ mySSH.command('docker cp ' + self.containerPrefix + '-oai-mme:/tmp/mme_check_run.pcap .', '\$', 60)
+ mySSH.command('zip mme.log.zip mme_check_run.*', '\$', 60)
elif re.match('OAI', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
mySSH.command('zip mme.log.zip mme*.log', '\$', 60)
mySSH.command('echo ' + self.Password + ' | sudo -S rm mme*.log', '\$', 5)
@@ -451,11 +590,19 @@ class EPCManagement():
mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
mySSH.command('rm -f spgw.log.zip', '\$', 5)
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
- mySSH.command('docker cp ' + self.containerPrefix + '-oai-spgwc:/openair-spgwc/spgwc_check_run.log .', '\$', 60)
- mySSH.command('docker cp ' + self.containerPrefix + '-oai-spgwu-tiny:/openair-spgwu-tiny/spgwu_check_run.log .', '\$', 60)
- mySSH.command('docker cp ' + self.containerPrefix + '-oai-spgwc:/tmp/spgwc_check_run.pcap .', '\$', 60)
- mySSH.command('docker cp ' + self.containerPrefix + '-oai-spgwu-tiny:/tmp/spgwu_check_run.pcap .', '\$', 60)
- mySSH.command('zip spgw.log.zip spgw*_check_run.*', '\$', 60)
+ mySSH.command('docker inspect prod-oai-mme', '\$', 10)
+ result = re.search('No such object', mySSH.getBefore())
+ if result is not None:
+ mySSH.command('cd ../logs', '\$', 5)
+ mySSH.command('rm -f spgw.log.zip', '\$', 5)
+ mySSH.command('zip spgw.log.zip spgw*.*', '\$', 60)
+ mySSH.command('mv spgw.log.zip ../scripts', '\$', 60)
+ else:
+ mySSH.command('docker cp ' + self.containerPrefix + '-oai-spgwc:/openair-spgwc/spgwc_check_run.log .', '\$', 60)
+ mySSH.command('docker cp ' + self.containerPrefix + '-oai-spgwu-tiny:/openair-spgwu-tiny/spgwu_check_run.log .', '\$', 60)
+ mySSH.command('docker cp ' + self.containerPrefix + '-oai-spgwc:/tmp/spgwc_check_run.pcap .', '\$', 60)
+ mySSH.command('docker cp ' + self.containerPrefix + '-oai-spgwu-tiny:/tmp/spgwu_check_run.pcap .', '\$', 60)
+ mySSH.command('zip spgw.log.zip spgw*_check_run.*', '\$', 60)
elif re.match('OAI', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
mySSH.command('zip spgw.log.zip spgw*.log', '\$', 60)
mySSH.command('echo ' + self.Password + ' | sudo -S rm spgw*.log', '\$', 5)
diff --git a/ci-scripts/main.py b/ci-scripts/main.py
index 99ff662ea4..6594452ca4 100644
--- a/ci-scripts/main.py
+++ b/ci-scripts/main.py
@@ -296,6 +296,11 @@ def GetParametersFromXML(action):
if (string_field is not None):
EPC.mmeConfFile = string_field
+ elif action == 'Deploy_EPC':
+ string_field = test.findtext('parameters')
+ if (string_field is not None):
+ EPC.yamlPath = string_field
+
else: # ie action == 'Run_PhySim':
ldpc.runargs = test.findtext('physim_run_args')
@@ -503,7 +508,7 @@ elif re.match('^FinalizeHtml$', mode, re.IGNORECASE):
HTML.CreateHtmlFooter(CiTestObj.finalStatus)
elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re.IGNORECASE):
logging.debug('\u001B[1m----------------------------------------\u001B[0m')
- logging.debug('\u001B[1m Starting Scenario \u001B[0m')
+ logging.debug('\u001B[1m Starting Scenario: ' + CiTestObj.testXMLfiles[0] + '\u001B[0m')
logging.debug('\u001B[1m----------------------------------------\u001B[0m')
if re.match('^TesteNB$', mode, re.IGNORECASE):
if RAN.eNBIPAddress == '' or RAN.ranRepository == '' or RAN.ranBranch == '' or RAN.eNBUserName == '' or RAN.eNBPassword == '' or RAN.eNBSourceCodePath == '' or EPC.IPAddress == '' or EPC.UserName == '' or EPC.Password == '' or EPC.Type == '' or EPC.SourceCodePath == '' or CiTestObj.ADBIPAddress == '' or CiTestObj.ADBUserName == '' or CiTestObj.ADBPassword == '':
@@ -693,6 +698,10 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
EPC.InitializeSPGW()
elif action == 'Terminate_SPGW':
EPC.TerminateSPGW()
+ elif action == 'Deploy_EPC':
+ EPC.DeployEpc()
+ elif action == 'Undeploy_EPC':
+ EPC.UndeployEpc()
elif action == 'Initialize_FlexranCtrl':
CiTestObj.InitializeFlexranCtrl(HTML,RAN,EPC)
elif action == 'Terminate_FlexranCtrl':
@@ -715,14 +724,14 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
HTML.testStabilityPointReached = True
CiTestObj.FailReportCnt += 1
if CiTestObj.FailReportCnt == CiTestObj.repeatCounts[0] and RAN.prematureExit:
- logging.debug('Testsuite failed ' + str(CiTestObj.FailReportCnt) + ' time(s)')
+ logging.debug('Scenario failed ' + str(CiTestObj.FailReportCnt) + ' time(s)')
HTML.CreateHtmlTabFooter(False)
if CiTestObj.testUnstable and (CiTestObj.testStabilityPointReached or CiTestObj.testMinStableId == '999999'):
logging.debug('Scenario has reached minimal stability point -- Not a Failure')
else:
sys.exit('Failed Scenario')
else:
- logging.info('Testsuite passed after ' + str(CiTestObj.FailReportCnt) + ' time(s)')
+ logging.info('Scenario passed after ' + str(CiTestObj.FailReportCnt) + ' time(s)')
HTML.CreateHtmlTabFooter(True)
elif re.match('^LoadParams$', mode, re.IGNORECASE):
pass
diff --git a/ci-scripts/xml_class_list.yml b/ci-scripts/xml_class_list.yml
index 2c20988851..0ac30075c2 100755
--- a/ci-scripts/xml_class_list.yml
+++ b/ci-scripts/xml_class_list.yml
@@ -19,6 +19,8 @@
- Reboot_UE
- Initialize_FlexranCtrl
- Terminate_FlexranCtrl
+ - Deploy_EPC
+ - Undeploy_EPC
- Initialize_HSS
- Terminate_HSS
- Initialize_MME
diff --git a/ci-scripts/xml_files/fr1_oai_cn_deploy.xml b/ci-scripts/xml_files/fr1_oai_cn_deploy.xml
new file mode 100644
index 0000000000..919def7aa3
--- /dev/null
+++ b/ci-scripts/xml_files/fr1_oai_cn_deploy.xml
@@ -0,0 +1,39 @@
+
+
+ epc-deploy-tab
+ EPC-Deploy
+ log-in
+
+ 000100
+
+
+
+
+
+ Deploy_EPC
+ Deploy all EPC containers
+ yaml_files/fr1_epc_tim
+
+
+
diff --git a/ci-scripts/xml_files/fr1_oai_cn_undeploy.xml b/ci-scripts/xml_files/fr1_oai_cn_undeploy.xml
new file mode 100644
index 0000000000..76192efea1
--- /dev/null
+++ b/ci-scripts/xml_files/fr1_oai_cn_undeploy.xml
@@ -0,0 +1,38 @@
+
+
+ epc-undeploy-tab
+ EPC-Undeploy
+ log-out
+
+ 000200
+
+
+
+
+
+ Undeploy_EPC
+ Undeploy all EPC containers
+
+
+
diff --git a/ci-scripts/yaml_files/fr1_epc_tim/docker-compose.yml b/ci-scripts/yaml_files/fr1_epc_tim/docker-compose.yml
new file mode 100644
index 0000000000..85b726f37b
--- /dev/null
+++ b/ci-scripts/yaml_files/fr1_epc_tim/docker-compose.yml
@@ -0,0 +1,176 @@
+version: '3.8'
+
+services:
+ cassandra:
+ image: cassandra:2.1
+ container_name: prod-cassandra
+ networks:
+ private_net:
+ ipv4_address: 192.168.68.2
+ environment:
+ CASSANDRA_CLUSTER_NAME: "OAI HSS Cluster"
+ CASSANDRA_ENDPOINT_SNITCH: GossipingPropertyFileSnitch
+ healthcheck:
+ test: /bin/bash -c "nodetool status"
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+ db_init:
+ image: cassandra:2.1
+ container_name: prod-db-init
+ depends_on: [cassandra]
+ deploy:
+ restart_policy:
+ condition: on-failure
+ max_attempts: 10
+ networks:
+ private_net:
+ ipv4_address: 192.168.68.4
+ volumes:
+ - ./oai_db.cql:/home/oai_db.cql
+ entrypoint: /bin/bash -c "cqlsh --file /home/oai_db.cql 192.168.68.2 && echo 'OK'"
+
+ oai_hss:
+ image: oai-hss:production
+ container_name: prod-oai-hss
+ privileged: true
+ depends_on: [cassandra]
+ networks:
+ private_net:
+ ipv4_address: 192.168.68.3
+ public_net:
+ ipv4_address: 192.168.61.2
+ environment:
+ REALM: openairinterface.org
+ HSS_FQDN: hss.openairinterface.org
+ PREFIX: /openair-hss/etc
+ cassandra_Server_IP: 192.168.68.2
+ OP_KEY: 1006020f0a478bf6b699f15c062e42b3
+ LTE_K: fec86ba6eb707ed08905757b1bb44b8f
+ APN1: oai.ipv4
+ APN2: internet
+ FIRST_IMSI: 222010100001120
+ NB_USERS: 10
+ healthcheck:
+ test: /bin/bash -c "pgrep oai_hss"
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+ oai_mme:
+ image: oai-mme:production
+ container_name: prod-oai-mme
+ privileged: true
+ depends_on: [oai_hss]
+ networks:
+ public_net:
+ ipv4_address: 192.168.61.3
+ environment:
+ REALM: openairinterface.org
+ PREFIX: /openair-mme/etc
+ INSTANCE: 1
+ PID_DIRECTORY: /var/run
+ HSS_IP_ADDR: 192.168.61.2
+ HSS_HOSTNAME: hss
+ HSS_FQDN: hss.openairinterface.org
+ HSS_REALM: openairinterface.org
+ MCC: '222'
+ MNC: '01'
+ MME_GID: 32768
+ MME_CODE: 3
+ TAC_0: 1
+ TAC_1: 2
+ TAC_2: 3
+ MME_FQDN: mme.openairinterface.org
+ MME_S6A_IP_ADDR: 192.168.61.3
+ MME_INTERFACE_NAME_FOR_S1_MME: eth0
+ MME_IPV4_ADDRESS_FOR_S1_MME: 192.168.61.3
+ MME_INTERFACE_NAME_FOR_S11: eth0
+ MME_IPV4_ADDRESS_FOR_S11: 192.168.61.3
+ MME_INTERFACE_NAME_FOR_S10: lo
+ MME_IPV4_ADDRESS_FOR_S10: 127.0.0.10
+ OUTPUT: CONSOLE
+ SGW_IPV4_ADDRESS_FOR_S11_0: 192.168.61.4
+ PEER_MME_IPV4_ADDRESS_FOR_S10_0: 0.0.0.0
+ PEER_MME_IPV4_ADDRESS_FOR_S10_1: 0.0.0.0
+ MCC_SGW_0: '222'
+ MNC3_SGW_0: '001'
+ TAC_LB_SGW_0: '01'
+ TAC_HB_SGW_0: '00'
+ MCC_MME_0: '222'
+ MNC3_MME_0: '001'
+ TAC_LB_MME_0: '02'
+ TAC_HB_MME_0: '00'
+ MCC_MME_1: '222'
+ MNC3_MME_1: '001'
+ TAC_LB_MME_1: '03'
+ TAC_HB_MME_1: '00'
+ TAC_LB_SGW_TEST_0: '03'
+ TAC_HB_SGW_TEST_0: '00'
+ SGW_IPV4_ADDRESS_FOR_S11_TEST_0: 0.0.0.0
+ healthcheck:
+ test: /bin/bash -c "pgrep oai_mme"
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+ oai_spgwc:
+ image: oai-spgwc:production
+ privileged: true
+ depends_on: [oai_mme]
+ container_name: prod-oai-spgwc
+ networks:
+ public_net:
+ ipv4_address: 192.168.61.4
+ environment:
+ PID_DIRECTORY: /var/run
+ SGW_INTERFACE_NAME_FOR_S11: eth0
+ SGW_IP_FOR_S5_S8_CP: 127.0.0.11/8
+ PGW_IP_FOR_S5_S8_CP: 127.0.0.12/8
+ PGW_INTERFACE_NAME_FOR_SX: eth0
+ DEFAULT_APN: oai.ipv4
+ DEFAULT_DNS_IPV4_ADDRESS: 192.168.18.129
+ DEFAULT_DNS_SEC_IPV4_ADDRESS: 8.8.4.4
+ UE_IP_ADDRESS_POOL: '12.1.1.2 - 12.1.1.254'
+ PUSH_PROTOCOL_OPTION: 'yes'
+ healthcheck:
+ test: /bin/bash -c "pgrep oai_spgwc"
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+ oai_spgwu:
+ image: oai-spgwu-tiny:production
+ privileged: true
+ container_name: prod-oai-spgwu-tiny
+ depends_on: [oai_spgwc]
+ networks:
+ public_net:
+ ipv4_address: 192.168.61.5
+ environment:
+ PID_DIRECTORY: /var/run
+ INSTANCE: 1
+ SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP: eth0
+ PGW_INTERFACE_NAME_FOR_SGI: eth0
+ SGW_INTERFACE_NAME_FOR_SX: eth0
+ SPGWC0_IP_ADDRESS: 192.168.61.4
+ NETWORK_UE_IP: '12.1.1.0/24'
+ NETWORK_UE_NAT_OPTION: 'yes'
+ healthcheck:
+ test: /bin/bash -c "pgrep oai_spgwu"
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+networks:
+ private_net:
+ name: prod-oai-private-net
+ ipam:
+ config:
+ - subnet: 192.168.68.0/26
+ public_net:
+ name: prod-oai-public-net
+ ipam:
+ config:
+ - subnet: 192.168.61.0/26