#!/bin/bash # # common functions for ovs based plugin # ------------------------------------- # Save trace setting _XTRACE_NEUTRON_OVS_BASE=$(set +o | grep xtrace) set +o xtrace # Load devstack ovs compliation and loading functions source ${TOP_DIR}/lib/neutron_plugins/ovs_source # Defaults # -------- OVS_BRIDGE=${OVS_BRIDGE:-br-int} # OVS recognize default 'system' datapath or 'netdev' for userspace datapath OVS_DATAPATH_TYPE=${OVS_DATAPATH_TYPE:-system} OVS_TUNNEL_BRIDGE=${OVS_TUNNEL_BRIDGE:-br-tun} function is_neutron_ovs_base_plugin { # Yes, we use OVS. return 0 } function _neutron_ovs_base_add_bridge { local bridge=$1 local addbr_cmd="sudo ovs-vsctl -- --may-exist add-br $bridge" if [ "$OVS_DATAPATH_TYPE" != "system" ] ; then addbr_cmd="$addbr_cmd -- set Bridge $bridge datapath_type=${OVS_DATAPATH_TYPE}" fi $addbr_cmd } function _neutron_ovs_base_setup_bridge { local bridge=$1 neutron-ovs-cleanup --config-file $NEUTRON_CONF _neutron_ovs_base_add_bridge $bridge sudo ovs-vsctl --no-wait br-set-external-id $bridge bridge-id $bridge } function neutron_ovs_base_cleanup { # remove all OVS ports that look like Neutron created ports for port in $(sudo ovs-vsctl list port | grep -o -e [a-zA-Z\-]*tap[0-9a-f\-]* -e q[rg]-[0-9a-f\-]*); do sudo ovs-vsctl del-port ${port} done # remove all OVS bridges created by Neutron for bridge in $(sudo ovs-vsctl list-br | grep -o -e ${OVS_BRIDGE} -e ${PUBLIC_BRIDGE} -e ${OVS_TUNNEL_BRIDGE}); do sudo ovs-vsctl del-br ${bridge} done } function _neutron_ovs_base_install_ubuntu_dkms { # install Dynamic Kernel Module Support packages if needed local kernel_version kernel_version=$(uname -r) local kernel_major_minor kernel_major_minor=`echo $kernel_version | cut -d. -f1-2` # From kernel 3.13 on, openvswitch-datapath-dkms is not needed if vercmp "$kernel_major_minor" "<" "3.13" ; then install_package "dkms openvswitch-datapath-dkms linux-headers-$kernel_version" fi } function _neutron_ovs_base_install_agent_packages { if [ "$Q_BUILD_OVS_FROM_GIT" == "True" ]; then remove_ovs_packages compile_ovs False /usr/local /var load_conntrack_gre_module start_new_ovs else # Install deps install_package $(get_packages "openvswitch") if is_ubuntu; then _neutron_ovs_base_install_ubuntu_dkms restart_service openvswitch-switch elif is_fedora; then restart_service openvswitch sudo systemctl enable openvswitch elif is_suse; then if [[ $DISTRO == "sle12" ]] && vercmp "$os_RELEASE" "<" "12.2" ; then restart_service openvswitch-switch else # workaround for https://bugzilla.suse.com/show_bug.cgi?id=1085971 if [[ $DISTRO =~ "tumbleweed" ]]; then sudo sed -i -e "s,^OVS_USER_ID=.*,OVS_USER_ID='root:root'," /etc/sysconfig/openvswitch fi restart_service openvswitch || { journalctl -xe || : systemctl status openvswitch } fi fi fi } function _neutron_ovs_base_configure_firewall_driver { if [[ "$Q_USE_SECGROUP" == "True" ]]; then iniset /$Q_PLUGIN_CONF_FILE securitygroup firewall_driver openvswitch if ! running_in_container; then enable_kernel_bridge_firewall fi else iniset /$Q_PLUGIN_CONF_FILE securitygroup firewall_driver noop fi } function _neutron_ovs_base_configure_l3_agent { neutron-ovs-cleanup --config-file $NEUTRON_CONF if [[ "$Q_USE_PUBLIC_VETH" = "True" ]]; then ip link show $Q_PUBLIC_VETH_INT > /dev/null 2>&1 || sudo ip link add $Q_PUBLIC_VETH_INT type veth \ peer name $Q_PUBLIC_VETH_EX sudo ip link set $Q_PUBLIC_VETH_INT up sudo ip link set $Q_PUBLIC_VETH_EX up sudo ip addr flush dev $Q_PUBLIC_VETH_EX else _neutron_ovs_base_add_public_bridge sudo ovs-vsctl br-set-external-id $PUBLIC_BRIDGE bridge-id $PUBLIC_BRIDGE fi } function _neutron_ovs_base_add_public_bridge { _neutron_ovs_base_add_bridge $PUBLIC_BRIDGE set_mtu $PUBLIC_BRIDGE $PUBLIC_BRIDGE_MTU } function _neutron_ovs_base_configure_nova_vif_driver { : } # Restore xtrace $_XTRACE_NEUTRON_OVS_BASE