From ca5c6d5d1496f39fae32b020e5d16a2eb06365fb Mon Sep 17 00:00:00 2001 From: Sheng Yang Date: Thu, 14 Feb 2013 16:19:17 -0800 Subject: [PATCH] CLOUDSTACK-1219, CLOUDSTACK-1220: Fix IPv6 error messages --- api/src/com/cloud/network/NetworkModel.java | 2 ++ .../cloud/network/Ipv6AddressManagerImpl.java | 4 +-- .../com/cloud/network/NetworkModelImpl.java | 32 +++++++++++++++++++ .../src/com/cloud/vm/UserVmManagerImpl.java | 17 ++-------- .../cloud/network/MockNetworkModelImpl.java | 6 ++++ .../com/cloud/vpc/MockNetworkModelImpl.java | 6 ++++ 6 files changed, 50 insertions(+), 17 deletions(-) diff --git a/api/src/com/cloud/network/NetworkModel.java b/api/src/com/cloud/network/NetworkModel.java index 783e5cc9c85..9731a61667d 100644 --- a/api/src/com/cloud/network/NetworkModel.java +++ b/api/src/com/cloud/network/NetworkModel.java @@ -255,4 +255,6 @@ public interface NetworkModel { boolean isIP6AddressAvailableInVlan(long vlanId); void checkIp6Parameters(String startIPv6, String endIPv6, String ip6Gateway, String ip6Cidr) throws InvalidParameterValueException; + + void checkRequestedIpAddresses(long networkId, String ip4, String ip6) throws InvalidParameterValueException; } \ No newline at end of file diff --git a/server/src/com/cloud/network/Ipv6AddressManagerImpl.java b/server/src/com/cloud/network/Ipv6AddressManagerImpl.java index ecef5a225e9..a401f9ae396 100644 --- a/server/src/com/cloud/network/Ipv6AddressManagerImpl.java +++ b/server/src/com/cloud/network/Ipv6AddressManagerImpl.java @@ -80,7 +80,7 @@ public class Ipv6AddressManagerImpl extends ManagerBase implements Ipv6AddressMa } List vlans = _vlanDao.listVlansByNetworkId(networkId); if (vlans == null) { - s_logger.debug("Cannot find related vlan or too many vlan attached to network " + networkId); + s_logger.debug("Cannot find related vlan attached to network " + networkId); return null; } String ip = null; @@ -109,7 +109,7 @@ public class Ipv6AddressManagerImpl extends ManagerBase implements Ipv6AddressMa } } if (ip == null) { - throw new InsufficientAddressCapacityException("Cannot find a usable IP in the network " + network.getName() + " after network.ipv6.search.retry.max = " + _ipv6RetryMax + " times retry!", + throw new InsufficientAddressCapacityException("Cannot find a usable IP in the network " + network.getName() + " after " + _ipv6RetryMax + "(network.ipv6.search.retry.max) times retry!", DataCenter.class, network.getDataCenterId()); } } else { diff --git a/server/src/com/cloud/network/NetworkModelImpl.java b/server/src/com/cloud/network/NetworkModelImpl.java index ca7a900e39c..beebb871d8a 100644 --- a/server/src/com/cloud/network/NetworkModelImpl.java +++ b/server/src/com/cloud/network/NetworkModelImpl.java @@ -1923,4 +1923,36 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel { throw new InvalidParameterValueException("The cidr size of IPv6 network must be no less than 64 bits!"); } } + + @Override + public void checkRequestedIpAddresses(long networkId, String ip4, String ip6) throws InvalidParameterValueException { + if (ip4 != null) { + if (!NetUtils.isValidIp(ip4)) { + throw new InvalidParameterValueException("Invalid specified IPv4 address " + ip4); + } + //Other checks for ipv4 are done in assignPublicIpAddress() + } + if (ip6 != null) { + if (!NetUtils.isValidIpv6(ip6)) { + throw new InvalidParameterValueException("Invalid specified IPv6 address " + ip6); + } + if (_ipv6Dao.findByNetworkIdAndIp(networkId, ip6) != null) { + throw new InvalidParameterValueException("The requested IP is already taken!"); + } + List vlans = _vlanDao.listVlansByNetworkId(networkId); + if (vlans == null) { + throw new CloudRuntimeException("Cannot find related vlan attached to network " + networkId); + } + Vlan ipVlan = null; + for (Vlan vlan : vlans) { + if (NetUtils.isIp6InRange(ip6, vlan.getIp6Range())) { + ipVlan = vlan; + break; + } + } + if (ipVlan == null) { + throw new InvalidParameterValueException("Requested IPv6 is not in the predefined range!"); + } + } + } } diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 19887ff9e25..df976099f1d 100644 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -3299,7 +3299,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Use if (requestedIpPair == null) { requestedIpPair = new IpAddresses(null, null); } else { - checkRequestedIpAddresses(requestedIpPair.getIp4Address(), requestedIpPair.getIp6Address()); + _networkModel.checkRequestedIpAddresses(network.getId(), requestedIpPair.getIp4Address(), requestedIpPair.getIp6Address()); } NicProfile profile = new NicProfile(requestedIpPair.getIp4Address(), requestedIpPair.getIp6Address()); @@ -3308,7 +3308,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Use defaultNetworkNumber++; // if user requested specific ip for default network, add it if (defaultIps.getIp4Address() != null || defaultIps.getIp6Address() != null) { - checkRequestedIpAddresses(defaultIps.getIp4Address(), defaultIps.getIp6Address()); + _networkModel.checkRequestedIpAddresses(network.getId(), defaultIps.getIp4Address(), defaultIps.getIp6Address()); profile = new NicProfile(defaultIps.getIp4Address(), defaultIps.getIp6Address()); } @@ -3486,19 +3486,6 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Use return vm; } - private void checkRequestedIpAddresses(String ip4, String ip6) throws InvalidParameterValueException { - if (ip4 != null) { - if (!NetUtils.isValidIp(ip4)) { - throw new InvalidParameterValueException("Invalid specified IPv4 address " + ip4); - } - } - if (ip6 != null) { - if (!NetUtils.isValidIpv6(ip6)) { - throw new InvalidParameterValueException("Invalid specified IPv6 address " + ip6); - } - } - } - private void validateUserData(String userData) { byte[] decodedUserData = null; if (userData != null) { diff --git a/server/test/com/cloud/network/MockNetworkModelImpl.java b/server/test/com/cloud/network/MockNetworkModelImpl.java index a2bef63d539..d7ffa7da280 100644 --- a/server/test/com/cloud/network/MockNetworkModelImpl.java +++ b/server/test/com/cloud/network/MockNetworkModelImpl.java @@ -829,4 +829,10 @@ public class MockNetworkModelImpl extends ManagerBase implements NetworkModel { // TODO Auto-generated method stub } + + @Override + public void checkRequestedIpAddresses(long networkId, String ip4, String ip6) + throws InvalidParameterValueException { + // TODO Auto-generated method stub + } } diff --git a/server/test/com/cloud/vpc/MockNetworkModelImpl.java b/server/test/com/cloud/vpc/MockNetworkModelImpl.java index 3fad33870bf..5ac87772529 100644 --- a/server/test/com/cloud/vpc/MockNetworkModelImpl.java +++ b/server/test/com/cloud/vpc/MockNetworkModelImpl.java @@ -842,4 +842,10 @@ public class MockNetworkModelImpl extends ManagerBase implements NetworkModel { // TODO Auto-generated method stub } + @Override + public void checkRequestedIpAddresses(long networkId, String ip4, String ip6) + throws InvalidParameterValueException { + // TODO Auto-generated method stub + } + }