def _get_sdr_chunk(self, reservation_id, record_id, offset, length): print length req = create_request_by_name('GetSdr') req.reservation_id = reservation_id req.record_id = record_id req.offset = offset req.bytes_to_read = length retry = 5 while True: retry -= 1 if retry == 0: raise RetryError() rsp = self.send_message(req) if rsp.completion_code == constants.CC_OK: break elif rsp.completion_code == constants.CC_RES_CANCELED: req.reservation_id = self.reserve_sdr_repository() time.sleep(0.1) continue elif rsp.completion_code == constants.CC_TIMEOUT: time.sleep(0.1) continue elif rsp.completion_code == constants.CC_RESP_COULD_NOT_BE_PRV: time.sleep(0.1 * retry) continue else: check_completion_code(rsp.completion_code) return (rsp.next_record_id, rsp.data)
def rearm_sensor_events(self, sensor_number): """Rearm sensor events for the given sensor number. """ req = create_request_by_name('RearmSensorEvents') req.sensor_number = sensor_number rsp = self.send_message(req) check_completion_code(rsp.completion_code)
def get_signaling_class(self, interface, channel): req = create_request_by_name('GetSignalingClass') req.channel_info.channel_number = channel req.channel_info.interface = interface rsp = self.send_message(req) check_completion_code(rsp.completion_code) return rsp.channel_signaling.class_capability
def set_sensor_thresholds(self, sensor_number, lun=0, unr=None, ucr=None, unc=None, lnc=None, lcr=None, lnr=None): """Set the sensor thresholds that are not 'None' `sensor_number` `unr` for upper non-recoverable `ucr` for upper critical `unc` for upper non-critical `lnc` for lower non-critical `lcr` for lower critical `lnr` for lower non-recoverable """ req = create_request_by_name('SetSensorThresholds') req.sensor_number = sensor_number req.lun = lun thresholds = dict(unr=unr, ucr=ucr, unc=unc, lnc=lnc, lcr=lcr, lnr=lnr) for k, v in thresholds.items(): if v is not None: setattr(req.set_mask, k, 1) setattr(req.threshold, k, v) rsp = self.send_message(req) check_completion_code(rsp.completion_code)
def get_event_receiver(self): req = create_request_by_name('GetEventReceiver') rsp = self.send_message(req) check_completion_code(rsp.completion_code) ipmb_address = rsp.event_receiver.ipmb_i2c_slave_address lun = rsp.event_receiver.lun return (ipmb_address, lun)
def get_led_state(self, fru_id, led_id): req = create_request_by_name('GetFruLedState') req.fru_id = fru_id req.led_id = led_id rsp = self.send_message(req) check_completion_code(rsp.completion_code) return LedState(rsp)
def set_lan_configuration_parameters(self, channel, parameter_selector, data): req = create_request_by_name('SetLanConfigurationParameters') req.command.channel_number = channel req.parameter_selector = parameter_selector req.data = data rsp = self.send_message(req) check_completion_code(rsp.completion_code)
def fru_control(self, fru_id, option): req = create_request_by_name('FruControl') req.fru_id = fru_id req.option = option rsp = self.send_message(req) check_completion_code(rsp.completion_code) return rsp.rsp_data
def get_power_channel_status(self, starting_number): req = create_request_by_name('GetPowerChannelStatus') req.starting_power_channel_number = starting_number req.power_channel_count = 1 rsp = self.send_message(req) check_completion_code(rsp.completion_code) return PowerChannelStatus(rsp.data[0])
def clear_fru_deactivation_lock(self, fru_id): req = create_request_by_name('SetFruActivationPolicy') req.fru_id = fru_id req.mask.deactivation_locked = 1 req.set.deactivation_locked = 0 rsp = self.send_message(req) check_completion_code(rsp.completion_code)
def get_component_property(self, component_id, property_id): req = create_request_by_name('GetComponentProperties') req.id = component_id req.selector = property_id rsp = self.send_message(req) self._check_completion_code(rsp) return ComponentProperty.create_from_id(property_id, rsp)
def _clear_sdr_repository(self, cmd, reservation_id): req = create_request_by_name('ClearSdrRepository') req.reservation_id = reservation_id req.cmd = cmd rsp = self.send_message(req) check_completion_code(rsp.completion_code) return rsp.status.erase_in_progress
def set_sensor_thresholds(self, sensor_number, lun=0, unr=None, ucr=None, unc=None, lnc=None, lcr=None, lnr=None): """Set the sensor thresholds that are not 'None' `sensor_number` `unr` for upper non-recoverable `ucr` for upper critical `unc` for upper non-critical `lnc` for lower non-critical `lcr` for lower critical `lnr` for lower non-recoverable """ req = create_request_by_name('SetSensorThresholds') req.sensor_number = sensor_number req.lun = lun if unr is not None: req.set_mask.unr = 1 req.threshold.unr = unr if ucr is not None: req.set_mask.ucr = 1 req.threshold.ucr = ucr if unc is not None: req.set_mask.unc = 1 req.threshold.unc = unc if lnc is not None: req.set_mask.lnc = 1 req.threshold.lnc = lnc if lcr is not None: req.set_mask.lcr = 1 req.threshold.lcr = lcr if lnr is not None: req.set_mask.lnr = 1 req.threshold.lnr = lnr rsp = self.send_message(req) check_completion_code(rsp.completion_code)
def get_power_level(self, fru_id, power_type): req = create_request_by_name('GetPowerLevel') req.fru_id = fru_id req.power_type = power_type rsp = self.send_message(req) check_completion_code(rsp.completion_code) return PowerLevel(rsp)
def get_fan_level(self, fru_id): req = create_request_by_name('GetFanLevel') req.fru_id = fru_id rsp = self.send_message(req) check_completion_code(rsp.completion_code) local_control_fan_level = None if rsp.data: local_control_fan_level = rsp.data[0] return (rsp.override_fan_level, local_control_fan_level)
def sel_entries(self): """Generator which returns all SEL entries.""" req = create_request_by_name('GetSelInfo') rsp = self.send_message(req) check_completion_code(rsp.completion_code) if rsp.entries == 0: return reservation_id = self.get_sel_reservation_id() next_record_id = 0 while True: req = create_request_by_name('GetSelEntry') req.reservation_id = reservation_id req.record_id = next_record_id req.offset = 0 self.max_req_len = 0xff # read entire record record_data = ByteBuffer() while True: req.length = self.max_req_len if (self.max_req_len != 0xff and (req.offset + req.length) > 16): req.length = 16 - req.offset rsp = self.send_message(req) if rsp.completion_code == constants.CC_CANT_RET_NUM_REQ_BYTES: if self.max_req_len == 0xff: self.max_req_len = 16 else: self.max_req_len -= 1 continue else: check_completion_code(rsp.completion_code) record_data.append_array(rsp.record_data) req.offset = len(record_data) if len(record_data) >= 16: break next_record_id = rsp.next_record_id yield SelEntry(record_data) if next_record_id == 0xffff: break
def write_fru_data(self, data, offset=0, fru_id=0): req = create_request_by_name('WriteFruData') req.fru_id = fru_id for chunk in chunks(data, self.write_length): req.offset = offset req.data = chunk rsp = self.send_message(req) check_completion_code(rsp.completion_code) offset += len(chunk)
def delete_sdr(self, record_id): """Deletes the sensor record specified by 'record_id'. """ reservation_id = self.reserve_device_sdr_repository() req = create_request_by_name('DeleteSdr') req.reservation_id = reservation_id req.record_id = record_id rsp = self.send_message(req) check_completion_code(rsp.completion_code) return rsp.record_id
def _get_device_sdr_chunk(self, reservation_id, record_id, offset, length): req = create_request_by_name('GetDeviceSdr') req.reservation_id = reservation_id req.record_id = record_id req.offset = offset req.bytes_to_read = length rsp = get_sdr_chunk_helper(self.send_message, req, \ self.reserve_device_sdr_repository) return (rsp.next_record_id, rsp.record_data)
def partial_add_sdr(self, reservation_id, record_id, offset, progress, data): req = create_request_by_name('PartialAddSdr') req.reservation_id = reservation_id req.record_id = record_id req.offset = offset req.status.in_progress = progress req.data = data rsp = self.send_message(req) check_completion_code(rsp.completion_code) return rsp.record_id
def get_lan_configuration_parameters(self, channel=0, parameter_selector=0, set_selector=0, block_selector=0, revision_only=0): req = create_request_by_name('GetLanConfigurationParameters') req.command.get_parameter_revision_only = revision_only if revision_only is not 1: req.command.channel_number = channel req.parameter_selector = parameter_selector req.set_selector = set_selector req.block_selector = block_selector rsp = self.send_message(req) check_completion_code(rsp.completion_code) return rsp.data
def i2c_write_read(self, type, id, channel, address, count, data=None): req = create_request_by_name('MasterWriteRead') req.bus_id.type = type req.bus_id.id= id req.bus_id.channel = channel req.bus_id.slave_address = address req.read_count = count if data: req.data = data rsp = self.send_message(req) check_completion_code(rsp.completion_code) return rsp.data
def i2c_write_read(self, type, id, channel, address, count, data=None): req = create_request_by_name('MasterWriteRead') req.bus_id.type = type req.bus_id.id = id req.bus_id.channel = channel req.bus_id.slave_address = address req.read_count = count if data: req.data = data rsp = self.send_message(req) check_completion_code(rsp.completion_code) return rsp.data
def set_port_state(self, link_descr, state): req = create_request_by_name('SetPortState') req.link_info.channel = link_descr.channel req.link_info.interface = link_descr.interface req.link_info.port_0 = (link_descr.link_flags >> 0) & 1 req.link_info.port_1 = (link_descr.link_flags >> 1) & 1 req.link_info.port_2 = (link_descr.link_flags >> 2) & 1 req.link_info.port_3 = (link_descr.link_flags >> 3) & 1 req.link_info.type = link_descr.type req.link_info.sig_class = link_descr.sig_class req.link_info.type_extension = link_descr.extension req.link_info.grouping_id = link_descr.grouping_id req.state = state rsp = self.send_message(req) check_completion_code(rsp.completion_code)
def set_watchdog_timer(self, config): req = create_request_by_name('SetWatchdogTimer') req.timer_use.timer_use = config.timer_use req.timer_use.dont_stop = config.dont_stop and 1 or 0 req.timer_use.dont_log = config.dont_log and 1 or 0 req.timer_actions.pre_timeout_interrupt = \ config.pre_timeout_interrupt req.timer_actions.timeout_action = \ config.timeout_action req.pre_timeout_interval = config.pre_timeout_interval req.timer_use_expiration_flags = config.timer_use_expiration_flags req.initial_countdown = config.initial_countdown rsp = self.send_message(req) check_completion_code(rsp.completion_code)
def set_fru_activation_policy(self, fru_id, ctrl): req = create_request_by_name('SetFruActivationPolicy') req.fru_id = fru_id if ctrl == self.ACTIVATION_LOCK_SET: req.mask.activation_locked = 1 req.set.activation_locked = 1 elif ctrl == self.ACTIVATION_LOCK_CLEAR: req.mask.activation_locked = 1 req.set.activation_locked = 0 elif ctrl == self.DEACTIVATION_LOCK_SET: req.mask.deactivation_locked = 1 req.set.deactivation_locked = 1 elif ctrl == self.DEACTIVATION_LOCK_CLEAR: req.mask.deactivation_locked = 1 req.set.deactivation_locked = 0 rsp = self.send_message(req) check_completion_code(rsp.completion_code)
def get_port_state(self, channel_number, channel_interface): req = create_request_by_name('GetPortState') req.channel.number = channel_number req.channel.interface = channel_interface rsp = self.send_message(req) check_completion_code(rsp.completion_code) if len(rsp.data) > 4: link = LinkDescriptor() link.channel = rsp.data[0] & 0x3F link.interface = rsp.data[0]>>6 & 0x3 link.link_flags = rsp.data[1]&0xf link.type = rsp.data[1]>>4&0xf link.sig_class = rsp.data[2] &0xf link.extension = rsp.data[2]>>4&0xf link.grouping_id = rsp.data[3] state = rsp.data[4] return (link, state)
def get_port_state(self, channel_number, channel_interface): req = create_request_by_name('GetPortState') req.channel.number = channel_number req.channel.interface = channel_interface rsp = self.send_message(req) check_completion_code(rsp.completion_code) if len(rsp.data) > 4: link = LinkDescriptor() link.channel = rsp.data[0] & 0x3F link.interface = rsp.data[0] >> 6 & 0x3 link.link_flags = rsp.data[1] & 0xf link.type = rsp.data[1] >> 4 & 0xf link.sig_class = rsp.data[2] & 0xf link.extension = rsp.data[2] >> 4 & 0xf link.grouping_id = rsp.data[3] state = rsp.data[4] return (link, state)
def initiate_upgrade_action(self, components_mask, action): """ Initiate Upgrade Action components: action: ACTION_BACKUP_COMPONENT = 0x00 ACTION_PREPARE_COMPONENT = 0x01 ACTION_UPLOAD_FOR_UPGRADE = 0x02 ACTION_UPLOAD_FOR_COMPARE = 0x03 """ if action in (ACTION_UPLOAD_FOR_UPGRADE, ACTION_UPLOAD_FOR_COMPARE): if self._get_component_count(components_mask) != 1: raise HpmError("more than 1 component not support for action") req = create_request_by_name('InitiateUpgradeAction') req.components = components_mask req.action = action rsp = self.send_message(req) check_completion_code(rsp.completion_code)
def get_sensor_thresholds(self, sensor_number, lun=0): req = create_request_by_name('GetSensorThresholds') req.sensor_number = sensor_number req.lun = lun rsp = self.send_message(req) check_completion_code(rsp.completion_code) thresholds = {} if rsp.readable_mask.unr: thresholds['unr'] = rsp.threshold.unr if rsp.readable_mask.ucr: thresholds['ucr'] = rsp.threshold.ucr if rsp.readable_mask.unc: thresholds['unc'] = rsp.threshold.unc if rsp.readable_mask.lnc: thresholds['lnc'] = rsp.threshold.lnc if rsp.readable_mask.lcr: thresholds['lcr'] = rsp.threshold.lcr if rsp.readable_mask.lnr: thresholds['lnr'] = rsp.threshold.lnr return thresholds
def read_fru_data(self, offset=None, count=None, fru_id=0): off = 0 area_size = 0 req_size = 32 data = array.array('B') # first check for maximum area size if offset is None: area_size = self.get_fru_inventory_area_info(fru_id) off = 0 else: area_size = offset + count off = offset while off < area_size: if (off + req_size) > area_size: req_size = area_size - off req = create_request_by_name('ReadFruData') req.fru_id = fru_id req.offset = off req.count = req_size try: rsp = self.send_message(req) check_completion_code(rsp.completion_code) except CompletionCodeError, e: if e.cc in (constants.CC_CANT_RET_NUM_REQ_BYTES, constants.CC_REQ_DATA_FIELD_EXCEED, constants.CC_PARAM_OUT_OF_RANGE): req_size -= 2 if req_size <= 0: raise continue else: raise data.extend(rsp.data) off += rsp.count
def get_sensor_reading(self, sensor_number, lun=0): """Returns the sensor reading at the assertion states for the given sensor number. `sensor_number` Returns a tuple with `raw reading`and `assertion states`. """ req = create_request_by_name('GetSensorReading') req.sensor_number = sensor_number req.lun = lun rsp = self.send_message(req) check_completion_code(rsp.completion_code) reading = rsp.sensor_reading if rsp.config.initial_update_in_progress: reading = None states = None if rsp.states1 is not None: states = rsp.states1 if rsp.states2 is not None: states |= (rsp.states2 << 8) return (reading, states)
def reserve_sdr_repository(self): req = create_request_by_name('ReserveSdrRepository') rsp = self.send_message(req) check_completion_code(rsp.completion_code) return rsp.reservation_id
def get_sdr_repository_allocation_info(self): req = create_request_by_name('GetSdrRepositoryAllocationInfo') rsp = self.send_message(req) check_completion_code(rsp.completion_code) return SdrRepositoryAllocationInfo(rsp)
def _run_initialization_agent(self, cmd): req = create_request_by_name('RunInitializationAgent') req.cmd = cmd rsp = self.send_message(req) check_completion_code(rsp.completion_code) return rsp.status.initialization_completed