From 22c3ac823a92d9c8aafde2ca89958d8500d4709a Mon Sep 17 00:00:00 2001 From: Steven Hardy Date: Fri, 14 Dec 2012 15:33:40 +0000 Subject: [PATCH] Add ubuntu version of tools/openstack Initial version of the tools/openstack install script to simplify install/ testing on Ubuntu - tested on 12.04LTS (with the included Essex packages) 12.10 testing TODO ref bug 1083507 Signed-off-by: Steven Hardy Change-Id: I450b20e18dfa3099cfd17152b5ec61cc34122665 --- tools/openstack_ubuntu | 342 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 342 insertions(+) create mode 100755 tools/openstack_ubuntu diff --git a/tools/openstack_ubuntu b/tools/openstack_ubuntu new file mode 100755 index 00000000..ddf44ad3 --- /dev/null +++ b/tools/openstack_ubuntu @@ -0,0 +1,342 @@ +#!/bin/bash +# vim: tabstop=4 shiftwidth=4 softtabstop=4 +# Copyright (C) 2012, Red Hat, Inc. +# Steven Hardy +# Based on tools/openstack +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +BASE_DIR=`dirname $0` +action=$1 +if [ -z "$action" ] +then + echo "openstack [start|stop|install|erase|status]" + echo + echo "This tool is designed to control OpenStack on an Ubuntu 12.XX system" + echo "It installs a minimal openstack environment in order to demonstrate heat functionality" + echo "Note swift and the horizon dashboard are not installed" + echo + echo "start - Starts OpenStack" + echo "stop - Stops OpenStack" + echo "restart - Restart OpenStack" + echo "install - Installs a fresh OpenStack system with Keystone from repostories" + echo "erase - permanently destroys an existing installation of OpenStack" +fi + +BASE_SERVICES="tgt mysql" +OS_SERVICES="nova-compute nova-cert nova-vncproxy nova-objectstore keystone nova-api glance-registry nova-network nova-scheduler nova-volume glance-api keystone" + +OS_REQ_PACKAGES="bridge-utils rabbitmq-server memcached python-memcache kvm libvirt-bin tgt open-iscsi open-iscsi-utils mysql-server python-mysqldb" +OS_GLANCE_PACKAGES="glance glance-api glance-client glance-common glance-registry python-glance" +OS_KEYSTONE_PACKAGES="keystone python-keystone python-keystoneclient" +OS_NOVA_PACKAGES="nova-api nova-cert nova-common nova-compute nova-compute-kvm nova-doc nova-network nova-objectstore nova-scheduler nova-vncproxy nova-volume python-nova python-novaclient" + +INSTALL_CMD="sudo aptitude -y install" +UNINSTALL_CMD="sudo aptitude -y purge" + +os_status () { + for service in ${BASE_SERVICES} + do + output=$(initctl status ${service} | awk '{print $2}' | sed "s/,$//") + echo "$service ${output}" | awk '{ printf "%-40s %s\n", $1, $2}' + done + for service in ${OS_SERVICES} + do + output=$(initctl status ${service} | awk '{print $2}' | sed "s/,$//") + echo "$service ${output}" | awk '{ printf "%-40s %s\n", $1, $2}' + done +} + +OS_STATUS="OK" +os_check_status () { + # If a service is not running, we try again up to MAX_TRIES times + MAX_TRIES=5 + for service in ${OS_SERVICES} + do + attempts=0 + while [[ ${attempts} < ${MAX_TRIES} ]] + do + attempts=$((${attempts} + 1)) + output=$(initctl status $service) + running=$(initctl status $service | cut -d"/" -f2 | sed "s/,.*$//") + if [[ ${running} != "running" ]] + then + echo "Service ${service} does not seem to be running, waiting 1s ${attempts}/${MAX_TRIES}" + OS_STATUS="FAIL ${service} : ${running}" + sleep 1 + else + echo "${service} ${running}" | awk '{ printf "%-40s %s\n", $1, $2}' + OS_STATUS="OK" + break + fi + done + + # If we get here and OS_STATUS != OK then we return as something failed + if [[ ${OS_STATUS} != "OK" ]] + then + echo "Service ${service} has failed to start, check logs for errors" + break + fi + done +} + +DBPW="" +db_get_pw() { + # If we're passed a -r rootpw argument, use it, + # Otherwise, prompt for a password + # Note we use the service name for the password, which is the default + # behavior of the Fedora openstack-utils openstack-db script + # Obviously this is only suitable for a development/demo installation + if [ $# -eq 2 ] + then + if [ $1 = "-r" ] + then + DBPW=$2 + fi + else + echo "Enter mysql root password" + read -s DBPW + fi +} + +db_setup () { + db_get_pw $@ + for APP in nova glance keystone + do + MYSQL_APP_PW=${APP} + echo "Creating '$APP' database." >&2 + mysql -u root --password=${DBPW} <&2 + mysql -u root --password=${DBPW} <&2 + $UNINSTALL_CMD $OS_GLANCE_PACKAGES + echo "$UNINSTALL_CMD $OS_NOVA_PACKAGES" >&2 + $UNINSTALL_CMD $OS_NOVA_PACKAGES + echo "$UNINSTALL_CMD $OS_KEYSTONE_PACKAGES" >&2 + $UNINSTALL_CMD $OS_KEYSTONE_PACKAGES + + db_drop $@ + + sudo vgchange -an nova-volumes + sudo losetup -d /dev/loop0 + sudo rm -f /var/lib/nova/nova-volumes.img + sudo rm -rf /etc/{glance,nova,swift,keystone,openstack-dashboard} /var/lib/{glance,nova,swift,keystone} /var/log/{glance,nova,swift,keystone} /var/run/{glance,nova,swift,keystone} + rm -f $HOME/.openstack/.keystonerc +} + +get_id () { + echo `$@ | awk '/ id / { print $4 }'` +} + +os_install () { + + echo "Installing prerequisite packages" >&2 + ${INSTALL_CMD} ${OS_REQ_PACKAGES} + echo "Installing Glance packages" >&2 + ${INSTALL_CMD} ${OS_GLANCE_PACKAGES} + echo "Installing Keystone packages" >&2 + ${INSTALL_CMD} ${OS_KEYSTONE_PACKAGES} + echo "Installing Nova packages" >&2 + ${INSTALL_CMD} ${OS_NOVA_PACKAGES} + + echo "Setting up /var/lib/nova/nova-volumes.img" >&2 + sudo dd if=/dev/zero of=/var/lib/nova/nova-volumes.img bs=1M seek=20k count=0 + # Configure the databases + db_setup $* + + # Create a keystone RC file + mkdir -p $HOME/.openstack + TOKEN=$(openssl rand -hex 10) + cat > $HOME/.openstack/keystonerc <> /etc/nova/nova.conf + sudo echo "--sql_connection=mysql://nova:nova@127.0.0.1/nova" >> /etc/nova/nova.conf + nova-manage db sync + + # Configure glance to use keystone + sudo sed -i "s/^admin_tenant_name = %SERVICE_TENANT_NAME%/admin_tenant_name = service/" /etc/glance/glance-api-paste.ini + sudo sed -i "s/admin_user = %SERVICE_USER%/admin_user = glance/" /etc/glance/glance-api-paste.ini + sudo sed -i "s/admin_password = %SERVICE_PASSWORD%/admin_password = $SERVICE_PASSWORD/" /etc/glance/glance-api-paste.ini + sudo sed -i "s/^admin_tenant_name = %SERVICE_TENANT_NAME%/admin_tenant_name = service/" /etc/glance/glance-registry-paste.ini + sudo sed -i "s/admin_user = %SERVICE_USER%/admin_user = glance/" /etc/glance/glance-registry-paste.ini + sudo sed -i "s/admin_password = %SERVICE_PASSWORD%/admin_password = $SERVICE_PASSWORD/" /etc/glance/glance-registry-paste.ini + sed -i "s/^sql_connection =.*$/sql_connection = mysql:\/\/glance:glance@127.0.0.1\/glance/" /etc/glance/glance-registry.conf + cat >> /etc/glance/glance-registry.conf << EOF +[paste_deploy] +flavor = keystone +EOF + cat >> /etc/glance/glance-api.conf << EOF +[paste_deploy] +flavor = keystone +EOF + glance-manage version_control 0 + glance-manage db_sync + + # Restart all services and clear logfiles + os_stop + sleep 1 + sudo rm -rf /var/log/{glance,nova,swift,keystone}/* + os_start + sleep 1 + echo "Installation Complete." + + echo "Checking all expected services are running" + os_check_status + if [[ ${OS_STATUS} != "OK" ]] + then + echo "Service failed to start : ${OS_STATUS}, cannot continue" + exit 1 + fi + + echo "Testing nova and glance. If any errors are displayed, the install failed..." + # Create additional flavors required by heat templates + ${BASE_DIR}/nova_create_flavors.sh + nova flavor-list + glance index + echo + echo "note: This tool does not create a network. Creating a network" + echo "depends on your environment. An example network create operation:" + echo + echo " sudo nova-manage network create --label=demonet --fixed_range_v4=192.168.250.0/24 --bridge_interface=demonetbr0" + echo + echo -e "The network range here should *not* be one used on your existing physical\n network." + echo "It should be a range dedicated for the network that OpenStack will configure." + echo "If 10.0.0.0/24 clashes with your local network, pick another range." +} + +case $action in + "") + ;; + start) + os_start + ;; + stop) + os_stop + ;; + restart) + os_restart + ;; + erase) + shift + os_erase $* + ;; + install) + shift + os_install $* + ;; + status) + os_status + ;; + *) + echo "The action \"$action\" is not supported." + ;; +esac -- 2.45.2