CLOUDSTACK-6062: nic device ids don't always correspond to

'eth' device numbers, but vpc scripts require it. Now we match
based on mac.
This commit is contained in:
Marcus Sorensen 2014-02-07 14:59:40 -07:00
parent 3384633834
commit c39ec1eb8f
3 changed files with 53 additions and 12 deletions

View File

@ -637,6 +637,7 @@ public class VirtualRoutingResource {
String netmask = NetUtils.getSubNet(routerGIP, nic.getNetmask()); String netmask = NetUtils.getSubNet(routerGIP, nic.getNetmask());
String args = " -C"; String args = " -C";
args += " -M " + nic.getMac();
args += " -d " + dev; args += " -d " + dev;
args += " -i " + routerGIP; args += " -i " + routerGIP;
args += " -g " + gateway; args += " -g " + gateway;
@ -677,6 +678,7 @@ public class VirtualRoutingResource {
ExecutionResult result; ExecutionResult result;
String args = " -d " + dev; String args = " -d " + dev;
args += " -M " + nic.getMac();
if (privateGw != null) { if (privateGw != null) {
args += " -a " + rule; args += " -a " + rule;
result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), "vpc_privategw_acl.sh", args); result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), "vpc_privategw_acl.sh", args);

View File

@ -155,11 +155,13 @@ acl_entry_for_guest_network() {
dflag=0 dflag=0
gflag=0 gflag=0
aflag=0 aflag=0
Mflag=0
rules="" rules=""
rules_list="" rules_list=""
ip="" ip=""
dev="" dev=""
while getopts 'd:i:m:a:' OPTION mac=""
while getopts 'd:i:m:M:a:' OPTION
do do
case $OPTION in case $OPTION in
d) dflag=1 d) dflag=1
@ -171,6 +173,9 @@ do
m) mflag=1 m) mflag=1
mask="$OPTARG" mask="$OPTARG"
;; ;;
M) Mflag=1
mac="$OPTARG"
;;
a) aflag=1 a) aflag=1
rules="$OPTARG" rules="$OPTARG"
;; ;;
@ -186,6 +191,18 @@ then
unlock_exit 2 $lock $locked unlock_exit 2 $lock $locked
fi fi
# override dev with mac address match, if provided
if [[ ! -z "$mac" ]]; then
logger -t cloud "$(basename $0): mac $mac passed, trying to match to device"
for i in `ls /sys/class/net`; do
if grep -q $mac /sys/class/net/$i/address; then
dev=$i
logger -t cloud "$(basename $0): matched dev $i to mac $mac, dev is now $dev"
break
fi
done
fi
gcidr="$ip/$mask" gcidr="$ip/$mask"
if [ -n "$rules" ] if [ -n "$rules" ]
then then

View File

@ -30,7 +30,7 @@ then
fi fi
usage() { usage() {
printf "Usage:\n %s -A -d <dev> -i <ip address> -g <gateway> -m <network mask> -s <dns ip> -e < domain> [-f] \n" $(basename $0) >&2 printf "Usage:\n %s -A -M <mac> -d <dev> -i <ip address> -g <gateway> -m <network mask> -s <dns ip> -e < domain> [-f] \n" $(basename $0) >&2
printf " %s -D -d <dev> -i <ip address> \n" $(basename $0) >&2 printf " %s -D -d <dev> -i <ip address> \n" $(basename $0) >&2
} }
@ -131,15 +131,33 @@ desetup_passwdsvcs() {
create_guest_network() { create_guest_network() {
# need to wait for eth device to appear before configuring it # need to wait for eth device to appear before configuring it
timer=0 timer=0
while ! `grep -q $dev /proc/net/dev` ; do
logger -t cloud "$(basename $0):Waiting for interface $dev to appear, $timer seconds" # match dev based on mac, if passed
sleep 1; if [[ ! -z "$mac" ]]; then
if [ $timer -gt 15 ]; then logger -t cloud "$(basename $0): mac $mac passed, trying to match to device"
logger -t cloud "$(basename $0):interface $dev never appeared" while [ ! $timer -gt 15 ]; do
break for i in `ls /sys/class/net`; do
fi if grep -q $mac /sys/class/net/$i/address; then
timer=$[timer + 1] dev=$i
done logger -t cloud "$(basename $0): matched dev $i to mac $mac, dev is now $dev"
timer=15
break
fi
done
sleep 1;
timer=$[timer + 1]
done
else
while ! `grep -q $dev /proc/net/dev` ; do
logger -t cloud "$(basename $0):Waiting for interface $dev to appear, $timer seconds"
sleep 1;
if [ $timer -gt 15 ]; then
logger -t cloud "$(basename $0):interface $dev never appeared"
break
fi
timer=$[timer + 1]
done
fi
logger -t cloud " $(basename $0): Create network on interface $dev, gateway $gw, network $ip/$mask " logger -t cloud " $(basename $0): Create network on interface $dev, gateway $gw, network $ip/$mask "
# setup ip configuration # setup ip configuration
@ -225,11 +243,12 @@ dflag=
gflag= gflag=
Cflag= Cflag=
Dflag= Dflag=
Mflag=
op="" op=""
while getopts 'CDn:m:d:i:g:s:e:' OPTION while getopts 'CDn:m:M:d:i:g:s:e:' OPTION
do do
case $OPTION in case $OPTION in
C) Cflag=1 C) Cflag=1
@ -244,6 +263,9 @@ do
m) mflag=1 m) mflag=1
mask="$OPTARG" mask="$OPTARG"
;; ;;
M) Mflag=1
mac="$OPTARG"
;;
d) dflag=1 d) dflag=1
dev="$OPTARG" dev="$OPTARG"
;; ;;