mirror of https://github.com/apache/cloudstack.git
enhance disasociateIPAddr API to release protable IP associated with a
guest network or VPC
This commit is contained in:
parent
27504d9098
commit
bd058f58c2
|
|
@ -940,12 +940,42 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
|
|||
}
|
||||
|
||||
if (success) {
|
||||
if (ip.isPortable()) {
|
||||
releasePortableIpAddress(addrId);
|
||||
}
|
||||
s_logger.debug("Released a public ip id=" + addrId);
|
||||
}
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
@DB
|
||||
private void releasePortableIpAddress(long addrId) {
|
||||
Transaction txn = Transaction.currentTxn();
|
||||
GlobalLock portableIpLock = GlobalLock.getInternLock("PortablePublicIpRange");
|
||||
|
||||
txn.start();
|
||||
try {
|
||||
portableIpLock.lock(5);
|
||||
IPAddressVO ip = _ipAddressDao.findById(addrId);
|
||||
|
||||
// unassign portable IP
|
||||
PortableIpVO portableIp = _portableIpDao.findByIpAddress(ip.getAddress().addr());
|
||||
_portableIpDao.unassignIpAddress(portableIp.getId());
|
||||
|
||||
// removed the provisioned vlan
|
||||
VlanVO vlan = _vlanDao.findById(ip.getVlanId());
|
||||
_vlanDao.expunge(vlan.getId());
|
||||
|
||||
// remove the provisioned public ip address
|
||||
_ipAddressDao.expunge(ip.getId());
|
||||
|
||||
txn.commit();
|
||||
} finally {
|
||||
portableIpLock.releaseRef();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@DB
|
||||
public boolean configure(final String name, final Map<String, Object> params) throws ConfigurationException {
|
||||
|
|
|
|||
|
|
@ -846,6 +846,9 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
|
|||
boolean success = _networkMgr.disassociatePublicIpAddress(ipAddressId, userId, caller);
|
||||
|
||||
if (success) {
|
||||
if (!ipVO.isPortable()) {
|
||||
return success;
|
||||
}
|
||||
Long networkId = ipVO.getAssociatedWithNetworkId();
|
||||
if (networkId != null) {
|
||||
Network guestNetwork = getNetwork(networkId);
|
||||
|
|
@ -862,7 +865,6 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
|
|||
return success;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
@DB
|
||||
public Network getNetwork(long id) {
|
||||
|
|
|
|||
|
|
@ -32,4 +32,8 @@ public interface PortableIpDao extends GenericDao<PortableIpVO, Long> {
|
|||
List<PortableIpVO> listByRangeIdAndState(long rangeId, PortableIp.State state);
|
||||
|
||||
List<PortableIpVO> listByRegionIdAndState(int regionId, PortableIp.State state);
|
||||
|
||||
PortableIpVO findByIpAddress(String ipAddress);
|
||||
|
||||
void unassignIpAddress(long ipAddressId);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@ public class PortableIpDaoImpl extends GenericDaoBase<PortableIpVO, Long> implem
|
|||
private final SearchBuilder<PortableIpVO> listByRangeIDSearch;
|
||||
private final SearchBuilder<PortableIpVO> listByRangeIDAndStateSearch;
|
||||
private final SearchBuilder<PortableIpVO> listByRegionIDAndStateSearch;
|
||||
private final SearchBuilder<PortableIpVO> findByIpAddressSearch;
|
||||
|
||||
public PortableIpDaoImpl() {
|
||||
listByRegionIDSearch = createSearchBuilder();
|
||||
|
|
@ -71,6 +72,10 @@ public class PortableIpDaoImpl extends GenericDaoBase<PortableIpVO, Long> implem
|
|||
listByRegionIDAndStateSearch.and("regionId", listByRegionIDAndStateSearch.entity().getRangeId(), SearchCriteria.Op.EQ);
|
||||
listByRegionIDAndStateSearch.and("state", listByRegionIDAndStateSearch.entity().getState(), SearchCriteria.Op.EQ);
|
||||
listByRegionIDAndStateSearch.done();
|
||||
|
||||
findByIpAddressSearch = createSearchBuilder();
|
||||
findByIpAddressSearch.and("address", findByIpAddressSearch.entity().getAddress(), SearchCriteria.Op.EQ);
|
||||
findByIpAddressSearch.done();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -102,4 +107,25 @@ public class PortableIpDaoImpl extends GenericDaoBase<PortableIpVO, Long> implem
|
|||
sc.setParameters("state", state);
|
||||
return listBy(sc);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PortableIpVO findByIpAddress(String ipAddress) {
|
||||
SearchCriteria<PortableIpVO> sc = findByIpAddressSearch.create();
|
||||
sc.setParameters("address", ipAddress);
|
||||
return findOneBy(sc);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unassignIpAddress(long ipAddressId) {
|
||||
PortableIpVO address = createForUpdate();
|
||||
address.setAllocatedToAccountId(null);
|
||||
address.setAllocatedInDomainId(null);
|
||||
address.setAllocatedTime(null);
|
||||
address.setState(PortableIp.State.Free);
|
||||
address.setAssociatedWithNetworkId(null);
|
||||
address.setAssociatedDataCenterId(null);
|
||||
address.setAssociatedWithVpcId(null);
|
||||
address.setPhysicalNetworkId(null);
|
||||
update(ipAddressId, address);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -68,7 +68,7 @@ public class PortableIpVO implements PortableIp {
|
|||
private Long physicalNetworkId;
|
||||
|
||||
@Column(name="data_center_id")
|
||||
private long dataCenterId;
|
||||
private Long dataCenterId;
|
||||
|
||||
@Column(name="network_id")
|
||||
private Long networkId;
|
||||
|
|
|
|||
Loading…
Reference in New Issue