#!/bin/bash

# 1. $0 prepare master
# 2. $0 prepare env 1
# 3. $0 prepare env N

# 4. NOOP_RUN

# 5. $0 update master

set -e
set -o pipefail


function die() {
    local msg
    if [ -n "$1" ]; then
        msg=" ($@)"
    else
        msg=""
    fi
    echo "[ERROR] wrong arguments ${msg}" >&2
    exit 1
}


case "$1" in
    prepare)
        case "$2" in
            master)
                # fixing bug: https://bugs.launchpad.net/fuel/+bug/1616119
                #   (we have to do it before fully update master node, so this is the only option)
                sed -i "s/\$\.dpdk/\$\.get\('dpdk'\)/g" /etc/puppet/modules/osnailyfacter/modular/netconfig/tasks.yaml /etc/puppet/modules/openstack_tasks/examples/roles/tasks.yaml
                fuel rel --sync-deployment-tasks --dir /etc/puppet

                # backup original fuel-library
                library_backup='/etc/fuel/maintenance/updates/fuel-library/'
                if [ ! -d "$library_backup" ]; then
                    mkdir -p "$library_backup"
                    cp -aH /etc/puppet/modules/ "$library_backup"
                fi

                # update special packages
                yum install -y fuel-nailgun fuel-utils python-fuelclient rubygem-astute

                # reload systemd
                systemctl daemon-reload


                # migrate Nailgun DB
                nailgun_syncdb

                # update version
                yum install -y fuel-release

                # restart services
                PACKAGE="$(rpm -qa | grep '^fuel-nailgun')"
                SERVICES=$(rpm -ql "$PACKAGE" | grep '^/usr/lib/systemd/system/\w*.service$' | awk -F'/' '{print $NF}' | sed 's/.service$//')
                systemctl restart $SERVICES
                ;;
            env)
                if echo "$3" | grep -q '^[0-9][0-9]*$'; then
                    env="$3"
                else
                    die "'env' is not defined properly"
                fi

                # upgrade nailgun-agent nodes
                NODES=$(fuel nodes --env "$env" | awk -F '|' '{print $5}' | grep -o '[0-9][0-9.]*[0-9]')
                cmd='DEBIAN_FRONTEND=noninteractive apt-get install -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" --yes --no-remove nailgun-agent nailgun-mcagents'
                [ "${UPDATE_PREPARE_APTDATE:-}" = 'false' ] || cmd="apt-get update -qq && ${cmd}"

                for node in $NODES; do
                    ssh "$node" "$cmd" || die "node <${node}> failed"
                done
                ;;
            *)
                die 'unknown prepare target'
                ;;
        esac
        ;;

    update)
        if [ "$2" = 'master' ]; then
            bash /usr/share/fuel-utils/update-master-node.sh
        else
            die 'unknown target'
        fi
        ;;

    *)
        die 'unknown action'
        ;;
esac

exit 0
