[supervisor] Install vanilla package once again, install Python 3 version in Buster container (#5546)

**- Why I did it**

We were building a custom version of Supervisor because I had added patches to prevent hangs and crashes if the system clock ever rolled backward. Those changes were merged into the upstream Supervisor repo as of version 3.4.0 (http://supervisord.org/changes.html#id9), therefore, we should be able to simply install the vanilla package via pip. This will also allow us to easily move to Python 3, as Python 3 support was added in version 4.0.0.

**- How I did it**

- Remove Makefiles and patches for building supervisor package from source
- Install Python 3 supervisor package version 4.2.1 in Buster base container
    - Also install Python 3 version of supervisord-dependent-startup in Buster base container
- Debian package installed binary in `/usr/bin/`, but pip package installs in `/usr/local/bin/`, so rather than update all absolute paths, I changed all references to simply call `supervisord` and let the system PATH find the executable to prevent future need for changes just in case we ever need to switch back to build a Debian package, then we won't need to modify these again.
- Install Python 2 supervisor package >= 3.4.0 in Stretch and Jessie base containers
This commit is contained in:
Joe LeVeque 2020-11-19 23:41:32 -08:00 committed by GitHub
parent 2f2b7c2a5c
commit 7bf05f7f4f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
94 changed files with 114 additions and 497 deletions

View File

@ -1,6 +1,7 @@
{
"skip_ledd": true,
"skip_xcvrd": true,
"skip_pcied": true,
"skip_psud": true,
"skip_syseepromd": true,
"skip_thermalctld": true

View File

@ -50,9 +50,6 @@ RUN apt-get update && \
python3-pip \
rsyslog \
vim-tiny \
# Install dependencies of supervisor
python-pkg-resources \
python-meld3 \
# Install dependencies of redis-tools
libatomic1 \
libjemalloc2 \
@ -67,9 +64,6 @@ RUN apt-get update && \
# ip and ifconfig utility missing in docker for arm arch
iproute2 \
net-tools \
# for arm arch: Installing j2cli dependency package MarkupSafe from source relies on weeksetuptools and wheel
python-setuptools \
python-wheel \
# for processing/handling json files in bash environment
jq \
# for sairedis zmq rpc channel
@ -90,9 +84,22 @@ RUN dpkg -i redis-tools_6.0.6-1~bpo10+1_amd64.deb || apt-get install -f -y
RUN rm redis-tools_6.0.6-1~bpo10+1_amd64.deb
{% endif %}
# Some Python packages require setuptools (or pkg_resources, which is supplied by setuptools)
# and some require wheel
RUN pip install setuptools==40.8.0
RUN pip3 install setuptools==49.6.00
RUN pip install wheel
RUN pip3 install wheel
# For templating
RUN pip2 install j2cli
# Install supervisor
RUN pip3 install supervisor==4.2.1
# Add support for supervisord to handle startup dependencies
RUN pip3 install supervisord-dependent-startup==1.4.0
RUN mkdir -p /etc/supervisor /var/log/supervisor
RUN apt-get -y purge \
@ -109,9 +116,6 @@ RUN apt-get -y purge \
{{ install_debian_packages(docker_base_buster_debs.split(' ')) }}
{%- endif %}
# Add support for supervisord to handle startup dependencies
RUN pip2 install supervisord-dependent-startup==1.4.0
# Clean up apt
# Remove /var/lib/apt/lists/*, could be obsoleted for derived images
RUN apt-get clean -y && \

View File

@ -47,9 +47,8 @@ RUN apt-get update && \
python \
python-pip \
vim-tiny \
# Install dependencies of supervisor
python-pkg-resources \
python-meld3 \
# Install redis-tools
redis-tools=5:5.0.3-3~bpo9+2 \
# common dependencies
libpython2.7 \
libdaemon0 \
@ -58,9 +57,6 @@ RUN apt-get update && \
# ip and ifconfig utility missing in docker for arm arch
iproute2 \
net-tools \
# for arm arch: Installing j2cli dependency package MarkupSafe from source relies on weeksetuptools and wheel
python-setuptools \
python-wheel \
# for processing json files in bash environment
jq \
# for sairedis zmq rpc channel
@ -85,9 +81,20 @@ RUN apt-get -y -t stretch-backports install rsyslog
RUN rm redis-tools_6.0.6-1~bpo10+1_amd64.deb
{% endif %}
# Some Python packages require setuptools (or pkg_resources, which is supplied by setuptools)
# and some require wheel
RUN pip install setuptools==40.8.0
RUN pip install wheel
# For templating
RUN pip install j2cli
# Install supervisor
RUN pip install supervisor>=3.4.0
# Add support for supervisord to handle startup dependencies
RUN pip install supervisord-dependent-startup==1.4.0
RUN mkdir -p /etc/supervisor /var/log/supervisor
RUN apt-get -y purge \
@ -104,9 +111,6 @@ RUN apt-get -y purge \
{{ install_debian_packages(docker_base_stretch_debs.split(' ')) }}
{%- endif %}
# Add support for supervisord to handle startup dependencies
RUN pip install supervisord-dependent-startup==1.4.0
# Clean up apt
# Remove /var/lib/apt/lists/*, could be obsoleted for derived images
RUN apt-get clean -y && \

View File

@ -44,6 +44,7 @@ RUN apt-get -y install \
vim-tiny \
perl \
python \
python-pip \
rsyslog \
less
@ -51,8 +52,13 @@ COPY ["etc/rsyslog.conf", "/etc/rsyslog.conf"]
COPY ["etc/rsyslog.d/*", "/etc/rsyslog.d/"]
COPY ["root/.vimrc", "/root/.vimrc"]
# Install dependencies of supervisor
RUN apt-get -y install python-pkg-resources python-meld3
# Some Python packages require setuptools (or pkg_resources, which is supplied by setuptools)
# and some require wheel
RUN pip install setuptools==40.8.0
RUN pip install wheel
# Install supervisor
RUN pip install supervisor>=3.4.0
RUN mkdir -p /etc/supervisor
RUN mkdir -p /var/log/supervisor

View File

@ -19,4 +19,4 @@ RUN mv /deps/basic_router /usr/sbin/basic_router
COPY ["start.sh", "/usr/bin/"]
COPY ["supervisord.conf", "/etc/supervisor/conf.d/"]
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -55,7 +55,7 @@ if [[ $DATABASE_TYPE == "chassisdb" ]]; then
# generate all redis server supervisord configuration file
sonic-cfggen -j $db_cfg_file_tmp -t /usr/share/sonic/templates/supervisord.conf.j2 > /etc/supervisor/conf.d/supervisord.conf
rm $db_cfg_file_tmp
exec /usr/bin/supervisord
exec supervisord
exit 0
fi
@ -79,4 +79,4 @@ else
fi
rm $db_cfg_file_tmp
exec /usr/bin/supervisord
exec supervisord

View File

@ -4,7 +4,7 @@ logfile_backups=2
nodaemon=true
[eventlistener:dependent-startup]
command=python -m supervisord_dependent_startup
command=python3 -m supervisord_dependent_startup
autostart=true
autorestart=unexpected
startretries=0

View File

@ -21,4 +21,4 @@ chmod +x /usr/bin/wait_for_intf.sh
# The docker container should start this script as PID 1, so now that supervisord is
# properly configured, we exec supervisord so that it runs as PID 1 for the
# duration of the container's lifetime
exec /usr/bin/supervisord
exec supervisord

View File

@ -66,4 +66,4 @@ chmod 0755 /usr/sbin/bgp-unisolate
mkdir -p /var/sonic
echo "# Config files managed by sonic-config-engine" > /var/sonic/config_status
exec /usr/bin/supervisord
exec supervisord

View File

@ -4,7 +4,7 @@ logfile_backups=2
nodaemon=true
[eventlistener:dependent-startup]
command=python -m supervisord_dependent_startup
command=python3 -m supervisord_dependent_startup
autostart=true
autorestart=unexpected
startretries=0

View File

@ -27,4 +27,4 @@ COPY ["daemons", "/etc/quagga/"]
COPY ["files/supervisor-proc-exit-listener", "/usr/bin"]
COPY ["critical_processes", "/etc/supervisor"]
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -36,4 +36,4 @@ COPY ["*.j2", "/usr/share/sonic/templates/"]
COPY ["files/supervisor-proc-exit-listener", "/usr/bin"]
COPY ["critical_processes", "/etc/supervisor"]
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -31,4 +31,4 @@ RUN apt-get clean -y && \
apt-get autoremove -y && \
rm -rf /debs
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -4,7 +4,7 @@ logfile_backups=2
nodaemon=true
[eventlistener:dependent-startup]
command=python -m supervisord_dependent_startup
command=python3 -m supervisord_dependent_startup
autostart=true
autorestart=unexpected
startretries=0

View File

@ -2,4 +2,4 @@
#Generate supervisord.conf based on device metadata
mkdir -p /etc/supervisor/conf.d/
sonic-cfggen -d -t /usr/share/sonic/templates/supervisord.conf.j2 > /etc/supervisor/conf.d/supervisord.conf
exec /usr/bin/supervisord
exec supervisord

View File

@ -4,7 +4,7 @@ logfile_backups=2
nodaemon=true
[eventlistener:dependent-startup]
command=python -m supervisord_dependent_startup
command=python3 -m supervisord_dependent_startup
autostart=true
autorestart=unexpected
startretries=0

View File

@ -35,5 +35,4 @@ COPY ["critical_processes", "/etc/supervisor"]
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
RUN rm -rf /debs
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -4,7 +4,7 @@ logfile_backups=2
nodaemon=true
[eventlistener:dependent-startup]
command=python -m supervisord_dependent_startup
command=python3 -m supervisord_dependent_startup
autostart=true
autorestart=unexpected
startretries=0

View File

@ -25,4 +25,4 @@ if [ "$VLAN" != "" ]; then
cp /usr/share/sonic/templates/ndppd.conf /etc/supervisor/conf.d/
fi
exec /usr/bin/supervisord
exec supervisord

View File

@ -4,7 +4,7 @@ logfile_backups=2
nodaemon=true
[eventlistener:dependent-startup]
command=python -m supervisord_dependent_startup
command=python3 -m supervisord_dependent_startup
autostart=true
autorestart=unexpected
startretries=0

View File

@ -4,7 +4,7 @@ logfile_backups=2
nodaemon=true
[eventlistener:dependent-startup]
command=python -m supervisord_dependent_startup
command=python3 -m supervisord_dependent_startup
autostart=true
autorestart=unexpected
startretries=0

View File

@ -40,4 +40,4 @@ if [ $HAVE_FANCONTROL_CONF -eq 1 ]; then
/bin/cp -f $FANCONTROL_CONF_FILE /etc/
fi
exec /usr/bin/supervisord
exec supervisord

View File

@ -14,4 +14,4 @@ sonic-cfggen $CFGGEN_PARAMS
chmod +x /usr/bin/wait_for_link.sh
exec /usr/bin/supervisord
exec supervisord

View File

@ -4,7 +4,7 @@ logfile_backups=2
nodaemon=true
[eventlistener:dependent-startup]
command=python -m supervisord_dependent_startup
command=python3 -m supervisord_dependent_startup
autostart=true
autorestart=unexpected
startretries=0

View File

@ -32,4 +32,4 @@ COPY ["files/supervisor-proc-exit-listener", "/usr/bin"]
COPY ["critical_processes", "/etc/supervisor"]
COPY ["port_index_mapper.py", "/usr/bin"]
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -4,7 +4,7 @@ logfile_backups=2
nodaemon=true
[eventlistener:dependent-startup]
command=python -m supervisord_dependent_startup
command=python3 -m supervisord_dependent_startup
autostart=true
autorestart=unexpected
startretries=0

View File

@ -76,4 +76,4 @@ COPY ["critical_processes", "/etc/supervisor"]
# Although exposing ports is not needed for host net mode, keep it for possible bridge mode
EXPOSE 161/udp 162/udp
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -4,7 +4,7 @@ logfile_backups=2
nodaemon=true
[eventlistener:dependent-startup]
command=python -m supervisord_dependent_startup
command=python3 -m supervisord_dependent_startup
autostart=true
autorestart=unexpected
startretries=0

View File

@ -36,4 +36,4 @@ RUN apt-get remove -y g++ python-dev
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
RUN rm -rf /debs
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -4,7 +4,7 @@ logfile_backups=2
nodaemon=true
[eventlistener:dependent-startup]
command=python -m supervisord_dependent_startup
command=python3 -m supervisord_dependent_startup
autostart=true
autorestart=unexpected
startretries=0

View File

@ -25,4 +25,4 @@ COPY ["supervisord.conf", "/etc/supervisor/conf.d/"]
COPY ["files/supervisor-proc-exit-listener", "/usr/bin"]
COPY ["critical_processes", "/etc/supervisor"]
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -4,7 +4,7 @@ logfile_backups=2
nodaemon=true
[eventlistener:dependent-startup]
command=python -m supervisord_dependent_startup
command=python3 -m supervisord_dependent_startup
autostart=true
autorestart=unexpected
startretries=0

View File

@ -28,4 +28,4 @@ COPY ["supervisord.conf", "/etc/supervisor/conf.d/"]
COPY ["files/supervisor-proc-exit-listener", "/usr/bin"]
COPY ["critical_processes", "/etc/supervisor"]
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -4,7 +4,7 @@ logfile_backups=2
nodaemon=true
[eventlistener:dependent-startup]
command=python -m supervisord_dependent_startup
command=python3 -m supervisord_dependent_startup
autostart=true
autorestart=unexpected
startretries=0

View File

@ -27,4 +27,4 @@ COPY ["supervisord.conf", "/etc/supervisor/conf.d/"]
COPY ["files/supervisor-proc-exit-listener", "/usr/bin"]
COPY ["critical_processes", "/etc/supervisor"]
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -4,7 +4,7 @@ logfile_backups=2
nodaemon=true
[eventlistener:dependent-startup]
command=python -m supervisord_dependent_startup
command=python3 -m supervisord_dependent_startup
autostart=true
autorestart=unexpected
startretries=0

View File

@ -1,4 +1,4 @@
#!/usr/bin/env python
#!/usr/bin/env python3
import getopt
import os
@ -7,7 +7,6 @@ import sys
import syslog
import swsssdk
from supervisor import childutils
# Each line of this file should specify either one critical process or one
@ -27,7 +26,7 @@ def get_critical_group_and_process_list():
critical_process_list = []
with open(CRITICAL_PROCESSES_FILE, 'r') as file:
for line in file:
for line in file:
line_info = line.strip(' \n').split(':')
if len(line_info) != 2:
syslog.syslog(syslog.LOG_ERR, "Syntax of the line {} in critical_processes file is incorrect. Exiting...".format(line))
@ -86,7 +85,7 @@ def main(argv):
syslog.syslog(syslog.LOG_ERR, "Unable to retrieve features table from Config DB. Exiting...")
sys.exit(2)
if not features_table.has_key(container_name):
if container_name not in features_table:
syslog.syslog(syslog.LOG_ERR, "Unable to retrieve feature '{}'. Exiting...".format(container_name))
sys.exit(3)

View File

@ -34,5 +34,4 @@ COPY ["profile.ini", "portmap.ini", "/etc/sai/"]
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
RUN rm -rf /deps
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -49,5 +49,4 @@ RUN apt-get update \
COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"]
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -36,5 +36,4 @@ COPY ["critical_processes", "/etc/supervisor/"]
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
RUN rm -rf /debs
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -4,7 +4,7 @@ logfile_backups=2
nodaemon=true
[eventlistener:dependent-startup]
command=python -m supervisord_dependent_startup
command=python3 -m supervisord_dependent_startup
autostart=true
autorestart=unexpected
startretries=0

View File

@ -33,4 +33,4 @@ COPY ["supervisord.conf", "/etc/supervisor/conf.d/"]
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
RUN rm -rf /debs
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -48,4 +48,4 @@ RUN apt-get update \
COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"]
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -32,4 +32,4 @@ COPY ["critical_processes", "/etc/supervisor/"]
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
RUN rm -rf /debs
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -4,7 +4,7 @@ logfile_backups=2
nodaemon=true
[eventlistener:dependent-startup]
command=python -m supervisord_dependent_startup
command=python3 -m supervisord_dependent_startup
autostart=true
autorestart=unexpected
startretries=0

View File

@ -27,4 +27,4 @@ COPY ["portmap.ini", "profile.ini", "/etc/sai/"]
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
RUN rm -rf deps
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -48,4 +48,4 @@ RUN apt-get update \
COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"]
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -32,4 +32,4 @@ COPY ["profile.ini", "/etc/ssw/AS7512/"]
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
RUN rm -rf /debs
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -48,4 +48,4 @@ RUN apt-get update \
COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"]
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -34,4 +34,4 @@ COPY ["critical_processes", "/etc/supervisor/"]
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
RUN rm -rf /debs
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -4,7 +4,7 @@ logfile_backups=2
nodaemon=true
[eventlistener:dependent-startup]
command=python -m supervisord_dependent_startup
command=python3 -m supervisord_dependent_startup
autostart=true
autorestart=unexpected
startretries=0

View File

@ -48,4 +48,4 @@ RUN apt-get update \
COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"]
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -30,4 +30,4 @@ COPY ["critical_processes", "/etc/supervisor/"]
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
RUN rm -rf /debs
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -4,7 +4,7 @@ logfile_backups=2
nodaemon=true
[eventlistener:dependent-startup]
command=python -m supervisord_dependent_startup
command=python3 -m supervisord_dependent_startup
autostart=true
autorestart=unexpected
startretries=0

View File

@ -50,4 +50,4 @@ RUN apt-get update \
COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"]
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -30,4 +30,4 @@ COPY ["supervisord.conf", "/etc/supervisor/conf.d/"]
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
RUN rm -rf /debs
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -4,7 +4,7 @@ logfile_backups=2
nodaemon=true
[eventlistener:dependent-startup]
command=python -m supervisord_dependent_startup
command=python3 -m supervisord_dependent_startup
autostart=true
autorestart=unexpected
startretries=0

View File

@ -48,4 +48,4 @@ RUN apt-get update \
COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"]
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -34,4 +34,4 @@ COPY ["critical_processes", "/etc/supervisor/"]
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
RUN rm -rf /debs
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -4,7 +4,7 @@ logfile_backups=2
nodaemon=true
[eventlistener:dependent-startup]
command=python -m supervisord_dependent_startup
command=python3 -m supervisord_dependent_startup
autostart=true
autorestart=unexpected
startretries=0

View File

@ -48,4 +48,4 @@ RUN apt-get update \
COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"]
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -34,4 +34,4 @@ COPY ["critical_processes", "/etc/supervisor/"]
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
RUN rm -rf /debs
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -4,7 +4,7 @@ logfile_backups=2
nodaemon=true
[eventlistener:dependent-startup]
command=python -m supervisord_dependent_startup
command=python3 -m supervisord_dependent_startup
autostart=true
autorestart=unexpected
startretries=0

View File

@ -48,4 +48,4 @@ RUN apt-get update \
COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"]
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -30,5 +30,4 @@ COPY ["critical_processes", "/etc/supervisor/"]
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
RUN rm -rf /debs
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -4,7 +4,7 @@ logfile_backups=2
nodaemon=true
[eventlistener:dependent-startup]
command=python -m supervisord_dependent_startup
command=python3 -m supervisord_dependent_startup
autostart=true
autorestart=unexpected
startretries=0

View File

@ -44,4 +44,4 @@ COPY ["sai_2700.xml", "/usr/share/"]
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
RUN rm -rf /debs
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -62,4 +62,4 @@ RUN apt-get clean -y && \
apt-get autoremove -y && \
rm -rf /debs
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -39,4 +39,4 @@ COPY ["supervisord.conf", "/etc/supervisor/conf.d/"]
COPY ["files/supervisor-proc-exit-listener", "/usr/bin"]
COPY ["critical_processes", "/etc/supervisor/"]
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -4,7 +4,7 @@ logfile_backups=2
nodaemon=true
[eventlistener:dependent-startup]
command=python -m supervisord_dependent_startup
command=python3 -m supervisord_dependent_startup
autostart=true
autorestart=unexpected
startretries=0

View File

@ -48,4 +48,4 @@ RUN apt-get update \
COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"]
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -43,4 +43,4 @@ COPY ["critical_processes", "/etc/supervisor/"]
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
RUN rm -rf /debs
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -4,7 +4,7 @@ logfile_backups=2
nodaemon=true
[eventlistener:dependent-startup]
command=python -m supervisord_dependent_startup
command=python3 -m supervisord_dependent_startup
autostart=true
autorestart=unexpected
startretries=0

View File

@ -31,4 +31,4 @@ COPY ["critical_processes", "/etc/supervisor/"]
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
RUN rm -rf /debs
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -4,7 +4,7 @@ logfile_backups=2
nodaemon=true
[eventlistener:dependent-startup]
command=python -m supervisord_dependent_startup
command=python3 -m supervisord_dependent_startup
autostart=true
autorestart=unexpected
startretries=0

View File

@ -170,4 +170,4 @@ RUN mkdir -p /var/warmboot/teamd
ENV PLATFORM=x86_64-kvm_x86_64-r0
ENV HWSKU=Force10-S6000
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -31,4 +31,4 @@ COPY ["critical_processes", "/etc/supervisor/"]
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
RUN rm -rf /debs
ENTRYPOINT ["/usr/bin/supervisord"]
ENTRYPOINT ["supervisord"]

View File

@ -4,7 +4,7 @@ logfile_backups=2
nodaemon=true
[eventlistener:dependent-startup]
command=python -m supervisord_dependent_startup
command=python3 -m supervisord_dependent_startup
autostart=true
autorestart=unexpected
startretries=0

View File

@ -3,7 +3,6 @@
DOCKER_BASE_BUSTER = docker-base-buster.gz
$(DOCKER_BASE_BUSTER)_PATH = $(DOCKERS_PATH)/docker-base-buster
$(DOCKER_BASE_BUSTER)_DEPENDS += $(SUPERVISOR)
$(DOCKER_BASE_BUSTER)_DEPENDS += $(SOCAT)
GDB = gdb

View File

@ -2,7 +2,6 @@
DOCKER_BASE_STRETCH = docker-base-stretch.gz
$(DOCKER_BASE_STRETCH)_PATH = $(DOCKERS_PATH)/docker-base-stretch
$(DOCKER_BASE_STRETCH)_DEPENDS += $(SUPERVISOR)
$(DOCKER_BASE_STRETCH)_DEPENDS += $(SOCAT)
GDB = gdb

View File

@ -2,7 +2,6 @@
DOCKER_BASE = docker-base.gz
$(DOCKER_BASE)_PATH = $(DOCKERS_PATH)/docker-base
$(DOCKER_BASE)_DEPENDS += $(SUPERVISOR)
$(DOCKER_BASE)_DEPENDS += $(BASH)
$(DOCKER_BASE)_DEPENDS += $(SOCAT)

View File

@ -1,10 +0,0 @@
SPATH := $($(SUPERVISOR)_SRC_PATH)
DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/supervisor.mk rules/supervisor.dep
DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST)
DEP_FILES += $(shell git ls-files $(SPATH))
$(SUPERVISOR)_CACHE_MODE := GIT_CONTENT_SHA
$(SUPERVISOR)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST)
$(SUPERVISOR)_DEP_FILES := $(DEP_FILES)

View File

@ -1,9 +0,0 @@
# supervisor package
SUPERVISOR_VERSION = 3.3.3
export SUPERVISOR_VERSION
SUPERVISOR = python-supervisor_$(SUPERVISOR_VERSION)-1_all.deb
$(SUPERVISOR)_SRC_PATH = $(SRC_PATH)/supervisor
SONIC_MAKE_DEBS += $(SUPERVISOR)

View File

@ -382,9 +382,6 @@ RUN pip3 install "lxml==4.6.1"
# For sonic-platform-common testing
RUN pip3 install redis
# For supervisor build
RUN apt-get install python-meld3
# For vs image build
RUN pip2 install pexpect==4.6.0
RUN pip3 install pexpect==4.8.0

View File

@ -300,9 +300,6 @@ RUN pip install --force-reinstall --upgrade "jinja2>=2.10"
# For templating (requiring jinja2)
RUN pip install j2cli==0.3.10
# For supervisor build
RUN pip install meld3 mock
# For vs image build
RUN pip install pexpect==4.6.0

View File

@ -365,9 +365,6 @@ RUN pip3 install "lxml==4.6.1"
# For sonic-platform-common testing
RUN pip3 install redis
# For supervisor build
RUN pip2 install meld3 mock
# For vs image build
RUN pip2 install pexpect==4.6.0

View File

@ -4,7 +4,7 @@ logfile_backups=2
nodaemon=true
[eventlistener:dependent-startup]
command=python -m supervisord_dependent_startup
command=python3 -m supervisord_dependent_startup
autostart=true
autorestart=unexpected
startretries=0

View File

@ -4,7 +4,7 @@ logfile_backups=2
nodaemon=true
[eventlistener:dependent-startup]
command=python -m supervisord_dependent_startup
command=python3 -m supervisord_dependent_startup
autostart=true
autorestart=unexpected
startretries=0

View File

@ -1,4 +0,0 @@
*
!.gitignore
!Makefile
!patch/

View File

@ -1,33 +0,0 @@
.ONESHELL:
SHELL = /bin/bash
.SHELLFLAGS += -e
MAIN_TARGET = python-supervisor_$(SUPERVISOR_VERSION)-1_all.deb
$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :
# Remove any stale files
rm -rf ./supervisor
# Clone supervisor repo
git clone https://github.com/Supervisor/supervisor.git
pushd ./supervisor
# Reset HEAD to the commit of the proper tag
# NOTE: Using "git checkout <tag_name>" here detaches our HEAD,
# which stg doesn't like, so we use this method instead
git reset --hard $(SUPERVISOR_VERSION)
# Apply patches
stg init
stg import -s ../patch/series
ifneq (,$(filter $(CONFIGURED_ARCH), armhf arm64))
stg import -s ../patch/series-armhf
endif
# Build Python and Debian package
python setup.py --command-packages=stdeb.command bdist_deb
popd
# Move the newly-built .deb packages to the destination directory
mv ./supervisor/deb_dist/$* $(DEST)/

View File

@ -1,304 +0,0 @@
From 5b56519e68e866662d9fd9a6681b6b47d6b5fcdb Mon Sep 17 00:00:00 2001
From: Joe LeVeque <jolevequ@microsoft.com>
Date: Thu, 28 Feb 2019 01:43:54 +0000
Subject: [PATCH] Prevent excessive hanging and crashes if system clock rolls
backward
---
supervisor/process.py | 36 ++++++
supervisor/tests/test_process.py | 183 +++++++++++++++++++++++++++++++
2 files changed, 219 insertions(+)
diff --git a/supervisor/process.py b/supervisor/process.py
index f9ddcd9..5f73e6b 100644
--- a/supervisor/process.py
+++ b/supervisor/process.py
@@ -347,6 +347,28 @@ class Subprocess:
options.write(2, "supervisor: child process was not spawned\n")
options._exit(127) # exit process with code for spawn failure
+ def _check_and_adjust_for_system_clock_rollback(self, test_time):
+ """
+ Check if system clock has rolled backward beyond test_time. If so, set
+ affected timestamps to test_time.
+ """
+ if self.state == ProcessStates.STARTING:
+ if test_time < self.laststart:
+ self.laststart = test_time;
+ if self.delay > 0 and test_time < (self.delay - self.config.startsecs):
+ self.delay = test_time + self.config.startsecs
+ elif self.state == ProcessStates.RUNNING:
+ if test_time > self.laststart and test_time < (self.laststart + self.config.startsecs):
+ self.laststart = test_time - self.config.startsecs
+ elif self.state == ProcessStates.STOPPING:
+ if test_time < self.laststopreport:
+ self.laststopreport = test_time;
+ if self.delay > 0 and test_time < (self.delay - self.config.stopwaitsecs):
+ self.delay = test_time + self.config.stopwaitsecs
+ elif self.state == ProcessStates.BACKOFF:
+ if self.delay > 0 and test_time < (self.delay - self.backoff):
+ self.delay = test_time + self.backoff
+
def stop(self):
""" Administrative stop """
self.administrative_stop = True
@@ -357,6 +379,9 @@ class Subprocess:
""" Log a 'waiting for x to stop' message with throttling. """
if self.state == ProcessStates.STOPPING:
now = time.time()
+
+ self._check_and_adjust_for_system_clock_rollback(now)
+
if now > (self.laststopreport + 2): # every 2 seconds
self.config.options.logger.info(
'waiting for %s to stop' % self.config.name)
@@ -487,6 +512,9 @@ class Subprocess:
es, msg = decode_wait_status(sts)
now = time.time()
+
+ self._check_and_adjust_for_system_clock_rollback(now)
+
self.laststop = now
processname = self.config.name
@@ -586,6 +614,8 @@ class Subprocess:
now = time.time()
state = self.state
+ self._check_and_adjust_for_system_clock_rollback(now)
+
logger = self.config.options.logger
if self.config.options.mood > SupervisorStates.RESTARTING:
@@ -805,6 +835,12 @@ class EventListenerPool(ProcessGroupBase):
if dispatch_capable:
if self.dispatch_throttle:
now = time.time()
+
+ if now < self.last_dispatch:
+ # The system clock appears to have moved backward
+ # Reset self.last_dispatch accordingly
+ self.last_dispatch = now;
+
if now - self.last_dispatch < self.dispatch_throttle:
return
self.dispatch()
diff --git a/supervisor/tests/test_process.py b/supervisor/tests/test_process.py
index 7f9bab2..6808f60 100644
--- a/supervisor/tests/test_process.py
+++ b/supervisor/tests/test_process.py
@@ -736,6 +736,40 @@ class SubprocessTests(unittest.TestCase):
instance.stop_report()
self.assertEqual(len(options.logger.data), 1) # throttled
+ def test_stop_report_laststopreport_in_future(self):
+ future_time = time.time() + 3600 # 1 hour into the future
+ options = DummyOptions()
+ config = DummyPConfig(options, 'test', '/test')
+ instance = self._makeOne(config)
+ instance.pid = 11
+ dispatcher = DummyDispatcher(writable=True)
+ instance.dispatchers = {'foo':dispatcher}
+ from supervisor.states import ProcessStates
+ instance.state = ProcessStates.STOPPING
+ instance.laststopreport = future_time
+
+ # This iteration of stop_report() should reset instance.laststopreport
+ # to the current time
+ instance.stop_report()
+
+ # No logging should have taken place
+ self.assertEqual(len(options.logger.data), 0)
+
+ # Ensure instance.laststopreport has rolled backward
+ self.assertTrue(instance.laststopreport < future_time)
+
+ # Sleep for 2 seconds
+ time.sleep(2)
+
+ # This iteration of stop_report() should actaully trigger the report
+ instance.stop_report()
+
+ self.assertEqual(len(options.logger.data), 1)
+ self.assertEqual(options.logger.data[0], 'waiting for test to stop')
+ self.assertNotEqual(instance.laststopreport, 0)
+ instance.stop_report()
+ self.assertEqual(len(options.logger.data), 1) # throttled
+
def test_give_up(self):
options = DummyOptions()
config = DummyPConfig(options, 'test', '/test')
@@ -1105,6 +1139,43 @@ class SubprocessTests(unittest.TestCase):
self.assertEqual(event.__class__, events.ProcessStateBackoffEvent)
self.assertEqual(event.from_state, ProcessStates.STARTING)
+ # This tests the case where the process has stayed alive longer than
+ # startsecs (i.e., long enough to enter the RUNNING state), however the
+ # system clock has since rolled backward such that the current time is
+ # greater than laststart but less than startsecs.
+ def test_finish_running_state_exited_too_quickly_due_to_clock_rollback(self):
+ options = DummyOptions()
+ config = DummyPConfig(options, 'notthere', '/notthere',
+ stdout_logfile='/tmp/foo', startsecs=10)
+ instance = self._makeOne(config)
+ instance.config.options.pidhistory[123] = instance
+ pipes = {'stdout':'','stderr':''}
+ instance.pipes = pipes
+ instance.config.exitcodes =[-1]
+ instance.laststart = time.time()
+ from supervisor.states import ProcessStates
+ from supervisor import events
+ instance.state = ProcessStates.RUNNING
+ L = []
+ events.subscribe(events.ProcessStateEvent, lambda x: L.append(x))
+ instance.pid = 123
+ instance.finish(123, 1)
+ self.assertFalse(instance.killing)
+ self.assertEqual(instance.pid, 0)
+ self.assertEqual(options.parent_pipes_closed, pipes)
+ self.assertEqual(instance.pipes, {})
+ self.assertEqual(instance.dispatchers, {})
+ self.assertEqual(options.logger.data[0],
+ 'exited: notthere (terminated by SIGHUP; expected)')
+ self.assertEqual(instance.exitstatus, -1)
+ self.assertEqual(len(L), 1)
+ event = L[0]
+ self.assertEqual(event.__class__,
+ events.ProcessStateExitedEvent)
+ self.assertEqual(event.expected, True)
+ self.assertEqual(event.extra_values, [('expected', True), ('pid', 123)])
+ self.assertEqual(event.from_state, ProcessStates.RUNNING)
+
def test_finish_running_state_laststart_in_future(self):
options = DummyOptions()
config = DummyPConfig(options, 'notthere', '/notthere',
@@ -1402,6 +1473,92 @@ class SubprocessTests(unittest.TestCase):
event = L[0]
self.assertEqual(event.__class__, events.ProcessStateRunningEvent)
+ def test_transition_starting_to_running_laststart_in_future(self):
+ from supervisor import events
+ L = []
+ events.subscribe(events.ProcessStateEvent, lambda x: L.append(x))
+ from supervisor.states import ProcessStates
+
+ future_time = time.time() + 3600 # 1 hour into the future
+ options = DummyOptions()
+ test_startsecs = 2
+
+ # this should go from STARTING to RUNNING via transition()
+ pconfig = DummyPConfig(options, 'process', 'process','/bin/process',
+ startsecs=test_startsecs)
+ process = self._makeOne(pconfig)
+ process.backoff = 1
+ process.delay = 1
+ process.system_stop = False
+ process.laststart = future_time
+ process.pid = 1
+ process.stdout_buffer = 'abc'
+ process.stderr_buffer = 'def'
+ process.state = ProcessStates.STARTING
+
+ # This iteration of transition() should reset process.laststart
+ # to the current time
+ process.transition()
+
+ # Process state should still be STARTING
+ self.assertEqual(process.state, ProcessStates.STARTING)
+
+ # Ensure process.laststart has rolled backward
+ self.assertTrue(process.laststart < future_time)
+
+ # Sleep for (startsecs + 1)
+ time.sleep(test_startsecs + 1)
+
+ # This iteration of transition() should actaully trigger the state
+ # transition to RUNNING
+ process.transition()
+
+ # this implies RUNNING
+ self.assertEqual(process.backoff, 0)
+ self.assertEqual(process.delay, 0)
+ self.assertFalse(process.system_stop)
+ self.assertEqual(process.state, ProcessStates.RUNNING)
+ self.assertEqual(options.logger.data[0],
+ 'success: process entered RUNNING state, process has '
+ 'stayed up for > than {} seconds (startsecs)'.format(test_startsecs))
+ self.assertEqual(len(L), 1)
+ event = L[0]
+ self.assertEqual(event.__class__, events.ProcessStateRunningEvent)
+
+ def test_transition_backoff_to_starting_delay_in_future(self):
+ from supervisor import events
+ L = []
+ events.subscribe(events.ProcessStateEvent, lambda x: L.append(x))
+ from supervisor.states import ProcessStates, SupervisorStates
+
+ future_time = time.time() + 3600 # 1 hour into the future
+ options = DummyOptions()
+
+ pconfig = DummyPConfig(options, 'process', 'process','/bin/process')
+ process = self._makeOne(pconfig)
+ process.laststart = 1
+ process.delay = future_time
+ process.backoff = 0
+ process.state = ProcessStates.BACKOFF
+
+ # This iteration of transition() should reset process.delay
+ # to the current time
+ process.transition()
+
+ # Process state should still be BACKOFF
+ self.assertEqual(process.state, ProcessStates.BACKOFF)
+
+ # Ensure process.delay has rolled backward
+ self.assertTrue(process.delay < future_time)
+
+ # This iteration of transition() should actaully trigger the state
+ # transition to STARTING
+ process.transition()
+
+ self.assertEqual(process.state, ProcessStates.STARTING)
+ self.assertEqual(len(L), 1)
+ self.assertEqual(L[0].__class__, events.ProcessStateStartingEvent)
+
def test_transition_backoff_to_fatal(self):
from supervisor import events
L = []
@@ -2033,6 +2190,32 @@ class EventListenerPoolTests(ProcessGroupBaseTests):
self.assertEqual(process1.listener_state, EventListenerStates.BUSY)
self.assertEqual(process1.event, event)
+ def test_transition_event_proc_running_with_dispatch_throttle_last_dispatch_in_future(self):
+ future_time = time.time() + 3600 # 1 hour into the future
+ options = DummyOptions()
+ from supervisor.states import ProcessStates
+ pconfig1 = DummyPConfig(options, 'process1', 'process1','/bin/process1')
+ process1 = DummyProcess(pconfig1, state=ProcessStates.RUNNING)
+ gconfig = DummyPGroupConfig(options, pconfigs=[pconfig1])
+ pool = self._makeOne(gconfig)
+ pool.dispatch_throttle = 5
+ pool.last_dispatch = future_time
+ pool.processes = {'process1': process1}
+ event = DummyEvent()
+ from supervisor.states import EventListenerStates
+ process1.listener_state = EventListenerStates.READY
+ class DummyGroup:
+ config = gconfig
+ process1.group = DummyGroup
+ pool._acceptEvent(event)
+ pool.transition()
+
+ self.assertEqual(process1.transitioned, True)
+ self.assertEqual(pool.event_buffer, [event]) # not popped
+
+ # Ensure pool.last_dispatch has been rolled backward
+ self.assertTrue(pool.last_dispatch < future_time)
+
def test__dispatchEvent_notready(self):
options = DummyOptions()
from supervisor.states import ProcessStates
--
2.17.1

View File

@ -1,16 +0,0 @@
diff --git a/supervisor/tests/test_options.py b/supervisor/tests/test_options.py
--- a/supervisor/tests/test_options.py
+++ b/supervisor/tests/test_options.py
@@ -1514,9 +1514,9 @@
os.read(innie, 0) # we can read it while its open
os.write(outie, 'foo') # we can write to it while its open
instance.close_fd(innie)
- self.assertRaises(OSError, os.read, innie, 0)
+ #self.assertRaises(OSError, os.read, innie, 0)
instance.close_fd(outie)
- self.assertRaises(OSError, os.write, outie, 'foo')
+ #self.assertRaises(OSError, os.write, outie, 'foo')
@patch('os.close', Mock(side_effect=OSError))
def test_close_fd_ignores_oserror(self):

View File

@ -1,2 +0,0 @@
# This series applies on GIT commit 34b690aea8cf7572d73765c95c54a83261d69aad
0001-Prevent-excessive-hanging-and-crashes-if-system-cloc.patch

View File

@ -1,2 +0,0 @@
# This series applies on GIT commit 34b690aea8cf7572d73765c95c54a83261d69aad
0002-oserror-armhf-assert.patch