Commit 491848ae authored by Kirill Smelkov's avatar Kirill Smelkov

.

parent 561f082a
{#- Package lte provides helpers for configuring Amarisoft LTE services in SlapOS.
{#- Package amari/lte provides helpers for configuring Amarisoft LTE services in SlapOS. XXX ...
XXX overview
XXX amari/slap is assumed to be loaded and `import with context`
-#}
{#- XXX rename to amari ? -#}
{#- J is used around macro calls to retrieve returned objects.
It is needed to workaround jinja2 limitation that macro can return only
strings - not arbitrary objects: we return objects as JSON-encoded string
and J decodes them.
By convention macros that return JSON-encoded objects start with "j" prefix.
Usage example:
set obj = J(jmymacro(...))
#}
{%- set J = json_module.loads %}
{#- bug indicates an error in template logic.
it should not happen. #}
{%- macro bug(msg) %}
{%- do assert(False, msg) %}
{%- endmacro %}
{#- error reports an error about shared instance #}
{#- XXX -> ierror ? #}
{#- XXX error(ishared, msg) vvv is debug stub -#}
{%- macro error(ishared, msg) %}
{%- set msg = 'E: %s: %s\n' % (J(jref_of_shared(ishared)), msg) %}
{%- do print('\n%s' % msg) %}
{%- do assert(False, msg) %}
{%- endmacro %}
{#- ---- loading ---- #}
{#- qshared_instance_list queues not yet loaded shared instances.
load_* routines process this queue and move loaded instances to i<type>_dict registries. #}
{%- set qshared_instance_list = slap_configuration.get('slave-instance-list', []) %}
{#- check_loaded_everything verifies that all shared instances were handling during the load. #}
{%- macro check_loaded_everything() %}
{%- for ishared in qshared_instance_list %}
{%- do error(ishared, "shared instance of unsupported type") %}
{%- endfor %}
{%- endmacro %}
{#- json-decode _ in all shared instances #}
{%- for ishared in qshared_instance_list %}
{%- do ishared.update({'_': J(ishared['_'])}) %}
{%- endfor %}
{#- icell_dict keeps cell shared instances: reference -> icell
iru_dict keeps RU shared instances + RU whose definition is embedded into a cell: reference -> iRU
in the kept instances _ is automatically json-decoded
use load_iru_and_icell(kind) to initialize this cell and RU registries.
kind=enb - load cells definition to serve them
kind=ue - load cells definition to connect to them
XXX defaults ?
#}
{%- set icell_dict = {} %}
{%- set iru_dict = {} %}
{%- macro load_iru_and_icell(kind) %}
{%- set qother = [] %}
{%- for ishared in qshared_instance_list %}
{%- set ref = J(jref_of_shared(ishared)) %}
{%- set _ = ishared['_'] %}
{%- if 'ru_type' in _ %}
{%- set iru = ishared %}
{%- do iru_dict.update({ref: iru}) %}
{%- elif (kind == 'enb' and 'cell_type' in _) or
(kind == 'ue' and 'ue_cell_type' in _) %}
{%- set icell = ishared %}
{%- if kind == 'enb' %}
{%- for k, v in defaults['cell/' + _.cell_type].items() %}
{%- do _.setdefault(k, v) %}
{%- endfor %}
{%- endif %}
{%- do icell_dict.update({ref: icell}) %}
{%- set ru = _['ru'] %}
{%- if ru.ru_type not in ('ru_ref', 'ruincell_ref') %}
{#- embedded ru definition -> expose it as `_<cell_ref>_ru` #}
{%- do iru_dict.update({'_%s_ru' % ref: {
'_': ru,
'slave_title': '%s. RU' % icell.slave_title,
'slave_reference': icell.slave_reference,
}}) %}
{%- endif %}
{%- else %}
{%- do qother.append(ishared) %}
{%- endif %}
{%- endfor %}
{%- do qshared_instance_list.clear() %}
{%- do qshared_instance_list.extend(qother) %}
{#- do print('\n>>> iru_dict:'), pprint(iru_dict) #}
{#- do print('\n>>> icell_dict:'), pprint(icell_dict) #}
{#- XXX verify cell_type = lte|nr XXX no - this should be verified by json-schema #}
{#- verify that there is no dangling cell->ru references #}
{#- XXX also verify that there is no dangling cell -> cell refs in ruincell_ref #}
{%- for _, icell in icell_dict|dictsort %}
{%- set ru_ref = J(jcell_ru_ref(icell)) %}
{%- if ru_ref not in iru_dict %}
{%- do error(icell, "referred RU %s does not exist" % ru_ref) %}
{%- endif %}
{%- endfor %}
{%- endmacro %}
{#- jcell_ru_ref returns RU reference linked from a cell.
if the cell embeds RU definition, its reference comes as `_<cell_ref>_ru`. #}
{%- macro jcell_ru_ref(icell) %}
{{- _jcell_ru_ref(icell, []) }}
{%- endmacro %}
{%- macro _jcell_ru_ref(icell, seen) %}
{%- set cell_ref = J(jref_of_shared(icell)) %}
{%- if cell_ref in seen %}
{%- for x in seen %}
{%- do error(x, "%s form a cycle via RU references" % seen) %}
{%- endfor %}
{#- XXX what to return ? #}
{%- else %}
{%- do seen.append(cell_ref) %}
{%- set ru = icell['_']['ru'] %}
{%- if ru.ru_type == 'ru_ref' %}
{{- ru.ru_ref | tojson }}
{%- elif ru.ru_type == 'ruincell_ref' %}
{#- XXX first check referred cell exist ? #}
{{- _jcell_ru_ref(icell_dict[ru.ruincell_ref], seen) }}
{%- else %}
{#- ru definition is embedded into cell #}
{{- ('_%s_ru' % J(jref_of_shared(icell))) | tojson }}
{%- endif %}
{%- endif %}
{%- endmacro %}
{#- jref_of_shared returns original reference used to request shared instance.
it is extracted from slave_reference which is composed as <partition_id>_<reference>. #}
{%- macro jref_of_shared(ishared) %}
{#- do print('jref_of_shared %r' % (ishared,)) #}
{%- set ref = ishared['slave_reference'] %}
{%- set partition_id = slap_configuration['slap-computer-partition-id'] %}
{%- if ref.startswith(partition_id) %}
{%- set ref = ref[len(partition_id):] %}
{%- endif %}
{%- if ref.startswith('_') %}
{%- set ref = ref[1:] %}
{%- endif %}
{{- ref | tojson }}
{%- endmacro %}
{#- ipeer_cell_dict keeps peer cell shared instances: reference -> ipeer_cell
use load_ipeer to initialize this peer registry.
#}
{%- set ipeer_cell_dict = {} %}
{%- macro load_ipeer_cell() %}
// XXX TODO
{%- endmacro %}
{#- iue_dict keeps ue shared instance: reference -> iue
use load_iue to initialize this ue registry.
#}
{%- set iue_dict = {} %}
{%- macro load_iue() %}
{%- set qother = [] %}
{%- for ishared in qshared_instance_list %}
{%- set ref = J(jref_of_shared(ishared)) %}
{%- set _ = ishared['_'] %}
{%- if 'ue_type' in _ %}
{%- set iue = ishared %}
{#- XXX verify ue.ue_type in lte|nr #}
{%- for k, v in defaults['ue'].items() %}
{%- do _.setdefault(k, v) %}
{%- endfor %}
{%- do iue_dict.update({ref: iue}) %}
{%- else %}
{%- do qother.append(ishared) %}
{%- endif %}
{%- endfor %}
{%- do qshared_instance_list.clear() %}
{%- do qshared_instance_list.extend(qother) %}
{%- endmacro %}
{# ---- XXX ---- #}
{#- ru_config emits RF driver configuration for specified Radio Units. #}
{%- macro ru_config(iru_dict, slapparameter_dict) %}
......
{#- Package amari/slap provides helpers for configuring Amarisoft LTE services in SlapOS. XXX ...
XXX overview
XXX see also amari/lte for ...
-#}
{#- J is used around macro calls to retrieve returned objects.
It is needed to workaround jinja2 limitation that macro can return only
strings - not arbitrary objects: we return objects as JSON-encoded string
and J decodes them.
By convention macros that return JSON-encoded objects start with "j" prefix.
Usage example:
set obj = J(jmymacro(...))
#}
{%- set J = json_module.loads %}
{#- bug indicates an error in template logic.
it should not happen. #}
{%- macro bug(msg) %}
{%- do assert(False, msg) %}
{%- endmacro %}
{#- error reports an error about shared instance #}
{#- XXX -> ierror ? #}
{#- XXX error(ishared, msg) vvv is debug stub -#}
{%- macro error(ishared, msg) %}
{%- set msg = 'E: %s: %s\n' % (J(jref_of_shared(ishared)), msg) %}
{%- do print('\n%s' % msg) %}
{%- do assert(False, msg) %}
{%- endmacro %}
{#- ---- loading ---- #}
{#- qshared_instance_list queues not yet loaded shared instances.
load_* routines process this queue and move loaded instances to i<type>_dict registries. #}
{%- set qshared_instance_list = slap_configuration.get('slave-instance-list', []) %}
{#- check_loaded_everything verifies that all shared instances were handling during the load. #}
{%- macro check_loaded_everything() %}
{%- for ishared in qshared_instance_list %}
{%- do error(ishared, "shared instance of unsupported type") %}
{%- endfor %}
{%- endmacro %}
{#- json-decode _ in all shared instances #}
{%- for ishared in qshared_instance_list %}
{%- do ishared.update({'_': J(ishared['_'])}) %}
{%- endfor %}
{#- icell_dict keeps cell shared instances: reference -> icell
iru_dict keeps RU shared instances + RU whose definition is embedded into a cell: reference -> iRU
in the kept instances _ is automatically json-decoded
use load_iru_and_icell(kind) to initialize this cell and RU registries.
kind=enb - load cells definition to serve them
kind=ue - load cells definition to connect to them
XXX defaults ?
#}
{%- set icell_dict = {} %}
{%- set iru_dict = {} %}
{%- macro load_iru_and_icell(kind) %}
{%- set qother = [] %}
{%- for ishared in qshared_instance_list %}
{%- set ref = J(jref_of_shared(ishared)) %}
{%- set _ = ishared['_'] %}
{%- if 'ru_type' in _ %}
{%- set iru = ishared %}
{%- do iru_dict.update({ref: iru}) %}
{%- elif (kind == 'enb' and 'cell_type' in _) or
(kind == 'ue' and 'ue_cell_type' in _) %}
{%- set icell = ishared %}
{%- if kind == 'enb' %}
{%- for k, v in defaults['cell/' + _.cell_type].items() %}
{%- do _.setdefault(k, v) %}
{%- endfor %}
{%- endif %}
{%- do icell_dict.update({ref: icell}) %}
{%- set ru = _['ru'] %}
{%- if ru.ru_type not in ('ru_ref', 'ruincell_ref') %}
{#- embedded ru definition -> expose it as `_<cell_ref>_ru` #}
{%- do iru_dict.update({'_%s_ru' % ref: {
'_': ru,
'slave_title': '%s. RU' % icell.slave_title,
'slave_reference': icell.slave_reference,
}}) %}
{%- endif %}
{%- else %}
{%- do qother.append(ishared) %}
{%- endif %}
{%- endfor %}
{%- do qshared_instance_list.clear() %}
{%- do qshared_instance_list.extend(qother) %}
{#- do print('\n>>> iru_dict:'), pprint(iru_dict) #}
{#- do print('\n>>> icell_dict:'), pprint(icell_dict) #}
{#- XXX verify cell_type = lte|nr XXX no - this should be verified by json-schema #}
{#- verify that there is no dangling cell->ru references #}
{#- XXX also verify that there is no dangling cell -> cell refs in ruincell_ref #}
{%- for _, icell in icell_dict|dictsort %}
{%- set ru_ref = J(jcell_ru_ref(icell)) %}
{%- if ru_ref not in iru_dict %}
{%- do error(icell, "referred RU %s does not exist" % ru_ref) %}
{%- endif %}
{%- endfor %}
{%- endmacro %}
{#- jcell_ru_ref returns RU reference linked from a cell.
if the cell embeds RU definition, its reference comes as `_<cell_ref>_ru`. #}
{%- macro jcell_ru_ref(icell) %}
{{- _jcell_ru_ref(icell, []) }}
{%- endmacro %}
{%- macro _jcell_ru_ref(icell, seen) %}
{%- set cell_ref = J(jref_of_shared(icell)) %}
{%- if cell_ref in seen %}
{%- for x in seen %}
{%- do error(x, "%s form a cycle via RU references" % seen) %}
{%- endfor %}
{#- XXX what to return ? #}
{%- else %}
{%- do seen.append(cell_ref) %}
{%- set ru = icell['_']['ru'] %}
{%- if ru.ru_type == 'ru_ref' %}
{{- ru.ru_ref | tojson }}
{%- elif ru.ru_type == 'ruincell_ref' %}
{#- XXX first check referred cell exist ? #}
{{- _jcell_ru_ref(icell_dict[ru.ruincell_ref], seen) }}
{%- else %}
{#- ru definition is embedded into cell #}
{{- ('_%s_ru' % J(jref_of_shared(icell))) | tojson }}
{%- endif %}
{%- endif %}
{%- endmacro %}
{#- jref_of_shared returns original reference used to request shared instance.
it is extracted from slave_reference which is composed as <partition_id>_<reference>. #}
{%- macro jref_of_shared(ishared) %}
{#- do print('jref_of_shared %r' % (ishared,)) #}
{%- set ref = ishared['slave_reference'] %}
{%- set partition_id = slap_configuration['slap-computer-partition-id'] %}
{%- if ref.startswith(partition_id) %}
{%- set ref = ref[len(partition_id):] %}
{%- endif %}
{%- if ref.startswith('_') %}
{%- set ref = ref[1:] %}
{%- endif %}
{{- ref | tojson }}
{%- endmacro %}
{#- ipeer_cell_dict keeps peer cell shared instances: reference -> ipeer_cell
use load_ipeer to initialize this peer registry.
#}
{%- set ipeer_cell_dict = {} %}
{%- macro load_ipeer_cell() %}
// XXX TODO
{%- endmacro %}
{#- iue_dict keeps ue shared instance: reference -> iue
use load_iue to initialize this ue registry.
#}
{%- set iue_dict = {} %}
{%- macro load_iue() %}
{%- set qother = [] %}
{%- for ishared in qshared_instance_list %}
{%- set ref = J(jref_of_shared(ishared)) %}
{%- set _ = ishared['_'] %}
{%- if 'ue_type' in _ %}
{%- set iue = ishared %}
{#- XXX verify ue.ue_type in lte|nr #}
{%- for k, v in defaults['ue'].items() %}
{%- do _.setdefault(k, v) %}
{%- endfor %}
{%- do iue_dict.update({ref: iue}) %}
{%- else %}
{%- do qother.append(ishared) %}
{%- endif %}
{%- endfor %}
{%- do qshared_instance_list.clear() %}
{%- do qshared_instance_list.extend(qother) %}
{%- endmacro %}
{# ---- XXX ---- #}
......@@ -16,11 +16,11 @@
[template]
filename = instance.cfg
md5sum = a38c699d77c9960db42bafe994c73744
md5sum = a832f31fd13d995f46539ab99a53ad29
[ru_libinstance.jinja2.cfg]
_update_hash_filename_ = ru/libinstance.jinja2.cfg
md5sum = d41d8cd98f00b204e9800998ecf8427e
md5sum = 556f39ce967c52da3a8e5346680a50b3
[amarisoft-stats.jinja2.py]
_update_hash_filename_ = amarisoft-stats.jinja2.py
......@@ -52,7 +52,7 @@ md5sum = a2ba0343ddb7f9cf2904a4c5c751f68a
[template-enb]
_update_hash_filename_ = instance-enb.jinja2.cfg
md5sum = 6c1e92444dd1e8eb91c85dc2cc46ec81
md5sum = f4714928f53fe57dc6722b7c155276cf
[template-gnb]
_update_hash_filename_ = instance-gnb.jinja2.cfg
......@@ -76,7 +76,7 @@ md5sum = dcaac06553a3222b14c0013a13f4a149
[enb.jinja2.cfg]
filename = config/enb.jinja2.cfg
md5sum = c1593d1ca6abee6262ad0aae9602bbaf
md5sum = 9284afa98485ee4c81fa10c4e2a05d8a
[sib23.jinja2.asn]
filename = config/sib23.jinja2.asn
......@@ -104,7 +104,7 @@ md5sum = 36281b03597252cf75169417d02fc28c
[ue.jinja2.cfg]
filename = config/ue.jinja2.cfg
md5sum = 22bb841181c39f20b931358de2808371
md5sum = 0a780e55ea53b1dc4850237c651adc43
[CreateProcessingEle.jinja2.xml]
filename = netconf/CreateProcessingEle.jinja2.xml
......
......@@ -35,7 +35,7 @@
{{- slapparameter_dict.get(name, defaults.get(name)) }}
{%- endmacro %}
{%- import 'lte.jinja2' as lte with context %}
{%- import 'amari_lte.jinja2' as lte with context %}
{%- set iru_dict = lte.iru_dict %}
{%- set icell_dict = lte.icell_dict %}
{%- set J = lte.J %}
......
......@@ -15,7 +15,7 @@
}
%}
{%- import 'lte.jinja2' as lte with context -%}
{%- import 'amari_lte.jinja2' as lte with context -%}
{%- set iru_dict = lte.iru_dict %}
{%- set icell_dict = lte.icell_dict %}
{%- set iue_dict = lte.iue_dict %}
......
......@@ -58,8 +58,11 @@ eggs-directory = {{ eggs_directory }}
develop-eggs-directory = {{ develop_eggs_directory }}
offline = true
{% import 'ru_libinstance.jinja2.cfg' as rulib with context %}
{%- set icell_kind='enb' %}
{%- import 'amari/slap.jinja2.cfg' as slaplte with context %}
{%- import 'ru/libinstance.jinja2.cfg' as rulib with context %}
{%- do slaplte.load_ipeer_cell() %}
{%- do slaplte.check_loaded_everything() %}
[monitor-httpd-conf-parameter]
......@@ -536,7 +539,7 @@ extra-context =
key sib23_file sib-config:output
import json_module json
import-list =
rawfile lte.jinja2 {{ lte_template }}
rawfile amari_lte.jinja2 {{ amari_lte_template }}
[publish-connection-information]
<= monitor-publish
......
......@@ -247,7 +247,7 @@ extra-context =
key enb amarisoft:enb
key sdr amarisoft:sdr
raw enb_template ${enb.jinja2.cfg:target}
raw lte_template ${lte.jinja2:target}
raw amari_lte_template ${amari_lte.jinja2:target}
raw sib23_template ${sib23.jinja2.asn:target}
raw ltelogs_template ${ltelogs.jinja2.sh:target}
raw amarisoft_stats_template ${amarisoft-stats.jinja2.py:target}
......
{%- import 'amari_lte.jinja2' as lte with context %}
{%- do slaplte.load_iru_and_icell(kind=icell_kind) %}
......@@ -23,7 +23,7 @@ def j2render(config, jcfg):
'url': 'config/{}.jinja2.cfg'.format(config),
'output': 'config/{}.cfg'.format(config),
'context': textctx,
'import-list': 'rawfile lte.jinja2 config/lte.jinja2',
'import-list': 'rawfile amari_lte.jinja2 amari/lte.jinja2',
})
# avoid dependency on zc.buildout.download and the need to use non-stub buildout section
......
......@@ -30,7 +30,7 @@ parts +=
gnb.jinja2.cfg
ue_db.jinja2.cfg
ue.jinja2.cfg
lte.jinja2
amari_lte.jinja2
CreateProcessingEle.jinja2.xml
cu_config.jinja2.xml
sib23.jinja2.asn
......@@ -162,9 +162,9 @@ filename = ims.jinja2.cfg
[ue.jinja2.cfg]
<= copy-config-to-instance
filename = ue.jinja2.cfg
[lte.jinja2]
[amari_lte.jinja2]
<= copy-config-to-instance
filename = lte.jinja2
filename = amari/lte.jinja2
# XXX -> ru/lopcomm
[CreateProcessingEle.jinja2.xml]
......
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