Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion dockers/docker-database/base_image_files/redis-cli
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,10 @@ if [ -t 1 ] ; then
DOCKER_EXEC_FLAGS+="t"
fi

docker exec -$DOCKER_EXEC_FLAGS database redis-cli "$@"
[ "$1" -eq "$1" ] 2> /dev/null # check if the first argument is a number
if [ $? -eq 0 ]; then # if it's a number, set the database instance to operate on
DEV="$1"
shift
fi

docker exec -$DOCKER_EXEC_FLAGS database$DEV redis-cli "$@"
24 changes: 22 additions & 2 deletions dockers/docker-fpm-frr/bgpd.conf.default.j2
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,24 @@ route-map TO_BGP_PEER_V4 permit 100
!
route-map TO_BGP_PEER_V6 permit 100
!
{% if DEVICE_METADATA['localhost']['type'] == 'InternalFrontend' %}
route-map HIDE_INTERNAL permit 10
set community local-AS
!
{% endif %}
{% if DEVICE_METADATA['localhost']['type'] == 'InternalBackend' %}
route-map OVERRIDE_ORIGINATOR_ID permit 10
{% for (name, prefix) in LOOPBACK_INTERFACE|pfx_filter %}
{% if prefix | ipv4 and name == 'Loopback0' %}
set originator-id {{ prefix | ip }}
{% endif %}
{% endfor %}
!
{% endif %}
router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }}
{% if DEVICE_METADATA['localhost']['type'] == 'InternalFrontend' %}
redistribute connected route-map HIDE_INTERNAL
{% endif %}
bgp log-neighbor-changes
bgp bestpath as-path multipath-relax
no bgp default ipv4-unicast
Expand Down Expand Up @@ -64,6 +81,9 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }}
{% if bgp_session['asn'] | int != 0 %}
neighbor {{ neighbor_addr }} remote-as {{ bgp_session['asn'] }}
neighbor {{ neighbor_addr }} description {{ bgp_session['name'] }}
{% if DEVICE_METADATA['localhost']['type'] == 'InternalBackend' %}
neighbor {{ neighbor_addr }} route-map OVERRIDE_ORIGINATOR_ID in
{% endif %}
{# set the bgp neighbor timers if they have not default values #}
{% if (bgp_session['keepalive'] is defined and bgp_session['keepalive'] | int != 60)
or (bgp_session['holdtime'] is defined and bgp_session['holdtime'] | int != 180) %}
Expand All @@ -87,7 +107,7 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }}
neighbor {{ neighbor_addr }} route-reflector-client
{% endif %}
{% if bgp_session['nhopself'] | int != 0 %}
neighbor {{ neighbor_addr }} next-hop-self
neighbor {{ neighbor_addr }} next-hop-self all
{% endif %}
maximum-paths 64
exit-address-family
Expand All @@ -103,7 +123,7 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }}
neighbor {{ neighbor_addr }} route-reflector-client
{% endif %}
{% if bgp_session['nhopself'] | int != 0 %}
neighbor {{ neighbor_addr }} next-hop-self
neighbor {{ neighbor_addr }} next-hop-self all
{% endif %}
{% if bgp_session['asn'] != DEVICE_METADATA['localhost']['bgp_asn'] %}
neighbor {{ neighbor_addr }} route-map set-next-hop-global-v6 in
Expand Down
78 changes: 50 additions & 28 deletions files/build_templates/docker_image_ctl.j2
Original file line number Diff line number Diff line change
Expand Up @@ -56,11 +56,11 @@ function preStartAction()
WARM_DIR=/host/warmboot
if [[ ("$BOOT_TYPE" == "warm" || "$BOOT_TYPE" == "fastfast") && -f $WARM_DIR/dump.rdb ]]; then
# Load redis content from /host/warmboot/dump.rdb
docker cp $WARM_DIR/dump.rdb database:/var/lib/redis/dump.rdb
docker cp $WARM_DIR/dump.rdb database$DEV:/var/lib/redis/dump.rdb
else
# Create an emtpy file and overwrite any RDB if already there
echo -n > /tmp/dump.rdb
docker cp /tmp/dump.rdb database:/var/lib/redis/
docker cp /tmp/dump.rdb database$DEV:/var/lib/redis/
fi
{%- else %}
: # nothing
Expand All @@ -72,33 +72,39 @@ function postStartAction()
{%- if docker_container_name == "database" %}
# Wait until redis starts
REDIS_SOCK="/var/run/redis/redis.sock"
until [[ $(/usr/bin/docker exec database redis-cli -s $REDIS_SOCK ping | grep -c PONG) -gt 0 ]]; do
EXT_REDIS_SOCK="/var/run/redis$DEV/redis.sock" # location of redis socket in the base image
until [[ $(/usr/bin/redis-cli $DEV -s $REDIS_SOCK ping | grep -c PONG) -gt 0 ]]; do
sleep 1;
done
if [[ ("$BOOT_TYPE" == "warm" || "$BOOT_TYPE" == "fastfast") && -f $WARM_DIR/dump.rdb ]]; then
rm -f $WARM_DIR/dump.rdb
else
# If there is a config db dump file, load it
if [ -r /etc/sonic/config_db.json ]; then
sonic-cfggen -j /etc/sonic/config_db.json --write-to-db
if [ -r /etc/sonic/config_db$DEV.json ]; then
sonic-cfggen -j /etc/sonic/config_db$DEV.json --write-to-db --redis-unix-sock-file $EXT_REDIS_SOCK
fi

