Merge "Move Nova account creation out of keystone_data.sh"
diff --git a/functions b/functions
index 0911557..3ee43d3 100644
--- a/functions
+++ b/functions
@@ -354,6 +354,18 @@
 }
 
 
+# Determine if current distribution is a Fedora-based distribution
+# (Fedora, RHEL, CentOS).
+# is_fedora
+function is_fedora {
+    if [[ -z "$os_VENDOR" ]]; then
+        GetOSVersion
+    fi
+
+    [ "$os_VENDOR" = "Fedora" ] || [ "$os_VENDOR" = "Red Hat" ] || [ "$os_VENDOR" = "CentOS" ]
+}
+
+
 # Determine if current distribution is a SUSE-based distribution
 # (openSUSE, SLE).
 # is_suse
@@ -366,6 +378,23 @@
 }
 
 
+# Exit after outputting a message about the distribution not being supported.
+# exit_distro_not_supported [optional-string-telling-what-is-missing]
+function exit_distro_not_supported {
+    if [[ -z "$DISTRO" ]]; then
+        GetDistro
+    fi
+
+    if [ $# -gt 0 ]; then
+        echo "Support for $DISTRO is incomplete: no support for $@"
+    else
+        echo "Support for $DISTRO is incomplete."
+    fi
+
+    exit 1
+}
+
+
 # git clone only if directory doesn't exist already.  Since ``DEST`` might not
 # be owned by the installation user, we create the directory and change the
 # ownership to the proper user.
@@ -598,12 +627,12 @@
         NO_UPDATE_REPOS=True
 
         apt_get install "$@"
+    elif is_fedora; then
+        yum_install "$@"
+    elif is_suse; then
+        zypper_install "$@"
     else
-        if is_suse; then
-            zypper_install "$@"
-        else
-            yum_install "$@"
-        fi
+        exit_distro_not_supported "installing packages"
     fi
 }
 
@@ -622,9 +651,11 @@
     if [[ "$os_PACKAGE" = "deb" ]]; then
         dpkg -l "$@" > /dev/null
         return $?
-    else
+    elif [[ "$os_PACKAGE" = "rpm" ]]; then
         rpm --quiet -q "$@"
         return $?
+    else
+        exit_distro_not_supported "finding if a package is installed"
     fi
 }
 
@@ -1032,20 +1063,20 @@
 function get_rootwrap_location() {
     local module=$1
 
-    if is_ubuntu || is_suse; then
-        echo "/usr/local/bin/$module-rootwrap"
-    else
+    if is_fedora; then
         echo "/usr/bin/$module-rootwrap"
+    else
+        echo "/usr/local/bin/$module-rootwrap"
     fi
 }
 
 # Get the path to the pip command.
 # get_pip_command
 function get_pip_command() {
-    if is_ubuntu || is_suse; then
-        echo "/usr/bin/pip"
-    else
+    if is_fedora; then
         echo "/usr/bin/pip-python"
+    else
+        echo "/usr/bin/pip"
     fi
 }
 
diff --git a/lib/cinder b/lib/cinder
index 9b9d50d..a43f0a1 100644
--- a/lib/cinder
+++ b/lib/cinder
@@ -195,8 +195,8 @@
         mkdir -p $CINDER_STATE_PATH/volumes
 
         if sudo vgs $VOLUME_GROUP; then
-            if [[ "$os_PACKAGE" = "rpm" ]]; then
-                # RPM doesn't start the service
+            if is_fedora || is_suse; then
+                # service is not started by default
                 start_service tgtd
             fi
 
@@ -245,9 +245,15 @@
             # do it in two steps
             sudo stop tgt || true
             sudo start tgt
-        else
+        elif is_fedora; then
             # bypass redirection to systemctl during restart
             sudo /sbin/service --skip-redirect tgtd restart
+        elif is_suse; then
+            restart_service tgtd
+        else
+            # note for other distros: unstack.sh also uses the tgt/tgtd service
+            # name, and would need to be adjusted too
+            exit_distro_not_supported "restarting tgt"
         fi
     fi
 
diff --git a/lib/databases/mysql b/lib/databases/mysql
index 60ea143..68e9adc 100644
--- a/lib/databases/mysql
+++ b/lib/databases/mysql
@@ -23,22 +23,28 @@
     if is_ubuntu; then
         MY_CONF=/etc/mysql/my.cnf
         MYSQL=mysql
-    else
+    elif is_fedora; then
         MY_CONF=/etc/my.cnf
-        if is_suse; then
-            MYSQL=mysql
-        else
-            MYSQL=mysqld
-        fi
+        MYSQL=mysqld
+    elif is_suse; then
+        MY_CONF=/etc/my.cnf
+        MYSQL=mysql
+    else
+        exit_distro_not_supported "mysql configuration"
     fi
 
     # Start mysql-server
