#!/bin/bash
#
# Copyright (c) 2018-2021 NVIDIA CORPORATION & AFFILIATES.
# Apache-2.0
#
# 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.
#

FFB_SUCCESS=0
FFB_FAILURE=1

# Check if ISSU is enabled on this device
check_issu_enabled()
{
    CHECK_RESULT="${FFB_FAILURE}"
    ISSU_CHECK_CMD="show platform mlnx issu"

    # Check whether show ISSU status outputs ENABLED
    if [[ `$ISSU_CHECK_CMD` =~ "enabled" ]]; then
        # ISSU enabled, return success
        CHECK_RESULT="${FFB_SUCCESS}"
    fi

    return "${CHECK_RESULT}"
}

# Check if ISSU upgrade from current SDK to next image SDK is supported
check_sdk_upgrade()
{
    CHECK_RESULT="${FFB_FAILURE}"

    NEXT_SONIC_IMAGE="$(sonic-installer list | grep "Next: " | cut -f2 -d' ')"
    CURRENT_SONIC_IMAGE="$(sonic-installer list | grep "Current: " | cut -f2 -d' ')"

    FS_PATH="/host/image-${NEXT_SONIC_IMAGE#SONiC-OS-}/fs.squashfs"
    FS_MOUNTPOINT="/tmp/image-${NEXT_SONIC_IMAGE#SONiC-OS-}-fs"

    if [[ "${CURRENT_SONIC_IMAGE}" == "${NEXT_SONIC_IMAGE}" ]]; then
        return "${FFB_SUCCESS}"
    fi

    while :; do
        mkdir -p "${FS_MOUNTPOINT}"
        mount -t squashfs "${FS_PATH}" "${FS_MOUNTPOINT}" || {
            >&2 echo "Failed to mount next SONiC image"
            break
        }

        ISSU_VERSION_FILE_PATH="/etc/mlnx/issu-version"

        [ -f "${ISSU_VERSION_FILE_PATH}" ] || {
            >&2 echo "No ISSU version file found ${ISSU_VERSION_FILE_PATH}"
            break
        }

        [ -f "${FS_MOUNTPOINT}/${ISSU_VERSION_FILE_PATH}" ] || {
            >&2 echo "No ISSU version file found ${ISSU_VERSION_FILE_PATH} in ${NEXT_SONIC_IMAGE}"
            break
        }

        CURRENT_ISSU_VERSION="$(cat ${ISSU_VERSION_FILE_PATH})"
        NEXT_ISSU_VERSION="$(cat ${FS_MOUNTPOINT}/${ISSU_VERSION_FILE_PATH})"

        if [[ "${CURRENT_ISSU_VERSION}" == "${NEXT_ISSU_VERSION}" ]]; then
            CHECK_RESULT="${FFB_SUCCESS}"
        else
            >&2 echo "Current and next ISSU version do not match:"
            >&2 echo "Current ISSU version: ${CURRENT_ISSU_VERSION}"
            >&2 echo "Next ISSU version: ${NEXT_ISSU_VERSION}"
        fi

        break
    done

    umount -rf "${FS_MOUNTPOINT}" 2> /dev/null || true
    rm -rf "${FS_MOUNTPOINT}" 2> /dev/null || true

    return "${CHECK_RESULT}"
}

check_ffb()
{
    check_issu_enabled || {
        >&2 echo "ISSU is not enabled on this HWSKU"
        return "${FFB_FAILURE}"
    }

    check_sdk_upgrade || {
        >&2 echo "SDK upgrade check failued"
        return "${FFB_FAILURE}"
    }

    return "${FFB_SUCCESS}"
}