redis-cli -n 4 SET "CONFIG_DB_INITIALIZED" "1"
redis-cli $DEV -n 4 -s $REDIS_SOCK SET "CONFIG_DB_INITIALIZED" "1"
fi

if [[ -x /usr/bin/db_migrator.py ]]; then
# Migrate the DB to the latest schema version if needed
/usr/bin/db_migrator.py -o migrate
/usr/bin/db_migrator.py -o migrate -s $EXT_REDIS_SOCK

# Save in memory config_db to config_db.json for 2 reasons:
# 1. Persist the DB migration result.
# 2. Save in memory DB after warm reboot.
/usr/bin/config save -y
fi
{%- elif docker_container_name == "swss" %}
docker exec swss rm -f /ready # remove cruft
docker exec swss$DEV rm -f /ready # remove cruft
if [[ "$BOOT_TYPE" == "fast" ]] && [[ -d /host/fast-reboot ]]; then
test -e /host/fast-reboot/fdb.json && docker cp /host/fast-reboot/fdb.json swss:/
test -e /host/fast-reboot/arp.json && docker cp /host/fast-reboot/arp.json swss:/
test -e /host/fast-reboot/default_routes.json && docker cp /host/fast-reboot/default_routes.json swss:/
test -e /host/fast-reboot/fdb.json && docker cp /host/fast-reboot/fdb.json swss$DEV:/
test -e /host/fast-reboot/arp.json && docker cp /host/fast-reboot/arp.json swss$DEV:/
test -e /host/fast-reboot/default_routes.json && docker cp /host/fast-reboot/default_routes.json swss$DEV:/
rm -fr /host/fast-reboot
fi
docker exec swss touch /ready # signal swssconfig.sh to go
docker exec swss$DEV touch /ready # signal swssconfig.sh to go
{%- elif docker_container_name == "pmon" %}

