From 3b2b8fc14306f55703088b2abcea42c03b84fce8 Mon Sep 17 00:00:00 2001 From: anthony Date: Mon, 18 Jun 2012 11:40:35 -0700 Subject: [PATCH 1/2] VPC: fix VPC cidr check --- .../src/com/cloud/network/NetworkManagerImpl.java | 13 +------------ .../src/com/cloud/network/vpc/VpcManagerImpl.java | 3 +-- utils/src/com/cloud/utils/net/NetUtils.java | 10 ++++++++++ 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index f2f870c054a..1326d5b5ea6 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -2503,20 +2503,9 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag return; } - String currCidrAddress = getCidrAddress(cidr); - int currCidrSize = getCidrSize(cidr); - for (long networkId : networkToCidr.keySet()) { String ntwkCidr = networkToCidr.get(networkId); - String ntwkCidrAddress = getCidrAddress(ntwkCidr); - int ntwkCidrSize = getCidrSize(ntwkCidr); - - long cidrSizeToUse = currCidrSize < ntwkCidrSize ? currCidrSize : ntwkCidrSize; - - String ntwkCidrSubnet = NetUtils.getCidrSubNet(ntwkCidrAddress, cidrSizeToUse); - String cidrSubnet = NetUtils.getCidrSubNet(currCidrAddress, cidrSizeToUse); - - if (cidrSubnet.equals(ntwkCidrSubnet)) { + if (NetUtils.isNetworksOverlap(ntwkCidr, cidr)) { InvalidParameterValueException ex = new InvalidParameterValueException("Warning: The specified existing network has conflict CIDR subnets with new network!"); ex.addProxyObject("networks", networkId, "networkId"); throw ex; diff --git a/server/src/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/com/cloud/network/vpc/VpcManagerImpl.java index 55e95be2480..53811aff483 100644 --- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java +++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java @@ -795,8 +795,7 @@ public class VpcManagerImpl implements VpcManager, Manager{ for (Network ntwk : ntwks) { assert (cidr != null) : "Why the network cidr is null when it belongs to vpc?"; - if (NetUtils.isNetworkAWithinNetworkB(ntwk.getCidr(), vpc.getCidr()) - || NetUtils.isNetworkAWithinNetworkB(vpc.getCidr(), ntwk.getCidr())) { + if (NetUtils.isNetworksOverlap(ntwk.getCidr(), cidr)) { throw new InvalidParameterValueException("Network cidr " + cidr + " crosses other network cidr " + ntwk + " belonging to the same vpc " + vpc); } diff --git a/utils/src/com/cloud/utils/net/NetUtils.java b/utils/src/com/cloud/utils/net/NetUtils.java index 5a5a52ac31f..4a266bc583e 100755 --- a/utils/src/com/cloud/utils/net/NetUtils.java +++ b/utils/src/com/cloud/utils/net/NetUtils.java @@ -780,6 +780,16 @@ public class NetUtils { long shift = 32 - cidrBLong[1]; return ((cidrALong[0] >> shift) == (cidrBLong[0] >> shift)); } + + public static boolean isNetworksOverlap(String cidrA, String cidrB) { + Long[] cidrALong = cidrToLong(cidrA); + Long[] cidrBLong = cidrToLong(cidrB); + if (cidrALong == null || cidrBLong == null) { + return false; + } + long shift = 32 - (cidrALong[1] > cidrBLong[1] ? cidrBLong[1] : cidrALong[1]); + return ((cidrALong[0] >> shift) == (cidrBLong[0] >> shift)); + } public static Long[] cidrToLong(String cidr) { if (cidr == null || cidr.isEmpty()) { From eb26f9569b485c6fcfdabfb6c77bf935052fa5af Mon Sep 17 00:00:00 2001 From: anthony Date: Mon, 18 Jun 2012 12:20:51 -0700 Subject: [PATCH 2/2] VPC : fixed vpc_ipassoc --- .../xen/resource/CitrixResourceBase.java | 2 +- .../config/opt/cloud/bin/vpc_ipassoc.sh | 22 ++++++++++--------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index 117ca8c45ea..3ec18ba5070 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -1864,7 +1864,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe String result = callHostPlugin(conn, "vmops", "routerProxy", "args", args); if (result == null || result.isEmpty()) { - throw new InternalErrorException("Xen plugin \"ipassoc\" failed."); + throw new InternalErrorException("Xen plugin \"vpc_ipassoc\" failed."); } } catch (Exception e) { String msg = "Unable to assign public IP address due to " + e.toString(); diff --git a/patches/systemvm/debian/config/opt/cloud/bin/vpc_ipassoc.sh b/patches/systemvm/debian/config/opt/cloud/bin/vpc_ipassoc.sh index ec373f8719c..9cd3d6dd989 100755 --- a/patches/systemvm/debian/config/opt/cloud/bin/vpc_ipassoc.sh +++ b/patches/systemvm/debian/config/opt/cloud/bin/vpc_ipassoc.sh @@ -16,7 +16,6 @@ -# $Id: ipassoc.sh 9804 2010-06-22 18:36:49Z alex $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/network/domr/ipassoc.sh $ # ipassoc.sh -- associate/disassociate a public ip with an instance # @VERSION@ @@ -34,9 +33,6 @@ usage() { printf " %s -D -l -c [-f] \n" $(basename $0) >&2 } -remove_routing() { -} - add_routing() { logger -t cloud "$(basename $0):Add routing $pubIp on interface $ethDev" @@ -44,20 +40,26 @@ add_routing() { sudo ip route add $subnet/$mask dev $ethDev table $tableName proto static sudo ip route add default via $defaultGwIP table $tableName proto static sudo ip route flush cache - return 0; + return 0 } +remove_routing() { + return 0 +} + add_an_ip () { logger -t cloud "$(basename $0):Adding ip $pubIp on interface $ethDev" + sudo ip link show $ethDev | grep "state DOWN" > /dev/null + local old_state=$? sudo ip addr add dev $ethDev $pubIp/$mask - if [ $if_keep_state -ne 1 -o $old_state -ne 0 ] + if [ $old_state -eq 0 ] then sudo ip link set $ethDev up - sudo arping -c 3 -I $ethDev -A -U -s $ipNoMask $ipNoMask; + sudo arping -c 3 -I $ethDev -A -U -s $pubIp $pubIp fi - add_routing $1 + add_routing return $? } @@ -77,7 +79,7 @@ remove_an_ip () { sudo ip addr add dev $ethDev $ipMask done - remove_routing $1 + remove_routing return 0 } @@ -90,7 +92,7 @@ nflag=0 op="" -while getopts 'ADl:c:g:' OPTION +while getopts 'ADl:c:g:m:n:' OPTION do case $OPTION in A) Aflag=1