コード例 #1
0
ファイル: enodeb_status.py プロジェクト: go-magma/magma
def get_single_enb_status(
        device_serial: str,
        state_machine_manager: StateMachineManager) -> SingleEnodebStatus:
    try:
        handler = state_machine_manager.get_handler_by_serial(device_serial)
    except KeyError:
        return _empty_enb_status()

    # This namedtuple is missing IP and serial info
    status = get_enb_status(handler)

    # Get IP info
    ip = state_machine_manager.get_ip_of_serial(device_serial)

    def get_status_property(status: bool) -> SingleEnodebStatus.StatusProperty:
        if status:
            return SingleEnodebStatus.StatusProperty.Value('ON')
        return SingleEnodebStatus.StatusProperty.Value('OFF')

    # Build the message to return through gRPC
    enb_status = SingleEnodebStatus()
    enb_status.device_serial = device_serial
    enb_status.ip_address = ip
    enb_status.connected = get_status_property(status.enodeb_connected)
    enb_status.configured = get_status_property(status.enodeb_configured)
    enb_status.opstate_enabled = get_status_property(status.opstate_enabled)
    enb_status.rf_tx_on = get_status_property(status.rf_tx_on)
    enb_status.rf_tx_desired = get_status_property(status.rf_tx_desired)
    enb_status.gps_connected = get_status_property(status.gps_connected)
    enb_status.ptp_connected = get_status_property(status.ptp_connected)
    enb_status.mme_connected = get_status_property(status.mme_connected)
    enb_status.gps_longitude = status.gps_longitude
    enb_status.gps_latitude = status.gps_latitude
    enb_status.fsm_state = status.fsm_state
    return enb_status
コード例 #2
0
ファイル: enodeb_status.py プロジェクト: go-magma/magma
def get_all_enb_status(
    enb_acs_manager: StateMachineManager, ) -> Dict[str, EnodebStatus]:
    enb_status_by_serial = {}
    serial_list = enb_acs_manager.get_connected_serial_id_list()
    for enb_serial in serial_list:
        handler = enb_acs_manager.get_handler_by_serial(enb_serial)
        status = get_enb_status(handler)
        enb_status_by_serial[enb_serial] = status

    return enb_status_by_serial
コード例 #3
0
ファイル: enodeb_status.py プロジェクト: tyree-z/magma
def get_operational_states(enb_acs_manager: StateMachineManager,
                           mconfig: mconfigs_pb2.EnodebD) -> List[State]:
    """
    Returns: A list of State with EnodebStatus encoded as JSON
    """
    states = []
    configured_serial_ids = []
    enb_status_by_serial = get_all_enb_status(enb_acs_manager)
    for serial_id in enb_status_by_serial:
        enb_status_dict = enb_status_by_serial[serial_id]._asdict()
        enb_status_dict['ip_address'] = enb_acs_manager.get_ip_of_serial(
            serial_id)
        serialized = json.dumps(enb_status_dict)
        state = State(type="single_enodeb",
                      deviceID=serial_id,
                      value=serialized.encode('utf-8'))
        configured_serial_ids.append(serial_id)
        states.append(state)

    # Get S1 connected eNBs
    s1_states = get_enb_s1_connected_states(configured_serial_ids, mconfig)
    for state in s1_states:
        states.append(state)

    return states
コード例 #4
0
def main():
    """
    Top-level function for enodebd
    """
    service = MagmaService('enodebd', mconfigs_pb2.EnodebD())
    logger.init()

    # Optionally pipe errors to Sentry
    sentry_init(service_name=service.name,
                sentry_mconfig=service.shared_mconfig.sentry_config)

    # 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()

    print_grpc_payload = service.config.get('print_grpc_payload', False)

    # Add all servicers to the server
    enodebd_servicer = EnodebdRpcServicer(
        state_machine_manager,
        print_grpc_payload,
    )
    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,
            print_grpc_payload,
        )

    service.register_operational_states_callback(get_enodeb_operational_states)

    # Set eNodeBD iptables rules due to exposing public IP to eNodeB
    service.loop.create_task(set_enodebd_iptables_rule())

    # Run the service loop
    service.run()

    # Cleanup the service
    service.close()
コード例 #5
0
ファイル: enodeb_status.py プロジェクト: sriprasads/magma
def get_operational_states(
        state_machine_manager: StateMachineManager) -> List[State]:
    """
    Returns: A list of SingleEnodebStatus encoded as JSON into State
    """
    states = []
    for serial_id in state_machine_manager.get_connected_serial_id_list():
        enb_state = get_single_enb_status(serial_id, state_machine_manager)
        state = State(type="enodeb",
                      deviceID=serial_id,
                      value=MessageToJson(enb_state).encode('utf-8'))
        states.append(state)
    return states
コード例 #6
0
def get_operational_states(
    enb_acs_manager: StateMachineManager,
    mconfig: mconfigs_pb2.EnodebD,
    print_grpc_payload: bool = False,
) -> List[State]:
    """
    Returns: A list of State with EnodebStatus encoded as JSON
    """
    states = []
    configured_serial_ids = []
    enb_status_by_serial = get_all_enb_status(enb_acs_manager)

    # Get S1 connected eNBs
    enb_statuses = get_all_enb_state(print_grpc_payload)

    for serial_id in enb_status_by_serial:
        enb_status_dict = enb_status_by_serial[serial_id]._asdict()

        # Add IP address to state
        enb_status_dict['ip_address'] = enb_acs_manager.get_ip_of_serial(
            serial_id,
        )

        # Add num of UEs connected
        num_ue_connected = enb_statuses.get(enb_status_dict['cell_id'], 0)
        enb_status_dict['ues_connected'] = num_ue_connected

        serialized = json.dumps(enb_status_dict)
        state = State(
            type="single_enodeb",
            deviceID=serial_id,
            value=serialized.encode('utf-8'),
        )
        configured_serial_ids.append(serial_id)
        states.append(state)

    # Get state for externally configured enodebs
    s1_states = get_enb_s1_connected_states(
        enb_statuses,
        configured_serial_ids,
        mconfig,
    )
    states.extend(s1_states)

    return states
コード例 #7
0
def main():
    """
    Top-level function for enodebd
    """
    service = MagmaService('enodebd')

    # 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.register_operational_states_callback(get_enodeb_operational_states)

    # Set eNodeBD iptables rules due to exposing public IP to eNodeB
    service.loop.create_task(set_enodebd_iptables_rule())

    # Run the service loop
    service.run()

    # Cleanup the service
    service.close()
コード例 #8
0
 def _get_manager(self) -> StateMachineManager:
     service = EnodebAcsStateMachineBuilder.build_magma_service()
     return StateMachineManager(service)
コード例 #9
0
 def setUp(self) -> None:
     service = EnodebConfigBuilder.get_service_config()
     self.enb_acs_manager = StateMachineManager(service)
     self.mgr = StatsManager(self.enb_acs_manager)
     self.is_clear_stats_called = False
コード例 #10
0
 def build_multi_enb_acs_manager(cls, ) -> StateMachineManager:
     service = cls.build_multi_enb_magma_service()
     return StateMachineManager(service)
コード例 #11
0
 def build_acs_manager(
     cls,
     device: EnodebDeviceName = EnodebDeviceName.BAICELLS,
 ) -> StateMachineManager:
     service = cls.build_magma_service(device)
     return StateMachineManager(service)