enhance disasociateIPAddr API to release protable IP associated with a

guest network or VPC
This commit is contained in:
Murali Reddy 2013-05-12 21:14:48 +05:30
parent 27504d9098
commit bd058f58c2
5 changed files with 64 additions and 2 deletions

View File

@ -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 {

View File

@ -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) {

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -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;