Beispiel #1
0
 def _log_response(self, session: Session, response: DBResponse):
     network_id = ''
     fcc_id = ''
     cbsd_serial_number = ''
     cbsd = response.request.cbsd
     if cbsd and cbsd.network_id:
         network_id = cbsd.network_id
     if cbsd and cbsd.fcc_id:
         fcc_id = cbsd.fcc_id
     if cbsd and cbsd.cbsd_serial_number:
         cbsd_serial_number = cbsd.cbsd_serial_number
     log_name = request_response[response.request.type.name]
     response_code = response.payload.get(
         'response',
         {},
     ).get('responseCode', None)
     log = DBLog(
         log_from='SAS',
         log_to='DP',
         log_name=f'{log_name}',
         log_message=f'{response.payload}',
         cbsd_serial_number=f'{cbsd_serial_number}',
         network_id=f'{network_id}',
         fcc_id=f'{fcc_id}',
         response_code=response_code,
     )
     session.add(log)
def _get_or_create_grant_from_response(
    obj: ResponseDBProcessor,
    response: DBResponse,
    session: Session,
) -> Optional[DBGrant]:
    cbsd_id = response.payload.get(
        CBSD_ID, ) or response.request.payload.get(CBSD_ID)
    grant_id = response.payload.get(
        GRANT_ID, ) or response.request.payload.get(GRANT_ID)
    cbsd = session.query(DBCbsd).filter(DBCbsd.cbsd_id == cbsd_id).scalar()
    grant = None
    if grant_id:
        logger.info(f'Getting grant by: {cbsd_id=} {grant_id=}')
        grant = session.query(DBGrant).filter(
            DBGrant.cbsd_id == cbsd.id,
            DBGrant.grant_id == grant_id,
        ).scalar()

    if grant_id and not grant:
        grant_idle_state = obj.grant_states_map[GrantStates.IDLE.value]
        grant = DBGrant(cbsd=cbsd, grant_id=grant_id, state=grant_idle_state)
        _update_grant_from_request(response, grant)
        session.add(grant)
        logger.info(f'Created new grant: {grant}')
    return grant
    def _process_responses(
        self,
        requests: List[DBRequest],
        sas_response: Response,
        session: Session,
    ) -> None:

        response_json_list = sas_response.json().get(self.response_type, [])
        logger.debug(
            f"[{self.response_type}] requests json list: {response_json_list}",
        )

        no_of_requests = len(requests)
        no_of_responses = len(response_json_list)
        if no_of_responses != no_of_requests:
            logger.warning(
                f"[{self.response_type}] Got {no_of_requests=} and {no_of_responses=}",
            )
        for response_json, db_request in zip(response_json_list, requests):
            db_response = DBResponse(
                response_code=int(response_json["response"]["responseCode"]),
                payload=response_json,
                request=db_request,
            )
            logger.info(
                f"[{self.response_type}] Adding Response: {db_response} for Request {db_request}",
            )
            session.add(db_response)
            self._log_response(session, db_response)
            self._process_request(db_request)
            logger.debug(
                f'[{self.response_type}] About to process Response: {db_response}',
            )
            self._process_response(db_response, session)
Beispiel #4
0
 def _create_or_update_active_mode_config(self, session: Session, cbsd: DBCbsd) -> DBActiveModeConfig:
     registered_state = session.query(DBCbsdState). \
         filter(DBCbsdState.name == CbsdStates.REGISTERED.value).first()
     active_mode_config = session.query(DBActiveModeConfig). \
         filter(DBActiveModeConfig.cbsd_id == cbsd.id).first()
     if active_mode_config:
         active_mode_config.desired_state = registered_state
         return None
     active_mode_config = DBActiveModeConfig(
         desired_state=registered_state,
         cbsd=cbsd,
     )
     session.add(active_mode_config)
     return active_mode_config
Beispiel #5
0
 def _get_or_create_cbsd(self, session: Session,
                         request: CBSDRequest) -> DBCbsd:
     cbsd = session.query(DBCbsd).filter(
         DBCbsd.cbsd_serial_number == request.serial_number, ).first()
     if cbsd:
         self._update_fields_from_request(cbsd, request)
         return cbsd
     unregistered_state = session.query(DBCbsdState). \
         filter(DBCbsdState.name == CbsdStates.UNREGISTERED.value).first()
     cbsd = DBCbsd(
         cbsd_serial_number=request.serial_number,
         state=unregistered_state,
     )
     self._update_fields_from_request(cbsd, request)
     session.add(cbsd)
     return cbsd
Beispiel #6
0
 def _log_result(self, session: Session, method_name: str, result: CBSDStateResult, cbsd: DBCbsd, serial_number: str):
     network_id = ''
     fcc_id = ''
     if cbsd:
         network_id = cbsd.network_id or ''
         fcc_id = cbsd.fcc_id or ''
     log = DBLog(
         log_from='DP',
         log_to='CBSD',
         log_name=method_name + 'Response',
         log_message=f'{result}',
         cbsd_serial_number=f'{serial_number}',
         network_id=f'{network_id}',
         fcc_id=f'{fcc_id}',
     )
     session.add(log)
