devstack/lib/etcd3

137 lines
4.0 KiB
Bash

#!/bin/bash
#
# lib/etcd3
#
# Functions to control the installation and configuration of etcd 3.x
# that provides a key-value store (and possibly other functions).
# Dependencies:
#
# - ``functions`` file
# ``stack.sh`` calls the entry points in this order:
#
# - start_etcd3
# - stop_etcd3
# - cleanup_etcd3
# Save trace setting
_XTRACE_ETCD3=$(set +o | grep xtrace)
set +o xtrace
# Defaults
# --------
# Set up default values for etcd
ETCD_DATA_DIR="$DATA_DIR/etcd"
ETCD_SYSTEMD_SERVICE="devstack@etcd.service"
ETCD_BIN_DIR="$DEST/bin"
# Option below will mount ETCD_DATA_DIR as ramdisk, which is useful to run
# etcd-heavy services in the gate VM's, e.g. Kubernetes.
ETCD_USE_RAMDISK=$(trueorfalse True ETCD_USE_RAMDISK)
ETCD_RAMDISK_MB=${ETCD_RAMDISK_MB:-512}
if is_ubuntu ; then
UBUNTU_RELEASE_BASE_NUM=`lsb_release -r | awk '{print $2}' | cut -d '.' -f 1`
fi
# start_etcd3() - Starts to run the etcd process
function start_etcd3 {
local cmd="$ETCD_BIN_DIR/etcd"
cmd+=" --name $HOSTNAME --data-dir $ETCD_DATA_DIR"
cmd+=" --initial-cluster-state new --initial-cluster-token etcd-cluster-01"
cmd+=" --initial-cluster $HOSTNAME=http://$SERVICE_HOST:$ETCD_PEER_PORT"
cmd+=" --initial-advertise-peer-urls http://$SERVICE_HOST:$ETCD_PEER_PORT"
cmd+=" --advertise-client-urls http://$SERVICE_HOST:$ETCD_PORT"
if [ "$SERVICE_LISTEN_ADDRESS" == "::" ]; then
cmd+=" --listen-peer-urls http://[::]:$ETCD_PEER_PORT "
else
cmd+=" --listen-peer-urls http://0.0.0.0:$ETCD_PEER_PORT "
fi
cmd+=" --listen-client-urls http://$SERVICE_HOST:$ETCD_PORT"
if [ "$ENABLE_DEBUG_LOG_LEVEL" == "True" ]; then
cmd+=" --debug"
fi
local unitfile="$SYSTEMD_DIR/$ETCD_SYSTEMD_SERVICE"
write_user_unit_file $ETCD_SYSTEMD_SERVICE "$cmd" "" "root"
iniset -sudo $unitfile "Unit" "After" "network.target"
iniset -sudo $unitfile "Service" "Type" "notify"
iniset -sudo $unitfile "Service" "Restart" "on-failure"
iniset -sudo $unitfile "Service" "LimitNOFILE" "65536"
if is_arch "aarch64"; then
iniset -sudo $unitfile "Service" "Environment" "ETCD_UNSUPPORTED_ARCH=arm64"
fi
$SYSTEMCTL daemon-reload
$SYSTEMCTL enable $ETCD_SYSTEMD_SERVICE
$SYSTEMCTL start $ETCD_SYSTEMD_SERVICE
}
# stop_etcd3() stops the etcd3 process
function stop_etcd3 {
# Don't install in sub nodes (multinode scenario)
if [ "$SERVICE_HOST" != "$HOST_IP" ]; then
return
fi
$SYSTEMCTL stop $ETCD_SYSTEMD_SERVICE
}
function cleanup_etcd3 {
# Don't install in sub nodes (multinode scenario)
if [ "$SERVICE_HOST" != "$HOST_IP" ]; then
return
fi
$SYSTEMCTL disable $ETCD_SYSTEMD_SERVICE
local unitfile="$SYSTEMD_DIR/$ETCD_SYSTEMD_SERVICE"
sudo rm -f $unitfile
$SYSTEMCTL daemon-reload
if [[ "$ETCD_USE_RAMDISK" == "True" ]]; then
sudo umount $ETCD_DATA_DIR
fi
sudo rm -rf $ETCD_DATA_DIR
}
function install_etcd3 {
echo "Installing etcd"
# Create the necessary directories
sudo mkdir -p $ETCD_BIN_DIR
sudo mkdir -p $ETCD_DATA_DIR
if [[ "$ETCD_USE_RAMDISK" == "True" ]]; then
sudo mount -t tmpfs -o nodev,nosuid,size=${ETCD_RAMDISK_MB}M tmpfs $ETCD_DATA_DIR
fi
# Download and cache the etcd tgz for subsequent use
local etcd_file
etcd_file="$(get_extra_file $ETCD_DOWNLOAD_LOCATION)"
if [ ! -f "$FILES/etcd-$ETCD_VERSION-linux-$ETCD_ARCH/etcd" ]; then
echo "${ETCD_SHA256} $etcd_file" > $FILES/etcd.sha256sum
# NOTE(yuanke wei): rm the damaged file when checksum fails
sha256sum -c $FILES/etcd.sha256sum || (sudo rm -f $etcd_file; exit 1)
tar xzvf $etcd_file -C $FILES
sudo cp $FILES/$ETCD_NAME/etcd $ETCD_BIN_DIR/etcd
sudo cp $FILES/$ETCD_NAME/etcdctl $ETCD_BIN_DIR/etcdctl
fi
if [ ! -f "$ETCD_BIN_DIR/etcd" ]; then
sudo cp $FILES/$ETCD_NAME/etcd $ETCD_BIN_DIR/etcd
sudo cp $FILES/$ETCD_NAME/etcdctl $ETCD_BIN_DIR/etcdctl
fi
}
# Restore xtrace
$_XTRACE_ETCD3
# Tell emacs to use shell-script-mode
## Local variables:
## mode: shell-script
## End: