mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	work) Cloudstack seems to let you create guest traffic types on multiple physical networks. However, when I try this with KVM I end up always bridging to whatever device is used for guest.network.device. This pulls the traffic label (NicTO.getName()) and uses that bridge to ensure that we get on the correct physical network, rather than just always using the guest.network.device. This also changes the bridge naming scheme from cloudVirBr + vlanid to br + physicalinterface + "-" + vlanid. This is because we should be able to support the same vlan numbers per physical network, and the previous bridge name would not support this and collide. Signed-off-by: Edison Su <sudison@gmail.com>
		
			
				
	
	
		
			189 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			189 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env bash
 | |
| # Licensed to the Apache Software Foundation (ASF) under one
 | |
| # or more contributor license agreements.  See the NOTICE file
 | |
| # distributed with this work for additional information
 | |
| # regarding copyright ownership.  The ASF licenses this file
 | |
| # to you 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.
 | |
| 
 | |
| 
 | |
| # $Id: modifyvlan.sh 11601 2010-08-11 17:26:15Z kris $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.refactor/java/scripts/vm/network/vnet/modifyvlan.sh $
 | |
| # modifyvlan.sh -- adds and deletes VLANs from a Routing Server
 | |
| # set -x
 | |
| 
 | |
| usage() {
 | |
|   printf "Usage: %s: -o <op>(add | delete) -v <vlan id> -p <pif> -b <bridge name>\n" 
 | |
| }
 | |
| 
 | |
| addVlan() {
 | |
| 	local vlanId=$1
 | |
| 	local pif=$2
 | |
| 	local vlanDev=$pif.$vlanId
 | |
| 	local vlanBr=$3
 | |
|     
 | |
|     vconfig set_name_type DEV_PLUS_VID_NO_PAD	
 | |
| 
 | |
| 	if [ ! -d /sys/class/net/$vlanDev ]
 | |
| 	then
 | |
| 		vconfig add $pif $vlanId > /dev/null
 | |
| 		
 | |
| 		if [ $? -gt 0 ]
 | |
| 		then
 | |
|             # race condition that someone already creates the vlan 
 | |
| 			if [ ! -d /sys/class/net/$vlanDev ]
 | |
|             then
 | |
| 			    printf "Failed to create vlan $vlanId on pif: $pif."
 | |
| 			    return 1
 | |
|             fi
 | |
| 		fi
 | |
| 	fi
 | |
| 	
 | |
| 	# is up?
 | |
|   	ifconfig |grep -w $vlanDev > /dev/null
 | |
| 	if [ $? -gt 0 ]
 | |
| 	then
 | |
| 		ifconfig $vlanDev up > /dev/null
 | |
| 	fi
 | |
| 	
 | |
| 	if [ ! -d /sys/class/net/$vlanBr ]
 | |
| 	then
 | |
| 		brctl addbr $vlanBr > /dev/null
 | |
| 	
 | |
| 		if [ $? -gt 0 ]
 | |
| 		then
 | |
| 			if [ ! -d /sys/class/net/$vlanBr ]
 | |
| 			then
 | |
| 				printf "Failed to create br: $vlanBr"
 | |
| 				return 2
 | |
| 			fi
 | |
| 		fi
 | |
| 	fi
 | |
| 	
 | |
| 	#pif is eslaved into vlanBr?
 | |
| 	ls /sys/class/net/$vlanBr/brif/ |grep -w "$vlanDev" > /dev/null 
 | |
| 	if [ $? -gt 0 ]
 | |
| 	then
 | |
| 		brctl addif $vlanBr $vlanDev > /dev/null
 | |
| 		if [ $? -gt 0 ]
 | |
| 		then
 | |
| 			ls /sys/class/net/$vlanBr/brif/ |grep -w "$vlanDev" > /dev/null 
 | |
| 			if [ $? -gt 0 ]
 | |
| 			then
 | |
| 				printf "Failed to add vlan: $vlanDev to $vlanBr"
 | |
| 				return 3
 | |
| 			fi
 | |
| 		fi
 | |
| 	fi
 | |
| 	# is vlanBr up?
 | |
| 	ifconfig |grep -w $vlanBr > /dev/null
 | |
| 	if [ $? -gt 0 ]
 | |
| 	then
 | |
| 		ifconfig $vlanBr up
 | |
| 	fi
 | |
| 
 | |
| 	return 0
 | |
| }
 | |
| 
 | |
| deleteVlan() {
 | |
| 	local vlanId=$1
 | |
| 	local pif=$2
 | |
| 	local vlanDev=$pif.$vlanId
 | |
|         local vlanBr=$3
 | |
| 
 | |
| 	vconfig rem $vlanDev > /dev/null
 | |
| 	
 | |
| 	if [ $? -gt 0 ]
 | |
| 	then
 | |
| 		printf "Failed to del vlan: $vlanId"
 | |
| 		return 1
 | |
| 	fi	
 | |
| 
 | |
| 	ifconfig $vlanBr down
 | |
| 	
 | |
| 	if [ $? -gt 0 ]
 | |
| 	then
 | |
| 		return 1
 | |
| 	fi
 | |
| 	
 | |
| 	brctl delbr $vlanBr
 | |
| 	
 | |
| 	if [ $? -gt 0 ]
 | |
| 	then
 | |
| 		printf "Failed to del bridge $vlanBr"
 | |
| 		return 1
 | |
| 	fi
 | |
| 
 | |
| 	return 0
 | |
| 	
 | |
| }
 | |
| 
 | |
| op=
 | |
| vlanId=
 | |
| option=$@
 | |
| 
 | |
| while getopts 'o:v:p:b:' OPTION
 | |
| do
 | |
|   case $OPTION in
 | |
|   o)	oflag=1
 | |
| 		op="$OPTARG"
 | |
| 		;;
 | |
|   v)	vflag=1
 | |
| 		vlanId="$OPTARG"
 | |
| 		;;
 | |
|   p)    pflag=1
 | |
| 		pif="$OPTARG"
 | |
| 		;;
 | |
|   b)    bflag=1
 | |
|                 brName="$OPTARG"
 | |
|                 ;;
 | |
|   ?)	usage
 | |
| 		exit 2
 | |
| 		;;
 | |
|   esac
 | |
| done
 | |
| 
 | |
| # Check that all arguments were passed in
 | |
| if [ "$oflag$vflag$pflag$bflag" != "1111" ]
 | |
| then
 | |
| 	usage
 | |
| 	exit 2
 | |
| fi
 | |
| 
 | |
| # Vlan module is loaded?
 | |
| lsmod|grep ^8021q >& /dev/null
 | |
| if [ $? -gt 0 ]
 | |
| then
 | |
|    modprobe 8021q >& /dev/null
 | |
| fi
 | |
| 
 | |
| if [ "$op" == "add" ]
 | |
| then
 | |
| 	# Add the vlan
 | |
| 	addVlan $vlanId $pif $brName
 | |
| 	
 | |
| 	# If the add fails then return failure
 | |
| 	if [ $? -gt 0 ]
 | |
| 	then
 | |
| 		exit 1
 | |
| 	fi
 | |
| else 
 | |
| 	if [ "$op" == "delete" ]
 | |
| 	then
 | |
| 		# Delete the vlan
 | |
| 		deleteVlan $vlanId $pif $brName
 | |
| 	
 | |
| 		# Always exit with success
 | |
| 		exit 0
 | |
| 	fi
 | |
| fi
 |