[service] add warmboot finializer service (#2725)

After warm reboot is done, we need to disable warm reboot flag and
tear down anything setup for warm reboot and persisted across.

Signed-off-by: Ying Xie <ying.xie@microsoft.com>
This commit is contained in:
Ying Xie 2019-04-01 14:16:31 -07:00 committed by GitHub
parent 1b07437205
commit 681e34a2b1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 112 additions and 0 deletions

View File

@ -144,6 +144,11 @@ sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable ntp-config.service
sudo cp $IMAGE_CONFIGS/ntp/ntp-config.sh $FILESYSTEM_ROOT/usr/bin/
sudo cp $IMAGE_CONFIGS/ntp/ntp.conf.j2 $FILESYSTEM_ROOT_USR_SHARE_SONIC_TEMPLATES/
# Copy warmboot-finalizer files
sudo LANG=C cp $IMAGE_CONFIGS/warmboot-finalizer/finalize-warmboot.sh $FILESYSTEM_ROOT/usr/local/bin/finalize-warmboot.sh
sudo LANG=C cp $IMAGE_CONFIGS/warmboot-finalizer/warmboot-finalizer.service $FILESYSTEM_ROOT/etc/systemd/system/
sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable warmboot-finalizer.service
# Copy rsyslog configuration files and templates
sudo cp $IMAGE_CONFIGS/rsyslog/rsyslog-config.service $FILESYSTEM_ROOT/etc/systemd/system/
sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable rsyslog-config.service

View File

@ -0,0 +1,96 @@
#! /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
}
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
if [[ -n "${list}" ]]; then
debug "Some components didn't finish reconcile: ${list} ..."
fi
finalize_warm_boot

View File

@ -0,0 +1,11 @@
[Unit]
Description=Monitor warm recovery and disable warmboot when done
Requires=database.service
After=database.service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/finalize-warmboot.sh
[Install]
WantedBy=multi-user.target