#!/bin/sh
#
# Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved.
#
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License v. 2.0, which is available at
# http://www.eclipse.org/legal/epl-2.0.
#
# This Source Code may also be made available under the following Secondary
# Licenses when the conditions for such availability set forth in the
# Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
# version 2 with the GNU Classpath Exception, which is available at
# https://www.gnu.org/software/classpath/license.html.
#
# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
#

#--- Extract environment properties --- "sed" doesn't work with iastools.zip used in windows

for x in `cat $APS_HOME/devtests/jdbc/config/ee-config.properties`
do
    varval=`echo $x |cut -d'=' -f1`

    if [ $varval = "admin.user" ];
    then
        AS_ADMIN_USER=`echo $x |cut -d'=' -f2`
    fi

    if [ $varval = "admin.port" ];
    then
        AS_ADMIN_PORT=`echo $x |cut -d'=' -f2`
    fi
    
    if [ $varval = "admin.host" ];
    then
        AS_ADMIN_HOST=`echo $x |cut -d'=' -f2`
    fi

    if [ $varval = "orb.port" ];
    then
        ORB_LISTENER_1_PORT=`echo $x |cut -d'=' -f2`
    fi

    if [ $varval = "http.port" ];
    then
        HTTP_LISTENER_1_PORT=`echo $x |cut -d'=' -f2`
    fi

    if [ $varval = "https.port" ];
    then
        SSL_PORT=`echo $x |cut -d'=' -f2`
    fi
    
    if [ $varval = "admin.password" ];
    then
        AS_ADMIN_PASSWORD=`echo $x |cut -d'=' -f2`
    fi

    if [ $varval = "admin.domain" ];
    then
        AS_ADMIN_DOMAIN=`echo $x |cut -d'=' -f2`
    fi
    if [ $varval = "nodeagent.name" ];
    then
        AS_ADMIN_NODEAGENT=`echo $x |cut -d'=' -f2`
    fi

    if [ $varval = "server.instance.name" ];
    then
        AS_ADMIN_SERVER=`echo $x |cut -d'=' -f2`
    fi

    if [ $varval = "cluster.name" ];
    then
        CLUSTER_NAME="sqe-cluster"
    fi

    if [ $varval = "clustered.instance.name" ];
    then
        CLUSTERED_INSTANCE_NAME="clustered_server"
    fi

    if [ $varval = "install.type" ];
    then
        INSTALL_TYPE=`echo $x |cut -d'=' -f2`
    fi

done

ASADMIN=${ASADMIN}/bin/asadmin
DAS_PORT=4848

HTTP_LISTENER_1_PORT="8079"
HTTP_LISTENER_2_PORT="1042"
ORB_LISTENER_1_PORT="3699"
SSL_PORT="1059"
SSL_MUTUALAUTH_PORT="1058"
JMX_SYSTEM_CONNECTOR_PORT="8687"

export AS_ADMIN_USER
export AS_ADMIN_PASSWORD
export AS_ADMIN_PORT
export AS_ADMIN_HOST
export AS_ADMIN_DOMAIN
export AS_ADMIN_NODEAGENT
export AS_ADMIN_SERVER
export CLUSTER_NAME
export CLUSTERED_INSTANCE_NAME

LOG_DIR=$APS_HOME/devtests/jdbc/logs

if [ ${INSTALL_TYPE} = "standalone" -o ${INSTALL_TYPE} = "all" ]; then
#  ----------------
    # Stop server instance: sqe-server----
    echo "stopping sever instance:${AS_ADMIN_SERVER}..."
    ${S1AS_HOME}/bin/asadmin stop-instance \
        -u ${AS_ADMIN_USER} \
        -w ${AS_ADMIN_PASSWORD} \
        ${AS_ADMIN_SERVER}

    ${S1AS_HOME}/bin/asadmin delete-instance \
        -u ${AS_ADMIN_USER} \
        -w ${AS_ADMIN_PASSWORD} \
        ${AS_ADMIN_SERVER}
fi

if [ ${INSTALL_TYPE} = "cluster" -o ${INSTALL_TYPE} = "all" ]; then
#  ----------------
    # Create server instance: sqe-server----
    echo "stopping cluster ${CLUSTER_NAME}"
    ${S1AS_HOME}/bin/asadmin stop-cluster \
        -u ${AS_ADMIN_USER} \
        -w ${AS_ADMIN_PASSWORD} \
        ${CLUSTER_NAME}


${S1AS_HOME}/bin/asadmin delete-instance \
        -u ${AS_ADMIN_USER} \
        -w ${AS_ADMIN_PASSWORD} \
        ${CLUSTERED_INSTANCE_NAME}_1

${S1AS_HOME}/bin/asadmin delete-instance \
        -u ${AS_ADMIN_USER} \
        -w ${AS_ADMIN_PASSWORD} \
        ${CLUSTERED_INSTANCE_NAME}_2

    ${S1AS_HOME}/bin/asadmin delete-cluster \
        -u ${AS_ADMIN_USER} \
        -w ${AS_ADMIN_PASSWORD} \
        ${CLUSTER_NAME}
fi


echo "stopping nodeagent....."
$S1AS_HOME/bin/asadmin stop-node-agent $AS_ADMIN_NODEAGENT



echo "Deleting nodeagent....."
${S1AS_HOME}/bin/asadmin delete-node-agent ${AS_ADMIN_NODEAGENT}

echo "Deleting nodeagent config....."
${S1AS_HOME}/bin/asadmin delete-node-agent-config ${AS_ADMIN_NODEAGENT}

echo "stopping domain...."
${S1AS_HOME}/bin/asadmin stop-domain ${AS_ADMIN_DOMAIN}


${S1AS_HOME}/bin/asadmin delete-domain ${AS_ADMIN_DOMAIN}
echo "EE domain,server instance and nodeagent has been deleted"