DEVPATH="/usr/share/sonic/device"
Expand All @@ -111,7 +117,13 @@ function postStartAction()
fi
fi
{%- elif docker_container_name == "snmp" %}
docker exec -i database redis-cli -n 6 HSET 'DEVICE_METADATA|localhost' chassis_serial_number $(decode-syseeprom -s)
if [ -z "$(ip netns)" ]; then
{%- for i in range(6) %}
redis-cli {{i}} -n 6 HSET 'DEVICE_METADATA|localhost' chassis_serial_number $(decode-syseeprom -s)
{%- endfor %}
else
redis-cli -n 6 HSET 'DEVICE_METADATA|localhost' chassis_serial_number $(decode-syseeprom -s)
fi
{%- else %}
: # nothing
{%- endif %}
Expand All @@ -129,25 +141,26 @@ start() {
HWSKU=""
{%- else %}
# Obtain our HWSKU as we will mount directories with these names in each docker
HWSKU=`sonic-cfggen -d -v 'DEVICE_METADATA["localhost"]["hwsku"]'`
HOSTNAME=`sonic-cfggen -d -v 'DEVICE_METADATA["localhost"]["hostname"]'`
HWSKU=`sonic-cfggen -d -s /var/run/redis$DEV/redis.sock -v 'DEVICE_METADATA["localhost"]["hwsku"]'`
HOSTNAME=`sonic-cfggen -d -s /var/run/redis$DEV/redis.sock -v 'DEVICE_METADATA["localhost"]["hostname"]'`
{%- endif %}
if [ -z "$HOSTNAME" ] || ! [[ $HOSTNAME =~ ^[a-zA-Z0-9.\-]*$ ]]; then
HOSTNAME=`hostname`
fi

DOCKERCHECK=`docker inspect --type container {{docker_container_name}} 2>/dev/null`
if [ "$?" -eq "0" ]; then
{%- if docker_container_name == "database" %}

DOCKERCHECK=`docker inspect --type container {{docker_container_name}}$DEV 2>/dev/null`
if [ "$?" -eq "0" ]; then
{%- if docker_container_name == "database" %}
DOCKERMOUNT=""
{%- else %}
{%- else %}
DOCKERMOUNT=`getMountPoint "$DOCKERCHECK"`
{%- endif %}
if [ x"$DOCKERMOUNT" == x"$HWSKU" ]; then
{%- if docker_container_name == "database" %}
echo "Starting existing {{docker_container_name}} container"
{%- else %}
echo "Starting existing {{docker_container_name}} container with HWSKU $HWSKU"
{%- endif %}
if [ x"$DOCKERMOUNT" == x"$HWSKU" ]; then
{%- if docker_container_name == "database" %}
echo "Starting existing {{docker_container_name}}$DEV container"
{%- else %}
echo "Starting existing {{docker_container_name}}$DEV container with HWSKU $HWSKU"
{%- endif %}
preStartAction
docker start {{docker_container_name}}
Expand Down Expand Up @@ -189,7 +202,10 @@ start() {
--tmpfs /tmp \
{%- endif %}
{%- endif %}
-v /var/run/redis:/var/run/redis:rw \
{%- if docker_container_name == "bgp" %}
-v /etc/sonic/frr$DEV:/etc/frr:rw \
{%- endif %}
-v /var/run/redis$DEV:/var/run/redis:rw \
-v /usr/share/sonic/device/$PLATFORM:/usr/share/sonic/platform:ro \
{%- if docker_container_name != "database" %}
-v /usr/share/sonic/device/$PLATFORM/$HWSKU:/usr/share/sonic/hwsku:ro \
Expand All @@ -205,7 +221,7 @@ start() {
}

preStartAction
docker start {{docker_container_name}}
docker start {{docker_container_name}}$DEV
postStartAction
}

Expand All @@ -214,9 +230,15 @@ wait() {
}

stop() {
docker stop {{docker_container_name}}
docker stop {{docker_container_name}}$DEV
{%- if docker_container_name == "namespace" %}
ip netns delete "{{docker_container_name}}$DEV"
{%- endif %}
}

OP=$1 # operation to perform (start/wait/stop)
DEV=$2 # namespace/device number to operate on

case "$1" in
start|wait|stop|updateHostName)
cmd=$1
Expand Down
17 changes: 17 additions & 0 deletions files/build_templates/multi_instance/bgp@.service.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
[Unit]
Description=BGP container
#Requires=updategraph.service
#After=updategraph.service
After=database@%i.service
Requires=database@%i.service
Before=ntp-config.service
PartOf=namespace@%i.target

[Service]
User=root
ExecStartPre=/usr/bin/{{docker_container_name}}.sh start %i
ExecStart=/usr/bin/{{docker_container_name}}.sh wait %i
ExecStop=/usr/bin/{{docker_container_name}}.sh stop %i

[Install]
RequiredBy=namespace@%i.target
16 changes: 16 additions & 0 deletions files/build_templates/multi_instance/database@.service.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
[Unit]
Description=Database container
Requires=docker.service namespace@%i.service
After=docker.service namespace@%i.service
PartOf=namespace@%i.target

[Service]
User=root
ExecStartPre=/usr/bin/{{docker_container_name}}.sh start %i
ExecStart=/usr/bin/{{docker_container_name}}.sh wait %i
ExecStop=/usr/bin/{{docker_container_name}}.sh stop %i
Restart=on-failure
TimeoutStartSec=120

