blob: 05808a74da128c8185c080e16d9e3de410fc4925 [file] [log] [blame]
#!/usr/bin/env bash
#
# vim:et:ft=sh:sts=2:sw=2
#
#/**
# * 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.
# */
BINDIR=${BK_BINDIR:-"`dirname "$0"`"}
source ${BINDIR}/common.sh
DOCKER_COMPOSE=docker-compose
DATA_ROOT_DIR=${BK_DATA_DIR:-"${BK_HOME}/data"}
mkdir -p ${DATA_ROOT_DIR}
function gen_metadata_service_section() {
local cluster=$1
local image=$2
cat <<EOF
metadata-service:
image: ${image}
hostname: metadata-service
command: ["zookeeper"]
environment:
- ZK_dataDir=/data/zookeeper/data
- ZK_dataLogDir=/data/zookeeper/txlog
- ZK_standaloneEnabled=true
ports:
- "9990:9990"
- "2181:2181"
volumes:
- "${DATA_ROOT_DIR}/${cluster}/zookeeper/data:/data/zookeeper/data"
- "${DATA_ROOT_DIR}/${cluster}/zookeeper/txlog:/data/zookeeper/txlog"
EOF
}
function gen_bookie_section() {
local cluster=$1
local bookie_name=$2
local bookie_port=$3
local bookie_http_port=$4
local bookie_grpc_port=$5
local image=$6
cat <<EOF
${bookie_name}:
image: ${image}
depends_on:
- metadata-service
environment:
# metadata service
- BK_zkServers=metadata-service
- BK_zkLedgersRootPath=/ledgers
- BK_metadataServiceUri=zk://metadata-service/ledgers
# bookie
- BK_DATA_DIR=/data/bookkeeper
- BK_advertisedAddress=${bookie_name}
# bookie http
- BK_httpServerEnabled=true
# stream storage
- BK_extraServerComponents=org.apache.bookkeeper.stream.server.StreamStorageLifecycleComponent
ports:
- "${bookie_port}:3181"
- "${bookie_http_port}:8080"
- "${bookie_grpc_port}:4181"
volumes:
- "${DATA_ROOT_DIR}/${cluster}/${bookie_name}/journal:/data/bookkeeper/journal"
- "${DATA_ROOT_DIR}/${cluster}/${bookie_name}/ledgers:/data/bookkeeper/ledgers"
EOF
}
function generate_docker_compose_file() {
local cluster=$1
local num_bookies=$2
local image=$3
local docker_compose_file="${DATA_ROOT_DIR}/${cluster}/docker-compose.yml"
local metadata_service_section=$(gen_metadata_service_section ${cluster} ${image})
echo "version: '3'" > ${docker_compose_file}
echo "" >> ${docker_compose_file}
echo "services:" >> ${docker_compose_file}
echo "" >> ${docker_compose_file}
echo "${metadata_service_section}" >> ${docker_compose_file}
echo "" >> ${docker_compose_file}
local BI=0
while [ ${BI} -lt $((num_bookies)) ]; do
local bookie_port=$((3181 + BI))
local bookie_http_port=$((8080 + BI))
local bookie_grpc_port=$((4181 + BI))
local bookie_section=$(gen_bookie_section ${cluster} "bookie-${BI}" ${bookie_port} ${bookie_http_port} ${bookie_grpc_port} ${image})
echo "${bookie_section}" >> ${docker_compose_file}
let BI=BI+1
done
}
function show_help() {
cat <<EOF
Usage: standalone.docker-compose [-c <cluster_name>] [-h] <action:[up|down]>
EOF
}
# main entrypoint
CLUSTER_NAME="bk-standalone-dc"
OPTIND=1
IMAGE=${IMAGE:-"apachebookkeeper/bookkeeper-current"}
NUM_BOOKIES=${NUM_BOOKIES:-"3"}
while getopts "h:c:" opt; do
case "${opt}" in
c )
CLUSTER_NAME=${OPTARG}
echo "use cluster = '${CLUSTER_NAME}'."
;;
h|\? )
show_help
exit 1
;;
esac
done
shift $((OPTIND-1))
[ "${1:-}" = "--" ] && shift
if [ $# -le 0 ]; then
show_help
exit 1
fi
ACTION=$1
DOCKER_COMPOSE_OPTS=""
case "${ACTION}" in
up)
DOCKER_COMPOSE_OPTS="--detach"
;;
down)
;;
*)
echo "Unknown action : ${ACTION}"
show_help
exit 1
;;
esac
CLUSTER_DATA_ROOT="${DATA_ROOT_DIR}/${CLUSTER_NAME}"
mkdir -p ${CLUSTER_DATA_ROOT}
# generate docker compose file
DOCKER_COMPOSE_FILE="${CLUSTER_DATA_ROOT}/docker-compose.yml"
if [ ! -f ${DOCKER_COMPOSE_FILE} ]; then
generate_docker_compose_file ${CLUSTER_NAME} ${NUM_BOOKIES} ${IMAGE}
fi
cd ${CLUSTER_DATA_ROOT}
${DOCKER_COMPOSE} $@ ${DOCKER_COMPOSE_OPTS}
if [ $? == 0 -a "${ACTION}" == "up" ]; then
echo ""
echo "Standalone cluster '${CLUSTER_NAME}' is up running."
echo "Use following uris to connect to standalone cluster:"
echo ""
echo " - metadata service uri = 'zk://localhost/ledgers'"
echo " - dlog uri = 'distributedlog://localhost/distributedlog'"
fi
exit $?