diff --git a/pyghmi/ipmi/oem/lenovo/handler.py b/pyghmi/ipmi/oem/lenovo/handler.py index 6874b7f5..3effca10 100755 --- a/pyghmi/ipmi/oem/lenovo/handler.py +++ b/pyghmi/ipmi/oem/lenovo/handler.py @@ -124,6 +124,13 @@ led_status = { 0xFF: "On" } +ami_leds = { + "BMC_HEARTBEAT": 0x00, + "BMC_UID": 0x01, + "SYSTEM_FAULT": 0x02, + "HDD_FAULT": 0x03 +} + asrock_leds = { "SYSTEM_EVENT": 0x00, "BMC_UID": 0x01, @@ -146,6 +153,11 @@ asrock_led_status = { 0x01: "On" } +ami_led_status = { + 0x00: "Off", + 0x01: "On" +} + led_status_default = "Blink" mac_format = '{0:02x}:{1:02x}:{2:02x}:{3:02x}:{4:02x}:{5:02x}' categorie_items = ["cpu", "dimm", "firmware", "bios_version"] @@ -313,7 +325,7 @@ class OEMHandler(generic.OEMHandler): return super(OEMHandler, self).reseat_bay(bay) def get_ntp_enabled(self): - if self.has_tsm or self.has_asrock: + if self.has_tsm or self.has_ami or self.has_asrock: ntpres = self.ipmicmd.xraw_command(netfn=0x32, command=0xa7) return ntpres['data'][0] == '\x01' elif self.is_fpc: @@ -323,7 +335,7 @@ class OEMHandler(generic.OEMHandler): return None def get_ntp_servers(self): - if self.has_tsm or self.has_asrock: + if self.has_tsm or self.has_ami or self.has_asrock: srvs = [] ntpres = self.ipmicmd.xraw_command(netfn=0x32, command=0xa7) srvs.append(ntpres['data'][1:129].rstrip('\x00')) @@ -336,7 +348,7 @@ class OEMHandler(generic.OEMHandler): return None def set_ntp_enabled(self, enabled): - if self.has_tsm or self.has_asrock: + if self.has_tsm or self.has_ami or self.has_asrock: if enabled: self.ipmicmd.xraw_command( netfn=0x32, command=0xa8, data=(3, 1), timeout=15) @@ -352,7 +364,7 @@ class OEMHandler(generic.OEMHandler): return None def set_ntp_server(self, server, index=0): - if self.has_tsm or self.has_asrock: + if self.has_tsm or self.has_ami or self.has_asrock: if not (0 <= index <= 1): raise pygexc.InvalidParameterValue("Index must be 0 or 1") cmddata = bytearray((1 + index, )) @@ -457,7 +469,7 @@ class OEMHandler(generic.OEMHandler): return False def get_oem_inventory_descriptions(self): - if self.has_tsm or self.has_asrock: + if self.has_tsm or self.has_ami or self.has_asrock: # Thinkserver with TSM if not self.oem_inventory_info: self._collect_tsm_inventory() @@ -469,7 +481,7 @@ class OEMHandler(generic.OEMHandler): return () def get_oem_inventory(self): - if self.has_tsm or self.has_asrock: + if self.has_tsm or self.has_ami or self.has_asrock: self._collect_tsm_inventory() for compname in self.oem_inventory_info: yield (compname, self.oem_inventory_info[compname]) @@ -511,7 +523,7 @@ class OEMHandler(generic.OEMHandler): return () def get_inventory_of_component(self, component): - if self.has_tsm or self.has_asrock: + if self.has_tsm or self.has_ami or self.has_asrock: self._collect_tsm_inventory() return self.oem_inventory_info.get(component, None) if self.has_imm: @@ -615,7 +627,11 @@ class OEMHandler(generic.OEMHandler): led_set_status = led_status asrock = self.has_asrock - if asrock: + if self.has_ami: + cmd = 0x05 + led_set = ami_leds + led_set_status = ami_led_status + elif asrock: cmd = 0x50 # because rs160 has different led info with ts460 if self.isTS460: @@ -774,8 +790,28 @@ class OEMHandler(generic.OEMHandler): self._hasimm = (rdata[1] & 1 == 1) or (rdata[1] & 16 == 16) return self._hasimm + @property + def has_ami(self): + """True if this particular server is AMI based lenovo server + + """ + if(self.oemid['manufacturer_id'] == 19046 + and self.oemid['product_id'] == 13616): + try: + rsp = self.ipmicmd.xraw_command(netfn=0x3a, command=0x80) + except pygexc.IpmiException as ie: + if ie.ipmicode == 193: + return False + raise + rdata = bytearray(rsp['data'][:]) + if rdata[0] in range(5): + return True + else: + return False + return False + def get_oem_firmware(self, bmcver, components): - if self.has_tsm or self.has_asrock: + if self.has_tsm or self.has_ami or self.has_asrock: command = firmware.get_categories()["firmware"] fw_cmd = self.get_cmd_type("firmware", command) rsp = self.ipmicmd.xraw_command(**fw_cmd) diff --git a/pyghmi/ipmi/private/constants.py b/pyghmi/ipmi/private/constants.py index 3244650f..9c0084d0 100644 --- a/pyghmi/ipmi/private/constants.py +++ b/pyghmi/ipmi/private/constants.py @@ -388,11 +388,11 @@ generic_type_offsets = { 'desc': 'Redundant', 'severity': const.Health.Ok, 'deassertion_desc': 'Redundant lost', - 'deassertion_severity': const.Health.Ok, + 'deassertion_severity': const.Health.Critical, }, 1: { 'desc': 'Not redundant', # redundancy lost - 'severity': const.Health.Warning, + 'severity': const.Health.Critical, 'deassertion_desc': 'Redundancy restored', 'deassertion_severity': const.Health.Ok, }, @@ -404,7 +404,7 @@ generic_type_offsets = { }, 3: { 'desc': 'Not redundant', # down to non redundant - 'severity': const.Health.Ok, + 'severity': const.Health.Warning, 'deassertion_desc': 'Redundancy restored', 'deassertion_severity': const.Health.Ok, }, @@ -603,7 +603,7 @@ sensor_type_offsets = { }, 8: { 'desc': 'Disabled', - 'severity': const.Health.Warning, + 'severity': const.Health.Ok, 'deassertion_desc': 'Enabled', 'deassertion_severity': const.Health.Ok, }, @@ -761,13 +761,13 @@ sensor_type_offsets = { }, 4: { 'desc': 'Device disabled', - 'severity': const.Health.Warning, + 'severity': const.Health.Ok, 'deassertion_desc': 'Device enabled', 'deassertion_severity': const.Health.Ok, }, 5: { 'desc': 'Correctable memory error logging limit reached', - 'severity': const.Health.Critical, + 'severity': const.Health.Warning, 'deassertion_desc': 'Correctable memory error logging restored', 'deassertion_severity': const.Health.Ok, }, @@ -905,7 +905,7 @@ sensor_type_offsets = { }, 4: { 'desc': 'Event log full', - 'severity': const.Health.Warning, + 'severity': const.Health.Ok, 'deassertion_desc': 'Event log no longer full', 'deassertion_severity': const.Health.Ok, }, @@ -963,7 +963,7 @@ sensor_type_offsets = { 0x13: { # critical interrupt 0: { 'desc': 'Front panel diagnostic interrupt', - 'severity': const.Health.Ok, + 'severity': const.Health.Critical, 'deassertion_desc': 'Front panel diagnostic interrupt deasserted', 'deassertion_severity': const.Health.Ok, }, @@ -1442,19 +1442,19 @@ sensor_type_offsets = { }, 0x1: { 'desc': 'Watchdog hard reset', - 'severity': const.Health.Failed, + 'severity': const.Health.Ok, 'deassertion_desc': 'Watchdog hard reset deasserted', 'deassertion_severity': const.Health.Ok, }, 0x2: { 'desc': 'Watchdog power down', - 'severity': const.Health.Failed, + 'severity': const.Health.Ok, 'deassertion_desc': 'Watchdog power down deasserted', 'deassertion_severity': const.Health.Ok, }, 0x3: { 'desc': 'Watchdog power cycle', - 'severity': const.Health.Failed, + 'severity': const.Health.Ok, 'deassertion_desc': 'Watchdog power cycle deasserted', 'deassertion_severity': const.Health.Ok, },