#!/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_DOWNLOAD_URL=${ETCD_DOWNLOAD_URL:-https://github.com/coreos/etcd/releases/download} ETCD_VERSION=${ETCD_VERSION:-v3.1.7} ETCD_DATA_DIR="$DEST/data/etcd" ETCD_SYSTEMD_SERVICE="devstack@etcd.service" ETCD_BIN_DIR="$DEST/bin" ETCD_SHA256_AMD64="4fde194bbcd259401e2b5c462dfa579ee7f6af539f13f130b8f5b4f52e3b3c52" # NOTE(sdague): etcd v3.1.7 doesn't have anything for these architectures, though 3.2.0 does. ETCD_SHA256_ARM64="" ETCD_SHA256_PPC64="" ETCD_PORT=2379 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 { # Don't install in sub nodes (multinode scenario) if [ "$SERVICE_HOST" != "$HOST_IP" ]; then return fi _install_etcd 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:2380" cmd+=" --initial-advertise-peer-urls http://$SERVICE_HOST:2380" cmd+=" --advertise-client-urls http://$SERVICE_HOST:$ETCD_PORT" cmd+=" --listen-peer-urls http://0.0.0.0:2380 " cmd+=" --listen-client-urls http://$SERVICE_HOST:$ETCD_PORT" 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" $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 sudo rm -rf $ETCD_DATA_DIR } function _install_etcd { echo "Installing etcd" # Make sure etcd3 downloads the correct architecture if is_arch "x86_64"; then ETCD_ARCH="amd64" ETCD_SHA256=${ETCD_SHA256:-$ETCD_SHA256_AMD64} elif is_arch "aarch64"; then ETCD_ARCH="arm64" ETCD_SHA256=${ETCD_SHA256:-$ETCD_SHA256_ARM64} elif is_arch "ppc64le"; then ETCD_ARCH="ppc64le" ETCD_SHA256=${ETCD_SHA256:-$ETCD_SHA256_PPC64} else exit_distro_not_supported "invalid hardware type - $ETCD_ARCH" fi ETCD_NAME=etcd-$ETCD_VERSION-linux-$ETCD_ARCH # Install the libraries needed. Note: tooz for example does not have a hard dependency on these libraries pip_install etcd3 pip_install etcd3gw # Create the necessary directories sudo mkdir -p $ETCD_BIN_DIR sudo mkdir -p $ETCD_DATA_DIR # Download and cache the etcd tgz for subsequent use if [ ! -f "$FILES/etcd-$ETCD_VERSION-linux-$ETCD_ARCH/etcd" ]; then ETCD_DOWNLOAD_FILE=$ETCD_NAME.tar.gz wget $ETCD_DOWNLOAD_URL/$ETCD_VERSION/$ETCD_DOWNLOAD_FILE -O $FILES/$ETCD_DOWNLOAD_FILE echo "${ETCD_SHA256} $FILES/${ETCD_DOWNLOAD_FILE}" > $FILES/etcd.sha256sum # NOTE(sdague): this should go fatal if this fails sha256sum -c $FILES/etcd.sha256sum tar xzvf $FILES/$ETCD_DOWNLOAD_FILE -C $FILES sudo cp $FILES/$ETCD_NAME/etcd $ETCD_BIN_DIR/etcd fi if [ ! -f "$ETCD_BIN_DIR/etcd" ]; then sudo cp $FILES/$ETCD_NAME/etcd $ETCD_BIN_DIR/etcd fi } # Restore xtrace $_XTRACE_ETCD3 # Tell emacs to use shell-script-mode ## Local variables: ## mode: shell-script ## End: