def get_msg(self) -> AcsMsgAndTransition: request = models.SetParameterValues() request.ParameterList = models.ParameterValueList() param_values = get_all_param_values_to_set(self.acs.desired_cfg, self.acs.device_cfg, self.acs.data_model) request.ParameterList.arrayType = 'cwmp:ParameterValueStruct[%d]' \ % len(param_values) request.ParameterList.ParameterValueStruct = [] logging.debug('Sending TR069 request to set CPE parameter values: %s', str(param_values)) for name, value in param_values.items(): param_info = self.acs.data_model.get_parameter(name) type_ = param_info.type name_value = models.ParameterValueStruct() name_value.Value = models.anySimpleType() name_value.Name = param_info.path enb_value = self.acs.data_model.transform_for_enb(name, value) if type_ in ('int', 'unsignedInt'): name_value.Value.type = 'xsd:%s' % type_ name_value.Value.Data = str(enb_value) elif type_ == 'boolean': # Boolean values have integral representations in spec name_value.Value.type = 'xsd:boolean' name_value.Value.Data = str(int(enb_value)) elif type_ == 'string': name_value.Value.type = 'xsd:string' name_value.Value.Data = str(enb_value) else: raise Tr069Error('Unsupported type for %s: %s' % (name, type_)) if param_info.is_invasive: self.acs.are_invasive_changes_applied = False request.ParameterList.ParameterValueStruct.append(name_value) return AcsMsgAndTransition(request, self.done_transition)
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) path_to_val = {} for param_value_struct in message.ParameterList.ParameterValueStruct: path_to_val[param_value_struct.Name] = \ param_value_struct.Value.Data logging.debug('Received object parameters: %s', str(path_to_val)) # TODO: This might a string for some strange reason, investigate why # Get the names of parameters belonging to numbered objects num_plmns = \ int(self.acs.device_cfg.get_parameter(ParameterName.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 value = path_to_val[path] magma_val = \ self.acs.data_model.transform_for_magma(name, value) self.acs.device_cfg.set_parameter_for_object( name, magma_val, obj_name) # Now we can have the desired state 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 get_msg(self, message: Any) -> AcsMsgAndTransition: request = models.SetParameterValues() request.ParameterList = models.ParameterValueList() param_values = get_all_param_values_to_set( self.acs.desired_cfg, self.acs.device_cfg, self.acs.data_model, ) request.ParameterList.arrayType = 'cwmp:ParameterValueStruct[%d]' \ % len(param_values) request.ParameterList.ParameterValueStruct = [] logger.debug( 'Sending TR069 request to set CPE parameter values: %s', str(param_values), ) # TODO: Match key response when we support having multiple outstanding # calls. if self.acs.has_version_key: request.ParameterKey = models.ParameterKeyType() request.ParameterKey.Data =\ "SetParameter-{:10.0f}".format(self.acs.parameter_version_key) request.ParameterKey.type = 'xsd:string' for name, value in param_values.items(): param_info = self.acs.data_model.get_parameter(name) type_ = param_info.type name_value = models.ParameterValueStruct() name_value.Value = models.anySimpleType() name_value.Name = param_info.path enb_value = self.acs.data_model.transform_for_enb(name, value) if type_ in ('int', 'unsignedInt'): name_value.Value.type = 'xsd:%s' % type_ name_value.Value.Data = str(enb_value) elif type_ == 'boolean': # Boolean values have integral representations in spec name_value.Value.type = 'xsd:boolean' name_value.Value.Data = str(int(enb_value)) elif type_ == 'string': name_value.Value.type = 'xsd:string' name_value.Value.Data = str(enb_value) else: raise Tr069Error('Unsupported type for %s: %s' % (name, type_), ) if param_info.is_invasive: self.acs.are_invasive_changes_applied = False request.ParameterList.ParameterValueStruct.append(name_value) return AcsMsgAndTransition(request, self.done_transition)
def read_msg(self, message: Any) -> AcsReadMsgResult: """ Process GetParameterValuesResponse """ if not isinstance(message, models.GetParameterValuesResponse): return AcsReadMsgResult(False, None) path_to_val = {} if hasattr(message.ParameterList, 'ParameterValueStruct') and \ message.ParameterList.ParameterValueStruct is not None: 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)) # Number of PLMN objects reported can be incorrect. Let's count them num_plmns = 0 obj_to_params = self.acs.data_model.get_numbered_param_names() while True: obj_name = ParameterName.PLMN_N % (num_plmns + 1) if obj_name not in obj_to_params or len( obj_to_params[obj_name]) == 0: logger.warning( "eNB has PLMN %s but not defined in model", obj_name, ) break param_name_list = obj_to_params[obj_name] obj_path = self.acs.data_model.get_parameter( param_name_list[0]).path if obj_path not in path_to_val: break if not self.acs.device_cfg.has_object(obj_name): self.acs.device_cfg.add_object(obj_name) num_plmns += 1 for name in param_name_list: path = self.acs.data_model.get_parameter(name).path value = path_to_val[path] magma_val = \ self.acs.data_model.transform_for_magma(name, value) self.acs.device_cfg.set_parameter_for_object( name, magma_val, obj_name, ) num_plmns_reported = \ int(self.acs.device_cfg.get_parameter(ParameterName.NUM_PLMNS)) if num_plmns != num_plmns_reported: logger.warning( "eNB reported %d PLMNs but found %d", num_plmns_reported, num_plmns, ) self.acs.device_cfg.set_parameter( ParameterName.NUM_PLMNS, num_plmns, ) # Now we can have the desired state 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(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, )