Loading .gitlab-ci.yml +38 −38 Original line number Diff line number Diff line Loading @@ -28,44 +28,44 @@ workflow: # include the individual .gitlab-ci.yml of each micro-service and tests include: # #- local: '/manifests/.gitlab-ci.yml' # - local: '/src/monitoring/.gitlab-ci.yml' # - local: '/src/nbi/.gitlab-ci.yml' # - local: '/src/context/.gitlab-ci.yml' # - local: '/src/device/.gitlab-ci.yml' # - local: '/src/service/.gitlab-ci.yml' # - local: '/src/qkd_app/.gitlab-ci.yml' # - local: '/src/dbscanserving/.gitlab-ci.yml' # - local: '/src/opticalattackmitigator/.gitlab-ci.yml' # - local: '/src/opticalattackdetector/.gitlab-ci.yml' # - local: '/src/opticalattackmanager/.gitlab-ci.yml' # - local: '/src/opticalcontroller/.gitlab-ci.yml' # - local: '/src/ztp/.gitlab-ci.yml' # - local: '/src/policy/.gitlab-ci.yml' # - local: '/src/automation/.gitlab-ci.yml' # - local: '/src/forecaster/.gitlab-ci.yml' # #- local: '/src/webui/.gitlab-ci.yml' # #- local: '/src/l3_distributedattackdetector/.gitlab-ci.yml' # #- local: '/src/l3_centralizedattackdetector/.gitlab-ci.yml' # #- local: '/src/l3_attackmitigator/.gitlab-ci.yml' # - local: '/src/slice/.gitlab-ci.yml' # #- local: '/src/interdomain/.gitlab-ci.yml' # - local: '/src/pathcomp/.gitlab-ci.yml' # #- local: '/src/dlt/.gitlab-ci.yml' # - local: '/src/load_generator/.gitlab-ci.yml' # - local: '/src/bgpls_speaker/.gitlab-ci.yml' # - local: '/src/kpi_manager/.gitlab-ci.yml' # - local: '/src/kpi_value_api/.gitlab-ci.yml' # #- local: '/src/kpi_value_writer/.gitlab-ci.yml' # #- local: '/src/telemetry/.gitlab-ci.yml' # - local: '/src/analytics/.gitlab-ci.yml' # - local: '/src/qos_profile/.gitlab-ci.yml' # - local: '/src/vnt_manager/.gitlab-ci.yml' # - local: '/src/e2e_orchestrator/.gitlab-ci.yml' # - local: '/src/ztp_server/.gitlab-ci.yml' # - local: '/src/osm_client/.gitlab-ci.yml' # - local: '/src/simap_connector/.gitlab-ci.yml' # - local: '/src/pluggables/.gitlab-ci.yml' #- local: '/manifests/.gitlab-ci.yml' - local: '/src/monitoring/.gitlab-ci.yml' - local: '/src/nbi/.gitlab-ci.yml' - local: '/src/context/.gitlab-ci.yml' - local: '/src/device/.gitlab-ci.yml' - local: '/src/service/.gitlab-ci.yml' - local: '/src/qkd_app/.gitlab-ci.yml' - local: '/src/dbscanserving/.gitlab-ci.yml' - local: '/src/opticalattackmitigator/.gitlab-ci.yml' - local: '/src/opticalattackdetector/.gitlab-ci.yml' - local: '/src/opticalattackmanager/.gitlab-ci.yml' - local: '/src/opticalcontroller/.gitlab-ci.yml' - local: '/src/ztp/.gitlab-ci.yml' - local: '/src/policy/.gitlab-ci.yml' - local: '/src/automation/.gitlab-ci.yml' - local: '/src/forecaster/.gitlab-ci.yml' #- local: '/src/webui/.gitlab-ci.yml' #- local: '/src/l3_distributedattackdetector/.gitlab-ci.yml' #- local: '/src/l3_centralizedattackdetector/.gitlab-ci.yml' #- local: '/src/l3_attackmitigator/.gitlab-ci.yml' - local: '/src/slice/.gitlab-ci.yml' #- local: '/src/interdomain/.gitlab-ci.yml' - local: '/src/pathcomp/.gitlab-ci.yml' #- local: '/src/dlt/.gitlab-ci.yml' - local: '/src/load_generator/.gitlab-ci.yml' - local: '/src/bgpls_speaker/.gitlab-ci.yml' - local: '/src/kpi_manager/.gitlab-ci.yml' - local: '/src/kpi_value_api/.gitlab-ci.yml' #- local: '/src/kpi_value_writer/.gitlab-ci.yml' #- local: '/src/telemetry/.gitlab-ci.yml' - local: '/src/analytics/.gitlab-ci.yml' - local: '/src/qos_profile/.gitlab-ci.yml' - local: '/src/vnt_manager/.gitlab-ci.yml' - local: '/src/e2e_orchestrator/.gitlab-ci.yml' - local: '/src/ztp_server/.gitlab-ci.yml' - local: '/src/osm_client/.gitlab-ci.yml' - local: '/src/simap_connector/.gitlab-ci.yml' - local: '/src/pluggables/.gitlab-ci.yml' # This should be last one: end-to-end integration tests - local: '/src/tests/.gitlab-ci.yml' src/device/service/drivers/gnmi_openconfig/handlers/Interface.py +59 −15 Original line number Diff line number Diff line Loading @@ -20,6 +20,8 @@ from .YangHandler import YangHandler LOGGER = logging.getLogger(__name__) MIN_MTU = 68 class InterfaceHandler(_Handler): def get_resource_key(self) -> str: return '/interface/subinterface' def get_path(self) -> str: return '/openconfig-interfaces:interfaces' Loading @@ -28,16 +30,21 @@ class InterfaceHandler(_Handler): self, resource_key : str, resource_value : Dict, yang_handler : YangHandler, delete : bool = False ) -> Tuple[str, str]: if_name = get_str(resource_value, 'name' ) # ethernet-1/1 sif_index = get_int(resource_value, 'index', 0) # 0 sif_index = get_int(resource_value, 'index', None) # 0 if delete: PATH_TMPL = '/interfaces/interface[name={:s}]/subinterfaces/subinterface[index={:d}]' str_path = PATH_TMPL.format(if_name, sif_index) str_data = json.dumps({}) if sif_index is None: return None, None root_node : libyang.DContainer = yang_handler.get_data_path( '/openconfig-interfaces:interfaces' ) address_ip = get_str(resource_value, 'address_ip', None) if address_ip is None: PATH_TMPL = '/interfaces/interface[name={:s}]/subinterfaces/subinterface[index={:d}]' str_path = PATH_TMPL.format(if_name, sif_index) yang_sif = root_node.find_path('/'.join([ '', # add slash at the beginning 'openconfig-interfaces:interfaces', Loading @@ -45,13 +52,32 @@ class InterfaceHandler(_Handler): 'subinterfaces', 'subinterface[index="{:d}"]'.format(sif_index), ])) else: PATH_TMPL = ( '/interfaces/interface[name={:s}]/subinterfaces/subinterface[index={:d}]' '/openconfig-if-ip:ipv4/addresses/address[ip={:s}]' ) str_path = PATH_TMPL.format(if_name, sif_index, address_ip) yang_sif = root_node.find_path('/'.join([ '', # add slash at the beginning 'openconfig-interfaces:interfaces', 'interface[name="{:s}"]'.format(if_name), 'subinterfaces', 'subinterface[index="{:d}"]'.format(sif_index), 'openconfig-if-ip:ipv4', 'addresses', 'address[ip="{:s}"]'.format(address_ip) ])) if yang_sif is not None: yang_sif.unlink() yang_sif.free() str_data = json.dumps({}) return str_path, str_data enabled = get_bool(resource_value, 'enabled', True) # True/False enabled = get_bool(resource_value, 'enabled', None) # True/False #if_type = get_str (resource_value, 'type' ) # 'l3ipvlan' vlan_id = get_int (resource_value, 'vlan_id', ) # 127 address_ip = get_str (resource_value, 'address_ip' ) # 172.16.0.1 Loading @@ -63,7 +89,17 @@ class InterfaceHandler(_Handler): yang_if : libyang.DContainer = yang_ifs.create_path(yang_if_path) yang_if.create_path('config/name', if_name ) if enabled is not None: yang_if.create_path('config/enabled', enabled) if mtu is not None: yang_if.create_path('config/mtu', mtu) if mtu is not None and mtu >= MIN_MTU: yang_if.create_path('config/mtu', mtu) if sif_index is None: str_path = '/interfaces/interface[name={:s}]'.format(if_name) str_data = yang_if.print_mem('json') json_data = json.loads(str_data) json_data = json_data['openconfig-interfaces:interface'][0] str_data = json.dumps(json_data) return str_path, str_data yang_sifs : libyang.DContainer = yang_if.create_path('subinterfaces') yang_sif_path = 'subinterface[index="{:d}"]'.format(sif_index) Loading Loading @@ -121,7 +157,6 @@ class InterfaceHandler(_Handler): _interface = { 'name' : interface_name, 'type' : interface_type, 'mtu' : interface_state['mtu'], 'admin-status' : interface_state['admin-status'], 'oper-status' : interface_state['oper-status'], 'management' : interface_state['management'], Loading @@ -136,6 +171,9 @@ class InterfaceHandler(_Handler): _interface['hardware-port'] = interface_state['hardware-port'] if 'transceiver' in interface_state: _interface['transceiver'] = interface_state['transceiver'] if 'mtu' in interface_state: mtu = interface_state['mtu'] if mtu > 0: _interface['mtu'] = mtu entry_interface_key = '/interface[{:s}]'.format(interface_name) entries.append((entry_interface_key, _interface)) Loading Loading @@ -164,6 +202,12 @@ class InterfaceHandler(_Handler): _subinterface['name'] = subinterface_state['name'] if 'enabled' in subinterface_state: _subinterface['enabled'] = subinterface_state['enabled'] if 'mtu' in subinterface_state: mtu = subinterface_state['mtu'] if mtu > 0: _subinterface['mtu'] = mtu if 'mtu' not in _interface: _interface['mtu'] = mtu if 'vlan' in subinterface: vlan = subinterface['vlan'] Loading src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstanceStaticRoute.py +17 −0 Original line number Diff line number Diff line Loading @@ -40,6 +40,23 @@ class NetworkInstanceStaticRouteHandler(_Handler): PATH_TMPL = '/network-instances/network-instance[name={:s}]/protocols' PATH_TMPL += '/protocol[identifier={:s}][name={:s}]/static-routes/static[prefix={:s}]' str_path = PATH_TMPL.format(ni_name, identifier, proto_name, prefix) root_node : libyang.DContainer = yang_handler.get_data_path( '/openconfig-network-instance:network-instances' ) yang_ni_pr_sr_path = root_node.find_path('/'.join([ '', # add slash at the beginning 'openconfig-network-instance:network-instances', 'network-instance[name="{:s}"]'.format(ni_name), 'protocols', 'protocol[identifier="{:s}"][name="{:s}"]'.format(identifier, proto_name), 'static-routes', 'static[prefix="{:s}"]'.format(prefix) ])) if yang_ni_pr_sr_path is not None: yang_ni_pr_sr_path.unlink() yang_ni_pr_sr_path.free() str_data = json.dumps({}) return str_path, str_data Loading src/nbi/Dockerfile +1 −1 Original line number Diff line number Diff line Loading @@ -72,7 +72,6 @@ RUN python3 -m pip install -r requirements.txt # Add component files into working directory WORKDIR /var/teraflow COPY src/nbi/. nbi/ COPY src/context/__init__.py context/__init__.py COPY src/context/client/. context/client/ COPY src/device/__init__.py device/__init__.py Loading @@ -95,6 +94,7 @@ COPY src/vnt_manager/__init__.py vnt_manager/__init__.py COPY src/vnt_manager/client/. vnt_manager/client/ RUN mkdir -p /var/teraflow/tests/tools COPY src/tests/tools/mock_osm/. tests/tools/mock_osm/ COPY src/nbi/. nbi/ # Start the service # NOTE: Configured single worker to prevent issues with multi-worker synchronization. To be invetsigated. Loading src/nbi/service/NbiApplication.py +1 −1 Original line number Diff line number Diff line Loading @@ -18,7 +18,7 @@ from typing import Any, List, Optional, Tuple from flask import Flask, request from flask_restful import Api, Resource from flask_socketio import Namespace, SocketIO from common.tools.kafka.Variables import KafkaConfig, KafkaTopic #from common.tools.kafka.Variables import KafkaConfig, KafkaTopic from nbi.Config import SECRET_KEY Loading Loading
.gitlab-ci.yml +38 −38 Original line number Diff line number Diff line Loading @@ -28,44 +28,44 @@ workflow: # include the individual .gitlab-ci.yml of each micro-service and tests include: # #- local: '/manifests/.gitlab-ci.yml' # - local: '/src/monitoring/.gitlab-ci.yml' # - local: '/src/nbi/.gitlab-ci.yml' # - local: '/src/context/.gitlab-ci.yml' # - local: '/src/device/.gitlab-ci.yml' # - local: '/src/service/.gitlab-ci.yml' # - local: '/src/qkd_app/.gitlab-ci.yml' # - local: '/src/dbscanserving/.gitlab-ci.yml' # - local: '/src/opticalattackmitigator/.gitlab-ci.yml' # - local: '/src/opticalattackdetector/.gitlab-ci.yml' # - local: '/src/opticalattackmanager/.gitlab-ci.yml' # - local: '/src/opticalcontroller/.gitlab-ci.yml' # - local: '/src/ztp/.gitlab-ci.yml' # - local: '/src/policy/.gitlab-ci.yml' # - local: '/src/automation/.gitlab-ci.yml' # - local: '/src/forecaster/.gitlab-ci.yml' # #- local: '/src/webui/.gitlab-ci.yml' # #- local: '/src/l3_distributedattackdetector/.gitlab-ci.yml' # #- local: '/src/l3_centralizedattackdetector/.gitlab-ci.yml' # #- local: '/src/l3_attackmitigator/.gitlab-ci.yml' # - local: '/src/slice/.gitlab-ci.yml' # #- local: '/src/interdomain/.gitlab-ci.yml' # - local: '/src/pathcomp/.gitlab-ci.yml' # #- local: '/src/dlt/.gitlab-ci.yml' # - local: '/src/load_generator/.gitlab-ci.yml' # - local: '/src/bgpls_speaker/.gitlab-ci.yml' # - local: '/src/kpi_manager/.gitlab-ci.yml' # - local: '/src/kpi_value_api/.gitlab-ci.yml' # #- local: '/src/kpi_value_writer/.gitlab-ci.yml' # #- local: '/src/telemetry/.gitlab-ci.yml' # - local: '/src/analytics/.gitlab-ci.yml' # - local: '/src/qos_profile/.gitlab-ci.yml' # - local: '/src/vnt_manager/.gitlab-ci.yml' # - local: '/src/e2e_orchestrator/.gitlab-ci.yml' # - local: '/src/ztp_server/.gitlab-ci.yml' # - local: '/src/osm_client/.gitlab-ci.yml' # - local: '/src/simap_connector/.gitlab-ci.yml' # - local: '/src/pluggables/.gitlab-ci.yml' #- local: '/manifests/.gitlab-ci.yml' - local: '/src/monitoring/.gitlab-ci.yml' - local: '/src/nbi/.gitlab-ci.yml' - local: '/src/context/.gitlab-ci.yml' - local: '/src/device/.gitlab-ci.yml' - local: '/src/service/.gitlab-ci.yml' - local: '/src/qkd_app/.gitlab-ci.yml' - local: '/src/dbscanserving/.gitlab-ci.yml' - local: '/src/opticalattackmitigator/.gitlab-ci.yml' - local: '/src/opticalattackdetector/.gitlab-ci.yml' - local: '/src/opticalattackmanager/.gitlab-ci.yml' - local: '/src/opticalcontroller/.gitlab-ci.yml' - local: '/src/ztp/.gitlab-ci.yml' - local: '/src/policy/.gitlab-ci.yml' - local: '/src/automation/.gitlab-ci.yml' - local: '/src/forecaster/.gitlab-ci.yml' #- local: '/src/webui/.gitlab-ci.yml' #- local: '/src/l3_distributedattackdetector/.gitlab-ci.yml' #- local: '/src/l3_centralizedattackdetector/.gitlab-ci.yml' #- local: '/src/l3_attackmitigator/.gitlab-ci.yml' - local: '/src/slice/.gitlab-ci.yml' #- local: '/src/interdomain/.gitlab-ci.yml' - local: '/src/pathcomp/.gitlab-ci.yml' #- local: '/src/dlt/.gitlab-ci.yml' - local: '/src/load_generator/.gitlab-ci.yml' - local: '/src/bgpls_speaker/.gitlab-ci.yml' - local: '/src/kpi_manager/.gitlab-ci.yml' - local: '/src/kpi_value_api/.gitlab-ci.yml' #- local: '/src/kpi_value_writer/.gitlab-ci.yml' #- local: '/src/telemetry/.gitlab-ci.yml' - local: '/src/analytics/.gitlab-ci.yml' - local: '/src/qos_profile/.gitlab-ci.yml' - local: '/src/vnt_manager/.gitlab-ci.yml' - local: '/src/e2e_orchestrator/.gitlab-ci.yml' - local: '/src/ztp_server/.gitlab-ci.yml' - local: '/src/osm_client/.gitlab-ci.yml' - local: '/src/simap_connector/.gitlab-ci.yml' - local: '/src/pluggables/.gitlab-ci.yml' # This should be last one: end-to-end integration tests - local: '/src/tests/.gitlab-ci.yml'
src/device/service/drivers/gnmi_openconfig/handlers/Interface.py +59 −15 Original line number Diff line number Diff line Loading @@ -20,6 +20,8 @@ from .YangHandler import YangHandler LOGGER = logging.getLogger(__name__) MIN_MTU = 68 class InterfaceHandler(_Handler): def get_resource_key(self) -> str: return '/interface/subinterface' def get_path(self) -> str: return '/openconfig-interfaces:interfaces' Loading @@ -28,16 +30,21 @@ class InterfaceHandler(_Handler): self, resource_key : str, resource_value : Dict, yang_handler : YangHandler, delete : bool = False ) -> Tuple[str, str]: if_name = get_str(resource_value, 'name' ) # ethernet-1/1 sif_index = get_int(resource_value, 'index', 0) # 0 sif_index = get_int(resource_value, 'index', None) # 0 if delete: PATH_TMPL = '/interfaces/interface[name={:s}]/subinterfaces/subinterface[index={:d}]' str_path = PATH_TMPL.format(if_name, sif_index) str_data = json.dumps({}) if sif_index is None: return None, None root_node : libyang.DContainer = yang_handler.get_data_path( '/openconfig-interfaces:interfaces' ) address_ip = get_str(resource_value, 'address_ip', None) if address_ip is None: PATH_TMPL = '/interfaces/interface[name={:s}]/subinterfaces/subinterface[index={:d}]' str_path = PATH_TMPL.format(if_name, sif_index) yang_sif = root_node.find_path('/'.join([ '', # add slash at the beginning 'openconfig-interfaces:interfaces', Loading @@ -45,13 +52,32 @@ class InterfaceHandler(_Handler): 'subinterfaces', 'subinterface[index="{:d}"]'.format(sif_index), ])) else: PATH_TMPL = ( '/interfaces/interface[name={:s}]/subinterfaces/subinterface[index={:d}]' '/openconfig-if-ip:ipv4/addresses/address[ip={:s}]' ) str_path = PATH_TMPL.format(if_name, sif_index, address_ip) yang_sif = root_node.find_path('/'.join([ '', # add slash at the beginning 'openconfig-interfaces:interfaces', 'interface[name="{:s}"]'.format(if_name), 'subinterfaces', 'subinterface[index="{:d}"]'.format(sif_index), 'openconfig-if-ip:ipv4', 'addresses', 'address[ip="{:s}"]'.format(address_ip) ])) if yang_sif is not None: yang_sif.unlink() yang_sif.free() str_data = json.dumps({}) return str_path, str_data enabled = get_bool(resource_value, 'enabled', True) # True/False enabled = get_bool(resource_value, 'enabled', None) # True/False #if_type = get_str (resource_value, 'type' ) # 'l3ipvlan' vlan_id = get_int (resource_value, 'vlan_id', ) # 127 address_ip = get_str (resource_value, 'address_ip' ) # 172.16.0.1 Loading @@ -63,7 +89,17 @@ class InterfaceHandler(_Handler): yang_if : libyang.DContainer = yang_ifs.create_path(yang_if_path) yang_if.create_path('config/name', if_name ) if enabled is not None: yang_if.create_path('config/enabled', enabled) if mtu is not None: yang_if.create_path('config/mtu', mtu) if mtu is not None and mtu >= MIN_MTU: yang_if.create_path('config/mtu', mtu) if sif_index is None: str_path = '/interfaces/interface[name={:s}]'.format(if_name) str_data = yang_if.print_mem('json') json_data = json.loads(str_data) json_data = json_data['openconfig-interfaces:interface'][0] str_data = json.dumps(json_data) return str_path, str_data yang_sifs : libyang.DContainer = yang_if.create_path('subinterfaces') yang_sif_path = 'subinterface[index="{:d}"]'.format(sif_index) Loading Loading @@ -121,7 +157,6 @@ class InterfaceHandler(_Handler): _interface = { 'name' : interface_name, 'type' : interface_type, 'mtu' : interface_state['mtu'], 'admin-status' : interface_state['admin-status'], 'oper-status' : interface_state['oper-status'], 'management' : interface_state['management'], Loading @@ -136,6 +171,9 @@ class InterfaceHandler(_Handler): _interface['hardware-port'] = interface_state['hardware-port'] if 'transceiver' in interface_state: _interface['transceiver'] = interface_state['transceiver'] if 'mtu' in interface_state: mtu = interface_state['mtu'] if mtu > 0: _interface['mtu'] = mtu entry_interface_key = '/interface[{:s}]'.format(interface_name) entries.append((entry_interface_key, _interface)) Loading Loading @@ -164,6 +202,12 @@ class InterfaceHandler(_Handler): _subinterface['name'] = subinterface_state['name'] if 'enabled' in subinterface_state: _subinterface['enabled'] = subinterface_state['enabled'] if 'mtu' in subinterface_state: mtu = subinterface_state['mtu'] if mtu > 0: _subinterface['mtu'] = mtu if 'mtu' not in _interface: _interface['mtu'] = mtu if 'vlan' in subinterface: vlan = subinterface['vlan'] Loading
src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstanceStaticRoute.py +17 −0 Original line number Diff line number Diff line Loading @@ -40,6 +40,23 @@ class NetworkInstanceStaticRouteHandler(_Handler): PATH_TMPL = '/network-instances/network-instance[name={:s}]/protocols' PATH_TMPL += '/protocol[identifier={:s}][name={:s}]/static-routes/static[prefix={:s}]' str_path = PATH_TMPL.format(ni_name, identifier, proto_name, prefix) root_node : libyang.DContainer = yang_handler.get_data_path( '/openconfig-network-instance:network-instances' ) yang_ni_pr_sr_path = root_node.find_path('/'.join([ '', # add slash at the beginning 'openconfig-network-instance:network-instances', 'network-instance[name="{:s}"]'.format(ni_name), 'protocols', 'protocol[identifier="{:s}"][name="{:s}"]'.format(identifier, proto_name), 'static-routes', 'static[prefix="{:s}"]'.format(prefix) ])) if yang_ni_pr_sr_path is not None: yang_ni_pr_sr_path.unlink() yang_ni_pr_sr_path.free() str_data = json.dumps({}) return str_path, str_data Loading
src/nbi/Dockerfile +1 −1 Original line number Diff line number Diff line Loading @@ -72,7 +72,6 @@ RUN python3 -m pip install -r requirements.txt # Add component files into working directory WORKDIR /var/teraflow COPY src/nbi/. nbi/ COPY src/context/__init__.py context/__init__.py COPY src/context/client/. context/client/ COPY src/device/__init__.py device/__init__.py Loading @@ -95,6 +94,7 @@ COPY src/vnt_manager/__init__.py vnt_manager/__init__.py COPY src/vnt_manager/client/. vnt_manager/client/ RUN mkdir -p /var/teraflow/tests/tools COPY src/tests/tools/mock_osm/. tests/tools/mock_osm/ COPY src/nbi/. nbi/ # Start the service # NOTE: Configured single worker to prevent issues with multi-worker synchronization. To be invetsigated. Loading
src/nbi/service/NbiApplication.py +1 −1 Original line number Diff line number Diff line Loading @@ -18,7 +18,7 @@ from typing import Any, List, Optional, Tuple from flask import Flask, request from flask_restful import Api, Resource from flask_socketio import Namespace, SocketIO from common.tools.kafka.Variables import KafkaConfig, KafkaTopic #from common.tools.kafka.Variables import KafkaConfig, KafkaTopic from nbi.Config import SECRET_KEY Loading