mirror of
https://opendev.org/x/pyghmi
synced 2026-04-04 00:56:27 +00:00
Merge "Support Kent"
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user