[Install]
RequiredBy=namespace@%i.target
28 changes: 28 additions & 0 deletions files/build_templates/multi_instance/swss@.service.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
[Unit]
Description=switch state service
Requires=database@%i.service
#updategraph.service
{% if sonic_asic_platform == 'broadcom' %}
Requires=opennsl-modules.service
{% elif sonic_asic_platform == 'nephos' %}
Requires=nps-modules-4.9.0-9-2-amd64.service
{% endif %}
After=database@%i.service
#updategraph.service
After=interfaces-config@%i.service
Before=ntp-config.service
PartOf=namespace@%i.target
StartLimitIntervalSec=1200
StartLimitBurst=3

[Service]
User=root
Environment=sonic_asic_platform={{ sonic_asic_platform }}
ExecStartPre=/usr/local/bin/swss.sh start %i
ExecStart=/usr/local/bin/swss.sh wait %i
ExecStop=/usr/local/bin/swss.sh stop %i
Restart=always
RestartSec=30

[Install]
RequiredBy=namespace@%i.target
32 changes: 32 additions & 0 deletions files/build_templates/multi_instance/syncd@.service.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
[Unit]
Description=syncd service
Requires=database@%i.service
#updategraph.service
{% if sonic_asic_platform == 'broadcom' %}
Requires=opennsl-modules.service
{% elif sonic_asic_platform == 'nephos' %}
Requires=nps-modules-4.9.0-8-2-amd64.service
{% endif %}
After=database.service
#updategraph.service
After=interfaces-config.service
{% if sonic_asic_platform == 'broadcom' %}
After=opennsl-modules.service
{% elif sonic_asic_platform == 'nephos' %}
After=nps-modules-4.9.0-8-2-amd64.service
{% endif %}
After=swss@%i.service
Before=ntp-config.service

[Service]
User=root
Environment=sonic_asic_platform={{ sonic_asic_platform }}
ExecStartPre=/usr/local/bin/syncd.sh start %i
ExecStart=/usr/local/bin/syncd.sh wait %i
ExecStop=/usr/local/bin/syncd.sh stop %i
{% if sonic_asic_platform == 'mellanox' %}
TimeoutStartSec=150
{% endif %}

[Install]
WantedBy=multi-user.target
18 changes: 18 additions & 0 deletions files/build_templates/multi_instance/teamd@.service.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
[Unit]
Description=TEAMD container
#Requires=updategraph.service
Requires=swss@%i.service
#After=updategraph.service
After=swss@%i.service
Before=ntp-config.service
PartOf=namespace@%i.target

[Service]
User=root
ExecStartPre=/usr/bin/{{docker_container_name}}.sh start %i
ExecStart=/usr/bin/{{docker_container_name}}.sh wait %i
ExecStop=/usr/bin/{{docker_container_name}}.sh stop %i

[Install]
WantedBy=swss@%i.service
RequiredBy=namespace@%i.target
21 changes: 21 additions & 0 deletions files/build_templates/sonic_debian_extension.j2
Original file line number Diff line number Diff line change
Expand Up @@ -170,10 +170,14 @@ echo "warmboot-finalizer.service" | sudo tee -a $GENERATED_SERVICE_FILE

