diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index 4365f9f192c..707d478b58a 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -108,6 +108,7 @@ import com.cloud.network.Network.Capability; import com.cloud.network.Network.GuestType; import com.cloud.network.Network.Provider; import com.cloud.network.Network.Service; +import com.cloud.network.IPAddressVO; import com.cloud.network.NetworkManager; import com.cloud.network.NetworkVO; import com.cloud.network.Networks.BroadcastDomainType; @@ -658,6 +659,9 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura if (startIp != null || endIp != null) { checkIpRange(startIp, endIp, cidrAddress, cidrSize); } + + // Check if the IP range overlaps with the public ip + checkOverlapPublicIpRange(zoneId, startIp, endIp); // Check if the gateway is a valid IP address if (!NetUtils.isValidIp(gateway)) { @@ -1150,6 +1154,32 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura } + private void checkOverlapPublicIpRange(Long zoneId, String startIp, String endIp) { + long privateStartIp = NetUtils.ip2Long(startIp); + long privateEndIp = NetUtils.ip2Long(endIp); + + List existingPublicIPs = _publicIpAddressDao.listByDcId(zoneId); + for (IPAddressVO publicIPVO : existingPublicIPs) { + long publicIP = NetUtils.ip2Long(publicIPVO.getAddress().addr()); + if ((publicIP >= privateStartIp) && (publicIP <= privateEndIp)) { + throw new InvalidParameterValueException("The Start IP and endIP address range overlap with Public IP :" + publicIPVO.getAddress().addr()); + } + } + } + + private void checkOverlapPrivateIpRange(Long zoneId, String startIp, String endIp) { + + List podsInZone = _podDao.listByDataCenterId(zoneId); + for (HostPodVO hostPod : podsInZone) { + String[] IpRange = hostPod.getDescription().split("-"); + if (IpRange[0]==null || IpRange[1]==null) continue; + if (!NetUtils.isValidIp(IpRange[0]) || !NetUtils.isValidIp(IpRange[1])) continue; + if (NetUtils.ipRangesOverlap(startIp, endIp, IpRange[0], IpRange[1])) { + throw new InvalidParameterValueException("The Start IP and endIP address range overlap with private IP :" + IpRange[0] + ":" + IpRange[1]); + } + } + } + @Override @DB @ActionEvent(eventType = EventTypes.EVENT_ZONE_DELETE, eventDescription = "deleting zone", async = false) @@ -2142,7 +2172,9 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura associateIpRangeToAccount = true; } } - + + // Check if the IP range overlaps with the private ip + checkOverlapPrivateIpRange(zoneId, startIP, endIP); Transaction txn = Transaction.currentTxn(); txn.start(); diff --git a/server/src/com/cloud/network/dao/IPAddressDao.java b/server/src/com/cloud/network/dao/IPAddressDao.java index 6ac5b4cd94d..35c5c5f358e 100755 --- a/server/src/com/cloud/network/dao/IPAddressDao.java +++ b/server/src/com/cloud/network/dao/IPAddressDao.java @@ -37,6 +37,8 @@ public interface IPAddressDao extends GenericDao { List listByDcIdIpAddress(long dcId, String ipAddress); + List listByDcId(long dcId); + List listByAssociatedNetwork(long networkId, Boolean isSourceNat); List listStaticNatPublicIps(long networkId); diff --git a/server/src/com/cloud/network/dao/IPAddressDaoImpl.java b/server/src/com/cloud/network/dao/IPAddressDaoImpl.java index 751aa972e28..5ab849f26f6 100755 --- a/server/src/com/cloud/network/dao/IPAddressDaoImpl.java +++ b/server/src/com/cloud/network/dao/IPAddressDaoImpl.java @@ -208,7 +208,14 @@ public class IPAddressDaoImpl extends GenericDaoBase implemen sc.setParameters("ipAddress", ipAddress); return findOneBy(sc); } - + + @Override + public List listByDcId(long dcId) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("dataCenterId", dcId); + return listBy(sc); + } + @Override public List listByDcIdIpAddress(long dcId, String ipAddress) { SearchCriteria sc = AllFieldsSearch.create();