kuryr-libnetwork/usr/libexec/kuryr/ovs

116 lines
3.3 KiB
Bash
Executable File

#!/bin/bash
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
INT_BRIDGE="br-int"
HYBRID_PLUG="'ovs_hybrid_plug': True"
OPERATION=$1
PORT=$2
VETH=$3
CONTAINER_UUID=$4
MAC_ADDRESS=$5
ovs_bind_port() {
echo "plugging veth $VETH (Neutron port $PORT)..."
ovs-vsctl -- --may-exist add-port $INT_BRIDGE $VETH -- \
set interface $VETH external_ids:attached-mac=$MAC_ADDRESS \
external_ids:iface-id=$PORT external_ids:vm-uuid=$CONTAINER_UUID \
external_ids:iface-status=active external_ids:owner=kuryr
}
ovs_unbind_port() {
echo "unplugging port $PORT..."
MYPORT=`ovs-vsctl --data=bare --no-heading --columns=name \
find interface external_ids:iface-id=$PORT \
external_ids:owner=kuryr`
if [ -z "$MYPORT" ]; then
echo >&2 "Failed to find port $PORT."
exit 1
fi
ovs-vsctl del-port $INT_BRIDGE $MYPORT
}
ovs_hybrid_bind_port() {
echo "... plugging veth $VETH (Neutron port $PORT) ..."
# create a linux bridge
br_name="qbr"${PORT:0:11}
ip link add name $br_name type bridge
# Using brctl allows containerized usage not to need privileged mode
# as sysfs is mounted read-only when running with just CAP_NET_ADMIN
brctl setfd $br_name 0
brctl stp $br_name off
# connect the veth outside to linux bridge
ip link set $VETH up
ip link set dev $VETH master $br_name
# create a veth pair to connect linux bridge and the integration bridge
veth_lb="qvb"${PORT:0:11}
veth_ovs="qvo"${PORT:0:11}
ip link add $veth_lb type veth peer name $veth_ovs
# connect one end to the linux bridge
ip link set dev $veth_lb master $br_name
ip link set $br_name up
# connect one end to the ovs integration bridge
ovs-vsctl add-port $INT_BRIDGE $veth_ovs -- \
set interface $veth_ovs external_ids:attached-mac=$MAC_ADDRESS \
external_ids:iface-id=$PORT external_ids:vm-id=$CONTAINER_UUID \
external_ids:iface-status=active external_ids:owner=kuryr
ip link set $veth_lb up
ip link set $veth_ovs up
}
ovs_hybrid_unbind_port() {
echo "unplugging port $PORT ..."
br_name="qbr"${PORT:0:11}
veth_lb="qvb"${PORT:0:11}
veth_ovs="qvo"${PORT:0:11}
ip link set dev $veth_lb nomaster
ovs-vsctl del-port $veth_ovs
ip link delete $veth_lb type veth
ip link set $br_name down
ip link delete $br_name type bridge
}
case $OPERATION in
"bind")
shift
if [ "${7/$HYBRID_PLUG}" = "$7" ]
then
ovs_bind_port
else
ovs_hybrid_bind_port
fi
exit 0
;;
"unbind")
shift
if [ "${5/$HYBRID_PLUG}" = "$5" ]
then
ovs_unbind_port
else
ovs_hybrid_unbind_port
fi
exit 0
;;
*)
echo >&2 "$0: Invalid command $OPERATION."
exit 1
;;
esac