[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:
Joe LeVeque 2017-06-10 22:05:11 -07:00 committed by lguohan
parent 390591de90
commit d094ceecc2
10 changed files with 163 additions and 21 deletions

1
.gitignore vendored
View File

@ -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
View File

@ -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

View 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)

View File

@ -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"]

View 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"]

View File

@ -12,4 +12,5 @@ rm -f /var/run/rsyslogd.pid
supervisorctl start rsyslogd
supervisorctl start lm-sensors
supervisorctl start ledd

View File

@ -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

View File

@ -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
View 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)

@ -0,0 +1 @@
Subproject commit bd7c310757658396ccfaaf653ede4a931b3d4154