bbe1347e4e
To work around the ZMQ issues (publisher binds to a port, thus only one publisher can work on a given IP), we had a lot of junk code in our repo. Removed all redundant mechanisms (use_multiproc, is_neutron_server) and modified to have 2 types of configurable ZMQ drivers: 1. zmq_remote_pubsub_driver - Has TCP publisher and IPC subscriber, This should be used in the publisher service. 2. zmq_pubsub_driver - Has IPC publisher and TCP subscriberi, This should be used in all other uses. The way to set the one to use is via configuration, thus it is up to the deployment to make sure this is configured correctly. Change-Id: Ibf7894e608187e87bdeb7774749bfa0cc15eae56
664 lines
21 KiB
Bash
664 lines
21 KiB
Bash
#@IgnoreInspection BashAddShebang
|
|
# dragonflow.sh - Devstack extras script to install Dragonflow
|
|
|
|
# Enable DPDK for Open vSwitch user space datapath
|
|
ENABLE_DPDK=${ENABLE_DPDK:-False}
|
|
DPDK_NUM_OF_HUGEPAGES=${DPDK_NUM_OF_HUGEPAGES:-1024}
|
|
DPDK_BIND_DRIVER=${DPDK_BIND_DRIVER:-igb_uio}
|
|
DPDK_NIC_NAME=${DPDK_NIC_NAME:-eth1}
|
|
|
|
# The git repo to use
|
|
OVS_REPO=${OVS_REPO:-http://github.com/openvswitch/ovs.git}
|
|
OVS_REPO_NAME=$(basename ${OVS_REPO} | cut -f1 -d'.')
|
|
|
|
# The branch to use from $OVS_REPO
|
|
OVS_BRANCH=${OVS_BRANCH:-branch-2.6}
|
|
|
|
# Set empty EXTERNAL_HOST_IP
|
|
EXTERNAL_HOST_IP=${EXTERNAL_HOST_IP:-}
|
|
|
|
DEFAULT_TUNNEL_TYPES="vxlan,geneve,gre"
|
|
DEFAULT_APPS_LIST="portbinding,l2,l3_proactive,dhcp,dnat,sg,portqos,classifier,tunneling,provider"
|
|
|
|
if [[ $ENABLE_DF_SFC == "True" ]]; then
|
|
DEFAULT_APPS_LIST="$DEFAULT_APPS_LIST,fc,sfc"
|
|
fi
|
|
|
|
if is_service_enabled df-metadata ; then
|
|
DEFAULT_APPS_LIST="$DEFAULT_APPS_LIST,metadata_service"
|
|
fi
|
|
|
|
if is_service_enabled q-trunk ; then
|
|
DEFAULT_APPS_LIST="$DEFAULT_APPS_LIST,trunk"
|
|
fi
|
|
|
|
ENABLE_ACTIVE_DETECTION=${ENABLE_ACTIVE_DETECTION:-True}
|
|
if [[ "$ENABLE_ACTIVE_DETECTION" == "True" ]]; then
|
|
DEFAULT_APPS_LIST="$DEFAULT_APPS_LIST,active_port_detection"
|
|
fi
|
|
|
|
ENABLE_LIVE_MIGRATION=${ENABLE_LIVE_MIGRATION:-True}
|
|
if [[ "$ENABLE_LIVE_MIGRATION" == "True" ]]; then
|
|
DEFAULT_APPS_LIST="$DEFAULT_APPS_LIST,migration"
|
|
fi
|
|
|
|
if [[ ! -z ${EXTERNAL_HOST_IP} ]]; then
|
|
DEFAULT_APPS_LIST="$DEFAULT_APPS_LIST,chassis_snat"
|
|
fi
|
|
|
|
ENABLED_AGING_APP=${ENABLE_AGING_APP:-True}
|
|
if [[ "$ENABLE_AGING_APP" == "True" ]]; then
|
|
DEFAULT_APPS_LIST="aging,$DEFAULT_APPS_LIST"
|
|
fi
|
|
|
|
if is_service_enabled df-skydive ; then
|
|
SKYDIVE_ENDPOINT=${SKYDIVE_ENDPOINT:-$SERVICE_HOST:8082}
|
|
fi
|
|
|
|
DF_APPS_LIST=${DF_APPS_LIST:-$DEFAULT_APPS_LIST}
|
|
TUNNEL_TYPES=${TUNNEL_TYPE:-$DEFAULT_TUNNEL_TYPES}
|
|
|
|
# OVS related pid files
|
|
#----------------------
|
|
OVS_DB_SERVICE="ovsdb-server"
|
|
OVS_VSWITCHD_SERVICE="ovs-vswitchd"
|
|
OVS_DIR="/var/run/openvswitch"
|
|
OVS_DB_PID=$OVS_DIR"/"$OVS_DB_SERVICE".pid"
|
|
OVS_VSWITCHD_PID=$OVS_DIR"/"$OVS_VSWITCHD_SERVICE".pid"
|
|
OVS_VSWITCH_OCSSCHEMA_FILE=${OVS_VSWITCH_OCSSCHEMA_FILE:-"/usr/share/openvswitch/vswitch.ovsschema"}
|
|
|
|
# Neutron notifier
|
|
ENABLE_NEUTRON_NOTIFIER=${ENABLE_NEUTRON_NOTIFIER:-"False"}
|
|
|
|
# Set value of TUNNEL_ENDPOINT_IP if unset
|
|
TUNNEL_ENDPOINT_IP=${TUNNEL_ENDPOINT_IP:-$HOST_IP}
|
|
|
|
ENABLE_DF_SFC=${ENABLE_DF_SFC:-"False"}
|
|
if [[ $ENABLE_DF_SFC == "True" ]]; then
|
|
NEUTRON_SFC_DRIVERS=dragonflow
|
|
NEUTRON_FLOWCLASSIFIER_DRIVERS=dragonflow
|
|
fi
|
|
|
|
ACTION=$1
|
|
STAGE=$2
|
|
|
|
# Pluggable DB drivers
|
|
#----------------------
|
|
function is_df_db_driver_selected {
|
|
if [[ "$ACTION" == "stack" && "$STAGE" == "pre-install" ]]; then
|
|
test -n "$NB_DRIVER_CLASS"
|
|
return $?
|
|
fi
|
|
return 1
|
|
}
|
|
|
|
if is_service_enabled df-etcd ; then
|
|
is_df_db_driver_selected && die $LINENO "More than one database service is set for Dragonflow."
|
|
source $DEST/dragonflow/devstack/etcd_driver
|
|
NB_DRIVER_CLASS="etcd_nb_db_driver"
|
|
REMOTE_DB_PORT=${REMOTE_DB_PORT:-2379}
|
|
fi
|
|
if is_service_enabled df-ramcloud ; then
|
|
is_df_db_driver_selected && die $LINENO "More than one database service is set for Dragonflow."
|
|
source $DEST/dragonflow/devstack/ramcloud_driver
|
|
NB_DRIVER_CLASS="ramcloud_nb_db_driver"
|
|
fi
|
|
if is_service_enabled df-zookeeper ; then
|
|
is_df_db_driver_selected && die $LINENO "More than one database service is set for Dragonflow."
|
|
source $DEST/dragonflow/devstack/zookeeper_driver
|
|
NB_DRIVER_CLASS="zookeeper_nb_db_driver"
|
|
fi
|
|
|
|
if is_service_enabled df-cassandra ; then
|
|
is_df_db_driver_selected && die $LINENO "More than one database service is set for Dragonflow."
|
|
source $DEST/dragonflow/devstack/cassandra_driver
|
|
NB_DRIVER_CLASS="cassandra_nb_db_driver"
|
|
fi
|
|
|
|
if is_service_enabled df-rethinkdb ; then
|
|
is_df_db_driver_selected && die $LINENO "More than one database service is set for Dragonflow."
|
|
source $DEST/dragonflow/devstack/rethinkdb_driver
|
|
NB_DRIVER_CLASS="rethinkdb_nb_db_driver"
|
|
fi
|
|
|
|
if is_service_enabled df-redis ; then
|
|
is_df_db_driver_selected && die $LINENO "More than one database service is set for Dragonflow."
|
|
source $DEST/dragonflow/devstack/redis_driver
|
|
NB_DRIVER_CLASS="redis_nb_db_driver"
|
|
DF_REDIS_PUBSUB=${DF_REDIS_PUBSUB:-"True"}
|
|
else
|
|
DF_REDIS_PUBSUB="False"
|
|
fi
|
|
|
|
# How to connect to the database storing the virtual topology.
|
|
REMOTE_DB_IP=${REMOTE_DB_IP:-$HOST_IP}
|
|
REMOTE_DB_PORT=${REMOTE_DB_PORT:-4001}
|
|
REMOTE_DB_HOSTS=${REMOTE_DB_HOSTS:-"$REMOTE_DB_IP:$REMOTE_DB_PORT"}
|
|
|
|
# As the function returns actual value only on pre-install, ignore it on later stages
|
|
if [[ "$ACTION" == "stack" && "$STAGE" == "pre-install" ]]; then
|
|
is_df_db_driver_selected || die $LINENO "No database service is set for Dragonflow."
|
|
fi
|
|
|
|
# Pub/Sub Service
|
|
#----------------
|
|
# To be called to initialise params common to all pubsub drivers
|
|
function init_pubsub {
|
|
DF_PUB_SUB="True"
|
|
}
|
|
|
|
if is_service_enabled df-zmq-publisher-service ; then
|
|
init_pubsub
|
|
enable_service df-publisher-service
|
|
source $DEST/dragonflow/devstack/zmq_pubsub_driver
|
|
fi
|
|
|
|
if is_service_enabled df-etcd-pubsub-service ; then
|
|
init_pubsub
|
|
source $DEST/dragonflow/devstack/etcd_pubsub_driver
|
|
fi
|
|
|
|
if [[ "$DF_REDIS_PUBSUB" == "True" ]]; then
|
|
init_pubsub
|
|
source $DEST/dragonflow/devstack/redis_pubsub_driver
|
|
fi
|
|
|
|
# Dragonflow installation uses functions from these files
|
|
source $TOP_DIR/lib/neutron_plugins/ovs_base
|
|
|
|
if [[ "$ENABLE_DPDK" == "True" ]]; then
|
|
source $DEST/dragonflow/devstack/ovs_dpdk_setup.sh
|
|
else
|
|
source $DEST/dragonflow/devstack/ovs_setup.sh
|
|
fi
|
|
|
|
# Entry Points
|
|
# ------------
|
|
|
|
function configure_df_metadata_service {
|
|
if is_service_enabled df-metadata ; then
|
|
NOVA_CONF=${NOVA_CONF:-"/etc/nova/nova.conf"}
|
|
iniset $NOVA_CONF neutron service_metadata_proxy True
|
|
iniset $NOVA_CONF neutron metadata_proxy_shared_secret $METADATA_PROXY_SHARED_SECRET
|
|
iniset $NEUTRON_CONF DEFAULT metadata_proxy_shared_secret $METADATA_PROXY_SHARED_SECRET
|
|
iniset $DRAGONFLOW_CONF df_metadata ip "$DF_METADATA_SERVICE_IP"
|
|
iniset $DRAGONFLOW_CONF df_metadata port "$DF_METADATA_SERVICE_PORT"
|
|
iniset $DRAGONFLOW_CONF df_metadata metadata_interface "$DF_METADATA_SERVICE_INTERFACE"
|
|
fi
|
|
}
|
|
|
|
function configure_qos {
|
|
Q_SERVICE_PLUGIN_CLASSES+=",qos"
|
|
Q_ML2_PLUGIN_EXT_DRIVERS+=",qos"
|
|
iniset /$Q_PLUGIN_CONF_FILE ml2 extension_drivers "$Q_ML2_PLUGIN_EXT_DRIVERS"
|
|
}
|
|
|
|
function configure_trunk {
|
|
Q_SERVICE_PLUGIN_CLASSES+=",trunk"
|
|
Q_ML2_PLUGIN_EXT_DRIVERS+=",trunk"
|
|
iniset /$Q_PLUGIN_CONF_FILE ml2 extension_drivers "$Q_ML2_PLUGIN_EXT_DRIVERS"
|
|
}
|
|
|
|
function configure_bgp {
|
|
setup_develop $DEST/neutron-dynamic-routing
|
|
sudo install -d -o $STACK_USER $NEUTRON_CONF_DIR/policy.d
|
|
cp -v $DEST/neutron-dynamic-routing/etc/neutron/policy.d/dynamic_routing.conf $NEUTRON_CONF_DIR/policy.d
|
|
_neutron_service_plugin_class_add df-bgp
|
|
# Since we are using a plugin outside neutron-dynamic-routing, we need to
|
|
# specify api_extensions_path explicitly.
|
|
iniset $NEUTRON_CONF DEFAULT api_extensions_path "$DEST/neutron-dynamic-routing/neutron_dynamic_routing/extensions"
|
|
}
|
|
|
|
function configure_sfc {
|
|
setup_develop $DEST/networking-sfc
|
|
}
|
|
|
|
function init_neutron_sample_config {
|
|
# NOTE: We must make sure that neutron config file exists before
|
|
# going further with ovs setup
|
|
if [ ! -f $NEUTRON_CONF ] ; then
|
|
sudo install -d -o $STACK_USER $NEUTRON_CONF_DIR
|
|
pushd $NEUTRON_DIR
|
|
tools/generate_config_file_samples.sh
|
|
popd
|
|
cp $NEUTRON_DIR/etc/neutron.conf.sample $NEUTRON_CONF
|
|
fi
|
|
}
|
|
|
|
function configure_df_skydive {
|
|
iniset $DRAGONFLOW_CONF df_skydive analyzer_endpoint "$SKYDIVE_ENDPOINT"
|
|
if [[ -n "$DF_SKYDIVE_USER" ]]; then
|
|
iniset $DRAGONFLOW_CONF df_skydive user "$DF_SKYDIVE_USER"
|
|
fi
|
|
local DF_SKYDIVE_PASSWORD=${DF_SKYDIVE_PASSWORD:-$ADMIN_PASSWORD}
|
|
iniset $DRAGONFLOW_CONF df_skydive password "$DF_SKYDIVE_PASSWORD"
|
|
if [[ -n "$DF_SKYDIVE_UPDATE_INTERVAL" ]]; then
|
|
iniset $DRAGONFLOW_CONF df_skydive update_interval "$DF_SKYDIVE_UPDATE_INTERVAL"
|
|
fi
|
|
}
|
|
|
|
|
|
function configure_df_plugin {
|
|
echo "Configuring Neutron for Dragonflow"
|
|
|
|
# Generate DF config file
|
|
pushd $DRAGONFLOW_DIR
|
|
tools/generate_config_file_samples.sh
|
|
popd
|
|
mkdir -p $Q_PLUGIN_EXTRA_CONF_PATH
|
|
sudo mkdir -p /var/run/dragonflow
|
|
sudo chown $STACK_USER /var/run/dragonflow
|
|
cp $DRAGONFLOW_DIR/etc/dragonflow.ini.sample $DRAGONFLOW_CONF
|
|
cp $DRAGONFLOW_DIR/etc/dragonflow_datapath_layout.yaml $DRAGONFLOW_DATAPATH
|
|
|
|
if is_service_enabled q-svc ; then
|
|
if is_service_enabled q-qos ; then
|
|
configure_qos
|
|
fi
|
|
|
|
if [[ "$DR_MODE" == "df-bgp" ]]; then
|
|
configure_bgp
|
|
fi
|
|
|
|
if is_service_enabled q-trunk ; then
|
|
configure_trunk
|
|
fi
|
|
|
|
if [[ "$ENABLE_DF_SFC" == "True" ]]; then
|
|
configure_sfc
|
|
fi
|
|
|
|
# NOTE(gsagie) needed for tempest
|
|
export NETWORK_API_EXTENSIONS=$(python -c \
|
|
'from dragonflow.common import extensions ;\
|
|
print ",".join(extensions.SUPPORTED_API_EXTENSIONS)')
|
|
|
|
# Set netron-server related settings
|
|
iniset $DRAGONFLOW_CONF df monitor_table_poll_time "$DF_MONITOR_TABLE_POLL_TIME"
|
|
iniset $DRAGONFLOW_CONF df publisher_rate_limit_timeout "$PUBLISHER_RATE_LIMIT_TIMEOUT"
|
|
iniset $DRAGONFLOW_CONF df publisher_rate_limit_count "$PUBLISHER_RATE_LIMIT_COUNT"
|
|
iniset $NEUTRON_CONF DEFAULT core_plugin "$Q_PLUGIN_CLASS"
|
|
iniset $NEUTRON_CONF DEFAULT service_plugins "$Q_SERVICE_PLUGIN_CLASSES"
|
|
|
|
iniset $DRAGONFLOW_CONF df auto_detect_port_behind_port "$DF_AUTO_DETECT_PORT_BEHIND_PORT"
|
|
iniset $DRAGONFLOW_CONF df_loadbalancer auto_enable_vip_ports "$DF_LBAAS_AUTO_ENABLE_VIP_PORTS"
|
|
|
|
if is_service_enabled q-dhcp ; then
|
|
iniset $DRAGONFLOW_CONF df use_centralized_ipv6_DHCP "True"
|
|
else
|
|
iniset $NEUTRON_CONF DEFAULT dhcp_agent_notification "False"
|
|
fi
|
|
|
|
if [[ "$DF_RUNNING_IN_GATE" == "True" ]]; then
|
|
iniset $NEUTRON_CONF quotas default_quota "-1"
|
|
iniset $NEUTRON_CONF quotas quota_network "-1"
|
|
iniset $NEUTRON_CONF quotas quota_subnet "-1"
|
|
iniset $NEUTRON_CONF quotas quota_port "-1"
|
|
iniset $NEUTRON_CONF quotas quota_router "-1"
|
|
iniset $NEUTRON_CONF quotas quota_floatingip "-1"
|
|
iniset $NEUTRON_CONF quotas quota_security_group_rule "-1"
|
|
fi
|
|
|
|
# load dragonflow.ini into neutron-server
|
|
neutron_server_config_add_new $DRAGONFLOW_CONF
|
|
fi
|
|
|
|
iniset $DRAGONFLOW_CONF df remote_db_hosts "$REMOTE_DB_HOSTS"
|
|
iniset $DRAGONFLOW_CONF df nb_db_class "$NB_DRIVER_CLASS"
|
|
iniset $DRAGONFLOW_CONF df enable_neutron_notifier "$ENABLE_NEUTRON_NOTIFIER"
|
|
iniset $DRAGONFLOW_CONF df enable_dpdk "$ENABLE_DPDK"
|
|
iniset $DRAGONFLOW_CONF df management_ip "$HOST_IP"
|
|
iniset $DRAGONFLOW_CONF df local_ip "$TUNNEL_ENDPOINT_IP"
|
|
iniset $DRAGONFLOW_CONF df tunnel_types "$TUNNEL_TYPES"
|
|
iniset $DRAGONFLOW_CONF df integration_bridge "$INTEGRATION_BRIDGE"
|
|
iniset $DRAGONFLOW_CONF df apps_list "$DF_APPS_LIST"
|
|
iniset $DRAGONFLOW_CONF df_l2_app l2_responder "$DF_L2_RESPONDER"
|
|
iniset $DRAGONFLOW_CONF df enable_df_pub_sub "$DF_PUB_SUB"
|
|
iniset $DRAGONFLOW_CONF df_zmq ipc_socket "$DF_ZMQ_IPC_SOCKET"
|
|
if [[ ! -z ${EXTERNAL_HOST_IP} ]]; then
|
|
iniset $DRAGONFLOW_CONF df external_host_ip "$EXTERNAL_HOST_IP"
|
|
iniset $DRAGONFLOW_CONF df_snat_app external_network_bridge "$PUBLIC_BRIDGE"
|
|
fi
|
|
|
|
iniset $DRAGONFLOW_CONF df enable_selective_topology_distribution \
|
|
"$DF_SELECTIVE_TOPO_DIST"
|
|
configure_df_metadata_service
|
|
|
|
if is_service_enabled df-skydive ; then
|
|
configure_df_skydive
|
|
fi
|
|
}
|
|
|
|
function install_zeromq {
|
|
if is_fedora; then
|
|
install_package zeromq
|
|
elif is_ubuntu; then
|
|
install_package libzmq1
|
|
elif is_suse; then
|
|
install_package libzmq1
|
|
fi
|
|
# Necessary directory for socket location.
|
|
sudo mkdir -p /var/run/openstack
|
|
sudo chown $STACK_USER /var/run/openstack
|
|
}
|
|
|
|
function install_df {
|
|
install_zeromq
|
|
|
|
if function_exists nb_db_driver_install_server; then
|
|
nb_db_driver_install_server
|
|
fi
|
|
|
|
if function_exists nb_db_driver_install_client; then
|
|
nb_db_driver_install_client
|
|
fi
|
|
|
|
setup_package $DRAGONFLOW_DIR
|
|
}
|
|
|
|
# The following returns "0" when service is live.
|
|
# Zero (0) is considered a TRUE value in bash.
|
|
function ovs_service_status
|
|
{
|
|
TEMP_PID=$OVS_DIR"/"$1".pid"
|
|
if [ -e $TEMP_PID ]
|
|
then
|
|
TEMP_PID_VALUE=$(cat $TEMP_PID 2>/dev/null)
|
|
if [ -e /proc/$TEMP_PID_VALUE ]
|
|
then
|
|
return 0
|
|
fi
|
|
fi
|
|
# service is dead
|
|
return 1
|
|
}
|
|
|
|
function is_module_loaded {
|
|
return $(lsmod | grep -q $1)
|
|
}
|
|
|
|
function load_module_if_not_loaded {
|
|
local module=$1
|
|
local fatal=$2
|
|
|
|
if is_module_loaded $module; then
|
|
echo "Module already loaded: $module"
|
|
else
|
|
if [ "$(trueorfalse True fatal)" == "True" ]; then
|
|
sudo modprobe $module || (die $LINENO "FAILED TO LOAD $module")
|
|
else
|
|
sudo modprobe $module || (echo "FAILED TO LOAD $module")
|
|
fi
|
|
fi
|
|
}
|
|
|
|
function unload_module_if_loaded {
|
|
local module=$1
|
|
|
|
if is_module_loaded $module; then
|
|
sudo rmmod $module || (die $LINENO "FAILED TO UNLOAD $module")
|
|
else
|
|
echo "Module is not loaded: $module"
|
|
fi
|
|
}
|
|
|
|
# cleanup_nb_db() - Clean all the keys in the northbound database
|
|
function cleanup_nb_db {
|
|
# clean db only on the master node
|
|
if is_service_enabled q-svc ; then
|
|
if [[ "$DF_Q_SVC_MASTER" == "True" ]]; then
|
|
df-db clean
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# init_nb_db() - Create all the tables in northbound database
|
|
function init_nb_db {
|
|
# init db only on the master node
|
|
if is_service_enabled q-svc ; then
|
|
if [[ "$DF_Q_SVC_MASTER" == "True" ]]; then
|
|
df-db init
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# drop_nb_db() - Drop all the tables in northbound database
|
|
function drop_nb_db {
|
|
# drop db only on the master node
|
|
if is_service_enabled q-svc ; then
|
|
if [[ "$DF_Q_SVC_MASTER" == "True" ]]; then
|
|
df-db dropall
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# start_df() - Start running processes, including screen
|
|
function start_df {
|
|
echo "Starting Dragonflow"
|
|
|
|
if is_service_enabled df-controller ; then
|
|
sudo ovs-vsctl --no-wait set-controller $INTEGRATION_BRIDGE tcp:127.0.0.1:6633
|
|
run_process df-controller "$DF_LOCAL_CONTROLLER_BINARY --config-file $NEUTRON_CONF --config-file $DRAGONFLOW_CONF"
|
|
fi
|
|
}
|
|
|
|
# stop_df() - Stop running processes (non-screen)
|
|
function stop_df {
|
|
if is_service_enabled df-controller ; then
|
|
stop_process df-controller
|
|
fi
|
|
|
|
cleanup_nb_db
|
|
drop_nb_db
|
|
|
|
if function_exists nb_db_driver_stop_server; then
|
|
nb_db_driver_stop_server
|
|
fi
|
|
}
|
|
|
|
function disable_libvirt_apparmor {
|
|
if ! sudo aa-status --enabled ; then
|
|
return 0
|
|
fi
|
|
# NOTE(arosen): This is used as a work around to allow newer versions
|
|
# of libvirt to work with ovs configured ports. See LP#1466631.
|
|
# requires the apparmor-utils
|
|
install_package apparmor-utils
|
|
# disables apparmor for libvirtd
|
|
sudo aa-complain /etc/apparmor.d/usr.sbin.libvirtd
|
|
}
|
|
|
|
function verify_ryu_version {
|
|
# Verify ryu is installed. Version greater than 3.29. Does not return
|
|
# on failure.
|
|
RYU_VER_LINE=`ryu --version 2>&1 | head -n 1`
|
|
RYU_VER=`echo $RYU_VER_LINE | cut -d' ' -f2`
|
|
echo "Found ryu version $RYU_VER ($RYU_VER_LINE)"
|
|
if [ `vercmp_numbers "$RYU_VER" "3.29.1"` -lt 0 ]; then
|
|
die $LINENO "ryu version $RYU_VER too low. Version 3.29.1+ is required for Dragonflow."
|
|
fi
|
|
}
|
|
|
|
function start_pubsub_service {
|
|
if is_service_enabled df-publisher-service ; then
|
|
echo "Starting Dragonflow publisher service"
|
|
run_process df-publisher-service "$DF_PUBLISHER_SERVICE_BINARY --config-file $NEUTRON_CONF --config-file $DRAGONFLOW_CONF --config-file $DRAGONFLOW_PUBLISHER_CONF"
|
|
fi
|
|
}
|
|
|
|
function stop_pubsub_service {
|
|
if is_service_enabled df-publisher-service ; then
|
|
stop_process df-publisher-service
|
|
fi
|
|
}
|
|
|
|
function start_df_metadata_agent {
|
|
if is_service_enabled df-metadata ; then
|
|
echo "Starting Dragonflow metadata service"
|
|
run_process df-metadata "$DF_METADATA_SERVICE --config-file $NEUTRON_CONF --config-file $DRAGONFLOW_CONF"
|
|
fi
|
|
}
|
|
|
|
function stop_df_metadata_agent {
|
|
if is_service_enabled df-metadata ; then
|
|
echo "Stopping Dragonflow metadata service"
|
|
stop_process df-metadata
|
|
sudo ovs-vsctl del-port br-int $DF_METADATA_SERVICE_INTERFACE
|
|
fi
|
|
}
|
|
|
|
function start_df_bgp_service {
|
|
if is_service_enabled df-bgp ; then
|
|
echo "Starting Dragonflow BGP dynamic routing service"
|
|
run_process df-bgp "$DF_BGP_SERVICE --config-file $NEUTRON_CONF --config-file $DRAGONFLOW_CONF"
|
|
fi
|
|
}
|
|
|
|
function start_df_skydive {
|
|
if is_service_enabled df-skydive ; then
|
|
echo "Starting Dragonflow skydive service"
|
|
run_process df-skydive "$DF_SKYDIVE_SERVICE --config-file $NEUTRON_CONF --config-file $DRAGONFLOW_CONF"
|
|
fi
|
|
}
|
|
|
|
function stop_df_skydive {
|
|
if is_service_enabled df-skydive ; then
|
|
echo "Stopping Dragonflow skydive service"
|
|
stop_process df-skydive
|
|
fi
|
|
}
|
|
|
|
function setup_rootwrap_filters {
|
|
if [[ "$DF_INSTALL_DEBUG_ROOTWRAP_CONF" == "True" ]]; then
|
|
echo "Adding rootwrap filters"
|
|
sudo mkdir -p -m 755 $NEUTRON_CONF_DIR/etc/rootwrap.d
|
|
sudo cp -p $DRAGONFLOW_DIR/etc/rootwrap.d/* $NEUTRON_CONF_DIR/etc/rootwrap.d
|
|
fi
|
|
}
|
|
|
|
function stop_df_bgp_service {
|
|
if is_service_enabled df-bgp ; then
|
|
echo "Stopping Dragonflow BGP dynamic routing service"
|
|
stop_process df-bgp
|
|
fi
|
|
}
|
|
|
|
function handle_df_stack_install {
|
|
if [[ "$OFFLINE" != "True" ]]; then
|
|
if ! is_neutron_enabled ; then
|
|
install_neutron
|
|
fi
|
|
install_df
|
|
if [[ "$DF_REINSTALL_OVS" == "True" ]]; then
|
|
install_ovs
|
|
fi
|
|
fi
|
|
setup_develop $DRAGONFLOW_DIR
|
|
if [[ "$DF_REINSTALL_OVS" == "True" ]]; then
|
|
init_ovs
|
|
# We have to start at install time, because Neutron's post-config
|
|
# phase runs ovs-vsctl.
|
|
start_ovs
|
|
fi
|
|
if function_exists nb_db_driver_start_server; then
|
|
nb_db_driver_start_server
|
|
fi
|
|
disable_libvirt_apparmor
|
|
}
|
|
|
|
function handle_df_stack_post_install {
|
|
init_neutron_sample_config
|
|
configure_ovs
|
|
configure_df_plugin
|
|
# configure nb db driver
|
|
if function_exists nb_db_driver_configure; then
|
|
nb_db_driver_configure
|
|
fi
|
|
# initialize the nb db
|
|
init_nb_db
|
|
|
|
if [[ "$DF_PUB_SUB" == "True" ]]; then
|
|
# Implemented by the pub/sub plugin
|
|
configure_pubsub_service_plugin
|
|
# Defaults, in case no Pub/Sub service was selected
|
|
if [ -z $PUB_SUB_DRIVER ]; then
|
|
die $LINENO "pub-sub enabled, but no pub-sub driver selected"
|
|
fi
|
|
fi
|
|
|
|
if is_service_enabled nova; then
|
|
configure_neutron_nova
|
|
fi
|
|
|
|
if is_service_enabled df-publisher-service; then
|
|
start_pubsub_service
|
|
fi
|
|
|
|
start_df
|
|
start_df_metadata_agent
|
|
start_df_bgp_service
|
|
setup_rootwrap_filters
|
|
start_df_skydive
|
|
install_package jq
|
|
}
|
|
|
|
function handle_df_stack {
|
|
if [[ "$STAGE" == "install" ]]; then
|
|
handle_df_stack_install
|
|
elif [[ "$STAGE" == "post-config" ]]; then
|
|
handle_df_stack_post_install
|
|
fi
|
|
}
|
|
|
|
function handle_df_unstack {
|
|
stop_df_skydive
|
|
stop_df_bgp_service
|
|
stop_df_metadata_agent
|
|
stop_df
|
|
if function_exists nb_db_driver_clean; then
|
|
nb_db_driver_clean
|
|
fi
|
|
if [[ "$DF_REINSTALL_OVS" == "True" ]]; then
|
|
cleanup_ovs
|
|
stop_ovs
|
|
uninstall_ovs
|
|
fi
|
|
if is_service_enabled df-publisher-service; then
|
|
stop_pubsub_service
|
|
fi
|
|
}
|
|
|
|
|
|
# main loop
|
|
if [[ "$Q_ENABLE_DRAGONFLOW_LOCAL_CONTROLLER" == "True" ]]; then
|
|
|
|
if is_plugin_enabled octavia; then
|
|
# Only define this function if dragonflow is used
|
|
function octavia_create_network_interface_device {
|
|
INTERFACE=$1
|
|
MGMT_PORT_ID=$2
|
|
MGMT_PORT_MAC=$3
|
|
if [ -z "$INTERFACE" ]; then
|
|
die "octavia_create_network_interface_device for dragonflow: Interface not given (1st parameter)"
|
|
fi
|
|
if [ -z "$MGMT_PORT_ID" ]; then
|
|
die "octavia_create_network_interface_device for dragonflow: Management port ID not given (2nd parameter)"
|
|
fi
|
|
if [ -z "$MGMT_PORT_MAC" ]; then
|
|
die "octavia_create_network_interface_device for dragonflow: Management port MAC not given (3rd parameter)"
|
|
fi
|
|
sudo ovs-vsctl -- --may-exist add-port $INTEGRATION_BRIDGE $INTERFACE -- set Interface $INTERFACE type=internal -- set Interface $INTERFACE external-ids:iface-status=active -- set Interface $INTERFACE external-ids:attached-mac=$MGMT_PORT_MAC -- set Interface $INTERFACE external-ids:iface-id=$MGMT_PORT_ID -- set Interface $INTERFACE external-ids:skip_cleanup=true
|
|
}
|
|
|
|
function octavia_delete_network_interface_device {
|
|
: # Do nothing
|
|
}
|
|
fi
|
|
|
|
if [[ "$ACTION" == "stack" ]]; then
|
|
handle_df_stack
|
|
elif [[ "$ACTION" == "unstack" ]]; then
|
|
handle_df_unstack
|
|
fi
|
|
fi
|