Beispiel #7
0
 def _create_cbsd(self, session: Session, request_payload: Dict, cbsd_id: Optional[str]):
     cbsd_state = session.query(DBCbsdState).filter(
         DBCbsdState.name == CbsdStates.UNREGISTERED.value,
     ).scalar()
     user_id = request_payload.get("userId", None)
     fcc_id = request_payload.get("fccId", None)
     cbsd_serial_number = request_payload.get("cbsdSerialNumber", None)
     cbsd = DBCbsd(
         cbsd_id=cbsd_id,
         state=cbsd_state,
         user_id=user_id,
         fcc_id=fcc_id,
         cbsd_serial_number=cbsd_serial_number,
     )
     session.add(cbsd)
     logging.info(f"New CBSD {cbsd=} created.")
     return cbsd
Beispiel #8
0
 def _log_request(self, session: Session, method_name: str, request: CBSDRequest, cbsd: DBCbsd):
     cbsd_serial_number = request.serial_number
     network_id = ''
     fcc_id = ''
     if cbsd:
         network_id = cbsd.network_id or ''
         fcc_id = cbsd.fcc_id or ''
     log = DBLog(
         log_from='CBSD',
         log_to='DP',
         log_name=method_name + 'Request',
         log_message=f'{request}',
         cbsd_serial_number=f'{cbsd_serial_number}',
         network_id=f'{network_id}',
         fcc_id=f'{fcc_id}',
     )
     session.add(log)
Beispiel #9
0
 def _create_cbsd(self, session: Session, request_payload: Dict,
                  cbsd_id: Optional[str]):
     cbsd_state_id = self.cbsd_states_map[CbsdStates.UNREGISTERED.value]
     user_id = request_payload.get("userId", None)
     fcc_id = request_payload.get("fccId", None)
     cbsd_serial_number = request_payload.get("cbsdSerialNumber", None)
     cbsd = DBCbsd(
         cbsd_id=cbsd_id,
         state_id=cbsd_state_id,
         desired_state_id=cbsd_state_id,
         user_id=user_id,
         fcc_id=fcc_id,
         cbsd_serial_number=cbsd_serial_number,
     )
     session.add(cbsd)
     logging.info(f"New CBSD {cbsd=} created.")
     return cbsd
Beispiel #10
0
def _create_grant_from_response(
    response: DBResponse,
    state: DBGrantState,
    session: Session,
    grant_id: str = None,
) -> Optional[DBGrant]:
    grant_id = grant_id or response.grant_id
    if not grant_id:
        return None
    cbsd_id = session.query(
        DBCbsd.id).filter(DBCbsd.cbsd_id == response.cbsd_id)
    grant = DBGrant(cbsd_id=cbsd_id.subquery(), grant_id=grant_id, state=state)
    _update_grant_from_request(response, grant)
    session.add(grant)

    logger.info(f'Created new grant {grant}')
    return grant
Beispiel #11
0
 def _add_relinquish_requests(self, session: Session, cbsd: DBCbsd) -> None:
     deregister_request_type = session.query(DBRequestType).filter(
         DBRequestType.name == RequestTypes.RELINQUISHMENT.value,
     ).scalar()
     grants = session.query(DBGrant).join(DBGrantState).filter(
         DBGrant.cbsd_id == cbsd.id,
         DBGrantState.name != GrantStates.IDLE.value,
     )
     for grant in grants:
         request_dict = {"cbsdId": cbsd.cbsd_id, "grantId": grant.grant_id}
         db_request = DBRequest(
             type=deregister_request_type,
             cbsd=cbsd,
             payload=request_dict,
         )
         session.add(db_request)
         logger.debug(f"Added {db_request=}.")
     pass
Beispiel #12
0
def _create_channels(response: DBResponse, session: Session):
    _terminate_all_grants_from_response(response, session)
    cbsd_id = response.request.payload["cbsdId"]
    cbsd = session.query(DBCbsd).filter(DBCbsd.cbsd_id == cbsd_id).scalar()
    available_channels = response.payload.get("availableChannel")
    if not available_channels:
        logger.warning(
            "Could not create channel from spectrumInquiryResponse. Response missing 'availableChannel' object",
        )
        return
    for ac in available_channels:
        frequency_range = ac["frequencyRange"]
        channel = DBChannel(
            cbsd=cbsd,
            low_frequency=frequency_range["lowFrequency"],
            high_frequency=frequency_range["highFrequency"],
            channel_type=ac["channelType"],
            rule_applied=ac["ruleApplied"],
            max_eirp=ac.get("maxEirp"),
        )
        logger.info(f"Creating channel for {cbsd=}")
        session.add(channel)