CLOUDSTACK-6854: Fix inconsistent IPv6 address formats

fc00:0003:1373::0002 should be treated the same as fc00:3:1373::2.
This commit is contained in:
Sheng Yang 2014-06-20 17:36:49 -07:00
parent aa1ce9a363
commit a93a30595d
5 changed files with 71 additions and 58 deletions

View File

@ -16,6 +16,7 @@
// under the License. // under the License.
package org.apache.cloudstack.api.command.admin.vlan; package org.apache.cloudstack.api.command.admin.vlan;
import com.cloud.utils.net.NetUtils;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.APICommand;
@ -166,28 +167,28 @@ public class CreateVlanIpRangeCmd extends BaseCmd {
if (startIpv6 == null) { if (startIpv6 == null) {
return null; return null;
} }
return startIpv6.toLowerCase(); return NetUtils.standardizeIp6Address(startIpv6);
} }
public String getEndIpv6() { public String getEndIpv6() {
if (endIpv6 == null) { if (endIpv6 == null) {
return null; return null;
} }
return endIpv6.toLowerCase(); return NetUtils.standardizeIp6Address(endIpv6);
} }
public String getIp6Gateway() { public String getIp6Gateway() {
if (ip6Gateway == null) { if (ip6Gateway == null) {
return null; return null;
} }
return ip6Gateway.toLowerCase(); return NetUtils.standardizeIp6Address(ip6Gateway);
} }
public String getIp6Cidr() { public String getIp6Cidr() {
if (ip6Cidr == null) { if (ip6Cidr == null) {
return null; return null;
} }
return ip6Cidr.toLowerCase(); return NetUtils.standardizeIp6Cidr(ip6Cidr);
} }
///////////////////////////////////////////////////// /////////////////////////////////////////////////////

View File

