#!/bin/bash
#
# lib/etcd3
#
# Functions to control the installation and configuration of etcd 3.x
# that provides a key-value store (and possibly other functions).

# Dependencies:
#
# - ``functions`` file

# ``stack.sh`` calls the entry points in this order:
#
# - start_etcd3
# - stop_etcd3
# - cleanup_etcd3

# Save trace setting
_XTRACE_ETCD3=$(set +o | grep xtrace)
set +o xtrace


# Defaults
# --------

# Set up default values for etcd
ETCD_DATA_DIR="$DATA_DIR/etcd"
ETCD_SYSTEMD_SERVICE="devstack@etcd.service"
ETCD_BIN_DIR="$DEST/bin"
# Option below will mount ETCD_DATA_DIR as ramdisk, which is useful to run
# etcd-heavy services in the gate VM's, e.g. Kubernetes.
ETCD_USE_RAMDISK=$(trueorfalse True ETCD_USE_RAMDISK)
ETCD_RAMDISK_MB=${ETCD_RAMDISK_MB:-512}

if is_ubuntu ; then
    UBUNTU_RELEASE_BASE_NUM=`lsb_release -r | awk '{print $2}' | cut -d '.' -f 1`
fi

# start_etcd3() - Starts to run the etcd process
function start_etcd3 {
    local cmd="$ETCD_BIN_DIR/etcd"
    cmd+=" --name $HOSTNAME --data-dir $ETCD_DATA_DIR"
    cmd+=" --initial-cluster-state new --initial-cluster-token etcd-cluster-01"
    cmd+=" --initial-cluster $HOSTNAME=http://$SERVICE_HOST:$ETCD_PEER_PORT"
    cmd+=" --initial-advertise-peer-urls http://$SERVICE_HOST:$ETCD_PEER_PORT"
    cmd+=" --advertise-client-urls http://$SERVICE_HOST:$ETCD_PORT"
    if [ "$SERVICE_LISTEN_ADDRESS" == "::" ]; then
        cmd+=" --listen-peer-urls http://[::]:$ETCD_PEER_PORT "
    else
        cmd+=" --listen-peer-urls http://0.0.0.0:$ETCD_PEER_PORT "
    fi
    cmd+=" --listen-client-urls http://$SERVICE_HOST:$ETCD_PORT"
    if [ "$ENABLE_DEBUG_LOG_LEVEL" == "True" ]; then
        cmd+=" --log-level=debug"
    fi

    local unitfile="$SYSTEMD_DIR/$ETCD_SYSTEMD_SERVICE"
    write_user_unit_file $ETCD_SYSTEMD_SERVICE "$cmd" "" "root"

    iniset -sudo $unitfile "Unit" "After" "network.target"
    iniset -sudo $unitfile "Service" "Type" "notify"
    iniset -sudo $unitfile "Service" "Restart" "on-failure"
    iniset -sudo $unitfile "Service" "LimitNOFILE" "65536"
    if is_arch "aarch64"; then
        iniset -sudo $unitfile "Service" "Environment" "ETCD_UNSUPPORTED_ARCH=arm64"
    fi

    $SYSTEMCTL daemon-reload
    $SYSTEMCTL enable $ETCD_SYSTEMD_SERVICE
    $SYSTEMCTL start $ETCD_SYSTEMD_SERVICE
}

# stop_etcd3() stops the etcd3 process
function stop_etcd3 {
    # Don't install in sub nodes (multinode scenario)
    if [ "$SERVICE_HOST" != "$HOST_IP" ]; then
        return
    fi

    $SYSTEMCTL stop $ETCD_SYSTEMD_SERVICE
}

function cleanup_etcd3 {
    # Don't install in sub nodes (multinode scenario)
    if [ "$SERVICE_HOST" != "$HOST_IP" ]; then
        return
    fi

    $SYSTEMCTL disable $ETCD_SYSTEMD_SERVICE

    local unitfile="$SYSTEMD_DIR/$ETCD_SYSTEMD_SERVICE"
    sudo rm -f $unitfile

    $SYSTEMCTL daemon-reload

    if [[ "$ETCD_USE_RAMDISK" == "True" ]]; then
        sudo umount $ETCD_DATA_DIR
    fi
    sudo rm -rf $ETCD_DATA_DIR
}

function install_etcd3 {
    echo "Installing etcd"

    # Create the necessary directories
    sudo mkdir -p $ETCD_BIN_DIR
    sudo mkdir -p $ETCD_DATA_DIR
    if [[ "$ETCD_USE_RAMDISK" == "True" ]]; then
        sudo mount -t tmpfs -o nodev,nosuid,size=${ETCD_RAMDISK_MB}M tmpfs $ETCD_DATA_DIR
    fi

    # Download and cache the etcd tgz for subsequent use
    local etcd_file
    etcd_file="$(get_extra_file $ETCD_DOWNLOAD_LOCATION)"
    if [ ! -f "$FILES/etcd-$ETCD_VERSION-linux-$ETCD_ARCH/etcd" ]; then
        echo "${ETCD_SHA256} $etcd_file" > $FILES/etcd.sha256sum
        # NOTE(yuanke wei): rm the damaged file when checksum fails
        sha256sum -c $FILES/etcd.sha256sum || (sudo rm -f $etcd_file; exit 1)

        tar xzvf $etcd_file -C $FILES
        sudo cp $FILES/$ETCD_NAME/etcd $ETCD_BIN_DIR/etcd
        sudo cp $FILES/$ETCD_NAME/etcdctl $ETCD_BIN_DIR/etcdctl
    fi
    if [ ! -f "$ETCD_BIN_DIR/etcd" ]; then
        sudo cp $FILES/$ETCD_NAME/etcd $ETCD_BIN_DIR/etcd
        sudo cp $FILES/$ETCD_NAME/etcdctl $ETCD_BIN_DIR/etcdctl
    fi
}

# Restore xtrace
$_XTRACE_ETCD3

# Tell emacs to use shell-script-mode
## Local variables:
## mode: shell-script
## End:
