def read_msg(self, message: Any) -> AcsReadMsgResult: """ Process GetParameterValuesResponse Object parameters that have a reported value of None indicate that the object is not in the eNB's configuration. Most eNB devices will reply with a Fault message if we try to get values of parameters that don't exist on the data model, so this is an idiosyncrasy of Baicells QAFB. """ if not isinstance(message, models.GetParameterValuesResponse): return AcsReadMsgResult(False, None) path_to_val = {} for param_value_struct in message.ParameterList.ParameterValueStruct: path_to_val[param_value_struct.Name] = \ param_value_struct.Value.Data logger.debug('Received object parameters: %s', str(path_to_val)) num_plmns = self.acs.data_model.get_num_plmns() for i in range(1, num_plmns + 1): obj_name = ParameterName.PLMN_N % i obj_to_params = self.acs.data_model.get_numbered_param_names() param_name_list = obj_to_params[obj_name] for name in param_name_list: path = self.acs.data_model.get_parameter(name).path if path in path_to_val: value = path_to_val[path] if value is None: continue if obj_name not in self.acs.device_cfg.get_object_names(): self.acs.device_cfg.add_object(obj_name) magma_value = \ self.acs.data_model.transform_for_magma(name, value) self.acs.device_cfg.set_parameter_for_object(name, magma_value, obj_name) # Now we have enough information to build the desired configuration if self.acs.desired_cfg is None: self.acs.desired_cfg = build_desired_config( self.acs.mconfig, self.acs.service_config, self.acs.device_cfg, self.acs.data_model, self.acs.config_postprocessor, ) if len(get_all_objects_to_delete(self.acs.desired_cfg, self.acs.device_cfg)) > 0: return AcsReadMsgResult(True, self.rm_obj_transition) elif len(get_all_objects_to_add(self.acs.desired_cfg, self.acs.device_cfg)) > 0: return AcsReadMsgResult(True, self.add_obj_transition) elif len(get_all_param_values_to_set(self.acs.desired_cfg, self.acs.device_cfg, self.acs.data_model)) > 0: return AcsReadMsgResult(True, self.set_params_transition) return AcsReadMsgResult(True, self.skip_transition)
def read_msg(self, message: Any) -> AcsReadMsgResult: """ Process GetParameterValuesResponse """ if not isinstance(message, models.GetParameterValuesResponse): return AcsReadMsgResult(False, None) # Current values of the fetched parameters name_to_val = parse_get_parameter_values_response(self.acs.data_model, message) logging.debug('Received Parameters: %s', str(name_to_val)) # Clear stats when eNodeB stops radiating. This is # because eNodeB stops sending performance metrics at this point. prev_rf_tx = False if self.acs.device_cfg.has_parameter(ParameterName.RF_TX_STATUS): prev_rf_tx = \ self.acs.device_cfg.get_parameter(ParameterName.RF_TX_STATUS) next_rf_tx = name_to_val[ParameterName.RF_TX_STATUS] if prev_rf_tx is True and next_rf_tx is False: self.acs.stats_manager.clear_stats() # Update device configuration for name in name_to_val: magma_value = \ self.acs.data_model.transform_for_magma(name, name_to_val[name]) self.acs.device_cfg.set_parameter(name, magma_value) # Update status metrics status = get_enodeb_status(self.acs) update_status_metrics(status) return AcsReadMsgResult(True, self.get_next_state())
def read_msg(self, message: Any) -> AcsReadMsgResult: """ Process GetParameterValuesResponse """ if not isinstance(message, models.GetParameterValuesResponse): return AcsReadMsgResult(False, None) # Current values of the fetched parameters name_to_val = parse_get_parameter_values_response( self.acs.data_model, message) logging.debug('Received Parameters: %s', str(name_to_val)) # Update device configuration for name in name_to_val: magma_value = \ self.acs.data_model.transform_for_magma(name, name_to_val[name]) self.acs.device_cfg.set_parameter(name, magma_value) return AcsReadMsgResult(True, self.get_next_state())
def read_msg(self, message: Any) -> Optional[str]: if type(message) == models.Fault: logger.error('Received Fault in response to SetParameterValues') if message.SetParameterValuesFault is not None: for fault in message.SetParameterValuesFault: logger.error( 'SetParameterValuesFault Param: %s, Code: %s, String: %s', fault.ParameterName, fault.FaultCode, fault.FaultString, ) raise Tr069Error( 'Received Fault in response to SetParameterValues ' '(faultstring = %s)' % message.FaultString, ) elif not isinstance(message, models.SetParameterValuesResponse): return AcsReadMsgResult(False, None) if message.Status != 0: raise Tr069Error( 'Received SetParameterValuesResponse with ' 'Status=%d' % message.Status, ) param_name = ParameterName.ADMIN_STATE desired_admin_value = \ self.acs.desired_cfg.get_parameter(param_name) \ and self.admin_value magma_value = \ self.acs.data_model.transform_for_magma( param_name, desired_admin_value, ) self.acs.device_cfg.set_parameter(param_name, magma_value) if len( get_all_objects_to_delete( self.acs.desired_cfg, self.acs.device_cfg, ), ) > 0: return AcsReadMsgResult(True, self.del_obj_transition) elif len( get_all_objects_to_add( self.acs.desired_cfg, self.acs.device_cfg, ), ) > 0: return AcsReadMsgResult(True, self.add_obj_transition) else: return AcsReadMsgResult(True, self.done_transition)
def read_msg(self, message: Any) -> Optional[str]: if type(message) == models.Fault: logging.error('Received Fault in response to SetParameterValues') if message.SetParameterValuesFault is not None: for fault in message.SetParameterValuesFault: logging.error( 'SetParameterValuesFault Param: %s, Code: %s, String: %s', fault.ParameterName, fault.FaultCode, fault.FaultString) raise Tr069Error( 'Received Fault in response to SetParameterValues ' '(faultstring = %s)' % message.FaultString) elif not isinstance(message, models.SetParameterValuesResponse): return AcsReadMsgResult(False, None) if message.Status != 0: raise Tr069Error('Received SetParameterValuesResponse with ' 'Status=%d' % message.Status) return AcsReadMsgResult(True, self.done_transition)
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 read_msg(self, message: Any) -> AcsReadMsgResult: # If this is a regular Inform, not after a reboot we'll get an empty # message, in this case transition to the next state. We consider # this phase as "initialized" if isinstance(message, models.DummyInput): return AcsReadMsgResult( msg_handled=True, next_state=self.done_transition, ) if not isinstance(message, models.GetRPCMethods): # Unexpected, just don't die, ignore message. logging.error("Ignoring message %s", str(type(message))) # Set this so get_msg will return an empty message self._is_rpc_request = False else: # Return a valid RPC response self._is_rpc_request = True return AcsReadMsgResult(msg_handled=True, next_state=None)
def read_msg(self, message: Any) -> AcsReadMsgResult: if not isinstance(message, models.GetParameterValuesResponse): return AcsReadMsgResult(msg_handled=False, next_state=None) # Current values of the fetched parameters name_to_val = parse_get_parameter_values_response( self.acs.data_model, message, ) EnodebdLogger.debug('Received Parameters: %s', str(name_to_val)) # Update device configuration StatusParameters.set_magma_device_cfg( name_to_val, self.acs.device_cfg, ) return AcsReadMsgResult( msg_handled=True, next_state=self.done_transition, )
def read_msg(self, message: Any) -> AcsReadMsgResult: if not isinstance(message, models.DummyInput): return AcsReadMsgResult(False, None) return AcsReadMsgResult(True, None)
def read_msg(self, message: Any) -> AcsReadMsgResult: """ Process GetParameterValuesResponse """ if not isinstance(message, models.GetParameterValuesResponse): return AcsReadMsgResult(msg_handled=False, next_state=None) path_to_val = {} for param_value_struct in message.ParameterList.ParameterValueStruct: path_to_val[param_value_struct.Name] = \ param_value_struct.Value.Data EnodebdLogger.debug('Received object parameters: %s', str(path_to_val)) # Parse simple params param_name_list = self.acs.data_model.get_parameter_names() for name in param_name_list: path = self.acs.data_model.get_parameter(name).path if path in path_to_val: value = path_to_val.get(path) magma_val = \ self.acs.data_model.transform_for_magma( name, value, ) self.acs.device_cfg.set_parameter(name, magma_val) # Parse object params num_plmns = self.acs.data_model.get_num_plmns() for i in range(1, num_plmns + 1): obj_name = ParameterName.PLMN_N % i obj_to_params = self.acs.data_model.get_numbered_param_names() param_name_list = obj_to_params[obj_name] for name in param_name_list: path = self.acs.data_model.get_parameter(name).path if path in path_to_val: value = path_to_val.get(path) if value is None: continue if obj_name not in self.acs.device_cfg.get_object_names(): self.acs.device_cfg.add_object(obj_name) magma_value = \ self.acs.data_model.transform_for_magma(name, value) self.acs.device_cfg.set_parameter_for_object( name, magma_value, obj_name, ) # Now we have enough information to build the desired configuration if self.acs.desired_cfg is None: self.acs.desired_cfg = build_desired_config( self.acs.mconfig, self.acs.service_config, self.acs.device_cfg, self.acs.data_model, self.acs.config_postprocessor, ) if len( get_all_objects_to_delete( self.acs.desired_cfg, self.acs.device_cfg, ), ) > 0: return AcsReadMsgResult( msg_handled=True, next_state=self.rm_obj_transition, ) elif len( get_all_objects_to_add( self.acs.desired_cfg, self.acs.device_cfg, ), ) > 0: return AcsReadMsgResult( msg_handled=True, next_state=self.add_obj_transition, ) elif len( get_all_param_values_to_set( self.acs.desired_cfg, self.acs.device_cfg, self.acs.data_model, ), ) > 0: return AcsReadMsgResult( msg_handled=True, next_state=self.set_params_transition, ) return AcsReadMsgResult( msg_handled=True, next_state=self.skip_transition, )