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

# This script creates and starts a domain called "sqe-domain"
# with a single server instance named "sqe-server".

#--- 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
HTTP_LISTENER_2_PORT="1042"
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

##----- End Variable Defintions --------------



#Create domain: sqe-domain----
echo "creating domain ${AS_ADMIN_DOMAIN}..."
${S1AS_HOME}/bin/asadmin create-domain --adminport ${AS_ADMIN_PORT} --adminuser ${AS_ADMIN_USER} --adminpassword ${AS_ADMIN_PASSWORD} ${AS_ADMIN_DOMAIN}


echo "Copying all database driver files to ${S1AS_HOME}/domains/${AS_ADMIN_DOMAIN}/lib/ext directory"

# Start domain: sqe-domain----
echo "starting domain ${AS_ADMIN_DOMAIN}..."
${S1AS_HOME}/bin/asadmin start-domain --user ${AS_ADMIN_USER} --password ${AS_ADMIN_PASSWORD} ${AS_ADMIN_DOMAIN}

# Create node agent (sqe-agent) referencing sqe-domain.----
echo "creating node agent: ${AS_ADMIN_NODEAGENT}..."
${S1AS_HOME}/bin/asadmin create-node-agent --host ${AS_ADMIN_HOST} --port ${AS_ADMIN_PORT} --user ${AS_ADMIN_USER} --password ${AS_ADMIN_PASSWORD} ${AS_ADMIN_NODEAGENT}

#----Start the sqe-agent. ----
echo "starting node agent: ${AS_ADMIN_NODEAGENT}..."
${S1AS_HOME}/bin/asadmin start-node-agent --user ${AS_ADMIN_USER} --password ${AS_ADMIN_PASSWORD} ${AS_ADMIN_NODEAGENT}

#sleep ----
echo "sleeping for 15 seconds..."
sleep 15

echo "INSTALL TYPE is set to :${INSTALL_TYPE}"
echo "install.type value in config.properties needs to be one of [standalone | cluster | all]"

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

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

if [ ${INSTALL_TYPE} = "cluster" -o ${INSTALL_TYPE} = "all" ]; then
#  ----------------
    # Create cluster: sqe-cluster----
    echo "creating cluster:${CLUSTER_NAME}..."
    ${S1AS_HOME}/bin/asadmin create-cluster -u ${AS_ADMIN_USER} -w ${AS_ADMIN_PASSWORD} ${CLUSTER_NAME}

    # Roll over ports ----------------
    echo "using default ports in config.properties for first instance..."
        HTTP_LISTENER_1_PORT=`expr ${HTTP_LISTENER_1_PORT} `
        HTTP_LISTENER_2_PORT=`expr ${HTTP_LISTENER_2_PORT} `
        ORB_LISTENER_1_PORT=`expr ${ORB_LISTENER_1_PORT} `
        SSL_PORT=`expr ${SSL_PORT} `
        SSL_MUTUALAUTH_PORT=`expr ${SSL_MUTUALAUTH_PORT} `
        JMX_SYSTEM_CONNECTOR_PORT=`expr ${JMX_SYSTEM_CONNECTOR_PORT} `

        echo "Rolled Over Ports by 4! New port values are:";
        echo "HTTP_LISTENER_1_PORT=${HTTP_LISTENER_1_PORT}";
        echo "HTTP_LISTENER_2_PORT=${HTTP_LISTENER_2_PORT}";
        echo "ORB_LISTENER_1_PORT=${ORB_LISTENER_1_PORT}";
        echo "SSL_PORT=${SSL_PORT}";

    # Create clustered instance: clustered-server----
    echo "creating server instance:${CLUSTERED_INSTANCE_NAME}_1..."
    ${S1AS_HOME}/bin/asadmin create-instance \
        --nodeagent ${AS_ADMIN_NODEAGENT} \
        --cluster ${CLUSTER_NAME} \
        --systemproperties http-listener-1-port=${HTTP_LISTENER_1_PORT}:http-listener-2-port=${HTTP_LISTENER_2_PORT}:orb-listener-1-port=${ORB_LISTENER_1_PORT}:SSL-port=${SSL_PORT}:SSL_MUTUALAUTH-port=${SSL_MUTUALAUTH_PORT}:JMX_SYSTEM_CONNECTOR-port=${JMX_SYSTEM_CONNECTOR_PORT} \
        -u ${AS_ADMIN_USER} -w ${AS_ADMIN_PASSWORD} \
    ${CLUSTERED_INSTANCE_NAME}_1

    # Roll over ports ----------------
    echo "Rolling over default port values by 4..."
        HTTP_LISTENER_1_PORT=`expr ${HTTP_LISTENER_1_PORT} + 4`
        HTTP_LISTENER_2_PORT=`expr ${HTTP_LISTENER_2_PORT} + 4`
        ORB_LISTENER_1_PORT=`expr ${ORB_LISTENER_1_PORT} + 4`
        SSL_PORT=`expr ${SSL_PORT} + 4`
        SSL_MUTUALAUTH_PORT=`expr ${SSL_MUTUALAUTH_PORT} + 4`
        JMX_SYSTEM_CONNECTOR_PORT=`expr ${JMX_SYSTEM_CONNECTOR_PORT} + 4`

        echo "Rolled Over Ports by 4! New port values are:";
        echo "HTTP_LISTENER_1_PORT=${HTTP_LISTENER_1_PORT}";
        echo "HTTP_LISTENER_2_PORT=${HTTP_LISTENER_2_PORT}";
        echo "ORB_LISTENER_1_PORT=${ORB_LISTENER_1_PORT}";
        echo "SSL_PORT=${SSL_PORT}";

    # Create clustered instance: clustered-server----
    echo "creating server instance:${CLUSTERED_INSTANCE_NAME}_2..."
    ${S1AS_HOME}/bin/asadmin create-instance \
        --nodeagent ${AS_ADMIN_NODEAGENT} \
        --cluster ${CLUSTER_NAME} \
        --systemproperties http-listener-1-port=${HTTP_LISTENER_1_PORT}:http-listener-2-port=${HTTP_LISTENER_2_PORT}:orb-listener-1-port=${ORB_LISTENER_1_PORT}:SSL-port=${SSL_PORT}:SSL_MUTUALAUTH-port=${SSL_MUTUALAUTH_PORT}:JMX_SYSTEM_CONNECTOR-port=${JMX_SYSTEM_CONNECTOR_PORT} \
        -u ${AS_ADMIN_USER} -w ${AS_ADMIN_PASSWORD} \
    ${CLUSTERED_INSTANCE_NAME}_2
    #-- END Cluster Setup--------------------------

    # Start cluster: sqe-cluster----
    echo "Starting cluster:${CLUSTER_NAME}..."
    ${S1AS_HOME}/bin/asadmin start-cluster -u ${AS_ADMIN_USER} -w ${AS_ADMIN_PASSWORD} ${CLUSTER_NAME}

fi


echo "EE setup complete!"

# ---------  Notes. ------------

#NOTE: There is an unstated jmx port 8686 which is 
# currently not configurable. This port will need to be specified 
# when creating the node agent.

#NOTE: The domain should be up an running when the node agent is started. 

#NOTE: The stop-nodeagent command currently does
# not function due to a bug so should you ever need to stop the node
# agent you must kill its process. In reality you should never need 
# to stop the node agent once it is started.

#NOTE: The ports by default will not conflict with those of the DAS. 
#The http-listener port will default to 8079. 

#echo "#NOTE: There is an unstated jmx port 8686 which is  currently not configurable. This port will need to be specified  when creating the node agent."

