diff --git a/lib/neutron b/lib/neutron index 2253eda772..ca9b16cd8c 100644 --- a/lib/neutron +++ b/lib/neutron @@ -148,16 +148,31 @@ PROVIDER_SUBNET_NAME=${PROVIDER_SUBNET_NAME:-"provider_net"} # If Q_USE_PROVIDERNET_FOR_PUBLIC=True, use a flat provider network # for external interface of neutron l3-agent. In that case, # PUBLIC_PHYSICAL_NETWORK specifies provider:physical_network value -# used for the network. In case of openvswitch agent, you should -# add the corresponding entry to your OVS_BRIDGE_MAPPINGS. +# used for the network. In case of ofagent, you should add the +# corresponding entry to your OFAGENT_PHYSICAL_INTERFACE_MAPPINGS. +# For openvswitch agent, you should add the corresponding entry to +# your OVS_BRIDGE_MAPPINGS. # -# eg. +# eg. (ofagent) +# Q_USE_PROVIDERNET_FOR_PUBLIC=True +# Q_USE_PUBLIC_VETH=True +# PUBLIC_PHYSICAL_NETWORK=public +# OFAGENT_PHYSICAL_INTERFACE_MAPPINGS=public:veth-pub-int +# +# eg. (openvswitch agent) # Q_USE_PROVIDERNET_FOR_PUBLIC=True # PUBLIC_PHYSICAL_NETWORK=public # OVS_BRIDGE_MAPPINGS=public:br-ex Q_USE_PROVIDERNET_FOR_PUBLIC=${Q_USE_PROVIDERNET_FOR_PUBLIC:-False} PUBLIC_PHYSICAL_NETWORK=${PUBLIC_PHYSICAL_NETWORK:-public} +# If Q_USE_PUBLIC_VETH=True, create and use a veth pair instead of +# PUBLIC_BRIDGE. This is intended to be used with +# Q_USE_PROVIDERNET_FOR_PUBLIC=True. +Q_USE_PUBLIC_VETH=${Q_USE_PUBLIC_VETH:-False} +Q_PUBLIC_VETH_EX=${Q_PUBLIC_VETH_EX:-veth-pub-ex} +Q_PUBLIC_VETH_INT=${Q_PUBLIC_VETH_INT:-veth-pub-int} + # The next two variables are configured by plugin # e.g. _configure_neutron_l3_agent or lib/neutron_plugins/* # @@ -543,12 +558,20 @@ function create_neutron_initial_network { if is_service_enabled q-l3; then # logic is specific to using the l3-agent for l3 if is_neutron_ovs_base_plugin && [[ "$Q_USE_NAMESPACE" = "True" ]]; then - # Disable in-band as we are going to use local port - # to communicate with VMs - sudo ovs-vsctl set Bridge $PUBLIC_BRIDGE other_config:disable-in-band=true + local ext_gw_interface + + if [[ "$Q_USE_PUBLIC_VETH" = "True" ]]; then + ext_gw_interface=$Q_PUBLIC_VETH_EX + else + # Disable in-band as we are going to use local port + # to communicate with VMs + sudo ovs-vsctl set Bridge $PUBLIC_BRIDGE \ + other_config:disable-in-band=true + ext_gw_interface=$PUBLIC_BRIDGE + fi CIDR_LEN=${FLOATING_RANGE#*/} - sudo ip addr add $EXT_GW_IP/$CIDR_LEN dev $PUBLIC_BRIDGE - sudo ip link set $PUBLIC_BRIDGE up + sudo ip addr add $EXT_GW_IP/$CIDR_LEN dev $ext_gw_interface + sudo ip link set $ext_gw_interface up ROUTER_GW_IP=`neutron port-list -c fixed_ips -c device_owner | grep router_gateway | awk -F '"' '{ print $8; }'` die_if_not_set $LINENO ROUTER_GW_IP "Failure retrieving ROUTER_GW_IP" sudo route add -net $FIXED_RANGE gw $ROUTER_GW_IP diff --git a/lib/neutron_plugins/ofagent_agent b/lib/neutron_plugins/ofagent_agent index a5a58f4c27..1c04f2f64e 100644 --- a/lib/neutron_plugins/ofagent_agent +++ b/lib/neutron_plugins/ofagent_agent @@ -77,6 +77,10 @@ function neutron_plugin_configure_plugin_agent { if [[ "$OVS_BRIDGE_MAPPINGS" != "" ]]; then iniset /$Q_PLUGIN_CONF_FILE ovs bridge_mappings $OVS_BRIDGE_MAPPINGS fi + if [[ "$OFAGENT_PHYSICAL_INTERFACE_MAPPINGS" != "" ]]; then + iniset /$Q_PLUGIN_CONF_FILE agent physical_interface_mappings \ + $OFAGENT_PHYSICAL_INTERFACE_MAPPINGS + fi AGENT_BINARY="$NEUTRON_BIN_DIR/neutron-ofagent-agent" iniset /$Q_PLUGIN_CONF_FILE agent tunnel_types $Q_TUNNEL_TYPES diff --git a/lib/neutron_plugins/ovs_base b/lib/neutron_plugins/ovs_base index d913f7c3cc..f0ef194569 100644 --- a/lib/neutron_plugins/ovs_base +++ b/lib/neutron_plugins/ovs_base @@ -79,11 +79,20 @@ function _neutron_ovs_base_configure_l3_agent { fi neutron-ovs-cleanup - # --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 + 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 {