blob: 80637c459397004e460388f11e4c9ef513516efe [file] [log] [blame]
# SPDX-FileCopyrightText: 2020 The Magma Authors.
# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
#
# SPDX-License-Identifier: BSD-3-Clause
from threading import Thread
from typing import List
from unittest import mock
from lte.protos.mconfig import mconfigs_pb2
from configuration.service_configs import load_service_config
from common.sentry import sentry_init
from common.service import MagmaService
from enodeb_status import (
get_operational_states,
get_service_status_old,
)
from logger import EnodebdLogger as logger
from state_machines.enb_acs_manager import StateMachineManager
from orc8r.protos.service303_pb2 import State
from rpc_servicer import EnodebdRpcServicer
from stats_manager import StatsManager
from tr069.server import tr069_server
from prometheus_client import start_http_server as prometheus_start_http_server
def get_context(ip: str):
with mock.patch('spyne.server.wsgi.WsgiApplication') as MockTransport:
MockTransport.req_env = {"REMOTE_ADDR": ip}
with mock.patch('spyne.server.wsgi.WsgiMethodContext') as MockContext:
MockContext.transport = MockTransport
return MockContext
def main():
"""
Top-level function for enodebd
"""
service = MagmaService('enodebd', mconfigs_pb2.EnodebD())
logger.init()
enodebd_cfg = load_service_config('enodebd')
prometheus_cfg = enodebd_cfg.get("prometheus", None)
if not prometheus_cfg:
logger.warning("Prometheus configuration wasn't found in enodebd configuration.")
else:
prometheus_ip = prometheus_cfg.get("ip")
prometheus_port = prometheus_cfg.get("port")
prometheus_start_http_server(prometheus_port, addr=prometheus_ip)
logger.info(
"Starting Prometheus server on address %s:%d",
prometheus_ip, prometheus_port)
# Optionally pipe errors to Sentry
sentry_init(service_name=service.name)
# State machine manager for tracking multiple connected eNB devices.
state_machine_manager = StateMachineManager(service)
# Statistics manager
stats_mgr = StatsManager(state_machine_manager)
stats_mgr.run()
# Start TR-069 thread
server_thread = Thread(
target=tr069_server,
args=(state_machine_manager,),
daemon=True,
)
server_thread.start()
# Add all servicers to the server
enodebd_servicer = EnodebdRpcServicer(state_machine_manager)
enodebd_servicer.add_to_server(service.rpc_server)
# Register function to get service status
def get_enodebd_status():
return get_service_status_old(state_machine_manager)
service.register_get_status_callback(get_enodebd_status)
# Register a callback function for GetOperationalStates service303 function
def get_enodeb_operational_states() -> List[State]:
return get_operational_states(state_machine_manager, service.mconfig)
service.register_operational_states_callback(get_enodeb_operational_states)
# Run the service loop
service.run()
# Cleanup the service
service.close()
def call_repeatedly(loop, interval, function, *args, **kwargs):
"""
Wrapper function to schedule function periodically
"""
# Schedule next call
loop.call_later(
interval, call_repeatedly, loop, interval, function,
*args, **kwargs,
)
# Call function
function(*args, **kwargs)
if __name__ == "__main__":
main()