[VOL-3603][SEBA-1000]: Support OLT image upgrade
- patchset on ONL source code (applied when ONL built in inband mode)
- scripts to support image upgrade procedure
- README to test the procedure.
- increased BAL READY TIME before enabling inband channel on BAL.
Change-Id: I069fc1309dd13d504af03552c1709a6b3ba42232
diff --git a/olt-sw-upgrade/install_onl.sh b/olt-sw-upgrade/install_onl.sh
new file mode 100755
index 0000000..69d9863
--- /dev/null
+++ b/olt-sw-upgrade/install_onl.sh
@@ -0,0 +1,554 @@
+#!/bin/bash
+
+#Copyright 2020-present Open Networking Foundation
+#
+#Licensed under the Apache License, Version 2.0 (the "License");
+#you may not use this file except in compliance with the License.
+#You may obtain a copy of the License at
+#
+#http://www.apache.org/licenses/LICENSE-2.0
+#
+#Unless required by applicable law or agreed to in writing, software
+#distributed under the License is distributed on an "AS IS" BASIS,
+#WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#See the License for the specific language governing permissions and
+#limitations under the License.
+
+### BEGIN INIT INFO
+# Description:
+# Upgrade the NOS from Active to Standby partition,
+# This script checks if installed ONL on OLT has active and standby partions
+# if yes, it extracts the ONL package and keep the
+# required files to the Standby partition and start the NOS from Standby partition.
+#
+### END INIT INFO
+
+
+WORKING_DIR=$(pwd)
+# Name of the script
+SCRIPT_NAME="$(basename ${0})"
+UPGRADE=
+ONL_FILE=${1}
+ONL_ROOT="/mnt/onl"
+ACTIVE_BOOTDIR="${ONL_ROOT}/active_boot/"
+STANDBY_BOOTDIR="${ONL_ROOT}/standby_boot/"
+
+# Partition labels
+ONL_ACTIVE_BOOT="ONL-ACTIVE-BOOT"
+ONL_ACTIVE_DATA="ONL-ACTIVE-DATA"
+ONL_STANDBY_BOOT="ONL-STANDBY-BOOT"
+ONL_STANDBY_DATA="ONL-STANDBY-DATA"
+ONL_CONFIG="ONL-CONFIG"
+ONL_IMAGES="ONL-IMAGES"
+
+# Mount paths
+CONFIG="${ONL_ROOT}/config"
+IMAGES="${ONL_ROOT}/images"
+ACTIVE_DATA="${ONL_ROOT}/active_data"
+ACTIVE_BOOT="${ONL_ROOT}/active_boot"
+STANDBY_DATA="${ONL_ROOT}/standby_data"
+STANDBY_BOOT="${ONL_ROOT}/standby_boot"
+GRUB="grub"
+ONL_SOURCE="onl_source"
+
+ACTIVE_DATA_DEV_NAME=
+ACTIVE_DATA_MNT_PATH=
+ACTIVE_BOOT_DEV_NAME=
+ACTIVE_BOOT_MNT_PATH=
+STANDBY_DATA_DEV_NAME=
+STANDBY_DATA_MNT_PATH=
+STANDBY_BOOT_DEV_NAME=
+STANDBY_BOOT_MNT_PATH=
+
+# Configuration file about upgrade
+IMAGES="${ONL_ROOT}/images"
+ACTIVE_GRUB_ENV_FILE="${ONL_ROOT}/active_boot/grub/grubenv"
+STANDBY_GRUB_ENV_FILE="${ONL_ROOT}/active_boot/grub/grubenv"
+GRUB_CONFIG_FILE="${ONL_ROOT}/config/grub.cfg"
+GRUB_CONFIG_FILE_CHANGED="${ONL_ROOT}/config/grub.cfg.changed"
+ASF_VOLT16_VOLTHA_BAL=$(ls /*asfvolt16*.tar.gz 2>/dev/null)
+BROADCOM="/broadcom"
+OPT="/opt/bcm68620"
+DEV_MGMT_DAEMON="dev_mgmt_daemon -d -pcie"
+OPENOLT="openolt"
+#------------------------------------------------------------------------------
+# Function : usage
+#
+# Description:
+# This function says how to use the script
+#
+# Globals:
+# SCRIPT_NAME
+#
+# Arguments:
+# None
+#
+# Returns:
+# None
+#------------------------------------------------------------------------------
+
+usage()
+{
+ echo "${SCRIPT_NAME}:usage:
+ ${SCRIPT_NAME} <ONL_IMAGE_WITH_ABSOLUTE_PATH>
+ "
+ exit 1
+}
+
+#------------------------------------------------------------------------------
+# Function Name: does_logger_exist
+# Description:
+# This function check if logger exist and executable.
+#
+# Globals:
+# None
+#
+# Arguments:
+# None
+#
+# Returns:
+# returns 0 if exist and executable else 1
+#------------------------------------------------------------------------------
+does_logger_exist()
+{
+cmd=/usr/bin/logger
+if [ -x ${cmd} ]; then
+ return 0
+ else
+ return 1
+ fi
+}
+
+#------------------------------------------------------------------------------
+# Function Name: info_message
+# Description:
+# This function print the info message information to the console
+#
+# Globals:
+# None
+#
+# Arguments:
+# string message
+#
+# Returns:
+# None
+#------------------------------------------------------------------------------
+info_message()
+{
+ echo "INFO: $1"
+ logger -p user.info "$1"
+}
+
+#------------------------------------------------------------------------------
+# Function Name: error_message
+# Description:
+# This function print the error message information to the console
+#
+# Globals:
+# None
+#
+# Arguments:
+# string message
+#
+# Returns:
+# returns 1
+#------------------------------------------------------------------------------
+error_message()
+{
+ echo "ERROR: $1"
+ logger -p user.err "$1"
+ return 1
+}
+
+#------------------------------------------------------------------------------
+# Function: clean_up
+#
+# Description:
+# This function delete the existing image in the standby boot partition.
+# In order to copy the the new image. also delete the onl source in the
+# working directory if it is there.
+#
+# Globals:
+# WORKING_DIR, ONL_SOURCE, STANDBY_BOOT_MNT_PATH, ACTIVE_DATA_MNT_PATh
+#
+# Arguments:
+# None
+#
+# Returns:
+# None
+#------------------------------------------------------------------------------
+clean_up()
+{
+ info_message "Deleting onl source"
+ rm -rf ${WORKING_DIR}/${ONL_SOURCE}
+ info_message "Deleting kernel and initrd files"
+ rm -rf ${STANDBY_BOOT_MNT_PATH}/kernel-*
+ rm -rf ${STANDBY_BOOT_MNT_PATH}/x86-64-accton-*
+ echo "INFO: Deleting configuration files"
+ rm -rf /etc/onl/*
+ rm -rf /lib/vendor-config/
+ info_message "Deleting standby rootfs"
+ rm -rf ${STANDBY_DATA_MNT_PATH}/*
+}
+
+#------------------------------------------------------------------------------
+# Function: update_grub_cfg_for_temp_reboot
+#
+# Description:
+# This function updates the grub.cfg file in order to achieve the temporary
+# reboot. by making standby entry in the temporary reboot. once temporary
+# reboot happens successfully grub.cfg file will have only active entry.
+#
+# Globals:
+# GRUB_CONFIG_FILE_CHANGED, ACTIVE_KERNEL_NAME, STANDBY_KERNEL_NAME
+#
+# Arguments:
+# None
+#
+# Returns:
+# None
+#------------------------------------------------------------------------------
+update_grub_cfg_for_temp_reboot()
+{
+ cat > ${GRUB_CONFIG_FILE_CHANGED} <<- EOF
+serial --port=0x3f8 --speed=115200 --word=8 --parity=no --stop=1
+terminal_input serial
+terminal_output serial
+set timeout=5
+
+# Always boot the saved_entry value
+load_env
+if [ \$saved_entry ] ; then
+ set default=\$saved_entry
+fi
+
+menuentry "Open Network Linux" {
+ search --no-floppy --label --set=root ONL-ACTIVE-BOOT
+ # Always return to this entry by default.
+ set saved_entry="0"
+ save_env saved_entry
+ echo 'Loading Open Network Linux ...'
+ insmod gzio
+ insmod part_msdos
+ linux /${ACTIVE_KERNEL_NAME} nopat console=ttyS0,115200n8 tg3.short_preamble=1 tg3.bcm5718s_reset=1 intel_iommu=off onl_platform=x86-64-accton-asxvolt16-r0 data-active
+ initrd /x86-64-accton-asxvolt16-r0.cpio.gz
+}
+
+menuentry "Open Network Linux Standby" {
+ search --no-floppy --label --set=root ONL-STANDBY-BOOT
+ # Always return to this entry by default.
+ set saved_entry="0"
+ save_env saved_entry
+ echo 'Loading Open Network Linux Standby...'
+ insmod gzio
+ insmod part_msdos
+ linux /${STANDBY_KERNEL_NAME} nopat console=ttyS0,115200n8 tg3.short_preamble=1 tg3.bcm5718s_reset=1 intel_iommu=off onl_platform=x86-64-accton-asxvolt16-r0 data-standby
+ initrd /x86-64-accton-asxvolt16-r0.cpio.gz
+}
+
+# Menu entry to chainload ONIE
+menuentry ONIE {
+ search --no-floppy --label --set=root ONIE-BOOT
+ set saved_entry="0"
+ save_env saved_entry
+ echo 'Loading ONIE ...'
+ chainloader +1
+}
+
+
+EOF
+}
+
+#------------------------------------------------------------------------------
+# Function: revert_grub_cfg
+#
+# Description:
+# This function revert the original grub.cfg file which was affected
+# by temporary reboot.
+#
+# Globals:
+# GRUB_CONFIG_FILE, ACTIVE_KERNEL_NAME
+#
+# Arguments:
+# None
+#
+# Returns:
+# None
+#------------------------------------------------------------------------------
+revert_grub_cfg()
+{
+ cat > ${GRUB_CONFIG_FILE} <<- EOF
+serial --port=0x3f8 --speed=115200 --word=8 --parity=no --stop=1
+terminal_input serial
+terminal_output serial
+set timeout=5
+
+# Always boot the saved_entry value
+load_env
+if [ \$saved_entry ] ; then
+ set default=\$saved_entry
+fi
+
+menuentry "Open Network Linux" {
+ search --no-floppy --label --set=root ONL-ACTIVE-BOOT
+ # Always return to this entry by default.
+ set saved_entry="0"
+ save_env saved_entry
+ echo 'Loading Open Network Linux ...'
+ insmod gzio
+ insmod part_msdos
+ linux /${ACTIVE_KERNEL_NAME} nopat console=ttyS0,115200n8 tg3.short_preamble=1 tg3.bcm5718s_reset=1 intel_iommu=off onl_platform=x86-64-accton-asxvolt16-r0 data-active
+ initrd /x86-64-accton-asxvolt16-r0.cpio.gz
+}
+
+menuentry "Open Network Linux Standby" {
+ search --no-floppy --label --set=root ONL-STANDBY-BOOT
+ # Always return to this entry by default.
+ set saved_entry="0"
+ save_env saved_entry
+ echo 'Loading Open Network Linux Standby...'
+ insmod gzio
+ insmod part_msdos
+ linux /${STANDBY_KERNEL_NAME} nopat console=ttyS0,115200n8 tg3.short_preamble=1 tg3.bcm5718s_reset=1 intel_iommu=off onl_platform=x86-64-accton-asxvolt16-r0 data-standby
+ initrd /x86-64-accton-asxvolt16-r0.cpio.gz
+}
+
+# Menu entry to chainload ONIE
+menuentry ONIE {
+ search --no-floppy --label --set=root ONIE-BOOT
+ set saved_entry="0"
+ save_env saved_entry
+ echo 'Loading ONIE ...'
+ chainloader +1
+}
+
+EOF
+}
+#------------------------------------------------------------------------------
+# Function: grub_reboot
+#
+# Description:
+# This function gives a temporary reboot using grub-reboot command, this will
+# set the boot menu entry from active default one to Standby. Now OS will
+# boot up in Standby mode.
+#
+# Globals:
+# ACTIVE_BOOTDIR, STANDBY_BOOTDIR, GRUB_CONFIG_FILE_CHANGED, ACTIVE_BOOT
+# GRUB
+#
+# Arguments:
+# None
+#
+# Returns:
+# None
+#------------------------------------------------------------------------------
+grub_reboot()
+{
+ if [ -f "${ACTIVE_BOOTDIR}/grub/grubenv" ]; then
+ saved_entry=$(grub-editenv ${ACTIVE_BOOTDIR}/grub/grubenv list | sed -n 's/^saved_entry=//p')
+ if [ ${saved_entry} -eq 0 ]; then
+ grub-editenv ${ACTIVE_BOOTDIR}/grub/grubenv set saved_entry=1
+ sed -i '/next_entry=/a\prev_saved_entry=1' ${ACTIVE_BOOTDIR}/grub/grubenv
+ fi
+ fi
+
+ if [ -f "${STANDBY_BOOTDIR}/grub/grubenv" ]; then
+ saved_entry=$(grub-editenv ${STANDBY_BOOTDIR}/grub/grubenv list | sed -n 's/^saved_entry=//p')
+ if [ ${saved_entry} -eq 0 ]; then
+ grub-editenv ${STANDBY_BOOTDIR}/grub/grubenv set saved_entry=1
+ sed -i '/next_entry=/a\prev_saved_entry=1' ${STANDBY_BOOTDIR}/grub/grubenv
+ fi
+ fi
+
+ if [ -f ${GRUB_CONFIG_FILE_CHANGED} ]; then
+ if [ -f "${ACTIVE_BOOT}/${GRUB}/grub.cfg" ]; then
+ cp ${GRUB_CONFIG_FILE_CHANGED} ${ACTIVE_BOOT}/${GRUB}/grub.cfg
+ fi
+ if [ -f "${STANDBY_BOOT}/${GRUB}/grub.cfg" ]; then
+ cp ${GRUB_CONFIG_FILE_CHANGED} ${STANDBY_BOOT}/${GRUB}/grub.cfg
+ fi
+ fi
+ grub-reboot --boot-directory=${ACTIVE_BOOTDIR} 1
+ reboot
+}
+
+#------------------------------------------------------------------------------
+# Function: install_onl
+#
+# Description:
+# This function copy the upgrade image.
+#
+# Globals:
+# WORKING_DIR, ONL_SOURCE, STANDBY_BOOT_MNT_PATH, IMAGES, ACTIVE_BOOT_MNT_PATH
+#
+# Arguments:
+# None
+#
+# Returns:
+# None
+#------------------------------------------------------------------------------
+install_onl()
+{
+ if [ -f ${ONL_FILE} ]; then
+ clean_up
+ mkdir ${WORKING_DIR}/${ONL_SOURCE}
+ cd ${WORKING_DIR}/${ONL_SOURCE}
+ chmod 777 ${ONL_FILE}
+ # Extract onl package
+ unzip ${ONL_FILE}
+ # Copy kernel files to standby boot partition
+ cp kernel-* ${STANDBY_BOOT_MNT_PATH}/
+ # Copy initrd file to standby boot partition
+ cp onl-loader-initrd-amd64.cpio.gz ${STANDBY_BOOT_MNT_PATH}/x86-64-accton-asxvolt16-r0.cpio.gz
+ # Create upgrade directory in the images partition to copy upgrade image
+ if [ -d ${IMAGES}/upgrade ]; then
+ rm -rf ${IMAGES}/upgrade
+ fi
+ info_message "Creating Upgrade Directory"
+ mkdir ${IMAGES}/upgrade
+ info_message "Copying SWI file to Upgrade Directory"
+ cp *.swi ${IMAGES}/upgrade
+
+ # Update the kernel version
+ STANDBY_KERNEL_NAME=$(ls ${STANDBY_BOOT_MNT_PATH} | grep kernel-4.14)
+ ACTIVE_KERNEL_NAME=$(ls ${ACTIVE_BOOT_MNT_PATH} | grep kernel-4.14 )
+ update_grub_cfg_for_temp_reboot
+ revert_grub_cfg
+ else
+ error_message "ONL file not found"
+ exit 1
+ fi
+}
+
+#------------------------------------------------------------------------------
+# Function: upgrade_onl
+#
+# Description:
+# This function get the labels, and install the upgrade NOS.
+#
+# Globals :
+# ACTIVE_DATA_DEV_NAME, ACTIVE_BOOT_DEV_NAME, ACTIVE_BOOT_MNT_PATH,
+# STANDBY_DATA_DEV_NAME, STANDBY_BOOT_MNT_PATH
+#
+# Arguments:
+# None
+#
+# Returns:
+# None
+#------------------------------------------------------------------------------
+upgrade_onl()
+{
+
+ ACTIVE_DATA_DEV_NAME=$(blkid | grep " LABEL=\"ONL-ACTIVE-DATA\"" | awk '{print $1}' | sed 's/://')
+ echo "active data dev - $ACTIVE_DATA_DEV_NAME"
+ ACTIVE_DATA_MNT_PATH=$(mount | grep $ACTIVE_DATA_DEV_NAME | awk '{print $3}')
+ echo $"active data mnt - $ACTIVE_DATA_MNT_PATH"
+ ACTIVE_BOOT_DEV_NAME=$(blkid | grep " LABEL=\"ONL-ACTIVE-BOOT\"" | awk '{print $1}' | sed 's/://')
+ echo "active boot dev $ACTIVE_BOOT_DEV_NAME"
+ ACTIVE_BOOT_MNT_PATH=$(mount | grep $ACTIVE_BOOT_DEV_NAME | awk '{print $3}')
+ echo "active boot mnt - $ACTIVE_BOOT_MNT_PATH"
+ STANDBY_DATA_DEV_NAME=$(blkid | grep " LABEL=\"ONL-STANDBY-DATA\"" | awk '{print $1}' | sed 's/://')
+ echo "standby data dev - $STANDBY_DATA_DEV_NAME"
+ STANDBY_DATA_MNT_PATH=$(mount | grep $STANDBY_DATA_DEV_NAME | awk '{print $3}')
+ echo "standby data mnt - $STANDBY_DATA_MNT_PATH"
+ STANDBY_BOOT_DEV_NAME=$(blkid | grep " LABEL=\"ONL-STANDBY-BOOT\"" | awk '{print $1}' | sed 's/://')
+ echo "standby boot dev - $STANDBY_BOOT_DEV_NAME"
+ STANDBY_BOOT_MNT_PATH=$(mount | grep $STANDBY_BOOT_DEV_NAME | awk '{print $3}')
+ echo "standby boot mnt -$STANDBY_BOOT_MNT_PATH"
+
+ install_onl
+ grub_reboot
+}
+
+#------------------------------------------------------------------------------
+# Function: command_result
+#
+# Description:
+# This function executes the blkid command.
+#
+# Globals:
+# None
+# Arguments:
+# None
+#
+# Returns:
+# None
+#------------------------------------------------------------------------------
+command_result(){
+ blkid | grep $1 > /dev/null
+ if [ $? -eq 0 ]; then
+ return 0
+ else
+ return 1
+ fi
+}
+
+#------------------------------------------------------------------------------
+# Function: is_onl_running
+#
+# Description:
+# This function check the running NOS and also check the Upgrade is required
+# or not.
+#
+# Globals:
+# ONL_ACTIVE_BOOT, ONL_ACTIVE_DATA, ONL_STANDBY_BOOT, ONL_STANDBY_DATA
+# ONL_CONFIG, ONL_IMAGES, IMAGES, ACTIVE_DATA, ACTIVE_BOOT, STANDBY_DATA
+# STANDBY_BOOT
+#
+# Arguments:
+# None
+#
+# Returns:
+# None
+#------------------------------------------------------------------------------
+is_onl_running()
+{
+ info_message "Check all directories exist or not"
+ if command_result "$ONL_ACTIVE_BOOT" && command_result "$ONL_ACTIVE_DATA" && command_result "$ONL_STANDBY_BOOT" && command_result "$ONL_STANDBY_DATA" && command_result "$ONL_CONFIG" && command_result "$ONL_IMAGES" ; then
+ if [ \( -d "$CONFIG" -a -d "$IMAGES" \) -a \( -d "$ACTIVE_DATA" -a -d "$ACTIVE_BOOT" \) -a \( -d "$STANDBY_DATA" -a -d "$STANDBY_BOOT" \) ]; then
+ info_message "All directories exist. Need Upgrade"
+ UPGRADE=1
+ fi
+ else
+ info_message "It is new installation"
+ UPGRADE=0
+ fi
+}
+
+#------------------------------------------------------------------------------
+# Function: main
+#
+# Description:
+# This is the main function. which decides fresh installation is required or
+# upgrade is required.
+#
+# Globals :
+# UPGRADE, ONL_FILE
+# Arguments :
+# None
+#
+# Returns :
+# None
+#------------------------------------------------------------------------------
+main()
+{
+ echo "INFO: Check if image upgrade or new installation"
+ is_onl_running
+ if [ $UPGRADE -eq 0 ]; then
+ error_message "ONL does not have active and stand by partitions \
+ install ONL image with active and standby partitions"
+ exit 1
+ else
+ info_message "Upgrade started"
+ upgrade_onl
+ fi
+}
+
+# main function call
+does_logger_exist
+if [ $? -eq 0 ]; then
+ main
+else
+ error_message "logger does not exist"
+ exit 1
+fi