Skip to content

Commit

Permalink
Initial commit for introducing the SONiC Platform Development Environ…
Browse files Browse the repository at this point in the history
…ment (PDE) into sonic-buildimage
  • Loading branch information
wbschwar committed Nov 18, 2019
1 parent f9e36d3 commit 85689ed
Show file tree
Hide file tree
Showing 14 changed files with 1,226 additions and 2 deletions.
20 changes: 19 additions & 1 deletion Makefile.work
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
# * BUILD_NUMBER: Desired version-number to pass to the building-system.
# * ENABLE_DHCP_GRAPH_SERVICE: Enables get-graph service to fetch minigraph files
# through http.
# * ENABLE_PDE: Enables platform development environment.
# * SHUTDOWN_BGP_ON_START: Sets admin-down state for all bgp peerings after restart.
# * ENABLE_PFCWD_ON_START: Enable PFC Watchdog (PFCWD) on server-facing ports
# * by default for TOR switch.
Expand Down Expand Up @@ -162,6 +163,7 @@ SONIC_BUILD_INSTRUCTION := make \
BUILD_NUMBER=$(BUILD_NUMBER) \
BUILD_TIMESTAMP=$(BUILD_TIMESTAMP) \
ENABLE_DHCP_GRAPH_SERVICE=$(ENABLE_DHCP_GRAPH_SERVICE) \
ENABLE_PDE=$(ENABLE_PDE) \
SHUTDOWN_BGP_ON_START=$(SHUTDOWN_BGP_ON_START) \
SONIC_ENABLE_PFCWD_ON_START=$(ENABLE_PFCWD_ON_START) \
SONIC_ENABLE_SYNCD_RPC=$(ENABLE_SYNCD_RPC) \
Expand All @@ -178,7 +180,17 @@ SONIC_BUILD_INSTRUCTION := make \
EXTRA_JESSIE_TARGETS=$(EXTRA_JESSIE_TARGETS) \
$(SONIC_OVERRIDE_BUILD_VARS)

.PHONY: sonic-slave-build sonic-slave-bash init reset
PDESUBMODULES = src/sonic-linux-kernel \
src/sonic-utilities \
src/sonic-platform-common \
src/sonic-swss-common \
src/sonic-py-swsssdk \
src/redis-dump-load \
src/sonic-sairedis \
src/sonic-platform-daemons \
src/sonic-platform-pde

.PHONY: sonic-slave-build sonic-slave-bash init initpde reset

.DEFAULT_GOAL := all

Expand Down Expand Up @@ -226,6 +238,12 @@ showtag:
@echo $(SLAVE_IMAGE):$(SLAVE_TAG)
@echo $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG)

initpde:
@for submodule in $(PDESUBMODULES) ; do \
git submodule update --init --recursive $$submodule ; \
done
@git submodule foreach --recursive '[ -f .git ] && echo "gitdir: $$(realpath --relative-to=. $$(cut -d" " -f2 .git))" > .git'

init :
@git submodule update --init --recursive
@git submodule foreach --recursive '[ -f .git ] && echo "gitdir: $$(realpath --relative-to=. $$(cut -d" " -f2 .git))" > .git'
Expand Down
54 changes: 54 additions & 0 deletions dockers/docker-pde/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@

FROM docker-config-engine-stretch

ARG docker_container_name
ENV PYTHONPATH=/usr/share/sonic/platform

RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf

# Make apt-get non-interactive
ENV DEBIAN_FRONTEND=noninteractive

# Update apt's cache of available packages
RUN apt-get update && apt-get install -y ipmitool telnet busybox kmod

RUN pip install pytest pexpect

# Copy locally-built Debian package dependencies
COPY \
debs/libsaibcm_3.5.3.1m-25_amd64.deb debs/sonic-platform-pde_1.0_amd64.deb /debs/

# Install locally-built Debian packages and implicitly install their dependencies
RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \
dpkg_apt /debs/libsaibcm_3.5.3.1m-25_amd64.deb; \
dpkg_apt /debs/sonic-platform-pde_1.0_amd64.deb

# Copy locally-built Debian package dependencies
COPY \
python-debs/python-sonic-utilities_1.2-1_all.deb /debs/

# Install locally-built Debian packages and implicitly install their dependencies
RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /debs/python-sonic-utilities_1.2-1_all.deb

# Copy locally-built Python wheel dependencies
COPY \
python-wheels/sonic_platform_common-1.0-py2-none-any.whl /python-wheels/

