murano-deployment/devbox-scripts/murano-git-install.sh

625 lines
19 KiB
Bash
Executable File

#!/bin/bash
#set -o xtrace
mode=${1:-'help'}
curr_dir=$(cd $(dirname "$0") && pwd)
murano_components='murano-api murano-conductor murano-dashboard'
murano_services='murano-api murano-conductor'
murano_config_files='/etc/murano-api/murano-api.conf
/etc/murano-api/murano-api-paste.ini
/etc/murano-conductor/conductor.conf
/etc/murano-conductor/conductor-paste.ini
/etc/murano-conductor/data/init.ps1
/etc/murano-conductor/data/templates/agent-config/Default.template
/usr/share/openstack-dashboard/openstack_dashboard/settings.py'
git_prefix="https://github.com/stackforge"
git_clone_root='/opt/git'
os_version=''
# Helper funtions
#-------------------------------------------------
function die {
printf "\n==============================\n"
printf "$@"
printf "\n==============================\n"
exit 1
}
function log {
printf "%s\n" "$@" | tee --append /tmp/murano-git-install.log
}
function iniset {
local section=$1
local option=$2
local value=$3
local file=$4
local line
if [ -z "$section" ] ; then
# No section name specified
sed -i -e "s/^\($option[ \t]*=[ \t]*\).*$/\1$value/" "$file"
else
# Check if section already exists
if ! grep -q "^\[$section\]" "$file" ; then
# Add section at the end
echo -e "\n[$section]" >>"$file"
fi
# Check if parameter in the section exists
line=$(sed -ne "/^\[$section\]/,/^\[.*\]/ { /^$option[ \t]*=/ p; }" "$file")
if [ -z "$line" ] ; then
# Add parameter if it is not exists
sed -i -e "/^\[$section\]/ a\\
$option = $value
" "$file"
else
# Replace existing parameter
sed -i -e "/^\[$section\]/,/^\[.*\]/ s|^\($option[ \t]*=[ \t]*\).*$|\1$value|" "$file"
fi
fi
}
function replace {
local what_replace=$1
local replace_with=$2
local file=$3
sed -i "s/$what_replace/$replace_with/g" "$file"
}
function generate_sample_certificate {
local location=$1
local cert_name=$2
local old_pwd=$(pwd)
cd $location
openssl genrsa -des3 -passout pass:x -out "$cert_name.pass.key" 2048
openssl rsa -passin pass:x -in "$cert_name.pass.key" -out "$cert_name.key"
rm "$cert_name.pass.key"
openssl req -new \
-subj "/C=RU" \
-subj "/ST=Center" \
-subj "/L=Moscow" \
-subj "/O=Mirantis" \
-subj "/OU=Murano" \
-subj "/CN=murano" \
-subj "/emailAddress=murano-all@mirantis.com" \
-key "$cert_name.key" -out "$cert_name.csr"
openssl x509 -req -days 365 \
-in "$cert_name.csr" \
-signkey "$cert_name.key" \
-out "$cert_name.crt"
cd $old_pwd
}
#-------------------------------------------------
# Workflow functions
#-------------------------------------------------
function install_prerequisites {
case $os_version in
'CentOS')
log "** Installing additional software sources ..."
yum install -y 'http://rdo.fedorapeople.org/openstack/openstack-grizzly/rdo-release-grizzly.rpm'
yum install -y 'http://mirror.yandex.ru/epel/6/x86_64/epel-release-6-8.noarch.rpm'
log "** Updating system ..."
yum update -y
log "** Upgrading pip ..."
pip install --upgrade pip
#rm /usr/bin/pip
#ln -s /usr/local/bin/pip /usr/bin/pip
log "** Installing OpenStack dashboard ..."
yum install make gcc python-netaddr.noarch python-keystoneclient.noarch python-django-horizon.noarch python-django-openstack-auth.noarch httpd.x86_64 mod_wsgi.x86_64 openstack-dashboard.noarch --assumeyes
log "** Disabling firewall ..."
service iptables stop
chkconfig iptables off
log "** Disabling SELinux ..."
setenforce permissive
iniset '' 'SELINUX' 'permissive' '/etc/selinux/config'
;;
'Ubuntu')
log "** Installing additional software sources ..."
echo 'deb http://ubuntu-cloud.archive.canonical.com/ubuntu precise-updates/grizzly main' > /etc/apt/sources.list.d/grizzly.list
apt-get install -y ubuntu-cloud-keyring
log "** Updating system ..."
apt-get update -y
apt-get upgrade -y
log "** Installing additional packages ..."
apt-get install -y node-less python-pip
log "** Upgrading pip ..."
pip install --upgrade pip
rm /usr/bin/pip
ln -s /usr/local/bin/pip /usr/bin/pip
log "** Upgrading pbr ..."
pip install --upgrade pbr
log "** Installing OpenStack dashboard ..."
apt-get install -y memcached libapache2-mod-wsgi openstack-dashboard
log "** Removing Ubuntu Dashboard Theme ..."
dpkg --purge openstack-dashboard-ubuntu-theme
log "** Restarting Apache server ..."
service apache2 restart
;;
esac
}
function fetch_murano_apps {
RETURN=''
for app_name in $murano_components ; do
log ''
log ''
log "*** Working with '$app_name'"
git_repo="$git_prefix/$app_name.git"
git_clone_dir="$git_clone_root/$app_name"
case $app_name in
'murano-api')
REMOTE_BRANCH=${BRANCH_MURANO_API:-$BRANCH_NAME}
;;
'murano-conductor')
REMOTE_BRANCH=${BRANCH_MURANO_CONDUCTOR:-$BRANCH_NAME}
;;
'python-muranoclient')
REMOTE_BRANCH=${BRANCH_MURANO_CLIENT:-$BRANCH_NAME}
;;
'murano-dashboard')
REMOTE_BRANCH=${BRANCH_MURANO_DASHBOARD:-$BRANCH_NAME}
;;
*)
REMOTE_BRANCH=$BRANCH_NAME
;;
esac
local do_checkout=''
if [ -d "$git_clone_dir" ] ; then
cd "$git_clone_dir"
git reset --hard
git clean -fd
git remote update || die "'git remote update' failed for '$git_repo'"
rev_on_local=$(git rev-list --max-count=1 HEAD)
if [[ "$REMOTE_BRANCH" =~ ^refs ]] ; then
git fetch "$git_repo" "$REMOTE_BRANCH"
rev_on_origin=$(git rev-list --max-count=1 FETCH_HEAD)
else
rev_on_origin=$(git rev-list --max-count=1 origin/$REMOTE_BRANCH)
fi
log "* Revision on local = $rev_on_local"
log "* Revision on origin = $rev_on_origin"
if [[ "$rev_on_local" != "$rev_on_origin" ]] ; then
do_checkout=$app_name
fi
else
git clone $git_repo $git_clone_dir || die "Unable to clone repository '$git_repo'"
cd "$git_clone_dir"
do_checkout=$app_name
fi
if [ -z $do_checkout ] ; then
log "* '$app_name' is up-to-date."
log "----- ----- ----- ----- -----"
log "(git status):"
git status
log "***** ***** ***** ***** *****"
log "(git log -1):"
git --no-pager log -1
log "===== ===== ===== ===== ====="
else
if [[ "$REMOTE_BRANCH" =~ ^refs ]] ; then
git fetch "$git_repo" "$REMOTE_BRANCH" && git checkout FETCH_HEAD
else
if [ -n "$(git branch | grep $REMOTE_BRANCH)" ] ; then
log "* branch '$REMOTE_BRANCH' found locally, updating ..."
git checkout $REMOTE_BRANCH
else
log "* branch '$REMOTE_BRANCH' not found locally, fetching ..."
git checkout -b $REMOTE_BRANCH origin/$REMOTE_BRANCH
fi
git pull
fi
log "* Switched to '$REMOTE_BRANCH':"
log "----- ----- ----- ----- -----"
log "(git log -1):"
git --no-pager log -1
log "===== ===== ===== ===== ====="
RETURN="$RETURN $app_name"
fi
done
}
function install_murano_apps {
local apps_list="$@"
log "** Installing Murano components '$apps_list'..."
for app_name in $apps_list ; do
log "** Installing '$app_name' ..."
git_clone_dir="$git_clone_root/$app_name"
chmod +x $git_clone_dir/setup*.sh
case $os_version in
'CentOS')
"$git_clone_dir"/setup-centos.sh install
;;
'Ubuntu')
"$git_clone_dir"/setup.sh install
;;
esac
done
}
function uninstall_murano_apps {
local apps_list="$@"
log "** Uninstalling Murano components '$apps_list'..."
for app_name in $apps_list ; do
log "** Uninstalling '$app_name' ..."
git_clone_dir="$git_clone_root/$app_name"
chmod +x $git_clone_dir/setup*.sh
case $os_version in
'CentOS')
"$git_clone_dir"/setup-centos.sh uninstall
;;
'Ubuntu')
"$git_clone_dir"/setup.sh uninstall
;;
esac
case $app_name in
'murano-api')
rm -rf /etc/$app_name
;;
'murano-conductor')
rm -rf /etc/$app_name
;;
esac
done
}
function configure_murano {
log "** Configuring Murano ..."
for config_file in $murano_config_files ; do
log "** Configuring file '$config_file'"
if [ ! -f "$config_file" ] ; then
cp "$config_file.sample" "$config_file"
fi
case "$config_file" in
'/etc/murano-api/murano-api.conf')
iniset 'DEFAULT' 'log_file' '/var/log/murano-api.log' "$config_file"
iniset 'rabbitmq' 'host' "$RABBITMQ_HOST" "$config_file"
iniset 'rabbitmq' 'login' "$RABBITMQ_LOGIN" "$config_file"
iniset 'rabbitmq' 'password' "$RABBITMQ_PASSWORD" "$config_file"
iniset 'rabbitmq' 'virtual_host' "$RABBITMQ_VHOST" "$config_file"
iniset 'rabbitmq' 'ssl' "False" "$config_file"
;;
'/etc/murano-api/murano-api-paste.ini')
sed -i -e "s/^\(\[pipeline:\)api.py/\1murano-api/" "$config_file" # Ugly workaround
iniset 'filter:authtoken' 'auth_host' "$LAB_HOST" "$config_file"
iniset 'filter:authtoken' 'admin_user' "$ADMIN_USER" "$config_file"
iniset 'filter:authtoken' 'admin_password' "$ADMIN_PASSWORD" "$config_file"
;;
'/etc/murano-conductor/conductor.conf')
iniset 'DEFAULT' 'log_file' '/var/log/murano-conductor.log' "$config_file"
iniset 'keystone' 'auth_url' "$AUTH_URL" "$config_file"
iniset 'rabbitmq' 'host' "$RABBITMQ_HOST" "$config_file"
iniset 'rabbitmq' 'login' "$RABBITMQ_LOGIN" "$config_file"
iniset 'rabbitmq' 'password' "$RABBITMQ_PASSWORD" "$config_file"
iniset 'rabbitmq' 'virtual_host' "$RABBITMQ_VHOST" "$config_file"
iniset 'rabbitmq' 'ssl' "False" "$config_file"
;;
'/etc/openstack-dashboard/local_settings')
iniset '' 'OPENSTACK_HOST' "'$LAB_HOST'" "$config_file"
;;
'/etc/openstack-dashboard/local_settings.py')
iniset '' 'OPENSTACK_HOST' "'$LAB_HOST'" "$config_file"
;;
'/etc/murano-conductor/data/init.ps1')
[ -n "$FILE_SHARE_HOST" ] && \
replace '%MURANO_SERVER_ADDRESS%' "$FILE_SHARE_HOST" "$config_file"
;;
'/etc/murano-conductor/data/templates/agent-config/Default.template')
[ -n "$RABBITMQ_HOST_ALT" ] && \
replace '%RABBITMQ_HOST%' "$RABBITMQ_HOST_ALT" "$config_file"
;;
esac
if [ "$SSL_ENABLED" = 'true' ] ; then
case "$config_file" in
'/etc/murano-api/murano-api.conf')
generate_sample_certificate '/etc/murano-api' 'server'
iniset 'ssl' 'cert_file' '/etc/murano-api/server.crt' "$config_file"
iniset 'ssl' 'key_file' '/etc/murano-api/server.key' "$config_file"
iniset 'rabbitmq' 'ssl' "True" "$config_file"
;;
'/etc/murano-api/murano-api-paste.ini')
iniset 'filter:authtoken' 'auth_protocol' 'https' "$config_file"
;;
'/etc/murano-conductor/conductor.conf')
local ssl_insecure='True'
# If any variable is not empty then ssl_insecure = False
if [ -n "${SSL_CA_FILE}${SSL_CERT_FILE}${SSL_KEY_FILE}" ] ; then
ssl_insecure='False'
fi
iniset 'keystone' 'ca_file' "$SSL_CA_FILE" "$config_file"
iniset 'keystone' 'cert_file' "$SSL_CERT_FILE" "$config_file"
iniset 'keystone' 'key_file' "$SSL_KEY_FILE" "$config_file"
iniset 'keystone' 'insecure' "$ssl_insecure" "$config_file"
iniset 'heat' 'ca_file' "$SSL_CA_FILE" "$config_file"
iniset 'heat' 'cert_file' "$SSL_CERT_FILE" "$config_file"
iniset 'heat' 'key_file' "$SSL_KEY_FILE" "$config_file"
iniset 'heat' 'insecure' "$ssl_insecure" "$config_file"
iniset 'rabbitmq' 'ssl' "True" "$config_file"
;;
'/etc/murano-conductor/data/templates/agent-config/Default.template')
replace '%RABBITMQ_SSL%' 'true' "$config_file"
;;
'/usr/share/openstack-dashboard/openstack_dashboard/settings.py')
echo '' >> "$config_file"
echo "MURANO_API_INSECURE = True" >> "$config_file"
echo "MURANO_API_URL = 'https://localhost:8082'" >> "$config_file"
;;
'/etc/openstack-dashboard/local_settings'|'/etc/openstack-dashboard/local_settings.py')
cat << 'EOF' >> "$config_file"
#murano-git-install-block-start
OPENSTACK_SSL_NO_VERIFY = True
OPENSTACK_KEYSTONE_URL = "https://%s:5000/v2.0" % OPENSTACK_HOST
OPENSTACK_KEYSTONE_ADMIN_URL = "https://%s:35357/v2.0" % OPENSTACK_HOST
QUANTUM_URL = "https://%s" % OPENSTACK_HOST
#murano-git-install-block-end
EOF
;;
esac
fi
done
}
function restart_murano {
for service_name in $murano_services ; do
log "** Restarting '$service_name'"
stop "$service_name"
start "$service_name"
done
log "** Restarting 'Apache'"
case $os_version in
'CentOS')
service httpd restart
;;
'Ubuntu')
service apache2 restart
;;
esac
}
#-------------------------------------------------
if [[ $mode =~ '?'|'help'|'-h'|'--help' ]] ; then
cat << EOF
The following options are awailable:
* help - show help. This is a default action.
* prerequisites - install prerequisites for Murano (OpenStack dashboard and other packages)
* install - install and configure Murano components. Please be sure that you have prerequisites installed first.
* reinstall - unisntall and then install all Murano components.
* uninstall - uninstall Murano components.
* update - fetch changes and reinstall components changed.
* configure - configure Murano components.
* restart - restart Murano components and Apache server
EOF
exit
fi
mkdir -p $git_clone_root
if [ -f /etc/redhat-release ] ; then
os_version=$(cat /etc/redhat-release | cut -d ' ' -f 1)
fi
if [ -f /etc/lsb-release ] ; then
os_version=$(cat /etc/lsb-release | grep DISTRIB_ID | cut -d '=' -f 2)
fi
if [ -z $os_version ] ; then
die "Unable to determine OS version. Exiting."
else
log "* OS version is '$os_version'"
fi
case $os_version in
'CentOS')
murano_config_files="$murano_config_files /etc/openstack-dashboard/local_settings"
;;
'Ubuntu')
murano_config_files="$murano_config_files /etc/openstack-dashboard/local_settings.py"
;;
esac
configuration_required=''
for config_file in $murano_config_files ; do
if [ ! -f "$config_file" ] ; then
log "! Required config file '$config_file' not exists. Murano should be configured before start."
configuration_required="$configuration_required $config_file"
fi
done
devbox_config='/etc/murano-deployment/lab-binding.rc'
if [ ! -f "$devbox_config" ] ; then
mkdir '/etc/murano-deployment'
cat << "EOF" > $devbox_config
# Vi / Vim notes
# * Press 'i' to enter INSERT mode
# * Edit the file
# * Press <ESC>, then type ':wq' to (w)rite changes and (q)uit editor.
LAB_HOST=''
ADMIN_USER=''
ADMIN_PASSWORD=''
RABBITMQ_LOGIN=''
RABBITMQ_PASSWORD=''
RABBITMQ_VHOST=''
#RABBITMQ_HOST=''
#RABBITMQ_HOST_ALT=''
#FILE_SHARE_HOST=''
BRANCH_NAME='release-0.2'
# Only 'true' or 'false' values are allowed!
SSL_ENABLED='false'
SSL_CA_FILE=''
SSL_CERT_FILE=''
SSL_KEY_FILE=''
#BRANCH_MURANO_API=''
#BRANCH_MURANO_DASHBOARD=''
#BRANCH_MURANO_CLIENT=''
#BRANCH_MURANO_CONDUCTOR=''
#-------------------------------------------------------------------------------
AUTH_PROTO=http
if [ "$SSL_ENABLED" = 'true' ] ; then
AUTH_PROTO=https
fi
AUTH_URL="$AUTH_PROTO://$LAB_HOST:5000/v2.0"
RABBITMQ_HOST=${RABBITMQ_HOST:-$LAB_HOST}
EOF
log "***** ***** ***** ***** *****"
log "Now you should configure lab binding settings in"
log " $devbox_config"
log "***** ***** ***** ***** *****"
printf '\n\n'
read -p "Press <Enter> to start editing the file in 'vi' ... "
if [ -f "$devbox_config" ] ; then
vi "$devbox_config"
fi
fi
if [ ! -f "$devbox_config" ] ; then
die "Configuration file '$devbox_config' not found."
fi
source "$devbox_config"
SSL_ENABLED=${SSL_ENABLED:-'false'}
log "* Running mode '$mode'"
case $mode in
'fetch')
fetch_murano_apps
;;
'install')
fetch_murano_apps
install_murano_apps $murano_components
configure_murano
restart_murano
;;
'reinstall')
fetch_murano_apps
uninstall_murano_apps $murano_components
install_murano_apps $murano_components
configure_murano
restart_murano
;;
'uninstall')
uninstall_murano_apps $murano_components
;;
'configure')
configure_murano
restart_murano
;;
'prerequisites')
install_prerequisites
;;
'update')
fetch_murano_apps
log ''
log "List of updated apps:"
log "***** ***** ***** ***** *****"
log $RETURN
log "***** ***** ***** ***** *****"
;;
'upgrade')
fetch_murano_apps
apps_list=$RETURN
if [ -n "$apps_list" ] ; then
uninstall_murano_apps $apps_list
install_murano_apps $apps_list
restart_murano
fi
;;
'restart')
restart_murano
;;
esac