#!/bin/bash
#  Licensed to the Apache Software Foundation (ASF) under one   *
#  or more contributor license agreements.  See the NOTICE file *
#  distributed with this work for additional information        *
#  regarding copyright ownership.  The ASF licenses this file   *
#  to you 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.                                           *


command=$1
url=$2
module=$3

REPO="opnfv"
latest_image=$REPO/$module:latest
old_image=$REPO/$module:old
latest_container_name=$module
old_container_name=$module"_old"
latest_container_id=
old_container_id=
new_start_container=

function DEBUG() {
  echo `date "+%Y-%m-%d %H:%M:%S.%N"` ": $1"
}

function check_connectivity() {
    # check update status via test the connectivity of provide url
    sleep 5
    cmd=`curl -s --head  --request GET ${url} | grep '200 OK' > /dev/null`
    rc=$?
    DEBUG $rc
    if [[ $rc == 0 ]]; then
        return 0
    else
        return 1
    fi
}


function pull_latest_image() {
    DEBUG "pull latest image $latest_image"
    docker pull $latest_image
}

function get_latest_running_container() {
    latest_container_id=`docker ps -q --filter name=^/$latest_container_name$`
}

function get_old_running_container() {
    old_container_id=`docker ps -q --filter name=^/$old_container_name$`
}

function delete_old_image() {
    DEBUG "delete old image: $old_image"
    docker rmi -f $old_image
}

function delete_old_container() {
    DEBUG "delete old container: $old_container_name"
    docker ps -a -q --filter name=^/$old_container_name$ | xargs docker rm -f &>/dev/null
}

function delete_latest_container() {
    DEBUG "delete latest container: $module"
    docker ps -a -q --filter name=^/$latest_container_name$ | xargs docker rm -f &>/dev/null
}

function delete_latest_image() {
    DEBUG "delete latest image: $REPO/$module:latest"
    docker rmi -f $latest_image
}

function change_image_tag_2_old() {
    DEBUG "change image tag 2 old"
    docker tag $latest_image $old_image
    docker rmi -f $latest_image
}

function mark_latest_container_2_old() {
    DEBUG "mark latest container to be old"
    docker rename "$latest_container_name" "$old_container_name"
}

function stop_old_container() {
    DEBUG "stop old container"
    docker stop "$old_container_name"
}

function run_latest_image() {
    new_start_container=`$command`
    DEBUG "run latest image: $new_start_container"
}

get_latest_running_container
get_old_running_container

if [[ ! -z $latest_container_id ]]; then
    DEBUG "latest container is running: $latest_container_id"
    delete_old_container
    delete_old_image
    change_image_tag_2_old
    mark_latest_container_2_old
    pull_latest_image
    stop_old_container
    run_latest_image

elif [[ ! -z $old_container_id ]]; then
    DEBUG "old container is running: $old_container_id"
    delete_latest_container
    delete_latest_image
    pull_latest_image
    stop_old_container
    run_latest_image
else
    DEBUG "no container is running"
    delete_old_container
    delete_old_image
    delete_latest_container
    delete_latest_image
    pull_latest_image
    run_latest_image
fi

if check_connectivity; then
    DEBUG "CONGRATS: $module update successfully"
else
    DEBUG "ATTENTION: $module update failed"
    id=`docker ps -a -q --filter name=^/$old_container_name$`
    if [[ ! -z $id ]]; then
        DEBUG "start old container instead"
        docker stop $new_start_container
        docker start $id
    fi
    if ! check_connectivity; then
        DEBUG "BIG ISSUE: no container is running normally"
    fi
    exit 1
fi

docker images
docker ps -a