X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=utilities%2Fovs-docker;h=43cea54393e6a0ce349b3f0845809af6e8c43fc3;hb=115d8719dbfda638b0f26593e1df5bb354aaacd4;hp=6b17b8779c52f1db65d535026e1a144b93cea8a4;hpb=a14bf25a24349ce7af867d88bcfa7b4eafe626a4;p=cascardo%2Fovs.git diff --git a/utilities/ovs-docker b/utilities/ovs-docker index 6b17b8779..43cea5439 100755 --- a/utilities/ovs-docker +++ b/utilities/ovs-docker @@ -13,14 +13,19 @@ # See the License for the specific language governing permissions and # limitations under the License. -check_command_avail () { - while [ $# -ne 0 ]; do - if ("$1" --version) > /dev/null 2>&1; then :; else - echo >&2 "$UTIL: missing $1, cannot proceed" - exit 1 +# Check for programs we'll need. +search_path () { + save_IFS=$IFS + IFS=: + for dir in $PATH; do + IFS=$save_IFS + if test -x "$dir/$1"; then + return 0 fi - shift done + IFS=$save_IFS + echo >&2 "$0: $1 not found in \$PATH, please install and try again" + exit 1 } ovs_vsctl () { @@ -42,19 +47,67 @@ delete_netns_link () { rm -f /var/run/netns/"$PID" } +get_port_for_container_interface () { + CONTAINER="$1" + INTERFACE="$2" + + PORT=`ovs_vsctl --data=bare --no-heading --columns=name find interface \ + external_ids:container_id="$CONTAINER" \ + external_ids:container_iface="$INTERFACE"` + if [ -z "$PORT" ]; then + echo >&2 "$UTIL: Failed to find any attached port" \ + "for CONTAINER=$CONTAINER and INTERFACE=$INTERFACE" + fi + echo "$PORT" +} + add_port () { BRIDGE="$1" INTERFACE="$2" CONTAINER="$3" - ADDRESS="$4" - GATEWAY="$5" - if [ "$#" -lt 3 ]; then - usage + if [ -z "$BRIDGE" ] || [ -z "$INTERFACE" ] || [ -z "$CONTAINER" ]; then + echo >&2 "$UTIL add-port: not enough arguments (use --help for help)" exit 1 fi - if ovs_vsctl --may-exist add-br "$BRIDGE"; then :; else + shift 3 + while [ $# -ne 0 ]; do + case $1 in + --ipaddress=*) + ADDRESS=`expr X"$1" : 'X[^=]*=\(.*\)'` + shift + ;; + --macaddress=*) + MACADDRESS=`expr X"$1" : 'X[^=]*=\(.*\)'` + shift + ;; + --gateway=*) + GATEWAY=`expr X"$1" : 'X[^=]*=\(.*\)'` + shift + ;; + --mtu=*) + MTU=`expr X"$1" : 'X[^=]*=\(.*\)'` + shift + ;; + *) + echo >&2 "$UTIL add-port: unknown option \"$1\"" + exit 1 + ;; + esac + done + + # Check if a port is already attached for the given container and interface + PORT=`get_port_for_container_interface "$CONTAINER" "$INTERFACE" \ + 2>/dev/null` + if [ -n "$PORT" ]; then + echo >&2 "$UTIL: Port already attached" \ + "for CONTAINER=$CONTAINER and INTERFACE=$INTERFACE" + exit 1 + fi + + if ovs_vsctl br-exists "$BRIDGE" || \ + ovs_vsctl add-br "$BRIDGE"; then :; else echo >&2 "$UTIL: Failed to create bridge $BRIDGE" exit 1 fi @@ -88,10 +141,18 @@ add_port () { ip netns exec "$PID" ip link set dev "${PORTNAME}_c" name "$INTERFACE" ip netns exec "$PID" ip link set "$INTERFACE" up + if [ -n "$MTU" ]; then + ip netns exec "$PID" ip link set dev "$INTERFACE" mtu "$MTU" + fi + if [ -n "$ADDRESS" ]; then ip netns exec "$PID" ip addr add "$ADDRESS" dev "$INTERFACE" fi + if [ -n "$MACADDRESS" ]; then + ip netns exec "$PID" ip link set dev "$INTERFACE" address "$MACADDRESS" + fi + if [ -n "$GATEWAY" ]; then ip netns exec "$PID" ip route add default via "$GATEWAY" fi @@ -107,12 +168,8 @@ del_port () { exit 1 fi - PORT=`ovs_vsctl --data=bare --no-heading --columns=name find interface \ - external_ids:container_id="$CONTAINER" \ - external_ids:container_iface="$INTERFACE"` + PORT=`get_port_for_container_interface "$CONTAINER" "$INTERFACE"` if [ -z "$PORT" ]; then - echo >&2 "$UTIL: Failed to find any attached port in $BRIDGE" \ - "for CONTAINER=$CONTAINER and INTERFACE=$INTERFACE" exit 1 fi @@ -141,20 +198,41 @@ del_ports () { done } +set_vlan () { + BRIDGE="$1" + INTERFACE="$2" + CONTAINER_ID="$3" + VLAN="$4" + + if [ "$#" -lt 4 ]; then + usage + exit 1 + fi + + PORT=`get_port_for_container_interface "$CONTAINER_ID" "$INTERFACE"` + if [ -z "$PORT" ]; then + exit 1 + fi + ovs_vsctl set port "$PORT" tag="$VLAN" +} + usage() { cat << EOF ${UTIL}: Performs integration of Open vSwitch with Docker. usage: ${UTIL} COMMAND Commands: - add-port BRIDGE INTERFACE CONTAINER [ADDRESS [GATEWAY]] + add-port BRIDGE INTERFACE CONTAINER [--ipaddress="ADDRESS"] + [--gateway=GATEWAY] [--macaddress="MACADDRESS"] + [--mtu=MTU] Adds INTERFACE inside CONTAINER and connects it as a port in Open vSwitch BRIDGE. Optionally, sets ADDRESS on INTERFACE. ADDRESS can include a '/' to represent network - prefix length. Along with ADDRESS, optionally set the - default gateway for the container. e.g.: - ${UTIL} add-port br-int eth1 c474a0e2830e 192.168.1.2/24 \ - 192.168.1.1 + prefix length. Optionally, sets a GATEWAY, MACADDRESS + and MTU. e.g.: + ${UTIL} add-port br-int eth1 c474a0e2830e + --ipaddress=192.168.1.2/24 --gateway=192.168.1.1 + --macaddress="a2:c3:0d:49:7f:f8" --mtu=1450 del-port BRIDGE INTERFACE CONTAINER Deletes INTERFACE inside CONTAINER and removes its connection to Open vSwitch BRIDGE. e.g.: @@ -162,13 +240,19 @@ Commands: del-ports BRIDGE CONTAINER Removes all Open vSwitch interfaces from CONTAINER. e.g.: ${UTIL} del-ports br-int c474a0e2830e + set-vlan BRIDGE INTERFACE CONTAINER VLAN + Configures the INTERFACE of CONTAINER attached to BRIDGE + to become an access port of VLAN. e.g.: + ${UTIL} set-vlan br-int eth1 c474a0e2830e 5 Options: -h, --help display this help message. EOF } UTIL=$(basename $0) -check_command_avail ovs-vsctl docker uuidgen +search_path ovs-vsctl +search_path docker +search_path uuidgen if (ip netns) > /dev/null 2>&1; then :; else echo >&2 "$UTIL: ip utility not found (or it does not support netns),"\ @@ -197,6 +281,11 @@ case $1 in del_ports "$@" exit 0 ;; + "set-vlan") + shift + set_vlan "$@" + exit 0 + ;; -h | --help) usage exit 0