From a2619b902f69670ac79cd6444404b8c8c23e23a7 Mon Sep 17 00:00:00 2001 From: alena Date: Thu, 24 Mar 2011 14:23:35 -0700 Subject: [PATCH] AssociateIPAddress - first IP associated with the network should always be a source nat --- .../src/com/cloud/network/NetworkManager.java | 3 ++- .../com/cloud/network/NetworkManagerImpl.java | 20 ++++++++++++++++--- .../VirtualNetworkApplianceManagerImpl.java | 2 +- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index ed67b720ef8..51b77317809 100644 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -93,9 +93,10 @@ public interface NetworkManager extends NetworkService { * @param accountId - account that the IP address should belong to * @param dcId - zone that the IP address should belong to * @param sourceNat - (optional) true if the IP address should be a source NAT address + * @param associatedNetworkId TODO * @return - list of IP addresses */ - List listPublicIpAddressesInVirtualNetwork(long accountId, long dcId, Boolean sourceNat); + List listPublicIpAddressesInVirtualNetwork(long accountId, long dcId, Boolean sourceNat, Long associatedNetworkId); List setupNetwork(Account owner, NetworkOfferingVO offering, DeploymentPlan plan, String name, String displayText, boolean isShared, boolean isDefault) throws ConcurrentOperationException; List setupNetwork(Account owner, NetworkOfferingVO offering, Network predefined, DeploymentPlan plan, String name, String displayText, boolean isShared, boolean isDefault, boolean errorIfAlreadySetup, Long domainId) throws ConcurrentOperationException; diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index d009babb230..35ad101ff90 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -333,7 +333,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } IPAddressVO sourceNat = null; - List addrs = listPublicIpAddressesInVirtualNetwork(ownerId, dcId, null); + List addrs = listPublicIpAddressesInVirtualNetwork(ownerId, dcId, null, network.getId()); if (addrs.size() == 0) { // Check that the maximum number of public IPs for the given accountId will not be exceeded if (_accountMgr.resourceLimitExceeded(owner, ResourceType.public_ip)) { @@ -544,9 +544,18 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag rae.setResourceType("ip"); throw rae; } + + boolean isSourceNat = false; txn.start(); - ip = fetchNewPublicIp(zoneId, null, null, ipOwner, VlanType.VirtualNetwork, network.getId(), false, false); + //First IP address should be source nat + List addrs = listPublicIpAddressesInVirtualNetwork(ownerId, zoneId, true, networkId); + + if (addrs.isEmpty()) { + isSourceNat = true; + } + + ip = fetchNewPublicIp(zoneId, null, null, ipOwner, VlanType.VirtualNetwork, network.getId(), isSourceNat, false); if (ip == null) { throw new InsufficientAddressCapacityException("Unable to find available public IP addresses", DataCenter.class, zoneId); @@ -758,6 +767,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag IpAddressSearch = _ipAddressDao.createSearchBuilder(); IpAddressSearch.and("accountId", IpAddressSearch.entity().getAllocatedToAccountId(), Op.EQ); IpAddressSearch.and("dataCenterId", IpAddressSearch.entity().getDataCenterId(), Op.EQ); + IpAddressSearch.and("associatedWithNetworkId", IpAddressSearch.entity().getAssociatedWithNetworkId(), Op.EQ); SearchBuilder virtualNetworkVlanSB = _vlanDao.createSearchBuilder(); virtualNetworkVlanSB.and("vlanType", virtualNetworkVlanSB.entity().getVlanType(), Op.EQ); IpAddressSearch.join("virtualNetworkVlanSB", virtualNetworkVlanSB, IpAddressSearch.entity().getVlanId(), virtualNetworkVlanSB.entity().getId(), JoinBuilder.JoinType.INNER); @@ -797,10 +807,14 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } @Override - public List listPublicIpAddressesInVirtualNetwork(long accountId, long dcId, Boolean sourceNat) { + public List listPublicIpAddressesInVirtualNetwork(long accountId, long dcId, Boolean sourceNat, Long associatedNetworkId) { SearchCriteria sc = IpAddressSearch.create(); sc.setParameters("accountId", accountId); sc.setParameters("dataCenterId", dcId); + if (associatedNetworkId != null) { + sc.setParameters("associatedWithNetworkId", associatedNetworkId); + } + if (sourceNat != null) { sc.addAnd("sourceNat", SearchCriteria.Op.EQ, sourceNat); } diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index aacc63ce634..93e38226b1f 100644 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -1006,7 +1006,7 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian long zoneId = router.getDataCenterId(); - final List userIps = _networkMgr.listPublicIpAddressesInVirtualNetwork(ownerId, zoneId, null); + final List userIps = _networkMgr.listPublicIpAddressesInVirtualNetwork(ownerId, zoneId, null, null); List publicIps = new ArrayList(); if (userIps != null && !userIps.isEmpty()) { for (IPAddressVO userIp : userIps) {