f93e9ee783
Add a flag (DF_REINSTALL_OVS) - when set to false, the neutron ovs will not be uninistalled and will be used. When set to True, the current behavior of removing the OVS and reinstalling it will remain. This will allow us to use some preconfigurations done by neurton in some specific cases. Change-Id: I2b7a9597033155fe4584559bebb6adda25198667 Closes-Bug: #1718115
272 lines
8.1 KiB
Bash
272 lines
8.1 KiB
Bash
#!/bin/bash
|
|
|
|
function _neutron_ovs_install_ovs_deps_fedora {
|
|
install_package -y rpm-build rpmrebuild
|
|
# So apparently we need to compile to learn the requirements...
|
|
set `rpmspec -q --buildrequires rhel/openvswitch-fedora.spec`
|
|
set "$@" `rpmspec -q --buildrequires rhel/openvswitch-kmod-fedora.spec`
|
|
if [ $# > 0 ]; then
|
|
install_package -y $@
|
|
fi
|
|
}
|
|
|
|
function _neutron_ovs_get_rpm_basename {
|
|
PACKAGE=$1
|
|
SPEC=${2:-rhel/openvswitch-fedora.spec}
|
|
BASENAME=`rpmspec -q $SPEC --provides | awk "/^$PACKAGE\s*=/ {print \\\$1\"-\"\\\$3}" | head -1`
|
|
echo `rpmspec -q $SPEC | grep "^$BASENAME"`
|
|
}
|
|
|
|
function _neutron_ovs_get_rpm_file {
|
|
BASENAME=`_neutron_ovs_get_rpm_basename "$@"`
|
|
find $HOME/rpmbuild/RPMS/ -name "$BASENAME.rpm" | head -1
|
|
}
|
|
|
|
function _neutron_ovs_clone_ovs {
|
|
if [ -d $DEST/ovs ]; then
|
|
pushd $DEST/ovs
|
|
git checkout $OVS_BRANCH
|
|
git pull || true
|
|
popd
|
|
else
|
|
pushd $DEST
|
|
git clone $OVS_REPO -b $OVS_BRANCH
|
|
popd
|
|
fi
|
|
}
|
|
|
|
function _neutron_ovs_install_ovs_fedora {
|
|
_neutron_ovs_clone_ovs
|
|
|
|
mkdir -p $DEST/ovs/build-dragonflow
|
|
pushd $DEST/ovs/build-dragonflow
|
|
|
|
pushd ..
|
|
./boot.sh
|
|
popd
|
|
|
|
../configure
|
|
|
|
make dist
|
|
VERSION=`awk '/^Version:/ { print $2 }' ../rhel/openvswitch-fedora.spec | head -1`
|
|
|
|
mkdir -p $HOME/rpmbuild/SOURCES
|
|
cp openvswitch-${VERSION}.tar.gz $HOME/rpmbuild/SOURCES/
|
|
tar -xzf openvswitch-${VERSION}.tar.gz -C $HOME/rpmbuild/SOURCES
|
|
pushd $HOME/rpmbuild/SOURCES/openvswitch-${VERSION}
|
|
_neutron_ovs_install_ovs_deps_fedora
|
|
rpmbuild -bb --without check rhel/openvswitch-fedora.spec
|
|
rpmbuild -bb -D "kversion `uname -r`" rhel/openvswitch-kmod-fedora.spec
|
|
OVS_RPM_BASENAME=$(_neutron_ovs_get_rpm_file openvswitch)
|
|
rpmrebuild --change-spec-requires="awk '\$1 == \"Requires:\" && \$2 == \"/bin/python\" {\$2 = \"/usr/bin/python\"} {print \$0}'" -p $OVS_RPM_BASENAME
|
|
OVS_PY_RPM_BASENAME=""
|
|
OVS_KMOD_RPM_BASENAME=$(_neutron_ovs_get_rpm_file openvswitch-kmod rhel/openvswitch-kmod-fedora.spec)
|
|
install_package -y $OVS_RPM_BASENAME $OVS_PY_RPM_BASENAME $OVS_KMOD_RPM_BASENAME
|
|
sudo pip install ./python
|
|
popd
|
|
|
|
popd
|
|
}
|
|
|
|
function _neutron_ovs_install_ovs_deps_ubuntu {
|
|
install_package -y build-essential fakeroot devscripts equivs dkms linux-libc-dev linux-headers-$(uname -r)
|
|
sudo mk-build-deps -i -t "/usr/bin/apt-get --no-install-recommends -y"
|
|
}
|
|
|
|
function _neutron_ovs_install_ovs_ubuntu {
|
|
_neutron_ovs_clone_ovs
|
|
|
|
pushd $DEST/ovs
|
|
_neutron_ovs_install_ovs_deps_ubuntu
|
|
DEB_BUILD_OPTIONS='nocheck' fakeroot debian/rules binary
|
|
sudo dpkg -i ../openvswitch-datapath-dkms*.deb
|
|
sudo dpkg -i ../openvswitch-common*.deb ../openvswitch-switch*.deb
|
|
sudo pip install ./python
|
|
popd
|
|
}
|
|
|
|
function _neutron_ovs_install_ovs {
|
|
local _is_ovs_installed=false
|
|
|
|
if [ "$OVS_INSTALL_FROM_GIT" == "True" ]; then
|
|
echo "Installing OVS and dependent packages from git"
|
|
# If OVS is already installed, remove it, because we're about to re-install
|
|
# it from source.
|
|
for package in openvswitch openvswitch-switch openvswitch-common; do
|
|
if is_package_installed $package ; then
|
|
_is_ovs_installed=true
|
|
break
|
|
fi
|
|
done
|
|
if [ "$_is_ovs_installed" = true ]; then
|
|
cleanup_ovs
|
|
stop_ovs
|
|
uninstall_ovs
|
|
fi
|
|
|
|
install_package -y autoconf automake libtool gcc patch make
|
|
|
|
if is_ubuntu; then
|
|
_neutron_ovs_install_ovs_ubuntu
|
|
elif is_fedora; then
|
|
_neutron_ovs_install_ovs_fedora
|
|
else
|
|
echo "Unsupported system. Trying to install via package manager"
|
|
install_package $(get_packages "openvswitch")
|
|
fi
|
|
else
|
|
echo "Installing OVS and dependent packages via package manager"
|
|
install_package $(get_packages "openvswitch")
|
|
fi
|
|
}
|
|
|
|
function install_ovs {
|
|
unload_module_if_loaded openvswitch
|
|
|
|
_neutron_ovs_install_ovs
|
|
|
|
# reload module
|
|
load_module_if_not_loaded openvswitch
|
|
}
|
|
|
|
function start_ovs {
|
|
echo "Starting OVS"
|
|
SERVICE_NAME=openvswitch # Default value
|
|
if is_fedora; then
|
|
SERVICE_NAME=openvswitch
|
|
elif is_ubuntu; then
|
|
SERVICE_NAME=openvswitch-switch
|
|
fi
|
|
|
|
restart_service $SERVICE_NAME
|
|
sleep 5
|
|
|
|
local _pwd=$(pwd)
|
|
cd $DATA_DIR/ovs
|
|
|
|
if ! ovs_service_status $OVS_DB_SERVICE; then
|
|
die "$OVS_DB_SERVICE is not running"
|
|
fi
|
|
|
|
if is_service_enabled df-controller ; then
|
|
if ! ovs_service_status $OVS_VSWITCHD_SERVICE; then
|
|
die "$OVS_VSWITCHD_SERVICE is not running"
|
|
fi
|
|
fi
|
|
|
|
cd $_pwd
|
|
}
|
|
|
|
function configure_ovs {
|
|
if is_service_enabled df-controller ; then
|
|
# setup external bridge if necessary
|
|
check_dnat=$(echo $DF_APPS_LIST | grep "dnat")
|
|
if [[ "$check_dnat" != "" ]]; then
|
|
if [[ "$DF_REINSTALL_OVS" == "True" ]]; then
|
|
# Create the bridge only if it does not already exist
|
|
if ! sudo ovs-vsctl br-exists $PUBLIC_BRIDGE; then
|
|
echo "Setup external bridge for DNAT"
|
|
sudo ovs-vsctl add-br $PUBLIC_BRIDGE || true
|
|
sudo ip link set dev $PUBLIC_BRIDGE up || true
|
|
sudo ip addr add $PUBLIC_NETWORK_GATEWAY/$PUBLIC_NETWORK_PREFIXLEN dev $PUBLIC_BRIDGE || true
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
_neutron_ovs_base_setup_bridge $INTEGRATION_BRIDGE
|
|
sudo ovs-vsctl --no-wait set bridge $INTEGRATION_BRIDGE fail-mode=secure other-config:disable-in-band=true
|
|
if [ -n "$OVS_INTEGRATION_BRIDGE_PROTOCOLS" ]; then
|
|
sudo ovs-vsctl set bridge $INTEGRATION_BRIDGE protocols=$OVS_INTEGRATION_BRIDGE_PROTOCOLS
|
|
fi
|
|
fi
|
|
|
|
if [ -n "$OVS_MANAGER" ]; then
|
|
sudo ovs-vsctl set-manager $OVS_MANAGER
|
|
fi
|
|
|
|
cd $_pwd
|
|
}
|
|
|
|
function cleanup_ovs {
|
|
# Remove the patch ports
|
|
for port in $(sudo ovs-vsctl show | grep Port | awk '{print $2}' | cut -d '"' -f 2 | grep patch); do
|
|
sudo ovs-vsctl del-port ${port}
|
|
done
|
|
|
|
# remove all OVS ports that look like Neutron created ports
|
|
for port in $(sudo ovs-vsctl list port | grep -o -e tap[0-9a-f\-]* -e q[rg]-[0-9a-f\-]*); do
|
|
sudo ovs-vsctl del-port ${port}
|
|
done
|
|
|
|
# Remove all the vxlan ports
|
|
for port in $(sudo ovs-vsctl list port | grep name | grep vxlan | awk '{print $3}' | cut -d '"' -f 2); do
|
|
sudo ovs-vsctl del-port ${port}
|
|
done
|
|
|
|
}
|
|
|
|
function uninstall_ovs {
|
|
sudo pip uninstall -y ovs
|
|
PACKAGES="openvswitch openvswitch-kmod openvswitch-switch openvswitch-common openvswitch-datapath-dkms"
|
|
for package in $PACKAGES; do
|
|
if is_package_installed $package ; then
|
|
uninstall_package $package
|
|
fi
|
|
done
|
|
|
|
# If the ovs dir is not found, just return.
|
|
pushd $DEST/ovs || return 0
|
|
make distclean || true
|
|
popd
|
|
}
|
|
|
|
# stop_ovs_dp() - Stop OVS datapath
|
|
function stop_ovs_dp {
|
|
dp=$(sudo ovs-dpctl dump-dps)
|
|
if [ $dp ]; then
|
|
sudo ovs-dpctl del-dp $dp
|
|
fi
|
|
|
|
# Here we just remove vport_<tunnel_type>, because this is a minimal
|
|
# requirement to remove openvswitch. To do a deep clean, geneve, vxlan
|
|
# ip_gre, gre also need to be removed.
|
|
for module in vport_geneve vport_vxlan vport_gre openvswitch; do
|
|
unload_module_if_loaded $module
|
|
done
|
|
}
|
|
|
|
function stop_ovs
|
|
{
|
|
stop_ovs_dp
|
|
|
|
SERVICE_NAME=openvswitch # Default value
|
|
if is_fedora; then
|
|
SERVICE_NAME=openvswitch
|
|
elif is_ubuntu; then
|
|
SERVICE_NAME=openvswitch-switch
|
|
fi
|
|
stop_service $SERVICE_NAME
|
|
}
|
|
|
|
function init_ovs {
|
|
# clean up from previous (possibly aborted) runs
|
|
# create required data files
|
|
|
|
# Assumption: this is a dedicated test system and there is nothing important
|
|
# ovs databases. We're going to trash them and
|
|
# create new ones on each devstack run.
|
|
|
|
base_dir=$DATA_DIR/ovs
|
|
mkdir -p $base_dir
|
|
|
|
for db in conf.db ; do
|
|
if [ -f $base_dir/$db ] ; then
|
|
rm -f $base_dir/$db
|
|
fi
|
|
done
|
|
rm -f $base_dir/.*.db.~lock~
|
|
|
|
echo "Creating OVS Database"
|
|
ovsdb-tool create $base_dir/conf.db $OVS_VSWITCH_OCSSCHEMA_FILE
|
|
}
|