mirror of https://github.com/apache/cloudstack.git
Bug 9237: Checking private ip range with public ip range overlap and viceversa while adding physical resources.
Reviwed by: Abhi
This commit is contained in:
parent
b2079346d6
commit
812b4782a2
|
|
@ -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<IPAddressVO> 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<HostPodVO> 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();
|
||||
|
||||
|
|
|
|||
|
|
@ -37,6 +37,8 @@ public interface IPAddressDao extends GenericDao<IPAddressVO, Long> {
|
|||
|
||||
List<IPAddressVO> listByDcIdIpAddress(long dcId, String ipAddress);
|
||||
|
||||
List<IPAddressVO> listByDcId(long dcId);
|
||||
|
||||
List<IPAddressVO> listByAssociatedNetwork(long networkId, Boolean isSourceNat);
|
||||
|
||||
List<IPAddressVO> listStaticNatPublicIps(long networkId);
|
||||
|
|
|
|||
|
|
@ -208,7 +208,14 @@ public class IPAddressDaoImpl extends GenericDaoBase<IPAddressVO, Long> implemen
|
|||
sc.setParameters("ipAddress", ipAddress);
|
||||
return findOneBy(sc);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public List<IPAddressVO> listByDcId(long dcId) {
|
||||
SearchCriteria<IPAddressVO> sc = AllFieldsSearch.create();
|
||||
sc.setParameters("dataCenterId", dcId);
|
||||
return listBy(sc);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<IPAddressVO> listByDcIdIpAddress(long dcId, String ipAddress) {
|
||||
SearchCriteria<IPAddressVO> sc = AllFieldsSearch.create();
|
||||
|
|
|
|||
Loading…
Reference in New Issue