From a160098ecd6266caff2c268deb86c23ae6426710 Mon Sep 17 00:00:00 2001 From: gengchc2 Date: Mon, 17 Dec 2018 19:57:54 -0800 Subject: [PATCH] Download, and install elasticsearch server for freezer-api In devstack/pkg, there is an elasticsearch.sh for downloading, installing, starting and uninstalling of elasticsearch server, but it is not flexible. In the future, freezer-api needs to support ubuntu-xenial and ubuntu-bonic, which requires different elasticsearch server versions. In addition, the programming interface of elastic search server varies greatly before and after 5.0.0, which requires different code of freezer-api to support. Pre-5.0.0 version of elasticsearch server cannot be installed on ubuntu-bonic. For the convenience of modification, freezer-api maintains the elastic search.sh script by itself. Change-Id: Ie069e2fd1e29daf53d8b1490f152cd820df036fe --- devstack/lib/elasticsearch.sh | 148 ++++++++++++++++++++++++++++++++++ devstack/lib/freezer-api | 13 +-- 2 files changed, 155 insertions(+), 6 deletions(-) create mode 100755 devstack/lib/elasticsearch.sh diff --git a/devstack/lib/elasticsearch.sh b/devstack/lib/elasticsearch.sh new file mode 100755 index 00000000..c943e3e4 --- /dev/null +++ b/devstack/lib/elasticsearch.sh @@ -0,0 +1,148 @@ +#!/bin/bash -xe + +# basic reference point for things like filecache +# +# TODO(sdague): once we have a few of these I imagine the download +# step can probably be factored out to something nicer +TOP_DIR=$(cd $DEST/devstack && pwd) +FILES=$TOP_DIR/files +source $TOP_DIR/stackrc + +# Package source and version, all pkg files are expected to have +# something like this, as well as a way to override them. +ELASTICSEARCH_VERSION=${ELASTICSEARCH_VERSION:-1.7.5} +ELASTICSEARCH_BASEURL=${ELASTICSEARCH_BASEURL:-https://download.elasticsearch.org/elasticsearch/elasticsearch} + +# Elastic search actual implementation +function wget_elasticsearch { + local file=${1} + + if [ ! -f ${FILES}/${file} ]; then + wget $ELASTICSEARCH_BASEURL/${file} -O ${FILES}/${file} + fi + + if [ ! -f ${FILES}/${file}.sha1.txt ]; then + wget $ELASTICSEARCH_BASEURL/${file}.sha1.txt -O ${FILES}/${file}.sha1.txt + fi + + pushd ${FILES}; sha1sum ${file} > ${file}.sha1.gen; popd + + if ! diff ${FILES}/${file}.sha1.gen ${FILES}/${file}.sha1.txt; then + echo "Invalid elasticsearch download. Could not install." + return 1 + fi + return 0 +} + +function download_elasticsearch { + if is_ubuntu; then + wget_elasticsearch elasticsearch-${ELASTICSEARCH_VERSION}.deb + elif is_fedora || is_suse; then + wget_elasticsearch elasticsearch-${ELASTICSEARCH_VERSION}.noarch.rpm + fi +} + +function configure_elasticsearch { + # currently a no op + : +} + +function _check_elasticsearch_ready { + # poll elasticsearch to see if it's started + if ! wait_for_service 120 http://localhost:9200; then + die $LINENO "Maximum timeout reached. Could not connect to ElasticSearch" + fi +} + +function start_elasticsearch { + if is_ubuntu; then + sudo /etc/init.d/elasticsearch start + _check_elasticsearch_ready + elif is_fedora; then + sudo /bin/systemctl start elasticsearch.service + _check_elasticsearch_ready + elif is_suse; then + sudo /usr/bin/systemctl start elasticsearch.service + _check_elasticsearch_ready + else + echo "Unsupported architecture...can not start elasticsearch." + fi +} + +function stop_elasticsearch { + if is_ubuntu; then + sudo /etc/init.d/elasticsearch stop + elif is_fedora; then + sudo /bin/systemctl stop elasticsearch.service + elif is_suse ; then + sudo /usr/bin/systemctl stop elasticsearch.service + else + echo "Unsupported architecture...can not stop elasticsearch." + fi +} + +function install_elasticsearch { + pip_install_gr elasticsearch + if is_package_installed elasticsearch; then + echo "Note: elasticsearch was already installed." + return + fi + if is_ubuntu; then + is_package_installed default-jre-headless || install_package default-jre-headless + + sudo dpkg -i ${FILES}/elasticsearch-${ELASTICSEARCH_VERSION}.deb + sudo update-rc.d elasticsearch defaults 95 10 + elif is_fedora; then + is_package_installed java-1.8.0-openjdk-headless || install_package java-1.8.0-openjdk-headless + yum_install ${FILES}/elasticsearch-${ELASTICSEARCH_VERSION}.noarch.rpm + sudo /bin/systemctl daemon-reload + sudo /bin/systemctl enable elasticsearch.service + elif is_suse; then + is_package_installed java-1_8_0-openjdk-headless || install_package java-1_8_0-openjdk-headless + zypper_install --no-gpg-checks ${FILES}/elasticsearch-${ELASTICSEARCH_VERSION}.noarch.rpm + sudo /usr/bin/systemctl daemon-reload + sudo /usr/bin/systemctl enable elasticsearch.service + else + echo "Unsupported install of elasticsearch on this architecture." + fi +} + +function uninstall_elasticsearch { + if is_package_installed elasticsearch; then + if is_ubuntu; then + sudo apt-get purge elasticsearch + elif is_fedora; then + sudo yum remove elasticsearch + elif is_suse; then + sudo zypper rm elasticsearch + else + echo "Unsupported install of elasticsearch on this architecture." + fi + fi +} + +# The PHASE dispatcher. All pkg files are expected to basically cargo +# cult the case statement. +PHASE=$1 +echo "Phase is $PHASE" + +case $PHASE in + download) + download_elasticsearch + ;; + install) + install_elasticsearch + ;; + configure) + configure_elasticsearch + ;; + start) + start_elasticsearch + ;; + stop) + stop_elasticsearch + ;; + uninstall) + uninstall_elasticsearch + ;; +esac \ No newline at end of file diff --git a/devstack/lib/freezer-api b/devstack/lib/freezer-api index a9d04dc4..5908a8a5 100644 --- a/devstack/lib/freezer-api +++ b/devstack/lib/freezer-api @@ -48,6 +48,7 @@ XTRACE=$(set +o | grep xtrace) set +o xtrace +source $FREEZER_API_DIR/devstack/lib/elasticsearch.sh # Functions # --------- @@ -63,7 +64,7 @@ function cleanup_freezer_api { disable_apache_site freezer-api sudo rm -f $(apache_site_config_for freezer-api) if [[ "${FREEZER_BACKEND}" != "sqlalchemy" ]]; then - ${TOP_DIR}/pkg/elasticsearch.sh uninstall + uninstall_elasticsearch fi sudo rm -rf $FREEZER_API_AUTH_CACHE_DIR $FREEZER_API_CONF_DIR } @@ -74,8 +75,8 @@ function install_freezer_api { git_clone $FREEZER_API_REPO $FREEZER_API_DIR $FREEZER_API_BRANCH if [[ "${FREEZER_BACKEND}" != "sqlalchemy" ]]; then - ${TOP_DIR}/pkg/elasticsearch.sh download - ${TOP_DIR}/pkg/elasticsearch.sh install + download_elasticsearch + install_elasticsearch fi setup_develop $FREEZER_API_DIR @@ -166,7 +167,7 @@ function init_freezer_api { else # this also waits for elasticsearch to start - ${TOP_DIR}/pkg/elasticsearch.sh start + start_elasticsearch # put elasticsearch mappings freezer-manage db update freezer-manage db show @@ -201,7 +202,7 @@ function start_freezer_api { function stop_freezer_api { if [[ "${FREEZER_BACKEND}" != "sqlalchemy" ]]; then - ${TOP_DIR}/pkg/elasticsearch.sh stop + stop_elasticsearch fi if [[ "${FREEZER_API_SERVER_TYPE}" == "uwsgi" ]]; then @@ -330,4 +331,4 @@ function configure_uwsgi_freezer_api_app { } # Restore xtrace -$XTRACE +$XTRACE \ No newline at end of file