diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java index 51310da0750..e0c48356505 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.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.utils.exception.ExecutionException; @@ -337,9 +338,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac final VirtualMachineProfileImpl vmProfile = new VirtualMachineProfileImpl(vmFinal, template, serviceOffering, null, null); - Transaction.executeWithException(new TransactionCallbackWithException() { + Transaction.execute(new TransactionCallbackWithExceptionNoReturn() { @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 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac for (Map.Entry 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 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac try { final ItWorkVO workFinal = work; Ternary result = - Transaction.executeWithException(new TransactionCallbackWithException>() { + Transaction.execute(new TransactionCallbackWithException, NoTransitionException>() { @Override public Ternary doInTransaction(TransactionStatus status) throws NoTransitionException { Journal journal = new Journal.LogJournal("Creating " + vm, s_logger); @@ -582,7 +581,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac return new Ternary(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 7ba9b1b8050..dbc07141719 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.EntityManager; 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 class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra public void allocate(final VirtualMachineProfile vm, final LinkedHashMap networks) throws InsufficientCapacityException, ConcurrentOperationException { - Transaction.executeWithException(new TransactionCallbackWithException() { + Transaction.execute(new TransactionCallbackWithExceptionNoReturn() { @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 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra if (nics.size() == 1) { nics.get(0).setDefaultNic(true); } - - return null; } - }, InsufficientCapacityException.class); + }); } @DB @@ -2470,15 +2468,13 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra final LinkedHashMap profiles = new LinkedHashMap(); profiles.put(network, null); - Transaction.executeWithException(new TransactionCallbackWithException() { + Transaction.execute(new TransactionCallbackWithExceptionNoReturn() { @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 d65b87e9fbb..4b19be088c8 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 @@ package com.cloud.utils.db; 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 execute(TransactionCallback callback) { + @SuppressWarnings("deprecation") + public static T execute(TransactionCallbackWithException callback) throws E { String name = "tx-" + counter.incrementAndGet(); short databaseId = TransactionLegacy.CLOUD_DB; TransactionLegacy currentTxn = TransactionLegacy.currentTxn(false); @@ -43,24 +42,13 @@ public class Transaction { } } - public static T executeWithException(final TransactionCallbackWithException callback, Class exception) throws X { - try { - return execute(new TransactionCallback() { - @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 execute(final TransactionCallback callback) { + return execute(new TransactionCallbackWithException() { + @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 a2263e56d7a..2db290a034b 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 @@ package com.cloud.utils.db; public abstract class TransactionCallbackNoReturn implements TransactionCallback { @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 cbf3fbd1153..67d7826a17f 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 { +public interface TransactionCallbackWithException { - 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 70d4c169a0d..d5bc44fe7b3 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 implements TransactionCallbackWithException { -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 ea277c7b6cb..4ee08f1f66f 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 static org.mockito.Mockito.*; 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 @@ public class TestTransaction { @Test public void testRollbackWithException() throws Exception { try { - Transaction.executeWithException(new TransactionCallbackWithException() { + Transaction.execute(new TransactionCallbackWithException() { @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()); @@ -107,6 +108,23 @@ public class TestTransaction { verify(conn, times(1)).close(); } + @Test + public void testWithExceptionNoReturn() throws Exception { + final AtomicInteger i = new AtomicInteger(0); + assertTrue(Transaction.execute(new TransactionCallbackWithExceptionNoReturn() { + @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(); 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 37de4de0ca9..5beb1bae520 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.component.AdapterBase; 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 @@ public class CiscoVnmcElement extends AdapterBase implements SourceNatServicePro } try { - Transaction.executeWithException(new TransactionCallbackWithException() { + Transaction.execute(new TransactionCallbackWithExceptionNoReturn() { @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 @@ public class CiscoVnmcElement extends AdapterBase implements SourceNatServicePro 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 cf4c2f0fce7..f2bda392b95 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 @@ public class ElasticLoadBalancerManagerImpl extends ManagerBase implements Elast @DB public PublicIp allocDirectIp(final Account account, final long guestNetworkId) throws InsufficientAddressCapacityException { - return Transaction.executeWithException(new TransactionCallbackWithException() { + return Transaction.execute(new TransactionCallbackWithException() { @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 @@ public class ElasticLoadBalancerManagerImpl extends ManagerBase implements Elast 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 59df3e89c76..6ca40c01e98 100644 --- a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java +++ b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java @@ -422,9 +422,9 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase final boolean dedicatedLB = offering.getDedicatedLB(); // does network offering supports a dedicated load balancer? try { - lbDevice = Transaction.executeWithException(new TransactionCallbackWithException() { + lbDevice = Transaction.execute(new TransactionCallbackWithException() { @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 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase _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 dd30aa18f79..8619ae178cd 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.SearchBuilder; 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 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage @DB public PublicIp fetchNewPublicIp(final long dcId, final Long podId, final List 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 addr = Transaction.execute(new TransactionCallbackWithException() { @Override public IPAddressVO doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException { StringBuilder errorMessage = new StringBuilder("Unable to get ip adress in "); @@ -786,7 +788,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage return addr; } - }, InsufficientAddressCapacityException.class); + }); if (vlanUse == VlanType.VirtualNetwork) { _firewallMgr.addSystemFirewallRules(addr, owner); @@ -870,7 +872,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage PublicIp ip = null; try { - ip = Transaction.executeWithException(new TransactionCallbackWithException() { + ip = Transaction.execute(new TransactionCallbackWithException() { @Override public PublicIp doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException { Account owner = _accountDao.acquireInLockTable(ownerId); @@ -893,7 +895,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage return ip; } - }, InsufficientAddressCapacityException.class); + }); return ip; } finally { @@ -1017,7 +1019,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage s_logger.debug("Associate IP address lock acquired"); } - ip = Transaction.executeWithException(new TransactionCallbackWithException() { + ip = Transaction.execute(new TransactionCallbackWithException() { @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 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage return ip; } - }, InsufficientAddressCapacityException.class); + }); } finally { if (accountToLock != null) { @@ -1059,9 +1061,9 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage try { portableIpLock.lock(5); - ipaddr = Transaction.executeWithException(new TransactionCallbackWithException() { + ipaddr = Transaction.execute(new TransactionCallbackWithException() { @Override - public IPAddressVO doInTransaction(TransactionStatus status) throws Exception { + public IPAddressVO doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException { PortableIpVO allocatedPortableIp; List portableIpVOs = _portableIpDao.listByRegionIdAndState(1, PortableIp.State.Free); @@ -1120,7 +1122,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage return ipaddr; } - }, InsufficientAddressCapacityException.class); + }); } finally { portableIpLock.unlock(); } @@ -1498,100 +1500,108 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage throw new InvalidParameterValueException("Network " + guestNetworkFinal + " is not of a type " + TrafficType.Guest); } - Ternary, Network> pair = Transaction.executeWithException(new TransactionCallbackWithException, Network>>() { - @Override - public Ternary, Network> doInTransaction(TransactionStatus status) throws Exception { - boolean createNetwork = false; - Network guestNetwork = guestNetworkFinal; + Ternary, Network> pair = null; + try { + pair = Transaction.execute(new TransactionCallbackWithException, Network>,Exception>() { + @Override + public Ternary, Network> doInTransaction(TransactionStatus status) throws InsufficientCapacityException, ResourceAllocationException { + boolean createNetwork = false; + Network guestNetwork = guestNetworkFinal; - if (guestNetwork == null) { - List 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 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 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 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 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 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 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 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, Network>(createNetwork, requiredOfferings, guestNetwork); } - return new Ternary, 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 requiredOfferings = pair.second(); @@ -1850,9 +1860,9 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage @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() { + Transaction.execute(new TransactionCallbackWithExceptionNoReturn() { @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 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage 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 e0e90d9ab3d..c9a14cdf47f 100755 --- a/server/src/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/com/cloud/network/NetworkServiceImpl.java @@ -1304,9 +1304,9 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { final Account ownerFinal, final String cidr, final boolean createVlan) throws InsufficientCapacityException, ResourceAllocationException { try { - return Transaction.executeWithException(new TransactionCallbackWithException() { + return Transaction.execute(new TransactionCallbackWithException() { @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 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { } return network; } - }, Exception.class); + }); } catch (Exception e) { ExceptionUtil.rethrowRuntime(e); ExceptionUtil.rethrow(e, InsufficientCapacityException.class); @@ -3898,7 +3898,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { final NetworkOfferingVO ntwkOffFinal = ntwkOff; try { - return Transaction.executeWithException(new TransactionCallbackWithException() { + return Transaction.execute(new TransactionCallbackWithException() { @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 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { 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 73b45ab8d37..4719a42e8be 100755 --- a/server/src/com/cloud/network/StorageNetworkManagerImpl.java +++ b/server/src/com/cloud/network/StorageNetworkManagerImpl.java @@ -224,7 +224,7 @@ public class StorageNetworkManagerImpl extends ManagerBase implements StorageNet StorageNetworkIpRangeVO range = null; final String endIpFinal = endIp; - return Transaction.executeWithException(new TransactionCallbackWithException() { + return Transaction.execute(new TransactionCallbackWithException() { @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 @@ public class StorageNetworkManagerImpl extends ManagerBase implements StorageNet 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 e0d23adb303..01504ab99f7 100644 --- a/server/src/com/cloud/network/firewall/FirewallManagerImpl.java +++ b/server/src/com/cloud/network/firewall/FirewallManagerImpl.java @@ -226,7 +226,7 @@ public class FirewallManagerImpl extends ManagerBase implements FirewallService, final Long accountIdFinal = accountId; final Long domainIdFinal = domainId; - return Transaction.executeWithException(new TransactionCallbackWithException() { + return Transaction.execute(new TransactionCallbackWithException() { @Override public FirewallRuleVO doInTransaction(TransactionStatus status) throws NetworkRuleConflictException { FirewallRuleVO newRule = new FirewallRuleVO(xId, ipAddrId, portStart, portEnd, protocol.toLowerCase(), networkId, @@ -244,7 +244,7 @@ public class FirewallManagerImpl extends ManagerBase implements FirewallService, 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 65bc6990560..801d252ef81 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.DB; 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 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru { InsufficientAddressCapacityException { try { - Transaction.executeWithException(new TransactionCallbackWithException() { + Transaction.execute(new TransactionCallbackWithExceptionNoReturn() { @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 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru { _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 691135fd8ab..053a786e67b 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.offering.NetworkOffering; 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 @@ public class DirectPodBasedNetworkGuru extends DirectNetworkGuru { InsufficientAddressCapacityException, ConcurrentOperationException { final DataCenter dc = _dcDao.findById(pod.getDataCenterId()); if (nic.getIp4Address() == null) { - Transaction.executeWithException(new TransactionCallbackWithException() { + Transaction.execute(new TransactionCallbackWithExceptionNoReturn() { @Override - public Object doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException { + public void doInTransactionWithoutResult(TransactionStatus status) throws InsufficientAddressCapacityException { PublicIp ip = null; List podRefs = _podVlanDao.listPodVlanMapsByPod(pod.getId()); String podRangeGateway = null; @@ -213,10 +212,8 @@ public class DirectPodBasedNetworkGuru extends DirectNetworkGuru { _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 60bb40b1043..780a9423b2f 100755 --- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java +++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java @@ -1456,7 +1456,7 @@ public class LoadBalancingRulesManagerImpl extends ManagerBase implements Purpose.LoadBalancing, FirewallRuleType.User, networkId, null); - return Transaction.executeWithException(new TransactionCallbackWithException() { + return Transaction.execute(new TransactionCallbackWithException() { @Override public LoadBalancerVO doInTransaction(TransactionStatus status) throws NetworkRuleConflictException { LoadBalancerVO newRule = new LoadBalancerVO(xId, name, description, @@ -1507,7 +1507,7 @@ public class LoadBalancingRulesManagerImpl extends ManagerBase implements } } } - }, NetworkRuleConflictException.class); + }); } diff --git a/server/src/com/cloud/network/rules/RulesManagerImpl.java b/server/src/com/cloud/network/rules/RulesManagerImpl.java index 83f0493384d..d98dd299c7b 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.TransactionCallbackNoReturn; 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 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules final Ip dstIpFinal = dstIp; final IPAddressVO ipAddressFinal = ipAddress; - return Transaction.executeWithException(new TransactionCallbackWithException() { + return Transaction.execute(new TransactionCallbackWithException() { @Override public PortForwardingRuleVO doInTransaction(TransactionStatus status) throws NetworkRuleConflictException { PortForwardingRuleVO newRule = new PortForwardingRuleVO(rule.getXid(), rule.getSourceIpAddressId(), @@ -350,7 +351,7 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules 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 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules //String dstIp = _networkModel.getIpInNetwork(ipAddress.getAssociatedWithVmId(), networkId); final String dstIp = ipAddress.getVmIp(); - return Transaction.executeWithException(new TransactionCallbackWithException() { + return Transaction.execute(new TransactionCallbackWithException() { @Override public StaticNatRule doInTransaction(TransactionStatus status) throws NetworkRuleConflictException { @@ -434,7 +435,7 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules throw new CloudRuntimeException("Unable to add static nat rule for the ip id=" + newRule.getSourceIpAddressId(), e); } } - }, NetworkRuleConflictException.class); + }); } @@ -1154,9 +1155,9 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules final boolean openFirewall, final Account caller, final int... ports) throws NetworkRuleConflictException { final FirewallRuleVO[] rules = new FirewallRuleVO[ports.length]; - Transaction.executeWithException(new TransactionCallbackWithException() { + Transaction.execute(new TransactionCallbackWithExceptionNoReturn() { @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 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules 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 85b01b3f0d7..c7b6e1eb3f7 100755 --- a/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java +++ b/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java @@ -1101,7 +1101,7 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro // check permissions _accountMgr.checkAccess(caller, null, true, group); - return Transaction.executeWithException(new TransactionCallbackWithException() { + return Transaction.execute(new TransactionCallbackWithException() { @Override public Boolean doInTransaction(TransactionStatus status) throws ResourceInUseException { SecurityGroupVO group = _securityGroupDao.lockRow(groupId, true); @@ -1127,7 +1127,7 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro 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 8ab06b8e2a1..c072bfa6d00 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.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.Op; import com.cloud.utils.db.Transaction; @@ -1405,7 +1406,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis final PhysicalNetwork physNetFinal = physNet; VpcGatewayVO gatewayVO = null; try { - gatewayVO = Transaction.executeWithException(new TransactionCallbackWithException() { + gatewayVO = Transaction.execute(new TransactionCallbackWithException() { @Override public VpcGatewayVO doInTransaction(TransactionStatus status) throws ResourceAllocationException, ConcurrentOperationException, InsufficientCapacityException { s_logger.debug("Creating Private gateway for VPC " + vpc); @@ -1465,7 +1466,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis return gatewayVO; } - }, Exception.class); + }); } catch (Exception e) { ExceptionUtil.rethrowRuntime(e); ExceptionUtil.rethrow(e, InsufficientCapacityException.class); @@ -1822,7 +1823,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis 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() { + return Transaction.execute(new TransactionCallbackWithException() { @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 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis return newRoute; } - }, NetworkRuleConflictException.class); + }); } protected boolean isCidrBlacklisted(String cidr, long zoneId) { @@ -1981,9 +1982,9 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis } try { - Transaction.executeWithException(new TransactionCallbackWithException() { + Transaction.execute(new TransactionCallbackWithExceptionNoReturn() { @Override - public Object doInTransaction(TransactionStatus status) throws Exception { + public void doInTransactionWithoutResult(TransactionStatus status) throws Exception { // Cleanup inactive VPCs List inactiveVpcs = _vpcDao.listInactiveVpcs(); s_logger.info("Found " + inactiveVpcs.size() + " removed VPCs to cleanup"); @@ -1991,10 +1992,8 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis 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 7912df44a6b..7cf3167bc10 100755 --- a/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java +++ b/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java @@ -193,7 +193,7 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc final String newIpRange = NetUtils.long2Ip(++startIp) + "-" + range[1]; final String sharedSecret = PasswordGenerator.generatePresharedKey(_pskLength); - return Transaction.executeWithException(new TransactionCallbackWithException() { + return Transaction.execute(new TransactionCallbackWithException() { @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 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc 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 193a49e67ea..22e2020ad22 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.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.sun.mail.smtp.SMTPMessage; @@ -469,9 +469,9 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager { //verify permissions _accountMgr.checkAccess(caller,AccessType.ModifyProject, true, _accountMgr.getAccount(project.getProjectAccountId())); - Transaction.executeWithException(new TransactionCallbackWithException() { + Transaction.execute(new TransactionCallbackWithExceptionNoReturn() { @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 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager { 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 bfe32ec0b53..7417754da0c 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.JoinBuilder; 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 @@ public class ResourceLimitManagerImpl extends ManagerBase implements ResourceLim } final Project projectFinal = project; - Transaction.executeWithException(new TransactionCallbackWithException() { + Transaction.execute(new TransactionCallbackWithExceptionNoReturn() { @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 rowIdsToLock = _resourceCountDao.listAllRowsToUpdate(account.getId(), ResourceOwnerType.Account, type); SearchCriteria sc = ResourceCountSearch.create(); @@ -423,10 +422,8 @@ public class ResourceLimitManagerImpl extends ManagerBase implements ResourceLim } 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 1761a32667a..f8141eea23c 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.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.TransactionLegacy; import com.cloud.utils.db.TransactionStatus; import com.cloud.utils.exception.CloudRuntimeException; @@ -837,9 +838,9 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio final HostPodVO pod = new HostPodVO(podName, zoneId, gateway, cidrAddress, cidrSize, ipRange); try { final String endIpFinal = endIp; - Transaction.executeWithException(new TransactionCallbackWithException() { + Transaction.execute(new TransactionCallbackWithExceptionNoReturn() { @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 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio } 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 6f76a3ab8b0..9370218be0c 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.DB; 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 @@ public class DatabaseConfig { final DbConfigXMLHandler handler = new DbConfigXMLHandler(); handler.setParent(this); - Transaction.executeWithException(new TransactionCallbackWithException() { + Transaction.execute(new TransactionCallbackWithExceptionNoReturn() { @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 @@ public class DatabaseConfig { 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 5053a97019e..86f98556c5c 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.TransactionCallbackNoReturn; 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 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir s_logger.debug("Recovering vm " + vmId); } - Transaction.executeWithException(new TransactionCallbackWithException() { + Transaction.execute(new TransactionCallbackWithExceptionNoReturn() { @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 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir //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 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir final ServiceOfferingVO offering, final boolean isIso, final String sshPublicKey, final LinkedHashMap networkNicMap, final long id, final String instanceName, final String uuidName, final HypervisorType hypervisorType) throws InsufficientCapacityException { - return Transaction.executeWithException(new TransactionCallbackWithException() { + return Transaction.execute(new TransactionCallbackWithException() { @Override public UserVmVO doInTransaction(TransactionStatus status) throws InsufficientCapacityException { UserVmVO vm = new UserVmVO(id, instanceName, displayName, @@ -2878,7 +2877,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir 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 18f17b8dd2e..cd064f59667 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.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.utils.fsm.NoTransitionException; @@ -487,9 +488,9 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana @DB protected void processAnswer(final VMSnapshotVO vmSnapshot, UserVmVO userVm, final Answer as, Long hostId) { try { - Transaction.executeWithException(new TransactionCallbackWithException() { + Transaction.execute(new TransactionCallbackWithExceptionNoReturn() { @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 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana 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 1149085d133..e2d33ac1844 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.JoinBuilder; 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 @@ public class ApplicationLoadBalancerManagerImpl extends ManagerBase implements A boolean success = true; ApplicationLoadBalancerRuleVO newRule = null; try { - newRule = Transaction.executeWithException(new TransactionCallbackWithException() { + newRule = Transaction.execute(new TransactionCallbackWithException() { @Override public ApplicationLoadBalancerRuleVO doInTransaction(TransactionStatus status) throws NetworkRuleConflictException { //1) Persist the rule @@ -183,7 +182,7 @@ public class ApplicationLoadBalancerManagerImpl extends ManagerBase implements A return newRule; } - }, NetworkRuleConflictException.class); + }); return newRule; } catch (Exception e) {