[Mellanox] Backporting reboot cause to 201811 (#3198)
* backport new platform api to 201811, reboot cause part * install new platform api on host * 1. remove chassis's dependency on sonic_platform_daemon. 2. add some mellanox-specific hardware reboot causes. 3. fix typo in files/image_config/process-reboot-cause/process-reboot-cause. * 1. add dependency of sonic_platform for base image 2. handle the case of reboot cause file not found * adjust log message.
This commit is contained in:
parent
f1478818a1
commit
7a9d04ee73
@ -333,6 +333,12 @@ sudo cp target/files/$ISSU_VERSION_FILE $FILESYSTEM_ROOT/etc/mlnx/issu-version
|
||||
sudo cp target/files/$MLNX_FFB_SCRIPT $FILESYSTEM_ROOT/usr/bin/mlnx-ffb.sh
|
||||
j2 platform/mellanox/mlnx-fw-upgrade.j2 | sudo tee $FILESYSTEM_ROOT/usr/bin/mlnx-fw-upgrade.sh
|
||||
sudo chmod 755 $FILESYSTEM_ROOT/usr/bin/mlnx-fw-upgrade.sh
|
||||
|
||||
# Install mlnx-sonic-platform Python 2 package
|
||||
MLNX_PLATFORM_COMMON_PY2_WHEEL_NAME=$(basename {{mlnx_platform_api_py2_wheel_path}})
|
||||
sudo cp {{mlnx_platform_api_py2_wheel_path}} $FILESYSTEM_ROOT/$MLNX_PLATFORM_COMMON_PY2_WHEEL_NAME
|
||||
sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip install $MLNX_PLATFORM_COMMON_PY2_WHEEL_NAME
|
||||
sudo rm -rf $FILESYSTEM_ROOT/$MLNX_PLATFORM_COMMON_PY2_WHEEL_NAME
|
||||
{% endif %}
|
||||
|
||||
{%- if SONIC_ROUTING_STACK == "frr" %}
|
||||
|
@ -70,7 +70,7 @@ def main():
|
||||
# if there is no sonic_platform package installed, we only provide
|
||||
# software-related reboot causes.
|
||||
try:
|
||||
import sonic_platform
|
||||
import sonic_platform.platform
|
||||
|
||||
# Check if the previous reboot was caused by hardware
|
||||
platform = sonic_platform.platform.Platform()
|
||||
|
8
platform/mellanox/mlnx-platform-api.mk
Normal file
8
platform/mellanox/mlnx-platform-api.mk
Normal file
@ -0,0 +1,8 @@
|
||||
# SONIC_PLATFORM_API_PY2 package
|
||||
|
||||
SONIC_PLATFORM_API_PY2 = mlnx_platform_api-1.0-py2-none-any.whl
|
||||
$(SONIC_PLATFORM_API_PY2)_SRC_PATH = $(PLATFORM_PATH)/mlnx-platform-api
|
||||
$(SONIC_PLATFORM_API_PY2)_PYTHON_VERSION = 2
|
||||
SONIC_PYTHON_WHEELS += $(SONIC_PLATFORM_API_PY2)
|
||||
|
||||
export mlnx_platform_api_py2_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_PLATFORM_API_PY2))"
|
30
platform/mellanox/mlnx-platform-api/setup.py
Normal file
30
platform/mellanox/mlnx-platform-api/setup.py
Normal file
@ -0,0 +1,30 @@
|
||||
from setuptools import setup
|
||||
|
||||
setup(
|
||||
name='mlnx-platform-api',
|
||||
version='1.0',
|
||||
description='SONiC platform API implementation on Mellanox platform',
|
||||
license='Apache 2.0',
|
||||
author='SONiC Team',
|
||||
author_email='linuxnetdev@microsoft.com',
|
||||
url='https://github.com/Azure/sonic-buildimage',
|
||||
maintainer='Kevin Wang',
|
||||
maintainer_email='kevinw@mellanox.com',
|
||||
packages=[
|
||||
'sonic_platform',
|
||||
],
|
||||
classifiers=[
|
||||
'Development Status :: 3 - Alpha',
|
||||
'Environment :: Plugins',
|
||||
'Intended Audience :: Developers',
|
||||
'Intended Audience :: Information Technology',
|
||||
'Intended Audience :: System Administrators',
|
||||
'License :: OSI Approved :: Apache Software License',
|
||||
'Natural Language :: English',
|
||||
'Operating System :: POSIX :: Linux',
|
||||
'Programming Language :: Python :: 2.7',
|
||||
'Topic :: Utilities',
|
||||
],
|
||||
keywords='sonic SONiC platform PLATFORM',
|
||||
)
|
||||
|
110
platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py
Normal file
110
platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py
Normal file
@ -0,0 +1,110 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
#############################################################################
|
||||
# Mellanox
|
||||
#
|
||||
# Module contains an implementation of SONiC Platform Base API and
|
||||
# provides the Chassis information which are available in the platform
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
import sys
|
||||
|
||||
try:
|
||||
from sonic_platform_base.chassis_base import ChassisBase
|
||||
from os.path import join
|
||||
import io
|
||||
import re
|
||||
import subprocess
|
||||
import syslog
|
||||
except ImportError as e:
|
||||
raise ImportError (str(e) + "- required module not found")
|
||||
|
||||
HWMGMT_SYSTEM_ROOT = '/var/run/hw-management/system/'
|
||||
|
||||
#reboot cause related definitions
|
||||
REBOOT_CAUSE_ROOT = HWMGMT_SYSTEM_ROOT
|
||||
|
||||
REBOOT_CAUSE_POWER_LOSS_FILE = 'reset_main_pwr_fail'
|
||||
REBOOT_CAUSE_AUX_POWER_LOSS_FILE = 'reset_aux_pwr_or_ref'
|
||||
REBOOT_CAUSE_THERMAL_OVERLOAD_ASIC_FILE = 'reset_asic_thermal'
|
||||
REBOOT_CAUSE_WATCHDOG_FILE = 'reset_hotswap_or_wd'
|
||||
REBOOT_CAUSE_MLNX_FIRMWARE_RESET = 'reset_fw_reset'
|
||||
REBOOT_CAUSE_LONG_PB = 'reset_long_pb'
|
||||
REBOOT_CAUSE_SHORT_PB = 'reset_short_pb'
|
||||
|
||||
REBOOT_CAUSE_FILE_LENGTH = 1
|
||||
|
||||
# ========================== Syslog wrappers ==========================
|
||||
SYSLOG_IDENTIFIER = "mlnx-chassis"
|
||||
def log_warning(msg, also_print_to_console=False):
|
||||
syslog.openlog(SYSLOG_IDENTIFIER)
|
||||
syslog.syslog(syslog.LOG_WARNING, msg)
|
||||
syslog.closelog()
|
||||
|
||||
|
||||
class Chassis(ChassisBase):
|
||||
"""Platform-specific Chassis class"""
|
||||
|
||||
def __init__(self):
|
||||
super(Chassis, self).__init__()
|
||||
|
||||
def _read_generic_file(self, filename, len):
|
||||
"""
|
||||
Read a generic file, returns the contents of the file
|
||||
"""
|
||||
result = ''
|
||||
try:
|
||||
fileobj = io.open(filename)
|
||||
result = fileobj.read(len)
|
||||
fileobj.close()
|
||||
return result
|
||||
except Exception as e:
|
||||
log_warning("Fail to read file {} due to {}".format(filename, repr(e)))
|
||||
return ''
|
||||
|
||||
def _verify_reboot_cause(self, filename):
|
||||
'''
|
||||
Open and read the reboot cause file in
|
||||
/var/run/hwmanagement/system (which is defined as REBOOT_CAUSE_ROOT)
|
||||
If a reboot cause file doesn't exists, returns '0'.
|
||||
'''
|
||||
try:
|
||||
return bool(int(self._read_generic_file(join(REBOOT_CAUSE_ROOT, filename), REBOOT_CAUSE_FILE_LENGTH).rstrip('\n')))
|
||||
except:
|
||||
return False
|
||||
|
||||
def get_reboot_cause(self):
|
||||
"""
|
||||
Retrieves the cause of the previous reboot
|
||||
|
||||
Returns:
|
||||
A tuple (string, string) where the first element is a string
|
||||
containing the cause of the previous reboot. This string must be
|
||||
one of the predefined strings in this class. If the first string
|
||||
is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used
|
||||
to pass a description of the reboot cause.
|
||||
"""
|
||||
#read reboot causes files in the following order
|
||||
minor_cause = ''
|
||||
if self._verify_reboot_cause(REBOOT_CAUSE_POWER_LOSS_FILE):
|
||||
major_cause = self.REBOOT_CAUSE_POWER_LOSS
|
||||
elif self._verify_reboot_cause(REBOOT_CAUSE_AUX_POWER_LOSS_FILE):
|
||||
major_cause = self.REBOOT_CAUSE_POWER_LOSS
|
||||
elif self._verify_reboot_cause(REBOOT_CAUSE_THERMAL_OVERLOAD_ASIC_FILE):
|
||||
major_cause = self.REBOOT_CAUSE_THERMAL_OVERLOAD_ASIC
|
||||
elif self._verify_reboot_cause(REBOOT_CAUSE_WATCHDOG_FILE):
|
||||
major_cause = self.REBOOT_CAUSE_WATCHDOG
|
||||
else:
|
||||
major_cause = self.REBOOT_CAUSE_HARDWARE_OTHER
|
||||
if self._verify_reboot_cause(REBOOT_CAUSE_MLNX_FIRMWARE_RESET):
|
||||
minor_cause = "Reset by ASIC firmware"
|
||||
elif self._verify_reboot_cause(REBOOT_CAUSE_LONG_PB):
|
||||
minor_cause = "Reset by long press on power button"
|
||||
elif self._verify_reboot_cause(REBOOT_CAUSE_SHORT_PB):
|
||||
minor_cause = "Reset by short press on power button"
|
||||
else:
|
||||
major_cause = self.REBOOT_CAUSE_NON_HARDWARE
|
||||
|
||||
return major_cause, minor_cause
|
||||
|
@ -0,0 +1,19 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
#############################################################################
|
||||
# Mellanox
|
||||
#
|
||||
# implementation of new platform api
|
||||
#############################################################################
|
||||
|
||||
try:
|
||||
from sonic_platform_base.platform_base import PlatformBase
|
||||
from sonic_platform.chassis import Chassis
|
||||
except ImportError as e:
|
||||
raise ImportError(str(e) + "- required module not found")
|
||||
|
||||
|
||||
class Platform(PlatformBase):
|
||||
def __init__(self):
|
||||
PlatformBase.__init__(self)
|
||||
self._chassis = Chassis()
|
@ -3,6 +3,7 @@ include $(PLATFORM_PATH)/fw.mk
|
||||
include $(PLATFORM_PATH)/mft.mk
|
||||
include $(PLATFORM_PATH)/mlnx-sai.mk
|
||||
include $(PLATFORM_PATH)/hw-management.mk
|
||||
include $(PLATFORM_PATH)/mlnx-platform-api.mk
|
||||
include $(PLATFORM_PATH)/docker-syncd-mlnx.mk
|
||||
include $(PLATFORM_PATH)/docker-syncd-mlnx-rpc.mk
|
||||
include $(PLATFORM_PATH)/docker-orchagent-mlnx.mk
|
||||
|
3
slave.mk
3
slave.mk
@ -558,7 +558,8 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \
|
||||
$$(addprefix $(TARGET_PATH)/,$$($$*_DOCKERS)) \
|
||||
$$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_CONFIG_ENGINE)) \
|
||||
$$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_PLATFORM_COMMON_PY2)) \
|
||||
$$(addprefix $(PYTHON_WHEELS_PATH)/,$(REDIS_DUMP_LOAD_PY2))
|
||||
$$(addprefix $(PYTHON_WHEELS_PATH)/,$(REDIS_DUMP_LOAD_PY2)) \
|
||||
$$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_PLATFORM_API_PY2))
|
||||
$(HEADER)
|
||||
# Pass initramfs and linux kernel explicitly. They are used for all platforms
|
||||
export initramfs_tools="$(DEBS_PATH)/$(INITRAMFS_TOOLS)"
|
||||
|
Loading…
Reference in New Issue
Block a user