Commit d0a55b7b authored by Kirill Smelkov's avatar Kirill Smelkov

Merge branch 'x/lte-multiru' into xy/lte-multiru

- generic: inactivity_timer moved from global to per-cell
- generic: global disable_sdr removed from schemas - radio enable/disable is controlled by per-RU .txrx_active
- fix publish wrt synthethic RU and cells
- ru/*: fix code not to break under testing=True environment
- fix setting defaults for RU embedded in a cell
- add verification checks wrt incorrect shared instances configuration
- emit big error if both SDR and CPRI RUs are used together
- documentation updates + misc...
parents 81604537 77bba2fa
...@@ -109,8 +109,8 @@ md5sum = b33775a9ab6eae784b6da9f31be48be3 ...@@ -109,8 +109,8 @@ md5sum = b33775a9ab6eae784b6da9f31be48be3
[debian-amd64-bookworm-netinst.iso] [debian-amd64-bookworm-netinst.iso]
<= debian-amd64-netinst-base <= debian-amd64-netinst-base
version = 12.1.0 version = 12.4.0
md5sum = 8d77d1b0bcfef29e4d56dc0fbe23de15 md5sum = a03cf771ba9513d908093101a094ac88
alternate-url = https://cdimage.debian.org/cdimage/release/current/${:arch}/iso-cd/${:filename} alternate-url = https://cdimage.debian.org/cdimage/release/current/${:arch}/iso-cd/${:filename}
[debian-amd64-netinst.iso] [debian-amd64-netinst.iso]
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
[template] [template]
filename = instance.cfg filename = instance.cfg
md5sum = a3527093ffc01d8f8fbaf27696ad7b9b md5sum = 3504aff1982efd60a214e46041483f47
[template-ors] [template-ors]
filename = instance-ors.cfg filename = instance-ors.cfg
...@@ -24,11 +24,19 @@ md5sum = f5c76c3443b75569eb18503dce38e783 ...@@ -24,11 +24,19 @@ md5sum = f5c76c3443b75569eb18503dce38e783
[slaplte.jinja2] [slaplte.jinja2]
_update_hash_filename_ = slaplte.jinja2 _update_hash_filename_ = slaplte.jinja2
md5sum = 55d9182051ce13d07f1bc8e019173ae5 md5sum = 944639e65b9ff3ebe75919bdb5bee6fa
[ru_amarisoft-stats.jinja2.py]
_update_hash_filename_ = ru/amarisoft-stats.jinja2.py
md5sum = 674dcc250c0b6bb43d8546624552fc5d
[ru_amarisoft-rf-info.jinja2.py]
_update_hash_filename_ = ru/amarisoft-rf-info.jinja2.py
md5sum = d2fe2fbe70c6824c514a7c4034a2ddb3
[ru_libinstance.jinja2.cfg] [ru_libinstance.jinja2.cfg]
_update_hash_filename_ = ru/libinstance.jinja2.cfg _update_hash_filename_ = ru/libinstance.jinja2.cfg
md5sum = cf1d71dff3a37a80936ce1c2df373455 md5sum = 39031a3b7f043c905b49986984d49a4b
[ru_sdr_libinstance.jinja2.cfg] [ru_sdr_libinstance.jinja2.cfg]
_update_hash_filename_ = ru/sdr/libinstance.jinja2.cfg _update_hash_filename_ = ru/sdr/libinstance.jinja2.cfg
...@@ -36,20 +44,12 @@ md5sum = b7906ca3a6b17963f78f680fc0842b74 ...@@ -36,20 +44,12 @@ md5sum = b7906ca3a6b17963f78f680fc0842b74
[ru_lopcomm_libinstance.jinja2.cfg] [ru_lopcomm_libinstance.jinja2.cfg]
_update_hash_filename_ = ru/lopcomm/libinstance.jinja2.cfg _update_hash_filename_ = ru/lopcomm/libinstance.jinja2.cfg
md5sum = ec34535512448db3fa40caa00bee3151 md5sum = 667ef223ffbae18f9693fa7d02d6ae88
[ru_sunwave_libinstance.jinja2.cfg] [ru_sunwave_libinstance.jinja2.cfg]
_update_hash_filename_ = ru/sunwave/libinstance.jinja2.cfg _update_hash_filename_ = ru/sunwave/libinstance.jinja2.cfg
md5sum = bc5d82b8737b6990674b280ef2774be7 md5sum = bc5d82b8737b6990674b280ef2774be7
[ru_amarisoft-stats.jinja2.py]
_update_hash_filename_ = ru/amarisoft-stats.jinja2.py
md5sum = 674dcc250c0b6bb43d8546624552fc5d
[ru_amarisoft-rf-info.jinja2.py]
_update_hash_filename_ = ru/amarisoft-rf-info.jinja2.py
md5sum = d2fe2fbe70c6824c514a7c4034a2ddb3
[ru_lopcomm_ncclient_common.py] [ru_lopcomm_ncclient_common.py]
_update_hash_filename_ = ru/lopcomm/ncclient_common.py _update_hash_filename_ = ru/lopcomm/ncclient_common.py
md5sum = 8dbe6a48fc0fca4f0cbd0c746be1aeda md5sum = 8dbe6a48fc0fca4f0cbd0c746be1aeda
...@@ -80,7 +80,7 @@ md5sum = 2b8b57c5771b2a2203c0e7767e629e55 ...@@ -80,7 +80,7 @@ md5sum = 2b8b57c5771b2a2203c0e7767e629e55
[ru_xbuildout.py] [ru_xbuildout.py]
_update_hash_filename_ = ru/xbuildout.py _update_hash_filename_ = ru/xbuildout.py
md5sum = 2856e18a18eb8f0af090cfd714e1973a md5sum = fcc64214e9d497c541f6d4a11fb1afe0
[ru_capdo.c] [ru_capdo.c]
_update_hash_filename_ = ru/capdo.c _update_hash_filename_ = ru/capdo.c
...@@ -88,11 +88,11 @@ md5sum = 52da9fe3a569199e35ad89ae1a44c30e ...@@ -88,11 +88,11 @@ md5sum = 52da9fe3a569199e35ad89ae1a44c30e
[template-enb] [template-enb]
_update_hash_filename_ = instance-enb.jinja2.cfg _update_hash_filename_ = instance-enb.jinja2.cfg
md5sum = 4f6ef8c1be0751500fbcc4e5ea24debb md5sum = 51ce7e6fd96f3c8ad086723722b91c3f
[template-ors-enb] [template-ors-enb]
_update_hash_filename_ = instance-ors-enb.jinja2.cfg _update_hash_filename_ = instance-ors-enb.jinja2.cfg
md5sum = fae3b18f36b4196617b8a48251e39726 md5sum = 48dd7b1c51545a78cdd8c3f68e152e8c
[template-core-network] [template-core-network]
_update_hash_filename_ = instance-core-network.jinja2.cfg _update_hash_filename_ = instance-core-network.jinja2.cfg
...@@ -112,7 +112,7 @@ md5sum = dcaac06553a3222b14c0013a13f4a149 ...@@ -112,7 +112,7 @@ md5sum = dcaac06553a3222b14c0013a13f4a149
[enb.jinja2.cfg] [enb.jinja2.cfg]
filename = config/enb.jinja2.cfg filename = config/enb.jinja2.cfg
md5sum = cf51fd760ac1d1b5b0bb622bab1bf541 md5sum = 5637fa338ffbc1015b5b6349ede91170
[drb_lte.jinja2.cfg] [drb_lte.jinja2.cfg]
filename = config/drb_lte.jinja2.cfg filename = config/drb_lte.jinja2.cfg
...@@ -129,7 +129,7 @@ md5sum = 959523597e29b048e45ebf58f7ea4c5b ...@@ -129,7 +129,7 @@ md5sum = 959523597e29b048e45ebf58f7ea4c5b
[mme.jinja2.cfg] [mme.jinja2.cfg]
filename = config/mme.jinja2.cfg filename = config/mme.jinja2.cfg
md5sum = 44fc9ee5082dd8e0298801f8d4618b06 md5sum = 3d7833ddba3242cedcd74c7db52390c6
[dnsmasq-core-network.jinja2.cfg] [dnsmasq-core-network.jinja2.cfg]
filename = config/dnsmasq-core-network.jinja2.cfg filename = config/dnsmasq-core-network.jinja2.cfg
......
...@@ -53,6 +53,12 @@ ...@@ -53,6 +53,12 @@
"type": "integer", "type": "integer",
"default": 204 "default": 204
}, },
"inactivity_timer": {
"title": "Inactivity Timer",
"description": "Send RRC connection release after this time (in ms) of network inactivity.",
"type": "number",
"default": 10000
},
"ru": { "ru": {
"$ref": "#/$defs/ru-of-cell", "$ref": "#/$defs/ru-of-cell",
"propertyOrder": 9999 "propertyOrder": 9999
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
{%- set B = slaplte.B %} {%- set B = slaplte.B %}
{%- set J = slaplte.J %} {%- set J = slaplte.J %}
{%- set jcell_ru_ref = slaplte.jcell_ru_ref %} {%- set jcell_ru_ref = slaplte.jcell_ru_ref %}
{%- set ierror = slaplte.ierror %}
{#- for standalone testing via slapos-render-config.py {#- for standalone testing via slapos-render-config.py
NOTE: keep in sync with instance-enb.jinja2.cfg and ru/libinstance.jinja2.cfg #} NOTE: keep in sync with instance-enb.jinja2.cfg and ru/libinstance.jinja2.cfg #}
...@@ -66,8 +67,8 @@ ...@@ -66,8 +67,8 @@
tac: {{ ncell.tac }}, tac: {{ ncell.tac }},
{#- TODO: consider extending peer/cell/lte with {#- TODO: consider extending peer/cell/lte with
.allowed_meas_bandwidth and .antenna_port_1 #} .allowed_meas_bandwidth and .antenna_port_1 #}
allowed_meas_bandwidth: {{ jlte_n_rb_dl(1.4) }}, // XXX minimum possible bw allowed_meas_bandwidth: {{ jlte_n_rb_dl(1.4) }}, // (minimum possible bw)
antenna_port_1: false, // XXX conservative stub antenna_port_1: false, // (conservative stub)
{%- elif ncell.cell_type == 'nr' %} {%- elif ncell.cell_type == 'nr' %}
rat: "nr", rat: "nr",
nr_cell_id: {{ ncell.nr_cell_id }}, // -> {{ B(peercell_ref) }} nr_cell_id: {{ ncell.nr_cell_id }}, // -> {{ B(peercell_ref) }}
...@@ -625,7 +626,7 @@ ...@@ -625,7 +626,7 @@
bitmap: "110011", bitmap: "110011",
cdm_type: "fd_cdm2", cdm_type: "fd_cdm2",
{%- else %} {%- else %}
{%- do error(icell, "unsupported number of DL antennas") %} {%- do ierror(iru, 'n_antenna_dl=%d is not supported' % ru.n_antenna_dl) %}
{%- endif %} {%- endif %}
}, },
{%- if tdd_config != 3 %} {%- if tdd_config != 3 %}
......
{ {
log_options: "all.level=error,all.max_size=0,nas.level=debug,nas.max_size=1,s1ap.level=debug,s1ap.max_size=1,ngap.level=debug,ngap.max_size=1,file.rotate=1G,file.path=/dev/null", log_options: "all.level=error,all.max_size=0,nas.level=debug,nas.max_size=1,s1ap.level=debug,s1ap.max_size=1,ngap.level=debug,ngap.max_size=1,file.rotate=1G,file.path=/dev/null",
log_filename: "{{ directory['log'] }}/mme.log", log_filename: "{{ directory['log'] }}/mme.log",
com_addr: "127.0.1.2:9000",
{% if slapparameter_dict.get('external_enb_gnb', '') %} {% if slapparameter_dict.get('external_enb_gnb', '') %}
{% if slapparameter_dict.get('use_ipv4', False) %} {% if slapparameter_dict.get('use_ipv4', False) %}
......
...@@ -6,11 +6,9 @@ ...@@ -6,11 +6,9 @@
// Radio Units // Radio Units
rf_driver: { rf_driver: {
// XXX vvv <- ru.txrx_active ? XXX how to handle txrx_active for SDR ?
// (tx_gain=-1000 does not work - it still sets tx_gain to min.possible value 14)
name: "sdr",
// RU1 2T1R (sdr) // RU1 2T1R (sdr)
// RU2 2T1R (sdr) // RU2 2T1R (sdr)
name: "sdr",
args: "dev0=/dev/sdr1,dev1=/dev/sdr2", args: "dev0=/dev/sdr1,dev1=/dev/sdr2",
rx_antenna:"tx_rx", rx_antenna:"tx_rx",
tdd_tx_mod: 1, tdd_tx_mod: 1,
...@@ -76,8 +74,8 @@ ...@@ -76,8 +74,8 @@
n_id_cell: 35, n_id_cell: 35,
dl_earfcn: 700, dl_earfcn: 700,
tac: 123, tac: 123,
allowed_meas_bandwidth: 6, // XXX minimum possible bw allowed_meas_bandwidth: 6, // (minimum possible bw)
antenna_port_1: false, // XXX conservative stub antenna_port_1: false, // (conservative stub)
}, },
{ {
rat: "nr", rat: "nr",
...@@ -287,8 +285,8 @@ ...@@ -287,8 +285,8 @@
n_id_cell: 35, n_id_cell: 35,
dl_earfcn: 700, dl_earfcn: 700,
tac: 123, tac: 123,
allowed_meas_bandwidth: 6, // XXX minimum possible bw allowed_meas_bandwidth: 6, // (minimum possible bw)
antenna_port_1: false, // XXX conservative stub antenna_port_1: false, // (conservative stub)
}, },
{ {
rat: "nr", rat: "nr",
......
...@@ -9,16 +9,14 @@ ...@@ -9,16 +9,14 @@
// Radio Units // Radio Units
rf_driver: { rf_driver: {
// XXX vvv <- ru.txrx_active ? XXX how to handle txrx_active for SDR ?
// (tx_gain=-1000 does not work - it still sets tx_gain to min.possible value 14)
name: "sdr",
// __UCELL1__ru 2T1R (sdr) // __UCELL1__ru 2T1R (sdr)
// __UCELL2__ru 2T2R (sdr) // __UCELL2__ru 2T2R (sdr)
name: "dummy",
args: "dev0=/dev/sdr0,dev1=/dev/sdr2", args: "dev0=/dev/sdr0,dev1=/dev/sdr2",
rx_antenna:"tx_rx", rx_antenna:"tx_rx",
tdd_tx_mod: 1, tdd_tx_mod: 1,
}, },
tx_gain: [41, 41, 31, 31], tx_gain: [-1000, -1000, -1000, -1000],
rx_gain: [42, 32, 32], rx_gain: [42, 32, 32],
......
#!/bin/sh
git diff -C -C $@ -- \
':!config/out' \
':!k/' \
':!buildout.hash.cfg' \
':!test/test.sh' \
':!*.json' \
':!*.json.jinja2' \
':!diff.sh' \
...@@ -151,12 +151,6 @@ ...@@ -151,12 +151,6 @@
"description": "Activates websocket for remote control and sets password", "description": "Activates websocket for remote control and sets password",
"type": "string" "type": "string"
}, },
"inactivity_timer": {
"title": "Inactivity Timer XXX",
"description": "Send RRC connection release after this time (in ms) of network inactivity.",
"type": "number",
"default": 10000
},
"log_phy_debug": { "log_phy_debug": {
"title": "Physical layer log debug", "title": "Physical layer log debug",
"description": "Enable debug mode for physical layer logs", "description": "Enable debug mode for physical layer logs",
...@@ -169,12 +163,6 @@ ...@@ -169,12 +163,6 @@
"description": "True if GPS should be used for synchronisation", "description": "True if GPS should be used for synchronisation",
"type": "boolean" "type": "boolean"
}, },
"disable_sdr": {
"default": false,
"title": "Disable SDR XXX kill ?",
"description": "Disables radio",
"type": "boolean"
},
"use_ipv4": { "use_ipv4": {
"default": false, "default": false,
"title": "Use IPv4", "title": "Use IPv4",
......
...@@ -3,10 +3,10 @@ ...@@ -3,10 +3,10 @@
{#- defaults for global eNB/gNB parameters. {#- defaults for global eNB/gNB parameters.
TODO automatically enb defaults from JSON schema #} TODO automatically enb defaults from JSON schema #}
{%- set enb_defaults = { {%- set enb_defaults = {
"com_ws_port": 9001, 'com_ws_port': 9001,
"com_addr": '127.0.1.2', 'com_addr': '127.0.1.2',
"use_ipv4": False, 'use_ipv4': False,
"nssai": {'1': {'sst': 1}} 'nssai': {'1': {'sst': 1}}
} %} } %}
{%- for k,v in enb_defaults|dictsort %} {%- for k,v in enb_defaults|dictsort %}
{%- do slapparameter_dict.setdefault(k, v) %} {%- do slapparameter_dict.setdefault(k, v) %}
...@@ -22,7 +22,6 @@ parts = ...@@ -22,7 +22,6 @@ parts =
{% if slapparameter_dict.get('xlog_fluentbit_forward_host') %} {% if slapparameter_dict.get('xlog_fluentbit_forward_host') %}
xlog-fluentbit-service xlog-fluentbit-service
{% endif %} {% endif %}
check-baseband-latency.py check-baseband-latency.py
monitor-base monitor-base
publish-connection-information publish-connection-information
......
...@@ -152,9 +152,7 @@ ...@@ -152,9 +152,7 @@
"$ref": "instance-enb-input-schema.json#/properties/websocket_password" "$ref": "instance-enb-input-schema.json#/properties/websocket_password"
}, },
"inactivity_timer": { "inactivity_timer": {
"title": "Inactivity Timer", "$ref": "cell/common.json#/properties/inactivity_timer",
"description": "Send RRC connection release after this time (in ms) of network inactivity.",
"type": "number",
"default": 10000 "default": 10000
}, },
"log_phy_debug": { "log_phy_debug": {
......
...@@ -65,7 +65,7 @@ ...@@ -65,7 +65,7 @@
{%- endmacro %} {%- endmacro %}
{%- do ishared_list.append({ {%- do ishared_list.append({
'slave_title': iref('RU'), 'slave_title': iref('RU'),
'slave_reference': 'XXX', 'slave_reference': False,
'_': { '_': {
'ru_type': 'sdr', 'ru_type': 'sdr',
'ru_link_type': 'sdr', 'ru_link_type': 'sdr',
...@@ -74,7 +74,7 @@ ...@@ -74,7 +74,7 @@
'n_antenna_ul': slapparameter_dict.n_antenna_ul, 'n_antenna_ul': slapparameter_dict.n_antenna_ul,
'tx_gain': ors_version['current-tx-gain'], 'tx_gain': ors_version['current-tx-gain'],
'rx_gain': ors_version['current-rx-gain'], 'rx_gain': ors_version['current-rx-gain'],
'txrx_active': 'ACTIVE', 'txrx_active': 'ACTIVE' if (not slapparameter_dict.disable_sdr) else 'INACTIVE',
} |tojson } |tojson
}) })
%} %}
...@@ -115,7 +115,7 @@ ...@@ -115,7 +115,7 @@
{%- do ishared_list.append({ {%- do ishared_list.append({
'slave_title': iref('CELL'), 'slave_title': iref('CELL'),
'slave_reference': 'XXX', 'slave_reference': False,
'_': cell | tojson '_': cell | tojson
}) })
%} %}
...@@ -152,7 +152,7 @@ ...@@ -152,7 +152,7 @@
{%- endif %} {%- endif %}
{%- do ishared_list.append({ {%- do ishared_list.append({
'slave_title': '%s%s' % (iref('PEERCELL'), k), 'slave_title': '%s%s' % (iref('PEERCELL'), k),
'slave_reference': 'XXX', 'slave_reference': False,
'_': peercell | tojson '_': peercell | tojson
}) })
%} %}
...@@ -164,7 +164,7 @@ ...@@ -164,7 +164,7 @@
{%- for k, peer in slapparameter_dict.x2_peers|dictsort %} {%- for k, peer in slapparameter_dict.x2_peers|dictsort %}
{%- do ishared_list.append({ {%- do ishared_list.append({
'slave_title': '%s%s' % (iref('X2_PEER'), k), 'slave_title': '%s%s' % (iref('X2_PEER'), k),
'slave_reference': 'XXX', 'slave_reference': False,
'_': { '_': {
'peer_type': 'nr', 'peer_type': 'nr',
'x2_addr': peer.x2_addr, 'x2_addr': peer.x2_addr,
...@@ -176,7 +176,7 @@ ...@@ -176,7 +176,7 @@
{%- for k, peer in slapparameter_dict.xn_peers|dictsort %} {%- for k, peer in slapparameter_dict.xn_peers|dictsort %}
{%- do ishared_list.append({ {%- do ishared_list.append({
'slave_title': '%s%s' % (iref('XN_PEER'), k), 'slave_title': '%s%s' % (iref('XN_PEER'), k),
'slave_reference': 'XXX', 'slave_reference': False,
'_': { '_': {
'peer_type': 'nr', 'peer_type': 'nr',
'xn_addr': peer.xn_addr 'xn_addr': peer.xn_addr
......
...@@ -27,6 +27,7 @@ extra-context = ...@@ -27,6 +27,7 @@ extra-context =
depends = $${activate-eggs:recipe} depends = $${activate-eggs:recipe}
context = context =
import xbuildout xbuildout import xbuildout xbuildout
import netaddr netaddr
import json_module json import json_module json
import nrarfcn_module nrarfcn import nrarfcn_module nrarfcn
import xearfcn_module xlte.earfcn import xearfcn_module xlte.earfcn
...@@ -142,7 +143,6 @@ RootSoftwareInstance = $${:core-network} ...@@ -142,7 +143,6 @@ RootSoftwareInstance = $${:core-network}
url = ${template-enb:target} url = ${template-enb:target}
filename = instance-enb.cfg filename = instance-enb.cfg
extensions = jinja2.ext.do extensions = jinja2.ext.do
# XXX move RU-specific bits from extra context to ru/...
extra-context = extra-context =
raw monitor_template ${monitor2-template:output} raw monitor_template ${monitor2-template:output}
section comp_id comp-id section comp_id comp-id
......
#!/usr/bin/env -S slapos console #!/usr/bin/env -S slapos console
"""request mme/enb and configure radio units and cells""" """request mme/enb and configure radio units and cells on Callbox5 + real SlapOS Master"""
# NOTE see krequest-tmru.enb+ for requesting under theia
# XXX workaround for `slapos console` not setting up sys.path the same way as std python does # XXX workaround for `slapos console` not setting up sys.path the same way as std python does
import sys import sys
...@@ -81,20 +82,6 @@ RU2['mac_addr'] = '90:A9:F7:C0:00:03' ...@@ -81,20 +82,6 @@ RU2['mac_addr'] = '90:A9:F7:C0:00:03'
iru1 = iENB(eref('RU1'), RU1) iru1 = iENB(eref('RU1'), RU1)
iru2 = iENB(eref('RU2'), RU2) iru2 = iENB(eref('RU2'), RU2)
# XXX to test wrt buildout code injection
if 0:
RU3 = {
'ru_type': 'sdr',
'ru_link_type': 'sdr',
'sdr_dev_list': [0, 1],
'n_antenna_dl': 4,
'n_antenna_ul': 2,
'tx_gain': 51,
'rx_gain': 52,
}
iENB(eref('RU3\nzzz ${aaa:bbb}\nccc'), RU3)
# Cells # Cells
CELL1 = { CELL1 = {
'cell_type': 'lte', 'cell_type': 'lte',
......
#!/usr/bin/env -S slapos console #!/usr/bin/env -S slapos console
"""request ors/enb for kirr""" """request enb under theia for development"""
# XXX deprecated in favour of krequest-cb5.enb+ # NOTE see krequest-cb5.enb+ for requesting for real
# XXX workaround for `slapos console` not setting up sys.path the same way as std python does # XXX workaround for `slapos console` not setting up sys.path the same way as std python does
import sys import sys
...@@ -9,22 +9,28 @@ sys.path.insert(0, dirname(__file__)) ...@@ -9,22 +9,28 @@ sys.path.insert(0, dirname(__file__))
import kslap import kslap
kslap.init(slap) kslap.init(slap)
import json, copy import os, json, copy
from pprint import pprint from pprint import pprint
ors = "/srv/slapgrid/slappart35/srv/project/slapos/software/ors-amarisoft/software.cfg" kamari = "%(HOME)s/srv/project/slapos/software/ors-amarisoft/software.cfg" % os.environ
enb1 = request(ors, enb1 = kslap.request(kamari,
software_type="enb", software_type="enb",
partition_reference="kenb", partition_reference="kenb",
filter_kw={"computer_guid": "slaprunner"}, filter_kw={"computer_guid": "slaprunner"},
partition_parameter_kw={"_": json.dumps({ partition_parameter_kw={"_": json.dumps({
'testing': True, 'testing': True,
"enb_id": "0x10012",
"gnb_id": "0x54321",
'mme_list': {'1': {'mme_addr': '127.0.0.100'}},
'amf_list': {'1': {'amf_addr': '127.0.0.200'}},
'plmn_list': {'1': {'plmn': '31415'}},
'plmn_list_5g': {'1': {'plmn': '51413', 'tac': 0x4321}},
})}) })})
""" """
enb2 = request(ors, enb2 = kslap.request(kamari,
software_type="enb", software_type="enb",
partition_reference="kenb2", partition_reference="kenb2",
filter_kw={"computer_guid": "slaprunner"}, filter_kw={"computer_guid": "slaprunner"},
...@@ -70,6 +76,7 @@ CELL1_a = { ...@@ -70,6 +76,7 @@ CELL1_a = {
'dl_earfcn': 38050, # 2600 MHz 'dl_earfcn': 38050, # 2600 MHz
'pci': 1, 'pci': 1,
'cell_id': '0x01', 'cell_id': '0x01',
'tac': '0x1234',
'ru': RU1, # RU definition embedded into CELL 'ru': RU1, # RU definition embedded into CELL
} }
...@@ -84,6 +91,7 @@ CELL1_b = { ...@@ -84,6 +91,7 @@ CELL1_b = {
'dl_earfcn': 38100, # 2605 MHz 'dl_earfcn': 38100, # 2605 MHz
'pci': 2, 'pci': 2,
'cell_id': '0x02', 'cell_id': '0x02',
'tac': '0x1234',
'ru': { # CELL1_b shares RU with CELL1_a referring to it via cell 'ru': { # CELL1_b shares RU with CELL1_a referring to it via cell
'ru_type': 'ruincell_ref', 'ru_type': 'ruincell_ref',
'ruincell_ref': 'CELL1_a' 'ruincell_ref': 'CELL1_a'
...@@ -129,6 +137,7 @@ kslap.iSHARED(enb1, 'CELL2_a', { ...@@ -129,6 +137,7 @@ kslap.iSHARED(enb1, 'CELL2_a', {
'dl_earfcn': 3350, # 2680 MHz 'dl_earfcn': 3350, # 2680 MHz
'pci': 21, 'pci': 21,
'cell_id': '0x21', 'cell_id': '0x21',
'tac': '0x1234',
'ru': { # CELL2_a links to RU2_a by its reference 'ru': { # CELL2_a links to RU2_a by its reference
'ru_type': 'ru_ref', 'ru_type': 'ru_ref',
'ru_ref': 'RU2_a' 'ru_ref': 'RU2_a'
......
...@@ -51,7 +51,7 @@ config-stats-period = {{ slapparameter_dict.get("enb_stats_fetch_period", 60) }} ...@@ -51,7 +51,7 @@ config-stats-period = {{ slapparameter_dict.get("enb_stats_fetch_period", 60) }}
{%- set J = slaplte.J %} {%- set J = slaplte.J %}
{%- set jref_of_shared = slaplte.jref_of_shared %} {%- set jref_of_shared = slaplte.jref_of_shared %}
{%- set jcell_ru_ref = slaplte.jcell_ru_ref %} {%- set jcell_ru_ref = slaplte.jcell_ru_ref %}
{%- set error = slaplte.error %} {%- set ierror = slaplte.ierror %}
{%- import 'ru_sdr_libinstance.jinja2.cfg' as rudrv_sdr with context %} {%- import 'ru_sdr_libinstance.jinja2.cfg' as rudrv_sdr with context %}
{%- import 'ru_lopcomm_libinstance.jinja2.cfg' as rudrv_lopcomm with context %} {%- import 'ru_lopcomm_libinstance.jinja2.cfg' as rudrv_lopcomm with context %}
{%- import 'ru_sunwave_libinstance.jinja2.cfg' as rudrv_sunwave with context %} {%- import 'ru_sunwave_libinstance.jinja2.cfg' as rudrv_sunwave with context %}
...@@ -61,7 +61,7 @@ config-stats-period = {{ slapparameter_dict.get("enb_stats_fetch_period", 60) }} ...@@ -61,7 +61,7 @@ config-stats-period = {{ slapparameter_dict.get("enb_stats_fetch_period", 60) }}
{%- set rudrv_init = {} %} {%- set rudrv_init = {} %}
{#- split slapos tap interface for each RU that needs its own tap. {#- split slapos tap interface for each RU that needs its own tap.
fallback to non-split approach for ntap <= 1 to avoid hard-dependecy on setcap/tapsplit fallback to non-split approach for ntap <= 1 to avoid hard-dependency on setcap/tapsplit
TODO Relying on setcap and tapsplit should be removed once SlapOS is improved to TODO Relying on setcap and tapsplit should be removed once SlapOS is improved to
provide several TAP interfaces to instances. See discussion at provide several TAP interfaces to instances. See discussion at
...@@ -79,6 +79,7 @@ stop-on-error = true ...@@ -79,6 +79,7 @@ stop-on-error = true
# StandaloneSlapOS does not provide slaptap # StandaloneSlapOS does not provide slaptap
command = : command = :
{%- endif %} {%- endif %}
{%- set test_slapnet = netaddr.IPNetwork('1234::/71') %}
{%- if ntap <= 1 %} {%- if ntap <= 1 %}
[vtap] [vtap]
...@@ -88,9 +89,15 @@ stop-on-error = false ...@@ -88,9 +89,15 @@ stop-on-error = false
{%- if ntap == 1 %} {%- if ntap == 1 %}
{%- do vtap_list.append(slaplte.tap) %} {%- do vtap_list.append(slaplte.tap) %}
[vtap.{{ slaplte.tap }}] [vtap.{{ slaplte.tap }}]
{%- if testing %}
network = {{ str(test_slapnet) }}
gateway = {{ str(test_slapnet[1]) }}
addr = {{ str(test_slapnet[-1]) }}
{%- else %}
network = {{ slap_configuration['tap-ipv6-network'] }} network = {{ slap_configuration['tap-ipv6-network'] }}
gateway = {{ slap_configuration['tap-ipv6-gateway'] }} gateway = {{ slap_configuration['tap-ipv6-gateway'] }}
addr = {{ slap_configuration['tap-ipv6-addr'] }} addr = {{ slap_configuration['tap-ipv6-addr'] }}
{%- endif %}
{%- endif %} {%- endif %}
{%- else %} {%- else %}
...@@ -116,7 +123,7 @@ init = ...@@ -116,7 +123,7 @@ init =
# ( tap subinterface will be created for real later at install time - when it # ( tap subinterface will be created for real later at install time - when it
# is too late to update section options ) # is too late to update section options )
if {{ testing }}: if {{ testing }}:
slapnet = netaddr.IPNetwork('1234::/71') # no slaptap on StandaloneSlapOS slapnet = netaddr.IPNetwork('{{ str(test_slapnet) }}')
else: else:
slapnet = tapsplit.ifnet6('{{ slaplte.tap }}') slapnet = tapsplit.ifnet6('{{ slaplte.tap }}')
tapnet = tapsplit.netsplit(slapnet, {{ 1+ntap }}) [{{ i }}] tapnet = tapsplit.netsplit(slapnet, {{ 1+ntap }}) [{{ i }}]
...@@ -228,31 +235,32 @@ config-max-rx-sample-db = {{ slapparameter_dict.get("max_rx_sample_db", 0) }} ...@@ -228,31 +235,32 @@ config-max-rx-sample-db = {{ slapparameter_dict.get("max_rx_sample_db", 0) }}
{%- endif %} {%- endif %}
{{ rudrv.buildout_iru(iru, iru_icell_list) }} {{ rudrv.buildout_iru(iru, iru_icell_list) }}
{#- publish information about RU #} {#- publish information about RU (skipping synthetic) #}
{{ part('publish-%s' % ru_ref) }} {%- if iru.slave_reference %}
{{ part('ipublish-%s' % ru_ref) }}
recipe = slapos.cookbook:publish.serialised recipe = slapos.cookbook:publish.serialised
-slave-reference = {{ dumps(iru.slave_reference) }} -slave-reference = {{ dumps(iru.slave_reference) }}
{{ slap_configuration['slap-software-type'] }} = {{ dumps(root) }} {{ slap_configuration['slap-software-type'] }} = {{ dumps(root) }}
{%- set iru_icell_ref_list = [] %} {%- set iru_icell_ref_list = [] %}
{%- for icell in iru_icell_list %} {%- for icell in iru_icell_list %}
{%- do iru_icell_ref_list.append(J(jref_of_shared(icell))) %} {%- do iru_icell_ref_list.append(J(jref_of_shared(icell))) %}
{%- endfor %} {%- endfor %}
cell-list = {{ dumps(iru_icell_ref_list) }} cell-list = {{ dumps(iru_icell_ref_list) }}
{%- if ru.ru_link_type == 'cpri' %} {%- if ru.ru_link_type == 'cpri' %}
ipv6 = ${vtap.{{ ru.cpri_link._tap }}:gateway} ipv6 = ${vtap.{{ ru.cpri_link._tap }}:gateway}
{%- endif %}
{%- endif %} {%- endif %}
# XXX +error
{%- endfor %} {%- endfor %}
{#- handle configured cells XXX -> cell/libinstance ? #} {#- handle configured cells #}
{%- for cell_ref, icell in icell_dict|dictsort %} {%- for cell_ref, icell in icell_dict|dictsort %}
{%- set cell = icell['_'] %} {%- set cell = icell['_'] %}
{%- set ru_ref = J(jcell_ru_ref(icell, icell_dict)) %} {%- set ru_ref = J(jcell_ru_ref(icell, icell_dict)) %}
{%- set iru = iru_dict[ru_ref] %} {%- set iru = iru_dict[ru_ref] %}
{%- set ru = iru['_'] %} {%- set ru = iru['_'] %}
{%- if icell_kind == 'enb' %} {# XXX -> instance-enb ? #} {%- if icell_kind == 'enb' %}
{#- generate CELL-drb.cfg and CELL-sib23.asn #} {#- generate CELL-drb.cfg and CELL-sib23.asn #}
{{ part('drb-config-%s' % cell_ref) }} {{ part('drb-config-%s' % cell_ref) }}
<= config-base <= config-base
...@@ -283,13 +291,14 @@ ru_ref = {{ dumps(ru_ref ) }} ...@@ -283,13 +291,14 @@ ru_ref = {{ dumps(ru_ref ) }}
ru = {{ dumps(ru ) }} ru = {{ dumps(ru ) }}
{%- endif %} {%- endif %}
{#- publish information about the cell #} {#- publish information about the cell (skipping synthetic) #}
{{ part('publish-%s' % cell_ref) }} {%- if icell.slave_reference %}
{{ part('ipublish-%s' % cell_ref) }}
recipe = slapos.cookbook:publish.serialised recipe = slapos.cookbook:publish.serialised
-slave-reference = {{ dumps(icell.slave_reference) }} -slave-reference = {{ dumps(icell.slave_reference) }}
{{ slap_configuration['slap-software-type'] }} = {{ dumps(root) }} {{ slap_configuration['slap-software-type'] }} = {{ dumps(root) }}
ru = {{ dumps(ru_ref) }} ru = {{ dumps(ru_ref) }}
# XXX +error {%- endif %}
{%- endfor %} {%- endfor %}
......
...@@ -5,22 +5,24 @@ ...@@ -5,22 +5,24 @@
{%- set ru = iru['_'] %} {%- set ru = iru['_'] %}
{%- if len(icell_list) != 1 %} {%- if len(icell_list) != 1 %}
{%- do error(iru, 'ru/lopcomm supports only 1 cell ; requested %d' % len(icell_list)) %} {%- do ierror(iru, 'ru/lopcomm supports only 1 cell ; requested %d' % len(icell_list)) %}
{%- endif %} {%- endif %}
{%- set icell = icell_list[0] %} {%- set icell = icell_list[0] %}
{%- set cell = icell['_'] %} {%- set cell = icell['_'] %}
{#- indicate whether RU is listening for netconf #} {#- indicate whether RU is listening for netconf #}
{%- if not testing %}
{{ promise('%s-netconf-socket' % ru_ref) }} {{ promise('%s-netconf-socket' % ru_ref) }}
promise = check_socket_listening promise = check_socket_listening
config-host = ${vtap.{{ru.cpri_link._tap}}:gateway} config-host = ${vtap.{{ru.cpri_link._tap}}:gateway}
config-port = 830 config-port = 830
{%- endif %}
{#- push firmware to RU #} {#- push firmware to RU #}
[{{ B('%s-software-template' % ru_ref) }}] {{ part('%s-software-template' % ru_ref) }}
recipe = slapos.recipe.template:jinja2 recipe = slapos.recipe.template:jinja2
extensions = jinja2.ext.do extensions = jinja2.ext.do
_logbase = ${directory:var}/log/{{B('%s-software' % ru_ref)}} _logbase = ${directory:var}/log/{{B('%s-software' % ru_ref)}}
...@@ -45,9 +47,11 @@ mode = 0775 ...@@ -45,9 +47,11 @@ mode = 0775
url = {{ ru_lopcomm_software_template }} url = {{ ru_lopcomm_software_template }}
output = ${directory:script}/{{B('%s-software.py' % ru_ref)}} output = ${directory:script}/{{B('%s-software.py' % ru_ref)}}
{%- if not testing %}
{{ promise('%s-firmware' % ru_ref) }} {{ promise('%s-firmware' % ru_ref) }}
promise = check_command_execute promise = check_command_execute
config-command = [ -f ${ {{-B('%s-software-template' % ru_ref)}}:is_firmware_updated} ] config-command = [ -f ${ {{-B('%s-software-template' % ru_ref)}}:is_firmware_updated} ]
{%- endif %}
{#- push config to RU #} {#- push config to RU #}
...@@ -141,9 +145,11 @@ mode = 0775 ...@@ -141,9 +145,11 @@ mode = 0775
hash-files = hash-files =
${:command-line} ${:command-line}
{%- if not testing %}
{{ promise('%s-netconf-connection' % ru_ref) }} {{ promise('%s-netconf-connection' % ru_ref) }}
promise = check_command_execute promise = check_command_execute
config-command = [ -f ${ {{-B('%s-stats-template' % ru_ref)}}:is_netconf_connected} ] config-command = [ -f ${ {{-B('%s-stats-template' % ru_ref)}}:is_netconf_connected} ]
{%- endif %}
{{ promise('%s-vswr' % ru_ref) }} {{ promise('%s-vswr' % ru_ref) }}
promise = check_lopcomm_vswr promise = check_lopcomm_vswr
...@@ -230,10 +236,10 @@ hash-files = ...@@ -230,10 +236,10 @@ hash-files =
{#- amend RU-published information with Lopcomm-specific bits #} {#- amend RU-published information with Lopcomm-specific bits #}
[{{ B('publish-%s' % ru_ref) }}] [{{ B('ipublish-%s' % ru_ref) }}]
firmware = {{ru_lopcomm_firmware_filename}}
bbu-ssh-command = ssh ${user-info:pw-name}@${sshd-service:ipv6} -p ${sshd-service:port} bbu-ssh-command = ssh ${user-info:pw-name}@${sshd-service:ipv6} -p ${sshd-service:port}
bbu-ssh-url = ssh://${user-info:pw-name}@[${sshd-service:ipv6}]:${sshd-service:port} bbu-ssh-url = ssh://${user-info:pw-name}@[${sshd-service:ipv6}]:${sshd-service:port}
firmware = {{ru_lopcomm_firmware_filename}}
{%- endmacro %} {%- endmacro %}
...@@ -257,7 +263,7 @@ path_pid = ${directory:run}/sshd.pid ...@@ -257,7 +263,7 @@ path_pid = ${directory:run}/sshd.pid
inline = inline =
PidFile ${:path_pid} PidFile ${:path_pid}
Port ${sshd-port:port} Port ${sshd-port:port}
ListenAddress {{my_ipv6}} ListenAddress ${sshd-port:ip}
Protocol 2 Protocol 2
HostKey ${sshd-ssh-host-rsa-key:output} HostKey ${sshd-ssh-host-rsa-key:output}
HostKey ${sshd-ssh-host-ecdsa-key:output} HostKey ${sshd-ssh-host-ecdsa-key:output}
......
...@@ -47,7 +47,7 @@ ...@@ -47,7 +47,7 @@
# #
# Recommended usage of encode in buildout profiles is via B as illustrated below: # Recommended usage of encode in buildout profiles is via B as illustrated below:
# #
# {#- B(name) returns buildout-encoded form of name #} # {#- B(name) escapes name to be safe to use in buildout code. #}
# {%- set B = xbuildout.encode %} # {%- set B = xbuildout.encode %}
# #
# ... # ...
......
This diff is collapsed.
...@@ -156,6 +156,7 @@ def iRU2_SDR_tLTE_tNR(ienb): ...@@ -156,6 +156,7 @@ def iRU2_SDR_tLTE_tNR(ienb):
'n_antenna_ul': 1, 'n_antenna_ul': 1,
'tx_gain': 51, 'tx_gain': 51,
'rx_gain': 52, 'rx_gain': 52,
'txrx_active': 'ACTIVE',
} }
RU2 = copy.deepcopy(RU1) RU2 = copy.deepcopy(RU1)
......
...@@ -224,7 +224,7 @@ class RFTestCase4(AmariTestCase): ...@@ -224,7 +224,7 @@ class RFTestCase4(AmariTestCase):
def RU(i): def RU(i):
ru = cls.RUcfg(i) ru = cls.RUcfg(i)
ru |= {'n_antenna_dl': 4, 'n_antenna_ul': 2} ru |= {'n_antenna_dl': 4, 'n_antenna_ul': 2}
ru |= {'tx_gain': 10+i, 'rx_gain': 20+i, 'txrx_active': 'INACTIVE'} ru |= {'tx_gain': 10+i, 'rx_gain': 20+i, 'txrx_active': 'ACTIVE'}
cls.requestShared(imain, 'RU%d' % i, ru) cls.requestShared(imain, 'RU%d' % i, ru)
def CELL(i, ctx): def CELL(i, ctx):
...@@ -450,6 +450,7 @@ class SDR4: ...@@ -450,6 +450,7 @@ class SDR4:
# radio units configuration # radio units configuration
def test_rf_cfg_ru(t): def test_rf_cfg_ru(t):
assertMatch(t, t.rf_cfg['rf_driver'], dict( assertMatch(t, t.rf_cfg['rf_driver'], dict(
name='sdr',
args='dev0=/dev/sdr2,dev1=/dev/sdr3,dev2=/dev/sdr4,dev3=/dev/sdr5,' + args='dev0=/dev/sdr2,dev1=/dev/sdr3,dev2=/dev/sdr4,dev3=/dev/sdr5,' +
'dev4=/dev/sdr6,dev5=/dev/sdr7,dev6=/dev/sdr8,dev7=/dev/sdr9', 'dev4=/dev/sdr6,dev5=/dev/sdr7,dev6=/dev/sdr8,dev7=/dev/sdr9',
cpri_mapping=NO, cpri_mapping=NO,
...@@ -482,6 +483,7 @@ class Lopcomm4: ...@@ -482,6 +483,7 @@ class Lopcomm4:
# radio units configuration in enb.cfg # radio units configuration in enb.cfg
def test_rf_cfg_ru(t): def test_rf_cfg_ru(t):
assertMatch(t, t.rf_cfg['rf_driver'], dict( assertMatch(t, t.rf_cfg['rf_driver'], dict(
name='sdr',
args='dev0=/dev/sdr0@1,dev1=/dev/sdr0@2,dev2=/dev/sdr0@3,dev3=/dev/sdr0@4', args='dev0=/dev/sdr0@1,dev1=/dev/sdr0@2,dev2=/dev/sdr0@3,dev3=/dev/sdr0@4',
cpri_mapping='hw,hw,hw,hw', cpri_mapping='hw,hw,hw,hw',
cpri_mult='4,4,4,4', cpri_mult='4,4,4,4',
...@@ -501,14 +503,14 @@ class Lopcomm4: ...@@ -501,14 +503,14 @@ class Lopcomm4:
'center-of-channel-bandwidth': '%d' % dl_freq, 'center-of-channel-bandwidth': '%d' % dl_freq,
'channel-bandwidth': '%d' % bw, 'channel-bandwidth': '%d' % bw,
'gain': '%d' % tx_gain, 'gain': '%d' % tx_gain,
'active': 'INACTIVE', 'active': 'ACTIVE',
}, },
'rx-array-carriers': { 'rx-array-carriers': {
'absolute-frequency-center': '%d' % ul_arfcn, 'absolute-frequency-center': '%d' % ul_arfcn,
'center-of-channel-bandwidth': '%d' % ul_freq, 'center-of-channel-bandwidth': '%d' % ul_freq,
'channel-bandwidth': '%d' % bw, 'channel-bandwidth': '%d' % bw,
# XXX no rx_gain # XXX no rx_gain
'active': 'INACTIVE', 'active': 'ACTIVE',
}, },
} }
...@@ -580,6 +582,7 @@ class Sunwave4: ...@@ -580,6 +582,7 @@ class Sunwave4:
# radio units configuration in enb.cfg # radio units configuration in enb.cfg
def test_rf_cfg_ru(t): def test_rf_cfg_ru(t):
assertMatch(t, t.rf_cfg['rf_driver'], dict( assertMatch(t, t.rf_cfg['rf_driver'], dict(
name='sdr',
args='dev0=/dev/sdr1@1,dev1=/dev/sdr1@2,dev2=/dev/sdr1@3,dev3=/dev/sdr1@4', args='dev0=/dev/sdr1@1,dev1=/dev/sdr1@2,dev2=/dev/sdr1@3,dev3=/dev/sdr1@4',
cpri_mapping='bf1,bf1,bf1,bf1', cpri_mapping='bf1,bf1,bf1,bf1',
cpri_mult='5,5,5,5', cpri_mult='5,5,5,5',
...@@ -603,6 +606,7 @@ class RUMultiType4: ...@@ -603,6 +606,7 @@ class RUMultiType4:
# radio units configuration in enb.cfg # radio units configuration in enb.cfg
def test_rf_cfg_ru(t): def test_rf_cfg_ru(t):
assertMatch(t, t.rf_cfg['rf_driver'], dict( assertMatch(t, t.rf_cfg['rf_driver'], dict(
name='sdr',
args='dev0=/dev/sdr0@1,dev1=/dev/sdr0@2,dev2=/dev/sdr1@3,dev3=/dev/sdr1@4', args='dev0=/dev/sdr0@1,dev1=/dev/sdr0@2,dev2=/dev/sdr1@3,dev3=/dev/sdr1@4',
cpri_mapping='hw,hw,bf1,bf1', cpri_mapping='hw,hw,bf1,bf1',
cpri_mult='4,4,5,5', cpri_mult='4,4,5,5',
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
export SLAPOS_TEST_DEBUG=1 export SLAPOS_TEST_DEBUG=1
export SLAPOS_TEST_VERBOSE=1 export SLAPOS_TEST_VERBOSE=1
export SLAPOS_TEST_SKIP_SOFTWARE_CHECK=1 export SLAPOS_TEST_SKIP_SOFTWARE_CHECK=1
export SLAPOS_TEST_SKIP_SOFTWARE_REBUILD=0 export SLAPOS_TEST_SKIP_SOFTWARE_REBUILD=0
rm -rf snapshot rm -rf snapshot
......
[buildout] [buildout]
find-links += find-links +=
http://www.nexedi.org/static/packages/source/ http://www.nexedi.org/static/packages/source/slapos.buildout/zc.buildout-2.7.1%2Bslapos010.tar.gz
http://www.nexedi.org/static/packages/source/slapos.buildout/ http://www.nexedi.org/static/packages/source/zc.recipe.egg-2.0.3%2Bslapos003.tar.gz
parts = parts =
instance-template instance-template
......
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