@ -16,6 +16,7 @@
// under the License. // under the License.
package org.apache.cloudstack.api.command.user.network; package org.apache.cloudstack.api.command.user.network;
import com.cloud.utils.net.NetUtils;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.acl.RoleType;
@ -254,28 +255,28 @@ public class CreateNetworkCmd extends BaseCmd {
if (startIpv6 == null) { if (startIpv6 == null) {
return null; return null;
} }
return startIpv6.toLowerCase(); return NetUtils.standardizeIp6Address(startIpv6);
} }
public String getEndIpv6() { public String getEndIpv6() {
if (endIpv6 == null) { if (endIpv6 == null) {
return null; return null;
} }
return endIpv6.toLowerCase(); return NetUtils.standardizeIp6Address(endIpv6);
} }
public String getIp6Gateway() { public String getIp6Gateway() {
if (ip6Gateway == null) { if (ip6Gateway == null) {
return null; return null;
} }
return ip6Gateway.toLowerCase(); return NetUtils.standardizeIp6Address(ip6Gateway);
} }
public String getIp6Cidr() { public String getIp6Cidr() {
if (ip6Cidr == null) { if (ip6Cidr == null) {
return null; return null;
} }
return ip6Cidr.toLowerCase(); return NetUtils.standardizeIp6Cidr(ip6Cidr);
} }
public Long getAclId() { public Long getAclId() {

View File

@ -16,16 +16,25 @@
// under the License. // under the License.
package org.apache.cloudstack.api.command.user.vm; package org.apache.cloudstack.api.command.user.vm;
import java.util.ArrayList; import com.cloud.dc.DataCenter;
import java.util.Collection; import com.cloud.dc.DataCenter.NetworkType;
import java.util.HashMap; import com.cloud.event.EventTypes;
import java.util.Iterator; import com.cloud.exception.ConcurrentOperationException;
import java.util.LinkedHashMap; import com.cloud.exception.InsufficientCapacityException;
import java.util.List; import com.cloud.exception.InsufficientServerCapacityException;
import java.util.Map; import com.cloud.exception.InvalidParameterValueException;
import com.cloud.exception.ResourceAllocationException;
import org.apache.log4j.Logger; import com.cloud.exception.ResourceUnavailableException;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.network.Network;
import com.cloud.network.Network.IpAddresses;
import com.cloud.offering.DiskOffering;
import com.cloud.offering.ServiceOffering;
import com.cloud.template.VirtualMachineTemplate;
import com.cloud.user.Account;
import com.cloud.uservm.UserVm;
import com.cloud.utils.net.NetUtils;
import com.cloud.vm.VirtualMachine;
import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.acl.RoleType;
import org.apache.cloudstack.affinity.AffinityGroupResponse; import org.apache.cloudstack.affinity.AffinityGroupResponse;
import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.ACL;
@ -48,25 +57,15 @@ import org.apache.cloudstack.api.response.TemplateResponse;
import org.apache.cloudstack.api.response.UserVmResponse; import org.apache.cloudstack.api.response.UserVmResponse;
import org.apache.cloudstack.api.response.ZoneResponse; import org.apache.cloudstack.api.response.ZoneResponse;
import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.context.CallContext;
import org.apache.log4j.Logger;
import com.cloud.dc.DataCenter; import java.util.ArrayList;
import com.cloud.dc.DataCenter.NetworkType; import java.util.Collection;
import com.cloud.event.EventTypes; import java.util.HashMap;
import com.cloud.exception.ConcurrentOperationException; import java.util.Iterator;
import com.cloud.exception.InsufficientCapacityException; import java.util.LinkedHashMap;
import com.cloud.exception.InsufficientServerCapacityException; import java.util.List;
import com.cloud.exception.InvalidParameterValueException; import java.util.Map;
import com.cloud.exception.ResourceAllocationException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.network.Network;
import com.cloud.network.Network.IpAddresses;
import com.cloud.offering.DiskOffering;
import com.cloud.offering.ServiceOffering;
import com.cloud.template.VirtualMachineTemplate;
import com.cloud.user.Account;
import com.cloud.uservm.UserVm;
import com.cloud.vm.VirtualMachine;
@APICommand(name = "deployVirtualMachine", description = "Creates and automatically starts a virtual machine based on a service offering, disk offering, and template.", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted, entityType = {VirtualMachine.class}, @APICommand(name = "deployVirtualMachine", description = "Creates and automatically starts a virtual machine based on a service offering, disk offering, and template.", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted, entityType = {VirtualMachine.class},
requestHasSensitiveInfo = false, responseHasSensitiveInfo = true) requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
@ -353,7 +352,7 @@ public class DeployVMCmd extends BaseAsyncCreateCustomIdCmd {
String requestedIp = ips.get("ip"); String requestedIp = ips.get("ip");
String requestedIpv6 = ips.get("ipv6"); String requestedIpv6 = ips.get("ipv6");
if (requestedIpv6 != null) { if (requestedIpv6 != null) {
requestedIpv6 = requestedIpv6.toLowerCase(); requestedIpv6 = NetUtils.standardizeIp6Address(requestedIpv6);
} }
IpAddresses addrs = new IpAddresses(requestedIp, requestedIpv6); IpAddresses addrs = new IpAddresses(requestedIp, requestedIpv6);
ipToNetworkMap.put(networkId, addrs); ipToNetworkMap.put(networkId, addrs);
@ -367,7 +366,7 @@ public class DeployVMCmd extends BaseAsyncCreateCustomIdCmd {
if (ip6Address == null) { if (ip6Address == null) {
return null; return null;
} }
return ip6Address.toLowerCase(); return NetUtils.standardizeIp6Address(ip6Address);
} }
public List<Long> getAffinityGroupIdList() { public List<Long> getAffinityGroupIdList() {

View File

@ -19,6 +19,16 @@
package com.cloud.utils.net; package com.cloud.utils.net;
import com.cloud.utils.IteratorUtil;
import com.cloud.utils.Pair;
import com.cloud.utils.script.Script;
import com.googlecode.ipv6.IPv6Address;
import com.googlecode.ipv6.IPv6AddressRange;
import com.googlecode.ipv6.IPv6Network;
import org.apache.commons.lang.SystemUtils;
import org.apache.commons.net.util.SubnetUtils;
import org.apache.log4j.Logger;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.IOException; import java.io.IOException;
import java.io.InputStreamReader; import java.io.InputStreamReader;
@ -41,17 +51,6 @@ import java.util.TreeSet;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import org.apache.commons.lang.SystemUtils;
import org.apache.commons.net.util.SubnetUtils;
import org.apache.log4j.Logger;
import com.cloud.utils.IteratorUtil;
import com.cloud.utils.Pair;
import com.cloud.utils.script.Script;
import com.googlecode.ipv6.IPv6Address;
import com.googlecode.ipv6.IPv6AddressRange;
import com.googlecode.ipv6.IPv6Network;
public class NetUtils { public class NetUtils {
protected final static Logger s_logger = Logger.getLogger(NetUtils.class); protected final static Logger s_logger = Logger.getLogger(NetUtils.class);
public final static String HTTP_PORT = "80"; public final static String HTTP_PORT = "80";
@ -1372,6 +1371,14 @@ public class NetUtils {
return resultIp; return resultIp;
} }
public static String standardizeIp6Address(String ip6Addr) {
return IPv6Address.fromString(ip6Addr).toString();
}
public static String standardizeIp6Cidr(String ip6Cidr){
return IPv6Network.fromString(ip6Cidr).toString();
}
static final String VLAN_PREFIX = "vlan://"; static final String VLAN_PREFIX = "vlan://";
static final int VLAN_PREFIX_LENGTH = VLAN_PREFIX.length(); static final int VLAN_PREFIX_LENGTH = VLAN_PREFIX.length();

View File

@ -19,6 +19,14 @@
package com.cloud.utils.net; package com.cloud.utils.net;
import com.googlecode.ipv6.IPv6Address;
import org.apache.log4j.Logger;
import org.junit.Test;
import java.math.BigInteger;
import java.util.SortedSet;
import java.util.TreeSet;
import static org.hamcrest.Matchers.anyOf; import static org.hamcrest.Matchers.anyOf;
import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.equalTo;
@ -31,15 +39,6 @@ import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import java.math.BigInteger;
import java.util.SortedSet;
import java.util.TreeSet;
import org.apache.log4j.Logger;
import org.junit.Test;
import com.googlecode.ipv6.IPv6Address;
public class NetUtilsTest { public class NetUtilsTest {
private static final Logger s_logger = Logger.getLogger(NetUtilsTest.class); private static final Logger s_logger = Logger.getLogger(NetUtilsTest.class);
@ -198,6 +197,12 @@ public class NetUtilsTest {
assertFalse(NetUtils.isIp6RangeOverlap("1234:5678::f-1234:5678::f", "1234:5678::2-1234:5678::e")); assertFalse(NetUtils.isIp6RangeOverlap("1234:5678::f-1234:5678::f", "1234:5678::2-1234:5678::e"));
} }
@Test
public void testStandardizeIp6Address() {
assertEquals(NetUtils.standardizeIp6Address("1234:0000:0000:5678:0000:000:ABCD:0001"), "1234::5678:0:0:abcd:1");
assertEquals(NetUtils.standardizeIp6Cidr("1234:0000:0000:5678:0000:000:ABCD:0001/64"), "1234::5678:0:0:0:0/64");
}
@Test @Test
public void testGenerateUriForPvlan() { public void testGenerateUriForPvlan() {
assertEquals("pvlan://123-i456", NetUtils.generateUriForPvlan("123", "456").toString()); assertEquals("pvlan://123-i456", NetUtils.generateUriForPvlan("123", "456").toString());