mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-11-04 00:02:37 +01:00 
			
		
		
		
	CID-1116482 cidrToLong cleanup of bitshift problem
and some trivial testing
This commit is contained in:
		
							parent
							
								
									f9d5c6918c
								
							
						
					
					
						commit
						3ae4dd06f3
					
				@ -870,31 +870,44 @@ public class NetUtils {
 | 
			
		||||
 | 
			
		||||
    public static Long[] cidrToLong(final String cidr) {
 | 
			
		||||
        if (cidr == null || cidr.isEmpty()) {
 | 
			
		||||
            return null;
 | 
			
		||||
            throw new CloudRuntimeException("empty cidr can not be converted to longs");
 | 
			
		||||
        }
 | 
			
		||||
        final String[] cidrPair = cidr.split("\\/");
 | 
			
		||||
        if (cidrPair.length != 2) {
 | 
			
		||||
            return null;
 | 
			
		||||
            throw new CloudRuntimeException("cidr is not formatted correctly: "+ cidr);
 | 
			
		||||
        }
 | 
			
		||||
        final String cidrAddress = cidrPair[0];
 | 
			
		||||
        final String cidrSize = cidrPair[1];
 | 
			
		||||
        if (!isValidIp(cidrAddress)) {
 | 
			
		||||
            return null;
 | 
			
		||||
            throw new CloudRuntimeException("cidr is not bvalid in ip space" + cidr);
 | 
			
		||||
        }
 | 
			
		||||
        int cidrSizeNum = -1;
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            cidrSizeNum = Integer.parseInt(cidrSize);
 | 
			
		||||
        } catch (final Exception e) {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        final long numericNetmask = 0xffffffff >> MAX_CIDR - cidrSizeNum << MAX_CIDR - cidrSizeNum;
 | 
			
		||||
        long cidrSizeNum = getCidrSizeFromString(cidrSize);
 | 
			
		||||
        final long numericNetmask = (long)0xffffffff >> MAX_CIDR - cidrSizeNum << MAX_CIDR - cidrSizeNum;
 | 
			
		||||
        final long ipAddr = ip2Long(cidrAddress);
 | 
			
		||||
        final Long[] cidrlong = {ipAddr & numericNetmask, (long)cidrSizeNum};
 | 
			
		||||
        return cidrlong;
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @param cidrSize
 | 
			
		||||
     * @return
 | 
			
		||||
     * @throws CloudRuntimeException
 | 
			
		||||
     */
 | 
			
		||||
    static long getCidrSizeFromString(final String cidrSize) throws CloudRuntimeException {
 | 
			
		||||
        long cidrSizeNum = -1;
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            cidrSizeNum = Integer.parseInt(cidrSize);
 | 
			
		||||
        } catch (final NumberFormatException e) {
 | 
			
		||||
            throw new CloudRuntimeException("cidrsize is not a valid int: " + cidrSize, e);
 | 
			
		||||
        }
 | 
			
		||||
        if(cidrSizeNum > 32 || cidrSizeNum < 0) {// assuming IPv4
 | 
			
		||||
            throw new CloudRuntimeException("cidr size out of range: " + cidrSizeNum);
 | 
			
		||||
        }
 | 
			
		||||
        return cidrSizeNum;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static String getCidrSubNet(final String cidr) {
 | 
			
		||||
        if (cidr == null || cidr.isEmpty()) {
 | 
			
		||||
            return null;
 | 
			
		||||
@ -908,13 +921,7 @@ public class NetUtils {
 | 
			
		||||
        if (!isValidIp(cidrAddress)) {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        long cidrSizeNum = -1;
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            cidrSizeNum = Integer.parseInt(cidrSize);
 | 
			
		||||
        } catch (final NumberFormatException e) {
 | 
			
		||||
            throw new CloudRuntimeException("cidrsize is not valid", e);
 | 
			
		||||
        }
 | 
			
		||||
        long cidrSizeNum = getCidrSizeFromString(cidrSize);
 | 
			
		||||
        final long numericNetmask = (long)0xffffffff >> MAX_CIDR - cidrSizeNum << MAX_CIDR - cidrSizeNum;
 | 
			
		||||
        final String netmask = NetUtils.long2Ip(numericNetmask);
 | 
			
		||||
        return getSubNet(cidrAddress, netmask);
 | 
			
		||||
 | 
			
		||||
@ -38,6 +38,7 @@ import java.util.TreeSet;
 | 
			
		||||
import org.apache.log4j.Logger;
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
 | 
			
		||||
import com.cloud.utils.exception.CloudRuntimeException;
 | 
			
		||||
import com.googlecode.ipv6.IPv6Address;
 | 
			
		||||
 | 
			
		||||
public class NetUtilsTest {
 | 
			
		||||
@ -439,4 +440,33 @@ public class NetUtilsTest {
 | 
			
		||||
        String subnet = NetUtils.getCidrSubNet("10.10.10.10", 16);
 | 
			
		||||
        assertTrue(cidr + " does not contain " + subnet,NetUtils.isIpWithtInCidrRange(subnet, cidr));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testIsValidCidrSize() {
 | 
			
		||||
        final String cidrsize = "16";
 | 
			
		||||
        long netbits = NetUtils.getCidrSizeFromString(cidrsize);
 | 
			
		||||
        assertTrue(" does not compute " + cidrsize,netbits == 16);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test(expected=CloudRuntimeException.class)
 | 
			
		||||
    public void testIsInvalidCidrSize() {
 | 
			
		||||
        final String cidrsize = "33";
 | 
			
		||||
        long netbits = NetUtils.getCidrSizeFromString(cidrsize);
 | 
			
		||||
        assertTrue(" does not compute " + cidrsize,netbits == 16);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test(expected=CloudRuntimeException.class)
 | 
			
		||||
    public void testIsInvalidCidrString() {
 | 
			
		||||
        final String cidrsize = "ggg";
 | 
			
		||||
        long netbits = NetUtils.getCidrSizeFromString(cidrsize);
 | 
			
		||||
        assertTrue(" does not compute " + cidrsize,netbits == 16);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testCidrToLongArray() {
 | 
			
		||||
        final String cidr = "10.192.10.10/10";
 | 
			
		||||
        Long[] netbits = NetUtils.cidrToLong(cidr);
 | 
			
		||||
        assertEquals("unexpected cidrsize " + netbits[1],10l, netbits[1].longValue());
 | 
			
		||||
        assertEquals("(un)expected <" + 0x0ac00000L + "> netaddress " + netbits[0].longValue(),netbits[0].longValue(),0x0ac00000l);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user