[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] hotplug: add openvswitch script



On Thu, 2013-04-18 at 12:50 +0100, Ian Campbell wrote:
> Based on Waldi's RFC at
> http://lists.xen.org/archives/html/xen-devel/2012-09/msg00943.html
> 
> To use it set vif.default.script="vif-openvswitch" in /etc/xen/xl.conf or use
> script=vif-openvswitch in the vif configuration.
> 
> Appears to do the right thing for PV and HVM guests (including tap devices)
> and with stubdomains.
> 
> In order to support VLAN tagging and trunking the "bridge" specified in the
> configuration can have a special syntax, that is:
> 
>       BRIDGE_NAME[.VLAN][:TRUNK,TRUNK]
> 
> e.g.
> - xenbr0.99
>      add the VIF to VLAN99 on xenbr0
> - xenbr0:99,100,101
>      add the VIF to xenbr0 as a trunk port receiving VLANs 99, 100 & 101
> 
> Waldi, can you confirm if I have correctly reverse engineered the syntax from
> the regexp please ;-)

I've done this as a Xen patch, but in principal this could also be
maintained in the openvswitch tree (I've added their list to the CC,
having forgotten it with the initial posting). Anyone have any strong
preference for one home over the other?

If we do go with the Xen tree then WRT the feature freeze, this can
pretty obviously only break things if you enable it.


> Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
> Cc: waldi@xxxxxxxxxx
> ---
>  tools/examples/xl.conf              |    2 +-

This change was an unintentional artefact of my local testing, please
ignore...

>  tools/hotplug/Linux/Makefile        |    1 +
>  tools/hotplug/Linux/vif-openvswitch |   99 
> +++++++++++++++++++++++++++++++++++
>  3 files changed, 101 insertions(+), 1 deletions(-)
>  create mode 100644 tools/hotplug/Linux/vif-openvswitch
> 
> diff --git a/tools/examples/xl.conf b/tools/examples/xl.conf
> index 9402c3f..625b1a4 100644
> --- a/tools/examples/xl.conf
> +++ b/tools/examples/xl.conf
> @@ -9,7 +9,7 @@
>  #lockfile="/var/lock/xl"
>  
>  # default vif script 
> -#vifscript="vif-bridge"
> +vifscript="vif-openvswitch"
>  
>  # default output format used by "xl list -l"
>  #output_format="json"
> diff --git a/tools/hotplug/Linux/Makefile b/tools/hotplug/Linux/Makefile
> index 0605559..99bf87f 100644
> --- a/tools/hotplug/Linux/Makefile
> +++ b/tools/hotplug/Linux/Makefile
> @@ -13,6 +13,7 @@ XENCOMMONS_SYSCONFIG = init.d/sysconfig.xencommons
>  XEN_SCRIPTS = network-bridge vif-bridge
>  XEN_SCRIPTS += network-route vif-route
>  XEN_SCRIPTS += network-nat vif-nat
> +XEN_SCRIPTS += vif-openvswitch
>  XEN_SCRIPTS += vif2
>  XEN_SCRIPTS += vif-setup
>  XEN_SCRIPTS += block
> diff --git a/tools/hotplug/Linux/vif-openvswitch 
> b/tools/hotplug/Linux/vif-openvswitch
> new file mode 100644
> index 0000000..53c2f50
> --- /dev/null
> +++ b/tools/hotplug/Linux/vif-openvswitch
> @@ -0,0 +1,99 @@
> +#!/bin/bash
> +#============================================================================
> +# ${XEN_SCRIPT_DIR}/vif-openvswitch
> +#
> +# Script for configuring a vif in openvswitch mode.
> +# The hotplugging system will call this script if it is specified either in
> +# the device configuration given to Xend, or the default Xend configuration
> +# in ${XEN_CONFIG_DIR}/xend-config.sxp.  If the script is specified in
> +# neither of those places, then this script is the default.
> +#
> +# Usage:
> +# vif-openvswitch (add|remove|online|offline)
> +#
> +# Environment vars:
> +# vif         vif interface name (required).
> +# XENBUS_PATH path to this device's details in the XenStore (required).
> +#
> +# Read from the store:
> +# bridge  openvswitch to add the vif to (required).
> +# ip      list of IP networks for the vif, space-separated (optional).
> +#
> +# up:
> +# Enslaves the vif interface to the bridge and adds iptables rules
> +# for its ip addresses (if any).
> +#
> +# down:
> +# Removes the vif interface from the bridge and removes the iptables
> +# rules for its ip addresses (if any).
> +#============================================================================
> +
> +dir=$(dirname "$0")
> +. "$dir/vif-common.sh"
> +
> +openvswitch_external_id() {
> +    local dev=$1
> +    local key=$2
> +    local value=$3
> +
> +    echo "-- set interface $dev external-ids:\"$key\"=\"$value\""
> +}
> +
> +openvswitch_external_id_all() {
> +    local dev=$1
> +    local frontend_id=$(xenstore_read "$XENBUS_PATH/frontend-id")
> +    local vm_path=$(xenstore_read "/local/domain/${frontend_id}/vm")
> +    local name=$(xenstore_read "${vm_path}/name")
> +    openvswitch_external_id $dev "xen-vm-name" "$name"
> +    local uuid=$(xenstore_read "${vm_path}/uuid")
> +    openvswitch_external_id $dev "xen-vm-uuid" "$uuid"
> +    local mac=$(xenstore_read "$XENBUS_PATH/mac")
> +    openvswitch_external_id $dev "attached-mac" "$mac"
> +}
> +
> +add_to_openvswitch () {
> +    local dev=$1
> +    local bridge="$(xenstore_read_default "$XENBUS_PATH/bridge" "$bridge")"
> +    local tag trunk
> +
> +    if [[ $bridge =~ 
> ^([^.:]+)(\.([[:digit:]]+))?(:([[:digit:]]+(:[[:digit:]]+)*))?$ ]]; then
> +        bridge="${BASH_REMATCH[1]}"
> +        tag="${BASH_REMATCH[3]}"
> +        trunk="${BASH_REMATCH[5]//:/,}"
> +    else
> +        fatal "No valid bridge was specified"
> +    fi
> +
> +    if [ $trunk ]; then
> +        local trunk_arg="trunk=$trunk"
> +    fi
> +
> +    if [ $tag ]; then
> +        local tag_arg="tag=$tag"
> +    fi
> +
> +    local vif_details="$(openvswitch_external_id_all $dev)"
> +
> +    ovs-vsctl --timeout=30 -- --if-exists del-port $dev -- add-port 
> "$bridge" $dev $tag_arg $trunk_arg $vif_details
> +    ip link set $dev up
> +}
> +
> +case "$command" in
> +    add|online)
> +        setup_virtual_bridge_port $dev
> +        add_to_openvswitch $dev
> +        ;;
> +
> +    offline)
> +        ovs-vsctl --timeout=30 -- --if-exists del-port $dev
> +        ;;
> +esac
> +
> +if [ "$type_if" = vif ]; then
> +    handle_iptable
> +fi
> +
> +log debug "Successful vif-openvswitch $command for $dev."
> +if [ "$type_if" = vif -a "$command" = "online" ]; then
> +    success
> +fi



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.