-    if [[ "$os_PACKAGE" = "rpm" ]]; then
-        # RPM doesn't start the service
+    if is_fedora || is_suse; then
+        # service is not started by default
         start_service $MYSQL
-        # Set the root password - only works the first time
+    fi
+
+    # Set the root password - only works the first time. For Ubuntu, we already
+    # did that with debconf before installing the package.
+    if ! is_ubuntu; then
         sudo mysqladmin -u root password $DATABASE_PASSWORD || true
     fi
+
     # Update the DB to give user ‘$DATABASE_USER’@’%’ full control of the all databases:
     sudo mysql -uroot -p$DATABASE_PASSWORD -h127.0.0.1 -e "GRANT ALL PRIVILEGES ON *.* TO '$DATABASE_USER'@'%' identified by '$DATABASE_PASSWORD';"
 
@@ -84,10 +90,12 @@
         chmod 0600 $HOME/.my.cnf
     fi
     # Install mysql-server
-    if is_suse; then
+    if is_ubuntu || is_fedora; then
+        install_package mysql-server
+    elif is_suse; then
         install_package mysql-community-server
     else
-        install_package mysql-server
+        exit_distro_not_supported "mysql installation"
     fi
 }
 
diff --git a/lib/databases/postgresql b/lib/databases/postgresql
index d9c2f00..20ade85 100644
--- a/lib/databases/postgresql
+++ b/lib/databases/postgresql
@@ -20,7 +20,7 @@
 
 function configure_database_postgresql {
     echo_summary "Configuring and starting PostgreSQL"
-    if [[ "$os_PACKAGE" = "rpm" ]]; then
+    if is_fedora || is_suse; then
         PG_HBA=/var/lib/pgsql/data/pg_hba.conf
         PG_CONF=/var/lib/pgsql/data/postgresql.conf
         sudo [ -e $PG_HBA ] || sudo postgresql-setup initdb
@@ -53,10 +53,12 @@
     else
         sed -i "s/:root:\w\+/:root:$DATABASE_PASSWORD/" $PGPASS
     fi
-    if [[ "$os_PACKAGE" = "rpm" ]]; then
+    if is_ubuntu; then
+        install_package postgresql
+    elif is_fedora || is_suse; then
         install_package postgresql-server
     else
-        install_package postgresql
+        exit_distro_not_supported "postgresql installation"
     fi
 }
 
diff --git a/lib/horizon b/lib/horizon
index 7321cbc..68337ab 100644
--- a/lib/horizon
+++ b/lib/horizon
@@ -81,19 +81,18 @@
         sudo a2ensite horizon
         # WSGI doesn't enable by default, enable it
         sudo a2enmod wsgi
+    elif is_fedora; then
+        APACHE_NAME=httpd
+        APACHE_CONF=conf.d/horizon.conf
+        sudo sed '/^Listen/s/^.*$/Listen 0.0.0.0:80/' -i /etc/httpd/conf/httpd.conf
+    elif is_suse; then
+        APACHE_NAME=apache2
+        APACHE_CONF=vhosts.d/horizon.conf
+        # Append wsgi to the list of modules to load
+        grep -q "^APACHE_MODULES=.*wsgi" /etc/sysconfig/apache2 ||
+            sudo sed '/^APACHE_MODULES=/s/^\(.*\)"$/\1 wsgi"/' -i /etc/sysconfig/apache2
     else
-        # Install httpd, which is NOPRIME'd
-        if is_suse; then
-            APACHE_NAME=apache2
-            APACHE_CONF=vhosts.d/horizon.conf
-            # Append wsgi to the list of modules to load
-            grep -q "^APACHE_MODULES=.*wsgi" /etc/sysconfig/apache2 ||
-                sudo sed '/^APACHE_MODULES=/s/^\(.*\)"$/\1 wsgi"/' -i /etc/sysconfig/apache2
-        else
-            APACHE_NAME=httpd
-            APACHE_CONF=conf.d/horizon.conf
-            sudo sed '/^Listen/s/^.*$/Listen 0.0.0.0:80/' -i /etc/httpd/conf/httpd.conf
-        fi
+        exit_distro_not_supported "apache configuration"
     fi
 
     # Configure apache to run horizon
@@ -113,11 +112,13 @@
     if is_ubuntu; then
         # Install apache2, which is NOPRIME'd
         install_package apache2 libapache2-mod-wsgi
+    elif is_fedora; then
+        sudo rm -f /etc/httpd/conf.d/000-*
+        install_package httpd mod_wsgi
     elif is_suse; then
         install_package apache2 apache2-mod_wsgi
     else
-        sudo rm -f /etc/httpd/conf.d/000-*
-        install_package httpd mod_wsgi
+        exit_distro_not_supported "apache installation"
     fi
 
     # NOTE(sdague) quantal changed the name of the node binary