# Copy rsyslog configuration files and templates
sudo cp $IMAGE_CONFIGS/rsyslog/rsyslog-config.service $FILESYSTEM_ROOT/etc/systemd/system/
sudo cp $IMAGE_CONFIGS/rsyslog/rsyslog-config@.service $FILESYSTEM_ROOT/etc/systemd/system/
sudo cp $IMAGE_CONFIGS/rsyslog/rsyslog@.service $FILESYSTEM_ROOT/etc/systemd/system
sudo cp $IMAGE_CONFIGS/rsyslog/rsyslog-config.sh $FILESYSTEM_ROOT/usr/bin/
sudo cp $IMAGE_CONFIGS/rsyslog/rsyslog.conf.j2 $FILESYSTEM_ROOT_USR_SHARE_SONIC_TEMPLATES/
sudo cp $IMAGE_CONFIGS/rsyslog/rsyslog.d/* $FILESYSTEM_ROOT/etc/rsyslog.d/
echo "rsyslog-config.service" | sudo tee -a $GENERATED_SERVICE_FILE
echo "rsyslog-config@.service" | sudo tee -a $GENERATED_SERVICE_FILE
echo "rsyslog@.service" | sudo tee -a $GENERATED_SERVICE_FILE

# Copy logrotate.d configuration files
sudo cp -f $IMAGE_CONFIGS/logrotate/logrotate.d/* $FILESYSTEM_ROOT/etc/logrotate.d/
Expand All @@ -182,9 +186,11 @@ sudo cp -f $IMAGE_CONFIGS/logrotate/logrotate.d/* $FILESYSTEM_ROOT/etc/logrotate
sudo cp -f $IMAGE_CONFIGS/systemd/journald.conf $FILESYSTEM_ROOT/etc/systemd/

# Copy interfaces configuration files and templates
sudo cp $IMAGE_CONFIGS/interfaces/interfaces-config@.service $FILESYSTEM_ROOT/etc/systemd/system/
sudo cp $IMAGE_CONFIGS/interfaces/interfaces-config.service $FILESYSTEM_ROOT/etc/systemd/system/
sudo cp $IMAGE_CONFIGS/interfaces/interfaces-config.sh $FILESYSTEM_ROOT/usr/bin/
sudo cp $IMAGE_CONFIGS/interfaces/*.j2 $FILESYSTEM_ROOT_USR_SHARE_SONIC_TEMPLATES/
echo "interfaces-config@.service" | sudo tee -a $GENERATED_SERVICE_FILE
echo "interfaces-config.service" | sudo tee -a $GENERATED_SERVICE_FILE

# Copy initial interfaces configuration file, will be overwritten on first boot
Expand Down Expand Up @@ -344,6 +350,13 @@ sudo LANG=C chroot $FILESYSTEM_ROOT umount -lf /sys
sudo LANG=C cp $SCRIPTS_DIR/swss.sh $FILESYSTEM_ROOT/usr/local/bin/swss.sh
sudo LANG=C cp $SCRIPTS_DIR/syncd.sh $FILESYSTEM_ROOT/usr/local/bin/syncd.sh

# Copy network namespace wrapper script
sudo LANG=C cp $SCRIPTS_DIR/namespace.sh $FILESYSTEM_ROOT/usr/local/bin/namespace

# Copy namespace target
sudo cp $IMAGE_CONFIGS/namespace/namespace@.target $FILESYSTEM_ROOT/etc/systemd/system/
echo "namespace@.target" | sudo tee -a $GENERATED_SERVICE_FILE

# Copy systemd timer configuration
# It implements delayed start of services
sudo cp $BUILD_TEMPLATES/snmp.timer $FILESYSTEM_ROOT/etc/systemd/system/
Expand Down Expand Up @@ -372,6 +385,14 @@ sudo chmod 755 $FILESYSTEM_ROOT/usr/bin/mlnx-fw-upgrade.sh
{% endif %}

{%- if SONIC_ROUTING_STACK == "frr" %}
{% for i in range(6) %}
sudo mkdir $FILESYSTEM_ROOT/etc/sonic/frr{{i}}
sudo touch $FILESYSTEM_ROOT/etc/sonic/frr{{i}}/frr.conf
sudo touch $FILESYSTEM_ROOT/etc/sonic/frr{{i}}/vtysh.conf
sudo chown -R $FRR_USER_UID:$FRR_USER_GID $FILESYSTEM_ROOT/etc/sonic/frr{{i}}
sudo chmod -R 640 $FILESYSTEM_ROOT/etc/sonic/frr{{i}}/
sudo chmod 750 $FILESYSTEM_ROOT/etc/sonic/frr{{i}}
{%- endfor %}
sudo mkdir $FILESYSTEM_ROOT/etc/sonic/frr
sudo touch $FILESYSTEM_ROOT/etc/sonic/frr/frr.conf
sudo touch $FILESYSTEM_ROOT/etc/sonic/frr/vtysh.conf
Expand Down
2 changes: 1 addition & 1 deletion files/image_config/interfaces/interfaces-config.service
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@ Type=oneshot
ExecStart=/usr/bin/interfaces-config.sh

[Install]
WantedBy=multi-user.target
RequiredBy=multi-user.target
Loading