From 45c7ad63bf9ea9b0e705de5818275be827fb4bac Mon Sep 17 00:00:00 2001 From: prachi Date: Wed, 21 Mar 2012 16:34:47 -0700 Subject: [PATCH] Bug 14299 - Fix adding public ip range per account Changes: Fixed as described in the bug. * CreateVlanIpRangeCmd still accept account/domainId info * if account owns: - one Isolated network with source nat service enabled, use this network - more than one Isolated network with source nat service enabled - error out - none Isolated networks with source nat service enabled, create it only in case when there is an Isolated network offering with Availability=Required and source nat service enabled. --- api/src/com/cloud/network/NetworkService.java | 2 ++ .../com/cloud/network/NetworkManagerImpl.java | 36 +++++++++++++------ .../src/com/cloud/network/dao/NetworkDao.java | 3 ++ .../com/cloud/network/dao/NetworkDaoImpl.java | 21 +++++++++++ 4 files changed, 52 insertions(+), 10 deletions(-) diff --git a/api/src/com/cloud/network/NetworkService.java b/api/src/com/cloud/network/NetworkService.java index c4be2177545..a184663f8e2 100755 --- a/api/src/com/cloud/network/NetworkService.java +++ b/api/src/com/cloud/network/NetworkService.java @@ -133,4 +133,6 @@ public interface NetworkService { List> listTrafficTypeImplementor(ListTrafficTypeImplementorsCmd cmd); + List getIsolatedNetworksWithSourceNATOwnedByAccountInZone(long zoneId, Account owner); + } diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 8f51cde3f25..60a49b95567 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -954,6 +954,12 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag return _networksDao.listBy(owner.getId(), zoneId, Network.GuestType.Isolated); } + + @Override + public List getIsolatedNetworksWithSourceNATOwnedByAccountInZone(long zoneId, Account owner) { + + return _networksDao.listSourceNATEnabledNetworks(owner.getId(), zoneId, Network.GuestType.Isolated); + } @Override @DB @@ -3654,24 +3660,34 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag txn.start(); if (network == null) { - List networks = getIsolatedNetworksOwnedByAccountInZone(zoneId, owner); + List networks = getIsolatedNetworksWithSourceNATOwnedByAccountInZone(zoneId, owner); if (networks.size() == 0) { createNetwork = true; - } else { + } else if (networks.size() == 1) { network = 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 for the user if it doesn't exist + // create new Virtual network (Isolated with SourceNAT) for the user if it doesn't exist if (createNetwork) { - List offerings = _configMgr.listNetworkOfferings(TrafficType.Guest, false); + 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"); + } PhysicalNetwork physicalNetwork = translateZoneIdToPhysicalNetwork(zoneId); - network = createGuestNetwork(offerings.get(0).getId(), owner.getAccountName() + "-network", owner.getAccountName() + "-network", null, null, null, null, owner, false, null, physicalNetwork, zoneId, - ACLType.Account, null); - - if (network == null) { - s_logger.warn("Failed to create default Virtual network for the account " + accountId + "in zone " + zoneId); - return false; + + if (requiredOfferings.get(0).getState() == NetworkOffering.State.Enabled) { + s_logger.debug("Creating network for account " + owner + " from the network offering id=" + requiredOfferings.get(0).getId() + " as a part of createVlanIpRange process"); + network = createGuestNetwork(requiredOfferings.get(0).getId(), owner.getAccountName() + "-network", owner.getAccountName() + "-network", null, null, null, null, owner, false, null, physicalNetwork, zoneId, + ACLType.Account, null); + if (network == 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); } } diff --git a/server/src/com/cloud/network/dao/NetworkDao.java b/server/src/com/cloud/network/dao/NetworkDao.java index f918e3bd59a..f3c13f0cea5 100644 --- a/server/src/com/cloud/network/dao/NetworkDao.java +++ b/server/src/com/cloud/network/dao/NetworkDao.java @@ -21,6 +21,7 @@ import java.util.List; import java.util.Map; import com.cloud.network.Network; +import com.cloud.network.Network.GuestType; import com.cloud.network.NetworkAccountVO; import com.cloud.network.NetworkVO; import com.cloud.network.Networks.TrafficType; @@ -98,4 +99,6 @@ public interface NetworkDao extends GenericDao { long countNetworksUserCanCreate(long ownerId); + List listSourceNATEnabledNetworks(long accountId, long dataCenterId, GuestType type); + } diff --git a/server/src/com/cloud/network/dao/NetworkDaoImpl.java b/server/src/com/cloud/network/dao/NetworkDaoImpl.java index 2077883ad45..03b174a197e 100644 --- a/server/src/com/cloud/network/dao/NetworkDaoImpl.java +++ b/server/src/com/cloud/network/dao/NetworkDaoImpl.java @@ -66,6 +66,7 @@ public class NetworkDaoImpl extends GenericDaoBase implements N final SearchBuilder SecurityGroupSearch; final GenericSearchBuilder NetworksRegularUserCanCreateSearch; private final GenericSearchBuilder NetworksCount; + final SearchBuilder SourceNATSearch; NetworkAccountDaoImpl _accountsDao = ComponentLocator.inject(NetworkAccountDaoImpl.class); @@ -164,6 +165,15 @@ public class NetworkDaoImpl extends GenericDaoBase implements N NetworksRegularUserCanCreateSearch.done(); _tgMacAddress = _tgs.get("macAddress"); + + SourceNATSearch = createSearchBuilder(); + SourceNATSearch.and("account", SourceNATSearch.entity().getAccountId(), Op.EQ); + SourceNATSearch.and("datacenter", SourceNATSearch.entity().getDataCenterId(), Op.EQ); + SourceNATSearch.and("guestType", SourceNATSearch.entity().getGuestType(), Op.EQ); + SearchBuilder join6 = _ntwkSvcMap.createSearchBuilder(); + join6.and("service", join6.entity().getService(), Op.EQ); + SourceNATSearch.join("services", join6, SourceNATSearch.entity().getId(), join6.entity().getNetworkId(), JoinBuilder.JoinType.INNER); + SourceNATSearch.done(); } @@ -442,5 +452,16 @@ public class NetworkDaoImpl extends GenericDaoBase implements N sc.setJoinParameters("ntwkOff", "specifyVlan", false); return customSearch(sc, null).get(0); } + + + @Override + public List listSourceNATEnabledNetworks(long accountId, long dataCenterId, Network.GuestType type) { + SearchCriteria sc = SourceNATSearch.create(); + sc.setParameters("datacenter", dataCenterId); + sc.setParameters("account", accountId); + sc.setParameters("guestType", type); + sc.setJoinParameters("services", "service", Service.SourceNat.getName()); + return listBy(sc); + } }