#!/bin/bash

#
# Copyright 2015-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.
#

# -----------------------------------------------------------------------------
# Tool to manage ONOS applications using REST API.
# -----------------------------------------------------------------------------
function usage {
    echo "usage: onos-app [options] <node-ip> list" >&2
    echo "       onos-app [options] <node-ip> {install|install!} <app-file>" >&2
    echo "       onos-app [options] <node-ip> {reinstall|reinstall!} [<app-name>] <app-file>" >&2
    echo "       onos-app [options] <node-ip> {activate|deactivate|uninstall} <app-name>" >&2
    echo ""
    echo "options: [-P port] [-u user] [-p password] [-v]"
    exit 1
}

. $(dirname $0)/_rest-port
. $(dirname $0)/_find-node

node=$(find_node $1)
cmd=${2:-list}
app=${3}

export URL=http://$node:$port/onos/v1/applications
export HDR="-HContent-Type:application/octet-stream"
export HAJ="-HContent-Type:application/json"
export curl="curl $fail -sSL --user $user:$password --noproxy ${node} "


# Extract app name from the specified *.oar file
function appName {
    aux=/tmp/aux$$.jar
    cp $1 $aux
    pushd /tmp >/dev/null
    jar xf $aux app.xml && grep name= app.xml | cut -d\" -f2
    rm -f $aux /tmp/app.xml
    popd >/dev/null
}

[ -z $node -o "$node" = "-h" -o "$node" = "--help" -o "$node" = "-?" ] && usage

case $cmd in
    list) $curl -X GET $URL;;
    installUrl!|installUrl)
        activate="false"
        [ $cmd = "installUrl!" ] && activate="true"
        [ $# -lt 3 ] && usage
        appurl=$3
        $curl -X POST $HAJ -d '{"url" : "'"$appurl"'", "activate" : "'$activate'" }' $URL
        ;;
    install!|install)
        [ $cmd = "install!" ] && activate="?activate=true"
        [ $# -lt 3 -o ! -f $app ] && usage
        $curl -X POST $HDR $URL$activate --data-binary @$app
        ;;

    reinstall!|reinstall)
        [ $cmd = "reinstall!" ] && activate="?activate=true"
        [ $# -lt 4 -a ! -f "$3" ] && usage
        [ $# -eq 4 -a ! -f "$4" ] && usage
        oar=$4
        [ $# -lt 4 ] && oar=$3 && app=$(appName $oar)
        $curl -X DELETE $URL/$app
        $curl -X POST $HDR $URL$activate --data-binary @$oar
        ;;

    uninstall)
        [ $# -lt 3 ] && usage
        $curl -X DELETE $URL/$app
        ;;
    activate)
        [ $# -lt 3 ] && usage
        $curl -X POST $URL/$app/active
        ;;
    deactivate)
        [ $# -lt 3 ] && usage
        $curl -X DELETE $URL/$app/active
        ;;

    *) usage;;
esac


status=$?
echo # new line for prompt
exit $status
