sonic-buildimage/files/image_config/warmboot-finalizer/finalize-warmboot.sh
Ying Xie 6483bf48f6
[warmboot finalizer] load dhcpv6 copp rules when missing (#9048)
Why I did it
Need to enable DHCPv6 COPP rules.

How I did it
Load the separate DHCPv6 COPP rules after warm reboot if the rules are missing.

How to verify it
Warm reboot from an image doesn't have DHCPv6 COPP rules installed.
Warm reboot from an image have DHCPv6 COPP rules already installed.
In either case, the script did the right thing and only install the COPP rules if it is missing.

Signed-off-by: Ying Xie ying.xie@microsoft.com
2021-10-25 08:05:55 -07:00

124 lines
2.4 KiB
Bash
Executable File

#! /bin/bash
VERBOSE=no
# Check components
COMP_LIST="orchagent neighsyncd bgp"
EXP_STATE="reconciled"
ASSISTANT_SCRIPT="/usr/bin/neighbor_advertiser"
function debug()
{
/usr/bin/logger "WARMBOOT_FINALIZER : $1"
if [[ x"${VERBOSE}" == x"yes" ]]; then
echo `date` "- $1"
fi
}
function check_warm_boot()
{
WARM_BOOT=`/usr/bin/redis-cli -n 6 hget "WARM_RESTART_ENABLE_TABLE|system" enable`
}
function wait_for_database_service()
{
debug "Wait for database to become ready..."
# Wait for redis server start before database clean
until [[ $(/usr/bin/docker exec database redis-cli ping | grep -c PONG) -gt 0 ]];
do sleep 1;
done
# Wait for configDB initialization
until [[ $(/usr/bin/docker exec database redis-cli -n 4 GET "CONFIG_DB_INITIALIZED") ]];
do sleep 1;
done
debug "Database is ready..."
}
function get_component_state()
{
/usr/bin/redis-cli -n 6 hget "WARM_RESTART_TABLE|$1" state
}
function check_list()
{
RET_LIST=''
for comp in $@; do
state=`get_component_state ${comp}`
if [[ x"${state}" != x"${EXP_STATE}" ]]; then
RET_LIST="${RET_LIST} ${comp}"
fi
done
echo ${RET_LIST}
}
function finalize_warm_boot()
{
debug "Finalizing warmboot..."
sudo config warm_restart disable
}
function stop_control_plane_assistant()
{
if [[ -x ${ASSISTANT_SCRIPT} ]]; then
debug "Tearing down control plane assistant ..."
${ASSISTANT_SCRIPT} -m reset
fi
}
function load_dhcpv6_copp_rules()
{
KEY="COPP_TABLE:trap.group.dhcpv6"
RULE=$(redis-cli -n 0 keys "${KEY}")
if [[ -n "${RULE}" ]]; then
debug "${KEY} already exist, skip reloading..."
else
debug "${KEY} not found, reloading..."
docker exec -t swss swssconfig /etc/swss/config.d/01-copp-dhcpv6.config.json
fi
}
wait_for_database_service
check_warm_boot
if [[ x"${WARM_BOOT}" != x"true" ]]; then
debug "warmboot is not enabled ..."
exit 0
fi
list=${COMP_LIST}
# Wait up to 5 minutes
for i in `seq 60`; do
list=`check_list ${list}`
if [[ -z "${list}" ]]; then
break
fi
sleep 5
done
stop_control_plane_assistant
# Save DB after stopped control plane assistant to avoid extra entries
debug "Save in-memory database after warm reboot ..."
config save -y
if [[ -n "${list}" ]]; then
debug "Some components didn't finish reconcile: ${list} ..."
fi
load_dhcpv6_copp_rules
finalize_warm_boot