#!/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.


# The purpose of this script is to set warehouse's directories on HDFS

DEFAULT_WAREHOUSE_DIR="/user/hive/warehouse"
DEFAULT_TMP_DIR="/tmp"

WAREHOUSE_DIR=${DEFAULT_WAREHOUSE_DIR}
TMP_DIR=${DEFAULT_TMP_DIR}
HELP=""
while [ $# -gt 0 ]; do
  case "$1" in
    --warehouse-dir)
      shift
      WAREHOUSE_DIR=$1
      shift
      ;;
    --tmp-dir)
      shift
      TMP_DIR=$1
      shift
      ;;
    --help)
      HELP=_help
      shift
      ;;
    *)
      echo "Invalid parameter: $1"
      HELP=_help
      break
      ;;
  esac
done

if [ "$HELP" = "_help" ] ; then
  echo "Usage $0 [--warehouse-dir <Hive user>] [--tmp-dir <Tmp dir>]"
  echo "Default value of warehouse directory is: [$DEFAULT_WAREHOUSE_DIR]"
  echo "Default value of the temporary directory is: [$DEFAULT_TMP_DIR]"
  exit -1
fi


# check for hadoop in the path
HADOOP_IN_PATH=`which hadoop 2>/dev/null`
if [ -f ${HADOOP_IN_PATH} ]; then
  HADOOP_DIR=`dirname "$HADOOP_IN_PATH"`/..
fi
# HADOOP_HOME env variable overrides hadoop in the path
HADOOP_HOME=${HADOOP_HOME:-$HADOOP_DIR}
if [ "$HADOOP_HOME" == "" ]; then
  echo "Cannot find hadoop installation: \$HADOOP_HOME must be set or hadoop must be in the path";
  exit 4;
fi

HADOOP_EXEC=$HADOOP_HOME/bin/hadoop
if [ ! -f ${HADOOP} ]; then
  echo "Cannot find hadoop installation: \$HADOOP_HOME must be set or hadoop must be in the path";
  exit 4;
fi


# Ensure /tmp exist
$HADOOP_EXEC fs -test -d ${TMP_DIR} > /dev/null 2>&1
if [ $? -ne 0 ] 
then
  echo "Creating directory [${TMP_DIR}]"
  $HADOOP_EXEC fs -mkdir ${TMP_DIR}
fi

echo "Setting writeable group rights for directory [${TMP_DIR}]"
$HADOOP_EXEC fs -chmod g+w ${TMP_DIR}


# Ensure warehouse dir exist
$HADOOP_EXEC fs -test -d ${WAREHOUSE_DIR} > /dev/null 2>&1
if [ $? -ne 0 ] 
then
  echo "Creating directory [${WAREHOUSE_DIR}]"
  $HADOOP_EXEC fs -mkdir ${WAREHOUSE_DIR}
fi

echo "Setting writeable group rights for directory [${WAREHOUSE_DIR}]"
$HADOOP_EXEC fs -chmod g+w ${WAREHOUSE_DIR}

echo "Initialization done."
echo
echo "Please, do not forget to set the following configuration properties in hive-site.xml:"
echo "hive.metastore.warehouse.dir=${WAREHOUSE_DIR}"
echo "hive.exec.scratchdir=${TMP_DIR}"

exit 0
