[docker-platform-monitor]: Add LED control daemon and plugin for x86_64-arista_7050_qx32 platform (#691)
* Add files for building ledd package; add ledd to docker-platform-monitor; Control platform monitor docker using supervisord * Add sonic-platform-daemons submodule * Rename ledd.mk -> sonic-ledd.mk * Add led_control.py plugin for x86_64-arista_7050_qx32 platform * Rename Dockerfile -> Dockerfile.j2 * Fix build * Remove blank line
This commit is contained in:
parent
390591de90
commit
d094ceecc2
1
.gitignore
vendored
1
.gitignore
vendored
@ -34,6 +34,7 @@ dockers/docker-fpm-gobgp/Dockerfile
|
||||
dockers/docker-fpm-quagga/Dockerfile
|
||||
dockers/docker-lldp-sv2/Dockerfile
|
||||
dockers/docker-orchagent/Dockerfile
|
||||
dockers/docker-platform-monitor/Dockerfile
|
||||
dockers/docker-snmp-sv2/Dockerfile
|
||||
dockers/docker-teamd/Dockerfile
|
||||
platform/*/docker-syncd-*/Dockerfile
|
||||
|
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -60,3 +60,6 @@
|
||||
path = src/SAI
|
||||
url = https://github.com/opencomputeproject/SAI
|
||||
branch = v0.9.4
|
||||
[submodule "src/sonic-platform-daemons"]
|
||||
path = src/sonic-platform-daemons
|
||||
url = https://github.com/Azure/sonic-platform-daemons
|
||||
|
80
device/arista/x86_64-arista_7050_qx32/plugins/led_control.py
Normal file
80
device/arista/x86_64-arista_7050_qx32/plugins/led_control.py
Normal file
@ -0,0 +1,80 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# led_control.py
|
||||
#
|
||||
# Platform-specific LED control functionality for SONiC
|
||||
#
|
||||
|
||||
try:
|
||||
from sonic_led.led_control_base import LedControlBase
|
||||
except ImportError, e:
|
||||
raise ImportError (str(e) + " - required module not found")
|
||||
|
||||
|
||||
class LedControl(LedControlBase):
|
||||
"""Platform specific LED control class"""
|
||||
|
||||
SONIC_PORT_NAME_PREFIX = "Ethernet"
|
||||
|
||||
LED_SYSFS_PATH_BREAKOUT_CAPABLE = "/sys/class/leds/qsfp{0}_{1}/brightness"
|
||||
LED_SYSFS_PATH_NO_BREAKOUT = "/sys/class/leds/qsfp{0}/brightness"
|
||||
|
||||
QSFP_BREAKOUT_START_IDX = 1
|
||||
QSFP_BREAKOUT_END_IDX = 24
|
||||
QSFP_NO_BREAKOUT_START_IDX = 25
|
||||
QSFP_NO_BREAKOUT_END_IDX = 32
|
||||
|
||||
LED_COLOR_OFF = 0
|
||||
LED_COLOR_GREEN = 1
|
||||
LED_COLOR_YELLOW = 2
|
||||
|
||||
# Helper method to map SONiC port name to Arista QSFP index
|
||||
def _port_name_to_qsfp_index(self, port_name):
|
||||
# Strip "Ethernet" off port name
|
||||
if not port_name.startswith(self.SONIC_PORT_NAME_PREFIX):
|
||||
return -1
|
||||
|
||||
sonic_port_num = int(port_name[len(self.SONIC_PORT_NAME_PREFIX):])
|
||||
|
||||
# SONiC port nums are 0-based and increment by 4
|
||||
# Arista QSFP indices are 1-based and increment by 1
|
||||
return ((sonic_port_num/4) + 1)
|
||||
|
||||
# Concrete implementation of port_link_state_change() method
|
||||
def port_link_state_change(self, port, state):
|
||||
qsfp_index = self._port_name_to_qsfp_index(port)
|
||||
|
||||
# Ignore invalid QSFP indices
|
||||
if qsfp_index <= 0:
|
||||
return
|
||||
|
||||
# QSFP indices 1-24 are breakout-capable and have four LEDs,
|
||||
# whereas indices 25-32 are not breakout-capable, and only have one
|
||||
if qsfp_index <= self.QSFP_BREAKOUT_END_IDX:
|
||||
led_sysfs_path = self.LED_SYSFS_PATH_BREAKOUT_CAPABLE.format(qsfp_index, 1)
|
||||
else:
|
||||
led_sysfs_path = self.LED_SYSFS_PATH_NO_BREAKOUT.format(qsfp_index)
|
||||
|
||||
led_file = open(led_sysfs_path, "w")
|
||||
|
||||
if state == "up":
|
||||
led_file.write("%d" % self.LED_COLOR_GREEN)
|
||||
else:
|
||||
led_file.write("%d" % self.LED_COLOR_OFF)
|
||||
|
||||
led_file.close()
|
||||
|
||||
# Constructor
|
||||
def __init__(self):
|
||||
# Initialize: Turn all front panel QSFP LEDs off
|
||||
for qsfp_index in range(self.QSFP_BREAKOUT_START_IDX, self.QSFP_BREAKOUT_END_IDX + 1):
|
||||
for lane in range(1, 5):
|
||||
led_sysfs_path = self.LED_SYSFS_PATH_BREAKOUT_CAPABLE.format(qsfp_index, lane)
|
||||
with open(led_sysfs_path, 'w') as led_file:
|
||||
led_file.write("%d" % self.LED_COLOR_OFF)
|
||||
|
||||
for qsfp_index in range(self.QSFP_NO_BREAKOUT_START_IDX, self.QSFP_NO_BREAKOUT_END_IDX + 1):
|
||||
led_sysfs_path = self.LED_SYSFS_PATH_NO_BREAKOUT.format(qsfp_index)
|
||||
with open(led_sysfs_path, 'w') as led_file:
|
||||
led_file.write("%d" % self.LED_COLOR_OFF)
|
||||
|
@ -1,18 +0,0 @@
|
||||
FROM docker-config-engine
|
||||
|
||||
## Make apt-get non-interactive
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
RUN apt-get update
|
||||
|
||||
RUN apt-get install -y sensord
|
||||
|
||||
## Clean up
|
||||
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
|
||||
RUN rm -rf /debs
|
||||
|
||||
COPY ["start.sh", "lm-sensors.sh", "/usr/bin/"]
|
||||
COPY ["supervisord.conf", "/etc/supervisor/conf.d/"]
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
|
61
dockers/docker-platform-monitor/Dockerfile.j2
Executable file
61
dockers/docker-platform-monitor/Dockerfile.j2
Executable file
@ -0,0 +1,61 @@
|
||||
FROM docker-config-engine
|
||||
|
||||
# Make apt-get non-interactive
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
# Update apt's package index files
|
||||
RUN apt-get update
|
||||
|
||||
RUN apt-get install -y python-pip sensord
|
||||
|
||||
{% if docker_platform_monitor_debs.strip() %}
|
||||
# Copy built Debian packages
|
||||
COPY \
|
||||
{% for deb in docker_platform_monitor_debs.split(' ') -%}
|
||||
debs/{{ deb }}{{' '}}
|
||||
{%- endfor -%}
|
||||
debs/
|
||||
{%- endif %}
|
||||
|
||||
{% if docker_platform_monitor_debs.strip() %}
|
||||
# Install built Debian packages
|
||||
RUN dpkg -i \
|
||||
{% for deb in docker_platform_monitor_debs.split(' ') -%}
|
||||
debs/{{ deb }}{{' '}}
|
||||
{%- endfor %}
|
||||
{%- endif %}
|
||||
|
||||
{% if docker_platform_monitor_whls.strip() %}
|
||||
# Copy built Python wheels
|
||||
COPY \
|
||||
{% for whl in docker_platform_monitor_whls.split(' ') -%}
|
||||
python-wheels/{{ whl }}{{' '}}
|
||||
{%- endfor -%}
|
||||
python-wheels/
|
||||
{%- endif %}
|
||||
|
||||
{% if docker_platform_monitor_whls.strip() %}
|
||||
# Install built Python wheels
|
||||
RUN pip install \
|
||||
{% for whl in docker_platform_monitor_whls.split(' ') -%}
|
||||
python-wheels/{{ whl }}{{' '}}
|
||||
{%- endfor %}
|
||||
{%- endif %}
|
||||
|
||||
COPY python-wheels /python-wheels
|
||||
|
||||
# Install Python SwSS SDK (dependency of sonic-ledd)
|
||||
RUN pip install /python-wheels/swsssdk-2.0.1-py2-none-any.whl
|
||||
|
||||
# Clean up
|
||||
RUN apt-get remove -y python-pip
|
||||
RUN apt-get clean -y
|
||||
RUN apt-get autoclean -y
|
||||
RUN apt-get autoremove -y
|
||||
RUN rm -rf /debs /python-wheels ~/.cache
|
||||
|
||||
COPY ["start.sh", "lm-sensors.sh", "/usr/bin/"]
|
||||
COPY ["supervisord.conf", "/etc/supervisor/conf.d/"]
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
mkdir -p /etc/sensors.d
|
||||
if [ -e /usr/share/sonic/platform/sensors.conf ]; then
|
||||
/bin/cp -rf /usr/share/sonic/platform/sensors.conf /etc/sensors.d/
|
||||
/bin/cp -rf /usr/share/sonic/platform/sensors.conf /etc/sensors.d/
|
||||
fi
|
||||
|
||||
mkdir -p /var/sonic
|
||||
@ -12,4 +12,5 @@ rm -f /var/run/rsyslogd.pid
|
||||
|
||||
supervisorctl start rsyslogd
|
||||
supervisorctl start lm-sensors
|
||||
supervisorctl start ledd
|
||||
|
||||
|
@ -27,3 +27,10 @@ autorestart=false
|
||||
stdout_logfile=syslog
|
||||
stderr_logfile=syslog
|
||||
|
||||
[program:ledd]
|
||||
command=/usr/bin/ledd
|
||||
priority=6
|
||||
autostart=false
|
||||
stdout_logfile=syslog
|
||||
stderr_logfile=syslog
|
||||
|
||||
|
@ -1,10 +1,11 @@
|
||||
# docker platform monitor image
|
||||
# Docker image for SONiC platform monitoring tools
|
||||
|
||||
DOCKER_PLATFORM_MONITOR = docker-platform-monitor.gz
|
||||
$(DOCKER_PLATFORM_MONITOR)_PATH = $(DOCKERS_PATH)/docker-platform-monitor
|
||||
$(DOCKER_PLATFORM_MONITOR)_DEPENDS += $(SONIC_LEDD)
|
||||
$(DOCKER_PLATFORM_MONITOR)_LOAD_DOCKERS = $(DOCKER_CONFIG_ENGINE)
|
||||
|
||||
SONIC_SIMPLE_DOCKER_IMAGES += $(DOCKER_PLATFORM_MONITOR)
|
||||
SONIC_DOCKER_IMAGES += $(DOCKER_PLATFORM_MONITOR)
|
||||
SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_PLATFORM_MONITOR)
|
||||
|
||||
$(DOCKER_PLATFORM_MONITOR)_CONTAINER_NAME = pmon
|
||||
|
5
rules/sonic-ledd.mk
Normal file
5
rules/sonic-ledd.mk
Normal file
@ -0,0 +1,5 @@
|
||||
# sonic-ledd (SONiC Front-panel LED control daemon) Debian package
|
||||
|
||||
SONIC_LEDD = python-sonic-ledd_1.0-1_all.deb
|
||||
$(SONIC_LEDD)_SRC_PATH = $(SRC_PATH)/sonic-platform-daemons/sonic-ledd
|
||||
SONIC_PYTHON_STDEB_DEBS += $(SONIC_LEDD)
|
1
src/sonic-platform-daemons
Submodule
1
src/sonic-platform-daemons
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit bd7c310757658396ccfaaf653ede4a931b3d4154
|
Loading…
Reference in New Issue
Block a user