blob: bc448bfc6bf21d950d1a910e0ff37b1d86678665 [file] [log] [blame]
#!/bin/bash
#
#/**
# * Copyright 2007 The Apache Software Foundation
# *
# * 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.
# */
VERSION ?= latest
IMAGE ?= apache/bookkeeper:$(VERSION)
BOOKIE ?= 1
DOCKER_NETWORK ?= bk_network
BUILD_DIR ?= $(VERSION)
CONTAINER_NAME = bookkeeper-$(BOOKIE)
DOCKER_HOSTNAME = $(shell hostname)
BK_LOCAL_DATA_DIR = /tmp/test_bk
BK_LOCAL_CONTAINER_DATA_DIR = $(BK_LOCAL_DATA_DIR)/$(CONTAINER_NAME)
BK_DIR = /data
BK_zkLedgersRootPath = /ledgers
ZK_CONTAINER_NAME=test_zookeeper
ZK_LOCAL_DATA_DIR=$(BK_LOCAL_DATA_DIR)/zookeeper
TERMINAL_EMULATOR=gnome-terminal
CONTAINER_IP=$(shell docker inspect --format '{{ .NetworkSettings.IPAddress }}' $(CONTAINER_NAME))
# -------------------------------- #
.PHONY: all build run create start stop shell exec root-shell root-exec info ip clean-files clean
# -------------------------------- #
all:
make info
# -------------------------------- #
# Build the bookkeeper image.
# make build
build:
cd $(BUILD_DIR) ; \
time docker build \
-t $(IMAGE) .
# -------------------------------- #
# Create and run a bookkeeper container with data persisted on local filesystem. It needs the zookeeper container.
# In order to launch several bookies, the command need the bookie number
# make run-bk BOOKIE=4
run-bk:
mkdir -p $(BK_LOCAL_DATA_DIR) \
$(BK_LOCAL_CONTAINER_DATA_DIR) \
$(BK_LOCAL_CONTAINER_DATA_DIR)/journal \
$(BK_LOCAL_CONTAINER_DATA_DIR)/ledger \
$(BK_LOCAL_CONTAINER_DATA_DIR)/index
-docker rm -f $(CONTAINER_NAME)
docker run -it\
--network $(DOCKER_NETWORK) \
--volume $(BK_LOCAL_CONTAINER_DATA_DIR)/journal:$(BK_DIR)/journal \
--volume $(BK_LOCAL_CONTAINER_DATA_DIR)/ledger:$(BK_DIR)/ledger \
--volume $(BK_LOCAL_CONTAINER_DATA_DIR)/index:$(BK_DIR)/index \
--user "$(id -u)" \
--name "$(CONTAINER_NAME)" \
--hostname "$(CONTAINER_NAME)" \
--env BK_zkServers=$(ZK_CONTAINER_NAME):2181 \
--env BK_zkLedgersRootPath=$(BK_zkLedgersRootPath) \
$(IMAGE)
# -------------------------------- #
# Create run and destroy a container that will
# intializes new bookkeeper cluster by creating required znodes for the cluster
# make run-init
run-init:
docker run -it --rm \
--network $(DOCKER_NETWORK) \
--env BK_zkServers=$(ZK_CONTAINER_NAME):2181 \
$(IMAGE) \
bookkeeper shell initnewcluster
# -------------------------------- #
# Create run and destroy a container that will nuke bookkeeper metadata of existing cluster in zookeeper
# make run-nuke
run-nuke:
docker run -it --rm \
--network $(DOCKER_NETWORK) \
--env BK_zkServers=$(ZK_CONTAINER_NAME):2181 \
$(IMAGE) \
bookkeeper shell nukeexistingcluster -zkledgersrootpath $(BK_zkLedgersRootPath) -f
# -------------------------------- #
# Create and run the zookeeper container needed by the ensemble
# make run-zk
run-zk:
-docker network create $(DOCKER_NETWORK)
mkdir -pv $(BK_LOCAL_DATA_DIR) $(ZK_LOCAL_DATA_DIR) $(ZK_LOCAL_DATA_DIR)/data $(ZK_LOCAL_DATA_DIR)/datalog
-docker rm -f $(ZK_CONTAINER_NAME)
docker run -it --rm \
--network $(DOCKER_NETWORK) \
--name "$(ZK_CONTAINER_NAME)" \
--hostname "$(ZK_CONTAINER_NAME)" \
-v $(ZK_LOCAL_DATA_DIR)/data:/data \
-v $(ZK_LOCAL_DATA_DIR)/datalog:/datalog \
-p 2181:2181 \
zookeeper
# -------------------------------- #
# Create and run a container running the bookkeeper tutorial application (a simple dice rolling application).
# It's possible to run several dice applications in order to simulate a real life concurrent scenario.
# make run-dice
run-dice:
docker run -it --rm \
--network $(DOCKER_NETWORK) \
--env ZOOKEEPER_SERVERS=$(ZK_CONTAINER_NAME):2181 \
caiok/bookkeeper-tutorial
# -------------------------------- #
# This is an example of a full bookkeeper ensemble of 3 bookies, a zookeeper server and 2 client dice applications.
# On MacOS please run these command manually in several terminals
# make run-demo
run-demo:
$(eval WAIT_CMD := read -p 'Press Enter to close...')
$(TERMINAL_EMULATOR) -e "bash -l -c \"make run-zk ; $(WAIT_CMD)"\"
sleep 3
$(TERMINAL_EMULATOR) -e "bash -l -c \"make run-bk BOOKIE=1 TRY_METAFORMAT=true; $(WAIT_CMD)\""
$(TERMINAL_EMULATOR) -e "bash -l -c \"make run-bk BOOKIE=2 TRY_METAFORMAT=true; $(WAIT_CMD)\""
$(TERMINAL_EMULATOR) -e "bash -l -c \"make run-bk BOOKIE=3 TRY_METAFORMAT=true; $(WAIT_CMD)\""
sleep 6
$(TERMINAL_EMULATOR) -e "bash -l -c \"make run-dice ; $(WAIT_CMD)\""
sleep 2
$(TERMINAL_EMULATOR) -e "bash -l -c \"make run-dice ; $(WAIT_CMD)\""
@echo
@echo "If you want to restart from scratch the application, remove all its data:"
@echo " sudo rm -rf $(BK_LOCAL_DATA_DIR)"
@echo
# -------------------------------- #
# Other undocumented utilities #
# -------------------------------- #
start:
docker start "$(CONTAINER_NAME)"
# -------------------------------- #
stop:
docker stop "$(CONTAINER_NAME)"
# -------------------------------- #
shell exec:
docker exec -it \
"$(CONTAINER_NAME)" \
/bin/bash -il
# -------------------------------- #
root-shell root-exec:
docker exec -it "$(CONTAINER_NAME)" /bin/bash -il
# -------------------------------- #
info ip:
@echo
@echo "Image: $(IMAGE)"
@echo "Container name: $(CONTAINER_NAME)"
@echo
-@echo "Actual Image: $(shell docker inspect --format '{{ .RepoTags }} (created {{.Created }})' $(IMAGE))"
-@echo "Actual Container: $(shell docker inspect --format '{{ .Name }} (created {{.Created }})' $(CONTAINER_NAME))"
-@echo "Actual Container IP: $(shell docker inspect --format '{{ .NetworkSettings.IPAddress }}' $(CONTAINER_NAME))"
@echo
# -------------------------------- #
clean-files:
clean:
-docker stop $(CONTAINER_NAME)
-docker rm $(CONTAINER_NAME)
-docker rmi $(IMAGE)
make clean-files