Cleaner and more type safe Transaction API for checked exceptions
diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java index 51310da..e0c4835 100755 --- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -167,6 +167,7 @@ import com.cloud.utils.db.TransactionCallback; import com.cloud.utils.db.TransactionCallbackNoReturn; import com.cloud.utils.db.TransactionCallbackWithException; +import com.cloud.utils.db.TransactionCallbackWithExceptionNoReturn; import com.cloud.utils.db.TransactionStatus; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.exception.ExecutionException; @@ -337,9 +338,9 @@ final VirtualMachineProfileImpl vmProfile = new VirtualMachineProfileImpl(vmFinal, template, serviceOffering, null, null); - Transaction.executeWithException(new TransactionCallbackWithException<Object>() { + Transaction.execute(new TransactionCallbackWithExceptionNoReturn<InsufficientCapacityException>() { @Override - public Object doInTransaction(TransactionStatus status) throws InsufficientCapacityException { + public void doInTransactionWithoutResult(TransactionStatus status) throws InsufficientCapacityException { if (s_logger.isDebugEnabled()) { s_logger.debug("Allocating nics for " + vmFinal); } @@ -365,10 +366,8 @@ for (Map.Entry<? extends DiskOffering, Long> offering : dataDiskOfferingsFinal.entrySet()) { volumeMgr.allocateRawVolume(Type.DATADISK, "DATA-" + vmFinal.getId(), offering.getKey(), offering.getValue(), vmFinal, template, owner); } - - return null; } - }, InsufficientCapacityException.class); + }); if (s_logger.isDebugEnabled()) { s_logger.debug("Allocation completed for VM: " + vmFinal); @@ -566,7 +565,7 @@ try { final ItWorkVO workFinal = work; Ternary<VMInstanceVO, ReservationContext, ItWorkVO> result = - Transaction.executeWithException(new TransactionCallbackWithException<Ternary<VMInstanceVO, ReservationContext, ItWorkVO>>() { + Transaction.execute(new TransactionCallbackWithException<Ternary<VMInstanceVO, ReservationContext, ItWorkVO>, NoTransitionException>() { @Override public Ternary<VMInstanceVO, ReservationContext, ItWorkVO> doInTransaction(TransactionStatus status) throws NoTransitionException { Journal journal = new Journal.LogJournal("Creating " + vm, s_logger); @@ -582,7 +581,7 @@ return new Ternary<VMInstanceVO, ReservationContext, ItWorkVO>(null, null, work); } - }, NoTransitionException.class); + }); work = result.third(); if (result.first() != null)
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java index 7ba9b1b..dbc0714 100755 --- a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
@@ -169,7 +169,7 @@ import com.cloud.utils.db.GlobalLock; import com.cloud.utils.db.TransactionCallback; import com.cloud.utils.db.TransactionCallbackNoReturn; -import com.cloud.utils.db.TransactionCallbackWithException; +import com.cloud.utils.db.TransactionCallbackWithExceptionNoReturn; import com.cloud.utils.db.TransactionStatus; import com.cloud.utils.db.JoinBuilder.JoinType; import com.cloud.utils.db.SearchBuilder; @@ -687,9 +687,9 @@ public void allocate(final VirtualMachineProfile vm, final LinkedHashMap<? extends Network, ? extends NicProfile> networks) throws InsufficientCapacityException, ConcurrentOperationException { - Transaction.executeWithException(new TransactionCallbackWithException<Object>() { + Transaction.execute(new TransactionCallbackWithExceptionNoReturn<InsufficientCapacityException>() { @Override - public Object doInTransaction(TransactionStatus status) throws InsufficientCapacityException { + public void doInTransactionWithoutResult(TransactionStatus status) throws InsufficientCapacityException { int deviceId = 0; boolean[] deviceIds = new boolean[networks.size()]; @@ -750,10 +750,8 @@ if (nics.size() == 1) { nics.get(0).setDefaultNic(true); } - - return null; } - }, InsufficientCapacityException.class); + }); } @DB @@ -2470,15 +2468,13 @@ final LinkedHashMap<Network, NicProfile> profiles = new LinkedHashMap<Network, NicProfile>(); profiles.put(network, null); - Transaction.executeWithException(new TransactionCallbackWithException<Object>() { + Transaction.execute(new TransactionCallbackWithExceptionNoReturn<InsufficientCapacityException>() { @Override - public Object doInTransaction(TransactionStatus status) throws Exception { + public void doInTransactionWithoutResult(TransactionStatus status) throws InsufficientCapacityException { cleanupNics(vm); allocate(vm, profiles); - - return null; } - }, InsufficientCapacityException.class); + }); } return true; }
diff --git a/framework/db/src/com/cloud/utils/db/Transaction.java b/framework/db/src/com/cloud/utils/db/Transaction.java index d65b87e..4b19be0 100755 --- a/framework/db/src/com/cloud/utils/db/Transaction.java +++ b/framework/db/src/com/cloud/utils/db/Transaction.java
@@ -18,14 +18,13 @@ import java.util.concurrent.atomic.AtomicLong; -import com.cloud.utils.exception.ExceptionUtil; - public class Transaction { private final static AtomicLong counter = new AtomicLong(0); private final static TransactionStatus STATUS = new TransactionStatus() { }; - public static <T> T execute(TransactionCallback<T> callback) { + @SuppressWarnings("deprecation") + public static <T,E extends Throwable> T execute(TransactionCallbackWithException<T,E> callback) throws E { String name = "tx-" + counter.incrementAndGet(); short databaseId = TransactionLegacy.CLOUD_DB; TransactionLegacy currentTxn = TransactionLegacy.currentTxn(false); @@ -43,24 +42,13 @@ } } - public static <T,X extends Exception> T executeWithException(final TransactionCallbackWithException<T> callback, Class<X> exception) throws X { - try { - return execute(new TransactionCallback<T>() { - @Override - public T doInTransaction(TransactionStatus status) { - try { - return callback.doInTransaction(status); - } catch (Exception e) { - ExceptionUtil.rethrowRuntime(e); - throw new TransactionWrappedExeception(e); - } - } - }); - } catch (TransactionWrappedExeception e) { - ExceptionUtil.rethrowRuntime(e.getWrapped()); - ExceptionUtil.rethrow(e.getWrapped(), exception); - throw e; - } + public static <T> T execute(final TransactionCallback<T> callback) { + return execute(new TransactionCallbackWithException<T, RuntimeException>() { + @Override + public T doInTransaction(TransactionStatus status) throws RuntimeException { + return callback.doInTransaction(status); + } + }); } }
diff --git a/framework/db/src/com/cloud/utils/db/TransactionCallbackNoReturn.java b/framework/db/src/com/cloud/utils/db/TransactionCallbackNoReturn.java index a2263e5..2db290a 100644 --- a/framework/db/src/com/cloud/utils/db/TransactionCallbackNoReturn.java +++ b/framework/db/src/com/cloud/utils/db/TransactionCallbackNoReturn.java
@@ -3,7 +3,7 @@ public abstract class TransactionCallbackNoReturn implements TransactionCallback<Object> { @Override - public Object doInTransaction(TransactionStatus status) { + public final Object doInTransaction(TransactionStatus status) { doInTransactionWithoutResult(status); return null; }
diff --git a/framework/db/src/com/cloud/utils/db/TransactionCallbackWithException.java b/framework/db/src/com/cloud/utils/db/TransactionCallbackWithException.java index cbf3fbd..67d7826 100644 --- a/framework/db/src/com/cloud/utils/db/TransactionCallbackWithException.java +++ b/framework/db/src/com/cloud/utils/db/TransactionCallbackWithException.java
@@ -1,7 +1,7 @@ package com.cloud.utils.db; -public interface TransactionCallbackWithException<T> { +public interface TransactionCallbackWithException<T,E extends Throwable> { - public T doInTransaction(TransactionStatus status) throws Exception; + public T doInTransaction(TransactionStatus status) throws E; }
diff --git a/framework/db/src/com/cloud/utils/db/TransactionWrappedExeception.java b/framework/db/src/com/cloud/utils/db/TransactionCallbackWithExceptionNoReturn.java similarity index 68% rename from framework/db/src/com/cloud/utils/db/TransactionWrappedExeception.java rename to framework/db/src/com/cloud/utils/db/TransactionCallbackWithExceptionNoReturn.java index 70d4c16..d5bc44f 100644 --- a/framework/db/src/com/cloud/utils/db/TransactionWrappedExeception.java +++ b/framework/db/src/com/cloud/utils/db/TransactionCallbackWithExceptionNoReturn.java
@@ -18,19 +18,15 @@ */ package com.cloud.utils.db; -import com.cloud.utils.exception.CloudRuntimeException; +public abstract class TransactionCallbackWithExceptionNoReturn<E extends Throwable> implements TransactionCallbackWithException<Boolean, E> { -public class TransactionWrappedExeception extends CloudRuntimeException { - - private static final long serialVersionUID = -3254037624055143300L; - - Exception e; - - public TransactionWrappedExeception(Exception e) { - this.e = e; + @Override + public final Boolean doInTransaction(TransactionStatus status) throws E { + doInTransactionWithoutResult(status); + return true; } - public Exception getWrapped() { - return e; - } + public abstract void doInTransactionWithoutResult(TransactionStatus status) throws E; + } +
diff --git a/framework/db/test/com/cloud/utils/db/TestTransaction.java b/framework/db/test/com/cloud/utils/db/TestTransaction.java index ea277c7..4ee08f1 100644 --- a/framework/db/test/com/cloud/utils/db/TestTransaction.java +++ b/framework/db/test/com/cloud/utils/db/TestTransaction.java
@@ -23,6 +23,7 @@ import java.io.FileNotFoundException; import java.sql.Connection; +import java.util.concurrent.atomic.AtomicInteger; import org.junit.After; import org.junit.Before; @@ -88,14 +89,14 @@ @Test public void testRollbackWithException() throws Exception { try { - Transaction.executeWithException(new TransactionCallbackWithException<Object>() { + Transaction.execute(new TransactionCallbackWithException<Object,FileNotFoundException>() { @Override public Object doInTransaction(TransactionStatus status) throws FileNotFoundException { assertEquals(TransactionLegacy.CLOUD_DB, TransactionLegacy.currentTxn().getDatabaseId().shortValue()); throw new FileNotFoundException("Panic!"); } - }, FileNotFoundException.class); + }); fail(); } catch (FileNotFoundException e) { assertEquals("Panic!", e.getMessage()); @@ -108,6 +109,23 @@ } @Test + public void testWithExceptionNoReturn() throws Exception { + final AtomicInteger i = new AtomicInteger(0); + assertTrue(Transaction.execute(new TransactionCallbackWithExceptionNoReturn<FileNotFoundException>() { + @Override + public void doInTransactionWithoutResult(TransactionStatus status) throws FileNotFoundException { + i.incrementAndGet(); + } + })); + + assertEquals(1, i.get()); + verify(conn).setAutoCommit(false); + verify(conn, times(1)).commit(); + verify(conn, times(0)).rollback(); + verify(conn, times(1)).close(); + } + + @Test public void testOtherdatabaseRollback() throws Exception { after(); setup(TransactionLegacy.AWSAPI_DB);
diff --git a/plugins/network-elements/cisco-vnmc/src/com/cloud/network/element/CiscoVnmcElement.java b/plugins/network-elements/cisco-vnmc/src/com/cloud/network/element/CiscoVnmcElement.java index 37de4de..5beb1ba 100644 --- a/plugins/network-elements/cisco-vnmc/src/com/cloud/network/element/CiscoVnmcElement.java +++ b/plugins/network-elements/cisco-vnmc/src/com/cloud/network/element/CiscoVnmcElement.java
@@ -124,7 +124,7 @@ import com.cloud.utils.db.EntityManager; import com.cloud.utils.db.Transaction; import com.cloud.utils.db.TransactionCallback; -import com.cloud.utils.db.TransactionCallbackWithException; +import com.cloud.utils.db.TransactionCallbackWithExceptionNoReturn; import com.cloud.utils.db.TransactionStatus; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.exception.ExceptionUtil; @@ -317,9 +317,9 @@ } try { - Transaction.executeWithException(new TransactionCallbackWithException<Object>() { + Transaction.execute(new TransactionCallbackWithExceptionNoReturn<Exception>() { @Override - public Object doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException, ResourceUnavailableException { + public void doInTransactionWithoutResult(TransactionStatus status) throws InsufficientAddressCapacityException, ResourceUnavailableException { // ensure that there is an ASA 1000v assigned to this network CiscoAsa1000vDevice assignedAsa = assignAsa1000vToNetwork(network); @@ -419,10 +419,8 @@ throw new CloudRuntimeException("Failed to associate Cisco ASA 1000v (" + assignedAsa.getManagementIp() + ") with logical edge firewall in VNMC for network " + network.getName()); } - - return null; } - }, Exception.class); + }); } catch (CloudRuntimeException e) { s_logger.error("CiscoVnmcElement failed", e); return false;
diff --git a/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java b/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java index cf4c2f0..f2bda39 100644 --- a/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java +++ b/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java
@@ -587,9 +587,9 @@ @DB public PublicIp allocDirectIp(final Account account, final long guestNetworkId) throws InsufficientAddressCapacityException { - return Transaction.executeWithException(new TransactionCallbackWithException<PublicIp>() { + return Transaction.execute(new TransactionCallbackWithException<PublicIp,InsufficientAddressCapacityException>() { @Override - public PublicIp doInTransaction(TransactionStatus status) throws Exception { + public PublicIp doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException { Network frontEndNetwork = _networkModel.getNetwork(guestNetworkId); PublicIp ip = _ipAddrMgr.assignPublicIpAddress(frontEndNetwork.getDataCenterId(), null, account, VlanType.DirectAttached, frontEndNetwork.getId(), null, true); @@ -600,7 +600,7 @@ return ip; } - }, InsufficientAddressCapacityException.class); + }); } public void releaseIp(long ipId, long userId, Account caller) {
diff --git a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java index 59df3e8..6ca40c0 100644 --- a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java +++ b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java
@@ -422,9 +422,9 @@ final boolean dedicatedLB = offering.getDedicatedLB(); // does network offering supports a dedicated load balancer? try { - lbDevice = Transaction.executeWithException(new TransactionCallbackWithException<ExternalLoadBalancerDeviceVO>() { + lbDevice = Transaction.execute(new TransactionCallbackWithException<ExternalLoadBalancerDeviceVO,InsufficientCapacityException>() { @Override - public ExternalLoadBalancerDeviceVO doInTransaction(TransactionStatus status) throws Exception { + public ExternalLoadBalancerDeviceVO doInTransaction(TransactionStatus status) throws InsufficientCapacityException { // FIXME: should the device allocation be done during network implement phase or do a // lazy allocation when first rule for the network is configured?? @@ -442,7 +442,7 @@ _externalLoadBalancerDeviceDao.update(lbDeviceId, lbDevice); return lbDevice; } - }, InsufficientCapacityException.class); + }); // allocated load balancer for the network, so skip retry tryLbProvisioning = false;
diff --git a/server/src/com/cloud/network/IpAddressManagerImpl.java b/server/src/com/cloud/network/IpAddressManagerImpl.java index dd30aa1..8619ae1 100644 --- a/server/src/com/cloud/network/IpAddressManagerImpl.java +++ b/server/src/com/cloud/network/IpAddressManagerImpl.java
@@ -146,8 +146,10 @@ import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.SearchCriteria.Op; import com.cloud.utils.db.Transaction; +import com.cloud.utils.db.TransactionCallbackWithExceptionNoReturn; import com.cloud.utils.db.TransactionStatus; import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.exception.ExceptionUtil; import com.cloud.utils.net.Ip; import com.cloud.utils.net.NetUtils; import com.cloud.vm.Nic; @@ -657,7 +659,7 @@ @DB public PublicIp fetchNewPublicIp(final long dcId, final Long podId, final List<Long> vlanDbIds, final Account owner, final VlanType vlanUse, final Long guestNetworkId, final boolean sourceNat, final boolean assign, final String requestedIp, final boolean isSystem, final Long vpcId) throws InsufficientAddressCapacityException { - IPAddressVO addr = Transaction.executeWithException(new TransactionCallbackWithException<IPAddressVO>() { + IPAddressVO addr = Transaction.execute(new TransactionCallbackWithException<IPAddressVO,InsufficientAddressCapacityException>() { @Override public IPAddressVO doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException { StringBuilder errorMessage = new StringBuilder("Unable to get ip adress in "); @@ -786,7 +788,7 @@ return addr; } - }, InsufficientAddressCapacityException.class); + }); if (vlanUse == VlanType.VirtualNetwork) { _firewallMgr.addSystemFirewallRules(addr, owner); @@ -870,7 +872,7 @@ PublicIp ip = null; try { - ip = Transaction.executeWithException(new TransactionCallbackWithException<PublicIp>() { + ip = Transaction.execute(new TransactionCallbackWithException<PublicIp,InsufficientAddressCapacityException>() { @Override public PublicIp doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException { Account owner = _accountDao.acquireInLockTable(ownerId); @@ -893,7 +895,7 @@ return ip; } - }, InsufficientAddressCapacityException.class); + }); return ip; } finally { @@ -1017,7 +1019,7 @@ s_logger.debug("Associate IP address lock acquired"); } - ip = Transaction.executeWithException(new TransactionCallbackWithException<PublicIp>() { + ip = Transaction.execute(new TransactionCallbackWithException<PublicIp,InsufficientAddressCapacityException>() { @Override public PublicIp doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException { PublicIp ip = fetchNewPublicIp(zone.getId(), null, null, ipOwner, vlanType, null, false, assign, null, isSystem, null); @@ -1034,7 +1036,7 @@ return ip; } - }, InsufficientAddressCapacityException.class); + }); } finally { if (accountToLock != null) { @@ -1059,9 +1061,9 @@ try { portableIpLock.lock(5); - ipaddr = Transaction.executeWithException(new TransactionCallbackWithException<IPAddressVO>() { + ipaddr = Transaction.execute(new TransactionCallbackWithException<IPAddressVO,InsufficientAddressCapacityException>() { @Override - public IPAddressVO doInTransaction(TransactionStatus status) throws Exception { + public IPAddressVO doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException { PortableIpVO allocatedPortableIp; List<PortableIpVO> portableIpVOs = _portableIpDao.listByRegionIdAndState(1, PortableIp.State.Free); @@ -1120,7 +1122,7 @@ return ipaddr; } - }, InsufficientAddressCapacityException.class); + }); } finally { portableIpLock.unlock(); } @@ -1498,100 +1500,108 @@ throw new InvalidParameterValueException("Network " + guestNetworkFinal + " is not of a type " + TrafficType.Guest); } - Ternary<Boolean,List<NetworkOfferingVO>, Network> pair = Transaction.executeWithException(new TransactionCallbackWithException<Ternary<Boolean,List<NetworkOfferingVO>, Network>>() { - @Override - public Ternary<Boolean,List<NetworkOfferingVO>, Network> doInTransaction(TransactionStatus status) throws Exception { - boolean createNetwork = false; - Network guestNetwork = guestNetworkFinal; + Ternary<Boolean,List<NetworkOfferingVO>, Network> pair = null; + try { + pair = Transaction.execute(new TransactionCallbackWithException<Ternary<Boolean,List<NetworkOfferingVO>, Network>,Exception>() { + @Override + public Ternary<Boolean,List<NetworkOfferingVO>, Network> doInTransaction(TransactionStatus status) throws InsufficientCapacityException, ResourceAllocationException { + boolean createNetwork = false; + Network guestNetwork = guestNetworkFinal; - if (guestNetwork == null) { - List<? extends Network> networks = getIsolatedNetworksWithSourceNATOwnedByAccountInZone(zoneId, owner); - if (networks.size() == 0) { - createNetwork = true; - } else if (networks.size() == 1) { - guestNetwork = networks.get(0); - } else { - throw new InvalidParameterValueException("Error, more than 1 Guest Isolated Networks with SourceNAT " - + "service enabled found for this account, cannot assosiate the IP range, please provide the network ID"); - } - } - - // create new Virtual network (Isolated with SourceNAT) for the user if it doesn't exist - List<NetworkOfferingVO> requiredOfferings = _networkOfferingDao.listByAvailability(Availability.Required, false); - if (requiredOfferings.size() < 1) { - throw new CloudRuntimeException("Unable to find network offering with availability=" + Availability.Required + - " to automatically create the network as part of createVlanIpRange"); - } - if (createNetwork) { - if (requiredOfferings.get(0).getState() == NetworkOffering.State.Enabled) { - long physicalNetworkId = _networkModel.findPhysicalNetworkId(zoneId, requiredOfferings.get(0).getTags(), requiredOfferings.get(0).getTrafficType()); - // Validate physical network - PhysicalNetwork physicalNetwork = _physicalNetworkDao.findById(physicalNetworkId); - if (physicalNetwork == null) { - throw new InvalidParameterValueException("Unable to find physical network with id: " + physicalNetworkId + " and tag: " + requiredOfferings.get(0).getTags()); - } - - s_logger.debug("Creating network for account " + owner + " from the network offering id=" + requiredOfferings.get(0).getId() + - " as a part of createVlanIpRange process"); - guestNetwork = _networkMgr.createGuestNetwork(requiredOfferings.get(0).getId(), - owner.getAccountName() + "-network", - owner.getAccountName() + "-network", - null, - null, - null, - null, - owner, - null, - physicalNetwork, - zoneId, - ACLType.Account, - null, - null, - null, - null, - true, - null); - if (guestNetwork == null) { - s_logger.warn("Failed to create default Virtual network for the account " + accountId + "in zone " + zoneId); - throw new CloudRuntimeException("Failed to create a Guest Isolated Networks with SourceNAT " + - "service enabled as a part of createVlanIpRange, for the account " + accountId + "in zone " + zoneId); - } - } else { - throw new CloudRuntimeException("Required network offering id=" + requiredOfferings.get(0).getId() + " is not in " + NetworkOffering.State.Enabled); - } - } - - // Check if there is a source nat ip address for this account; if not - we have to allocate one - boolean allocateSourceNat = false; - List<IPAddressVO> sourceNat = _ipAddressDao.listByAssociatedNetwork(guestNetwork.getId(), true); - if (sourceNat.isEmpty()) { - allocateSourceNat = true; - } - - // update all ips with a network id, mark them as allocated and update resourceCount/usage - List<IPAddressVO> ips = _ipAddressDao.listByVlanId(vlanId); - boolean isSourceNatAllocated = false; - for (IPAddressVO addr : ips) { - if (addr.getState() != State.Allocated) { - if (!isSourceNatAllocated && allocateSourceNat) { - addr.setSourceNat(true); - isSourceNatAllocated = true; + if (guestNetwork == null) { + List<? extends Network> networks = getIsolatedNetworksWithSourceNATOwnedByAccountInZone(zoneId, owner); + if (networks.size() == 0) { + createNetwork = true; + } else if (networks.size() == 1) { + guestNetwork = networks.get(0); } else { - addr.setSourceNat(false); + throw new InvalidParameterValueException("Error, more than 1 Guest Isolated Networks with SourceNAT " + + "service enabled found for this account, cannot assosiate the IP range, please provide the network ID"); } - addr.setAssociatedWithNetworkId(guestNetwork.getId()); - addr.setVpcId(guestNetwork.getVpcId()); - addr.setAllocatedTime(new Date()); - addr.setAllocatedInDomainId(owner.getDomainId()); - addr.setAllocatedToAccountId(owner.getId()); - addr.setSystem(false); - addr.setState(IpAddress.State.Allocating); - markPublicIpAsAllocated(addr); } + + // create new Virtual network (Isolated with SourceNAT) for the user if it doesn't exist + List<NetworkOfferingVO> requiredOfferings = _networkOfferingDao.listByAvailability(Availability.Required, false); + if (requiredOfferings.size() < 1) { + throw new CloudRuntimeException("Unable to find network offering with availability=" + Availability.Required + + " to automatically create the network as part of createVlanIpRange"); + } + if (createNetwork) { + if (requiredOfferings.get(0).getState() == NetworkOffering.State.Enabled) { + long physicalNetworkId = _networkModel.findPhysicalNetworkId(zoneId, requiredOfferings.get(0).getTags(), requiredOfferings.get(0).getTrafficType()); + // Validate physical network + PhysicalNetwork physicalNetwork = _physicalNetworkDao.findById(physicalNetworkId); + if (physicalNetwork == null) { + throw new InvalidParameterValueException("Unable to find physical network with id: " + physicalNetworkId + " and tag: " + requiredOfferings.get(0).getTags()); + } + + s_logger.debug("Creating network for account " + owner + " from the network offering id=" + requiredOfferings.get(0).getId() + + " as a part of createVlanIpRange process"); + guestNetwork = _networkMgr.createGuestNetwork(requiredOfferings.get(0).getId(), + owner.getAccountName() + "-network", + owner.getAccountName() + "-network", + null, + null, + null, + null, + owner, + null, + physicalNetwork, + zoneId, + ACLType.Account, + null, + null, + null, + null, + true, + null); + if (guestNetwork == null) { + s_logger.warn("Failed to create default Virtual network for the account " + accountId + "in zone " + zoneId); + throw new CloudRuntimeException("Failed to create a Guest Isolated Networks with SourceNAT " + + "service enabled as a part of createVlanIpRange, for the account " + accountId + "in zone " + zoneId); + } + } else { + throw new CloudRuntimeException("Required network offering id=" + requiredOfferings.get(0).getId() + " is not in " + NetworkOffering.State.Enabled); + } + } + + // Check if there is a source nat ip address for this account; if not - we have to allocate one + boolean allocateSourceNat = false; + List<IPAddressVO> sourceNat = _ipAddressDao.listByAssociatedNetwork(guestNetwork.getId(), true); + if (sourceNat.isEmpty()) { + allocateSourceNat = true; + } + + // update all ips with a network id, mark them as allocated and update resourceCount/usage + List<IPAddressVO> ips = _ipAddressDao.listByVlanId(vlanId); + boolean isSourceNatAllocated = false; + for (IPAddressVO addr : ips) { + if (addr.getState() != State.Allocated) { + if (!isSourceNatAllocated && allocateSourceNat) { + addr.setSourceNat(true); + isSourceNatAllocated = true; + } else { + addr.setSourceNat(false); + } + addr.setAssociatedWithNetworkId(guestNetwork.getId()); + addr.setVpcId(guestNetwork.getVpcId()); + addr.setAllocatedTime(new Date()); + addr.setAllocatedInDomainId(owner.getDomainId()); + addr.setAllocatedToAccountId(owner.getId()); + addr.setSystem(false); + addr.setState(IpAddress.State.Allocating); + markPublicIpAsAllocated(addr); + } + } + return new Ternary<Boolean,List<NetworkOfferingVO>, Network>(createNetwork, requiredOfferings, guestNetwork); } - return new Ternary<Boolean,List<NetworkOfferingVO>, Network>(createNetwork, requiredOfferings, guestNetwork); - } - }, InsufficientCapacityException.class); + }); + } catch (Exception e1) { + ExceptionUtil.rethrowRuntime(e1); + ExceptionUtil.rethrow(e1, InsufficientCapacityException.class); + ExceptionUtil.rethrow(e1, ResourceAllocationException.class); + throw new IllegalStateException(e1); + } boolean createNetwork = pair.first(); List<NetworkOfferingVO> requiredOfferings = pair.second(); @@ -1850,9 +1860,9 @@ @DB public void allocateDirectIp(final NicProfile nic, final DataCenter dc, final VirtualMachineProfile vm, final Network network, final String requestedIpv4, final String requestedIpv6) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException { - Transaction.executeWithException(new TransactionCallbackWithException<Object>() { + Transaction.execute(new TransactionCallbackWithExceptionNoReturn<InsufficientAddressCapacityException>() { @Override - public Object doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException { + public void doInTransactionWithoutResult(TransactionStatus status) throws InsufficientAddressCapacityException { //This method allocates direct ip for the Shared network in Advance zones boolean ipv4 = false; @@ -1913,11 +1923,8 @@ nic.setIp6Dns1(dc.getIp6Dns1()); nic.setIp6Dns2(dc.getIp6Dns2()); } - - return null; } - }, InsufficientAddressCapacityException.class); - + }); } @Override
diff --git a/server/src/com/cloud/network/NetworkServiceImpl.java b/server/src/com/cloud/network/NetworkServiceImpl.java index e0e90d9..c9a14cd 100755 --- a/server/src/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/com/cloud/network/NetworkServiceImpl.java
@@ -1304,9 +1304,9 @@ final Account ownerFinal, final String cidr, final boolean createVlan) throws InsufficientCapacityException, ResourceAllocationException { try { - return Transaction.executeWithException(new TransactionCallbackWithException<Network>() { + return Transaction.execute(new TransactionCallbackWithException<Network,Exception>() { @Override - public Network doInTransaction(TransactionStatus status) throws Exception { + public Network doInTransaction(TransactionStatus status) throws InsufficientCapacityException, ResourceAllocationException { Account owner = ownerFinal; Boolean subdomainAccess = subdomainAccessFinal; @@ -1368,7 +1368,7 @@ } return network; } - }, Exception.class); + }); } catch (Exception e) { ExceptionUtil.rethrowRuntime(e); ExceptionUtil.rethrow(e, InsufficientCapacityException.class); @@ -3898,7 +3898,7 @@ final NetworkOfferingVO ntwkOffFinal = ntwkOff; try { - return Transaction.executeWithException(new TransactionCallbackWithException<Network>() { + return Transaction.execute(new TransactionCallbackWithException<Network,Exception>() { @Override public Network doInTransaction(TransactionStatus status) throws ResourceAllocationException, InsufficientCapacityException { //lock datacenter as we need to get mac address seq from there @@ -3941,7 +3941,7 @@ return privateNetwork; } - }, Exception.class); + }); } catch (Exception e) { ExceptionUtil.rethrowRuntime(e); ExceptionUtil.rethrow(e, ResourceAllocationException.class);
diff --git a/server/src/com/cloud/network/StorageNetworkManagerImpl.java b/server/src/com/cloud/network/StorageNetworkManagerImpl.java index 73b45ab..4719a42 100755 --- a/server/src/com/cloud/network/StorageNetworkManagerImpl.java +++ b/server/src/com/cloud/network/StorageNetworkManagerImpl.java
@@ -224,7 +224,7 @@ StorageNetworkIpRangeVO range = null; final String endIpFinal = endIp; - return Transaction.executeWithException(new TransactionCallbackWithException<StorageNetworkIpRangeVO>() { + return Transaction.execute(new TransactionCallbackWithException<StorageNetworkIpRangeVO,SQLException>() { @Override public StorageNetworkIpRangeVO doInTransaction(TransactionStatus status) throws SQLException { StorageNetworkIpRangeVO range = new StorageNetworkIpRangeVO(zoneId, podId, nw.getId(), startIp, endIpFinal, vlan, netmask, cmd.getGateWay()); @@ -244,7 +244,7 @@ return range; } - }, SQLException.class); + }); } private String getInUseIpAddress(long rangeId) {
diff --git a/server/src/com/cloud/network/firewall/FirewallManagerImpl.java b/server/src/com/cloud/network/firewall/FirewallManagerImpl.java index e0d23ad..01504ab 100644 --- a/server/src/com/cloud/network/firewall/FirewallManagerImpl.java +++ b/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
@@ -226,7 +226,7 @@ final Long accountIdFinal = accountId; final Long domainIdFinal = domainId; - return Transaction.executeWithException(new TransactionCallbackWithException<FirewallRuleVO>() { + return Transaction.execute(new TransactionCallbackWithException<FirewallRuleVO,NetworkRuleConflictException>() { @Override public FirewallRuleVO doInTransaction(TransactionStatus status) throws NetworkRuleConflictException { FirewallRuleVO newRule = new FirewallRuleVO(xId, ipAddrId, portStart, portEnd, protocol.toLowerCase(), networkId, @@ -244,7 +244,7 @@ return newRule; } - }, NetworkRuleConflictException.class); + }); } @Override
diff --git a/server/src/com/cloud/network/guru/DirectNetworkGuru.java b/server/src/com/cloud/network/guru/DirectNetworkGuru.java index 65bc699..801d252 100755 --- a/server/src/com/cloud/network/guru/DirectNetworkGuru.java +++ b/server/src/com/cloud/network/guru/DirectNetworkGuru.java
@@ -58,6 +58,7 @@ import com.cloud.utils.db.Transaction; import com.cloud.utils.db.TransactionCallbackNoReturn; import com.cloud.utils.db.TransactionCallbackWithException; +import com.cloud.utils.db.TransactionCallbackWithExceptionNoReturn; import com.cloud.utils.db.TransactionStatus; import com.cloud.utils.exception.ExceptionUtil; import com.cloud.vm.Nic; @@ -237,9 +238,9 @@ InsufficientAddressCapacityException { try { - Transaction.executeWithException(new TransactionCallbackWithException<Object>() { + Transaction.execute(new TransactionCallbackWithExceptionNoReturn<InsufficientCapacityException>() { @Override - public Object doInTransaction(TransactionStatus status) throws InsufficientCapacityException { + public void doInTransactionWithoutResult(TransactionStatus status) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException { _ipAddrMgr.allocateDirectIp(nic, dc, vm, network, requestedIp4Addr, requestedIp6Addr); //save the placeholder nic if the vm is the Virtual router if (vm.getType() == VirtualMachine.Type.DomainRouter) { @@ -249,10 +250,8 @@ _networkMgr.savePlaceholderNic(network, nic.getIp4Address(), nic.getIp6Address(), VirtualMachine.Type.DomainRouter); } } - - return null; } - }, InsufficientCapacityException.class); + }); } catch (InsufficientCapacityException e) { ExceptionUtil.rethrow(e, InsufficientVirtualNetworkCapcityException.class); ExceptionUtil.rethrow(e, InsufficientAddressCapacityException.class);
diff --git a/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java b/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java index 691135f..053a786 100755 --- a/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java +++ b/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java
@@ -52,9 +52,8 @@ import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.utils.db.DB; import com.cloud.utils.db.Transaction; -import com.cloud.utils.db.TransactionCallback; import com.cloud.utils.db.TransactionCallbackNoReturn; -import com.cloud.utils.db.TransactionCallbackWithException; +import com.cloud.utils.db.TransactionCallbackWithExceptionNoReturn; import com.cloud.utils.db.TransactionStatus; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.Nic; @@ -170,9 +169,9 @@ InsufficientAddressCapacityException, ConcurrentOperationException { final DataCenter dc = _dcDao.findById(pod.getDataCenterId()); if (nic.getIp4Address() == null) { - Transaction.executeWithException(new TransactionCallbackWithException<Object>() { + Transaction.execute(new TransactionCallbackWithExceptionNoReturn<InsufficientAddressCapacityException>() { @Override - public Object doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException { + public void doInTransactionWithoutResult(TransactionStatus status) throws InsufficientAddressCapacityException { PublicIp ip = null; List<PodVlanMapVO> podRefs = _podVlanDao.listPodVlanMapsByPod(pod.getId()); String podRangeGateway = null; @@ -213,10 +212,8 @@ _networkMgr.savePlaceholderNic(network, nic.getIp4Address(), null, VirtualMachine.Type.DomainRouter); } } - - return null; } - }, InsufficientAddressCapacityException.class); + }); } nic.setDns1(dc.getDns1()); nic.setDns2(dc.getDns2());
diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java index 60bb40b..780a942 100755 --- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java +++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
@@ -1456,7 +1456,7 @@ Purpose.LoadBalancing, FirewallRuleType.User, networkId, null); - return Transaction.executeWithException(new TransactionCallbackWithException<LoadBalancerVO>() { + return Transaction.execute(new TransactionCallbackWithException<LoadBalancerVO,NetworkRuleConflictException>() { @Override public LoadBalancerVO doInTransaction(TransactionStatus status) throws NetworkRuleConflictException { LoadBalancerVO newRule = new LoadBalancerVO(xId, name, description, @@ -1507,7 +1507,7 @@ } } } - }, NetworkRuleConflictException.class); + }); }
diff --git a/server/src/com/cloud/network/rules/RulesManagerImpl.java b/server/src/com/cloud/network/rules/RulesManagerImpl.java index 83f0493..d98dd29 100755 --- a/server/src/com/cloud/network/rules/RulesManagerImpl.java +++ b/server/src/com/cloud/network/rules/RulesManagerImpl.java
@@ -79,6 +79,7 @@ import com.cloud.utils.db.TransactionCallbackWithException; import com.cloud.utils.db.SearchCriteria.Op; import com.cloud.utils.db.Transaction; +import com.cloud.utils.db.TransactionCallbackWithExceptionNoReturn; import com.cloud.utils.db.TransactionStatus; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.net.Ip; @@ -312,7 +313,7 @@ final Ip dstIpFinal = dstIp; final IPAddressVO ipAddressFinal = ipAddress; - return Transaction.executeWithException(new TransactionCallbackWithException<PortForwardingRuleVO>() { + return Transaction.execute(new TransactionCallbackWithException<PortForwardingRuleVO,NetworkRuleConflictException>() { @Override public PortForwardingRuleVO doInTransaction(TransactionStatus status) throws NetworkRuleConflictException { PortForwardingRuleVO newRule = new PortForwardingRuleVO(rule.getXid(), rule.getSourceIpAddressId(), @@ -350,7 +351,7 @@ throw new CloudRuntimeException("Unable to add rule for the ip id=" + ipAddrId, e); } } - }, NetworkRuleConflictException.class); + }); } finally { // release ip address if ipassoc was perfored @@ -395,7 +396,7 @@ //String dstIp = _networkModel.getIpInNetwork(ipAddress.getAssociatedWithVmId(), networkId); final String dstIp = ipAddress.getVmIp(); - return Transaction.executeWithException(new TransactionCallbackWithException<StaticNatRule>() { + return Transaction.execute(new TransactionCallbackWithException<StaticNatRule,NetworkRuleConflictException>() { @Override public StaticNatRule doInTransaction(TransactionStatus status) throws NetworkRuleConflictException { @@ -434,7 +435,7 @@ throw new CloudRuntimeException("Unable to add static nat rule for the ip id=" + newRule.getSourceIpAddressId(), e); } } - }, NetworkRuleConflictException.class); + }); } @@ -1154,9 +1155,9 @@ final boolean openFirewall, final Account caller, final int... ports) throws NetworkRuleConflictException { final FirewallRuleVO[] rules = new FirewallRuleVO[ports.length]; - Transaction.executeWithException(new TransactionCallbackWithException<Object>() { + Transaction.execute(new TransactionCallbackWithExceptionNoReturn<NetworkRuleConflictException>() { @Override - public Object doInTransaction(TransactionStatus status) throws NetworkRuleConflictException { + public void doInTransactionWithoutResult(TransactionStatus status) throws NetworkRuleConflictException { for (int i = 0; i < ports.length; i++) { rules[i] = new FirewallRuleVO(null, ip.getId(), ports[i], protocol, ip.getAssociatedWithNetworkId(), ip.getAllocatedToAccountId(), ip.getAllocatedInDomainId(), purpose, null, null, null, null); @@ -1167,10 +1168,8 @@ rules[i].getId(), ip.getAssociatedWithNetworkId()); } } - - return null; } - }, NetworkRuleConflictException.class); + }); boolean success = false; try {
diff --git a/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java b/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java index 85b01b3..c7b6e1e 100755 --- a/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java +++ b/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java
@@ -1101,7 +1101,7 @@ // check permissions _accountMgr.checkAccess(caller, null, true, group); - return Transaction.executeWithException(new TransactionCallbackWithException<Boolean>() { + return Transaction.execute(new TransactionCallbackWithException<Boolean,ResourceInUseException>() { @Override public Boolean doInTransaction(TransactionStatus status) throws ResourceInUseException { SecurityGroupVO group = _securityGroupDao.lockRow(groupId, true); @@ -1127,7 +1127,7 @@ return true; } - }, ResourceInUseException.class); + }); }
diff --git a/server/src/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/com/cloud/network/vpc/VpcManagerImpl.java index 8ab06b8..c072bfa 100644 --- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java +++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
@@ -121,6 +121,7 @@ import com.cloud.utils.db.TransactionCallback; import com.cloud.utils.db.TransactionCallbackNoReturn; import com.cloud.utils.db.TransactionCallbackWithException; +import com.cloud.utils.db.TransactionCallbackWithExceptionNoReturn; import com.cloud.utils.db.TransactionStatus; import com.cloud.utils.db.SearchCriteria.Op; import com.cloud.utils.db.Transaction; @@ -1405,7 +1406,7 @@ final PhysicalNetwork physNetFinal = physNet; VpcGatewayVO gatewayVO = null; try { - gatewayVO = Transaction.executeWithException(new TransactionCallbackWithException<VpcGatewayVO>() { + gatewayVO = Transaction.execute(new TransactionCallbackWithException<VpcGatewayVO,Exception>() { @Override public VpcGatewayVO doInTransaction(TransactionStatus status) throws ResourceAllocationException, ConcurrentOperationException, InsufficientCapacityException { s_logger.debug("Creating Private gateway for VPC " + vpc); @@ -1465,7 +1466,7 @@ return gatewayVO; } - }, Exception.class); + }); } catch (Exception e) { ExceptionUtil.rethrowRuntime(e); ExceptionUtil.rethrow(e, InsufficientCapacityException.class); @@ -1822,7 +1823,7 @@ throw new InvalidParameterValueException("The static gateway cidr overlaps with one of the blacklisted routes of the zone the VPC belongs to"); } - return Transaction.executeWithException(new TransactionCallbackWithException<StaticRouteVO>() { + return Transaction.execute(new TransactionCallbackWithException<StaticRouteVO, NetworkRuleConflictException>() { @Override public StaticRouteVO doInTransaction(TransactionStatus status) throws NetworkRuleConflictException { StaticRouteVO newRoute = new StaticRouteVO(gateway.getId(), cidr, vpc.getId(), vpc.getAccountId(), vpc.getDomainId()); @@ -1838,7 +1839,7 @@ return newRoute; } - }, NetworkRuleConflictException.class); + }); } protected boolean isCidrBlacklisted(String cidr, long zoneId) { @@ -1981,9 +1982,9 @@ } try { - Transaction.executeWithException(new TransactionCallbackWithException<Object>() { + Transaction.execute(new TransactionCallbackWithExceptionNoReturn<Exception>() { @Override - public Object doInTransaction(TransactionStatus status) throws Exception { + public void doInTransactionWithoutResult(TransactionStatus status) throws Exception { // Cleanup inactive VPCs List<VpcVO> inactiveVpcs = _vpcDao.listInactiveVpcs(); s_logger.info("Found " + inactiveVpcs.size() + " removed VPCs to cleanup"); @@ -1991,10 +1992,8 @@ s_logger.debug("Cleaning up " + vpc); destroyVpc(vpc, _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM), User.UID_SYSTEM); } - - return null; } - }, Exception.class); + }); } catch (Exception e) { s_logger.error("Exception ", e); } finally {
diff --git a/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java b/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java index 7912df4..7cf3167 100755 --- a/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java +++ b/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java
@@ -193,7 +193,7 @@ final String newIpRange = NetUtils.long2Ip(++startIp) + "-" + range[1]; final String sharedSecret = PasswordGenerator.generatePresharedKey(_pskLength); - return Transaction.executeWithException(new TransactionCallbackWithException<RemoteAccessVpn>() { + return Transaction.execute(new TransactionCallbackWithException<RemoteAccessVpn, NetworkRuleConflictException>() { @Override public RemoteAccessVpn doInTransaction(TransactionStatus status) throws NetworkRuleConflictException { _rulesMgr.reservePorts(ipAddr, NetUtils.UDP_PROTO, Purpose.Vpn, openFirewall, caller, NetUtils.VPN_PORT, NetUtils.VPN_L2TP_PORT, NetUtils.VPN_NATT_PORT); @@ -201,7 +201,7 @@ publicIpId, range[0], newIpRange, sharedSecret); return _remoteAccessVpnDao.persist(vpnVO); } - }, NetworkRuleConflictException.class); + }); } private void validateRemoteAccessVpnConfiguration() throws ConfigurationException {
diff --git a/server/src/com/cloud/projects/ProjectManagerImpl.java b/server/src/com/cloud/projects/ProjectManagerImpl.java index 193a49e..22e2020 100755 --- a/server/src/com/cloud/projects/ProjectManagerImpl.java +++ b/server/src/com/cloud/projects/ProjectManagerImpl.java
@@ -84,7 +84,7 @@ import com.cloud.utils.db.Transaction; import com.cloud.utils.db.TransactionCallback; import com.cloud.utils.db.TransactionCallbackNoReturn; -import com.cloud.utils.db.TransactionCallbackWithException; +import com.cloud.utils.db.TransactionCallbackWithExceptionNoReturn; import com.cloud.utils.db.TransactionStatus; import com.cloud.utils.exception.CloudRuntimeException; import com.sun.mail.smtp.SMTPMessage; @@ -469,9 +469,9 @@ //verify permissions _accountMgr.checkAccess(caller,AccessType.ModifyProject, true, _accountMgr.getAccount(project.getProjectAccountId())); - Transaction.executeWithException(new TransactionCallbackWithException<Object>() { + Transaction.execute(new TransactionCallbackWithExceptionNoReturn<ResourceAllocationException>() { @Override - public Object doInTransaction(TransactionStatus status) throws ResourceAllocationException { + public void doInTransactionWithoutResult(TransactionStatus status) throws ResourceAllocationException { if (displayText != null) { project.setDisplayText(displayText); _projectDao.update(projectId, project); @@ -509,10 +509,8 @@ s_logger.trace("Future owner " + newOwnerName + "is already the owner of the project id=" + projectId); } } - - return null; } - }, ResourceAllocationException.class); + }); return _projectDao.findById(projectId);
diff --git a/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java b/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java index bfe32ec..7417754 100755 --- a/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java +++ b/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java
@@ -91,8 +91,7 @@ import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.TransactionCallback; -import com.cloud.utils.db.TransactionCallbackNoReturn; -import com.cloud.utils.db.TransactionCallbackWithException; +import com.cloud.utils.db.TransactionCallbackWithExceptionNoReturn; import com.cloud.utils.db.TransactionStatus; import com.cloud.utils.db.SearchCriteria.Func; import com.cloud.utils.db.SearchCriteria.Op; @@ -379,9 +378,9 @@ } final Project projectFinal = project; - Transaction.executeWithException(new TransactionCallbackWithException<Object>() { + Transaction.execute(new TransactionCallbackWithExceptionNoReturn<ResourceAllocationException>() { @Override - public Object doInTransaction(TransactionStatus status) throws ResourceAllocationException { + public void doInTransactionWithoutResult(TransactionStatus status) throws ResourceAllocationException { // Lock all rows first so nobody else can read it Set<Long> rowIdsToLock = _resourceCountDao.listAllRowsToUpdate(account.getId(), ResourceOwnerType.Account, type); SearchCriteria<ResourceCountVO> sc = ResourceCountSearch.create(); @@ -423,10 +422,8 @@ } domainId = domain.getParent(); } - - return null; } - }, ResourceAllocationException.class); + }); } @Override
diff --git a/server/src/com/cloud/server/ConfigurationServerImpl.java b/server/src/com/cloud/server/ConfigurationServerImpl.java index 1761a32..f8141ee 100755 --- a/server/src/com/cloud/server/ConfigurationServerImpl.java +++ b/server/src/com/cloud/server/ConfigurationServerImpl.java
@@ -109,6 +109,7 @@ import com.cloud.utils.db.TransactionCallback; import com.cloud.utils.db.TransactionCallbackNoReturn; import com.cloud.utils.db.TransactionCallbackWithException; +import com.cloud.utils.db.TransactionCallbackWithExceptionNoReturn; import com.cloud.utils.db.TransactionLegacy; import com.cloud.utils.db.TransactionStatus; import com.cloud.utils.exception.CloudRuntimeException; @@ -837,9 +838,9 @@ final HostPodVO pod = new HostPodVO(podName, zoneId, gateway, cidrAddress, cidrSize, ipRange); try { final String endIpFinal = endIp; - Transaction.executeWithException(new TransactionCallbackWithException<Object>() { + Transaction.execute(new TransactionCallbackWithExceptionNoReturn<InternalErrorException>() { @Override - public Object doInTransaction(TransactionStatus status) throws InternalErrorException { + public void doInTransactionWithoutResult(TransactionStatus status) throws InternalErrorException { if (_podDao.persist(pod) == null) { throw new InternalErrorException("Failed to create new pod. Please contact Cloud Support."); } @@ -860,10 +861,8 @@ } else { _zoneDao.addLinkLocalIpAddress(zoneId, pod.getId(), linkLocalIpRanges[0], linkLocalIpRanges[1]); } - - return null; } - }, InternalErrorException.class); + }); } catch (Exception e) { s_logger.error("Unable to create new pod due to " + e.getMessage(), e); throw new InternalErrorException("Failed to create new pod. Please contact Cloud Support.");
diff --git a/server/src/com/cloud/test/DatabaseConfig.java b/server/src/com/cloud/test/DatabaseConfig.java index 6f76a3a..9370218 100755 --- a/server/src/com/cloud/test/DatabaseConfig.java +++ b/server/src/com/cloud/test/DatabaseConfig.java
@@ -59,6 +59,7 @@ import com.cloud.utils.db.Transaction; import com.cloud.utils.db.TransactionCallbackNoReturn; import com.cloud.utils.db.TransactionCallbackWithException; +import com.cloud.utils.db.TransactionCallbackWithExceptionNoReturn; import com.cloud.utils.db.TransactionLegacy; import com.cloud.utils.db.TransactionStatus; import com.cloud.utils.net.NfsUtils; @@ -419,9 +420,9 @@ final DbConfigXMLHandler handler = new DbConfigXMLHandler(); handler.setParent(this); - Transaction.executeWithException(new TransactionCallbackWithException<Object>() { + Transaction.execute(new TransactionCallbackWithExceptionNoReturn<Exception>() { @Override - public Object doInTransaction(TransactionStatus status) throws Exception { + public void doInTransactionWithoutResult(TransactionStatus status) throws Exception { // Save user configured values for all fields saxParser.parse(configFile, handler); @@ -429,10 +430,8 @@ saveVMTemplate(); saveRootDomain(); saveDefaultConfiguations(); - - return null; } - }, Exception.class); + }); // Check pod CIDRs against each other, and against the guest ip network/netmask pzc.checkAllPodCidrSubnets();
diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 5053a97..86f9855 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@ -243,6 +243,7 @@ import com.cloud.utils.db.SearchCriteria.Func; import com.cloud.utils.db.Transaction; import com.cloud.utils.db.TransactionCallbackWithException; +import com.cloud.utils.db.TransactionCallbackWithExceptionNoReturn; import com.cloud.utils.db.TransactionStatus; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.exception.ExecutionException; @@ -1412,9 +1413,9 @@ s_logger.debug("Recovering vm " + vmId); } - Transaction.executeWithException(new TransactionCallbackWithException<Object>() { + Transaction.execute(new TransactionCallbackWithExceptionNoReturn<ResourceAllocationException>() { @Override - public Object doInTransaction(TransactionStatus status) throws ResourceAllocationException { + public void doInTransactionWithoutResult(TransactionStatus status) throws ResourceAllocationException { Account account = _accountDao.lockRow(vm.getAccountId(), true); @@ -1473,10 +1474,8 @@ //Update Resource Count for the given account resourceCountIncrement(account.getId(), new Long(serviceOffering.getCpu()), new Long(serviceOffering.getRamSize())); - - return null; } - }, ResourceAllocationException.class); + }); return _vmDao.findById(vmId); @@ -2785,7 +2784,7 @@ final ServiceOfferingVO offering, final boolean isIso, final String sshPublicKey, final LinkedHashMap<String, NicProfile> networkNicMap, final long id, final String instanceName, final String uuidName, final HypervisorType hypervisorType) throws InsufficientCapacityException { - return Transaction.executeWithException(new TransactionCallbackWithException<UserVmVO>() { + return Transaction.execute(new TransactionCallbackWithException<UserVmVO,InsufficientCapacityException>() { @Override public UserVmVO doInTransaction(TransactionStatus status) throws InsufficientCapacityException { UserVmVO vm = new UserVmVO(id, instanceName, displayName, @@ -2878,7 +2877,7 @@ new Long(offering.getRamSize())); return vm; } - }, InsufficientCapacityException.class); + }); } private void validateUserData(String userData, HTTPMethod httpmethod) {
diff --git a/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java b/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java index 18f17b8..cd064f5 100644 --- a/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java +++ b/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
@@ -92,6 +92,7 @@ import com.cloud.utils.db.TransactionCallback; import com.cloud.utils.db.TransactionCallbackNoReturn; import com.cloud.utils.db.TransactionCallbackWithException; +import com.cloud.utils.db.TransactionCallbackWithExceptionNoReturn; import com.cloud.utils.db.TransactionStatus; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.fsm.NoTransitionException; @@ -487,9 +488,9 @@ @DB protected void processAnswer(final VMSnapshotVO vmSnapshot, UserVmVO userVm, final Answer as, Long hostId) { try { - Transaction.executeWithException(new TransactionCallbackWithException<Object>() { + Transaction.execute(new TransactionCallbackWithExceptionNoReturn<NoTransitionException>() { @Override - public Object doInTransaction(TransactionStatus status) throws NoTransitionException { + public void doInTransactionWithoutResult(TransactionStatus status) throws NoTransitionException { if (as instanceof CreateVMSnapshotAnswer) { CreateVMSnapshotAnswer answer = (CreateVMSnapshotAnswer) as; finalizeCreate(vmSnapshot, answer.getVolumeTOs()); @@ -503,10 +504,8 @@ finalizeDelete(vmSnapshot, answer.getVolumeTOs()); _vmSnapshotDao.remove(vmSnapshot.getId()); } - - return null; } - }, NoTransitionException.class); + }); } catch (Exception e) { String errMsg = "Error while process answer: " + as.getClass() + " due to " + e.getMessage(); s_logger.error(errMsg, e);
diff --git a/server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java b/server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java index 1149085..e2d33ac 100644 --- a/server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java +++ b/server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java
@@ -71,7 +71,6 @@ import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.Transaction; -import com.cloud.utils.db.TransactionCallback; import com.cloud.utils.db.TransactionCallbackWithException; import com.cloud.utils.db.TransactionStatus; import com.cloud.utils.exception.CloudRuntimeException; @@ -162,7 +161,7 @@ boolean success = true; ApplicationLoadBalancerRuleVO newRule = null; try { - newRule = Transaction.executeWithException(new TransactionCallbackWithException<ApplicationLoadBalancerRuleVO>() { + newRule = Transaction.execute(new TransactionCallbackWithException<ApplicationLoadBalancerRuleVO,NetworkRuleConflictException>() { @Override public ApplicationLoadBalancerRuleVO doInTransaction(TransactionStatus status) throws NetworkRuleConflictException { //1) Persist the rule @@ -183,7 +182,7 @@ return newRule; } - }, NetworkRuleConflictException.class); + }); return newRule; } catch (Exception e) {