Skip to content

Commit

Permalink
[docker-platform-monitor]: Add LED control daemon and plugin for x86_…
Browse files Browse the repository at this point in the history
…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
  • Loading branch information
jleveque authored and lguohan committed Jun 11, 2017
1 parent 390591d commit d094cee
Show file tree
Hide file tree
Showing 10 changed files with 163 additions and 21 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -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 changes: 80 additions & 0 deletions device/arista/x86_64-arista_7050_qx32/plugins/led_control.py
Original file line number Diff line number Diff line change
@@ -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)

18 changes: 0 additions & 18 deletions dockers/docker-platform-monitor/Dockerfile

This file was deleted.

61 changes: 61 additions & 0 deletions dockers/docker-platform-monitor/Dockerfile.j2
Original file line number Diff line number Diff line change
@@ -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"]

3 changes: 2 additions & 1 deletion dockers/docker-platform-monitor/start.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -12,4 +12,5 @@ rm -f /var/run/rsyslogd.pid

supervisorctl start rsyslogd
supervisorctl start lm-sensors
supervisorctl start ledd

7 changes: 7 additions & 0 deletions dockers/docker-platform-monitor/supervisord.conf
Original file line number Diff line number Diff line change
Expand Up @@ -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

5 changes: 3 additions & 2 deletions rules/docker-platform-monitor.mk
Original file line number Diff line number Diff line change
@@ -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
Expand Down
5 changes: 5 additions & 0 deletions rules/sonic-ledd.mk
Original file line number Diff line number Diff line change
@@ -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 change: 1 addition & 0 deletions src/sonic-platform-daemons
Submodule sonic-platform-daemons added at bd7c31

0 comments on commit d094cee

Please sign in to comment.