lib/etcd3
546656fc
 #!/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
08367bac
 ETCD_DATA_DIR="$DATA_DIR/etcd"
546656fc
 ETCD_SYSTEMD_SERVICE="devstack@etcd.service"
 ETCD_BIN_DIR="$DEST/bin"
6757a9c5
 # 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.
1516e720
 ETCD_USE_RAMDISK=$(trueorfalse True ETCD_USE_RAMDISK)
6757a9c5
 ETCD_RAMDISK_MB=${ETCD_RAMDISK_MB:-512}
546656fc
 
 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"
27367bea
     cmd+=" --initial-cluster $HOSTNAME=http://$SERVICE_HOST:$ETCD_PEER_PORT"
     cmd+=" --initial-advertise-peer-urls http://$SERVICE_HOST:$ETCD_PEER_PORT"
146332e3
     cmd+=" --advertise-client-urls http://$SERVICE_HOST:$ETCD_PORT"
     if [ "$SERVICE_LISTEN_ADDRESS" == "::" ]; then
27367bea
         cmd+=" --listen-peer-urls http://[::]:$ETCD_PEER_PORT "
146332e3
     else
27367bea
         cmd+=" --listen-peer-urls http://0.0.0.0:$ETCD_PEER_PORT "
146332e3
     fi
     cmd+=" --listen-client-urls http://$SERVICE_HOST:$ETCD_PORT"
119ee66c
     if [ "$ENABLE_DEBUG_LOG_LEVEL" == "True" ]; then
         cmd+=" --debug"
     fi
546656fc
 
     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"
eca7ce74
     if is_arch "aarch64"; then
         iniset -sudo $unitfile "Service" "Environment" "ETCD_UNSUPPORTED_ARCH=arm64"
     fi
546656fc
 
     $SYSTEMCTL daemon-reload
     $SYSTEMCTL enable $ETCD_SYSTEMD_SERVICE
     $SYSTEMCTL start $ETCD_SYSTEMD_SERVICE
 }
 
 # stop_etcd3() stops the etcd3 process
 function stop_etcd3 {
d8283fde
     # Don't install in sub nodes (multinode scenario)
     if [ "$SERVICE_HOST" != "$HOST_IP" ]; then
         return
     fi
 
546656fc
     $SYSTEMCTL stop $ETCD_SYSTEMD_SERVICE
 }
 
853b475b
 function cleanup_etcd3 {
d8283fde
     # Don't install in sub nodes (multinode scenario)
     if [ "$SERVICE_HOST" != "$HOST_IP" ]; then
         return
     fi
 
546656fc
     $SYSTEMCTL disable $ETCD_SYSTEMD_SERVICE
 
     local unitfile="$SYSTEMD_DIR/$ETCD_SYSTEMD_SERVICE"
     sudo rm -f $unitfile
 
     $SYSTEMCTL daemon-reload
 
6757a9c5
     if [[ "$ETCD_USE_RAMDISK" == "True" ]]; then
         sudo umount $ETCD_DATA_DIR
     fi
546656fc
     sudo rm -rf $ETCD_DATA_DIR
 }
 
62b56601
 function install_etcd3 {
546656fc
     echo "Installing etcd"
 
     # Create the necessary directories
     sudo mkdir -p $ETCD_BIN_DIR
     sudo mkdir -p $ETCD_DATA_DIR
6757a9c5
     if [[ "$ETCD_USE_RAMDISK" == "True" ]]; then
         sudo mount -t tmpfs -o nodev,nosuid,size=${ETCD_RAMDISK_MB}M tmpfs $ETCD_DATA_DIR
     fi
546656fc
 
     # Download and cache the etcd tgz for subsequent use
d8bb2206
     local etcd_file
     etcd_file="$(get_extra_file $ETCD_DOWNLOAD_LOCATION)"
6f962a2e
     if [ ! -f "$FILES/etcd-$ETCD_VERSION-linux-$ETCD_ARCH/etcd" ]; then
d8bb2206
         echo "${ETCD_SHA256} $etcd_file" > $FILES/etcd.sha256sum
c652a498
         # NOTE(yuanke wei): rm the damaged file when checksum fails
         sha256sum -c $FILES/etcd.sha256sum || (sudo rm -f $etcd_file; exit 1)
bba92412
 
d8bb2206
         tar xzvf $etcd_file -C $FILES
6f962a2e
         sudo cp $FILES/$ETCD_NAME/etcd $ETCD_BIN_DIR/etcd
ad180e0e
         sudo cp $FILES/$ETCD_NAME/etcdctl $ETCD_BIN_DIR/etcdctl
546656fc
     fi
     if [ ! -f "$ETCD_BIN_DIR/etcd" ]; then
6f962a2e
         sudo cp $FILES/$ETCD_NAME/etcd $ETCD_BIN_DIR/etcd
ad180e0e
         sudo cp $FILES/$ETCD_NAME/etcdctl $ETCD_BIN_DIR/etcdctl
546656fc
     fi
 }
 
 # Restore xtrace
 $_XTRACE_ETCD3
 
 # Tell emacs to use shell-script-mode
 ## Local variables:
 ## mode: shell-script
 ## End: