diff --git a/api/src/org/apache/cloudstack/api/command/admin/vlan/CreateVlanIpRangeCmd.java b/api/src/org/apache/cloudstack/api/command/admin/vlan/CreateVlanIpRangeCmd.java index 75edfce3f96..60326257f22 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/vlan/CreateVlanIpRangeCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/vlan/CreateVlanIpRangeCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.admin.vlan; +import com.cloud.utils.net.NetUtils; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -166,28 +167,28 @@ public class CreateVlanIpRangeCmd extends BaseCmd { if (startIpv6 == null) { return null; } - return startIpv6.toLowerCase(); + return NetUtils.standardizeIp6Address(startIpv6); } public String getEndIpv6() { if (endIpv6 == null) { return null; } - return endIpv6.toLowerCase(); + return NetUtils.standardizeIp6Address(endIpv6); } public String getIp6Gateway() { if (ip6Gateway == null) { return null; } - return ip6Gateway.toLowerCase(); + return NetUtils.standardizeIp6Address(ip6Gateway); } public String getIp6Cidr() { if (ip6Cidr == null) { return null; } - return ip6Cidr.toLowerCase(); + return NetUtils.standardizeIp6Cidr(ip6Cidr); } ///////////////////////////////////////////////////// diff --git a/api/src/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java b/api/src/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java index 40bf5875f53..8390b7525be 100644 --- a/api/src/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.user.network; +import com.cloud.utils.net.NetUtils; import org.apache.log4j.Logger; import org.apache.cloudstack.acl.RoleType; @@ -254,28 +255,28 @@ public class CreateNetworkCmd extends BaseCmd { if (startIpv6 == null) { return null; } - return startIpv6.toLowerCase(); + return NetUtils.standardizeIp6Address(startIpv6); } public String getEndIpv6() { if (endIpv6 == null) { return null; } - return endIpv6.toLowerCase(); + return NetUtils.standardizeIp6Address(endIpv6); } public String getIp6Gateway() { if (ip6Gateway == null) { return null; } - return ip6Gateway.toLowerCase(); + return NetUtils.standardizeIp6Address(ip6Gateway); } public String getIp6Cidr() { if (ip6Cidr == null) { return null; } - return ip6Cidr.toLowerCase(); + return NetUtils.standardizeIp6Cidr(ip6Cidr); } public Long getAclId() { diff --git a/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java b/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java index 43983bd56a1..1beb5957e5b 100755 --- a/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java @@ -16,16 +16,25 @@ // under the License. package org.apache.cloudstack.api.command.user.vm; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import com.cloud.dc.DataCenter; +import com.cloud.dc.DataCenter.NetworkType; +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.InsufficientServerCapacityException; +import com.cloud.exception.InvalidParameterValueException; +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.utils.net.NetUtils; +import com.cloud.vm.VirtualMachine; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.affinity.AffinityGroupResponse; 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.ZoneResponse; import org.apache.cloudstack.context.CallContext; +import org.apache.log4j.Logger; -import com.cloud.dc.DataCenter; -import com.cloud.dc.DataCenter.NetworkType; -import com.cloud.event.EventTypes; -import com.cloud.exception.ConcurrentOperationException; -import com.cloud.exception.InsufficientCapacityException; -import com.cloud.exception.InsufficientServerCapacityException; -import com.cloud.exception.InvalidParameterValueException; -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; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; @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) @@ -353,7 +352,7 @@ public class DeployVMCmd extends BaseAsyncCreateCustomIdCmd { String requestedIp = ips.get("ip"); String requestedIpv6 = ips.get("ipv6"); if (requestedIpv6 != null) { - requestedIpv6 = requestedIpv6.toLowerCase(); + requestedIpv6 = NetUtils.standardizeIp6Address(requestedIpv6); } IpAddresses addrs = new IpAddresses(requestedIp, requestedIpv6); ipToNetworkMap.put(networkId, addrs); @@ -367,7 +366,7 @@ public class DeployVMCmd extends BaseAsyncCreateCustomIdCmd { if (ip6Address == null) { return null; } - return ip6Address.toLowerCase(); + return NetUtils.standardizeIp6Address(ip6Address); } public List getAffinityGroupIdList() { diff --git a/utils/src/com/cloud/utils/net/NetUtils.java b/utils/src/com/cloud/utils/net/NetUtils.java index 08976c425f6..e5e9e30d382 100755 --- a/utils/src/com/cloud/utils/net/NetUtils.java +++ b/utils/src/com/cloud/utils/net/NetUtils.java @@ -19,6 +19,16 @@ 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.IOException; import java.io.InputStreamReader; @@ -41,17 +51,6 @@ import java.util.TreeSet; import java.util.regex.Matcher; 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 { protected final static Logger s_logger = Logger.getLogger(NetUtils.class); public final static String HTTP_PORT = "80"; @@ -1372,6 +1371,14 @@ public class NetUtils { 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 int VLAN_PREFIX_LENGTH = VLAN_PREFIX.length(); diff --git a/utils/test/com/cloud/utils/net/NetUtilsTest.java b/utils/test/com/cloud/utils/net/NetUtilsTest.java index 31838267d86..cd5109cccf9 100644 --- a/utils/test/com/cloud/utils/net/NetUtilsTest.java +++ b/utils/test/com/cloud/utils/net/NetUtilsTest.java @@ -19,6 +19,14 @@ 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.contains; 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.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 { 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")); } + @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 public void testGenerateUriForPvlan() { assertEquals("pvlan://123-i456", NetUtils.generateUriForPvlan("123", "456").toString());