#!/bin/bash # # common functions for ovs based plugin # ------------------------------------- # Save trace setting OVSB_XTRACE=$(set +o | grep xtrace) set +o xtrace OVS_BRIDGE=${OVS_BRIDGE:-br-int} PUBLIC_BRIDGE=${PUBLIC_BRIDGE:-br-ex} OVS_DATAPATH_TYPE=${OVS_DATAPATH_TYPE:-""} function is_neutron_ovs_base_plugin { # Yes, we use OVS. return 0 } function _neutron_ovs_base_setup_bridge { local bridge=$1 neutron-ovs-cleanup sudo ovs-vsctl --no-wait -- --may-exist add-br $bridge if [[ $OVS_DATAPATH_TYPE != "" ]]; then sudo ovs-vsctl set Bridge $bridge datapath_type=${OVS_DATAPATH_TYPE} fi 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 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}); 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=$(uname -r) local kernel_major_minor=`echo $kernel_version | cut -d. -f1-2` # From kernel 3.13 on, openvswitch-datapath-dkms is not needed if [ `vercmp_numbers "$kernel_major_minor" "3.13"` -lt "0" ]; then install_package "dkms openvswitch-datapath-dkms linux-headers-$kernel_version" fi } function _neutron_ovs_base_install_agent_packages { # 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 elif is_suse; then restart_service openvswitch-switch fi } function _neutron_ovs_base_configure_debug_command { if [ "$Q_USE_PROVIDERNET_FOR_PUBLIC" = "True" ]; then iniset $NEUTRON_TEST_CONFIG_FILE DEFAULT external_network_bridge "" else iniset $NEUTRON_TEST_CONFIG_FILE DEFAULT external_network_bridge $PUBLIC_BRIDGE fi } function _neutron_ovs_base_configure_firewall_driver { if [[ "$Q_USE_SECGROUP" == "True" ]]; then iniset /$Q_PLUGIN_CONF_FILE securitygroup firewall_driver neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver else iniset /$Q_PLUGIN_CONF_FILE securitygroup firewall_driver neutron.agent.firewall.NoopFirewallDriver fi } function _neutron_ovs_base_configure_l3_agent { if [ "$Q_USE_PROVIDERNET_FOR_PUBLIC" = "True" ]; then iniset $Q_L3_CONF_FILE DEFAULT external_network_bridge "" else iniset $Q_L3_CONF_FILE DEFAULT external_network_bridge $PUBLIC_BRIDGE fi neutron-ovs-cleanup 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 # --no-wait causes a race condition if $PUBLIC_BRIDGE is not up when ip addr flush is called sudo ovs-vsctl -- --may-exist add-br $PUBLIC_BRIDGE sudo ovs-vsctl br-set-external-id $PUBLIC_BRIDGE bridge-id $PUBLIC_BRIDGE # ensure no IP is configured on the public bridge sudo ip addr flush dev $PUBLIC_BRIDGE fi } function _neutron_ovs_base_configure_nova_vif_driver { : } # Restore xtrace $OVSB_XTRACE