#!/usr/bin/env 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.
# */
#
# console to list/view/kill singa jobs
#

usage="Usage: singa-console.sh <command> <args>\n
        list           :  list running singa jobs\n
        view <job id>  :  view procs of a singa job\n
        kill <job id>  :  kill a singa job"

if [ $# == 0 ]; then
  echo -e $usage
  exit 1
fi

# get environment variables
. `dirname "${BASH_SOURCE-$0}"`/singa-env.sh
cd $SINGA_HOME

case $1 in
  list)
    if [ $# != 1 ]; then
      echo -e $usage
      exit 1
    fi
    ./singatool list || exit 1
    ;;

  view)
    if [ $# != 2 ]; then
      echo -e $usage
      exit 1
    fi
    ./singatool view $2 || exit 1
    ;;

  kill)
    if [ $# != 2 ]; then
      echo -e $usage
      exit 1
    fi
    hosts=`./singatool view "$2"`
    [ $? == 0 ] || exit 1
    ssh_options="-oStrictHostKeyChecking=no \
             -oUserKnownHostsFile=/dev/null \
             -oLogLevel=quiet"
    if [ `head -1 "$SINGA_CONF"/hostfile` == localhost ]; then
      local_procs=1
    fi
    for i in ${hosts[@]}; do
      proc=(`echo $i | tr '|' ' '`)
      singa_kill="kill -9 "${proc[1]}
      if [ -z $local_procs ]; then
        echo Kill singa @ $i ...
        ssh $ssh_options ${proc[0]} $singa_kill
      else
        echo Kill singa @ ${proc[1]} ...
        $singa_kill
      fi
    done
    ./singatool remove $2 || exit 1
    ;;

  *)
    echo -e $usage
    exit 1
esac