diff --git a/lib/nova b/lib/nova
index 095c65e..86db561 100644
--- a/lib/nova
+++ b/lib/nova
@@ -434,11 +434,13 @@
 function install_nova() {
     if is_service_enabled n-cpu; then
         if is_ubuntu; then
-            LIBVIRT_PKG_NAME=libvirt-bin
+            install_package libvirt-bin
+        elif is_fedora || is_suse; then
+            install_package libvirt
         else
-            LIBVIRT_PKG_NAME=libvirt
+            exit_distro_not_supported "libvirt installation"
         fi
-        install_package $LIBVIRT_PKG_NAME
+
         # Install and configure **LXC** if specified.  LXC is another approach to
         # splitting a system into many smaller parts.  LXC uses cgroups and chroot
         # to simulate multiple systems.
diff --git a/stack.sh b/stack.sh
index 99ed91f..da0faed 100755
--- a/stack.sh
+++ b/stack.sh
@@ -646,17 +646,21 @@
 echo_summary "Installing package prerequisites"
 if is_ubuntu; then
     install_package $(get_packages $FILES/apts)
+elif is_fedora; then
+    install_package $(get_packages $FILES/rpms)
 elif is_suse; then
     install_package $(get_packages $FILES/rpms-suse)
 else
-    install_package $(get_packages $FILES/rpms)
+    exit_distro_not_supported "list of packages"
 fi
 
 if [[ $SYSLOG != "False" ]]; then
-    if is_suse; then
+    if is_ubuntu || is_fedora; then
+        install_package rsyslog-relp
+    elif is_suse; then
         install_package rsyslog-module-relp
     else
-        install_package rsyslog-relp
+        exit_distro_not_supported "rsyslog-relp installation"
     fi
 fi
 
@@ -668,20 +672,22 @@
     cat "$tfile"
     rm -f "$tfile"
 elif is_service_enabled qpid; then
-    if [[ "$os_PACKAGE" = "rpm" ]]; then
+    if is_fedora; then
         install_package qpid-cpp-server-daemon
-    else
+    elif is_ubuntu; then
         install_package qpidd
+    else
+        exit_distro_not_supported "qpid installation"
     fi
 elif is_service_enabled zeromq; then
-    if [[ "$os_PACKAGE" = "rpm" ]]; then
-        if is_suse; then
-            install_package libzmq1 python-pyzmq
-        else
-            install_package zeromq python-zmq
-        fi
-    else
+    if is_fedora; then
+        install_package zeromq python-zmq
+    elif is_ubuntu; then
         install_package libzmq1 python-zmq
+    elif is_suse; then
+        install_package libzmq1 python-pyzmq
+    else
+        exit_distro_not_supported "zeromq installation"
     fi
 fi
 
@@ -877,8 +883,8 @@
 if is_service_enabled rabbit; then
     # Start rabbitmq-server
     echo_summary "Starting RabbitMQ"
-    if [[ "$os_PACKAGE" = "rpm" ]]; then
-        # RPM doesn't start the service
+    if is_fedora || is_suse; then
+        # service is not started by default
         restart_service rabbitmq-server
     fi
     # change the rabbit password since the default is "guest"
diff --git a/tests/functions.sh b/tests/functions.sh
index d2cc5c4..be48729 100755
--- a/tests/functions.sh
+++ b/tests/functions.sh
@@ -260,9 +260,11 @@
 if [[ "$os_PACKAGE" = "deb" ]]; then
     is_package_installed dpkg
     VAL=$?
-else
+elif [[ "$os_PACKAGE" = "rpm" ]]; then
     is_package_installed rpm
     VAL=$?
+else
+    VAL=1
 fi
 if [[ "$VAL" -eq 0 ]]; then
     echo "OK"
@@ -273,9 +275,11 @@
 if [[ "$os_PACKAGE" = "deb" ]]; then
     is_package_installed dpkg bash
     VAL=$?
-else
+elif [[ "$os_PACKAGE" = "rpm" ]]; then
     is_package_installed rpm bash
     VAL=$?
+else
+    VAL=1
 fi
 if [[ "$VAL" -eq 0 ]]; then
     echo "OK"
diff --git a/tools/info.sh b/tools/info.sh
index 583a994..f01dbea 100755
--- a/tools/info.sh
+++ b/tools/info.sh
@@ -90,15 +90,19 @@
 
 if is_ubuntu; then
     PKG_DIR=$FILES/apts
-else
+elif is_fedora; then
     PKG_DIR=$FILES/rpms
+else
+    exit_distro_not_supported "list of packages"
 fi
 
 for p in $(get_packages $PKG_DIR); do
     if [[ "$os_PACKAGE" = "deb" ]]; then
         ver=$(dpkg -s $p 2>/dev/null | grep '^Version: ' | cut -d' ' -f2)
-    else
+    elif [[ "$os_PACKAGE" = "rpm" ]]; then
         ver=$(rpm -q --queryformat "%{VERSION}-%{RELEASE}\n" $p)
+    else
+        exit_distro_not_supported "finding version of a package"
     fi
     echo "pkg|${p}|${ver}"
 done