# Install locally-built Python wheel dependencies
RUN pip install \
/python-wheels/sonic_platform_common-1.0-py2-none-any.whl



# Clean up
RUN apt-get clean -y; \
apt-get autoclean -y; \
apt-get autoremove -y
RUN rm -rf /debs ~/.cache

RUN mkdir -p /home/pde

COPY ["base_image_files/port_breakout.py", "/usr/local/bin/"]
COPY ["supervisord.conf", "/etc/supervisor/conf.d/"]
COPY ["docker_init.sh", "/usr/bin/"]
ENTRYPOINT ["/usr/bin/docker_init.sh"]
72 changes: 72 additions & 0 deletions dockers/docker-pde/Dockerfile.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
{% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %}
FROM docker-config-engine-stretch

ARG docker_container_name
ENV PYTHONPATH=/usr/share/sonic/platform

RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf

# Make apt-get non-interactive
ENV DEBIAN_FRONTEND=noninteractive

# Update apt's cache of available packages
RUN apt-get update && apt-get install -y ipmitool telnet busybox kmod

RUN pip install pytest pexpect

{% if docker_pde_debs.strip() -%}
# Copy locally-built Debian package dependencies
COPY \
{% for deb in docker_pde_debs.split(' ') -%}
debs/{{ deb }}{{' '}}
{%- endfor -%}
/debs/

# Install locally-built Debian packages and implicitly install their dependencies
RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }{%- for deb in docker_pde_debs.split(' ') %}; \
dpkg_apt /debs/{{ deb }}
{%- endfor %}
{%- endif %}

{% if docker_pde_pydebs.strip() -%}
# Copy locally-built Debian package dependencies
COPY \
{% for deb in docker_pde_pydebs.split(' ') -%}
python-debs/{{ deb }}{{' '}}
{%- endfor -%}
/debs/

# Install locally-built Debian packages and implicitly install their dependencies
{%- for deb in docker_pde_pydebs.split(' ') %}
RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /debs/{{ deb }}
{%- endfor %}
{%- endif %}

{% if docker_pde_whls.strip() -%}
# Copy locally-built Python wheel dependencies
COPY \
{% for whl in docker_pde_whls.split(' ') -%}
python-wheels/{{ whl }}{{' '}}
{%- endfor -%}
/python-wheels/

# Install locally-built Python wheel dependencies
RUN pip install \
{% for whl in docker_pde_whls.split(' ') -%}
/python-wheels/{{ whl }}{{' '}}
{%- endfor %}
{% endif %}


# Clean up
RUN apt-get clean -y; \
apt-get autoclean -y; \
apt-get autoremove -y
RUN rm -rf /debs ~/.cache

RUN mkdir -p /home/pde

COPY ["base_image_files/port_breakout.py", "/usr/local/bin/"]
COPY ["supervisord.conf", "/etc/supervisor/conf.d/"]
COPY ["docker_init.sh", "/usr/bin/"]
ENTRYPOINT ["/usr/bin/docker_init.sh"]
63 changes: 63 additions & 0 deletions dockers/docker-pde/base_image_files/pde-test-harness
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
#!/bin/bash

usage()
{
echo "usage: $0 <help/list/commands>"
exit 1
}

if [ $# -lt 1 ]
then
usage
fi

case $1 in
-h | help)
usage
;;
-l | ls | list)
docker exec -it -w /usr/local/sonic_pde_tests pde ls
exit 0
;;
*)
;;
esac

# Make sure only root can run our script
if [ "$(id -u)" != "0" ]; then
echo "This script must be run as root" 1>&2
exit 1
fi

# Stop swss/syncd service to ensure there is only 1 SAI instance at a time
systemctl stop swss

if [ $(grep -c 'platform:ro' $(which pde.sh)) -gt 0 ]; then
systemctl stop pde
sleep 1
docker rename pde pde.orig
sed -i 's#platform:ro#platform#g' $(which pde.sh)
sed -i 's#hwsku:ro#hwsku#g' $(which pde.sh)
systemctl start pde
fi

# Allow 5 seconds for the docker-pde to be online
err=1
for t in $(seq 5); do
if [ $(docker ps | grep -c pde) -gt 0 ]; then
err=0
break
fi
sleep 1
done
if [ ${err} -ne 0 ]; then
echo "docker-pde is not alive, existing ..."
exit 1
fi

# Now launch the PDE pytest
docker exec -it -w /usr/local/sonic_pde_tests pde pytest $*

# Restart the swss service
systemctl start swss

Loading

0 comments on commit 85689ed

Please sign in to comment.