Commit 1cd990c0 authored by Jaroslava Fiedlerova's avatar Jaroslava Fiedlerova

Merge remote-tracking branch 'origin/ci-multi-fixes' into integration_2024_w17

parents 132c0738 da57e236
...@@ -25,8 +25,8 @@ allow dynamic UE creation from remote API */ ...@@ -25,8 +25,8 @@ allow dynamic UE creation from remote API */
rf_port: 0, rf_port: 0,
bandwidth: 20, bandwidth: 20,
band: 78, band: 78,
dl_nr_arfcn:627360, dl_nr_arfcn:630048,
ssb_nr_arfcn:627360, ssb_nr_arfcn:630048,
subcarrier_spacing: 30, subcarrier_spacing: 30,
n_antenna_dl: N_ANTENNA_DL, n_antenna_dl: N_ANTENNA_DL,
n_antenna_ul: N_ANTENNA_UL, n_antenna_ul: N_ANTENNA_UL,
...@@ -39,7 +39,7 @@ allow dynamic UE creation from remote API */ ...@@ -39,7 +39,7 @@ allow dynamic UE creation from remote API */
ue_list: [ ue_list: [
{ {
"ue_id" : 1, "ue_id" : 1,
"imsi": "208970000000111", "imsi": "001020000000001",
"K": "fec86ba6eb707ed08905757b1bb44b8f", "K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage", "sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3", "op": "1006020f0a478bf6b699f15c062e42b3",
...@@ -54,7 +54,7 @@ allow dynamic UE creation from remote API */ ...@@ -54,7 +54,7 @@ allow dynamic UE creation from remote API */
}, },
{ {
"ue_id" : 2, "ue_id" : 2,
"imsi": "208970000000112", "imsi": "001020000000002",
"K": "fec86ba6eb707ed08905757b1bb44b8f", "K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage", "sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3", "op": "1006020f0a478bf6b699f15c062e42b3",
...@@ -69,7 +69,7 @@ allow dynamic UE creation from remote API */ ...@@ -69,7 +69,7 @@ allow dynamic UE creation from remote API */
}, },
{ {
"ue_id" : 3, "ue_id" : 3,
"imsi": "208970000000113", "imsi": "001020000000003",
"K": "fec86ba6eb707ed08905757b1bb44b8f", "K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage", "sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3", "op": "1006020f0a478bf6b699f15c062e42b3",
...@@ -84,7 +84,7 @@ allow dynamic UE creation from remote API */ ...@@ -84,7 +84,7 @@ allow dynamic UE creation from remote API */
}, },
{ {
"ue_id" : 4, "ue_id" : 4,
"imsi": "208970000000114", "imsi": "001020000000004",
"K": "fec86ba6eb707ed08905757b1bb44b8f", "K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage", "sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3", "op": "1006020f0a478bf6b699f15c062e42b3",
...@@ -99,7 +99,7 @@ allow dynamic UE creation from remote API */ ...@@ -99,7 +99,7 @@ allow dynamic UE creation from remote API */
}, },
{ {
"ue_id" : 5, "ue_id" : 5,
"imsi": "208970000000115", "imsi": "001020000000005",
"K": "fec86ba6eb707ed08905757b1bb44b8f", "K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage", "sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3", "op": "1006020f0a478bf6b699f15c062e42b3",
...@@ -114,7 +114,7 @@ allow dynamic UE creation from remote API */ ...@@ -114,7 +114,7 @@ allow dynamic UE creation from remote API */
}, },
{ {
"ue_id" : 6, "ue_id" : 6,
"imsi": "208970000000116", "imsi": "001020000000006",
"K": "fec86ba6eb707ed08905757b1bb44b8f", "K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage", "sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3", "op": "1006020f0a478bf6b699f15c062e42b3",
...@@ -129,7 +129,7 @@ allow dynamic UE creation from remote API */ ...@@ -129,7 +129,7 @@ allow dynamic UE creation from remote API */
}, },
{ {
"ue_id" : 7, "ue_id" : 7,
"imsi": "208970000000100", "imsi": "001020000000007",
"K": "fec86ba6eb707ed08905757b1bb44b8f", "K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage", "sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3", "op": "1006020f0a478bf6b699f15c062e42b3",
...@@ -144,7 +144,7 @@ allow dynamic UE creation from remote API */ ...@@ -144,7 +144,7 @@ allow dynamic UE creation from remote API */
}, },
{ {
"ue_id" : 8, "ue_id" : 8,
"imsi": "208970000000102", "imsi": "001020000000008",
"K": "fec86ba6eb707ed08905757b1bb44b8f", "K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage", "sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3", "op": "1006020f0a478bf6b699f15c062e42b3",
...@@ -159,7 +159,7 @@ allow dynamic UE creation from remote API */ ...@@ -159,7 +159,7 @@ allow dynamic UE creation from remote API */
}, },
{ {
"ue_id" : 9, "ue_id" : 9,
"imsi": "208970000000103", "imsi": "001020000000009",
"K": "fec86ba6eb707ed08905757b1bb44b8f", "K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage", "sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3", "op": "1006020f0a478bf6b699f15c062e42b3",
...@@ -174,7 +174,7 @@ allow dynamic UE creation from remote API */ ...@@ -174,7 +174,7 @@ allow dynamic UE creation from remote API */
}, },
{ {
"ue_id" : 10, "ue_id" : 10,
"imsi": "208970000000104", "imsi": "001020000000010",
"K": "fec86ba6eb707ed08905757b1bb44b8f", "K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage", "sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3", "op": "1006020f0a478bf6b699f15c062e42b3",
...@@ -189,7 +189,7 @@ allow dynamic UE creation from remote API */ ...@@ -189,7 +189,7 @@ allow dynamic UE creation from remote API */
}, },
{ {
"ue_id" : 11, "ue_id" : 11,
"imsi": "208970000000110", "imsi": "001020000000011",
"K": "fec86ba6eb707ed08905757b1bb44b8f", "K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage", "sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3", "op": "1006020f0a478bf6b699f15c062e42b3",
...@@ -204,7 +204,7 @@ allow dynamic UE creation from remote API */ ...@@ -204,7 +204,7 @@ allow dynamic UE creation from remote API */
}, },
{ {
"ue_id" : 12, "ue_id" : 12,
"imsi": "208970000000105", "imsi": "001020000000012",
"K": "fec86ba6eb707ed08905757b1bb44b8f", "K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage", "sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3", "op": "1006020f0a478bf6b699f15c062e42b3",
...@@ -219,7 +219,7 @@ allow dynamic UE creation from remote API */ ...@@ -219,7 +219,7 @@ allow dynamic UE creation from remote API */
}, },
{ {
"ue_id" : 13, "ue_id" : 13,
"imsi": "208970000000106", "imsi": "001020000000013",
"K": "fec86ba6eb707ed08905757b1bb44b8f", "K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage", "sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3", "op": "1006020f0a478bf6b699f15c062e42b3",
...@@ -234,7 +234,7 @@ allow dynamic UE creation from remote API */ ...@@ -234,7 +234,7 @@ allow dynamic UE creation from remote API */
}, },
{ {
"ue_id" : 14, "ue_id" : 14,
"imsi": "208970000000107", "imsi": "001020000000014",
"K": "fec86ba6eb707ed08905757b1bb44b8f", "K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage", "sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3", "op": "1006020f0a478bf6b699f15c062e42b3",
...@@ -249,7 +249,7 @@ allow dynamic UE creation from remote API */ ...@@ -249,7 +249,7 @@ allow dynamic UE creation from remote API */
}, },
{ {
"ue_id" : 15, "ue_id" : 15,
"imsi": "208970000000108", "imsi": "001020000000015",
"K": "fec86ba6eb707ed08905757b1bb44b8f", "K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage", "sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3", "op": "1006020f0a478bf6b699f15c062e42b3",
...@@ -264,7 +264,7 @@ allow dynamic UE creation from remote API */ ...@@ -264,7 +264,7 @@ allow dynamic UE creation from remote API */
}, },
{ {
"ue_id" : 16, "ue_id" : 16,
"imsi": "208970000000109", "imsi": "001020000000016",
"K": "fec86ba6eb707ed08905757b1bb44b8f", "K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage", "sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3", "op": "1006020f0a478bf6b699f15c062e42b3",
......
/* UE simulator configuration file version 2021-06-17
* LTE / 5G Non StandAlone
* Copyright (C) 2019-2021 Amarisoft
*/
{
#define N_ANTENNA_DL 2
#define TDD 1
log_options: "all.level=warn,all.max_size=0,nas.level=debug,nas.max_size=1,rrc.level=debug,rrc.max_size=1",
log_filename: "/tmp/ue.log",
/* Enable remote API and Web interface */
com_addr: "0.0.0.0:9002",
include "rf_driver/1chan.cfg",
/* If true, allow the simulation of several UEs at the same time and
allow dynamic UE creation from remote API */
cell_groups: [{
group_type: "nr",
multi_ue: true,
cells: [{
rf_port: 0,
bandwidth: 20,
band: 78,
dl_nr_arfcn:627360,
ssb_nr_arfcn:627360,
subcarrier_spacing: 30,
n_antenna_dl: N_ANTENNA_DL,
n_antenna_ul: 1,
rx_to_tx_latency:2,
}],
}],
/* UE capabilities */
/* USIM data */
ue_list: [
{
"ue_id" : 1,
"imsi": "208970000000111",
"K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3",
as_release: 15,
ue_category: "nr",
apn:"oai",
attach_pdn_type:"ipv4",
default_nssai: [ { sst: 1, }, ],
default_pdu_session_snssai: { sst: 1, },
tun_setup_script: "ue-ifup",
},
{
"ue_id" : 2,
"imsi": "208970000000112",
"K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3",
as_release: 15,
ue_category: "nr",
apn:"oai",
attach_pdn_type:"ipv4",
default_nssai: [ { sst: 1, }, ],
default_pdu_session_snssai: { sst: 1, },
tun_setup_script: "ue-ifup",
},
{
"ue_id" : 3,
"imsi": "208970000000113",
"K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3",
as_release: 15,
ue_category: "nr",
apn:"oai",
attach_pdn_type:"ipv4",
default_nssai: [ { sst: 1, }, ],
default_pdu_session_snssai: { sst: 1, },
tun_setup_script: "ue-ifup",
},
{
"ue_id" : 4,
"imsi": "208970000000114",
"K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3",
as_release: 15,
ue_category: "nr",
apn:"oai",
attach_pdn_type:"ipv4",
default_nssai: [ { sst: 1, }, ],
default_pdu_session_snssai: { sst: 1, },
tun_setup_script: "ue-ifup",
},
{
"ue_id" : 5,
"imsi": "208970000000115",
"K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3",
as_release: 15,
ue_category: "nr",
apn:"oai",
attach_pdn_type:"ipv4",
default_nssai: [ { sst: 1, }, ],
default_pdu_session_snssai: { sst: 1, },
tun_setup_script: "ue-ifup",
},
{
"ue_id" : 6,
"imsi": "208970000000116",
"K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3",
as_release: 15,
ue_category: "nr",
apn:"oai",
attach_pdn_type:"ipv4",
default_nssai: [ { sst: 1, }, ],
default_pdu_session_snssai: { sst: 1, },
tun_setup_script: "ue-ifup",
},
{
"ue_id" : 7,
"imsi": "208970000000117",
"K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3",
as_release: 15,
ue_category: "nr",
apn:"oai",
attach_pdn_type:"ipv4",
default_nssai: [ { sst: 1, }, ],
default_pdu_session_snssai: { sst: 1, },
tun_setup_script: "ue-ifup",
},
{
"ue_id" : 8,
"imsi": "208970000000118",
"K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3",
as_release: 15,
ue_category: "nr",
apn:"oai",
attach_pdn_type:"ipv4",
default_nssai: [ { sst: 1, }, ],
default_pdu_session_snssai: { sst: 1, },
tun_setup_script: "ue-ifup",
},
{
"ue_id" : 9,
"imsi": "208970000000119",
"K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3",
as_release: 15,
ue_category: "nr",
apn:"oai",
attach_pdn_type:"ipv4",
default_nssai: [ { sst: 1, }, ],
default_pdu_session_snssai: { sst: 1, },
tun_setup_script: "ue-ifup",
},
{
"ue_id" : 10,
"imsi": "208970000000120",
"K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3",
as_release: 15,
ue_category: "nr",
apn:"oai",
attach_pdn_type:"ipv4",
default_nssai: [ { sst: 1, }, ],
default_pdu_session_snssai: { sst: 1, },
tun_setup_script: "ue-ifup",
},
{
"ue_id" : 11,
"imsi": "208970000000121",
"K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3",
as_release: 15,
ue_category: "nr",
apn:"oai",
attach_pdn_type:"ipv4",
default_nssai: [ { sst: 1, }, ],
default_pdu_session_snssai: { sst: 1, },
tun_setup_script: "ue-ifup",
},
{
"ue_id" : 12,
"imsi": "208970000000122",
"K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3",
as_release: 15,
ue_category: "nr",
apn:"oai",
attach_pdn_type:"ipv4",
default_nssai: [ { sst: 1, }, ],
default_pdu_session_snssai: { sst: 1, },
tun_setup_script: "ue-ifup",
},
{
"ue_id" : 13,
"imsi": "208970000000123",
"K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3",
as_release: 15,
ue_category: "nr",
apn:"oai",
attach_pdn_type:"ipv4",
default_nssai: [ { sst: 1, }, ],
default_pdu_session_snssai: { sst: 1, },
tun_setup_script: "ue-ifup",
},
{
"ue_id" : 14,
"imsi": "208970000000124",
"K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3",
as_release: 15,
ue_category: "nr",
apn:"oai",
attach_pdn_type:"ipv4",
default_nssai: [ { sst: 1, }, ],
default_pdu_session_snssai: { sst: 1, },
tun_setup_script: "ue-ifup",
},
{
"ue_id" : 15,
"imsi": "208970000000125",
"K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3",
as_release: 15,
ue_category: "nr",
apn:"oai",
attach_pdn_type:"ipv4",
default_nssai: [ { sst: 1, }, ],
default_pdu_session_snssai: { sst: 1, },
tun_setup_script: "ue-ifup",
},
{
"ue_id" : 16,
"imsi": "208970000000126",
"K": "fec86ba6eb707ed08905757b1bb44b8f",
"sim_algo":"milenage",
"op": "1006020f0a478bf6b699f15c062e42b3",
as_release: 15,
ue_category: "nr",
apn:"oai",
attach_pdn_type:"ipv4",
default_nssai: [ { sst: 1, }, ],
default_pdu_session_snssai: { sst: 1, },
tun_setup_script: "ue-ifup",
},
],
}
...@@ -97,7 +97,7 @@ ltebox-nepes: ...@@ -97,7 +97,7 @@ ltebox-nepes:
amarisoft_ue: amarisoft_ue:
Host: amariue Host: amariue
InitScript: /root/lteue-linux-2023-10-27/ue/lteue /root/oaicicd/ran_sa_aw2s_asue_2x2/aw2s-multi-20897-2x2.cfg & InitScript: /root/lteue-linux-2023-10-27/ue/lteue /root/oaicicd/ran_sa_aw2s_asue_2x2/aw2s-multi-00102-2x2.cfg &
TermScript: /root/2023-10-27/libs/ws.js -t 10 127.0.0.1:9002 '{"message":"quit"}' || killall -KILL lteue-avx2 TermScript: /root/2023-10-27/libs/ws.js -t 10 127.0.0.1:9002 '{"message":"quit"}' || killall -KILL lteue-avx2
amarisoft_ue_1: amarisoft_ue_1:
Host: amariue Host: amariue
......
...@@ -44,6 +44,9 @@ OCUrl = "https://api.oai.cs.eurecom.fr:6443" ...@@ -44,6 +44,9 @@ OCUrl = "https://api.oai.cs.eurecom.fr:6443"
OCRegistry = "default-route-openshift-image-registry.apps.oai.cs.eurecom.fr/" OCRegistry = "default-route-openshift-image-registry.apps.oai.cs.eurecom.fr/"
CI_OC_RAN_NAMESPACE = "oaicicd-ran" CI_OC_RAN_NAMESPACE = "oaicicd-ran"
CI_OC_CORE_NAMESPACE = "oaicicd-core-for-ci-ran" CI_OC_CORE_NAMESPACE = "oaicicd-core-for-ci-ran"
CN_IMAGES = ["mysql", "oai-nrf", "oai-amf", "oai-smf", "oai-upf", "oai-ausf", "oai-udm", "oai-udr", "oai-traffic-server"]
CN_CONTAINERS = ["", "-c nrf", "-c amf", "-c smf", "-c upf", "-c ausf", "-c udm", "-c udr", ""]
def OC_login(cmd, ocUserName, ocPassword, ocProjectName): def OC_login(cmd, ocUserName, ocPassword, ocProjectName):
if ocUserName == '' or ocPassword == '' or ocProjectName == '': if ocUserName == '' or ocPassword == '' or ocProjectName == '':
...@@ -65,6 +68,51 @@ def OC_login(cmd, ocUserName, ocPassword, ocProjectName): ...@@ -65,6 +68,51 @@ def OC_login(cmd, ocUserName, ocPassword, ocProjectName):
def OC_logout(cmd): def OC_logout(cmd):
cmd.run(f'oc logout') cmd.run(f'oc logout')
def OC_deploy_CN(cmd, ocUserName, ocPassword):
logging.debug('OC OAI CN5G: Deploying OAI CN5G on Openshift Cluster')
path = "/opt/oai-cn5g-fed-develop-2024-april-00102"
succeeded = OC_login(cmd, ocUserName, ocPassword, CI_OC_CORE_NAMESPACE)
if not succeeded:
return False, CONST.OC_LOGIN_FAIL
cmd.run('helm uninstall oai5gcn --wait --timeout 60s')
ret = cmd.run(f'helm install --wait --timeout 60s oai5gcn {path}/ci-scripts/charts/oai-5g-basic/.')
if ret.returncode != 0:
logging.error('OC OAI CN5G: Deployment failed')
OC_logout(cmd)
return False, CONST.OC_PROJECT_FAIL
report = cmd.run('oc get pods')
OC_logout(cmd)
return True, report
def OC_undeploy_CN(cmd, ocUserName, ocPassword):
logging.debug('OC OAI CN5G: Terminating CN on Openshift Cluster')
path = "/opt/oai-cn5g-fed-develop-2024-april-00102"
succeeded = OC_login(cmd, ocUserName, ocPassword, CI_OC_CORE_NAMESPACE)
if not succeeded:
return False, CONST.OC_LOGIN_FAIL
cmd.run(f'rm -Rf {path}/logs')
cmd.run(f'mkdir -p {path}/logs')
logging.debug('OC OAI CN5G: Collecting log files to workspace')
cmd.run(f'oc describe pod &> {path}/logs/describe-pods-post-test.log')
cmd.run(f'oc get pods.metrics.k8s &> {path}/logs/nf-resource-consumption.log')
for ii, ci in zip(CN_IMAGES, CN_CONTAINERS):
podName = cmd.run(f"oc get pods | grep {ii} | awk \'{{print $1}}\'").stdout.strip()
if not podName:
logging.debug(f'{ii} pod not found!')
else:
cmd.run(f'oc logs -f {podName} {ci} &> {path}/logs/{ii}.log &')
cmd.run(f'cd {path}/logs && zip -r -qq test_logs_CN.zip *.log')
cmd.copyin(f'{path}/logs/test_logs_CN.zip','test_logs_CN.zip')
ret = cmd.run('helm uninstall --wait --timeout 60s oai5gcn')
if ret.returncode != 0:
logging.error('OC OAI CN5G: Undeployment failed')
cmd.run('helm uninstall --wait --timeout 60s oai5gcn')
OC_logout(cmd)
return False, CONST.OC_PROJECT_FAIL
report = cmd.run('oc get pods')
OC_logout(cmd)
return True, report
class Cluster: class Cluster:
def __init__(self): def __init__(self):
self.eNBIPAddress = "" self.eNBIPAddress = ""
......
...@@ -129,10 +129,10 @@ def Iperf_analyzeV3BIDIRJson(filename): ...@@ -129,10 +129,10 @@ def Iperf_analyzeV3BIDIRJson(filename):
with open(filename) as file: with open(filename) as file:
filename = json.load(file) filename = json.load(file)
try: try:
sender_bitrate_dl = round(filename['end']['streams'][0]['sender']['bits_per_second']/1000000,2) sender_bitrate_ul = round(filename['end']['streams'][0]['sender']['bits_per_second']/1000000,2)
receiver_bitrate_dl = round(filename['end']['streams'][0]['receiver']['bits_per_second']/1000000,2) receiver_bitrate_ul = round(filename['end']['streams'][0]['receiver']['bits_per_second']/1000000,2)
sender_bitrate_ul = round(filename['end']['streams'][1]['sender']['bits_per_second']/1000000,2) sender_bitrate_dl = round(filename['end']['streams'][1]['sender']['bits_per_second']/1000000,2)
receiver_bitrate_ul = round(filename['end']['streams'][1]['receiver']['bits_per_second']/1000000,2) receiver_bitrate_dl = round(filename['end']['streams'][1]['receiver']['bits_per_second']/1000000,2)
except Exception as e: except Exception as e:
return (False, 'Could not compute BIDIR bitrate!') return (False, 'Could not compute BIDIR bitrate!')
......
...@@ -204,8 +204,8 @@ MACRLCs = ( ...@@ -204,8 +204,8 @@ MACRLCs = (
bler_target_upper = 20.0; bler_target_upper = 20.0;
bler_target_lower = 10.0; bler_target_lower = 10.0;
max_ul_rb_index = 27; max_ul_rb_index = 27;
puSch10xSnr = 190; puSch10xSnr = 250;
puCch10xSnr = 160; puCch10xSnr = 230;
} }
); );
...@@ -224,8 +224,8 @@ RUs = ( ...@@ -224,8 +224,8 @@ RUs = (
local_rf = "yes" local_rf = "yes"
nb_tx = 2 nb_tx = 2
nb_rx = 2 nb_rx = 2
att_tx = 10 att_tx = 12
att_rx = 5; att_rx = 0;
bands = [38]; bands = [38];
max_pdschReferenceSignalPower = -27; max_pdschReferenceSignalPower = -27;
max_rxgain = 75; max_rxgain = 75;
......
...@@ -204,8 +204,8 @@ MACRLCs = ( ...@@ -204,8 +204,8 @@ MACRLCs = (
bler_target_upper = 20.0; bler_target_upper = 20.0;
bler_target_lower = 10.0; bler_target_lower = 10.0;
max_ul_rb_index = 27; max_ul_rb_index = 27;
puSch10xSnr = 190; puSch10xSnr = 280;
puCch10xSnr = 160; puCch10xSnr = 250;
} }
); );
...@@ -224,8 +224,8 @@ RUs = ( ...@@ -224,8 +224,8 @@ RUs = (
local_rf = "yes" local_rf = "yes"
nb_tx = 2 nb_tx = 2
nb_rx = 2 nb_rx = 2
att_tx = 10 att_tx = 18
att_rx = 5; att_rx = 0;
bands = [38]; bands = [38];
max_pdschReferenceSignalPower = -27; max_pdschReferenceSignalPower = -27;
max_rxgain = 75; max_rxgain = 75;
......
...@@ -167,19 +167,12 @@ gNBs = ...@@ -167,19 +167,12 @@ gNBs =
////////// AMF parameters: ////////// AMF parameters:
amf_ip_address = ( { ipv4 = "192.168.61.132"; amf_ip_address = ({ ipv4 = "192.168.61.132"; });
ipv6 = "192:168:30::17";
active = "yes";
preference = "ipv4";
}
);
NETWORK_INTERFACES : NETWORK_INTERFACES :
{ {
GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai";
GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.61.129/26"; GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.61.129/26";
GNB_INTERFACE_NAME_FOR_NGU = "demo-oai";
GNB_IPV4_ADDRESS_FOR_NGU = "192.168.61.129/26"; GNB_IPV4_ADDRESS_FOR_NGU = "192.168.61.129/26";
GNB_PORT_FOR_S1U = 2152; # Spec 2152 GNB_PORT_FOR_S1U = 2152; # Spec 2152
}; };
......
...@@ -164,20 +164,11 @@ gNBs = ( ...@@ -164,20 +164,11 @@ gNBs = (
////////// AMF parameters: ////////// AMF parameters:
amf_ip_address = ( amf_ip_address = ({ ipv4 = "192.168.61.132"; });
{
ipv4 = "192.168.61.132";
ipv6 = "192:168:30::17";
active = "yes";
preference = "ipv4";
}
);
NETWORK_INTERFACES : NETWORK_INTERFACES :
{ {
GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai";
GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.61.129/24"; GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.61.129/24";
GNB_INTERFACE_NAME_FOR_NGU = "demo-oai";
GNB_IPV4_ADDRESS_FOR_NGU = "192.168.61.129/24"; GNB_IPV4_ADDRESS_FOR_NGU = "192.168.61.129/24";
GNB_PORT_FOR_S1U = 2152; # Spec 2152 GNB_PORT_FOR_S1U = 2152; # Spec 2152
} }
......
...@@ -13,7 +13,7 @@ gNBs = ...@@ -13,7 +13,7 @@ gNBs =
// Tracking area code, 0x0000 and 0xfffe are reserved values // Tracking area code, 0x0000 and 0xfffe are reserved values
tracking_area_code = 1; tracking_area_code = 1;
plmn_list = ({ mcc = 208; mnc = 97; mnc_length = 2; snssaiList = ({sst = 1;}); }); plmn_list = ({ mcc = 001; mnc = 02; mnc_length = 2; snssaiList = ({sst = 1;}); });
nr_cellid = 12345678L nr_cellid = 12345678L
......
...@@ -16,7 +16,7 @@ gNBs = ...@@ -16,7 +16,7 @@ gNBs =
// Tracking area code, 0x0000 and 0xfffe are reserved values // Tracking area code, 0x0000 and 0xfffe are reserved values
tracking_area_code = 0x1; tracking_area_code = 0x1;
plmn_list = ({ mcc = 208; mnc = 97; mnc_length = 2; snssaiList = ({ sst =0x1; }) }); plmn_list = ({ mcc = 001; mnc = 02; mnc_length = 2; snssaiList = ({ sst =0x1; }) });
nr_cellid = 12345678L nr_cellid = 12345678L
...@@ -35,10 +35,10 @@ gNBs = ...@@ -35,10 +35,10 @@ gNBs =
# downlinkConfigCommon # downlinkConfigCommon
#frequencyInfoDL #frequencyInfoDL
# this is 3410.4 MHz => 301 REs from PointA 25 PRBs + 1 RE # this is 3410.4 MHz => 301 REs from PointA 25 PRBs + 1 RE
absoluteFrequencySSB = 627360; absoluteFrequencySSB = 630048;
dl_frequencyBand = 78; dl_frequencyBand = 78;
# this is 3410.4 - (51*12*30e-3/2) = 3401.22 MHz # this is 3410.4 - (51*12*30e-3/2) = 3401.22 MHz
dl_absoluteFrequencyPointA = 626748; dl_absoluteFrequencyPointA = 629436;
#scs-SpecificCarrierList #scs-SpecificCarrierList
dl_offstToCarrier = 0; dl_offstToCarrier = 0;
# subcarrierSpacing # subcarrierSpacing
......
...@@ -298,39 +298,18 @@ class EPCManagement(): ...@@ -298,39 +298,18 @@ class EPCManagement():
html_cell += '(' + res4.group('date') + ')' html_cell += '(' + res4.group('date') + ')'
html_cell += '\n' html_cell += '\n'
elif re.match('OC-OAI-CN5G', self.Type, re.IGNORECASE): elif re.match('OC-OAI-CN5G', self.Type, re.IGNORECASE):
self.testCase_id = HTML.testCase_id succeeded, report = OC.OC_deploy_CN(mySSH, self.OCUserName, self.OCPassword)
imageNames = ["oai-nrf", "oai-amf", "oai-smf", "oai-spgwu-tiny", "oai-ausf", "oai-udm", "oai-udr", "mysql","oai-traffic-server"]
logging.debug('Deploying OAI CN5G on Openshift Cluster')
lIpAddr = self.IPAddress
lSourcePath = "/opt/oai-cn5g-fed-develop-2023-04-28-20897"
succeeded = OC.OC_login(mySSH, self.OCUserName, self.OCPassword, OC.CI_OC_CORE_NAMESPACE)
if not succeeded: if not succeeded:
logging.error('\u001B[1m OC Cluster Login Failed\u001B[0m') HTML.CreateHtmlTestRow('N/A', 'KO', report)
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_LOGIN_FAIL) HTML.CreateHtmlTabFooter(False)
return False
for ii in imageNames:
mySSH.run(f'helm uninstall {ii}', reportNonZero=False)
mySSH.run(f'helm spray {lSourcePath}/ci-scripts/charts/oai-5g-basic/.')
ret = mySSH.run(f'oc get pods', silent=True)
if ret.stdout.count('Running') != 9:
logging.error('\u001B[1m Deploying 5GCN Failed using helm chart on OC Cluster\u001B[0m')
for ii in imageNames:
mySSH.run('helm uninstall '+ ii)
ret = mySSH.run(f'oc get pods')
if re.search('No resources found', ret.stdout):
logging.debug('All pods uninstalled')
OC.OC_logout(mySSH)
mySSH.close() mySSH.close()
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_PROJECT_FAIL) sys.exit("OC OAI CN5G: CN deployment failed!")
return False for line in report.stdout.split('\n')[1:]:
ret = mySSH.run(f'oc get pods', silent=True)
for line in ret.stdout.split('\n')[1:]:
columns = line.strip().split() columns = line.strip().split()
name = columns[0] name = columns[0]
status = columns[2] status = columns[2]
html_cell += status + ' ' + name html_cell += status + ' ' + name
html_cell += '\n' html_cell += '\n'
OC.OC_logout(mySSH)
else: else:
logging.error('This option should not occur!') logging.error('This option should not occur!')
mySSH.close() mySSH.close()
...@@ -562,8 +541,6 @@ class EPCManagement(): ...@@ -562,8 +541,6 @@ class EPCManagement():
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK) HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
def Terminate5GCN(self, HTML): def Terminate5GCN(self, HTML):
imageNames = ["mysql", "oai-nrf", "oai-amf", "oai-smf", "oai-spgwu-tiny", "oai-ausf", "oai-udm", "oai-udr", "oai-traffic-server"]
containerInPods = ["", "-c nrf", "-c amf", "-c smf", "-c spgwu", "-c ausf", "-c udm", "-c udr", ""]
mySSH = cls_cmd.getConnection(self.IPAddress) mySSH = cls_cmd.getConnection(self.IPAddress)
message = '' message = ''
if re.match('ltebox', self.Type, re.IGNORECASE): if re.match('ltebox', self.Type, re.IGNORECASE):
...@@ -598,36 +575,13 @@ class EPCManagement(): ...@@ -598,36 +575,13 @@ class EPCManagement():
mySSH.copyin(f'{self.SourceCodePath}/logs/test_logs_CN.zip','test_logs_CN.zip') mySSH.copyin(f'{self.SourceCodePath}/logs/test_logs_CN.zip','test_logs_CN.zip')
logging.debug(message) logging.debug(message)
elif re.match('OC-OAI-CN5G', self.Type, re.IGNORECASE): elif re.match('OC-OAI-CN5G', self.Type, re.IGNORECASE):
logging.debug('Terminating OAI CN5G on Openshift Cluster') succeeded, report = OC.OC_undeploy_CN(mySSH, self.OCUserName, self.OCPassword)
lIpAddr = self.IPAddress
lSourcePath = self.SourceCodePath
mySSH.run(f'rm -Rf {lSourcePath}/logs')
mySSH.run(f'mkdir -p {lSourcePath}/logs')
logging.debug('OC OAI CN5G - Collecting Log files to workspace')
succeeded = OC.OC_login(mySSH, self.OCUserName, self.OCPassword, OC.CI_OC_CORE_NAMESPACE)
if not succeeded: if not succeeded:
logging.error('\u001B[1m OC Cluster Login Failed\u001B[0m') HTML.CreateHtmlTestRow('N/A', 'KO', report)
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_LOGIN_FAIL)
return False
mySSH.run(f'oc describe pod &> {lSourcePath}/logs/describe-pods-post-test.log')
mySSH.run(f'oc get pods.metrics.k8s &> {lSourcePath}/logs/nf-resource-consumption.log')
for ii, ci in zip(imageNames, containerInPods):
podName = mySSH.run(f"oc get pods | grep {ii} | awk \'{{print $1}}\'").stdout.strip()
if not podName:
logging.debug(f'{ii} pod not found!')
HTML.CreateHtmlTestRow(self.Type, 'KO', CONST.INVALID_PARAMETER)
HTML.CreateHtmlTabFooter(False) HTML.CreateHtmlTabFooter(False)
mySSH.run(f'oc logs -f {podName} {ci} &> {lSourcePath}/logs/{ii}.log &') sys.exit("OC OAI CN5G: CN undeployment failed!")
mySSH.run(f'helm uninstall {ii}') else:
podName = '' message = report.stdout
mySSH.run(f'cd {lSourcePath}/logs && zip -r -qq test_logs_CN.zip *.log')
mySSH.copyin(f'{lSourcePath}/logs/test_logs_CN.zip','test_logs_CN.zip')
ret = mySSH.run(f'oc get pods', silent=True)
res = re.search(f'No resources found in {OC.CI_OC_CORE_NAMESPACE} namespace.', ret.stdout)
if res is not None:
logging.debug('OC OAI CN5G components uninstalled')
message = 'OC OAI CN5G components uninstalled'
OC.OC_logout(mySSH)
else: else:
logging.error('This should not happen!') logging.error('This should not happen!')
mySSH.close() mySSH.close()
......
...@@ -31,15 +31,15 @@ ...@@ -31,15 +31,15 @@
111111 111111
100000 100000
010010 010010
030101 031101
010001 010001
000001 000001
050000 051000
050001 051001
070000 071000
070001 071001
010010 010010
030201 031201
</TestCaseRequestedList> </TestCaseRequestedList>
<TestCaseExclusionList></TestCaseExclusionList> <TestCaseExclusionList></TestCaseExclusionList>
...@@ -65,7 +65,7 @@ ...@@ -65,7 +65,7 @@
<command>sudo cpupower idle-set -E</command> <command>sudo cpupower idle-set -E</command>
</testCase> </testCase>
<testCase id="030101"> <testCase id="031101">
<class>Deploy_Object</class> <class>Deploy_Object</class>
<desc>Deploy eNB (TDD/Band38/2.6Ghz/N3XX) in a container</desc> <desc>Deploy eNB (TDD/Band38/2.6Ghz/N3XX) in a container</desc>
<yaml_path>ci-scripts/yaml_files/lte_n3xx_tdd_2x2_tm2</yaml_path> <yaml_path>ci-scripts/yaml_files/lte_n3xx_tdd_2x2_tm2</yaml_path>
...@@ -85,7 +85,7 @@ ...@@ -85,7 +85,7 @@
<id>up2</id> <id>up2</id>
</testCase> </testCase>
<testCase id="050000"> <testCase id="051000">
<class>Ping</class> <class>Ping</class>
<desc>Ping: 20 pings</desc> <desc>Ping: 20 pings</desc>
<id>up2</id> <id>up2</id>
...@@ -94,7 +94,7 @@ ...@@ -94,7 +94,7 @@
<ping_rttavg_threshold>60</ping_rttavg_threshold> <ping_rttavg_threshold>60</ping_rttavg_threshold>
</testCase> </testCase>
<testCase id="050001"> <testCase id="051001">
<class>Ping</class> <class>Ping</class>
<desc>Ping: 100 pings, size 1024</desc> <desc>Ping: 100 pings, size 1024</desc>
<id>up2</id> <id>up2</id>
...@@ -103,7 +103,7 @@ ...@@ -103,7 +103,7 @@
<ping_rttavg_threshold>60</ping_rttavg_threshold> <ping_rttavg_threshold>60</ping_rttavg_threshold>
</testCase> </testCase>
<testCase id="070000"> <testCase id="071000">
<class>Iperf</class> <class>Iperf</class>
<desc>iperf (DL/26Mbps/UDP)(60 sec)(single-ue profile)</desc> <desc>iperf (DL/26Mbps/UDP)(60 sec)(single-ue profile)</desc>
<iperf_args>-u -b 1M -t 60 -R</iperf_args> <iperf_args>-u -b 1M -t 60 -R</iperf_args>
...@@ -113,7 +113,7 @@ ...@@ -113,7 +113,7 @@
<iperf_bitrate_threshold>95</iperf_bitrate_threshold> <iperf_bitrate_threshold>95</iperf_bitrate_threshold>
</testCase> </testCase>
<testCase id="070001"> <testCase id="071001">
<class>Iperf</class> <class>Iperf</class>
<desc>iperf (UL/7Mbps/UDP)(60 sec)(single-ue profile)</desc> <desc>iperf (UL/7Mbps/UDP)(60 sec)(single-ue profile)</desc>
<iperf_args>-u -b 7M -t 60</iperf_args> <iperf_args>-u -b 7M -t 60</iperf_args>
...@@ -129,7 +129,7 @@ ...@@ -129,7 +129,7 @@
<id>up2</id> <id>up2</id>
</testCase> </testCase>
<testCase id="030201"> <testCase id="031201">
<class>Undeploy_Object</class> <class>Undeploy_Object</class>
<desc>Undeploy gNB</desc> <desc>Undeploy gNB</desc>
<yaml_path>ci-scripts/yaml_files/lte_n3xx_tdd_2x2_tm2</yaml_path> <yaml_path>ci-scripts/yaml_files/lte_n3xx_tdd_2x2_tm2</yaml_path>
......
...@@ -48,9 +48,9 @@ ...@@ -48,9 +48,9 @@
000100 000100
000010 000010
000020 000020
002016
000030 000030
000040 000040
002016
000200 000200
003000 003000
004000 004000
......
...@@ -165,7 +165,7 @@ ...@@ -165,7 +165,7 @@
<testCase id="070003"> <testCase id="070003">
<class>Iperf</class> <class>Iperf</class>
<desc>iperf (DL/TCP)(30 sec)(multi-ue profile)</desc> <desc>iperf (DL/TCP)(30 sec)(single-ue profile)</desc>
<iperf_args>-t 30 -R</iperf_args> <iperf_args>-t 30 -R</iperf_args>
<id>idefix</id> <id>idefix</id>
<svr_id>sabox-nepes</svr_id> <svr_id>sabox-nepes</svr_id>
...@@ -174,7 +174,7 @@ ...@@ -174,7 +174,7 @@
<testCase id="070004"> <testCase id="070004">
<class>Iperf</class> <class>Iperf</class>
<desc>iperf (UL/TCP)(30 sec)(multi-ue profile)</desc> <desc>iperf (UL/TCP)(30 sec)(single-ue profile)</desc>
<iperf_args>-t 30</iperf_args> <iperf_args>-t 30</iperf_args>
<id>idefix</id> <id>idefix</id>
<svr_id>sabox-nepes</svr_id> <svr_id>sabox-nepes</svr_id>
......
...@@ -157,7 +157,7 @@ ...@@ -157,7 +157,7 @@
<testCase id="370003"> <testCase id="370003">
<class>Iperf</class> <class>Iperf</class>
<desc>iperf (DL/TCP)(30 sec)(multi-ue profile)</desc> <desc>iperf (DL/TCP)(30 sec)(single-ue profile)</desc>
<iperf_args>-t 30 -R</iperf_args> <iperf_args>-t 30 -R</iperf_args>
<id>idefix</id> <id>idefix</id>
<svr_id>sabox-nepes</svr_id> <svr_id>sabox-nepes</svr_id>
...@@ -166,7 +166,7 @@ ...@@ -166,7 +166,7 @@
<testCase id="370004"> <testCase id="370004">
<class>Iperf</class> <class>Iperf</class>
<desc>iperf (UL/TCP)(30 sec)(multi-ue profile)</desc> <desc>iperf (UL/TCP)(30 sec)(single-ue profile)</desc>
<iperf_args>-t 30</iperf_args> <iperf_args>-t 30</iperf_args>
<id>idefix</id> <id>idefix</id>
<svr_id>sabox-nepes</svr_id> <svr_id>sabox-nepes</svr_id>
......
...@@ -189,7 +189,7 @@ ...@@ -189,7 +189,7 @@
<testCase id="170003"> <testCase id="170003">
<class>Iperf</class> <class>Iperf</class>
<desc>iperf (DL/TCP)(30 sec)(multi-ue profile)</desc> <desc>iperf (DL/TCP)(30 sec)(single-ue profile)</desc>
<iperf_args>-t 30 -R</iperf_args> <iperf_args>-t 30 -R</iperf_args>
<id>idefix</id> <id>idefix</id>
<svr_id>sabox-nepes</svr_id> <svr_id>sabox-nepes</svr_id>
...@@ -198,7 +198,7 @@ ...@@ -198,7 +198,7 @@
<testCase id="170004"> <testCase id="170004">
<class>Iperf</class> <class>Iperf</class>
<desc>iperf (UL/TCP)(30 sec)(multi-ue profile)</desc> <desc>iperf (UL/TCP)(30 sec)(single-ue profile)</desc>
<iperf_args>-t 30</iperf_args> <iperf_args>-t 30</iperf_args>
<id>idefix</id> <id>idefix</id>
<svr_id>sabox-nepes</svr_id> <svr_id>sabox-nepes</svr_id>
......
...@@ -159,7 +159,7 @@ ...@@ -159,7 +159,7 @@
<testCase id="270003"> <testCase id="270003">
<class>Iperf</class> <class>Iperf</class>
<desc>iperf (DL/TCP)(30 sec)(multi-ue profile)</desc> <desc>iperf (DL/TCP)(30 sec)(single-ue profile)</desc>
<iperf_args>-t 30 -R</iperf_args> <iperf_args>-t 30 -R</iperf_args>
<id>idefix</id> <id>idefix</id>
<svr_id>sabox-nepes</svr_id> <svr_id>sabox-nepes</svr_id>
...@@ -168,7 +168,7 @@ ...@@ -168,7 +168,7 @@
<testCase id="270004"> <testCase id="270004">
<class>Iperf</class> <class>Iperf</class>
<desc>iperf (UL/TCP)(30 sec)(multi-ue profile)</desc> <desc>iperf (UL/TCP)(30 sec)(single-ue profile)</desc>
<iperf_args>-t 30</iperf_args> <iperf_args>-t 30</iperf_args>
<id>idefix</id> <id>idefix</id>
<svr_id>sabox-nepes</svr_id> <svr_id>sabox-nepes</svr_id>
......
...@@ -10,7 +10,7 @@ services: ...@@ -10,7 +10,7 @@ services:
#entrypoint: /bin/bash -c "sleep infinity" #entrypoint: /bin/bash -c "sleep infinity"
environment: environment:
TZ: Europe/Paris TZ: Europe/Paris
USE_ADDITIONAL_OPTIONS: --usrp-args type=n3xx,name=ni-n3xx-31641B9,addr=192.168.10.2 -r 106 --numerology 1 --band 78 -C 3511200000 --sa --ue-fo-compensation --ue-rxgain 65 --tune-offset 20000000 -A 45 --log_config.global_log_options level,nocolor,time --uicc0.imsi 208970000000111 --uicc0.nssai_sd 16777215 USE_ADDITIONAL_OPTIONS: --usrp-args type=n3xx,name=ni-n3xx-31641B9,addr=192.168.10.2 -r 106 --numerology 1 --band 78 -C 3511200000 --sa --ue-fo-compensation --ue-rxgain 65 --tune-offset 20000000 -A 45 --log_config.global_log_options level,nocolor,time --uicc0.imsi 001020000000111 --uicc0.nssai_sd 16777215
volumes: volumes:
- ../../conf_files/ue.sa.conf:/opt/oai-nr-ue/etc/nr-ue.conf - ../../conf_files/ue.sa.conf:/opt/oai-nr-ue/etc/nr-ue.conf
healthcheck: healthcheck:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment