Commit 1537b40d authored by Joanne Hugé's avatar Joanne Hugé

Update Release Candidate

parents f2ea3c29 c87e9c90
...@@ -18,8 +18,8 @@ parts = ...@@ -18,8 +18,8 @@ parts =
[git] [git]
recipe = slapos.recipe.cmmi recipe = slapos.recipe.cmmi
shared = true shared = true
url = https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.35.1.tar.xz url = https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.37.0.tar.xz
md5sum = 3aae077280b6be861e3c1c637491853a md5sum = 9716e2b4be3f9e1105f23aa1f80a37e4
configure-options = configure-options =
--with-curl=${curl:location} --with-curl=${curl:location}
--with-openssl=${openssl:location} --with-openssl=${openssl:location}
......
...@@ -18,5 +18,5 @@ configure-option = ...@@ -18,5 +18,5 @@ configure-option =
--disable-documentation --disable-documentation
environment = environment =
PATH=${m4:location}/bin:${patch:location}/bin:%(PATH)s PATH=${m4:location}/bin:${patch:location}/bin:%(PATH)s
CPPFLAGS=-I${gmp:location}/include CPPFLAGS=-I${gmp:location}/include -I${openssl:location}/include
LDFLAGS=-L${gmp:location}/lib -Wl,-rpath=${gmp:location}/lib -Wl,-rpath=@@LOCATION@@/lib LDFLAGS=-L${gmp:location}/lib -Wl,-rpath=${gmp:location}/lib -Wl,-rpath=@@LOCATION@@/lib -L${openssl:location}/lib -Wl,-rpath=${openssl:location}/lib
...@@ -71,7 +71,17 @@ install = ...@@ -71,7 +71,17 @@ install =
extract_dir = self.extract(self.download(url, md5sum)) extract_dir = self.extract(self.download(url, md5sum))
destination_dir = os.path.join(options['location'], extension_name) destination_dir = os.path.join(options['location'], extension_name)
self.copyTree(guessworkdir(extract_dir), destination_dir) self.copyTree(guessworkdir(extract_dir), destination_dir)
patches = options.get(extension_name + '-patches')
if patches:
self.applyPatchList(
patches,
patch_options=options.get(extension_name + '-patch-options', '-p1'),
patch_binary=options['patch-binary'],
cwd=destination_dir,
)
os.chmod(destination_dir, 0o750) os.chmod(destination_dir, 0o750)
patch-binary = ${patch:location}/bin/patch
ms-python-python-patches = ${:_profile_base_location_}/${ms-python-disable-jedi-buildout.patch:_update_hash_filename_} ${ms-python-disable-jedi-buildout.patch:md5sum}
[package.json] [package.json]
content = content =
......
...@@ -20,3 +20,7 @@ md5sum = 8157c22134200bd862a07c6521ebf799 ...@@ -20,3 +20,7 @@ md5sum = 8157c22134200bd862a07c6521ebf799
[yarn.lock] [yarn.lock]
_update_hash_filename_ = yarn.lock _update_hash_filename_ = yarn.lock
md5sum = b1012625be07ad6a3daf27b9ed6004f0 md5sum = b1012625be07ad6a3daf27b9ed6004f0
[ms-python-disable-jedi-buildout.patch]
_update_hash_filename_ = ms-python-disable-jedi-buildout.patch
md5sum = 0ec840ffecceaf7e91a037d439962415
jedi: Disable discover_buildout_paths
This slows down jedi a lot and can make it crash on some scripts.
See also https://github.com/davidhalter/jedi/issues/1325
---
extension/pythonFiles/lib/python/jedi/inference/sys_path.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/extension/pythonFiles/lib/python/jedi/inference/sys_path.py b/extension/pythonFiles/lib/python/jedi/inference/sys_path.py
index 5b82ec1..256b19c 100644
--- a/extension/pythonFiles/lib/python/jedi/inference/sys_path.py
+++ b/extension/pythonFiles/lib/python/jedi/inference/sys_path.py
@@ -137,6 +137,7 @@ def check_sys_path_modifications(module_context):
def discover_buildout_paths(inference_state, script_path):
buildout_script_paths = set()
+ return buildout_script_paths
for buildout_script_path in _get_buildout_script_paths(script_path):
for path in _get_paths_from_buildout_script(inference_state, buildout_script_path):
...@@ -86,9 +86,9 @@ eggs += ...@@ -86,9 +86,9 @@ eggs +=
[beremiz] [beremiz]
recipe = slapos.recipe.build:download-unpacked recipe = slapos.recipe.build:download-unpacked
# download beremiz at revision 86b02aa32d413437ddcb9ab6cf4cc72aad394b3e # download beremiz at revision 8171447dc479012a58fae0f2ffd233ade7d28d6a
url = https://github.com/beremiz/beremiz/archive/86b02aa32d413437ddcb9ab6cf4cc72aad394b3e.tar.gz url = https://github.com/beremiz/beremiz/archive/8171447dc479012a58fae0f2ffd233ade7d28d6a.tar.gz
md5sum = 0b46be8c8e849bd612373dc999427912 md5sum = 48070804b00b633d79dfc4bae3a73646
[beremiz-setup] [beremiz-setup]
recipe = zc.recipe.egg:develop recipe = zc.recipe.egg:develop
......
[instance-profile] [instance-profile]
filename = instance.cfg.in filename = instance.cfg.in
md5sum = 6e3e1dc304378640707cdb6a792106f1 md5sum = f0714597e23ebcb0f2a1368cd065a84e
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
parts = parts =
publish-connection-parameter publish-connection-parameter
download-plc download-plc
compile-plc
beremiz-runtime beremiz-runtime
#beremiz-runtime-promise #beremiz-runtime-promise
...@@ -20,6 +21,13 @@ recipe = slapos.recipe.build:download-unpacked ...@@ -20,6 +21,13 @@ recipe = slapos.recipe.build:download-unpacked
offline = false offline = false
url = ${instance-parameter:configuration.runtime_plc_url} url = ${instance-parameter:configuration.runtime_plc_url}
[compile-plc]
recipe = plone.recipe.command
stop-on-error = true
command =
{{ buildout['bin-directory'] }}/pythonwitheggs {{ buildout['directory'] }}/parts/beremiz-source/Beremiz_cli.py --project-home ${directory:home}/parts/download-plc/ build
update-command = ${:command}
[instance-parameter] [instance-parameter]
recipe = slapos.cookbook:slapconfiguration recipe = slapos.cookbook:slapconfiguration
computer = ${slap-connection:computer-id} computer = ${slap-connection:computer-id}
...@@ -47,7 +55,7 @@ log = ${:var}/log ...@@ -47,7 +55,7 @@ log = ${:var}/log
logfile = ${directory:log}/beremiz-runtime.log logfile = ${directory:log}/beremiz-runtime.log
recipe = slapos.cookbook:wrapper recipe = slapos.cookbook:wrapper
command-line = command-line =
{{ buildout['bin-directory'] }}/pythonwitheggs {{ buildout['directory'] }}/parts/beremiz-source/Beremiz_service.py -a ${instance-parameter:configuration.autostart} -p ${instance-parameter:configuration.port} -i ${instance-parameter:configuration.interface} -x 1 ${directory:home}/parts/download-plc {{ buildout['bin-directory'] }}/pythonwitheggs {{ buildout['directory'] }}/parts/beremiz-source/Beremiz_service.py -a ${instance-parameter:configuration.autostart} -p ${instance-parameter:configuration.port} -i ${instance-parameter:configuration.interface} -x 1 ${directory:home}/parts/download-plc/build
wrapper-path = ${directory:service}/beremiz-runtime wrapper-path = ${directory:service}/beremiz-runtime
[beremiz-runtime-promise] [beremiz-runtime-promise]
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
extends = extends =
buildout.hash.cfg buildout.hash.cfg
../../component/git/buildout.cfg ../../component/git/buildout.cfg
../../component/matiec/buildout.cfg
../../stack/monitor/buildout.cfg ../../stack/monitor/buildout.cfg
../../stack/slapos.cfg ../../stack/slapos.cfg
...@@ -10,11 +11,12 @@ parts = ...@@ -10,11 +11,12 @@ parts =
slapos-cookbook slapos-cookbook
instance-profile instance-profile
python-interpreter python-interpreter
matiec
[beremiz-source] [beremiz-source]
recipe = slapos.recipe.build:gitclone recipe = slapos.recipe.build:gitclone
repository = https://github.com/beremiz/beremiz.git repository = https://github.com/beremiz/beremiz.git
branch = default revision = 8171447dc479012a58fae0f2ffd233ade7d28d6a
git-executable = ${git:location}/bin/git git-executable = ${git:location}/bin/git
[beremiz] [beremiz]
...@@ -45,6 +47,10 @@ eggs = click ...@@ -45,6 +47,10 @@ eggs = click
Nevow Nevow
msgpack msgpack
autobahn autobahn
numpy
lxml
cycler
opcua
${beremiz:egg} ${beremiz:egg}
${Twisted:egg} ${Twisted:egg}
...@@ -92,3 +98,12 @@ typing = 3.10.0.0 ...@@ -92,3 +98,12 @@ typing = 3.10.0.0
autobahn = 19.11.2 autobahn = 19.11.2
txaio = 18.8.1 txaio = 18.8.1
idna = 2.10 idna = 2.10
numpy = 1.16.5
cycler = 0.10.0
click = 7.1.2
lxml = 4.5.0
opcua = 0.98.13
trollius = 2.2.1
futures = 3.3.0
...@@ -22,7 +22,7 @@ md5sum = 5784bea3bd608913769ff9a8afcccb68 ...@@ -22,7 +22,7 @@ md5sum = 5784bea3bd608913769ff9a8afcccb68
[profile-caddy-frontend] [profile-caddy-frontend]
filename = instance-apache-frontend.cfg.in filename = instance-apache-frontend.cfg.in
md5sum = 02ce5d44d49982fda598e3086cfbca99 md5sum = 1e912fb970401a4b7670b25ba8284a5b
[profile-caddy-replicate] [profile-caddy-replicate]
filename = instance-apache-replicate.cfg.in filename = instance-apache-replicate.cfg.in
...@@ -38,7 +38,7 @@ md5sum = be54431846fe7f3cee65260eefc83d62 ...@@ -38,7 +38,7 @@ md5sum = be54431846fe7f3cee65260eefc83d62
[profile-caddy-frontend-configuration] [profile-caddy-frontend-configuration]
_update_hash_filename_ = templates/Caddyfile.in _update_hash_filename_ = templates/Caddyfile.in
md5sum = fdf46b1dee6ea6b91b9aa9e322a0530d md5sum = cb627dfce9ab7bc23fd98818d55876b7
[template-not-found-html] [template-not-found-html]
_update_hash_filename_ = templates/notfound.html _update_hash_filename_ = templates/notfound.html
......
...@@ -413,6 +413,7 @@ extra-context = ...@@ -413,6 +413,7 @@ extra-context =
key not_found_file caddy-configuration:not-found-file key not_found_file caddy-configuration:not-found-file
key username monitor-instance-parameter:username key username monitor-instance-parameter:username
key password monitor-htpasswd:passwd key password monitor-htpasswd:passwd
key global_disable_http2 configuration:global-disable-http2
# BBB: SlapOS Master non-zero knowledge BEGIN # BBB: SlapOS Master non-zero knowledge BEGIN
key apache_certificate apache-certificate:output key apache_certificate apache-certificate:output
# BBB: SlapOS Master non-zero knowledge END # BBB: SlapOS Master non-zero knowledge END
......
...@@ -3,7 +3,16 @@ ...@@ -3,7 +3,16 @@
import {{ slave_configuration_directory }}/*.conf import {{ slave_configuration_directory }}/*.conf
:{{ https_port }} { :{{ https_port }} {
tls {{ master_certificate }} {{ master_certificate }} tls {{ master_certificate }} {{ master_certificate }} {
{%- if global_disable_http2 %}
# Disallow HTTP2
alpn http/1.1
{%- else %}
# Allow http2
alpn h2 http/1.1
{%- endif %}
}
bind {{ local_ipv4 }} bind {{ local_ipv4 }}
status 404 / status 404 /
log / {{ access_log }} "{remote} - {>REMOTE_USER} [{when}] \"{method} {uri} {proto}\" {status} {size} \"{>Referer}\" \"{>User-Agent}\" {latency_ms}" { log / {{ access_log }} "{remote} - {>REMOTE_USER} [{when}] \"{method} {uri} {proto}\" {status} {size} \"{>Referer}\" \"{>User-Agent}\" {latency_ms}" {
...@@ -29,7 +38,15 @@ import {{ slave_configuration_directory }}/*.conf ...@@ -29,7 +38,15 @@ import {{ slave_configuration_directory }}/*.conf
# Access to server-status Caddy-style # Access to server-status Caddy-style
https://[{{ global_ipv6 }}]:{{ https_port }}/server-status, https://{{ local_ipv4 }}:{{ https_port }}/server-status { https://[{{ global_ipv6 }}]:{{ https_port }}/server-status, https://{{ local_ipv4 }}:{{ https_port }}/server-status {
tls {{ frontend_configuration['ip-access-certificate'] }} {{ frontend_configuration['ip-access-certificate'] }} tls {{ frontend_configuration['ip-access-certificate'] }} {{ frontend_configuration['ip-access-certificate'] }} {
{%- if global_disable_http2 %}
# Disallow HTTP2
alpn http/1.1
{%- else %}
# Allow http2
alpn h2 http/1.1
{%- endif %}
}
bind {{ local_ipv4 }} bind {{ local_ipv4 }}
basicauth "{{ username }}" {{ password | trim }} { basicauth "{{ username }}" {{ password | trim }} {
"Server Status" "Server Status"
......
...@@ -472,7 +472,8 @@ ...@@ -472,7 +472,8 @@
"data-to-vm": { "data-to-vm": {
"title": "Text content to send to this virtual machine.", "title": "Text content to send to this virtual machine.",
"description": "Text content which will be written in a file 'data' of http server of this virtual machine instance. The file will be available via URL: http://10.0.2.100/data in the VM.", "description": "Text content which will be written in a file 'data' of http server of this virtual machine instance. The file will be available via URL: http://10.0.2.100/data in the VM.",
"type": "string" "type": "string",
"textarea": true
}, },
"disable-ansible-promise": { "disable-ansible-promise": {
"title": "Desactivate Ansible promise check", "title": "Desactivate Ansible promise check",
......
...@@ -305,7 +305,8 @@ ...@@ -305,7 +305,8 @@
"data-to-vm": { "data-to-vm": {
"title": "Text content to send to this virtual machine.", "title": "Text content to send to this virtual machine.",
"description": "Text content which will be written in a file 'data' of http server of this virtual machine instance. The file will be available via URL: http://10.0.2.100/data in the VM.", "description": "Text content which will be written in a file 'data' of http server of this virtual machine instance. The file will be available via URL: http://10.0.2.100/data in the VM.",
"type": "string" "type": "string",
"textarea": true
}, },
"frontend-instance-guid": { "frontend-instance-guid": {
"title": "Frontend Instance ID", "title": "Frontend Instance ID",
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
[template-matomo-instance] [template-matomo-instance]
filename = matomo-instance.cfg.in filename = matomo-instance.cfg.in
md5sum = 9ff98282480b9edf9af75fca5da5f349 md5sum = 145ebeb4adcd4ec3d13929f1d2ee239c
[template-matomo-backup.sh] [template-matomo-backup.sh]
filename = matomo-backup.sh.in filename = matomo-backup.sh.in
......
...@@ -19,3 +19,12 @@ output = ${directory:scripts}/matomo-backup ...@@ -19,3 +19,12 @@ output = ${directory:scripts}/matomo-backup
context = context =
section parameter_dict instance-parameter section parameter_dict instance-parameter
key php_bin php-bin:wrapper-path key php_bin php-bin:wrapper-path
[apache-php-service]
environment=
MATOMO_DATABASE_HOST=${mariadb-urlparse:host}:${mariadb-urlparse:port}
MATOMO_DATABASE_ADAPTER=mysql
MATOMO_DATABASE_TABLES_PREFIX=matomo_
MATOMO_DATABASE_USERNAME=${mariadb-urlparse:username}
MATOMO_DATABASE_PASSWORD=${mariadb-urlparse:password}
MATOMO_DATABASE_DBNAME=${mariadb-urlparse:path}
...@@ -46,6 +46,7 @@ setup( ...@@ -46,6 +46,7 @@ setup(
'slapos.libnetworkcache', 'slapos.libnetworkcache',
'erp5.util', 'erp5.util',
'requests', 'requests',
'lxml',
], ],
zip_safe=True, zip_safe=True,
test_suite='test', test_suite='test',
......
...@@ -25,10 +25,14 @@ ...@@ -25,10 +25,14 @@
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# #
############################################################################## ##############################################################################
import io
import os import os
import requests import urllib.parse
import glob import glob
import lxml.etree
import requests
from slapos.testing.testcase import makeModuleSetUpAndTestCaseClass from slapos.testing.testcase import makeModuleSetUpAndTestCaseClass
setUpModule, SlapOSInstanceTestCase = makeModuleSetUpAndTestCaseClass( setUpModule, SlapOSInstanceTestCase = makeModuleSetUpAndTestCaseClass(
...@@ -63,5 +67,25 @@ class MatomoTestCase(SlapOSInstanceTestCase): ...@@ -63,5 +67,25 @@ class MatomoTestCase(SlapOSInstanceTestCase):
resp = requests.get(self.connection_parameters['monitor-setup-url'], verify=False) resp = requests.get(self.connection_parameters['monitor-setup-url'], verify=False)
self.assertEqual(requests.codes.ok, resp.status_code) self.assertEqual(requests.codes.ok, resp.status_code)
def test_database_setup(self):
# Database setup page is prefilled with mariadb connection parameters
resp = requests.get(
urllib.parse.urljoin(
self.connection_parameters['backend-url'],
'index.php?module=CoreUpdater&action=databaseSetup'),
verify=False)
parser = lxml.etree.HTMLParser()
tree = lxml.etree.parse(io.StringIO(resp.text), parser)
self.assertEqual(
tree.xpath('//input[@name="username"]/@value'),
['matomo'])
self.assertEqual(
tree.xpath('//input[@name="dbname"]/@value'),
['matomo'])
self.assertTrue(
tree.xpath('//input[@name="password"]/@value')[0])
self.assertEqual(
tree.xpath('//input[@name="host"]/@value'),
[f'{self._ipv4_address}:2099']
)
...@@ -16,27 +16,27 @@ ...@@ -16,27 +16,27 @@
[template] [template]
filename = instance.cfg filename = instance.cfg
md5sum = 7b96a100c24e3b282246ae79e97b887b md5sum = 9d5f4fc9ed3664140d33dd7c447dbd63
[template-lte-enb-epc] [template-lte-enb-epc]
_update_hash_filename_ = instance-enb-epc.jinja2.cfg _update_hash_filename_ = instance-enb-epc.jinja2.cfg
md5sum = 1358f8e0a4cecefe4cdf389b69067f34 md5sum = 8ea71fb85a30e5f57d823ea2f48cb9de
[template-lte-enb] [template-lte-enb]
_update_hash_filename_ = instance-enb.jinja2.cfg _update_hash_filename_ = instance-enb.jinja2.cfg
md5sum = 80ee6b6aae270e5a44e84ba8edc6b3c6 md5sum = 78b83842ca2e49dd9f19eab117dc2733
[template-lte-gnb-epc] [template-lte-gnb-epc]
_update_hash_filename_ = instance-gnb-epc.jinja2.cfg _update_hash_filename_ = instance-gnb-epc.jinja2.cfg
md5sum = c160dac9b21ca748452e466bb3016ac8 md5sum = 33a6236150551c5328d27d3b7f07f690
[template-lte-gnb] [template-lte-gnb]
_update_hash_filename_ = instance-gnb.jinja2.cfg _update_hash_filename_ = instance-gnb.jinja2.cfg
md5sum = 8c8d05845be9b7c2c3f79bd3309ba88d md5sum = 690761b983087465a118a49f1379f0b6
[template-lte-epc] [template-lte-epc]
_update_hash_filename_ = instance-epc.jinja2.cfg _update_hash_filename_ = instance-epc.jinja2.cfg
md5sum = 0c69dee1e1afcdcca250fa78e76a0615 md5sum = 83ad87a675ce1ccf1449e80f3848af80
[ue_db.jinja2.cfg] [ue_db.jinja2.cfg]
filename = config/ue_db.jinja2.cfg filename = config/ue_db.jinja2.cfg
...@@ -44,11 +44,11 @@ md5sum = d33163012d6c98efc59161974c649557 ...@@ -44,11 +44,11 @@ md5sum = d33163012d6c98efc59161974c649557
[enb.jinja2.cfg] [enb.jinja2.cfg]
filename = config/enb.jinja2.cfg filename = config/enb.jinja2.cfg
md5sum = aeb1e8ff149db6ecaf2734cf7dc326aa md5sum = b78082a9c5d6af79f11a1c79d6d25a86
[gnb.jinja2.cfg] [gnb.jinja2.cfg]
filename = config/gnb.jinja2.cfg filename = config/gnb.jinja2.cfg
md5sum = 2830e108184cca7740e5373e9bc4920a md5sum = 944e342d426d5a7c4c16bdcb01398ba3
[ltelogs.jinja2.sh] [ltelogs.jinja2.sh]
filename = ltelogs.jinja2.sh filename = ltelogs.jinja2.sh
...@@ -56,7 +56,7 @@ md5sum = 1ba2e065bdf14a6411e95e80db17dcfd ...@@ -56,7 +56,7 @@ md5sum = 1ba2e065bdf14a6411e95e80db17dcfd
[mme.jinja2.cfg] [mme.jinja2.cfg]
filename = config/mme.jinja2.cfg filename = config/mme.jinja2.cfg
md5sum = 518c71ce57204304b703b977c665a164 md5sum = 13ce0230f06e1089c10924b17f80e49b
[ims.jinja2.cfg] [ims.jinja2.cfg]
filename = config/ims.jinja2.cfg filename = config/ims.jinja2.cfg
......
...@@ -26,9 +26,6 @@ ...@@ -26,9 +26,6 @@
log_options: "all.level=debug,all.max_size=32,file.rotate=1G,file.path={{ directory['tmp'] }}", log_options: "all.level=debug,all.max_size=32,file.rotate=1G,file.path={{ directory['tmp'] }}",
log_filename: "{{ directory['log'] }}/enb.log", log_filename: "{{ directory['log'] }}/enb.log",
/* Enable remote API and Web interface */
com_addr: "[{{ slap_configuration['ipv6-random'] }}]:{{ slap_configuration['configuration.enb_ws_port'] }}",
/* RF driver configuration */ /* RF driver configuration */
rf_driver: { rf_driver: {
name: "sdr", name: "sdr",
...@@ -53,15 +50,25 @@ ...@@ -53,15 +50,25 @@
#endif #endif
mme_list: [ mme_list: [
{% if slapparameter_dict.get('mme_list', '') %}
{%- for i, k in enumerate(slapparameter_dict['mme_list']) %}
{%- if i == 0 %}
{ {
/* address of MME for S1AP connection. Must be modified if the MME {%- else -%}
runs on a different host. */ , {
mme_addr: "{{ slapparameter_dict.get('mme_addr', '127.0.1.100') }}" {%- endif %}
mme_addr: "{{ slapparameter_dict['mme_list'][k]['mme_addr'] }}",
}
{%- endfor -%}
{% else %}
{
mme_addr: "127.0.1.100",
}, },
{% endif %}
], ],
/* GTP bind address (=address of the ethernet interface connected to /* GTP bind address (=address of the ethernet interface connected to
the MME). Must be modified if the MME runs on a different host. */ the MME). Must be modified if the MME runs on a different host. */
{% if slapparameter_dict.get('mme_addr', '') %} {% if slapparameter_dict.get('mme_list', '') %}
gtp_addr: "{{ gtp_addr }}", gtp_addr: "{{ gtp_addr }}",
{% else %} {% else %}
gtp_addr: "127.0.1.1", gtp_addr: "127.0.1.1",
...@@ -75,7 +82,23 @@ ...@@ -75,7 +82,23 @@
{ {
/* Broadcasted PLMN identities */ /* Broadcasted PLMN identities */
plmn_list: [ plmn_list: [
{%- if slapparameter_dict.get('plmn_list', '') %}
{%- for i, k in enumerate(slapparameter_dict['plmn_list']) %}
{%- if i == 0 -%}
{
{%- else -%}
, {
{%- endif %}
plmn: "{{ slapparameter_dict['plmn_list'][k]['plmn'] }}",
reserved: {{ str(slapparameter_dict['plmn_list'][k].get('reserved', false)).lower() }},
{%- if slapparameter_dict['plmn_list'][k].get('attach_without_pdn', '') %}
attach_without_pdn: {{ str(slapparameter_dict['plmn_list'][k]['attach_without_pdn']).lower() }},
{%- endif %}
}
{%- endfor -%}
{% else %}
"00101", "00101",
{% endif %}
], ],
dl_earfcn: {{ slapparameter_dict.get('dl_earfcn', slap_configuration['configuration.default_dl_earfcn']) }}, dl_earfcn: {{ slapparameter_dict.get('dl_earfcn', slap_configuration['configuration.default_dl_earfcn']) }},
......
...@@ -20,9 +20,6 @@ ...@@ -20,9 +20,6 @@
log_options: "all.level=debug,all.max_size=32,file.rotate=1G,file.path={{ directory['tmp'] }}", log_options: "all.level=debug,all.max_size=32,file.rotate=1G,file.path={{ directory['tmp'] }}",
log_filename: "{{ directory['log'] }}/gnb.log", log_filename: "{{ directory['log'] }}/gnb.log",
/* Enable remote API and Web interface */
com_addr: "[{{ slap_configuration['ipv6-random'] }}]:{{ slap_configuration['configuration.enb_ws_port'] }}",
rf_driver: { rf_driver: {
name: "sdr", name: "sdr",
/* list of devices. 'dev0' is always the master. */ /* list of devices. 'dev0' is always the master. */
...@@ -35,14 +32,25 @@ ...@@ -35,14 +32,25 @@
rx_gain: {{ slapparameter_dict.get('rx_gain', slap_configuration['configuration.default_nr_rx_gain']) }}, /* RX gain (in dB) */ rx_gain: {{ slapparameter_dict.get('rx_gain', slap_configuration['configuration.default_nr_rx_gain']) }}, /* RX gain (in dB) */
amf_list: [ amf_list: [
{% if slapparameter_dict.get('amf_list', '') %}
{%- for i, k in enumerate(slapparameter_dict['amf_list']) %}
{%- if i == 0 %}
{
{%- else -%}
, {
{%- endif %}
amf_addr: "{{ slapparameter_dict['amf_list'][k]['amf_addr'] }}",
}
{%- endfor -%}
{% else %}
{ {
/* address of AMF for NGAP connection. Must be modified if the AMF runs on a different host. */ amf_addr: "127.0.1.100",
amf_addr: "{{ slapparameter_dict.get('amf_addr', '127.0.1.100') }}",
}, },
{% endif %}
], ],
/* GTP bind address (=address of the ethernet interface connected to /* GTP bind address (=address of the ethernet interface connected to
the AMF). Must be modified if the AMF runs on a different host. */ the AMF). Must be modified if the AMF runs on a different host. */
{% if slapparameter_dict.get('amf_addr', '') %} {% if slapparameter_dict.get('amf_list', '') %}
gtp_addr: "{{ gtp_addr }}", gtp_addr: "{{ gtp_addr }}",
{% else %} {% else %}
gtp_addr: "127.0.1.1", gtp_addr: "127.0.1.1",
...@@ -163,23 +171,69 @@ ...@@ -163,23 +171,69 @@
ssb_period: 20, /* in ms */ ssb_period: 20, /* in ms */
n_id_cell: 500, n_id_cell: 500,
plmn_list: [ { plmn_list: [
tac: 100, {%- if slapparameter_dict.get('plmn_list', '') %}
{%- for i, k in enumerate(slapparameter_dict['plmn_list']) %}
{%- if i == 0 -%}
{
{%- else -%}
, {
{%- endif %}
plmn: "{{ slapparameter_dict['plmn_list'][k]['plmn'] }}",
tac: {{ slapparameter_dict['plmn_list'][k].get('tac', 100) }},
{%- if slapparameter_dict['plmn_list'][k].get('ranac', '') %}
ranac: {{ slapparameter_dict['plmn_list'][k]['ranac'] }},
{%- endif %}
reserved: {{ str(slapparameter_dict['plmn_list'][k].get('reserved', false)).lower() }},
nssai: [
{%- if slapparameter_dict.get('nssai', '') %}
{%- for j, k in enumerate(slapparameter_dict['nssai']) %}
{%- if j == 0 %}
{
{%- else -%}
, {
{%- endif %}
sst: {{ slapparameter_dict['nssai'][k]['sst'] }},
{%- if slapparameter_dict['nssai'][k].get('sd', '') %}
sd: {{ slapparameter_dict['nssai'][k]['sd'] }},
{%- endif %}
}
{%- endfor -%}
{% else %}
{
sst: 1,
},
{% endif %}
],
}
{%- endfor -%}
{% else %}
{
plmn: "00101", plmn: "00101",
tac: 100,
reserved: false, reserved: false,
nssai: [ nssai: [
{%- if slapparameter_dict.get('nssai', '') %}
{%- for j, k in enumerate(slapparameter_dict['nssai']) %}
{%- if j == 0 %}
{
{%- else -%}
, {
{%- endif %}
sst: {{ slapparameter_dict['nssai'][k]['sst'] }},
{%- if slapparameter_dict['nssai'][k].get('sd', '') %}
sd: {{ slapparameter_dict['nssai'][k]['sd'] }},
{%- endif %}
}
{%- endfor -%}
{% else %}
{ {
sst: 1, sst: 1,
}, },
/*{ {% endif %}
sst: 2,
},
{
sst: 3,
sd: 50,
},*/
], ],
}, },
{%- endif %}
], ],
/*sib_sched_list: [ /*sib_sched_list: [
......
...@@ -19,16 +19,17 @@ ...@@ -19,16 +19,17 @@
log_options: "all.level=debug,all.max_size=32", log_options: "all.level=debug,all.max_size=32",
log_filename: "{{ directory['log'] }}/mme.log", log_filename: "{{ directory['log'] }}/mme.log",
/* Enable remote API and Web interface */
com_addr: "[{{ slap_configuration['ipv6-random'] }}]:{{ slap_configuration['configuration.mme_ws_port'] }}",
/* bind address for GTP-U. Normally = address of the PC, here bound /* bind address for GTP-U. Normally = address of the PC, here bound
on local interface to be able to run ltemme on the same PC as on local interface to be able to run ltemme on the same PC as
lteenb. By default, the S1AP SCTP connection is bound on the same lteenb. By default, the S1AP SCTP connection is bound on the same
address. */ address. */
{% if slapparameter_dict.get('external_enb_gnb', '') %}
gtp_addr: "{{ gtp_addr }}",
{% else %}
gtp_addr: "127.0.1.100", gtp_addr: "127.0.1.100",
{% endif %}
plmn: "00101", plmn: "{{ slapparameter_dict.get('epc_plmn', "00101") }}",
mme_group_id: 32769, mme_group_id: 32769,
mme_code: 1, mme_code: 1,
......
...@@ -12,7 +12,7 @@ develop-eggs-directory = {{ develop_eggs_directory }} ...@@ -12,7 +12,7 @@ develop-eggs-directory = {{ develop_eggs_directory }}
offline = true offline = true
[slap-configuration] [slap-configuration]
recipe = slapos.cookbook:slapconfiguration recipe = slapos.cookbook:slapconfiguration.serialised
computer = {{ slap_connection['computer-id'] }} computer = {{ slap_connection['computer-id'] }}
partition = {{ slap_connection['partition-id'] }} partition = {{ slap_connection['partition-id'] }}
url = {{ slap_connection['server-url'] }} url = {{ slap_connection['server-url'] }}
...@@ -34,7 +34,7 @@ promise = ${:etc}/promise ...@@ -34,7 +34,7 @@ promise = ${:etc}/promise
log = ${:var}/log log = ${:var}/log
[request-common-base] [request-common-base]
recipe = slapos.cookbook:request recipe = slapos.cookbook:request.serialised
software-url = {{ slap_connection['software-release-url'] }} software-url = {{ slap_connection['software-release-url'] }}
server-url = {{ slap_connection['server-url'] }} server-url = {{ slap_connection['server-url'] }}
computer-id = {{ slap_connection['computer-id'] }} computer-id = {{ slap_connection['computer-id'] }}
...@@ -52,42 +52,18 @@ return = monitor-base-url ...@@ -52,42 +52,18 @@ return = monitor-base-url
name = EPC name = EPC
software-type = epc software-type = epc
config-name = epc config-name = epc
{% if slapparameter_dict.get("mme_config_link", None) %} {%- for key, value in slapparameter_dict.iteritems() %}
config-mme_config_link = {{ dumps(slapparameter_dict["mme_config_link"]) }} config-{{ key }} = {{ dumps(value) }}
{% endif %} {% endfor -%}
{% if slapparameter_dict.get("mme_config_version", None) %}
config-mme_config_version = {{ dumps(slapparameter_dict["mme_config_version"]) }}
{% endif %}
[lte-enb-request] [lte-enb-request]
<= request-common-base <= request-common-base
name = eNB name = eNB
software-type = enb software-type = enb
config-name = enb config-name = enb
{% if slapparameter_dict.get("tx_gain", None) %} {%- for key, value in slapparameter_dict.iteritems() %}
config-tx_gain = {{ dumps(slapparameter_dict["tx_gain"]) }} config-{{ key }} = {{ dumps(value) }}
{% endif %} {% endfor -%}
{% if slapparameter_dict.get("rx_gain", None) %}
config-rx_gain = {{ dumps(slapparameter_dict["rx_gain"]) }}
{% endif %}
{% if slapparameter_dict.get("dl_earfcn", None) %}
config-dl_earfcn = {{ dumps(slapparameter_dict["dl_earfcn"]) }}
{% endif %}
{% if slapparameter_dict.get("n_rb_dl", None) %}
config-n_rb_dl = {{ dumps(slapparameter_dict["n_rb_dl"]) }}
{% endif %}
{% if slapparameter_dict.get("mme_addr", None) %}
config-mme_addr = {{ dumps(slapparameter_dict["mme_addr"]) }}
{% endif %}
{% if slapparameter_dict.get("enb_id", None) %}
config-enb_id = {{ dumps(slapparameter_dict["enb_id"]) }}
{% endif %}
{% if slapparameter_dict.get("enb_config_link", None) %}
config-enb_config_link = {{ dumps(slapparameter_dict["enb_config_link"]) }}
{% endif %}
{% if slapparameter_dict.get("enb_config_version", None) %}
config-enb_config_version = {{ dumps(slapparameter_dict["enb_config_version"]) }}
{% endif %}
[monitor-base-url-dict] [monitor-base-url-dict]
lte-epc-request = ${lte-epc-request:connection-monitor-base-url} lte-epc-request = ${lte-epc-request:connection-monitor-base-url}
......
...@@ -3,6 +3,20 @@ ...@@ -3,6 +3,20 @@
"$schema": "http://json-schema.org/draft-04/schema", "$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters", "title": "Input Parameters",
"properties": { "properties": {
{%- if epc %}
"epc_plmn": {
"default": "00101",
"title": "Core Network PLMN",
"description": "Core Network Public Land Mobile Network",
"type": "string"
},
"external_enb_gnb": {
"default": false,
"title": "External eNB / gNB",
"description": "Set to true if external eNB / gNB will need to connect to this core network.",
"type": "boolean"
},
{%- endif %}
"tx_gain": { "tx_gain": {
"title": "Tx gain", "title": "Tx gain",
"description": "Tx gain (in dB)", "description": "Tx gain (in dB)",
...@@ -33,11 +47,60 @@ ...@@ -33,11 +47,60 @@
"type": "string", "type": "string",
"default": "127.0.0.100" "default": "127.0.0.100"
}, },
"mme_list": {
"title": "MME list",
"description": "Optionnal. List of MME to which the gNodeB is connected",
"patternProperties": {
".*": {
"properties": {
"mme_addr": {
"title": "MME Address",
"description": "IP address (and optional port) of S1AP SCTP connection to the MME. The default port is 36412.",
"type": "string"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"enb_id": { "enb_id": {
"title": "eNB ID", "title": "eNB ID",
"description": "eNB ID", "description": "eNB ID",
"type": "string", "type": "string",
"default": "0x1A2D0" "default": "0x1A2D0"
},
"plmn_list": {
"title": "PLMN list",
"description": "List of PLMNs broadcasted by the eNodeB, at most 6 (default: 00101)",
"patternProperties": {
".*": {
"properties": {
"plmn": {
"default": "00101",
"title": "Public Land Mobile Network",
"description": "Public Land Mobile Network",
"type": "string"
},
"attach_without_pdn": {
"default": false,
"title": "Attach Without PDN",
"description": "Optional boolean. Indicates if PLMN supports attach without PDN connectivity.",
"type": "boolean"
},
"reserved": {
"default": false,
"title": "Reserved",
"description": "True if the cell is reserved for operator use.",
"type": "boolean"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
} }
} }
} }
...@@ -21,7 +21,7 @@ recipe = plone.recipe.command ...@@ -21,7 +21,7 @@ recipe = plone.recipe.command
command = rm -rf ${directory:tmp}/* command = rm -rf ${directory:tmp}/*
[slap-configuration] [slap-configuration]
recipe = slapos.cookbook:slapconfiguration recipe = slapos.cookbook:slapconfiguration.serialised
computer = {{ slap_connection['computer-id'] }} computer = {{ slap_connection['computer-id'] }}
partition = {{ slap_connection['partition-id'] }} partition = {{ slap_connection['partition-id'] }}
url = {{ slap_connection['server-url'] }} url = {{ slap_connection['server-url'] }}
...@@ -105,7 +105,7 @@ context = ...@@ -105,7 +105,7 @@ context =
section directory directory section directory directory
section slap_configuration slap-configuration section slap_configuration slap-configuration
key slapparameter_dict slap-configuration:configuration key slapparameter_dict slap-configuration:configuration
raw gtp_addr {{ local_ipv4 }} key gtp_addr slap-configuration:ipv6-random
import netaddr netaddr import netaddr netaddr
[lte-enb-config] [lte-enb-config]
...@@ -120,7 +120,6 @@ output = ${directory:etc}/enb.cfg ...@@ -120,7 +120,6 @@ output = ${directory:etc}/enb.cfg
[publish-connection-information] [publish-connection-information]
<= monitor-publish <= monitor-publish
recipe = slapos.cookbook:publish recipe = slapos.cookbook:publish
ipv4 = {{ local_ipv4 }}
[monitor-instance-parameter] [monitor-instance-parameter]
{% if slapparameter_dict.get("name", None) %} {% if slapparameter_dict.get("name", None) %}
......
...@@ -2,5 +2,18 @@ ...@@ -2,5 +2,18 @@
"$schema": "http://json-schema.org/draft-04/schema", "$schema": "http://json-schema.org/draft-04/schema",
"title": "EPC Input Parameters", "title": "EPC Input Parameters",
"type": "object", "type": "object",
"properties": {} "properties": {
"epc_plmn": {
"default": "00101",
"title": "Core Network PLMN",
"description": "Core Network Public Land Mobile Network",
"type": "string"
},
"external_enb_gnb": {
"default": false,
"title": "External eNB / gNB",
"description": "Set to true if external eNB / gNB will need to connect to this core network.",
"type": "boolean"
}
}
} }
...@@ -15,7 +15,7 @@ develop-eggs-directory = {{ develop_eggs_directory }} ...@@ -15,7 +15,7 @@ develop-eggs-directory = {{ develop_eggs_directory }}
offline = true offline = true
[slap-configuration] [slap-configuration]
recipe = slapos.cookbook:slapconfiguration recipe = slapos.cookbook:slapconfiguration.serialised
computer = {{ slap_connection['computer-id'] }} computer = {{ slap_connection['computer-id'] }}
partition = {{ slap_connection['partition-id'] }} partition = {{ slap_connection['partition-id'] }}
url = {{ slap_connection['server-url'] }} url = {{ slap_connection['server-url'] }}
...@@ -118,7 +118,9 @@ context = ...@@ -118,7 +118,9 @@ context =
section directory directory section directory directory
section slap_configuration slap-configuration section slap_configuration slap-configuration
key slapparameter_dict slap-configuration:configuration key slapparameter_dict slap-configuration:configuration
key gtp_addr slap-configuration:ipv6-random
import netaddr netaddr import netaddr netaddr
key ifup_empty lte-mme-ifup-empty:wrapper-path
[lte-ims-config] [lte-ims-config]
<= config-base <= config-base
...@@ -133,20 +135,19 @@ url = ${mme-config-dl:target} ...@@ -133,20 +135,19 @@ url = ${mme-config-dl:target}
url = {{ mme_template }} url = {{ mme_template }}
{% endif %} {% endif %}
output = ${directory:etc}/mme.cfg output = ${directory:etc}/mme.cfg
context =
section directory directory
section slap_configuration slap-configuration
key slapparameter_dict slap-configuration:configuration
import netaddr netaddr
key ifup_empty lte-mme-ifup-empty:wrapper-path
[monitor-instance-parameter] [monitor-instance-parameter]
monitor-title = {{ slapparameter_dict['name'] }} {% if slapparameter_dict.get("name", None) %}
password = {{ slapparameter_dict['monitor-password'] }} monitor-title = {{ slapparameter_dict['name'] | string }}
{% endif %}
{% if slapparameter_dict.get("monitor-password", None) %}
password = {{ slapparameter_dict['monitor-password'] | string }}
{% endif %}
[publish-connection-information] [publish-connection-information]
<= monitor-publish <= monitor-publish
recipe = slapos.cookbook:publish recipe = slapos.cookbook:publish
epc-ip = ${slap-configuration:ipv6-random}
# Add custom promise to check if /dev/sdr0 is busy # Add custom promise to check if /dev/sdr0 is busy
[tun-up-promise] [tun-up-promise]
......
...@@ -12,7 +12,7 @@ develop-eggs-directory = {{ develop_eggs_directory }} ...@@ -12,7 +12,7 @@ develop-eggs-directory = {{ develop_eggs_directory }}
offline = true offline = true
[slap-configuration] [slap-configuration]
recipe = slapos.cookbook:slapconfiguration recipe = slapos.cookbook:slapconfiguration.serialised
computer = {{ slap_connection['computer-id'] }} computer = {{ slap_connection['computer-id'] }}
partition = {{ slap_connection['partition-id'] }} partition = {{ slap_connection['partition-id'] }}
url = {{ slap_connection['server-url'] }} url = {{ slap_connection['server-url'] }}
...@@ -34,7 +34,7 @@ promise = ${:etc}/promise ...@@ -34,7 +34,7 @@ promise = ${:etc}/promise
log = ${:var}/log log = ${:var}/log
[request-common-base] [request-common-base]
recipe = slapos.cookbook:request recipe = slapos.cookbook:request.serialised
software-url = {{ slap_connection['software-release-url'] }} software-url = {{ slap_connection['software-release-url'] }}
server-url = {{ slap_connection['server-url'] }} server-url = {{ slap_connection['server-url'] }}
computer-id = {{ slap_connection['computer-id'] }} computer-id = {{ slap_connection['computer-id'] }}
...@@ -52,48 +52,18 @@ return = monitor-base-url ...@@ -52,48 +52,18 @@ return = monitor-base-url
name = EPC name = EPC
software-type = epc software-type = epc
config-name = epc config-name = epc
{% if slapparameter_dict.get("mme_config_link", None) %} {%- for key, value in slapparameter_dict.iteritems() %}
config-mme_config_link = {{ dumps(slapparameter_dict["mme_config_link"]) }} config-{{ key }} = {{ dumps(value) }}
{% endif %} {% endfor -%}
{% if slapparameter_dict.get("mme_config_version", None) %}
config-mme_config_version = {{ dumps(slapparameter_dict["mme_config_version"]) }}
{% endif %}
[lte-gnb-request] [lte-gnb-request]
<= request-common-base <= request-common-base
name = gNB name = gNB
software-type = gnb software-type = gnb
config-name = gnb config-name = gnb
{% if slapparameter_dict.get("tx_gain", None) %} {%- for key, value in slapparameter_dict.iteritems() %}
config-tx_gain = {{ dumps(slapparameter_dict["tx_gain"]) }} config-{{ key }} = {{ dumps(value) }}
{% endif %} {% endfor -%}
{% if slapparameter_dict.get("rx_gain", None) %}
config-rx_gain = {{ dumps(slapparameter_dict["rx_gain"]) }}
{% endif %}
{% if slapparameter_dict.get("dl_nr_arfcn", None) %}
config-dl_nr_arfcn = {{ dumps(slapparameter_dict["dl_nr_arfcn"]) }}
{% endif %}
{% if slapparameter_dict.get("nr_band", None) %}
config-nr_band = {{ dumps(slapparameter_dict["nr_band"]) }}
{% endif %}
{% if slapparameter_dict.get("nr_bandwidth", None) %}
config-nr_bandwidth = {{ dumps(slapparameter_dict["nr_bandwidth"]) }}
{% endif %}
{% if slapparameter_dict.get("amf_addr", None) %}
config-amf_addr = {{ dumps(slapparameter_dict["amf_addr"]) }}
{% endif %}
{% if slapparameter_dict.get("gnb_id", None) %}
config-gnb_id = {{ dumps(slapparameter_dict["gnb_id"]) }}
{% endif %}
{% if slapparameter_dict.get("gnb_config_link", None) %}
config-gnb_config_link = {{ dumps(slapparameter_dict["gnb_config_link"]) }}
{% endif %}
{% if slapparameter_dict.get("gnb_config_version", None) %}
config-gnb_config_version = {{ dumps(slapparameter_dict["gnb_config_version"]) }}
{% endif %}
{% if slapparameter_dict.get("ssb_pos_bitmap", None) %}
config-ssb_pos_bitmap = {{ dumps(slapparameter_dict["ssb_pos_bitmap"]) }}
{% endif %}
[monitor-base-url-dict] [monitor-base-url-dict]
lte-epc-request = ${lte-epc-request:connection-monitor-base-url} lte-epc-request = ${lte-epc-request:connection-monitor-base-url}
......
...@@ -3,6 +3,20 @@ ...@@ -3,6 +3,20 @@
"$schema": "http://json-schema.org/draft-04/schema", "$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters", "title": "Input Parameters",
"properties": { "properties": {
{%- if epc %}
"epc_plmn": {
"default": "00101",
"title": "Core Network PLMN",
"description": "Core Network Public Land Mobile Network",
"type": "string"
},
"external_enb_gnb": {
"default": false,
"title": "External eNB / gNB",
"description": "Set to true if external eNB / gNB will need to connect to this core network.",
"type": "boolean"
},
{%- endif %}
"tx_gain": { "tx_gain": {
"title": "Tx gain", "title": "Tx gain",
"description": "Tx gain (in dB)", "description": "Tx gain (in dB)",
...@@ -33,11 +47,23 @@ ...@@ -33,11 +47,23 @@
"type": "number", "type": "number",
"default": {{ default_nr_bandwidth }} "default": {{ default_nr_bandwidth }}
}, },
"amf_list": {
"title": "AMF list",
"description": "Optionnal. List of AMF to which the gNodeB is connected",
"patternProperties": {
".*": {
"properties": {
"amf_addr": { "amf_addr": {
"title": "AMF Address", "title": "AMF Address",
"description": "IPv4 of the core network", "description": "IP address (and optional port) of NGAP SCTP connection to the AMF. The default port is 38412.",
"type": "string", "type": "string"
"default": "127.0.0.100" }
},
"type": "object"
}
},
"type": "object",
"default": {}
}, },
"gnb_id": { "gnb_id": {
"title": "gNB ID", "title": "gNB ID",
...@@ -50,6 +76,67 @@ ...@@ -50,6 +76,67 @@
"description": "SSB position bitmap in bits (4, 8 or 64 bits depending on the DL frequency).", "description": "SSB position bitmap in bits (4, 8 or 64 bits depending on the DL frequency).",
"type": "string", "type": "string",
"default": {{ default_nr_ssb_pos_bitmap }} "default": {{ default_nr_ssb_pos_bitmap }}
},
"plmn_list": {
"title": "PLMN list",
"description": "List of PLMNs broadcasted by the gNodeB, at most 12 (default: 00101)",
"patternProperties": {
".*": {
"properties": {
"plmn": {
"default": "00101",
"title": "Public Land Mobile Network",
"description": "Public Land Mobile Network",
"type": "string"
},
"tac": {
"default": 100,
"title": "Tracking Area Code",
"description": "Integer (range 0 to 16777215)",
"type": "number"
},
"ranac": {
"title": "Optional integer (range 0 to 255)",
"description": "RAN Area Code",
"type": "number"
},
"reserved": {
"default": false,
"title": "Reserved",
"description": "True if the cell is reserved for operator use.",
"type": "boolean"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"nssai": {
"title": "AMF slices configuration",
"description": "AMF slices configuration.",
"patternProperties": {
".*": {
"properties": {
"sst": {
"default": 1,
"title": "Slice Service Type",
"description": "Integer (range 1 to 255).",
"type": "number"
},
"sd": {
"default": 50,
"title": "Slice Differentiator",
"description": "Optional integer (range 0 to 0xFFFFFE)",
"type": "number"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
} }
} }
} }
...@@ -21,7 +21,7 @@ recipe = plone.recipe.command ...@@ -21,7 +21,7 @@ recipe = plone.recipe.command
command = rm -rf ${directory:tmp}/* command = rm -rf ${directory:tmp}/*
[slap-configuration] [slap-configuration]
recipe = slapos.cookbook:slapconfiguration recipe = slapos.cookbook:slapconfiguration.serialised
computer = {{ slap_connection['computer-id'] }} computer = {{ slap_connection['computer-id'] }}
partition = {{ slap_connection['partition-id'] }} partition = {{ slap_connection['partition-id'] }}
url = {{ slap_connection['server-url'] }} url = {{ slap_connection['server-url'] }}
...@@ -106,7 +106,7 @@ context = ...@@ -106,7 +106,7 @@ context =
section directory directory section directory directory
section slap_configuration slap-configuration section slap_configuration slap-configuration
key slapparameter_dict slap-configuration:configuration key slapparameter_dict slap-configuration:configuration
raw gtp_addr {{ local_ipv4 }} key gtp_addr slap-configuration:ipv6-random
import netaddr netaddr import netaddr netaddr
[lte-gnb-config] [lte-gnb-config]
...@@ -121,7 +121,6 @@ output = ${directory:etc}/gnb.cfg ...@@ -121,7 +121,6 @@ output = ${directory:etc}/gnb.cfg
[publish-connection-information] [publish-connection-information]
<= monitor-publish <= monitor-publish
recipe = slapos.cookbook:publish recipe = slapos.cookbook:publish
ipv4 = {{ local_ipv4 }}
[monitor-instance-parameter] [monitor-instance-parameter]
{% if slapparameter_dict.get("name", None) %} {% if slapparameter_dict.get("name", None) %}
......
...@@ -3,6 +3,18 @@ ...@@ -3,6 +3,18 @@
"$schema": "http://json-schema.org/draft-04/schema", "$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters", "title": "Input Parameters",
"properties": { "properties": {
"epc_plmn": {
"default": "00101",
"title": "Core Network PLMN",
"description": "Core Network Public Land Mobile Network",
"type": "string"
},
"external_enb_gnb": {
"default": false,
"title": "External eNB / gNB",
"description": "Set to true if external eNB / gNB will need to connect to this core network.",
"type": "boolean"
},
"tx_gain": { "tx_gain": {
"title": "Tx gain", "title": "Tx gain",
"description": "Tx gain (in dB)", "description": "Tx gain (in dB)",
...@@ -33,11 +45,60 @@ ...@@ -33,11 +45,60 @@
"type": "string", "type": "string",
"default": "127.0.0.100" "default": "127.0.0.100"
}, },
"mme_list": {
"title": "MME list",
"description": "Optionnal. List of MME to which the gNodeB is connected",
"patternProperties": {
".*": {
"properties": {
"mme_addr": {
"title": "MME Address",
"description": "IP address (and optional port) of S1AP SCTP connection to the MME. The default port is 36412.",
"type": "string"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"enb_id": { "enb_id": {
"title": "eNB ID", "title": "eNB ID",
"description": "eNB ID", "description": "eNB ID",
"type": "string", "type": "string",
"default": "0x1A2D0" "default": "0x1A2D0"
},
"plmn_list": {
"title": "PLMN list",
"description": "List of PLMNs broadcasted by the eNodeB, at most 6 (default: 00101)",
"patternProperties": {
".*": {
"properties": {
"plmn": {
"default": "00101",
"title": "Public Land Mobile Network",
"description": "Public Land Mobile Network",
"type": "string"
},
"attach_without_pdn": {
"default": false,
"title": "Attach Without PDN",
"description": "Optional boolean. Indicates if PLMN supports attach without PDN connectivity.",
"type": "boolean"
},
"reserved": {
"default": false,
"title": "Reserved",
"description": "True if the cell is reserved for operator use.",
"type": "boolean"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
} }
} }
} }
\ No newline at end of file
...@@ -33,11 +33,60 @@ ...@@ -33,11 +33,60 @@
"type": "string", "type": "string",
"default": "127.0.0.100" "default": "127.0.0.100"
}, },
"mme_list": {
"title": "MME list",
"description": "Optionnal. List of MME to which the gNodeB is connected",
"patternProperties": {
".*": {
"properties": {
"mme_addr": {
"title": "MME Address",
"description": "IP address (and optional port) of S1AP SCTP connection to the MME. The default port is 36412.",
"type": "string"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"enb_id": { "enb_id": {
"title": "eNB ID", "title": "eNB ID",
"description": "eNB ID", "description": "eNB ID",
"type": "string", "type": "string",
"default": "0x1A2D0" "default": "0x1A2D0"
},
"plmn_list": {
"title": "PLMN list",
"description": "List of PLMNs broadcasted by the eNodeB, at most 6 (default: 00101)",
"patternProperties": {
".*": {
"properties": {
"plmn": {
"default": "00101",
"title": "Public Land Mobile Network",
"description": "Public Land Mobile Network",
"type": "string"
},
"attach_without_pdn": {
"default": false,
"title": "Attach Without PDN",
"description": "Optional boolean. Indicates if PLMN supports attach without PDN connectivity.",
"type": "boolean"
},
"reserved": {
"default": false,
"title": "Reserved",
"description": "True if the cell is reserved for operator use.",
"type": "boolean"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
} }
} }
} }
\ No newline at end of file
...@@ -3,6 +3,18 @@ ...@@ -3,6 +3,18 @@
"$schema": "http://json-schema.org/draft-04/schema", "$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters", "title": "Input Parameters",
"properties": { "properties": {
"epc_plmn": {
"default": "00101",
"title": "Core Network PLMN",
"description": "Core Network Public Land Mobile Network",
"type": "string"
},
"external_enb_gnb": {
"default": false,
"title": "External eNB / gNB",
"description": "Set to true if external eNB / gNB will need to connect to this core network.",
"type": "boolean"
},
"tx_gain": { "tx_gain": {
"title": "Tx gain", "title": "Tx gain",
"description": "Tx gain (in dB)", "description": "Tx gain (in dB)",
...@@ -33,11 +45,23 @@ ...@@ -33,11 +45,23 @@
"type": "number", "type": "number",
"default": 40 "default": 40
}, },
"amf_list": {
"title": "AMF list",
"description": "Optionnal. List of AMF to which the gNodeB is connected",
"patternProperties": {
".*": {
"properties": {
"amf_addr": { "amf_addr": {
"title": "AMF Address", "title": "AMF Address",
"description": "IPv4 of the core network", "description": "IP address (and optional port) of NGAP SCTP connection to the AMF. The default port is 38412.",
"type": "string", "type": "string"
"default": "127.0.0.100" }
},
"type": "object"
}
},
"type": "object",
"default": {}
}, },
"gnb_id": { "gnb_id": {
"title": "gNB ID", "title": "gNB ID",
...@@ -50,6 +74,67 @@ ...@@ -50,6 +74,67 @@
"description": "SSB position bitmap in bits (4, 8 or 64 bits depending on the DL frequency).", "description": "SSB position bitmap in bits (4, 8 or 64 bits depending on the DL frequency).",
"type": "string", "type": "string",
"default": 1000 "default": 1000
},
"plmn_list": {
"title": "PLMN list",
"description": "List of PLMNs broadcasted by the gNodeB, at most 12 (default: 00101)",
"patternProperties": {
".*": {
"properties": {
"plmn": {
"default": "00101",
"title": "Public Land Mobile Network",
"description": "Public Land Mobile Network",
"type": "string"
},
"tac": {
"default": 100,
"title": "Tracking Area Code",
"description": "Integer (range 0 to 16777215)",
"type": "number"
},
"ranac": {
"title": "Optional integer (range 0 to 255)",
"description": "RAN Area Code",
"type": "number"
},
"reserved": {
"default": false,
"title": "Reserved",
"description": "True if the cell is reserved for operator use.",
"type": "boolean"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"nssai": {
"title": "AMF slices configuration",
"description": "AMF slices configuration.",
"patternProperties": {
".*": {
"properties": {
"sst": {
"default": 1,
"title": "Slice Service Type",
"description": "Integer (range 1 to 255).",
"type": "number"
},
"sd": {
"default": 50,
"title": "Slice Differentiator",
"description": "Optional integer (range 0 to 0xFFFFFE)",
"type": "number"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
} }
} }
} }
\ No newline at end of file
...@@ -33,11 +33,23 @@ ...@@ -33,11 +33,23 @@
"type": "number", "type": "number",
"default": 40 "default": 40
}, },
"amf_list": {
"title": "AMF list",
"description": "Optionnal. List of AMF to which the gNodeB is connected",
"patternProperties": {
".*": {
"properties": {
"amf_addr": { "amf_addr": {
"title": "AMF Address", "title": "AMF Address",
"description": "IPv4 of the core network", "description": "IP address (and optional port) of NGAP SCTP connection to the AMF. The default port is 38412.",
"type": "string", "type": "string"
"default": "127.0.0.100" }
},
"type": "object"
}
},
"type": "object",
"default": {}
}, },
"gnb_id": { "gnb_id": {
"title": "gNB ID", "title": "gNB ID",
...@@ -50,6 +62,67 @@ ...@@ -50,6 +62,67 @@
"description": "SSB position bitmap in bits (4, 8 or 64 bits depending on the DL frequency).", "description": "SSB position bitmap in bits (4, 8 or 64 bits depending on the DL frequency).",
"type": "string", "type": "string",
"default": 1000 "default": 1000
},
"plmn_list": {
"title": "PLMN list",
"description": "List of PLMNs broadcasted by the gNodeB, at most 12 (default: 00101)",
"patternProperties": {
".*": {
"properties": {
"plmn": {
"default": "00101",
"title": "Public Land Mobile Network",
"description": "Public Land Mobile Network",
"type": "string"
},
"tac": {
"default": 100,
"title": "Tracking Area Code",
"description": "Integer (range 0 to 16777215)",
"type": "number"
},
"ranac": {
"title": "Optional integer (range 0 to 255)",
"description": "RAN Area Code",
"type": "number"
},
"reserved": {
"default": false,
"title": "Reserved",
"description": "True if the cell is reserved for operator use.",
"type": "boolean"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"nssai": {
"title": "AMF slices configuration",
"description": "AMF slices configuration.",
"patternProperties": {
".*": {
"properties": {
"sst": {
"default": 1,
"title": "Slice Service Type",
"description": "Integer (range 1 to 255).",
"type": "number"
},
"sd": {
"default": 50,
"title": "Slice Differentiator",
"description": "Optional integer (range 0 to 0xFFFFFE)",
"type": "number"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
} }
} }
} }
\ No newline at end of file
...@@ -3,6 +3,18 @@ ...@@ -3,6 +3,18 @@
"$schema": "http://json-schema.org/draft-04/schema", "$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters", "title": "Input Parameters",
"properties": { "properties": {
"epc_plmn": {
"default": "00101",
"title": "Core Network PLMN",
"description": "Core Network Public Land Mobile Network",
"type": "string"
},
"external_enb_gnb": {
"default": false,
"title": "External eNB / gNB",
"description": "Set to true if external eNB / gNB will need to connect to this core network.",
"type": "boolean"
},
"tx_gain": { "tx_gain": {
"title": "Tx gain", "title": "Tx gain",
"description": "Tx gain (in dB)", "description": "Tx gain (in dB)",
...@@ -33,11 +45,60 @@ ...@@ -33,11 +45,60 @@
"type": "string", "type": "string",
"default": "127.0.0.100" "default": "127.0.0.100"
}, },
"mme_list": {
"title": "MME list",
"description": "Optionnal. List of MME to which the gNodeB is connected",
"patternProperties": {
".*": {
"properties": {
"mme_addr": {
"title": "MME Address",
"description": "IP address (and optional port) of S1AP SCTP connection to the MME. The default port is 36412.",
"type": "string"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"enb_id": { "enb_id": {
"title": "eNB ID", "title": "eNB ID",
"description": "eNB ID", "description": "eNB ID",
"type": "string", "type": "string",
"default": "0x1A2D0" "default": "0x1A2D0"
},
"plmn_list": {
"title": "PLMN list",
"description": "List of PLMNs broadcasted by the eNodeB, at most 6 (default: 00101)",
"patternProperties": {
".*": {
"properties": {
"plmn": {
"default": "00101",
"title": "Public Land Mobile Network",
"description": "Public Land Mobile Network",
"type": "string"
},
"attach_without_pdn": {
"default": false,
"title": "Attach Without PDN",
"description": "Optional boolean. Indicates if PLMN supports attach without PDN connectivity.",
"type": "boolean"
},
"reserved": {
"default": false,
"title": "Reserved",
"description": "True if the cell is reserved for operator use.",
"type": "boolean"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
} }
} }
} }
\ No newline at end of file
...@@ -33,11 +33,60 @@ ...@@ -33,11 +33,60 @@
"type": "string", "type": "string",
"default": "127.0.0.100" "default": "127.0.0.100"
}, },
"mme_list": {
"title": "MME list",
"description": "Optionnal. List of MME to which the gNodeB is connected",
"patternProperties": {
".*": {
"properties": {
"mme_addr": {
"title": "MME Address",
"description": "IP address (and optional port) of S1AP SCTP connection to the MME. The default port is 36412.",
"type": "string"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"enb_id": { "enb_id": {
"title": "eNB ID", "title": "eNB ID",
"description": "eNB ID", "description": "eNB ID",
"type": "string", "type": "string",
"default": "0x1A2D0" "default": "0x1A2D0"
},
"plmn_list": {
"title": "PLMN list",
"description": "List of PLMNs broadcasted by the eNodeB, at most 6 (default: 00101)",
"patternProperties": {
".*": {
"properties": {
"plmn": {
"default": "00101",
"title": "Public Land Mobile Network",
"description": "Public Land Mobile Network",
"type": "string"
},
"attach_without_pdn": {
"default": false,
"title": "Attach Without PDN",
"description": "Optional boolean. Indicates if PLMN supports attach without PDN connectivity.",
"type": "boolean"
},
"reserved": {
"default": false,
"title": "Reserved",
"description": "True if the cell is reserved for operator use.",
"type": "boolean"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
} }
} }
} }
\ No newline at end of file
...@@ -3,6 +3,18 @@ ...@@ -3,6 +3,18 @@
"$schema": "http://json-schema.org/draft-04/schema", "$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters", "title": "Input Parameters",
"properties": { "properties": {
"epc_plmn": {
"default": "00101",
"title": "Core Network PLMN",
"description": "Core Network Public Land Mobile Network",
"type": "string"
},
"external_enb_gnb": {
"default": false,
"title": "External eNB / gNB",
"description": "Set to true if external eNB / gNB will need to connect to this core network.",
"type": "boolean"
},
"tx_gain": { "tx_gain": {
"title": "Tx gain", "title": "Tx gain",
"description": "Tx gain (in dB)", "description": "Tx gain (in dB)",
...@@ -33,11 +45,23 @@ ...@@ -33,11 +45,23 @@
"type": "number", "type": "number",
"default": 40 "default": 40
}, },
"amf_list": {
"title": "AMF list",
"description": "Optionnal. List of AMF to which the gNodeB is connected",
"patternProperties": {
".*": {
"properties": {
"amf_addr": { "amf_addr": {
"title": "AMF Address", "title": "AMF Address",
"description": "IPv4 of the core network", "description": "IP address (and optional port) of NGAP SCTP connection to the AMF. The default port is 38412.",
"type": "string", "type": "string"
"default": "127.0.0.100" }
},
"type": "object"
}
},
"type": "object",
"default": {}
}, },
"gnb_id": { "gnb_id": {
"title": "gNB ID", "title": "gNB ID",
...@@ -50,6 +74,67 @@ ...@@ -50,6 +74,67 @@
"description": "SSB position bitmap in bits (4, 8 or 64 bits depending on the DL frequency).", "description": "SSB position bitmap in bits (4, 8 or 64 bits depending on the DL frequency).",
"type": "string", "type": "string",
"default": 10000000 "default": 10000000
},
"plmn_list": {
"title": "PLMN list",
"description": "List of PLMNs broadcasted by the gNodeB, at most 12 (default: 00101)",
"patternProperties": {
".*": {
"properties": {
"plmn": {
"default": "00101",
"title": "Public Land Mobile Network",
"description": "Public Land Mobile Network",
"type": "string"
},
"tac": {
"default": 100,
"title": "Tracking Area Code",
"description": "Integer (range 0 to 16777215)",
"type": "number"
},
"ranac": {
"title": "Optional integer (range 0 to 255)",
"description": "RAN Area Code",
"type": "number"
},
"reserved": {
"default": false,
"title": "Reserved",
"description": "True if the cell is reserved for operator use.",
"type": "boolean"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"nssai": {
"title": "AMF slices configuration",
"description": "AMF slices configuration.",
"patternProperties": {
".*": {
"properties": {
"sst": {
"default": 1,
"title": "Slice Service Type",
"description": "Integer (range 1 to 255).",
"type": "number"
},
"sd": {
"default": 50,
"title": "Slice Differentiator",
"description": "Optional integer (range 0 to 0xFFFFFE)",
"type": "number"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
} }
} }
} }
\ No newline at end of file
...@@ -33,11 +33,23 @@ ...@@ -33,11 +33,23 @@
"type": "number", "type": "number",
"default": 40 "default": 40
}, },
"amf_list": {
"title": "AMF list",
"description": "Optionnal. List of AMF to which the gNodeB is connected",
"patternProperties": {
".*": {
"properties": {
"amf_addr": { "amf_addr": {
"title": "AMF Address", "title": "AMF Address",
"description": "IPv4 of the core network", "description": "IP address (and optional port) of NGAP SCTP connection to the AMF. The default port is 38412.",
"type": "string", "type": "string"
"default": "127.0.0.100" }
},
"type": "object"
}
},
"type": "object",
"default": {}
}, },
"gnb_id": { "gnb_id": {
"title": "gNB ID", "title": "gNB ID",
...@@ -50,6 +62,67 @@ ...@@ -50,6 +62,67 @@
"description": "SSB position bitmap in bits (4, 8 or 64 bits depending on the DL frequency).", "description": "SSB position bitmap in bits (4, 8 or 64 bits depending on the DL frequency).",
"type": "string", "type": "string",
"default": 10000000 "default": 10000000
},
"plmn_list": {
"title": "PLMN list",
"description": "List of PLMNs broadcasted by the gNodeB, at most 12 (default: 00101)",
"patternProperties": {
".*": {
"properties": {
"plmn": {
"default": "00101",
"title": "Public Land Mobile Network",
"description": "Public Land Mobile Network",
"type": "string"
},
"tac": {
"default": 100,
"title": "Tracking Area Code",
"description": "Integer (range 0 to 16777215)",
"type": "number"
},
"ranac": {
"title": "Optional integer (range 0 to 255)",
"description": "RAN Area Code",
"type": "number"
},
"reserved": {
"default": false,
"title": "Reserved",
"description": "True if the cell is reserved for operator use.",
"type": "boolean"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"nssai": {
"title": "AMF slices configuration",
"description": "AMF slices configuration.",
"patternProperties": {
".*": {
"properties": {
"sst": {
"default": 1,
"title": "Slice Service Type",
"description": "Integer (range 1 to 255).",
"type": "number"
},
"sd": {
"default": 50,
"title": "Slice Differentiator",
"description": "Optional integer (range 0 to 0xFFFFFE)",
"type": "number"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
} }
} }
} }
\ No newline at end of file
...@@ -3,6 +3,18 @@ ...@@ -3,6 +3,18 @@
"$schema": "http://json-schema.org/draft-04/schema", "$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters", "title": "Input Parameters",
"properties": { "properties": {
"epc_plmn": {
"default": "00101",
"title": "Core Network PLMN",
"description": "Core Network Public Land Mobile Network",
"type": "string"
},
"external_enb_gnb": {
"default": false,
"title": "External eNB / gNB",
"description": "Set to true if external eNB / gNB will need to connect to this core network.",
"type": "boolean"
},
"tx_gain": { "tx_gain": {
"title": "Tx gain", "title": "Tx gain",
"description": "Tx gain (in dB)", "description": "Tx gain (in dB)",
...@@ -33,11 +45,60 @@ ...@@ -33,11 +45,60 @@
"type": "string", "type": "string",
"default": "127.0.0.100" "default": "127.0.0.100"
}, },
"mme_list": {
"title": "MME list",
"description": "Optionnal. List of MME to which the gNodeB is connected",
"patternProperties": {
".*": {
"properties": {
"mme_addr": {
"title": "MME Address",
"description": "IP address (and optional port) of S1AP SCTP connection to the MME. The default port is 36412.",
"type": "string"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"enb_id": { "enb_id": {
"title": "eNB ID", "title": "eNB ID",
"description": "eNB ID", "description": "eNB ID",
"type": "string", "type": "string",
"default": "0x1A2D0" "default": "0x1A2D0"
},
"plmn_list": {
"title": "PLMN list",
"description": "List of PLMNs broadcasted by the eNodeB, at most 6 (default: 00101)",
"patternProperties": {
".*": {
"properties": {
"plmn": {
"default": "00101",
"title": "Public Land Mobile Network",
"description": "Public Land Mobile Network",
"type": "string"
},
"attach_without_pdn": {
"default": false,
"title": "Attach Without PDN",
"description": "Optional boolean. Indicates if PLMN supports attach without PDN connectivity.",
"type": "boolean"
},
"reserved": {
"default": false,
"title": "Reserved",
"description": "True if the cell is reserved for operator use.",
"type": "boolean"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
} }
} }
} }
\ No newline at end of file
...@@ -33,11 +33,60 @@ ...@@ -33,11 +33,60 @@
"type": "string", "type": "string",
"default": "127.0.0.100" "default": "127.0.0.100"
}, },
"mme_list": {
"title": "MME list",
"description": "Optionnal. List of MME to which the gNodeB is connected",
"patternProperties": {
".*": {
"properties": {
"mme_addr": {
"title": "MME Address",
"description": "IP address (and optional port) of S1AP SCTP connection to the MME. The default port is 36412.",
"type": "string"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"enb_id": { "enb_id": {
"title": "eNB ID", "title": "eNB ID",
"description": "eNB ID", "description": "eNB ID",
"type": "string", "type": "string",
"default": "0x1A2D0" "default": "0x1A2D0"
},
"plmn_list": {
"title": "PLMN list",
"description": "List of PLMNs broadcasted by the eNodeB, at most 6 (default: 00101)",
"patternProperties": {
".*": {
"properties": {
"plmn": {
"default": "00101",
"title": "Public Land Mobile Network",
"description": "Public Land Mobile Network",
"type": "string"
},
"attach_without_pdn": {
"default": false,
"title": "Attach Without PDN",
"description": "Optional boolean. Indicates if PLMN supports attach without PDN connectivity.",
"type": "boolean"
},
"reserved": {
"default": false,
"title": "Reserved",
"description": "True if the cell is reserved for operator use.",
"type": "boolean"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
} }
} }
} }
\ No newline at end of file
...@@ -3,6 +3,18 @@ ...@@ -3,6 +3,18 @@
"$schema": "http://json-schema.org/draft-04/schema", "$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters", "title": "Input Parameters",
"properties": { "properties": {
"epc_plmn": {
"default": "00101",
"title": "Core Network PLMN",
"description": "Core Network Public Land Mobile Network",
"type": "string"
},
"external_enb_gnb": {
"default": false,
"title": "External eNB / gNB",
"description": "Set to true if external eNB / gNB will need to connect to this core network.",
"type": "boolean"
},
"tx_gain": { "tx_gain": {
"title": "Tx gain", "title": "Tx gain",
"description": "Tx gain (in dB)", "description": "Tx gain (in dB)",
...@@ -33,11 +45,23 @@ ...@@ -33,11 +45,23 @@
"type": "number", "type": "number",
"default": 40 "default": 40
}, },
"amf_list": {
"title": "AMF list",
"description": "Optionnal. List of AMF to which the gNodeB is connected",
"patternProperties": {
".*": {
"properties": {
"amf_addr": { "amf_addr": {
"title": "AMF Address", "title": "AMF Address",
"description": "IPv4 of the core network", "description": "IP address (and optional port) of NGAP SCTP connection to the AMF. The default port is 38412.",
"type": "string", "type": "string"
"default": "127.0.0.100" }
},
"type": "object"
}
},
"type": "object",
"default": {}
}, },
"gnb_id": { "gnb_id": {
"title": "gNB ID", "title": "gNB ID",
...@@ -50,6 +74,67 @@ ...@@ -50,6 +74,67 @@
"description": "SSB position bitmap in bits (4, 8 or 64 bits depending on the DL frequency).", "description": "SSB position bitmap in bits (4, 8 or 64 bits depending on the DL frequency).",
"type": "string", "type": "string",
"default": 10000000 "default": 10000000
},
"plmn_list": {
"title": "PLMN list",
"description": "List of PLMNs broadcasted by the gNodeB, at most 12 (default: 00101)",
"patternProperties": {
".*": {
"properties": {
"plmn": {
"default": "00101",
"title": "Public Land Mobile Network",
"description": "Public Land Mobile Network",
"type": "string"
},
"tac": {
"default": 100,
"title": "Tracking Area Code",
"description": "Integer (range 0 to 16777215)",
"type": "number"
},
"ranac": {
"title": "Optional integer (range 0 to 255)",
"description": "RAN Area Code",
"type": "number"
},
"reserved": {
"default": false,
"title": "Reserved",
"description": "True if the cell is reserved for operator use.",
"type": "boolean"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"nssai": {
"title": "AMF slices configuration",
"description": "AMF slices configuration.",
"patternProperties": {
".*": {
"properties": {
"sst": {
"default": 1,
"title": "Slice Service Type",
"description": "Integer (range 1 to 255).",
"type": "number"
},
"sd": {
"default": 50,
"title": "Slice Differentiator",
"description": "Optional integer (range 0 to 0xFFFFFE)",
"type": "number"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
} }
} }
} }
\ No newline at end of file
...@@ -33,11 +33,23 @@ ...@@ -33,11 +33,23 @@
"type": "number", "type": "number",
"default": 40 "default": 40
}, },
"amf_list": {
"title": "AMF list",
"description": "Optionnal. List of AMF to which the gNodeB is connected",
"patternProperties": {
".*": {
"properties": {
"amf_addr": { "amf_addr": {
"title": "AMF Address", "title": "AMF Address",
"description": "IPv4 of the core network", "description": "IP address (and optional port) of NGAP SCTP connection to the AMF. The default port is 38412.",
"type": "string", "type": "string"
"default": "127.0.0.100" }
},
"type": "object"
}
},
"type": "object",
"default": {}
}, },
"gnb_id": { "gnb_id": {
"title": "gNB ID", "title": "gNB ID",
...@@ -50,6 +62,67 @@ ...@@ -50,6 +62,67 @@
"description": "SSB position bitmap in bits (4, 8 or 64 bits depending on the DL frequency).", "description": "SSB position bitmap in bits (4, 8 or 64 bits depending on the DL frequency).",
"type": "string", "type": "string",
"default": 10000000 "default": 10000000
},
"plmn_list": {
"title": "PLMN list",
"description": "List of PLMNs broadcasted by the gNodeB, at most 12 (default: 00101)",
"patternProperties": {
".*": {
"properties": {
"plmn": {
"default": "00101",
"title": "Public Land Mobile Network",
"description": "Public Land Mobile Network",
"type": "string"
},
"tac": {
"default": 100,
"title": "Tracking Area Code",
"description": "Integer (range 0 to 16777215)",
"type": "number"
},
"ranac": {
"title": "Optional integer (range 0 to 255)",
"description": "RAN Area Code",
"type": "number"
},
"reserved": {
"default": false,
"title": "Reserved",
"description": "True if the cell is reserved for operator use.",
"type": "boolean"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"nssai": {
"title": "AMF slices configuration",
"description": "AMF slices configuration.",
"patternProperties": {
".*": {
"properties": {
"sst": {
"default": 1,
"title": "Slice Service Type",
"description": "Integer (range 1 to 255).",
"type": "number"
},
"sd": {
"default": 50,
"title": "Slice Differentiator",
"description": "Optional integer (range 0 to 0xFFFFFE)",
"type": "number"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
} }
} }
} }
\ No newline at end of file
...@@ -3,6 +3,18 @@ ...@@ -3,6 +3,18 @@
"$schema": "http://json-schema.org/draft-04/schema", "$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters", "title": "Input Parameters",
"properties": { "properties": {
"epc_plmn": {
"default": "00101",
"title": "Core Network PLMN",
"description": "Core Network Public Land Mobile Network",
"type": "string"
},
"external_enb_gnb": {
"default": false,
"title": "External eNB / gNB",
"description": "Set to true if external eNB / gNB will need to connect to this core network.",
"type": "boolean"
},
"tx_gain": { "tx_gain": {
"title": "Tx gain", "title": "Tx gain",
"description": "Tx gain (in dB)", "description": "Tx gain (in dB)",
...@@ -33,11 +45,60 @@ ...@@ -33,11 +45,60 @@
"type": "string", "type": "string",
"default": "127.0.0.100" "default": "127.0.0.100"
}, },
"mme_list": {
"title": "MME list",
"description": "Optionnal. List of MME to which the gNodeB is connected",
"patternProperties": {
".*": {
"properties": {
"mme_addr": {
"title": "MME Address",
"description": "IP address (and optional port) of S1AP SCTP connection to the MME. The default port is 36412.",
"type": "string"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"enb_id": { "enb_id": {
"title": "eNB ID", "title": "eNB ID",
"description": "eNB ID", "description": "eNB ID",
"type": "string", "type": "string",
"default": "0x1A2D0" "default": "0x1A2D0"
},
"plmn_list": {
"title": "PLMN list",
"description": "List of PLMNs broadcasted by the eNodeB, at most 6 (default: 00101)",
"patternProperties": {
".*": {
"properties": {
"plmn": {
"default": "00101",
"title": "Public Land Mobile Network",
"description": "Public Land Mobile Network",
"type": "string"
},
"attach_without_pdn": {
"default": false,
"title": "Attach Without PDN",
"description": "Optional boolean. Indicates if PLMN supports attach without PDN connectivity.",
"type": "boolean"
},
"reserved": {
"default": false,
"title": "Reserved",
"description": "True if the cell is reserved for operator use.",
"type": "boolean"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
} }
} }
} }
\ No newline at end of file
...@@ -33,11 +33,60 @@ ...@@ -33,11 +33,60 @@
"type": "string", "type": "string",
"default": "127.0.0.100" "default": "127.0.0.100"
}, },
"mme_list": {
"title": "MME list",
"description": "Optionnal. List of MME to which the gNodeB is connected",
"patternProperties": {
".*": {
"properties": {
"mme_addr": {
"title": "MME Address",
"description": "IP address (and optional port) of S1AP SCTP connection to the MME. The default port is 36412.",
"type": "string"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"enb_id": { "enb_id": {
"title": "eNB ID", "title": "eNB ID",
"description": "eNB ID", "description": "eNB ID",
"type": "string", "type": "string",
"default": "0x1A2D0" "default": "0x1A2D0"
},
"plmn_list": {
"title": "PLMN list",
"description": "List of PLMNs broadcasted by the eNodeB, at most 6 (default: 00101)",
"patternProperties": {
".*": {
"properties": {
"plmn": {
"default": "00101",
"title": "Public Land Mobile Network",
"description": "Public Land Mobile Network",
"type": "string"
},
"attach_without_pdn": {
"default": false,
"title": "Attach Without PDN",
"description": "Optional boolean. Indicates if PLMN supports attach without PDN connectivity.",
"type": "boolean"
},
"reserved": {
"default": false,
"title": "Reserved",
"description": "True if the cell is reserved for operator use.",
"type": "boolean"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
} }
} }
} }
\ No newline at end of file
...@@ -3,6 +3,18 @@ ...@@ -3,6 +3,18 @@
"$schema": "http://json-schema.org/draft-04/schema", "$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters", "title": "Input Parameters",
"properties": { "properties": {
"epc_plmn": {
"default": "00101",
"title": "Core Network PLMN",
"description": "Core Network Public Land Mobile Network",
"type": "string"
},
"external_enb_gnb": {
"default": false,
"title": "External eNB / gNB",
"description": "Set to true if external eNB / gNB will need to connect to this core network.",
"type": "boolean"
},
"tx_gain": { "tx_gain": {
"title": "Tx gain", "title": "Tx gain",
"description": "Tx gain (in dB)", "description": "Tx gain (in dB)",
...@@ -33,11 +45,23 @@ ...@@ -33,11 +45,23 @@
"type": "number", "type": "number",
"default": 40 "default": 40
}, },
"amf_list": {
"title": "AMF list",
"description": "Optionnal. List of AMF to which the gNodeB is connected",
"patternProperties": {
".*": {
"properties": {
"amf_addr": { "amf_addr": {
"title": "AMF Address", "title": "AMF Address",
"description": "IPv4 of the core network", "description": "IP address (and optional port) of NGAP SCTP connection to the AMF. The default port is 38412.",
"type": "string", "type": "string"
"default": "127.0.0.100" }
},
"type": "object"
}
},
"type": "object",
"default": {}
}, },
"gnb_id": { "gnb_id": {
"title": "gNB ID", "title": "gNB ID",
...@@ -50,6 +74,67 @@ ...@@ -50,6 +74,67 @@
"description": "SSB position bitmap in bits (4, 8 or 64 bits depending on the DL frequency).", "description": "SSB position bitmap in bits (4, 8 or 64 bits depending on the DL frequency).",
"type": "string", "type": "string",
"default": 10000000 "default": 10000000
},
"plmn_list": {
"title": "PLMN list",
"description": "List of PLMNs broadcasted by the gNodeB, at most 12 (default: 00101)",
"patternProperties": {
".*": {
"properties": {
"plmn": {
"default": "00101",
"title": "Public Land Mobile Network",
"description": "Public Land Mobile Network",
"type": "string"
},
"tac": {
"default": 100,
"title": "Tracking Area Code",
"description": "Integer (range 0 to 16777215)",
"type": "number"
},
"ranac": {
"title": "Optional integer (range 0 to 255)",
"description": "RAN Area Code",
"type": "number"
},
"reserved": {
"default": false,
"title": "Reserved",
"description": "True if the cell is reserved for operator use.",
"type": "boolean"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"nssai": {
"title": "AMF slices configuration",
"description": "AMF slices configuration.",
"patternProperties": {
".*": {
"properties": {
"sst": {
"default": 1,
"title": "Slice Service Type",
"description": "Integer (range 1 to 255).",
"type": "number"
},
"sd": {
"default": 50,
"title": "Slice Differentiator",
"description": "Optional integer (range 0 to 0xFFFFFE)",
"type": "number"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
} }
} }
} }
\ No newline at end of file
...@@ -33,11 +33,23 @@ ...@@ -33,11 +33,23 @@
"type": "number", "type": "number",
"default": 40 "default": 40
}, },
"amf_list": {
"title": "AMF list",
"description": "Optionnal. List of AMF to which the gNodeB is connected",
"patternProperties": {
".*": {
"properties": {
"amf_addr": { "amf_addr": {
"title": "AMF Address", "title": "AMF Address",
"description": "IPv4 of the core network", "description": "IP address (and optional port) of NGAP SCTP connection to the AMF. The default port is 38412.",
"type": "string", "type": "string"
"default": "127.0.0.100" }
},
"type": "object"
}
},
"type": "object",
"default": {}
}, },
"gnb_id": { "gnb_id": {
"title": "gNB ID", "title": "gNB ID",
...@@ -50,6 +62,67 @@ ...@@ -50,6 +62,67 @@
"description": "SSB position bitmap in bits (4, 8 or 64 bits depending on the DL frequency).", "description": "SSB position bitmap in bits (4, 8 or 64 bits depending on the DL frequency).",
"type": "string", "type": "string",
"default": 10000000 "default": 10000000
},
"plmn_list": {
"title": "PLMN list",
"description": "List of PLMNs broadcasted by the gNodeB, at most 12 (default: 00101)",
"patternProperties": {
".*": {
"properties": {
"plmn": {
"default": "00101",
"title": "Public Land Mobile Network",
"description": "Public Land Mobile Network",
"type": "string"
},
"tac": {
"default": 100,
"title": "Tracking Area Code",
"description": "Integer (range 0 to 16777215)",
"type": "number"
},
"ranac": {
"title": "Optional integer (range 0 to 255)",
"description": "RAN Area Code",
"type": "number"
},
"reserved": {
"default": false,
"title": "Reserved",
"description": "True if the cell is reserved for operator use.",
"type": "boolean"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"nssai": {
"title": "AMF slices configuration",
"description": "AMF slices configuration.",
"patternProperties": {
".*": {
"properties": {
"sst": {
"default": 1,
"title": "Slice Service Type",
"description": "Integer (range 1 to 255).",
"type": "number"
},
"sd": {
"default": 50,
"title": "Slice Differentiator",
"description": "Optional integer (range 0 to 0xFFFFFE)",
"type": "number"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
} }
} }
} }
\ No newline at end of file
...@@ -7,7 +7,7 @@ develop-eggs-directory = ${buildout:develop-eggs-directory} ...@@ -7,7 +7,7 @@ develop-eggs-directory = ${buildout:develop-eggs-directory}
offline = true offline = true
[slap-configuration] [slap-configuration]
recipe = slapos.cookbook:slapconfiguration recipe = slapos.cookbook:slapconfiguration.serialised
computer = $${slap-connection:computer-id} computer = $${slap-connection:computer-id}
partition = $${slap-connection:partition-id} partition = $${slap-connection:partition-id}
url = $${slap-connection:server-url} url = $${slap-connection:server-url}
...@@ -36,20 +36,6 @@ gnb = dynamic-template-lte-gnb:output ...@@ -36,20 +36,6 @@ gnb = dynamic-template-lte-gnb:output
epc = dynamic-template-lte-epc:output epc = dynamic-template-lte-epc:output
RootSoftwareInstance = $${:enb-epc} RootSoftwareInstance = $${:enb-epc}
[local-ipv4-address]
recipe = slapos.recipe.build
init =
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
s.connect(('1.1.1.1', 1))
ip = s.getsockname()[0]
except Exception:
ip = '127.0.0.1'
finally:
s.close()
options['local-ipv4'] = ip
[dynamic-template-lte-enb-epc] [dynamic-template-lte-enb-epc]
< = jinja2-template-base < = jinja2-template-base
url = ${template-lte-enb-epc:target} url = ${template-lte-enb-epc:target}
...@@ -57,7 +43,6 @@ filename = instance-lte-enb-epc.cfg ...@@ -57,7 +43,6 @@ filename = instance-lte-enb-epc.cfg
extensions = jinja2.ext.do extensions = jinja2.ext.do
extra-context = extra-context =
raw monitor_template ${monitor2-template:output} raw monitor_template ${monitor2-template:output}
key local_ipv4 local-ipv4-address:local-ipv4
[dynamic-template-lte-gnb-epc] [dynamic-template-lte-gnb-epc]
< = jinja2-template-base < = jinja2-template-base
...@@ -66,7 +51,6 @@ filename = instance-lte-gnb-epc.cfg ...@@ -66,7 +51,6 @@ filename = instance-lte-gnb-epc.cfg
extensions = jinja2.ext.do extensions = jinja2.ext.do
extra-context = extra-context =
raw monitor_template ${monitor2-template:output} raw monitor_template ${monitor2-template:output}
key local_ipv4 local-ipv4-address:local-ipv4
[dynamic-template-lte-enb] [dynamic-template-lte-enb]
< = jinja2-template-base < = jinja2-template-base
...@@ -88,7 +72,6 @@ extra-context = ...@@ -88,7 +72,6 @@ extra-context =
raw default_lte_rx_gain ${enb:default-lte-rx-gain} raw default_lte_rx_gain ${enb:default-lte-rx-gain}
raw min_frequency ${enb:min-frequency} raw min_frequency ${enb:min-frequency}
raw max_frequency ${enb:max-frequency} raw max_frequency ${enb:max-frequency}
key local_ipv4 local-ipv4-address:local-ipv4
[dynamic-template-lte-gnb] [dynamic-template-lte-gnb]
< = jinja2-template-base < = jinja2-template-base
...@@ -111,7 +94,6 @@ extra-context = ...@@ -111,7 +94,6 @@ extra-context =
raw default_nr_ssb_pos_bitmap ${enb:default-nr-ssb-pos-bitmap} raw default_nr_ssb_pos_bitmap ${enb:default-nr-ssb-pos-bitmap}
raw min_frequency ${enb:min-frequency} raw min_frequency ${enb:min-frequency}
raw max_frequency ${enb:max-frequency} raw max_frequency ${enb:max-frequency}
key local_ipv4 local-ipv4-address:local-ipv4
[dynamic-template-lte-epc] [dynamic-template-lte-epc]
< = jinja2-template-base < = jinja2-template-base
......
...@@ -122,6 +122,6 @@ for rf_mode_context in rf_mode_context_list: ...@@ -122,6 +122,6 @@ for rf_mode_context in rf_mode_context_list:
software_type), software_type),
'w+') as f: 'w+') as f:
if software_type in ['enb', 'enb-epc']: if software_type in ['enb', 'enb-epc']:
f.write(instance_enb_json_template.render(**rf_mode_context, **global_context)) f.write(instance_enb_json_template.render(**rf_mode_context, **global_context, epc='epc' in software_type))
else: else:
f.write(instance_gnb_json_template.render(**rf_mode_context, **global_context)) f.write(instance_gnb_json_template.render(**rf_mode_context, **global_context, epc='epc' in software_type))
{ {
"name": "ORS Amarisoft", "name": "ORS Amarisoft",
"description": "4G and 5G amarisoft stack for ORS", "description": "4G and 5G amarisoft stack for ORS",
"serialisation": "xml", "serialisation": "json-in-xml",
"software-type": { "software-type": {
"enb": { "enb": {
"title": "eNB", "title": "eNB",
......
{ {
"name": "ORS Amarisoft", "name": "ORS Amarisoft",
"description": "4G and 5G amarisoft stack for ORS", "description": "4G and 5G amarisoft stack for ORS",
"serialisation": "xml", "serialisation": "json-in-xml",
"software-type": { "software-type": {
"enb": { "enb": {
"title": "eNB", "title": "eNB",
......
{ {
"name": "ORS Amarisoft", "name": "ORS Amarisoft",
"description": "4G and 5G amarisoft stack for ORS", "description": "4G and 5G amarisoft stack for ORS",
"serialisation": "xml", "serialisation": "json-in-xml",
"software-type": { "software-type": {
"enb": { "enb": {
"title": "eNB", "title": "eNB",
......
{ {
"name": "ORS Amarisoft", "name": "ORS Amarisoft",
"description": "4G and 5G amarisoft stack for ORS", "description": "4G and 5G amarisoft stack for ORS",
"serialisation": "xml", "serialisation": "json-in-xml",
"software-type": { "software-type": {
"enb": { "enb": {
"title": "eNB", "title": "eNB",
......
{ {
"name": "ORS Amarisoft", "name": "ORS Amarisoft",
"description": "4G and 5G amarisoft stack for ORS", "description": "4G and 5G amarisoft stack for ORS",
"serialisation": "xml", "serialisation": "json-in-xml",
"software-type": { "software-type": {
"enb": { "enb": {
"title": "eNB", "title": "eNB",
......
# Theia software release # Theia software release
Theia is a cloud (and desktop) IDE https://www.theia-ide.org Theia is a cloud (and desktop) IDE https://www.theia-ide.org
This version comes pre-configured with a few plugins, but does not come with python plugin, to let
you choose between theia and vscode one.
## jedi
[jedi](https://github.com/davidhalter/jedi) which is used by both thiea and vscode python plugins has
some support for `zc.buildout`. It looks up for a `buildout.cfg` file and if found will load all scripts
from the bin directory from this buildout to add eggs to sys.path. In webrunner we have almost 100 scripts
in bin directory, with maybe 30 eggs in each scripts, so this makes jedi so slow it's unusable. Also, if
an error occurs parsing these scripts, jedi won't be usable. This issue is tracked in
https://github.com/davidhalter/jedi/issues/1325
A simple workaround is to create and empty `buildout.cfg` file at the root of project folder.
...@@ -66,7 +66,7 @@ md5sum = 0969fbb25b05c02ef3c2d437b2f4e1a0 ...@@ -66,7 +66,7 @@ md5sum = 0969fbb25b05c02ef3c2d437b2f4e1a0
[template-run-zelenium] [template-run-zelenium]
filename = run-zelenium-test.py.in filename = run-zelenium-test.py.in
md5sum = 274365ebbade26558ca4836837e781aa md5sum = 38653020296e43f84a93b99cb35aaef6
[template] [template]
filename = instance.cfg.in filename = instance.cfg.in
......
...@@ -10,6 +10,7 @@ from selenium.webdriver.common.by import By ...@@ -10,6 +10,7 @@ from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support import expected_conditions as EC
import six
import time import time
from urllib import urlopen from urllib import urlopen
import json import json
......
...@@ -195,7 +195,7 @@ setuptools-dso = 1.7 ...@@ -195,7 +195,7 @@ setuptools-dso = 1.7
rubygemsrecipe = 0.4.3 rubygemsrecipe = 0.4.3
six = 1.12.0 six = 1.12.0
slapos.cookbook = 1.0.246 slapos.cookbook = 1.0.246
slapos.core = 1.7.6 slapos.core = 1.7.8
slapos.extension.strip = 0.4 slapos.extension.strip = 0.4
slapos.extension.shared = 1.0 slapos.extension.shared = 1.0
slapos.libnetworkcache = 0.25 slapos.libnetworkcache = 0.25
......
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