From 018437b00290bf0f2ab453a60702c8330d3881d4 Mon Sep 17 00:00:00 2001 From: Rafal Jaworowski Date: Fri, 8 Nov 2013 17:58:28 +0100 Subject: [PATCH 01/30] Initial cut of FreeBSD support. This is a first step for making devstack work on FreeBSD 11 host. Current configuration only uses nova-compute component. There's a lot of loose ends still and areas to be fixed and developed. --- files/pkg-freebsd/general | 12 ++++++ files/pkg-freebsd/glance | 6 +++ files/pkg-freebsd/n-cpu | 6 +++ files/pkg-freebsd/nova | 13 ++++++ functions | 69 +++++++++++++++++++++++++++---- lib/cinder | 4 +- lib/keystone | 2 +- lib/neutron | 4 +- lib/nova | 85 +++++++++++++++++++++----------------- lib/rpc_backend | 2 +- lib/swift | 4 +- localrc.controller | 13 ++++++ localrc.slave | 81 ++++++++++++++++++++++++++++++++++++ stack.sh | 82 ++++++++++++++++++++++-------------- stackrc | 11 ++--- tools/create-stack-user.sh | 35 +++++++++++++--- tools/fixup_stuff.sh | 2 +- 17 files changed, 334 insertions(+), 97 deletions(-) create mode 100644 files/pkg-freebsd/general create mode 100644 files/pkg-freebsd/glance create mode 100644 files/pkg-freebsd/n-cpu create mode 100644 files/pkg-freebsd/nova create mode 100644 localrc.controller create mode 100644 localrc.slave diff --git a/files/pkg-freebsd/general b/files/pkg-freebsd/general new file mode 100644 index 0000000000..3d94fdc3b7 --- /dev/null +++ b/files/pkg-freebsd/general @@ -0,0 +1,12 @@ +curl +dbus +git +libxml2 +libxslt +psmisc +#pylint-py27 +py27-pip +py27-virtualenv +screen +unzip +wget diff --git a/files/pkg-freebsd/glance b/files/pkg-freebsd/glance new file mode 100644 index 0000000000..aaffee0739 --- /dev/null +++ b/files/pkg-freebsd/glance @@ -0,0 +1,6 @@ +#libxml2 +#py27-argparse +#py27-eventlet +#py27-greenlet +#py27-xattr +#lzlib diff --git a/files/pkg-freebsd/n-cpu b/files/pkg-freebsd/n-cpu new file mode 100644 index 0000000000..5bb2e3e5f6 --- /dev/null +++ b/files/pkg-freebsd/n-cpu @@ -0,0 +1,6 @@ +#sg3_utils +#iscsi-initiator-utils +#lvm2 +#genisoimage +#sysfsutils +#python-libguestfs diff --git a/files/pkg-freebsd/nova b/files/pkg-freebsd/nova new file mode 100644 index 0000000000..73c0877078 --- /dev/null +++ b/files/pkg-freebsd/nova @@ -0,0 +1,13 @@ +curl +gawk +mysql55-server # NOPRIME +py27-MySQLdb +py27-libxml2 +py27-eventlet +py27-gflags +py27-greenlet +py27-kombu +py27-lockfile +py27-mox +rabbitmq # NOPRIME +sudo diff --git a/functions b/functions index 0a73b9f0ac..a28480bde1 100644 --- a/functions +++ b/functions @@ -137,6 +137,14 @@ function err() { return $exitcode } +function _dev_exit() { + set +o xtrace + local banner='################################################' + echo $banner 1>&2; + echo "$@" 1>&2; + echo $banner 1>&2; + exit 777 +} # Checks an environment variable is not set or has length 0 OR if the # exit code is non-zero and prints "message" @@ -217,6 +225,12 @@ function get_default_host_ip() { local host_ip_iface=$3 local host_ip=$4 + # XXX TODO + if is_freebsd; then + echo $host_ip + return + fi + # Find the interface used for the default route host_ip_iface=${host_ip_iface:-$(ip route | sed -n '/^default/{ s/.*dev \(\w\+\)\s\+.*/\1/; p; }' | head -1)} # Search for an IP unless an explicit is set by ``HOST_IP`` environment variable @@ -246,6 +260,8 @@ function _get_package_dir() { pkg_dir=$FILES/apts elif is_fedora; then pkg_dir=$FILES/rpms + elif is_freebsd; then + pkg_dir=$FILES/pkg-freebsd elif is_suse; then pkg_dir=$FILES/rpms-suse else @@ -402,6 +418,13 @@ GetOSVersion() { else os_CODENAME="" fi + elif [[ `uname -s` == "FreeBSD" ]]; then + os_VENDOR="FreeBSD" + os_RELEASE=$(uname -r) + os_UPDATE=${os_RELEASE##*.} + os_RELEASE=${os_RELEASE%.*} + os_PACKAGE="pkg" + os_CODENAME="" elif [[ -x $(which lsb_release 2>/dev/null) ]]; then os_VENDOR=$(lsb_release -i -s) os_RELEASE=$(lsb_release -r -s) @@ -478,6 +501,9 @@ function GetDistro() { elif [[ "$os_VENDOR" =~ (Fedora) ]]; then # For Fedora, just use 'f' and the release DISTRO="f$os_RELEASE" + elif [[ "$os_VENDOR" =~ (FreeBSD) ]]; then + # For FreeBSD, just use 'freebsd' and the release + DISTRO="freebsd$os_RELEASE" elif [[ "$os_VENDOR" =~ (openSUSE) ]]; then DISTRO="opensuse-$os_RELEASE" elif [[ "$os_VENDOR" =~ (SUSE LINUX) ]]; then @@ -511,6 +537,13 @@ function is_fedora { [ "$os_VENDOR" = "Fedora" ] || [ "$os_VENDOR" = "Red Hat" ] || [ "$os_VENDOR" = "CentOS" ] } +function is_freebsd { + if [[ -z "$os_VENDOR" ]]; then + GetOSVersion + fi + + [ "$os_VENDOR" = "FreeBSD" ] +} # Determine if current distribution is a SUSE-based distribution # (openSUSE, SLE). @@ -671,7 +704,7 @@ function inicomment() { local file=$1 local section=$2 local option=$3 - sed -i -e "/^\[$section\]/,/^\[.*\]/ s|^\($option[ \t]*=.*$\)|#\1|" "$file" + sed -i '' -e "/^\[$section\]/,/^\[.*\]/ s|^\($option[ \t]*=.*$\)|#\1|" "$file" } @@ -681,7 +714,7 @@ function iniuncomment() { local file=$1 local section=$2 local option=$3 - sed -i -e "/^\[$section\]/,/^\[.*\]/ s|[^ \t]*#[ \t]*\($option[ \t]*=.*$\)|\1|" "$file" + sed -i '' -e "/^\[$section\]/,/^\[.*\]/ s|[^ \t]*#[ \t]*\($option[ \t]*=.*$\)|\1|" "$file" } @@ -723,12 +756,12 @@ function iniset() { fi if ! ini_has_option "$file" "$section" "$option"; then # Add it - sed -i -e "/^\[$section\]/ a\\ + sed -i '' -e "/^\[$section\]/ a\\ $option = $value " "$file" else # Replace it - sed -i -e "/^\[$section\]/,/^\[.*\]/ s|^\($option[ \t]*=[ \t]*\).*$|\1$value|" "$file" + sed -i '' -e "/^\[$section\]/,/^\[.*\]/ s|^\($option[ \t]*=[ \t]*\).*$|\1$value|" "$file" fi } @@ -764,11 +797,11 @@ function iniset_multiline() { echo -e "\n[$section]" >>"$file" else # Remove old values - sed -i -e "/^\[$section\]/,/^\[.*\]/ { /^$option[ \t]*=/ d; }" "$file" + sed -i '' -e "/^\[$section\]/,/^\[.*\]/ { /^$option[ \t]*=/ d; }" "$file" fi # Add new ones for v in $values; do - sed -i -e "/^\[$section\]/ a\\ + sed -i '' -e "/^\[$section\]/ a\\ $option = $v " "$file" done @@ -930,6 +963,8 @@ function install_package() { apt_get install "$@" elif is_fedora; then yum_install "$@" + elif is_freebsd; then + sudo pkg install -y "$@" elif is_suse; then zypper_install "$@" else @@ -945,6 +980,8 @@ function uninstall_package() { apt_get purge "$@" elif is_fedora; then sudo yum remove -y "$@" + elif is_freebsd; then + sudo pkg delete "$@" elif is_suse; then sudo zypper rm "$@" else @@ -968,6 +1005,8 @@ function is_package_installed() { dpkg -s "$@" > /dev/null 2> /dev/null elif [[ "$os_PACKAGE" = "rpm" ]]; then rpm --quiet -q "$@" + elif [[ "$os_PACKAGE" = "pkg" ]]; then + pkg info "$@" > /dev/null 2> /dev/null else exit_distro_not_supported "finding if a package is installed" fi @@ -994,6 +1033,7 @@ function pip_install { if [[ $TRACK_DEPENDS = True ]]; then source $DEST/.venv/bin/activate CMD_PIP=$DEST/.venv/bin/pip + PIP_DOWNLOAD_CACHE=$DEST/.venv/var/cache/pip SUDO_PIP="env" else SUDO_PIP="sudo" @@ -1014,7 +1054,7 @@ function pip_install { # 1.1, the existing extracted build will be used and cause # confusing errors. By creating unique build directories we avoid # this problem. See https://github.com/pypa/pip/issues/709 - local pip_build_tmp=$(mktemp --tmpdir -d pip-build.XXXXX) + local pip_build_tmp=$(mktemp -d pip-build.XXXXX) $SUDO_PIP PIP_DOWNLOAD_CACHE=${PIP_DOWNLOAD_CACHE:-/var/cache/pip} \ HTTP_PROXY=$http_proxy \ @@ -1192,6 +1232,10 @@ function service_check() { # Returns true if the directory is on a filesystem mounted via NFS. function is_nfs_directory() { + if is_freebsd; then + (df -t nfs "$@" > /dev/null 2> /dev/null) + return $? + fi local mount_type=`stat -f -L -c %T $1` test "$mount_type" == "nfs" } @@ -1266,7 +1310,7 @@ function setup_develop() { # where we really really want the overridden version to stick. So provide # a variable that tells us whether or not we should UNDO the requirements # changes (this will be set to False in the OpenStack ci gate) - if [ $UNDO_REQUIREMENTS = "True"]; then + if [ $UNDO_REQUIREMENTS = "True" ]; then if [ $update_requirements -eq 0 ]; then (cd $project_dir && git reset --hard) fi @@ -1681,7 +1725,14 @@ function check_path_perm_sanity() { for i in $(echo ${real_path} | tr "/" " "); do rebuilt_path=$rebuilt_path"/"$i - if [[ $(stat -c '%a' ${rebuilt_path}) = 700 ]]; then + local statperm="" + if is_freebsd; then + statperm="$(stat -f "%p" ${rebuilt_path})" + statperm="${statperm: -3}" + else + statperm="$(stat -c '%a' ${rebuilt_path})" + fi + if [[ $statperm = 700 ]]; then echo "*** DEST path element" echo "*** ${rebuilt_path}" echo "*** appears to have 0700 permissions." diff --git a/lib/cinder b/lib/cinder index 20d6e615f6..68dc275b02 100644 --- a/lib/cinder +++ b/lib/cinder @@ -202,7 +202,7 @@ function configure_cinder() { echo "$USER ALL=(root) NOPASSWD: $ROOTWRAP_CINDER_SUDOER_CMD" >$TEMPFILE chmod 0440 $TEMPFILE sudo chown root:root $TEMPFILE - sudo mv $TEMPFILE /etc/sudoers.d/cinder-rootwrap + sudo mv $TEMPFILE /usr/local/etc/sudoers.d/cinder-rootwrap cp $CINDER_DIR/etc/cinder/api-paste.ini $CINDER_API_PASTE_INI @@ -483,7 +483,7 @@ function install_cinder() { function install_cinderclient() { git_clone $CINDERCLIENT_REPO $CINDERCLIENT_DIR $CINDERCLIENT_BRANCH setup_develop $CINDERCLIENT_DIR - sudo install -D -m 0644 -o $STACK_USER {$CINDERCLIENT_DIR/tools/,/etc/bash_completion.d/}cinder.bash_completion + sudo install -m 0644 -o $STACK_USER {$CINDERCLIENT_DIR/tools/,/usr/local/etc/bash_completion.d/}cinder.bash_completion } # apply config.d approach for cinder volumes directory diff --git a/lib/keystone b/lib/keystone index 4353ebab1c..b312457587 100644 --- a/lib/keystone +++ b/lib/keystone @@ -341,7 +341,7 @@ function init_keystone() { function install_keystoneclient() { git_clone $KEYSTONECLIENT_REPO $KEYSTONECLIENT_DIR $KEYSTONECLIENT_BRANCH setup_develop $KEYSTONECLIENT_DIR - sudo install -D -m 0644 -o $STACK_USER {$KEYSTONECLIENT_DIR/tools/,/etc/bash_completion.d/}keystone.bash_completion + sudo install -m 0644 -o $STACK_USER {$KEYSTONECLIENT_DIR/tools/,/usr/local/etc/bash_completion.d/}keystone.bash_completion } # install_keystone() - Collect source and prepare diff --git a/lib/neutron b/lib/neutron index 098a589592..b2cf7073c8 100644 --- a/lib/neutron +++ b/lib/neutron @@ -398,7 +398,7 @@ function install_neutron() { function install_neutronclient() { git_clone $NEUTRONCLIENT_REPO $NEUTRONCLIENT_DIR $NEUTRONCLIENT_BRANCH setup_develop $NEUTRONCLIENT_DIR - sudo install -D -m 0644 -o $STACK_USER {$NEUTRONCLIENT_DIR/tools/,/etc/bash_completion.d/}neutron.bash_completion + sudo install -m 0644 -o $STACK_USER {$NEUTRONCLIENT_DIR/tools/,/usr/local/etc/bash_completion.d/}neutron.bash_completion } # install_neutron_agent_packages() - Collect source and prepare @@ -733,7 +733,7 @@ function _neutron_setup_rootwrap() { echo "$USER ALL=(root) NOPASSWD: $ROOTWRAP_SUDOER_CMD" >$TEMPFILE chmod 0440 $TEMPFILE sudo chown root:root $TEMPFILE - sudo mv $TEMPFILE /etc/sudoers.d/neutron-rootwrap + sudo mv $TEMPFILE /usr/local/etc/sudoers.d/neutron-rootwrap # Update the root_helper iniset $NEUTRON_CONF agent root_helper "$Q_RR_COMMAND" diff --git a/lib/nova b/lib/nova index 8ef5d9a427..96ff76e9f3 100644 --- a/lib/nova +++ b/lib/nova @@ -36,7 +36,7 @@ NOVA_STATE_PATH=${NOVA_STATE_PATH:=$DATA_DIR/nova} NOVA_INSTANCES_PATH=${NOVA_INSTANCES_PATH:=${INSTANCES_PATH:=$NOVA_STATE_PATH/instances}} NOVA_AUTH_CACHE_DIR=${NOVA_AUTH_CACHE_DIR:-/var/cache/nova} -NOVA_CONF_DIR=/etc/nova +NOVA_CONF_DIR=${NOVA_CONF_DIR:-/etc/nova} NOVA_CONF=$NOVA_CONF_DIR/nova.conf NOVA_CELLS_CONF=$NOVA_CONF_DIR/nova-cells.conf NOVA_CELLS_DB=${NOVA_CELLS_DB:-nova_cell} @@ -145,22 +145,25 @@ function clean_iptables() { # runs that a clean run would need to clean up function cleanup_nova() { if is_service_enabled n-cpu; then - # Clean iptables from previous runs - clean_iptables - - # Destroy old instances - instances=`sudo virsh list --all | grep $INSTANCE_NAME_PREFIX | sed "s/.*\($INSTANCE_NAME_PREFIX[0-9a-fA-F]*\).*/\1/g"` - if [ ! "$instances" = "" ]; then - echo $instances | xargs -n1 sudo virsh destroy || true - echo $instances | xargs -n1 sudo virsh undefine --managed-save || true - fi + # TODO this needs to be done in a BSD fashion + if ! is_freebsd; then + # Clean iptables from previous runs + clean_iptables + + # Destroy old instances + instances=`sudo virsh list --all | grep $INSTANCE_NAME_PREFIX | sed "s/.*\($INSTANCE_NAME_PREFIX[0-9a-fA-F]*\).*/\1/g"` + if [ ! "$instances" = "" ]; then + echo $instances | xargs -n1 sudo virsh destroy || true + echo $instances | xargs -n1 sudo virsh undefine --managed-save || true + fi - # Logout and delete iscsi sessions - tgts=$(sudo iscsiadm --mode node | grep $VOLUME_NAME_PREFIX | cut -d ' ' -f2) - for target in $tgts; do - sudo iscsiadm --mode node -T $target --logout || true - done - sudo iscsiadm --mode node --op delete || true + # Logout and delete iscsi sessions + tgts=$(sudo iscsiadm --mode node | grep $VOLUME_NAME_PREFIX | cut -d ' ' -f2) + for target in $tgts; do + sudo iscsiadm --mode node -T $target --logout || true + done + sudo iscsiadm --mode node --op delete || true + fi # Clean out the instances directory. sudo rm -rf $NOVA_INSTANCES_PATH/* @@ -186,12 +189,12 @@ function configure_nova_rootwrap() { # Deploy filters to /etc/nova/rootwrap.d sudo mkdir -m 755 $NOVA_CONF_DIR/rootwrap.d sudo cp $NOVA_DIR/etc/nova/rootwrap.d/*.filters $NOVA_CONF_DIR/rootwrap.d - sudo chown -R root:root $NOVA_CONF_DIR/rootwrap.d + sudo chown -R root:wheel $NOVA_CONF_DIR/rootwrap.d sudo chmod 644 $NOVA_CONF_DIR/rootwrap.d/* # Set up rootwrap.conf, pointing to /etc/nova/rootwrap.d sudo cp $NOVA_DIR/etc/nova/rootwrap.conf $NOVA_CONF_DIR/ - sudo sed -e "s:^filters_path=.*$:filters_path=$NOVA_CONF_DIR/rootwrap.d:" -i $NOVA_CONF_DIR/rootwrap.conf - sudo chown root:root $NOVA_CONF_DIR/rootwrap.conf + sudo sed -e "s:^filters_path=.*$:filters_path=$NOVA_CONF_DIR/rootwrap.d:" -i '' $NOVA_CONF_DIR/rootwrap.conf + sudo chown root:wheel $NOVA_CONF_DIR/rootwrap.conf sudo chmod 0644 $NOVA_CONF_DIR/rootwrap.conf # Specify rootwrap.conf as first parameter to nova-rootwrap ROOTWRAP_SUDOER_CMD="$NOVA_ROOTWRAP $NOVA_CONF_DIR/rootwrap.conf *" @@ -200,8 +203,8 @@ function configure_nova_rootwrap() { TEMPFILE=`mktemp` echo "$USER ALL=(root) NOPASSWD: $ROOTWRAP_SUDOER_CMD" >$TEMPFILE chmod 0440 $TEMPFILE - sudo chown root:root $TEMPFILE - sudo mv $TEMPFILE /etc/sudoers.d/nova-rootwrap + sudo chown root:wheel $TEMPFILE + sudo mv $TEMPFILE /usr/local/etc/sudoers.d/nova-rootwrap } # configure_nova() - Set config files, create data dirs, etc @@ -216,13 +219,13 @@ function configure_nova() { configure_nova_rootwrap - if is_service_enabled n-api; then - # Remove legacy paste config if present - rm -f $NOVA_DIR/bin/nova-api-paste.ini + # Remove legacy paste config if present + rm -f $NOVA_DIR/bin/nova-api-paste.ini - # Get the sample configuration file in place - cp $NOVA_DIR/etc/nova/api-paste.ini $NOVA_CONF_DIR + # Get the sample configuration file in place + cp $NOVA_DIR/etc/nova/api-paste.ini $NOVA_CONF_DIR + if is_service_enabled n-api; then # Comment out the keystone configs in Nova's api-paste.ini. # We are using nova.conf to configure this instead. inicomment $NOVA_API_PASTE_INI filter:authtoken auth_host @@ -237,8 +240,12 @@ function configure_nova() { inicomment $NOVA_API_PASTE_INI filter:authtoken signing_dir if is_service_enabled n-cpu; then - # Force IP forwarding on, just on case - sudo sysctl -w net.ipv4.ip_forward=1 + # Force IP forwarding on, just in case + if is_freebsd; then + sudo sysctl net.inet.ip.forwarding=1 + else + sudo sysctl -w net.ipv4.ip_forward=1 + fi if [[ "$VIRT_DRIVER" = 'libvirt' ]]; then # Attempt to load modules: network block device - used to manage qcow images @@ -285,13 +292,15 @@ function configure_nova() { sudo mkdir -p $NOVA_INSTANCES_PATH sudo chown -R $STACK_USER $NOVA_INSTANCES_PATH - # You can specify a different disk to be mounted and used for backing the - # virtual machines. If there is a partition labeled nova-instances we - # mount it (ext filesystems can be labeled via e2label). - if [ -L /dev/disk/by-label/nova-instances ]; then - if ! mount -n | grep -q $NOVA_INSTANCES_PATH; then - sudo mount -L nova-instances $NOVA_INSTANCES_PATH - sudo chown -R $STACK_USER $NOVA_INSTANCES_PATH + if ! is_freebsd; then + # You can specify a different disk to be mounted and used for backing the + # virtual machines. If there is a partition labeled nova-instances we + # mount it (ext filesystems can be labeled via e2label). + if [ -L /dev/disk/by-label/nova-instances ]; then + if ! mount -n | grep -q $NOVA_INSTANCES_PATH; then + sudo mount -L nova-instances $NOVA_INSTANCES_PATH + sudo chown -R $STACK_USER $NOVA_INSTANCES_PATH + fi fi fi fi @@ -532,7 +541,7 @@ function create_nova_cache_dir() { # Create cache dir sudo mkdir -p $NOVA_AUTH_CACHE_DIR sudo chown $STACK_USER $NOVA_AUTH_CACHE_DIR - rm -f $NOVA_AUTH_CACHE_DIR/* + sudo rm -f $NOVA_AUTH_CACHE_DIR/* } function create_nova_conf_nova_network() { @@ -585,7 +594,7 @@ function init_nova() { function install_novaclient() { git_clone $NOVACLIENT_REPO $NOVACLIENT_DIR $NOVACLIENT_BRANCH setup_develop $NOVACLIENT_DIR - sudo install -D -m 0644 -o $STACK_USER {$NOVACLIENT_DIR/tools/,/etc/bash_completion.d/}nova.bash_completion + sudo install -m 0644 -o $STACK_USER {$NOVACLIENT_DIR/tools/,/usr/local/etc/bash_completion.d/}nova.bash_completion } # install_nova() - Collect source and prepare @@ -596,7 +605,7 @@ function install_nova() { git_clone $NOVA_REPO $NOVA_DIR $NOVA_BRANCH setup_develop $NOVA_DIR - sudo install -D -m 0644 -o $STACK_USER {$NOVA_DIR/tools/,/etc/bash_completion.d/}nova-manage.bash_completion + sudo install -m 0644 -o $STACK_USER {$NOVA_DIR/tools/,/usr/local/etc/bash_completion.d/}nova-manage.bash_completion } # start_nova_api() - Start the API process ahead of other things diff --git a/lib/rpc_backend b/lib/rpc_backend index ae83e85e89..46198907c8 100644 --- a/lib/rpc_backend +++ b/lib/rpc_backend @@ -96,7 +96,7 @@ function install_rpc_backend() { # Install rabbitmq-server # the temp file is necessary due to LP: #878600 tfile=$(mktemp) - install_package rabbitmq-server > "$tfile" 2>&1 + install_package rabbitmq > "$tfile" 2>&1 cat "$tfile" rm -f "$tfile" elif is_service_enabled qpid; then diff --git a/lib/swift b/lib/swift index b46537f5a3..319c6a7e0f 100644 --- a/lib/swift +++ b/lib/swift @@ -462,8 +462,8 @@ function create_swift_disk() { node_device=${node}/sdb1 [[ -d $node ]] && continue [[ -d $drive ]] && continue - sudo install -o ${USER} -g $USER_GROUP -d $drive - sudo install -o ${USER} -g $USER_GROUP -d $node_device + sudo install -o ${USER} -g $USER_GROUP -D $drive + sudo install -o ${USER} -g $USER_GROUP -D $node_device sudo chown -R $USER: ${node} done } diff --git a/localrc.controller b/localrc.controller new file mode 100644 index 0000000000..31a8acb831 --- /dev/null +++ b/localrc.controller @@ -0,0 +1,13 @@ +HOST_IP=192.168.42.11 +FLAT_INTERFACE=eth0 +FIXED_RANGE=10.4.128.0/20 +FIXED_NETWORK_SIZE=4096 +FLOATING_RANGE=192.168.42.128/25 +MULTI_HOST=1 +LOGFILE=/opt/stack/logs/stack.sh.log +ADMIN_PASSWORD=labstack +MYSQL_PASSWORD=supersecret +RABBIT_PASSWORD=supersecrete +SERVICE_PASSWORD=supersecrete +SERVICE_TOKEN=xyzpdqlazydog + diff --git a/localrc.slave b/localrc.slave new file mode 100644 index 0000000000..59c45924d5 --- /dev/null +++ b/localrc.slave @@ -0,0 +1,81 @@ +# Stack user name +STACK_USER=stack + +# Passwords +ADMIN_PASSWORD=1qaz +MYSQL_PASSWORD=$ADMIN_PASSWORD +SERVICE_TOKEN=$ADMIN_PASSWORD +SERVICE_PASSWORD=$ADMIN_PASSWORD +RABBIT_PASSWORD=$ADMIN_PASSWORD +STACK_USER_PASSWORD=1qaz + +HOST_IP_IFACE=igb0 +HOST_IP=10.100.1.21 + +DEST=/home/stack + +#GLANCE_CONF_DIR=/usr/local/etc/glance +#NOVA_CONF_DIR=/usr/local/etc/nova + +# Logging +LOGFILE=$DEST/logs/stack.sh.log +LOG_COLOR=False +SCREEN_LOGDIR=$DEST/logs/screen + +#SYSLOG=True +#SYSLOG_HOST=$HOST_IP +#SYSLOG_PORT=516 + +#RECLONE=yes + +SWIFT_HASH="66a3d6b56c1f479c8b4e70ab5c2000f5" +SWIFT_REPLICAS=1 + +# use venv (and exit before init+run => just install all components and exit) +#TRACK_DEPENDS=True + +# force calling tools/install_prereqs.sh +#FORCE_PREREQ=1 + +# Slave host components +#MULTI_HOST=True +ENABLED_SERVICES=n-cpu +#ENABLED_SERVICES=n-cpu,n-api-meta +#ENABLED_SERVICES=n-cpu,n-net +#ENABLED_SERVICES=n-cpu,n-net,g-api +#ENABLED_SERVICES=n-cpu,rabbit,n-net,g-api +#ENABLED_SERVICES=n-vol,n-cpu,n-net,n-api +#ENABLED_SERVICES=n-cpu,n-net,n-api +#ENABLED_SERVICES=n-cpu,n-net,n-api,n-vol + +VIRT_DRIVER=fake +#NUMBER_FAKE_NOVA_COMPUTE=2 + +FLAT_INTERFACE=igb0 +FLAT_NETWORK_BRIDGE=bridge0 +PUBLIC_INTERFACE=bridge0 +VLAN_INTERFACE=igb0 + +DATABASE_TYPE=mysql +SERVICE_HOST=10.100.1.11 +MYSQL_HOST=$SERVICE_HOST +RABBIT_HOST=$SERVICE_HOST +KEYSTONE_AUTH_HOST=$SERVICE_HOST +GLANCE_HOSTPORT=$SERVICE_HOST:9292 + +# +# XXX +# + +# From http://devstack.org/guides/multinode-lab.html +#FLAT_INTERFACE=eth0 +#FIXED_RANGE=10.4.128.0/20 +#FIXED_NETWORK_SIZE=4096 +#FLOATING_RANGE=192.168.42.128/25 +#ENABLED_SERVICES=n-cpu,n-net,n-api,c-sch,c-api,c-vol + +# From README.md +#ENABLED_SERVICES=n-cpu,rabbit,g-api,neutron,q-agt +#SERVICE_HOST=[IP of controller node] +#Q_HOST=$SERVICE_HOST +#MATCHMAKER_REDIS_HOST=$SERVICE_HOST diff --git a/stack.sh b/stack.sh index 36312ea619..9d2cfcddf9 100755 --- a/stack.sh +++ b/stack.sh @@ -131,7 +131,7 @@ disable_negated_services # Warn users who aren't on an explicitly supported distro, but allow them to # override check and attempt installation with ``FORCE=yes ./stack`` -if [[ ! ${DISTRO} =~ (oneiric|precise|quantal|raring|saucy|trusty|7.0|wheezy|sid|testing|jessie|f16|f17|f18|f19|opensuse-12.2|rhel6) ]]; then +if [[ ! ${DISTRO} =~ (oneiric|precise|quantal|raring|saucy|trusty|7.0|wheezy|sid|testing|jessie|f16|f17|f18|f19|freebsd11|opensuse-12.2|rhel6) ]]; then echo "WARNING: this script has not been tested on $DISTRO" if [[ "$FORCE" != "yes" ]]; then die $LINENO "If you wish to run this script anyway run with FORCE=yes" @@ -207,27 +207,35 @@ if [[ $EUID -eq 0 ]]; then exit 1 fi -# We're not **root**, make sure ``sudo`` is available -is_package_installed sudo || install_package sudo - -# UEC images ``/etc/sudoers`` does not have a ``#includedir``, add one -sudo grep -q "^#includedir.*/etc/sudoers.d" /etc/sudoers || - echo "#includedir /etc/sudoers.d" | sudo tee -a /etc/sudoers +if [[ $(whoami) != $STACK_USER ]]; then + err "Current user: $(whoami). Expected: $STACK_USER. Please do 'su - $STACK_USER' and rerun." +fi -# Set up devstack sudoers -TEMPFILE=`mktemp` -echo "$STACK_USER ALL=(root) NOPASSWD:ALL" >$TEMPFILE -# Some binaries might be under /sbin or /usr/sbin, so make sure sudo will -# see them by forcing PATH -echo "Defaults:$STACK_USER secure_path=/sbin:/usr/sbin:/usr/bin:/bin:/usr/local/sbin:/usr/local/bin" >> $TEMPFILE -chmod 0440 $TEMPFILE -sudo chown root:root $TEMPFILE -sudo mv $TEMPFILE /etc/sudoers.d/50_stack_sh +# XXX this is inherently broken: if we are not root and not in sudoers already +# modifying /etc/... will fail due to no access. Installing sudo by non +# privileged user will also fail etc. +# We're not **root**, make sure ``sudo`` is available +#is_package_installed sudo || install_package sudo +# +## UEC images ``/etc/sudoers`` does not have a ``#includedir``, add one +#sudo grep -q "^#includedir.*/etc/sudoers.d" /etc/sudoers || +# echo "#includedir /etc/sudoers.d" | sudo tee -a /etc/sudoers +# +## Set up devstack sudoers +#TEMPFILE=`mktemp` +#echo "$STACK_USER ALL=(root) NOPASSWD:ALL" >$TEMPFILE +## Some binaries might be under /sbin or /usr/sbin, so make sure sudo will +## see them by forcing PATH +#echo "Defaults:$STACK_USER secure_path=/sbin:/usr/sbin:/usr/bin:/bin:/usr/local/sbin:/usr/local/bin" >> $TEMPFILE +#chmod 0440 $TEMPFILE +#sudo chown root:root $TEMPFILE +#sudo mv $TEMPFILE /etc/sudoers.d/50_stack_sh # Create the destination directory and ensure it is writable by the user # and read/executable by everybody for daemons (e.g. apache run for horizon) sudo mkdir -p $DEST +# XXX This fails if TRACK_DEPENDS=True safe_chown -R $STACK_USER $DEST safe_chmod 0755 $DEST @@ -250,6 +258,7 @@ ENABLE_DEBUG_LOG_LEVEL=`trueorfalse True $ENABLE_DEBUG_LOG_LEVEL` # Destination path for service data DATA_DIR=${DATA_DIR:-${DEST}/data} sudo mkdir -p $DATA_DIR +# XXX This fails if TRACK_DEPENDS=True safe_chown -R $STACK_USER $DATA_DIR @@ -575,7 +584,7 @@ failed() { # Print the commands being run so that we can see the command that triggers # an error. It is also useful for following along as the install occurs. -set -o xtrace +#set -o xtrace # Install Packages @@ -588,9 +597,12 @@ set -o xtrace echo_summary "Installing package prerequisites" source $TOP_DIR/tools/install_prereqs.sh -# Configure an appropriate python environment -if [[ "$OFFLINE" != "True" ]]; then - $TOP_DIR/tools/install_pip.sh +# XXX why not install pip from ports/pkg? +if ! is_freebsd; then + # Configure an appropriate python environment + if [[ "$OFFLINE" != "True" ]]; then + $TOP_DIR/tools/install_pip.sh + fi fi # Do the ugly hacks for borken packages and distros @@ -845,7 +857,7 @@ init_service_check # Sysstat # ------- - +# XXX Linux only # If enabled, systat has to start early to track OpenStack service startup. if is_service_enabled sysstat;then if [[ -n ${SCREEN_LOGDIR} ]]; then @@ -965,21 +977,31 @@ fi # ---- if is_service_enabled n-net q-dhcp; then - # Delete traces of nova networks from prior runs - # Do not kill any dnsmasq instance spawned by NetworkManager - netman_pid=$(pidof NetworkManager || true) - if [ -z "$netman_pid" ]; then - sudo killall dnsmasq || true - else - sudo ps h -o pid,ppid -C dnsmasq | grep -v $netman_pid | awk '{print $1}' | sudo xargs kill || true + # TODO we have to reinit dhcpd here for FBSD + if ! is_freebsd; then + # Delete traces of nova networks from prior runs + # Do not kill any dnsmasq instance spawned by NetworkManager + netman_pid=$(pidof NetworkManager || true) + if [ -z "$netman_pid" ]; then + sudo killall dnsmasq || true + else + sudo ps h -o pid,ppid -C dnsmasq | grep -v $netman_pid | awk '{print $1}' | sudo xargs kill || true + fi + + clean_iptables fi - clean_iptables rm -rf ${NOVA_STATE_PATH}/networks sudo mkdir -p ${NOVA_STATE_PATH}/networks + # XXX This fails if TRACK_DEPENDS=True safe_chown -R ${USER} ${NOVA_STATE_PATH}/networks + # Force IP forwarding on, just in case - sudo sysctl -w net.ipv4.ip_forward=1 + if is_freebsd; then + sudo sysctl net.inet.ip.forwarding=1 + else + sudo sysctl -w net.ipv4.ip_forward=1 + fi fi diff --git a/stackrc b/stackrc index 6adb676866..defcd6c207 100644 --- a/stackrc +++ b/stackrc @@ -6,14 +6,11 @@ RC_DIR=$(cd $(dirname "${BASH_SOURCE:-$0}") && pwd) # Destination path for installation DEST=/opt/stack -# Destination for working data -DATA_DIR=${DEST}/data - # Determine stack user if [[ $EUID -eq 0 ]]; then STACK_USER=stack else - STACK_USER=$(whoami) + STACK_USER=${STACK_USER:-$(whoami)} fi # Specify which services to launch. These generally correspond to @@ -56,6 +53,8 @@ elif [[ -f $RC_DIR/.localrc.auto ]]; then source $RC_DIR/.localrc.auto fi +# Destination for working data +DATA_DIR=${DEST}/data # Repositories # ------------ @@ -212,7 +211,9 @@ PECAN_BRANCH=${PECAN_BRANCH:-master} # also install an **LXC**, **OpenVZ** or **XenAPI** based system. If xenserver-core # is installed, the default will be XenAPI DEFAULT_VIRT_DRIVER=libvirt -is_package_installed xenserver-core && DEFAULT_VIRT_DRIVER=xenserver +if ! is_freebsd ; then + is_package_installed xenserver-core && DEFAULT_VIRT_DRIVER=xenserver +fi VIRT_DRIVER=${VIRT_DRIVER:-$DEFAULT_VIRT_DRIVER} case "$VIRT_DRIVER" in libvirt) diff --git a/tools/create-stack-user.sh b/tools/create-stack-user.sh index 50f6592a3a..ea7c34ecf9 100755 --- a/tools/create-stack-user.sh +++ b/tools/create-stack-user.sh @@ -15,13 +15,17 @@ # and it was time for this nonsense to stop. Run this script as root to create # the user and configure sudo. - # Keep track of the devstack directory TOP_DIR=$(cd $(dirname "$0")/.. && pwd) # Import common functions source $TOP_DIR/functions +if [[ $EUID -ne 0 ]]; then + echo 'You must be the super-user (uid 0) to use this utility.' + exit 1 +fi + # Determine what system we are running on. This provides ``os_VENDOR``, # ``os_RELEASE``, ``os_UPDATE``, ``os_PACKAGE``, ``os_CODENAME`` # and ``DISTRO`` @@ -35,17 +39,36 @@ is_package_installed sudo || install_package sudo if ! getent group $STACK_USER >/dev/null; then echo "Creating a group called $STACK_USER" - groupadd $STACK_USER + if is_freebsd; then + pw groupadd $STACK_USER + else + groupadd $STACK_USER + fi fi if ! getent passwd $STACK_USER >/dev/null; then echo "Creating a user called $STACK_USER" - useradd -g $STACK_USER -s /bin/bash -d $DEST -m $STACK_USER + if is_freebsd; then + echo $STACK_USER_PASSWORD | \ + pw useradd -h 0 -n $STACK_USER -c "Devstack" -g $STACK_USER -s /bin/bash -d $DEST -m + else + useradd -g $STACK_USER -s /bin/bash -d $DEST -m $STACK_USER + fi fi echo "Giving stack user passwordless sudo privileges" +if is_freebsd; then + SUDOERS_PREFIX='/usr/local' +fi +SUDOERS_ETC_FILE="$SUDOERS_PREFIX/etc/sudoers" +SUDOERS_STACK_FILE="$SUDOERS_PREFIX/etc/sudoers.d/50_stack_sh" + # UEC images ``/etc/sudoers`` does not have a ``#includedir``, add one -grep -q "^#includedir.*/etc/sudoers.d" /etc/sudoers || - echo "#includedir /etc/sudoers.d" >> /etc/sudoers +grep -q "^#includedir.*/usr/local/etc/sudoers.d" $SUDOERS_ETC_FILE || + echo "#includedir /usr/local/etc/sudoers.d" >> $SUDOERS_ETC_FILE ( umask 226 && echo "$STACK_USER ALL=(ALL) NOPASSWD:ALL" \ - > /etc/sudoers.d/50_stack_sh ) + > $SUDOERS_STACK_FILE ) + +# Some binaries might be under /sbin or /usr/sbin, so make sure sudo will +# see them by forcing PATH +echo "Defaults:$STACK_USER secure_path=/sbin:/usr/sbin:/usr/bin:/bin:/usr/local/sbin:/usr/local/bin" >> $SUDOERS_STACK_FILE diff --git a/tools/fixup_stuff.sh b/tools/fixup_stuff.sh index 325a6d6be1..973b23f099 100755 --- a/tools/fixup_stuff.sh +++ b/tools/fixup_stuff.sh @@ -21,7 +21,7 @@ # - install nose 1.1 from EPEL set -o errexit -set -o xtrace +#set -o xtrace # Keep track of the current directory TOOLS_DIR=$(cd $(dirname "$0") && pwd) From b3d4a2cd8e90b65d92386ad5062d86f54900d463 Mon Sep 17 00:00:00 2001 From: Rafal Jaworowski Date: Wed, 13 Nov 2013 12:50:18 +0100 Subject: [PATCH 02/30] localrc: Initial repo config for development. We use working repo for nova and mainline stable/havana for all other OpenStack components. --- localrc.slave | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/localrc.slave b/localrc.slave index 59c45924d5..01e4e61015 100644 --- a/localrc.slave +++ b/localrc.slave @@ -63,6 +63,26 @@ RABBIT_HOST=$SERVICE_HOST KEYSTONE_AUTH_HOST=$SERVICE_HOST GLANCE_HOSTPORT=$SERVICE_HOST:9292 +# Nova development repo +NOVA_REPO=https://github.com/Semihalf/openstack-nova.git +NOVA_BRANCH=freebsd + +# Branches for other components: services only, not including clients etc. +BRANCH_STABLE=stable/havana +CEILOMETER_BRANCH=$BRANCH_STABLE +CINDER_BRANCH=$BRANCH_STABLE +GLANCE_BRANCH=$BRANCH_STABLE +HEAT_BRANCH=$BRANCH_STABLE +HORIZON_BRANCH=$BRANCH_STABLE +KEYSTONE_BRANCH=$BRANCH_STABLE +OSLOCFG_BRANCH=$BRANCH_STABLE +NEUTRON_BRANCH=$BRANCH_STABLE +REQUIREMENTS_BRANCH=$BRANCH_STABLE +SWIFT_BRANCH=$BRANCH_STABLE +TEMPEST_BRANCH=$BRANCH_STABLE +TROVE_BRANCH=$BRANCH_STABLE + + # # XXX # From 14c028a39caa4b477779dfa91ff9e70d7789917a Mon Sep 17 00:00:00 2001 From: Rafal Jaworowski Date: Fri, 15 Nov 2013 11:39:09 +0000 Subject: [PATCH 03/30] Fix typo in comment. --- functions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions b/functions index a28480bde1..d53bd8710a 100644 --- a/functions +++ b/functions @@ -1680,7 +1680,7 @@ function add_user_to_group() { } -# Get the path to the direcotry where python executables are installed. +# Get the path to the directory where python executables are installed. # get_python_exec_prefix function get_python_exec_prefix() { if is_fedora || is_suse; then From 0fb44bd0e994746f7aaea0543c56aadd799d2359 Mon Sep 17 00:00:00 2001 From: Rafal Jaworowski Date: Fri, 15 Nov 2013 13:58:00 +0000 Subject: [PATCH 04/30] De-hard code usage of /etc system location. In BSD world we'd rather have /usr/local/etc, so let's make it flexible. This introduces get_install_prefix() helper routine and $INSTALL_PREFIX throughout installation scripts. --- clean.sh | 6 ++++-- functions | 7 +++++++ lib/ceilometer | 2 +- lib/cinder | 14 +++++++------- lib/glance | 2 +- lib/heat | 2 +- lib/horizon | 2 +- lib/ironic | 2 +- lib/keystone | 10 +++++----- lib/neutron | 6 +++--- lib/nova | 10 +++++----- lib/savanna | 2 +- lib/swift | 10 +++++----- lib/template | 2 +- localrc.slave | 3 --- stack.sh | 6 +++--- stackrc | 3 +++ tests/functions.sh | 2 +- tests/test_config.sh | 2 +- tools/create-stack-user.sh | 11 ++++------- 20 files changed, 55 insertions(+), 49 deletions(-) diff --git a/clean.sh b/clean.sh index 395941ae21..b5593474cc 100755 --- a/clean.sh +++ b/clean.sh @@ -102,10 +102,12 @@ fi # Clean out /etc -sudo rm -rf /etc/keystone /etc/glance /etc/nova /etc/cinder /etc/swift +sudo rm -rf $INSTALL_PREFIX/etc/keystone $INSTALL_PREFIX/etc/glance \ + $INSTALL_PREFIX/etc/nova $INSTALL_PREFIX/etc/cinder \ + $INSTALL_PREFIX/etc/swift # Clean out tgt -sudo rm /etc/tgt/conf.d/* +sudo rm $INSTALL_PREFIX/etc/tgt/conf.d/* # Clean up the message queue cleanup_rpc_backend diff --git a/functions b/functions index d53bd8710a..c542064d18 100644 --- a/functions +++ b/functions @@ -1690,6 +1690,13 @@ function get_python_exec_prefix() { fi } +function get_install_prefix() { + if is_freebsd; then + echo "/usr/local" + else + echo "" + fi +} # Get the location of the $module-rootwrap executables, where module is cinder # or nova. diff --git a/lib/ceilometer b/lib/ceilometer index f95ed302ce..7e0806e10e 100644 --- a/lib/ceilometer +++ b/lib/ceilometer @@ -37,7 +37,7 @@ set +o xtrace # Set up default directories CEILOMETER_DIR=$DEST/ceilometer CEILOMETERCLIENT_DIR=$DEST/python-ceilometerclient -CEILOMETER_CONF_DIR=/etc/ceilometer +CEILOMETER_CONF_DIR=$INSTALL_PREFIX/etc/ceilometer CEILOMETER_CONF=$CEILOMETER_CONF_DIR/ceilometer.conf CEILOMETER_API_LOG_DIR=/var/log/ceilometer-api CEILOMETER_AUTH_CACHE_DIR=${CEILOMETER_AUTH_CACHE_DIR:-/var/cache/ceilometer} diff --git a/lib/cinder b/lib/cinder index 68dc275b02..82a8862578 100644 --- a/lib/cinder +++ b/lib/cinder @@ -34,7 +34,7 @@ CINDERCLIENT_DIR=$DEST/python-cinderclient CINDER_STATE_PATH=${CINDER_STATE_PATH:=$DATA_DIR/cinder} CINDER_AUTH_CACHE_DIR=${CINDER_AUTH_CACHE_DIR:-/var/cache/cinder} -CINDER_CONF_DIR=/etc/cinder +CINDER_CONF_DIR=$INSTALL_PREFIX/etc/cinder CINDER_CONF=$CINDER_CONF_DIR/cinder.conf CINDER_API_PASTE_INI=$CINDER_CONF_DIR/api-paste.ini @@ -202,7 +202,7 @@ function configure_cinder() { echo "$USER ALL=(root) NOPASSWD: $ROOTWRAP_CINDER_SUDOER_CMD" >$TEMPFILE chmod 0440 $TEMPFILE sudo chown root:root $TEMPFILE - sudo mv $TEMPFILE /usr/local/etc/sudoers.d/cinder-rootwrap + sudo mv $TEMPFILE $INSTALL_PREFIX/etc/sudoers.d/cinder-rootwrap cp $CINDER_DIR/etc/cinder/api-paste.ini $CINDER_API_PASTE_INI @@ -483,14 +483,14 @@ function install_cinder() { function install_cinderclient() { git_clone $CINDERCLIENT_REPO $CINDERCLIENT_DIR $CINDERCLIENT_BRANCH setup_develop $CINDERCLIENT_DIR - sudo install -m 0644 -o $STACK_USER {$CINDERCLIENT_DIR/tools/,/usr/local/etc/bash_completion.d/}cinder.bash_completion + sudo install -m 0644 -o $STACK_USER {$CINDERCLIENT_DIR/tools/,$INSTALL_PREFIX/etc/bash_completion.d/}cinder.bash_completion } # apply config.d approach for cinder volumes directory function _configure_tgt_for_config_d() { - if [[ ! -d /etc/tgt/stack.d/ ]]; then - sudo ln -sf $CINDER_STATE_PATH/volumes /etc/tgt/stack.d - echo "include /etc/tgt/stack.d/*" | sudo tee -a /etc/tgt/targets.conf + if [[ ! -d $INSTALL_PREFIX/etc/tgt/stack.d/ ]]; then + sudo ln -sf $CINDER_STATE_PATH/volumes $INSTALL_PREFIX/etc/tgt/stack.d + echo "include $INSTALL_PREFIX/etc/tgt/stack.d/*" | sudo tee -a $INSTALL_PREFIX/etc/tgt/targets.conf fi } @@ -498,7 +498,7 @@ function _configure_tgt_for_config_d() { function start_cinder() { if is_service_enabled c-vol; then # Delete any old stack.conf - sudo rm -f /etc/tgt/conf.d/stack.conf + sudo rm -f $INSTALL_PREFIX/etc/tgt/conf.d/stack.conf _configure_tgt_for_config_d if is_ubuntu; then # tgt in oneiric doesn't restart properly if tgtd isn't running diff --git a/lib/glance b/lib/glance index eb727f1e2a..759d4bedf5 100644 --- a/lib/glance +++ b/lib/glance @@ -33,7 +33,7 @@ GLANCE_CACHE_DIR=${GLANCE_CACHE_DIR:=$DATA_DIR/glance/cache} GLANCE_IMAGE_DIR=${GLANCE_IMAGE_DIR:=$DATA_DIR/glance/images} GLANCE_AUTH_CACHE_DIR=${GLANCE_AUTH_CACHE_DIR:-/var/cache/glance} -GLANCE_CONF_DIR=${GLANCE_CONF_DIR:-/etc/glance} +GLANCE_CONF_DIR=${GLANCE_CONF_DIR:-$INSTALL_PREFIX/etc/glance} GLANCE_REGISTRY_CONF=$GLANCE_CONF_DIR/glance-registry.conf GLANCE_API_CONF=$GLANCE_CONF_DIR/glance-api.conf GLANCE_REGISTRY_PASTE_INI=$GLANCE_CONF_DIR/glance-registry-paste.ini diff --git a/lib/heat b/lib/heat index bf4d4bce9c..aaa8573353 100644 --- a/lib/heat +++ b/lib/heat @@ -33,7 +33,7 @@ HEAT_DIR=$DEST/heat HEATCLIENT_DIR=$DEST/python-heatclient HEAT_AUTH_CACHE_DIR=${HEAT_AUTH_CACHE_DIR:-/var/cache/heat} HEAT_STANDALONE=`trueorfalse False $HEAT_STANDALONE` -HEAT_CONF_DIR=/etc/heat +HEAT_CONF_DIR=$INSTALL_PREFIX/etc/heat HEAT_CONF=$HEAT_CONF_DIR/heat.conf HEAT_ENV_DIR=$HEAT_CONF_DIR/environment.d HEAT_TEMPLATES_DIR=$HEAT_CONF_DIR/templates diff --git a/lib/horizon b/lib/horizon index c116ec257a..c2d6abc5b7 100644 --- a/lib/horizon +++ b/lib/horizon @@ -113,7 +113,7 @@ function init_horizon() { sudo mkdir -p $HORIZON_DIR/.blackhole HORIZON_REQUIRE='' - local horizon_conf=/etc/$APACHE_NAME/$APACHE_CONF_DIR/horizon.conf + local horizon_conf=$INSTALL_PREFIX/etc/$APACHE_NAME/$APACHE_CONF_DIR/horizon.conf if is_ubuntu; then # Clean up the old config name sudo rm -f /etc/apache2/sites-enabled/000-default diff --git a/lib/ironic b/lib/ironic index 9f86e841d8..c7914e4ab2 100644 --- a/lib/ironic +++ b/lib/ironic @@ -30,7 +30,7 @@ set +o xtrace IRONIC_DIR=$DEST/ironic IRONICCLIENT_DIR=$DEST/python-ironicclient IRONIC_AUTH_CACHE_DIR=${IRONIC_AUTH_CACHE_DIR:-/var/cache/ironic} -IRONIC_CONF_DIR=${IRONIC_CONF_DIR:-/etc/ironic} +IRONIC_CONF_DIR=${IRONIC_CONF_DIR:-$INSTALL_PREFIX/etc/ironic} IRONIC_CONF_FILE=$IRONIC_CONF_DIR/ironic.conf IRONIC_ROOTWRAP_CONF=$IRONIC_CONF_DIR/rootwrap.conf IRONIC_ROOTWRAP_FILTERS=$IRONIC_CONF_DIR/rootwrap.d diff --git a/lib/keystone b/lib/keystone index b312457587..4ede51965e 100644 --- a/lib/keystone +++ b/lib/keystone @@ -33,7 +33,7 @@ set +o xtrace # Set up default directories KEYSTONE_DIR=$DEST/keystone -KEYSTONE_CONF_DIR=${KEYSTONE_CONF_DIR:-/etc/keystone} +KEYSTONE_CONF_DIR=${KEYSTONE_CONF_DIR:-$INSTALL_PREFIX/etc/keystone} KEYSTONE_CONF=$KEYSTONE_CONF_DIR/keystone.conf KEYSTONE_PASTE_INI=${KEYSTONE_PASTE_INI:-$KEYSTONE_CONF_DIR/keystone-paste.ini} KEYSTONE_AUTH_CACHE_DIR=${KEYSTONE_AUTH_CACHE_DIR:-/var/cache/keystone} @@ -94,7 +94,7 @@ function cleanup_keystone() { function _cleanup_keystone_apache_wsgi() { sudo rm -f $KEYSTONE_WSGI_DIR/*.wsgi disable_apache_site keystone - sudo rm -f /etc/$APACHE_NAME/$APACHE_CONF_DIR/keystone + sudo rm -f $INSTALL_PREFIX/etc/$APACHE_NAME/$APACHE_CONF_DIR/keystone } # _config_keystone_apache_wsgi() - Set WSGI config files of Keystone @@ -105,7 +105,7 @@ function _config_keystone_apache_wsgi() { sudo cp $KEYSTONE_DIR/httpd/keystone.py $KEYSTONE_WSGI_DIR/main sudo cp $KEYSTONE_DIR/httpd/keystone.py $KEYSTONE_WSGI_DIR/admin - sudo cp $FILES/apache-keystone.template /etc/$APACHE_NAME/$APACHE_CONF_DIR/keystone + sudo cp $FILES/apache-keystone.template $INSTALL_PREFIX/etc/$APACHE_NAME/$APACHE_CONF_DIR/keystone sudo sed -e " s|%PUBLICPORT%|$KEYSTONE_SERVICE_PORT|g; s|%ADMINPORT%|$KEYSTONE_AUTH_PORT|g; @@ -113,7 +113,7 @@ function _config_keystone_apache_wsgi() { s|%PUBLICWSGI%|$KEYSTONE_WSGI_DIR/main|g; s|%ADMINWSGI%|$KEYSTONE_WSGI_DIR/admin|g; s|%USER%|$STACK_USER|g - " -i /etc/$APACHE_NAME/$APACHE_CONF_DIR/keystone + " -i $INSTALL_PREFIX/etc/$APACHE_NAME/$APACHE_CONF_DIR/keystone enable_apache_site keystone } @@ -341,7 +341,7 @@ function init_keystone() { function install_keystoneclient() { git_clone $KEYSTONECLIENT_REPO $KEYSTONECLIENT_DIR $KEYSTONECLIENT_BRANCH setup_develop $KEYSTONECLIENT_DIR - sudo install -m 0644 -o $STACK_USER {$KEYSTONECLIENT_DIR/tools/,/usr/local/etc/bash_completion.d/}keystone.bash_completion + sudo install -m 0644 -o $STACK_USER {$KEYSTONECLIENT_DIR/tools/,$INSTALL_PREFIX/etc/bash_completion.d/}keystone.bash_completion } # install_keystone() - Collect source and prepare diff --git a/lib/neutron b/lib/neutron index b2cf7073c8..7511566ea7 100644 --- a/lib/neutron +++ b/lib/neutron @@ -83,7 +83,7 @@ else NEUTRON_BIN_DIR=$(get_python_exec_prefix) fi -NEUTRON_CONF_DIR=/etc/neutron +NEUTRON_CONF_DIR=$INSTALL_PREFIX/etc/neutron NEUTRON_CONF=$NEUTRON_CONF_DIR/neutron.conf export NEUTRON_TEST_CONFIG_FILE=${NEUTRON_TEST_CONFIG_FILE:-"$NEUTRON_CONF_DIR/debug.ini"} @@ -398,7 +398,7 @@ function install_neutron() { function install_neutronclient() { git_clone $NEUTRONCLIENT_REPO $NEUTRONCLIENT_DIR $NEUTRONCLIENT_BRANCH setup_develop $NEUTRONCLIENT_DIR - sudo install -m 0644 -o $STACK_USER {$NEUTRONCLIENT_DIR/tools/,/usr/local/etc/bash_completion.d/}neutron.bash_completion + sudo install -m 0644 -o $STACK_USER {$NEUTRONCLIENT_DIR/tools/,$INSTALL_PREFIX/etc/bash_completion.d/}neutron.bash_completion } # install_neutron_agent_packages() - Collect source and prepare @@ -733,7 +733,7 @@ function _neutron_setup_rootwrap() { echo "$USER ALL=(root) NOPASSWD: $ROOTWRAP_SUDOER_CMD" >$TEMPFILE chmod 0440 $TEMPFILE sudo chown root:root $TEMPFILE - sudo mv $TEMPFILE /usr/local/etc/sudoers.d/neutron-rootwrap + sudo mv $TEMPFILE $INSTALL_PREFIX/etc/sudoers.d/neutron-rootwrap # Update the root_helper iniset $NEUTRON_CONF agent root_helper "$Q_RR_COMMAND" diff --git a/lib/nova b/lib/nova index 96ff76e9f3..9de8651b7d 100644 --- a/lib/nova +++ b/lib/nova @@ -36,7 +36,7 @@ NOVA_STATE_PATH=${NOVA_STATE_PATH:=$DATA_DIR/nova} NOVA_INSTANCES_PATH=${NOVA_INSTANCES_PATH:=${INSTANCES_PATH:=$NOVA_STATE_PATH/instances}} NOVA_AUTH_CACHE_DIR=${NOVA_AUTH_CACHE_DIR:-/var/cache/nova} -NOVA_CONF_DIR=${NOVA_CONF_DIR:-/etc/nova} +NOVA_CONF_DIR=${NOVA_CONF_DIR:-$INSTALL_PREFIX/etc/nova} NOVA_CONF=$NOVA_CONF_DIR/nova.conf NOVA_CELLS_CONF=$NOVA_CONF_DIR/nova-cells.conf NOVA_CELLS_DB=${NOVA_CELLS_DB:-nova_cell} @@ -71,7 +71,7 @@ FORCE_CONFIG_DRIVE=${FORCE_CONFIG_DRIVE:-"always"} # should work in most cases. SCHEDULER=${SCHEDULER:-nova.scheduler.filter_scheduler.FilterScheduler} -QEMU_CONF=/etc/libvirt/qemu.conf +QEMU_CONF=$INSTALL_PREFIX/etc/libvirt/qemu.conf NOVNC_DIR=$DEST/noVNC SPICE_DIR=$DEST/spice-html5 @@ -204,7 +204,7 @@ function configure_nova_rootwrap() { echo "$USER ALL=(root) NOPASSWD: $ROOTWRAP_SUDOER_CMD" >$TEMPFILE chmod 0440 $TEMPFILE sudo chown root:wheel $TEMPFILE - sudo mv $TEMPFILE /usr/local/etc/sudoers.d/nova-rootwrap + sudo mv $TEMPFILE $INSTALL_PREFIX/etc/sudoers.d/nova-rootwrap } # configure_nova() - Set config files, create data dirs, etc @@ -594,7 +594,7 @@ function init_nova() { function install_novaclient() { git_clone $NOVACLIENT_REPO $NOVACLIENT_DIR $NOVACLIENT_BRANCH setup_develop $NOVACLIENT_DIR - sudo install -m 0644 -o $STACK_USER {$NOVACLIENT_DIR/tools/,/usr/local/etc/bash_completion.d/}nova.bash_completion + sudo install -m 0644 -o $STACK_USER {$NOVACLIENT_DIR/tools/,$INSTALL_PREFIX/etc/bash_completion.d/}nova.bash_completion } # install_nova() - Collect source and prepare @@ -605,7 +605,7 @@ function install_nova() { git_clone $NOVA_REPO $NOVA_DIR $NOVA_BRANCH setup_develop $NOVA_DIR - sudo install -m 0644 -o $STACK_USER {$NOVA_DIR/tools/,/usr/local/etc/bash_completion.d/}nova-manage.bash_completion + sudo install -m 0644 -o $STACK_USER {$NOVA_DIR/tools/,$INSTALL_PREFIX/etc/bash_completion.d/}nova-manage.bash_completion } # start_nova_api() - Start the API process ahead of other things diff --git a/lib/savanna b/lib/savanna index e9dbe72643..7b4e3d19ee 100644 --- a/lib/savanna +++ b/lib/savanna @@ -26,7 +26,7 @@ SAVANNA_BRANCH=${SAVANNA_BRANCH:-master} # Set up default directories SAVANNA_DIR=$DEST/savanna -SAVANNA_CONF_DIR=${SAVANNA_CONF_DIR:-/etc/savanna} +SAVANNA_CONF_DIR=${SAVANNA_CONF_DIR:-$INSTALL_PREFIX/etc/savanna} SAVANNA_CONF_FILE=savanna.conf ADMIN_TENANT_NAME=${ADMIN_TENANT_NAME:-admin} ADMIN_NAME=${ADMIN_NAME:-admin} diff --git a/lib/swift b/lib/swift index 319c6a7e0f..da4189ed9d 100644 --- a/lib/swift +++ b/lib/swift @@ -46,7 +46,7 @@ SWIFT_DISK_IMAGE=${SWIFT_DATA_DIR}/drives/images/swift.img # Set ``SWIFT_CONF_DIR`` to the location of the configuration files. # Default is ``/etc/swift``. # TODO(dtroyer): remove SWIFT_CONFIG_DIR after cutting stable/grizzly -SWIFT_CONF_DIR=${SWIFT_CONF_DIR:-${SWIFT_CONFIG_DIR:-/etc/swift}} +SWIFT_CONF_DIR=${SWIFT_CONF_DIR:-${SWIFT_CONFIG_DIR:-$INSTALL_PREFIX/etc/swift}} if is_service_enabled s-proxy && is_service_enabled swift3; then # If we are using swift3, we can default the s3 port to swift instead @@ -131,7 +131,7 @@ function _cleanup_swift_apache_wsgi() { for type in object container account; do site_name=${type}-server-${node_number} disable_apache_site ${site_name} - sudo rm -f /etc/$APACHE_NAME/$APACHE_CONF_DIR/${site_name} + sudo rm -f $INSTALL_PREFIX/etc/$APACHE_NAME/$APACHE_CONF_DIR/${site_name} done done } @@ -139,7 +139,7 @@ function _cleanup_swift_apache_wsgi() { # _config_swift_apache_wsgi() - Set WSGI config files of Swift function _config_swift_apache_wsgi() { sudo mkdir -p ${SWIFT_APACHE_WSGI_DIR} - local apache_vhost_dir=/etc/${APACHE_NAME}/$APACHE_CONF_DIR + local apache_vhost_dir=$INSTALL_PREFIX/etc/${APACHE_NAME}/$APACHE_CONF_DIR local proxy_port=${SWIFT_DEFAULT_BIND_PORT:-8080} # copy proxy vhost and wsgi file @@ -240,7 +240,7 @@ function configure_swift() { s/%GROUP%/${USER_GROUP}/; s/%USER%/$USER/; s,%SWIFT_DATA_DIR%,$SWIFT_DATA_DIR,; - " $FILES/swift/rsyncd.conf | sudo tee /etc/rsyncd.conf + " $FILES/swift/rsyncd.conf | sudo tee $INSTALL_PREFIX/etc/rsyncd.conf # rsyncd.conf just prepared for 4 nodes if is_ubuntu; then sudo sed -i '/^RSYNC_ENABLE=false/ { s/false/true/ }' /etc/default/rsync @@ -412,7 +412,7 @@ EOF mkdir -p ${swift_log_dir}/hourly sudo chown -R $USER:adm ${swift_log_dir} sed "s,%SWIFT_LOGDIR%,${swift_log_dir}," $FILES/swift/rsyslog.conf | sudo \ - tee /etc/rsyslog.d/10-swift.conf + tee $INSTALL_PREFIX/etc/rsyslog.d/10-swift.conf if is_apache_enabled_service swift; then _config_swift_apache_wsgi fi diff --git a/lib/template b/lib/template index 629e110271..7a59d03e10 100644 --- a/lib/template +++ b/lib/template @@ -29,7 +29,7 @@ set +o xtrace # Set up default directories XXXX_DIR=$DEST/XXXX -XXX_CONF_DIR=/etc/XXXX +XXX_CONF_DIR=$INSTALL_PREFIX/etc/XXXX # Entry Points diff --git a/localrc.slave b/localrc.slave index 01e4e61015..22f9753027 100644 --- a/localrc.slave +++ b/localrc.slave @@ -14,9 +14,6 @@ HOST_IP=10.100.1.21 DEST=/home/stack -#GLANCE_CONF_DIR=/usr/local/etc/glance -#NOVA_CONF_DIR=/usr/local/etc/nova - # Logging LOGFILE=$DEST/logs/stack.sh.log LOG_COLOR=False diff --git a/stack.sh b/stack.sh index 9d2cfcddf9..e205461a3a 100755 --- a/stack.sh +++ b/stack.sh @@ -786,16 +786,16 @@ if [[ $SYSLOG != "False" ]]; then \$ModLoad imrelp \$InputRELPServerRun $SYSLOG_PORT EOF - sudo mv /tmp/90-stack-m.conf /etc/rsyslog.d + sudo mv /tmp/90-stack-m.conf $INSTALL_PREFIX/etc/rsyslog.d else # Set rsyslog to send to remote host cat </tmp/90-stack-s.conf *.* :omrelp:$SYSLOG_HOST:$SYSLOG_PORT EOF - sudo mv /tmp/90-stack-s.conf /etc/rsyslog.d + sudo mv /tmp/90-stack-s.conf $INSTALL_PREFIX/etc/rsyslog.d fi - RSYSLOGCONF="/etc/rsyslog.conf" + RSYSLOGCONF="$INSTALL_PREFIX/etc/rsyslog.conf" if [ -f $RSYSLOGCONF ]; then sudo cp -b $RSYSLOGCONF $RSYSLOGCONF.bak if [[ $(grep '$SystemLogRateLimitBurst' $RSYSLOGCONF) ]]; then diff --git a/stackrc b/stackrc index defcd6c207..3e6c69c701 100644 --- a/stackrc +++ b/stackrc @@ -13,6 +13,9 @@ else STACK_USER=${STACK_USER:-$(whoami)} fi +# Set local system prefix i.e. /usr/local or empty +INSTALL_PREFIX=$(get_install_prefix) + # Specify which services to launch. These generally correspond to # screen tabs. To change the default list, use the ``enable_service`` and # ``disable_service`` functions in ``localrc``. diff --git a/tests/functions.sh b/tests/functions.sh index 40376aa63f..5e5662ed50 100755 --- a/tests/functions.sh +++ b/tests/functions.sh @@ -44,7 +44,7 @@ cat >test.ini <test.conf </dev/null; then fi echo "Giving stack user passwordless sudo privileges" -if is_freebsd; then - SUDOERS_PREFIX='/usr/local' -fi -SUDOERS_ETC_FILE="$SUDOERS_PREFIX/etc/sudoers" -SUDOERS_STACK_FILE="$SUDOERS_PREFIX/etc/sudoers.d/50_stack_sh" +SUDOERS_ETC_FILE="$INSTALL_PREFIX/etc/sudoers" +SUDOERS_STACK_FILE="$INSTALL_PREFIX/etc/sudoers.d/50_stack_sh" # UEC images ``/etc/sudoers`` does not have a ``#includedir``, add one -grep -q "^#includedir.*/usr/local/etc/sudoers.d" $SUDOERS_ETC_FILE || - echo "#includedir /usr/local/etc/sudoers.d" >> $SUDOERS_ETC_FILE +grep -q "^#includedir.*$INSTALL_PREFIX/etc/sudoers.d" $SUDOERS_ETC_FILE || + echo "#includedir $INSTALL_PREFIX/etc/sudoers.d" >> $SUDOERS_ETC_FILE ( umask 226 && echo "$STACK_USER ALL=(ALL) NOPASSWD:ALL" \ > $SUDOERS_STACK_FILE ) From a5df923344483d4b8842609db6ad4d24dece88bb Mon Sep 17 00:00:00 2001 From: Rafal Jaworowski Date: Mon, 18 Nov 2013 13:39:36 +0000 Subject: [PATCH 05/30] rootwrap: Use FreeBSD specific *.filters files and root:wheel configuration. --- lib/nova | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/nova b/lib/nova index 9de8651b7d..19ab6912db 100644 --- a/lib/nova +++ b/lib/nova @@ -181,6 +181,12 @@ function cleanup_nova() { # configure_nova_rootwrap() - configure Nova's rootwrap function configure_nova_rootwrap() { + local filters_dir="$NOVA_DIR/etc/nova/rootwrap.d" + local root_group="root" + if is_freebsd; then + filters_dir="$filters_dir/freebsd" + root_group="wheel" + fi # Deploy new rootwrap filters files (owned by root). # Wipe any existing rootwrap.d files first if [[ -d $NOVA_CONF_DIR/rootwrap.d ]]; then @@ -188,13 +194,13 @@ function configure_nova_rootwrap() { fi # Deploy filters to /etc/nova/rootwrap.d sudo mkdir -m 755 $NOVA_CONF_DIR/rootwrap.d - sudo cp $NOVA_DIR/etc/nova/rootwrap.d/*.filters $NOVA_CONF_DIR/rootwrap.d - sudo chown -R root:wheel $NOVA_CONF_DIR/rootwrap.d + sudo cp $filters_dir/*.filters $NOVA_CONF_DIR/rootwrap.d + sudo chown -R root:$root_group $NOVA_CONF_DIR/rootwrap.d sudo chmod 644 $NOVA_CONF_DIR/rootwrap.d/* # Set up rootwrap.conf, pointing to /etc/nova/rootwrap.d sudo cp $NOVA_DIR/etc/nova/rootwrap.conf $NOVA_CONF_DIR/ sudo sed -e "s:^filters_path=.*$:filters_path=$NOVA_CONF_DIR/rootwrap.d:" -i '' $NOVA_CONF_DIR/rootwrap.conf - sudo chown root:wheel $NOVA_CONF_DIR/rootwrap.conf + sudo chown root:$root_group $NOVA_CONF_DIR/rootwrap.conf sudo chmod 0644 $NOVA_CONF_DIR/rootwrap.conf # Specify rootwrap.conf as first parameter to nova-rootwrap ROOTWRAP_SUDOER_CMD="$NOVA_ROOTWRAP $NOVA_CONF_DIR/rootwrap.conf *" @@ -203,7 +209,7 @@ function configure_nova_rootwrap() { TEMPFILE=`mktemp` echo "$USER ALL=(root) NOPASSWD: $ROOTWRAP_SUDOER_CMD" >$TEMPFILE chmod 0440 $TEMPFILE - sudo chown root:wheel $TEMPFILE + sudo chown root:$root_group $TEMPFILE sudo mv $TEMPFILE $INSTALL_PREFIX/etc/sudoers.d/nova-rootwrap } From 17e44b39dfac3ef94444c137eab884ef4d519faa Mon Sep 17 00:00:00 2001 From: Rafal Jaworowski Date: Mon, 18 Nov 2013 16:10:16 +0000 Subject: [PATCH 06/30] localrc: Adjust local config. --- localrc.slave | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/localrc.slave b/localrc.slave index 22f9753027..b30a7bcd12 100644 --- a/localrc.slave +++ b/localrc.slave @@ -2,13 +2,16 @@ STACK_USER=stack # Passwords -ADMIN_PASSWORD=1qaz +ADMIN_PASSWORD=c0ntrail123 MYSQL_PASSWORD=$ADMIN_PASSWORD SERVICE_TOKEN=$ADMIN_PASSWORD SERVICE_PASSWORD=$ADMIN_PASSWORD RABBIT_PASSWORD=$ADMIN_PASSWORD STACK_USER_PASSWORD=1qaz +OS_USERNAME=admin +OS_TENANT_NAME=admin + HOST_IP_IFACE=igb0 HOST_IP=10.100.1.21 From 76bcdbc0487b8f256daee98a70181f81fc91efe6 Mon Sep 17 00:00:00 2001 From: Rafal Jaworowski Date: Wed, 20 Nov 2013 13:42:43 +0000 Subject: [PATCH 07/30] functions: Fixe get_default_host_ip() for FreeBSD. --- functions | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/functions b/functions index c542064d18..b3bc7daefa 100644 --- a/functions +++ b/functions @@ -225,18 +225,20 @@ function get_default_host_ip() { local host_ip_iface=$3 local host_ip=$4 - # XXX TODO + # Find the interface used for the default route if is_freebsd; then - echo $host_ip - return + host_ip_iface=${host_ip_iface:-$(netstat -rn | grep default | awk '{print $6}')} + else + host_ip_iface=${host_ip_iface:-$(ip route | sed -n '/^default/{ s/.*dev \(\w\+\)\s\+.*/\1/; p; }' | head -1)} fi - - # Find the interface used for the default route - host_ip_iface=${host_ip_iface:-$(ip route | sed -n '/^default/{ s/.*dev \(\w\+\)\s\+.*/\1/; p; }' | head -1)} # Search for an IP unless an explicit is set by ``HOST_IP`` environment variable if [ -z "$host_ip" -o "$host_ip" == "dhcp" ]; then host_ip="" - host_ips=`LC_ALL=C ip -f inet addr show ${host_ip_iface} | awk '/inet/ {split($2,parts,"/"); print parts[1]}'` + if is_freebsd; then + host_ips=`ifconfig ${host_ip_iface} | grep 'inet ' | cut -d' ' -f2` + else + host_ips=`LC_ALL=C ip -f inet addr show ${host_ip_iface} | awk '/inet/ {split($2,parts,"/"); print parts[1]}'` + fi for IP in $host_ips; do # Attempt to filter out IP addresses that are part of the fixed and # floating range. Note that this method only works if the ``netaddr`` From 128a79d0afd136624bc4cd41ccd0b94bae5fbec9 Mon Sep 17 00:00:00 2001 From: Rafal Jaworowski Date: Wed, 20 Nov 2013 14:01:07 +0000 Subject: [PATCH 08/30] nova: Default FreeBSD settings for nova.conf. --- lib/nova | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/nova b/lib/nova index 19ab6912db..acf3d480ca 100644 --- a/lib/nova +++ b/lib/nova @@ -407,6 +407,12 @@ function create_nova_conf() { iniset $NOVA_CONF DEFAULT bindir "/usr/bin" fi + if is_freebsd; then + # FreeBSD specific settings + iniset $NOVA_CONF DEFAULT network_driver "nova.network.freebsd_net" + iniset $NOVA_CONF DEFAULT l3_lib "nova.network.l3.FreeBSDNetL3" + fi + if is_service_enabled n-api; then iniset $NOVA_CONF DEFAULT enabled_apis "$NOVA_ENABLED_APIS" if is_service_enabled tls-proxy; then From f7a0c64e69adb16dc0de31e2ffe0c620ae3df731 Mon Sep 17 00:00:00 2001 From: Rafal Jaworowski Date: Wed, 20 Nov 2013 14:01:56 +0000 Subject: [PATCH 09/30] localrc: Clean up. --- localrc.slave | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/localrc.slave b/localrc.slave index b30a7bcd12..9d29635866 100644 --- a/localrc.slave +++ b/localrc.slave @@ -12,9 +12,6 @@ STACK_USER_PASSWORD=1qaz OS_USERNAME=admin OS_TENANT_NAME=admin -HOST_IP_IFACE=igb0 -HOST_IP=10.100.1.21 - DEST=/home/stack # Logging @@ -39,8 +36,8 @@ SWIFT_REPLICAS=1 # Slave host components #MULTI_HOST=True -ENABLED_SERVICES=n-cpu -#ENABLED_SERVICES=n-cpu,n-api-meta +#ENABLED_SERVICES=n-cpu +ENABLED_SERVICES=n-cpu,n-api-meta,n-net #ENABLED_SERVICES=n-cpu,n-net #ENABLED_SERVICES=n-cpu,n-net,g-api #ENABLED_SERVICES=n-cpu,rabbit,n-net,g-api @@ -57,7 +54,7 @@ PUBLIC_INTERFACE=bridge0 VLAN_INTERFACE=igb0 DATABASE_TYPE=mysql -SERVICE_HOST=10.100.1.11 +SERVICE_HOST=10.100.2.31 MYSQL_HOST=$SERVICE_HOST RABBIT_HOST=$SERVICE_HOST KEYSTONE_AUTH_HOST=$SERVICE_HOST From 8115fc6d7f7cfb5284b0f5136761dc6f4b35b417 Mon Sep 17 00:00:00 2001 From: Michal Dubiel Date: Wed, 20 Nov 2013 15:18:17 +0000 Subject: [PATCH 10/30] nova: Initial bhyve hypervisor support. --- lib/nova_plugins/hypervisor-bhyve | 77 +++++++++++++++++++++++++++++++ localrc.slave | 2 +- 2 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 lib/nova_plugins/hypervisor-bhyve diff --git a/lib/nova_plugins/hypervisor-bhyve b/lib/nova_plugins/hypervisor-bhyve new file mode 100644 index 0000000000..5f62283f39 --- /dev/null +++ b/lib/nova_plugins/hypervisor-bhyve @@ -0,0 +1,77 @@ +# lib/nova_plugins/hypervisor-bhyve +# Configure the bhyve hypervisor + +# Enable with: +# VIRT_DRIVER=bhyve + +# Dependencies: +# ``functions`` file +# ``nova`` configuration + +# install_nova_hypervisor - install any external requirements +# configure_nova_hypervisor - make configuration changes, including those to other services +# start_nova_hypervisor - start any external services +# stop_nova_hypervisor - stop any external services +# cleanup_nova_hypervisor - remove transient data and cache + +# Save trace setting +MY_XTRACE=$(set +o | grep xtrace) +set +o xtrace + + +# Defaults +# -------- + + +# Entry Points +# ------------ + +# clean_nova_hypervisor - Clean up an installation +function cleanup_nova_hypervisor() { + # This function intentionally left blank + : +} + +# configure_nova_hypervisor - Set config files, create data dirs, etc +function configure_nova_hypervisor() { + iniset $NOVA_CONF DEFAULT compute_driver "nova.virt.bhyve.BhyveDriver" + # Disable arbitrary limits + iniset $NOVA_CONF DEFAULT quota_instances -1 + iniset $NOVA_CONF DEFAULT quota_cores -1 + iniset $NOVA_CONF DEFAULT quota_ram -1 + iniset $NOVA_CONF DEFAULT quota_floating_ips -1 + iniset $NOVA_CONF DEFAULT quota_fixed_ips -1 + iniset $NOVA_CONF DEFAULT quota_metadata_items -1 + iniset $NOVA_CONF DEFAULT quota_injected_files -1 + iniset $NOVA_CONF DEFAULT quota_injected_file_path_bytes -1 + iniset $NOVA_CONF DEFAULT quota_security_groups -1 + iniset $NOVA_CONF DEFAULT quota_security_group_rules -1 + iniset $NOVA_CONF DEFAULT quota_key_pairs -1 + iniset $NOVA_CONF DEFAULT scheduler_default_filters "RetryFilter,AvailabilityZoneFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter" +} + +# install_nova_hypervisor() - Install external components +function install_nova_hypervisor() { + # This function intentionally left blank + : +} + +# start_nova_hypervisor - Start any required external services +function start_nova_hypervisor() { + # This function intentionally left blank + : +} + +# stop_nova_hypervisor - Stop any external services +function stop_nova_hypervisor() { + # This function intentionally left blank + : +} + + +# Restore xtrace +$MY_XTRACE + +# Local variables: +# mode: shell-script +# End: diff --git a/localrc.slave b/localrc.slave index 9d29635866..9823e510f3 100644 --- a/localrc.slave +++ b/localrc.slave @@ -45,7 +45,7 @@ ENABLED_SERVICES=n-cpu,n-api-meta,n-net #ENABLED_SERVICES=n-cpu,n-net,n-api #ENABLED_SERVICES=n-cpu,n-net,n-api,n-vol -VIRT_DRIVER=fake +VIRT_DRIVER=bhyve #NUMBER_FAKE_NOVA_COMPUTE=2 FLAT_INTERFACE=igb0 From 619398acc00c4b148d9d6c4aaffe7f7d23061844 Mon Sep 17 00:00:00 2001 From: Rafal Jaworowski Date: Fri, 22 Nov 2013 14:55:21 +0100 Subject: [PATCH 11/30] Another missing pkg dependency. E.g. without py27-sqlite3 nova-manage crashes. --- files/pkg-freebsd/nova | 1 + 1 file changed, 1 insertion(+) diff --git a/files/pkg-freebsd/nova b/files/pkg-freebsd/nova index 73c0877078..7f3860ff77 100644 --- a/files/pkg-freebsd/nova +++ b/files/pkg-freebsd/nova @@ -9,5 +9,6 @@ py27-greenlet py27-kombu py27-lockfile py27-mox +py27-sqlite3 rabbitmq # NOPRIME sudo From 7bb577d1d004a2d393ec9cd3370fd38bd37b8134 Mon Sep 17 00:00:00 2001 From: Rafal Jaworowski Date: Fri, 22 Nov 2013 14:56:40 +0100 Subject: [PATCH 12/30] localrc: More network settings. --- localrc.slave | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/localrc.slave b/localrc.slave index 9823e510f3..fd78a66465 100644 --- a/localrc.slave +++ b/localrc.slave @@ -35,7 +35,11 @@ SWIFT_REPLICAS=1 #FORCE_PREREQ=1 # Slave host components -#MULTI_HOST=True +MULTI_HOST=True +FIXED_RANGE=172.24.17.0/24 +FIXED_NETWORK_SIZE=254 +FLOATING_RANGE=192.168.1.128/25 + #ENABLED_SERVICES=n-cpu ENABLED_SERVICES=n-cpu,n-api-meta,n-net #ENABLED_SERVICES=n-cpu,n-net From 2104c5c9ef1243ce5f5880ed14f9961951b40e9d Mon Sep 17 00:00:00 2001 From: Michal Dubiel Date: Wed, 4 Dec 2013 13:19:11 +0100 Subject: [PATCH 13/30] bhyve: Add loading/unloading the vmm module if using bhyve hypervisor. --- lib/nova_plugins/hypervisor-bhyve | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/nova_plugins/hypervisor-bhyve b/lib/nova_plugins/hypervisor-bhyve index 5f62283f39..1d4d1d213e 100644 --- a/lib/nova_plugins/hypervisor-bhyve +++ b/lib/nova_plugins/hypervisor-bhyve @@ -58,14 +58,12 @@ function install_nova_hypervisor() { # start_nova_hypervisor - Start any required external services function start_nova_hypervisor() { - # This function intentionally left blank - : + sudo kldload vmm } # stop_nova_hypervisor - Stop any external services function stop_nova_hypervisor() { - # This function intentionally left blank - : + sudo kldunload vmm } From a3cd48a77bc4e2c0d15c7001048464acfbbddbb9 Mon Sep 17 00:00:00 2001 From: Michal Dubiel Date: Wed, 4 Dec 2013 14:55:09 +0100 Subject: [PATCH 14/30] rootwrap: Add /usr/local/{bin,sbin} to exec_dirs in rootwrap.conf for FreeBSD. --- lib/nova | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/nova b/lib/nova index acf3d480ca..ab44818080 100644 --- a/lib/nova +++ b/lib/nova @@ -200,6 +200,9 @@ function configure_nova_rootwrap() { # Set up rootwrap.conf, pointing to /etc/nova/rootwrap.d sudo cp $NOVA_DIR/etc/nova/rootwrap.conf $NOVA_CONF_DIR/ sudo sed -e "s:^filters_path=.*$:filters_path=$NOVA_CONF_DIR/rootwrap.d:" -i '' $NOVA_CONF_DIR/rootwrap.conf + if is_freebsd; then + sudo sed -e "/^exec_dirs=/ s:$:,/usr/local/bin,/usr/local/sbin:" -i '' $NOVA_CONF_DIR/rootwrap.conf + fi sudo chown root:$root_group $NOVA_CONF_DIR/rootwrap.conf sudo chmod 0644 $NOVA_CONF_DIR/rootwrap.conf # Specify rootwrap.conf as first parameter to nova-rootwrap From c7118755291555d57b579f89f93a04b4025cc4b2 Mon Sep 17 00:00:00 2001 From: Rafal Jaworowski Date: Thu, 5 Dec 2013 16:39:43 +0100 Subject: [PATCH 15/30] More pkg dependencies required for nova --- files/pkg-freebsd/nova | 3 +++ 1 file changed, 3 insertions(+) diff --git a/files/pkg-freebsd/nova b/files/pkg-freebsd/nova index 7f3860ff77..08d2ac667a 100644 --- a/files/pkg-freebsd/nova +++ b/files/pkg-freebsd/nova @@ -1,6 +1,9 @@ +arping curl +dnsmasq gawk mysql55-server # NOPRIME +netmask py27-MySQLdb py27-libxml2 py27-eventlet From b9e078d140507a655608112f2f2c21d83ed623a5 Mon Sep 17 00:00:00 2001 From: Rafal Jaworowski Date: Thu, 5 Dec 2013 16:40:18 +0100 Subject: [PATCH 16/30] nova: set 'bindir' to host specific value This is a workaround for problems with different sys.prefix Python settings (used i.e. by nova/paths.py). On Linux it typically is /usr while on FreeBSD /usr/local is returned by sys.prefix, so nova functions like bindir_def() return wrong paths. --- lib/nova | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/nova b/lib/nova index ab44818080..b607793cc5 100644 --- a/lib/nova +++ b/lib/nova @@ -412,6 +412,7 @@ function create_nova_conf() { if is_freebsd; then # FreeBSD specific settings + iniset $NOVA_CONF DEFAULT bindir "/usr/local/bin" iniset $NOVA_CONF DEFAULT network_driver "nova.network.freebsd_net" iniset $NOVA_CONF DEFAULT l3_lib "nova.network.l3.FreeBSDNetL3" fi From 8467e7f0e618995456f1340446c0331064bf9544 Mon Sep 17 00:00:00 2001 From: Michal Dubiel Date: Thu, 5 Dec 2013 17:44:25 +0100 Subject: [PATCH 17/30] pkg-freebsd: Add tmux to n-cpu dependencies. --- files/pkg-freebsd/n-cpu | 1 + 1 file changed, 1 insertion(+) diff --git a/files/pkg-freebsd/n-cpu b/files/pkg-freebsd/n-cpu index 5bb2e3e5f6..b750c4db5e 100644 --- a/files/pkg-freebsd/n-cpu +++ b/files/pkg-freebsd/n-cpu @@ -4,3 +4,4 @@ #genisoimage #sysfsutils #python-libguestfs +tmux From 2d91d1e7a1e8ab77bc409158098c073c0a63d126 Mon Sep 17 00:00:00 2001 From: Rafal Jaworowski Date: Tue, 10 Dec 2013 16:44:47 +0100 Subject: [PATCH 18/30] Clean up pkg dependencies list The 'pkg install' fails when there's a duplicate entry on the list of packages to install, e.g: pkg: No packages matching 'curl' has been found in the repositories This happens when either there's explicit duplicate or a package gets on the list indirectly because of a dependency on it. This commit works around this problem by avoiding duplicates, but we should fix the root cause in 'pkg' one day. --- files/pkg-freebsd/nova | 2 -- 1 file changed, 2 deletions(-) diff --git a/files/pkg-freebsd/nova b/files/pkg-freebsd/nova index 08d2ac667a..9566f60e7b 100644 --- a/files/pkg-freebsd/nova +++ b/files/pkg-freebsd/nova @@ -1,5 +1,4 @@ arping -curl dnsmasq gawk mysql55-server # NOPRIME @@ -8,7 +7,6 @@ py27-MySQLdb py27-libxml2 py27-eventlet py27-gflags -py27-greenlet py27-kombu py27-lockfile py27-mox From e05a3564fcec01e9e86d70562f82261aa5a43bd4 Mon Sep 17 00:00:00 2001 From: Rafal Jaworowski Date: Tue, 10 Dec 2013 16:52:34 +0100 Subject: [PATCH 19/30] Clean up n-cpu pkg list --- files/pkg-freebsd/n-cpu | 6 ------ 1 file changed, 6 deletions(-) diff --git a/files/pkg-freebsd/n-cpu b/files/pkg-freebsd/n-cpu index b750c4db5e..b80ce06636 100644 --- a/files/pkg-freebsd/n-cpu +++ b/files/pkg-freebsd/n-cpu @@ -1,7 +1 @@ -#sg3_utils -#iscsi-initiator-utils -#lvm2 -#genisoimage -#sysfsutils -#python-libguestfs tmux From c73f361d5a285552bea7f96e6196ee36be402422 Mon Sep 17 00:00:00 2001 From: Michal Dubiel Date: Fri, 13 Dec 2013 11:55:29 +0100 Subject: [PATCH 20/30] localrc: Use master branches, not stable/havana. Our nova repo is systematically merged with openstack's nova repo master branch. We want other components to be from master branches also. --- localrc.slave | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/localrc.slave b/localrc.slave index fd78a66465..fa9e805fc8 100644 --- a/localrc.slave +++ b/localrc.slave @@ -68,21 +68,6 @@ GLANCE_HOSTPORT=$SERVICE_HOST:9292 NOVA_REPO=https://github.com/Semihalf/openstack-nova.git NOVA_BRANCH=freebsd -# Branches for other components: services only, not including clients etc. -BRANCH_STABLE=stable/havana -CEILOMETER_BRANCH=$BRANCH_STABLE -CINDER_BRANCH=$BRANCH_STABLE -GLANCE_BRANCH=$BRANCH_STABLE -HEAT_BRANCH=$BRANCH_STABLE -HORIZON_BRANCH=$BRANCH_STABLE -KEYSTONE_BRANCH=$BRANCH_STABLE -OSLOCFG_BRANCH=$BRANCH_STABLE -NEUTRON_BRANCH=$BRANCH_STABLE -REQUIREMENTS_BRANCH=$BRANCH_STABLE -SWIFT_BRANCH=$BRANCH_STABLE -TEMPEST_BRANCH=$BRANCH_STABLE -TROVE_BRANCH=$BRANCH_STABLE - # # XXX From 1d9003f8aefbcd1baee35f04c2891e9ddd17c557 Mon Sep 17 00:00:00 2001 From: Rafal Jaworowski Date: Mon, 16 Dec 2013 15:11:49 +0100 Subject: [PATCH 21/30] localrc: Use secondary i/f for the flat VM network --- localrc.slave | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/localrc.slave b/localrc.slave index fa9e805fc8..c908161e61 100644 --- a/localrc.slave +++ b/localrc.slave @@ -52,10 +52,10 @@ ENABLED_SERVICES=n-cpu,n-api-meta,n-net VIRT_DRIVER=bhyve #NUMBER_FAKE_NOVA_COMPUTE=2 -FLAT_INTERFACE=igb0 +FLAT_INTERFACE=igb1 FLAT_NETWORK_BRIDGE=bridge0 PUBLIC_INTERFACE=bridge0 -VLAN_INTERFACE=igb0 +VLAN_INTERFACE=igb1 DATABASE_TYPE=mysql SERVICE_HOST=10.100.2.31 From 8fee470303db83c1c70080db5be6689021f67268 Mon Sep 17 00:00:00 2001 From: Rafal Jaworowski Date: Mon, 16 Dec 2013 15:13:11 +0100 Subject: [PATCH 22/30] localrc: Recycle --- localrc.slave | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/localrc.slave b/localrc.slave index c908161e61..c52e5775b5 100644 --- a/localrc.slave +++ b/localrc.slave @@ -43,14 +43,8 @@ FLOATING_RANGE=192.168.1.128/25 #ENABLED_SERVICES=n-cpu ENABLED_SERVICES=n-cpu,n-api-meta,n-net #ENABLED_SERVICES=n-cpu,n-net -#ENABLED_SERVICES=n-cpu,n-net,g-api -#ENABLED_SERVICES=n-cpu,rabbit,n-net,g-api -#ENABLED_SERVICES=n-vol,n-cpu,n-net,n-api -#ENABLED_SERVICES=n-cpu,n-net,n-api -#ENABLED_SERVICES=n-cpu,n-net,n-api,n-vol VIRT_DRIVER=bhyve -#NUMBER_FAKE_NOVA_COMPUTE=2 FLAT_INTERFACE=igb1 FLAT_NETWORK_BRIDGE=bridge0 @@ -67,21 +61,3 @@ GLANCE_HOSTPORT=$SERVICE_HOST:9292 # Nova development repo NOVA_REPO=https://github.com/Semihalf/openstack-nova.git NOVA_BRANCH=freebsd - - -# -# XXX -# - -# From http://devstack.org/guides/multinode-lab.html -#FLAT_INTERFACE=eth0 -#FIXED_RANGE=10.4.128.0/20 -#FIXED_NETWORK_SIZE=4096 -#FLOATING_RANGE=192.168.42.128/25 -#ENABLED_SERVICES=n-cpu,n-net,n-api,c-sch,c-api,c-vol - -# From README.md -#ENABLED_SERVICES=n-cpu,rabbit,g-api,neutron,q-agt -#SERVICE_HOST=[IP of controller node] -#Q_HOST=$SERVICE_HOST -#MATCHMAKER_REDIS_HOST=$SERVICE_HOST From f08bfb42a4aff556b5f5f67fe0030f84952edcdc Mon Sep 17 00:00:00 2001 From: Rafal Jaworowski Date: Mon, 16 Dec 2013 15:48:40 +0100 Subject: [PATCH 23/30] nova: Suppress using dhcp_release upon instace deletion The dhcp_release is part of dnsmasq, but does not get built in FreeBSD port because of the Linux-specific netlink dependency. As a workaround we suppress forcing dhcp_release upon instance delete and rely on the system to reclaim the unused IPs upon lease expiry (together with a short timeout period). --- lib/nova | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/nova b/lib/nova index b607793cc5..7d32a4c0bb 100644 --- a/lib/nova +++ b/lib/nova @@ -415,6 +415,12 @@ function create_nova_conf() { iniset $NOVA_CONF DEFAULT bindir "/usr/local/bin" iniset $NOVA_CONF DEFAULT network_driver "nova.network.freebsd_net" iniset $NOVA_CONF DEFAULT l3_lib "nova.network.l3.FreeBSDNetL3" + + # XXX The dhcp_release is currently (2013.12) not available on + # FreeBSD, so we suppress it and also set a shorter timeout for + # reclaiming unused IPs by the system. + iniset $NOVA_CONF DEFAULT force_dhcp_release "False" + iniset $NOVA_CONF DEFAULT fixed_ip_disassocate_timeout "120" fi if is_service_enabled n-api; then From 51acbc93d4f01aac2d774f840226d4b980a0c7b1 Mon Sep 17 00:00:00 2001 From: Rafal Jaworowski Date: Thu, 19 Dec 2013 10:03:11 +0100 Subject: [PATCH 24/30] localrc: Adjust localrc.controller settings This is a working config for setting up a Linux-based control node. Note it's not a all-in-one configuration as the following services are disabled for control node (they are expected to be run on a FreeBSD-based compute node): - nova-network - nova-compute --- localrc.controller | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/localrc.controller b/localrc.controller index 31a8acb831..9153f21d00 100644 --- a/localrc.controller +++ b/localrc.controller @@ -1,13 +1,22 @@ -HOST_IP=192.168.42.11 -FLAT_INTERFACE=eth0 -FIXED_RANGE=10.4.128.0/20 -FIXED_NETWORK_SIZE=4096 -FLOATING_RANGE=192.168.42.128/25 -MULTI_HOST=1 -LOGFILE=/opt/stack/logs/stack.sh.log -ADMIN_PASSWORD=labstack -MYSQL_PASSWORD=supersecret -RABBIT_PASSWORD=supersecrete -SERVICE_PASSWORD=supersecrete -SERVICE_TOKEN=xyzpdqlazydog +LOGFILE=/home/stack/logs/stack.sh.log +LOG_COLOR=False +SCREEN_LOGDIR=/home/stack/logs/screen +ADMIN_PASSWORD=c0ntrail123 +DATABASE_PASSWORD=$ADMIN_PASSWORD +RABBIT_PASSWORD=$ADMIN_PASSWORD +SERVICE_TOKEN=$ADMIN_PASSWORD +SERVICE_PASSWORD=$ADMIN_PASSWORD + +OS_USERNAME=admin +OS_TENANT_NAME=admin + +MULTI_HOST=True + +FLOATING_RANGE=192.168.1.128/25 +FIXED_RANGE=172.24.17.0/24 +FIXED_NETWORK_SIZE=256 +FLAT_INTERFACE=igb1 +FLAT_NETWORK_BRIDGE=bridge0 + +disable_service n-cpu n-net From 7940d34a67a9a8d5d770c6250a0597615033245f Mon Sep 17 00:00:00 2001 From: Rafal Jaworowski Date: Thu, 19 Dec 2013 13:26:45 +0100 Subject: [PATCH 25/30] pkg: Clean up --- files/pkg-freebsd/general | 1 - files/pkg-freebsd/glance | 6 ------ files/pkg-freebsd/nova | 2 -- 3 files changed, 9 deletions(-) delete mode 100644 files/pkg-freebsd/glance diff --git a/files/pkg-freebsd/general b/files/pkg-freebsd/general index 3d94fdc3b7..d97a940518 100644 --- a/files/pkg-freebsd/general +++ b/files/pkg-freebsd/general @@ -4,7 +4,6 @@ git libxml2 libxslt psmisc -#pylint-py27 py27-pip py27-virtualenv screen diff --git a/files/pkg-freebsd/glance b/files/pkg-freebsd/glance deleted file mode 100644 index aaffee0739..0000000000 --- a/files/pkg-freebsd/glance +++ /dev/null @@ -1,6 +0,0 @@ -#libxml2 -#py27-argparse -#py27-eventlet -#py27-greenlet -#py27-xattr -#lzlib diff --git a/files/pkg-freebsd/nova b/files/pkg-freebsd/nova index 9566f60e7b..a64531c6a6 100644 --- a/files/pkg-freebsd/nova +++ b/files/pkg-freebsd/nova @@ -1,7 +1,6 @@ arping dnsmasq gawk -mysql55-server # NOPRIME netmask py27-MySQLdb py27-libxml2 @@ -11,5 +10,4 @@ py27-kombu py27-lockfile py27-mox py27-sqlite3 -rabbitmq # NOPRIME sudo From 06cc35b1438bcdd473f52f146c443c1435e4eb23 Mon Sep 17 00:00:00 2001 From: Rafal Jaworowski Date: Thu, 19 Dec 2013 17:56:36 +0100 Subject: [PATCH 26/30] functions: Encapsulate HOST_IP discovery routines No functional changes, just improve code structure and readability. --- functions | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/functions b/functions index b3bc7daefa..0fb2ac10ce 100644 --- a/functions +++ b/functions @@ -216,6 +216,30 @@ function get_field() { done } +# Get interface used for the default route +function get_default_iface() { + local iface + + if is_freebsd; then + iface=`netstat -rn | grep default | awk '{print $6}'` + else + iface=`ip route | sed -n '/^default/{ s/.*dev \(\w\+\)\s\+.*/\1/; p; }' | head -1` + fi + echo "$iface" +} + +# Get list of IPs on the interface +function get_host_ips() { + local iface=$1 + local ips + + if is_freebsd; then + ips=`ifconfig ${iface} | grep 'inet ' | cut -d' ' -f2` + else + ips=`LC_ALL=C ip -f inet addr show ${iface} | awk '/inet/ {split($2,parts,"/"); print parts[1]}'` + fi + echo "$ips" +} # Get the default value for HOST_IP # get_default_host_ip fixed_range floating_range host_ip_iface host_ip @@ -226,19 +250,11 @@ function get_default_host_ip() { local host_ip=$4 # Find the interface used for the default route - if is_freebsd; then - host_ip_iface=${host_ip_iface:-$(netstat -rn | grep default | awk '{print $6}')} - else - host_ip_iface=${host_ip_iface:-$(ip route | sed -n '/^default/{ s/.*dev \(\w\+\)\s\+.*/\1/; p; }' | head -1)} - fi + host_ip_iface=${host_ip_iface:-$(get_default_iface)} # Search for an IP unless an explicit is set by ``HOST_IP`` environment variable if [ -z "$host_ip" -o "$host_ip" == "dhcp" ]; then host_ip="" - if is_freebsd; then - host_ips=`ifconfig ${host_ip_iface} | grep 'inet ' | cut -d' ' -f2` - else - host_ips=`LC_ALL=C ip -f inet addr show ${host_ip_iface} | awk '/inet/ {split($2,parts,"/"); print parts[1]}'` - fi + host_ips=$(get_host_ips ${host_ip_iface}) for IP in $host_ips; do # Attempt to filter out IP addresses that are part of the fixed and # floating range. Note that this method only works if the ``netaddr`` From fef60b8041c862a8305c9028a1749cae6826d3e1 Mon Sep 17 00:00:00 2001 From: Rafal Jaworowski Date: Wed, 22 Jan 2014 16:10:49 +0100 Subject: [PATCH 27/30] lib: Reduce diff vs upstream devstack Revert our local changes for components not currently run nor tested on a FreeBSD host. There's little sense in providing changes for untested / unused components. --- lib/ceilometer | 2 +- lib/cinder | 14 +++++++------- lib/glance | 2 +- lib/heat | 2 +- lib/horizon | 2 +- lib/ironic | 2 +- lib/keystone | 10 +++++----- lib/neutron | 6 +++--- lib/rpc_backend | 2 +- lib/savanna | 2 +- lib/swift | 14 +++++++------- 11 files changed, 29 insertions(+), 29 deletions(-) diff --git a/lib/ceilometer b/lib/ceilometer index 7e0806e10e..f95ed302ce 100644 --- a/lib/ceilometer +++ b/lib/ceilometer @@ -37,7 +37,7 @@ set +o xtrace # Set up default directories CEILOMETER_DIR=$DEST/ceilometer CEILOMETERCLIENT_DIR=$DEST/python-ceilometerclient -CEILOMETER_CONF_DIR=$INSTALL_PREFIX/etc/ceilometer +CEILOMETER_CONF_DIR=/etc/ceilometer CEILOMETER_CONF=$CEILOMETER_CONF_DIR/ceilometer.conf CEILOMETER_API_LOG_DIR=/var/log/ceilometer-api CEILOMETER_AUTH_CACHE_DIR=${CEILOMETER_AUTH_CACHE_DIR:-/var/cache/ceilometer} diff --git a/lib/cinder b/lib/cinder index 82a8862578..20d6e615f6 100644 --- a/lib/cinder +++ b/lib/cinder @@ -34,7 +34,7 @@ CINDERCLIENT_DIR=$DEST/python-cinderclient CINDER_STATE_PATH=${CINDER_STATE_PATH:=$DATA_DIR/cinder} CINDER_AUTH_CACHE_DIR=${CINDER_AUTH_CACHE_DIR:-/var/cache/cinder} -CINDER_CONF_DIR=$INSTALL_PREFIX/etc/cinder +CINDER_CONF_DIR=/etc/cinder CINDER_CONF=$CINDER_CONF_DIR/cinder.conf CINDER_API_PASTE_INI=$CINDER_CONF_DIR/api-paste.ini @@ -202,7 +202,7 @@ function configure_cinder() { echo "$USER ALL=(root) NOPASSWD: $ROOTWRAP_CINDER_SUDOER_CMD" >$TEMPFILE chmod 0440 $TEMPFILE sudo chown root:root $TEMPFILE - sudo mv $TEMPFILE $INSTALL_PREFIX/etc/sudoers.d/cinder-rootwrap + sudo mv $TEMPFILE /etc/sudoers.d/cinder-rootwrap cp $CINDER_DIR/etc/cinder/api-paste.ini $CINDER_API_PASTE_INI @@ -483,14 +483,14 @@ function install_cinder() { function install_cinderclient() { git_clone $CINDERCLIENT_REPO $CINDERCLIENT_DIR $CINDERCLIENT_BRANCH setup_develop $CINDERCLIENT_DIR - sudo install -m 0644 -o $STACK_USER {$CINDERCLIENT_DIR/tools/,$INSTALL_PREFIX/etc/bash_completion.d/}cinder.bash_completion + sudo install -D -m 0644 -o $STACK_USER {$CINDERCLIENT_DIR/tools/,/etc/bash_completion.d/}cinder.bash_completion } # apply config.d approach for cinder volumes directory function _configure_tgt_for_config_d() { - if [[ ! -d $INSTALL_PREFIX/etc/tgt/stack.d/ ]]; then - sudo ln -sf $CINDER_STATE_PATH/volumes $INSTALL_PREFIX/etc/tgt/stack.d - echo "include $INSTALL_PREFIX/etc/tgt/stack.d/*" | sudo tee -a $INSTALL_PREFIX/etc/tgt/targets.conf + if [[ ! -d /etc/tgt/stack.d/ ]]; then + sudo ln -sf $CINDER_STATE_PATH/volumes /etc/tgt/stack.d + echo "include /etc/tgt/stack.d/*" | sudo tee -a /etc/tgt/targets.conf fi } @@ -498,7 +498,7 @@ function _configure_tgt_for_config_d() { function start_cinder() { if is_service_enabled c-vol; then # Delete any old stack.conf - sudo rm -f $INSTALL_PREFIX/etc/tgt/conf.d/stack.conf + sudo rm -f /etc/tgt/conf.d/stack.conf _configure_tgt_for_config_d if is_ubuntu; then # tgt in oneiric doesn't restart properly if tgtd isn't running diff --git a/lib/glance b/lib/glance index 759d4bedf5..eb727f1e2a 100644 --- a/lib/glance +++ b/lib/glance @@ -33,7 +33,7 @@ GLANCE_CACHE_DIR=${GLANCE_CACHE_DIR:=$DATA_DIR/glance/cache} GLANCE_IMAGE_DIR=${GLANCE_IMAGE_DIR:=$DATA_DIR/glance/images} GLANCE_AUTH_CACHE_DIR=${GLANCE_AUTH_CACHE_DIR:-/var/cache/glance} -GLANCE_CONF_DIR=${GLANCE_CONF_DIR:-$INSTALL_PREFIX/etc/glance} +GLANCE_CONF_DIR=${GLANCE_CONF_DIR:-/etc/glance} GLANCE_REGISTRY_CONF=$GLANCE_CONF_DIR/glance-registry.conf GLANCE_API_CONF=$GLANCE_CONF_DIR/glance-api.conf GLANCE_REGISTRY_PASTE_INI=$GLANCE_CONF_DIR/glance-registry-paste.ini diff --git a/lib/heat b/lib/heat index aaa8573353..bf4d4bce9c 100644 --- a/lib/heat +++ b/lib/heat @@ -33,7 +33,7 @@ HEAT_DIR=$DEST/heat HEATCLIENT_DIR=$DEST/python-heatclient HEAT_AUTH_CACHE_DIR=${HEAT_AUTH_CACHE_DIR:-/var/cache/heat} HEAT_STANDALONE=`trueorfalse False $HEAT_STANDALONE` -HEAT_CONF_DIR=$INSTALL_PREFIX/etc/heat +HEAT_CONF_DIR=/etc/heat HEAT_CONF=$HEAT_CONF_DIR/heat.conf HEAT_ENV_DIR=$HEAT_CONF_DIR/environment.d HEAT_TEMPLATES_DIR=$HEAT_CONF_DIR/templates diff --git a/lib/horizon b/lib/horizon index c2d6abc5b7..c116ec257a 100644 --- a/lib/horizon +++ b/lib/horizon @@ -113,7 +113,7 @@ function init_horizon() { sudo mkdir -p $HORIZON_DIR/.blackhole HORIZON_REQUIRE='' - local horizon_conf=$INSTALL_PREFIX/etc/$APACHE_NAME/$APACHE_CONF_DIR/horizon.conf + local horizon_conf=/etc/$APACHE_NAME/$APACHE_CONF_DIR/horizon.conf if is_ubuntu; then # Clean up the old config name sudo rm -f /etc/apache2/sites-enabled/000-default diff --git a/lib/ironic b/lib/ironic index c7914e4ab2..9f86e841d8 100644 --- a/lib/ironic +++ b/lib/ironic @@ -30,7 +30,7 @@ set +o xtrace IRONIC_DIR=$DEST/ironic IRONICCLIENT_DIR=$DEST/python-ironicclient IRONIC_AUTH_CACHE_DIR=${IRONIC_AUTH_CACHE_DIR:-/var/cache/ironic} -IRONIC_CONF_DIR=${IRONIC_CONF_DIR:-$INSTALL_PREFIX/etc/ironic} +IRONIC_CONF_DIR=${IRONIC_CONF_DIR:-/etc/ironic} IRONIC_CONF_FILE=$IRONIC_CONF_DIR/ironic.conf IRONIC_ROOTWRAP_CONF=$IRONIC_CONF_DIR/rootwrap.conf IRONIC_ROOTWRAP_FILTERS=$IRONIC_CONF_DIR/rootwrap.d diff --git a/lib/keystone b/lib/keystone index 4ede51965e..4353ebab1c 100644 --- a/lib/keystone +++ b/lib/keystone @@ -33,7 +33,7 @@ set +o xtrace # Set up default directories KEYSTONE_DIR=$DEST/keystone -KEYSTONE_CONF_DIR=${KEYSTONE_CONF_DIR:-$INSTALL_PREFIX/etc/keystone} +KEYSTONE_CONF_DIR=${KEYSTONE_CONF_DIR:-/etc/keystone} KEYSTONE_CONF=$KEYSTONE_CONF_DIR/keystone.conf KEYSTONE_PASTE_INI=${KEYSTONE_PASTE_INI:-$KEYSTONE_CONF_DIR/keystone-paste.ini} KEYSTONE_AUTH_CACHE_DIR=${KEYSTONE_AUTH_CACHE_DIR:-/var/cache/keystone} @@ -94,7 +94,7 @@ function cleanup_keystone() { function _cleanup_keystone_apache_wsgi() { sudo rm -f $KEYSTONE_WSGI_DIR/*.wsgi disable_apache_site keystone - sudo rm -f $INSTALL_PREFIX/etc/$APACHE_NAME/$APACHE_CONF_DIR/keystone + sudo rm -f /etc/$APACHE_NAME/$APACHE_CONF_DIR/keystone } # _config_keystone_apache_wsgi() - Set WSGI config files of Keystone @@ -105,7 +105,7 @@ function _config_keystone_apache_wsgi() { sudo cp $KEYSTONE_DIR/httpd/keystone.py $KEYSTONE_WSGI_DIR/main sudo cp $KEYSTONE_DIR/httpd/keystone.py $KEYSTONE_WSGI_DIR/admin - sudo cp $FILES/apache-keystone.template $INSTALL_PREFIX/etc/$APACHE_NAME/$APACHE_CONF_DIR/keystone + sudo cp $FILES/apache-keystone.template /etc/$APACHE_NAME/$APACHE_CONF_DIR/keystone sudo sed -e " s|%PUBLICPORT%|$KEYSTONE_SERVICE_PORT|g; s|%ADMINPORT%|$KEYSTONE_AUTH_PORT|g; @@ -113,7 +113,7 @@ function _config_keystone_apache_wsgi() { s|%PUBLICWSGI%|$KEYSTONE_WSGI_DIR/main|g; s|%ADMINWSGI%|$KEYSTONE_WSGI_DIR/admin|g; s|%USER%|$STACK_USER|g - " -i $INSTALL_PREFIX/etc/$APACHE_NAME/$APACHE_CONF_DIR/keystone + " -i /etc/$APACHE_NAME/$APACHE_CONF_DIR/keystone enable_apache_site keystone } @@ -341,7 +341,7 @@ function init_keystone() { function install_keystoneclient() { git_clone $KEYSTONECLIENT_REPO $KEYSTONECLIENT_DIR $KEYSTONECLIENT_BRANCH setup_develop $KEYSTONECLIENT_DIR - sudo install -m 0644 -o $STACK_USER {$KEYSTONECLIENT_DIR/tools/,$INSTALL_PREFIX/etc/bash_completion.d/}keystone.bash_completion + sudo install -D -m 0644 -o $STACK_USER {$KEYSTONECLIENT_DIR/tools/,/etc/bash_completion.d/}keystone.bash_completion } # install_keystone() - Collect source and prepare diff --git a/lib/neutron b/lib/neutron index 7511566ea7..098a589592 100644 --- a/lib/neutron +++ b/lib/neutron @@ -83,7 +83,7 @@ else NEUTRON_BIN_DIR=$(get_python_exec_prefix) fi -NEUTRON_CONF_DIR=$INSTALL_PREFIX/etc/neutron +NEUTRON_CONF_DIR=/etc/neutron NEUTRON_CONF=$NEUTRON_CONF_DIR/neutron.conf export NEUTRON_TEST_CONFIG_FILE=${NEUTRON_TEST_CONFIG_FILE:-"$NEUTRON_CONF_DIR/debug.ini"} @@ -398,7 +398,7 @@ function install_neutron() { function install_neutronclient() { git_clone $NEUTRONCLIENT_REPO $NEUTRONCLIENT_DIR $NEUTRONCLIENT_BRANCH setup_develop $NEUTRONCLIENT_DIR - sudo install -m 0644 -o $STACK_USER {$NEUTRONCLIENT_DIR/tools/,$INSTALL_PREFIX/etc/bash_completion.d/}neutron.bash_completion + sudo install -D -m 0644 -o $STACK_USER {$NEUTRONCLIENT_DIR/tools/,/etc/bash_completion.d/}neutron.bash_completion } # install_neutron_agent_packages() - Collect source and prepare @@ -733,7 +733,7 @@ function _neutron_setup_rootwrap() { echo "$USER ALL=(root) NOPASSWD: $ROOTWRAP_SUDOER_CMD" >$TEMPFILE chmod 0440 $TEMPFILE sudo chown root:root $TEMPFILE - sudo mv $TEMPFILE $INSTALL_PREFIX/etc/sudoers.d/neutron-rootwrap + sudo mv $TEMPFILE /etc/sudoers.d/neutron-rootwrap # Update the root_helper iniset $NEUTRON_CONF agent root_helper "$Q_RR_COMMAND" diff --git a/lib/rpc_backend b/lib/rpc_backend index 46198907c8..ae83e85e89 100644 --- a/lib/rpc_backend +++ b/lib/rpc_backend @@ -96,7 +96,7 @@ function install_rpc_backend() { # Install rabbitmq-server # the temp file is necessary due to LP: #878600 tfile=$(mktemp) - install_package rabbitmq > "$tfile" 2>&1 + install_package rabbitmq-server > "$tfile" 2>&1 cat "$tfile" rm -f "$tfile" elif is_service_enabled qpid; then diff --git a/lib/savanna b/lib/savanna index 7b4e3d19ee..e9dbe72643 100644 --- a/lib/savanna +++ b/lib/savanna @@ -26,7 +26,7 @@ SAVANNA_BRANCH=${SAVANNA_BRANCH:-master} # Set up default directories SAVANNA_DIR=$DEST/savanna -SAVANNA_CONF_DIR=${SAVANNA_CONF_DIR:-$INSTALL_PREFIX/etc/savanna} +SAVANNA_CONF_DIR=${SAVANNA_CONF_DIR:-/etc/savanna} SAVANNA_CONF_FILE=savanna.conf ADMIN_TENANT_NAME=${ADMIN_TENANT_NAME:-admin} ADMIN_NAME=${ADMIN_NAME:-admin} diff --git a/lib/swift b/lib/swift index da4189ed9d..b46537f5a3 100644 --- a/lib/swift +++ b/lib/swift @@ -46,7 +46,7 @@ SWIFT_DISK_IMAGE=${SWIFT_DATA_DIR}/drives/images/swift.img # Set ``SWIFT_CONF_DIR`` to the location of the configuration files. # Default is ``/etc/swift``. # TODO(dtroyer): remove SWIFT_CONFIG_DIR after cutting stable/grizzly -SWIFT_CONF_DIR=${SWIFT_CONF_DIR:-${SWIFT_CONFIG_DIR:-$INSTALL_PREFIX/etc/swift}} +SWIFT_CONF_DIR=${SWIFT_CONF_DIR:-${SWIFT_CONFIG_DIR:-/etc/swift}} if is_service_enabled s-proxy && is_service_enabled swift3; then # If we are using swift3, we can default the s3 port to swift instead @@ -131,7 +131,7 @@ function _cleanup_swift_apache_wsgi() { for type in object container account; do site_name=${type}-server-${node_number} disable_apache_site ${site_name} - sudo rm -f $INSTALL_PREFIX/etc/$APACHE_NAME/$APACHE_CONF_DIR/${site_name} + sudo rm -f /etc/$APACHE_NAME/$APACHE_CONF_DIR/${site_name} done done } @@ -139,7 +139,7 @@ function _cleanup_swift_apache_wsgi() { # _config_swift_apache_wsgi() - Set WSGI config files of Swift function _config_swift_apache_wsgi() { sudo mkdir -p ${SWIFT_APACHE_WSGI_DIR} - local apache_vhost_dir=$INSTALL_PREFIX/etc/${APACHE_NAME}/$APACHE_CONF_DIR + local apache_vhost_dir=/etc/${APACHE_NAME}/$APACHE_CONF_DIR local proxy_port=${SWIFT_DEFAULT_BIND_PORT:-8080} # copy proxy vhost and wsgi file @@ -240,7 +240,7 @@ function configure_swift() { s/%GROUP%/${USER_GROUP}/; s/%USER%/$USER/; s,%SWIFT_DATA_DIR%,$SWIFT_DATA_DIR,; - " $FILES/swift/rsyncd.conf | sudo tee $INSTALL_PREFIX/etc/rsyncd.conf + " $FILES/swift/rsyncd.conf | sudo tee /etc/rsyncd.conf # rsyncd.conf just prepared for 4 nodes if is_ubuntu; then sudo sed -i '/^RSYNC_ENABLE=false/ { s/false/true/ }' /etc/default/rsync @@ -412,7 +412,7 @@ EOF mkdir -p ${swift_log_dir}/hourly sudo chown -R $USER:adm ${swift_log_dir} sed "s,%SWIFT_LOGDIR%,${swift_log_dir}," $FILES/swift/rsyslog.conf | sudo \ - tee $INSTALL_PREFIX/etc/rsyslog.d/10-swift.conf + tee /etc/rsyslog.d/10-swift.conf if is_apache_enabled_service swift; then _config_swift_apache_wsgi fi @@ -462,8 +462,8 @@ function create_swift_disk() { node_device=${node}/sdb1 [[ -d $node ]] && continue [[ -d $drive ]] && continue - sudo install -o ${USER} -g $USER_GROUP -D $drive - sudo install -o ${USER} -g $USER_GROUP -D $node_device + sudo install -o ${USER} -g $USER_GROUP -d $drive + sudo install -o ${USER} -g $USER_GROUP -d $node_device sudo chown -R $USER: ${node} done } From d4ce67225a24e7a468213b779318c29b173a23ec Mon Sep 17 00:00:00 2001 From: Rafal Jaworowski Date: Thu, 23 Jan 2014 16:39:45 +0100 Subject: [PATCH 28/30] lib: Wrap host 'install' This way we can adjust arguments per OS flavor (GNU install has different arguments than BSD install). --- functions | 15 +++++++++++++++ lib/cinder | 7 ++++++- lib/keystone | 7 ++++++- lib/neutron | 7 ++++++- lib/nova | 14 ++++++++++++-- 5 files changed, 45 insertions(+), 5 deletions(-) diff --git a/functions b/functions index 0fb2ac10ce..2bf3a1e9ae 100644 --- a/functions +++ b/functions @@ -1039,6 +1039,21 @@ function is_set() { } +# Wrapper to account for local host 'install' differences +function host_install { + local inst_src="$1" + local inst_dst="$2" + + if is_freebsd; then + local inst_arg="" + else + local inst_arg="-D" + fi + + sudo install $inst_arg -m 0644 -o $STACK_USER $inst_src $inst_dst +} + + # Wrapper for ``pip install`` to set cache and proxy environment variables # Uses globals ``OFFLINE``, ``PIP_DOWNLOAD_CACHE``, ``PIP_USE_MIRRORS``, # ``TRACK_DEPENDS``, ``*_proxy`` diff --git a/lib/cinder b/lib/cinder index 20d6e615f6..15c0adca55 100644 --- a/lib/cinder +++ b/lib/cinder @@ -483,7 +483,12 @@ function install_cinder() { function install_cinderclient() { git_clone $CINDERCLIENT_REPO $CINDERCLIENT_DIR $CINDERCLIENT_BRANCH setup_develop $CINDERCLIENT_DIR - sudo install -D -m 0644 -o $STACK_USER {$CINDERCLIENT_DIR/tools/,/etc/bash_completion.d/}cinder.bash_completion + + local inst_file='cinder.bash_completion' + local inst_src=$CINDERCLIENT_DIR/tools/$inst_file + local inst_dst=$INSTALL_PREFIX/etc/bash_completion.d/$inst_file + + host_install $inst_src $inst_dst } # apply config.d approach for cinder volumes directory diff --git a/lib/keystone b/lib/keystone index 4353ebab1c..a0df6a2551 100644 --- a/lib/keystone +++ b/lib/keystone @@ -341,7 +341,12 @@ function init_keystone() { function install_keystoneclient() { git_clone $KEYSTONECLIENT_REPO $KEYSTONECLIENT_DIR $KEYSTONECLIENT_BRANCH setup_develop $KEYSTONECLIENT_DIR - sudo install -D -m 0644 -o $STACK_USER {$KEYSTONECLIENT_DIR/tools/,/etc/bash_completion.d/}keystone.bash_completion + + local inst_file='keystone.bash_completion' + local inst_src=$KEYSTONECLIENT_DIR/tools/$inst_file + local inst_dst=$INSTALL_PREFIX/etc/bash_completion.d/$inst_file + + host_install $inst_src $inst_dst } # install_keystone() - Collect source and prepare diff --git a/lib/neutron b/lib/neutron index 098a589592..3616a04419 100644 --- a/lib/neutron +++ b/lib/neutron @@ -398,7 +398,12 @@ function install_neutron() { function install_neutronclient() { git_clone $NEUTRONCLIENT_REPO $NEUTRONCLIENT_DIR $NEUTRONCLIENT_BRANCH setup_develop $NEUTRONCLIENT_DIR - sudo install -D -m 0644 -o $STACK_USER {$NEUTRONCLIENT_DIR/tools/,/etc/bash_completion.d/}neutron.bash_completion + + local inst_file='neutron.bash_completion' + local inst_src=$NEUTRONCLIENT_DIR/tools/$inst_file + local inst_dst=$INSTALL_PREFIX/etc/bash_completion.d/$inst_file + + host_install $inst_src $inst_dst } # install_neutron_agent_packages() - Collect source and prepare diff --git a/lib/nova b/lib/nova index 7d32a4c0bb..7adfc827b0 100644 --- a/lib/nova +++ b/lib/nova @@ -616,7 +616,12 @@ function init_nova() { function install_novaclient() { git_clone $NOVACLIENT_REPO $NOVACLIENT_DIR $NOVACLIENT_BRANCH setup_develop $NOVACLIENT_DIR - sudo install -m 0644 -o $STACK_USER {$NOVACLIENT_DIR/tools/,$INSTALL_PREFIX/etc/bash_completion.d/}nova.bash_completion + + local inst_file='nova.bash_completion' + local inst_src=$NOVACLIENT_DIR/tools/$inst_file + local inst_dst=$INSTALL_PREFIX/etc/bash_completion.d/$inst_file + + host_install $inst_src $inst_dst } # install_nova() - Collect source and prepare @@ -627,7 +632,12 @@ function install_nova() { git_clone $NOVA_REPO $NOVA_DIR $NOVA_BRANCH setup_develop $NOVA_DIR - sudo install -m 0644 -o $STACK_USER {$NOVA_DIR/tools/,$INSTALL_PREFIX/etc/bash_completion.d/}nova-manage.bash_completion + + local inst_file='nova-manage.bash_completion' + local inst_src=$NOVA_DIR/tools/$inst_file + local inst_dst=$INSTALL_PREFIX/etc/bash_completion.d/$inst_file + + host_install $inst_src $inst_dst } # start_nova_api() - Start the API process ahead of other things From bc5ad0a6807e41ef3679b26cd7b85a4cdb275667 Mon Sep 17 00:00:00 2001 From: Rafal Jaworowski Date: Fri, 24 Jan 2014 16:50:28 +0100 Subject: [PATCH 29/30] functions: Use sed arguments based on host OS flavor GNU sed has different arguments than BSD sed. --- functions | 46 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/functions b/functions index 2bf3a1e9ae..565b5a5c53 100644 --- a/functions +++ b/functions @@ -722,7 +722,13 @@ function inicomment() { local file=$1 local section=$2 local option=$3 - sed -i '' -e "/^\[$section\]/,/^\[.*\]/ s|^\($option[ \t]*=.*$\)|#\1|" "$file" + local sed_re="/^\[$section\]/,/^\[.*\]/ s|^\($option[ \t]*=.*$\)|#\1|" + + if is_freebsd; then + sed -i '' -e "$sed_re" "$file" + else + sed -i -e "$sed_re" "$file" + fi } @@ -732,7 +738,13 @@ function iniuncomment() { local file=$1 local section=$2 local option=$3 - sed -i '' -e "/^\[$section\]/,/^\[.*\]/ s|[^ \t]*#[ \t]*\($option[ \t]*=.*$\)|\1|" "$file" + local sed_re="/^\[$section\]/,/^\[.*\]/ s|[^ \t]*#[ \t]*\($option[ \t]*=.*$\)|\1|" + + if is_freebsd; then + sed -i '' -e "$sed_re" "$file" + else + sed -i -e "$sed_re" "$file" + fi } @@ -774,12 +786,23 @@ function iniset() { fi if ! ini_has_option "$file" "$section" "$option"; then # Add it - sed -i '' -e "/^\[$section\]/ a\\ + if is_freebsd; then + sed -i '' -e "/^\[$section\]/ a\\ +$option = $value +" "$file" + else + sed -i -e "/^\[$section\]/ a\\ $option = $value " "$file" + fi else # Replace it - sed -i '' -e "/^\[$section\]/,/^\[.*\]/ s|^\($option[ \t]*=[ \t]*\).*$|\1$value|" "$file" + sed_re="/^\[$section\]/,/^\[.*\]/ s|^\($option[ \t]*=[ \t]*\).*$|\1$value|" + if is_freebsd; then + sed -i '' -e "$sed_re" "$file" + else + sed -i -e "$sed_re" "$file" + fi fi } @@ -815,13 +838,24 @@ function iniset_multiline() { echo -e "\n[$section]" >>"$file" else # Remove old values - sed -i '' -e "/^\[$section\]/,/^\[.*\]/ { /^$option[ \t]*=/ d; }" "$file" + $sed_re="/^\[$section\]/,/^\[.*\]/ { /^$option[ \t]*=/ d; }" + if is_freebsd; then + sed -i '' -e "$sed_re" "$file" + else + sed -i -e "$sed_re" "$file" + fi fi # Add new ones for v in $values; do - sed -i '' -e "/^\[$section\]/ a\\ + if is_freebsd; then + sed -i '' -e "/^\[$section\]/ a\\ +$option = $v +" "$file" + else + sed -i -e "/^\[$section\]/ a\\ $option = $v " "$file" + fi done } From 854b6bfb14f489fcf3b65836fe8e63421f73ad90 Mon Sep 17 00:00:00 2001 From: Rafal Jaworowski Date: Fri, 24 Jan 2014 17:01:20 +0100 Subject: [PATCH 30/30] functions: Use mktemp arguments based on host OS flavor This accounts for differences between GNU and BSD versions. --- functions | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/functions b/functions index 565b5a5c53..3021947bdf 100644 --- a/functions +++ b/functions @@ -1121,7 +1121,11 @@ function pip_install { # 1.1, the existing extracted build will be used and cause # confusing errors. By creating unique build directories we avoid # this problem. See https://github.com/pypa/pip/issues/709 - local pip_build_tmp=$(mktemp -d pip-build.XXXXX) + if is_freebsd; then + local pip_build_tmp=$(mktemp -d pip-build.XXXXX) + else + local pip_build_tmp=$(mktemp --tmpdir -d pip-build.XXXXX) + fi $SUDO_PIP PIP_DOWNLOAD_CACHE=${PIP_DOWNLOAD_CACHE:-/var/cache/pip} \ HTTP_PROXY=$http_proxy \