Note that this is the first part of the support. A second part involves
dealing with the package names.
Among the changes:
- add several functions to determine some distro-specific behavior (how
to call usermod, if some features are available on the distro, etc.)
- correctly detect openSUSE and SLE in GetOSVersion, and set DISTRO
accordingly
- new is_suse() function to check if running on a SUSE-based distro
- use zypper to install packages
- adapt apache virtual host configuration for openSUSE
- some simple fixes (path to pip, mysql service name)
Change-Id: Id2f7c9e18a1c4a7b7cea262ea7959d183e4b0cf0
... | ... |
@@ -223,6 +223,12 @@ GetOSVersion() { |
223 | 223 |
os_UPDATE="" |
224 | 224 |
if [[ "Debian,Ubuntu" =~ $os_VENDOR ]]; then |
225 | 225 |
os_PACKAGE="deb" |
226 |
+ elif [[ "SUSE LINUX" =~ $os_VENDOR ]]; then |
|
227 |
+ lsb_release -d -s | grep -q openSUSE |
|
228 |
+ if [[ $? -eq 0 ]]; then |
|
229 |
+ os_VENDOR="openSUSE" |
|
230 |
+ fi |
|
231 |
+ os_PACKAGE="rpm" |
|
226 | 232 |
else |
227 | 233 |
os_PACKAGE="rpm" |
228 | 234 |
fi |
... | ... |
@@ -246,6 +252,23 @@ GetOSVersion() { |
246 | 246 |
os_VENDOR="" |
247 | 247 |
done |
248 | 248 |
os_PACKAGE="rpm" |
249 |
+ elif [[ -r /etc/SuSE-release ]]; then |
|
250 |
+ for r in openSUSE "SUSE Linux"; do |
|
251 |
+ if [[ "$r" = "SUSE Linux" ]]; then |
|
252 |
+ os_VENDOR="SUSE LINUX" |
|
253 |
+ else |
|
254 |
+ os_VENDOR=$r |
|
255 |
+ fi |
|
256 |
+ |
|
257 |
+ if [[ -n "`grep \"$r\" /etc/SuSE-release`" ]]; then |
|
258 |
+ os_CODENAME=`grep "CODENAME = " /etc/SuSE-release | sed 's:.* = ::g'` |
|
259 |
+ os_RELEASE=`grep "VERSION = " /etc/SuSE-release | sed 's:.* = ::g'` |
|
260 |
+ os_UPDATE=`grep "PATCHLEVEL = " /etc/SuSE-release | sed 's:.* = ::g'` |
|
261 |
+ break |
|
262 |
+ fi |
|
263 |
+ os_VENDOR="" |
|
264 |
+ done |
|
265 |
+ os_PACKAGE="rpm" |
|
249 | 266 |
fi |
250 | 267 |
export os_VENDOR os_RELEASE os_UPDATE os_PACKAGE os_CODENAME |
251 | 268 |
} |
... | ... |
@@ -297,6 +320,15 @@ function GetDistro() { |
297 | 297 |
elif [[ "$os_VENDOR" =~ (Fedora) ]]; then |
298 | 298 |
# For Fedora, just use 'f' and the release |
299 | 299 |
DISTRO="f$os_RELEASE" |
300 |
+ elif [[ "$os_VENDOR" =~ (openSUSE) ]]; then |
|
301 |
+ DISTRO="opensuse-$os_RELEASE" |
|
302 |
+ elif [[ "$os_VENDOR" =~ (SUSE LINUX) ]]; then |
|
303 |
+ # For SLE, also use the service pack |
|
304 |
+ if [[ -z "$os_UPDATE" ]]; then |
|
305 |
+ DISTRO="sle${os_RELEASE}" |
|
306 |
+ else |
|
307 |
+ DISTRO="sle${os_RELEASE}sp${os_UPDATE}" |
|
308 |
+ fi |
|
300 | 309 |
else |
301 | 310 |
# Catch-all for now is Vendor + Release + Update |
302 | 311 |
DISTRO="$os_VENDOR-$os_RELEASE.$os_UPDATE" |
... | ... |
@@ -305,6 +337,19 @@ function GetDistro() { |
305 | 305 |
} |
306 | 306 |
|
307 | 307 |
|
308 |
+# Determine if current distribution is a SUSE-based distribution |
|
309 |
+# (openSUSE, SLE). |
|
310 |
+# is_suse |
|
311 |
+function is_suse { |
|
312 |
+ if [[ -z "$os_VENDOR" ]]; then |
|
313 |
+ GetOSVersion |
|
314 |
+ fi |
|
315 |
+ |
|
316 |
+ [[ "$os_VENDOR" = "openSUSE" || "$os_VENDOR" = "SUSE LINUX" ]] |
|
317 |
+ return $? |
|
318 |
+} |
|
319 |
+ |
|
320 |
+ |
|
308 | 321 |
# git clone only if directory doesn't exist already. Since ``DEST`` might not |
309 | 322 |
# be owned by the installation user, we create the directory and change the |
310 | 323 |
# ownership to the proper user. |
... | ... |
@@ -542,7 +587,11 @@ function install_package() { |
542 | 542 |
|
543 | 543 |
apt_get install "$@" |
544 | 544 |
else |
545 |
- yum_install "$@" |
|
545 |
+ if is_suse; then |
|
546 |
+ zypper_install "$@" |
|
547 |
+ else |
|
548 |
+ yum_install "$@" |
|
549 |
+ fi |
|
546 | 550 |
fi |
547 | 551 |
} |
548 | 552 |
|
... | ... |
@@ -593,7 +642,7 @@ function pip_install { |
593 | 593 |
SUDO_PIP="env" |
594 | 594 |
else |
595 | 595 |
SUDO_PIP="sudo" |
596 |
- if [[ "$os_PACKAGE" = "deb" ]]; then |
|
596 |
+ if [[ "$os_PACKAGE" = "deb" || is_suse ]]; then |
|
597 | 597 |
CMD_PIP=/usr/bin/pip |
598 | 598 |
else |
599 | 599 |
CMD_PIP=/usr/bin/pip-python |
... | ... |
@@ -946,6 +995,68 @@ function _ssh_check_novanet() { |
946 | 946 |
fi |
947 | 947 |
} |
948 | 948 |
|
949 |
+ |
|
950 |
+# zypper wrapper to set arguments correctly |
|
951 |
+# zypper_install package [package ...] |
|
952 |
+function zypper_install() { |
|
953 |
+ [[ "$OFFLINE" = "True" ]] && return |
|
954 |
+ local sudo="sudo" |
|
955 |
+ [[ "$(id -u)" = "0" ]] && sudo="env" |
|
956 |
+ $sudo http_proxy=$http_proxy https_proxy=$https_proxy \ |
|
957 |
+ zypper --non-interactive install --auto-agree-with-licenses "$@" |
|
958 |
+} |
|
959 |
+ |
|
960 |
+ |
|
961 |
+# Add a user to a group. |
|
962 |
+# add_user_to_group user group |
|
963 |
+function add_user_to_group() { |
|
964 |
+ local user=$1 |
|
965 |
+ local group=$2 |
|
966 |
+ |
|
967 |
+ if [[ -z "$os_VENDOR" ]]; then |
|
968 |
+ GetOSVersion |
|
969 |
+ fi |
|
970 |
+ |
|
971 |
+ # SLE11 and openSUSE 12.2 don't have the usual usermod |
|
972 |
+ if ! is_suse || [[ "$os_VENDOR" = "openSUSE" && "$os_RELEASE" != "12.2" ]]; then |
|
973 |
+ sudo usermod -a -G "$group" "$user" |
|
974 |
+ else |
|
975 |
+ sudo usermod -A "$group" "$user" |
|
976 |
+ fi |
|
977 |
+} |
|
978 |
+ |
|
979 |
+ |
|
980 |
+# Get the location of the $module-rootwrap executables, where module is cinder |
|
981 |
+# or nova. |
|
982 |
+# get_rootwrap_location module |
|
983 |
+function get_rootwrap_location() { |
|
984 |
+ local module=$1 |
|
985 |
+ |
|
986 |
+ if [[ -z "$os_PACKAGE" ]]; then |
|
987 |
+ GetOSVersion |
|
988 |
+ fi |
|
989 |
+ |
|
990 |
+ if [[ "$os_PACKAGE" = "deb" || is_suse ]]; then |
|
991 |
+ echo "/usr/local/bin/$module-rootwrap" |
|
992 |
+ else |
|
993 |
+ echo "/usr/bin/$module-rootwrap" |
|
994 |
+ fi |
|
995 |
+} |
|
996 |
+ |
|
997 |
+ |
|
998 |
+# Check if qpid can be used on the current distro. |
|
999 |
+# qpid_is_supported |
|
1000 |
+function qpid_is_supported() { |
|
1001 |
+ if [[ -z "$DISTRO" ]]; then |
|
1002 |
+ GetDistro |
|
1003 |
+ fi |
|
1004 |
+ |
|
1005 |
+ # Qpid was introduced to Ubuntu in precise, disallow it on oneiric; it is |
|
1006 |
+ # not in openSUSE either right now. |
|
1007 |
+ [[ "$DISTRO" = "oneiric" || is_suse ]] |
|
1008 |
+ return $? |
|
1009 |
+} |
|
1010 |
+ |
|
949 | 1011 |
# Restore xtrace |
950 | 1012 |
$XTRACE |
951 | 1013 |
|
... | ... |
@@ -63,11 +63,7 @@ function configure_cinder() { |
63 | 63 |
cp -p $CINDER_DIR/etc/cinder/policy.json $CINDER_CONF_DIR |
64 | 64 |
|
65 | 65 |
# Set the paths of certain binaries |
66 |
- if [[ "$os_PACKAGE" = "deb" ]]; then |
|
67 |
- CINDER_ROOTWRAP=/usr/local/bin/cinder-rootwrap |
|
68 |
- else |
|
69 |
- CINDER_ROOTWRAP=/usr/bin/cinder-rootwrap |
|
70 |
- fi |
|
66 |
+ CINDER_ROOTWRAP=$(get_rootwrap_location cinder) |
|
71 | 67 |
|
72 | 68 |
# If Cinder ships the new rootwrap filters files, deploy them |
73 | 69 |
# (owned by root) and add a parameter to $CINDER_ROOTWRAP |
... | ... |
@@ -81,9 +81,17 @@ function init_horizon() { |
81 | 81 |
sudo a2ensite horizon |
82 | 82 |
else |
83 | 83 |
# Install httpd, which is NOPRIME'd |
84 |
- APACHE_NAME=httpd |
|
85 |
- APACHE_CONF=conf.d/horizon.conf |
|
86 |
- sudo sed '/^Listen/s/^.*$/Listen 0.0.0.0:80/' -i /etc/httpd/conf/httpd.conf |
|
84 |
+ if is_suse; then |
|
85 |
+ APACHE_NAME=apache2 |
|
86 |
+ APACHE_CONF=vhosts.d/horizon.conf |
|
87 |
+ # Append wsgi to the list of modules to load |
|
88 |
+ grep -q "^APACHE_MODULES=.*wsgi" /etc/sysconfig/apache2 || |
|
89 |
+ sudo sed '/^APACHE_MODULES=/s/^\(.*\)"$/\1 wsgi"/' -i /etc/sysconfig/apache2 |
|
90 |
+ else |
|
91 |
+ APACHE_NAME=httpd |
|
92 |
+ APACHE_CONF=conf.d/horizon.conf |
|
93 |
+ sudo sed '/^Listen/s/^.*$/Listen 0.0.0.0:80/' -i /etc/httpd/conf/httpd.conf |
|
94 |
+ fi |
|
87 | 95 |
fi |
88 | 96 |
|
89 | 97 |
# Configure apache to run horizon |
... | ... |
@@ -47,11 +47,7 @@ else |
47 | 47 |
fi |
48 | 48 |
|
49 | 49 |
# Set the paths of certain binaries |
50 |
-if [[ "$os_PACKAGE" = "deb" ]]; then |
|
51 |
- NOVA_ROOTWRAP=/usr/local/bin/nova-rootwrap |
|
52 |
-else |
|
53 |
- NOVA_ROOTWRAP=/usr/bin/nova-rootwrap |
|
54 |
-fi |
|
50 |
+NOVA_ROOTWRAP=$(get_rootwrap_location nova) |
|
55 | 51 |
|
56 | 52 |
# Allow rate limiting to be turned off for testing, like for Tempest |
57 | 53 |
# NOTE: Set API_RATE_LIMIT="False" to turn OFF rate limiting |
... | ... |
@@ -252,7 +248,7 @@ EOF' |
252 | 252 |
|
253 | 253 |
# The user that nova runs as needs to be member of **libvirtd** group otherwise |
254 | 254 |
# nova-compute will be unable to use libvirt. |
255 |
- sudo usermod -a -G libvirtd `whoami` |
|
255 |
+ add_user_to_group `whoami` libvirtd |
|
256 | 256 |
|
257 | 257 |
# libvirt detects various settings on startup, as we potentially changed |
258 | 258 |
# the system configuration (modules, filesystems), we need to restart |
... | ... |
@@ -113,9 +113,8 @@ if [[ ! ${DISTRO} =~ (oneiric|precise|quantal|raring|f16|f17) ]]; then |
113 | 113 |
fi |
114 | 114 |
fi |
115 | 115 |
|
116 |
-# Qpid was introduced to Ubuntu in precise, disallow it on oneiric |
|
117 |
-if [ "${DISTRO}" = "oneiric" ] && is_service_enabled qpid ; then |
|
118 |
- echo "You must use Ubuntu Precise or newer for Qpid support." |
|
116 |
+if is_service_enabled qpid && ! qpid_is_supported; then |
|
117 |
+ echo "Qpid support is not available for this version of your distribution." |
|
119 | 118 |
exit 1 |
120 | 119 |
fi |
121 | 120 |
|