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

# Create docker network
{
  docker network create --subnet=172.172.172.0/24 druid-it-net
}

if [ -z "$DRUID_INTEGRATION_TEST_OVERRIDE_CONFIG_PATH" ]
then
    echo "\$DRUID_INTEGRATION_TEST_OVERRIDE_CONFIG_PATH is not set. No override config file provided"
    if [ "$DRUID_INTEGRATION_TEST_GROUP" = "s3-deep-storage" ] || \
    [ "$DRUID_INTEGRATION_TEST_GROUP" = "gcs-deep-storage" ] || \
    [ "$DRUID_INTEGRATION_TEST_GROUP" = "azure-deep-storage" ] || \
    [ "$DRUID_INTEGRATION_TEST_GROUP" = "hdfs-deep-storage" ] || \
    [ "$DRUID_INTEGRATION_TEST_GROUP" = "s3-ingestion" ] || \
    [ "$DRUID_INTEGRATION_TEST_GROUP" = "kinesis-index" ] || \
    [ "$DRUID_INTEGRATION_TEST_GROUP" = "kinesis-data-format" ]; then
      echo "Test group $DRUID_INTEGRATION_TEST_GROUP requires override config file. Stopping test..."
      exit 1
    fi
else
    echo "\$DRUID_INTEGRATION_TEST_OVERRIDE_CONFIG_PATH is set with value ${DRUID_INTEGRATION_TEST_OVERRIDE_CONFIG_PATH}"
fi

# Start docker containers for all Druid processes and dependencies
{
  # Start Hadoop docker if needed
  if [ -n "$DRUID_INTEGRATION_TEST_START_HADOOP_DOCKER" ] && [ "$DRUID_INTEGRATION_TEST_START_HADOOP_DOCKER" == true ]
  then
    # Start Hadoop docker container
    docker-compose -f ${DOCKERDIR}/docker-compose.druid-hadoop.yml up -d
  fi

  if [ -z "$DRUID_INTEGRATION_TEST_OVERRIDE_CONFIG_PATH" ]
  then
     if [ "$DRUID_INTEGRATION_TEST_GROUP" = "security" ]
     then
       # Start default Druid services and additional druid router (custom-check-tls, permissive-tls, no-client-auth-tls)
       docker-compose -f ${DOCKERDIR}/docker-compose.yml -f ${DOCKERDIR}/docker-compose.security.yml up -d
     elif [ "$DRUID_INTEGRATION_TEST_GROUP" = "query-retry" ]
     then
       # Start default Druid services with an additional historical modified for query retry test
       # See CliHistoricalForQueryRetryTest.
       docker-compose -f ${DOCKERDIR}/docker-compose.query-retry-test.yml up -d
     else
       # Start default Druid services
       docker-compose -f ${DOCKERDIR}/docker-compose.yml up -d
     fi
  else
    # run druid cluster with override config
    OVERRIDE_ENV=$DRUID_INTEGRATION_TEST_OVERRIDE_CONFIG_PATH docker-compose -f ${DOCKERDIR}/docker-compose.override-env.yml up -d
  fi
}
