#!/bin/bash # # common functions for ovs based plugin # ------------------------------------- # Save trace setting _XTRACE_NEUTRON_OVS_BASE=$(set +o | grep xtrace) set +o xtrace 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 --no-wait -- --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 _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 { # 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 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 _neutron_ovs_base_add_bridge $PUBLIC_BRIDGE sudo ovs-vsctl br-set-external-id $PUBLIC_BRIDGE bridge-id $PUBLIC_BRIDGE fi } function _neutron_ovs_base_configure_nova_vif_driver { : } # Restore xtrace $_XTRACE_NEUTRON_OVS_BASE