class BaicellsRemWaitState(EnodebAcsState): """ We've already received an Inform message. This state is to handle a Baicells eNodeB issue. After eNodeB is rebooted, hold off configuring it for some time to give time for REM to run. This is a BaiCells eNodeB issue that doesn't support enabling the eNodeB during initial REM. In this state, just hang at responding to Inform, and then ending the TR-069 session. """ CONFIG_DELAY_AFTER_BOOT = 600 def __init__(self, acs: EnodebAcsStateMachine, when_done: str): super().__init__() self.acs = acs self.done_transition = when_done self.rem_timer = None def enter(self): self.rem_timer = StateMachineTimer(self.CONFIG_DELAY_AFTER_BOOT) logger.info( 'Holding off of eNB configuration for %s seconds. ' 'Will resume after eNB REM process has finished. ', self.CONFIG_DELAY_AFTER_BOOT, ) def exit(self): self.rem_timer = None def read_msg(self, message: Any) -> AcsReadMsgResult: if not isinstance(message, models.Inform): return AcsReadMsgResult(False, None) process_inform_message( message, self.acs.data_model, self.acs.device_cfg, ) return AcsReadMsgResult(True, None) def get_msg(self, message: Any) -> AcsMsgAndTransition: if self.rem_timer.is_done(): return AcsMsgAndTransition( models.DummyInput(), self.done_transition, ) return AcsMsgAndTransition(models.DummyInput(), None) def state_description(self) -> str: remaining = self.rem_timer.seconds_remaining() return 'Waiting for eNB REM to run for %d more seconds before ' \ 'resuming with configuration.' % remaining
class BaicellsQRTBQueuedEventsWaitState(EnodebAcsState): """ We've already received an Inform message. This state is to handle a Baicells eNodeB issue. After eNodeB is rebooted, hold off configuring it for some time. In this state, just hang at responding to Inform, and then ending the TR-069 session. """ CONFIG_DELAY_AFTER_BOOT = 60 def __init__(self, acs: EnodebAcsStateMachine, when_done: str): super().__init__() self.acs = acs self.done_transition = when_done self.wait_timer = None def enter(self): """ Perform additional actions on state enter """ self.wait_timer = StateMachineTimer(self.CONFIG_DELAY_AFTER_BOOT) logger.info( 'Holding off of eNB configuration for %s seconds. ', self.CONFIG_DELAY_AFTER_BOOT, ) def exit(self): """ Perform additional actions on state exit """ self.wait_timer = None def read_msg(self, message: Any) -> AcsReadMsgResult: """ Read incoming message Args: message (Any): TR069 message Returns: AcsReadMsgResult """ if not isinstance(message, models.Inform): return AcsReadMsgResult(msg_handled=False, next_state=None) process_inform_message( message, self.acs.data_model, self.acs.device_cfg, ) return AcsReadMsgResult(msg_handled=True, next_state=None) def get_msg(self, message: Any) -> AcsMsgAndTransition: """ Send back a message to enb Args: message (Any): TR069 message Returns: AcsMsgAndTransition """ if not self.wait_timer: logger.error('wait_timer is None.') raise ValueError('wait_timer is None.') if self.wait_timer.is_done(): return AcsMsgAndTransition( msg=models.DummyInput(), next_state=self.done_transition, ) remaining = self.wait_timer.seconds_remaining() logger.info( 'Waiting with eNB configuration for %s more seconds. ', remaining, ) return AcsMsgAndTransition(msg=models.DummyInput(), next_state=None) def state_description(self) -> str: """ Describe the state Returns: str """ if not self.wait_timer: logger.error('wait_timer is None.') raise ValueError('wait_timer is None.') remaining = self.wait_timer.seconds_remaining() return 'Waiting for eNB REM to run for %d more seconds before ' \ 'resuming with configuration.' % remaining