From 435e178eefebb2f2f1f7b94f683f0f319f7168de Mon Sep 17 00:00:00 2001 From: keshav Date: Wed, 11 May 2011 15:33:59 -0700 Subject: [PATCH] Added a new service to enabled zone-wide, shared source NAT rules. --- api/src/com/cloud/network/Network.java | 1 + .../com/cloud/offering/NetworkOffering.java | 2 ++ .../com/cloud/network/NetworkManagerImpl.java | 24 +++++++++++-------- .../cloud/offerings/NetworkOfferingVO.java | 12 ++++++++++ setup/db/create-schema.sql | 1 + 5 files changed, 30 insertions(+), 10 deletions(-) diff --git a/api/src/com/cloud/network/Network.java b/api/src/com/cloud/network/Network.java index 6c8be2b21f3..b531fd254ad 100644 --- a/api/src/com/cloud/network/Network.java +++ b/api/src/com/cloud/network/Network.java @@ -93,6 +93,7 @@ public interface Network extends ControlledEntity { public static final Provider F5BigIp = new Provider("F5BigIp"); public static final Provider ExternalDhcpServer = new Provider("ExternalDhcpServer"); public static final Provider ExternalGateWay = new Provider("ExternalGateWay"); + public static final Provider None = new Provider("None"); private String name; diff --git a/api/src/com/cloud/offering/NetworkOffering.java b/api/src/com/cloud/offering/NetworkOffering.java index e3ca034d9ef..e43d21e4466 100644 --- a/api/src/com/cloud/offering/NetworkOffering.java +++ b/api/src/com/cloud/offering/NetworkOffering.java @@ -95,6 +95,8 @@ public interface NetworkOffering { boolean isVpnService(); boolean isDhcpService(); + + boolean isSharedSourceNatService(); GuestIpType getGuestType(); } diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 16c09b3e417..2a7c24235a7 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -560,11 +560,15 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag boolean isSourceNat = false; txn.start(); - // First IP address should be source nat when it's being associated with Guest Virtual network - List addrs = listPublicIpAddressesInVirtualNetwork(ownerId, zoneId, true, networkId); + + NetworkOfferingVO offering = _networkOfferingDao.findById(network.getNetworkOfferingId()); + if (!offering.isSharedSourceNatService()) { + // First IP address should be source nat when it's being associated with Guest Virtual network + List addrs = listPublicIpAddressesInVirtualNetwork(ownerId, zoneId, true, networkId); - if (addrs.isEmpty() && network.getGuestType() == GuestIpType.Virtual) { - isSourceNat = true; + if (addrs.isEmpty() && network.getGuestType() == GuestIpType.Virtual) { + isSourceNat = true; + } } ip = fetchNewPublicIp(zoneId, null, null, ipOwner, VlanType.VirtualNetwork, network.getId(), isSourceNat, false); @@ -1119,8 +1123,9 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag network.setMode(result.getMode()); _networksDao.update(networkId, network); - // If network if guest virtual and there is no source nat ip, associate a new one - if (network.getGuestType() == GuestIpType.Virtual) { + // If this is a guest virtual network and the network offering does not support a shared source NAT rule, + // associate a source NAT IP (if one isn't already associated with the network) + if (network.getGuestType() == GuestIpType.Virtual && !offering.isSharedSourceNatService()) { List ips = _ipAddressDao.listByAssociatedNetwork(networkId, true); if (ips.isEmpty()) { @@ -2618,11 +2623,10 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag DataCenterVO zone = _dcDao.findById(zoneId); if (zone.getNetworkType() == NetworkType.Advanced) { - return (zone.getGatewayProvider() != null && zone.getGatewayProvider().equals(Network.Provider.JuniperSRX.getName()) && zone.getFirewallProvider() != null - && zone.getFirewallProvider().equals(Network.Provider.JuniperSRX.getName()) && zone.getLoadBalancerProvider() != null && zone.getLoadBalancerProvider().equals( - Network.Provider.F5BigIp.getName())); + return (zone.getGatewayProvider() != null && zone.getGatewayProvider().equals(Network.Provider.JuniperSRX.getName()) && + zone.getFirewallProvider() != null && zone.getGatewayProvider().equals(Network.Provider.JuniperSRX.getName())); } else { - return (zone.getFirewallProvider() != null && zone.getFirewallProvider().equals(Network.Provider.JuniperSRX.getName())); + return (zone.getFirewallProvider() != null && zone.getFirewallProvider().equals(Network.Provider.JuniperSRX.getName())); } } diff --git a/server/src/com/cloud/offerings/NetworkOfferingVO.java b/server/src/com/cloud/offerings/NetworkOfferingVO.java index 0a38a003216..03065524413 100644 --- a/server/src/com/cloud/offerings/NetworkOfferingVO.java +++ b/server/src/com/cloud/offerings/NetworkOfferingVO.java @@ -107,6 +107,9 @@ public class NetworkOfferingVO implements NetworkOffering { @Column(name="dhcp_service") boolean dhcpService; + @Column(name="shared_source_nat_service") + boolean sharedSourceNatService; + @Column(name="guest_type") GuestIpType guestType; @@ -296,6 +299,15 @@ public class NetworkOfferingVO implements NetworkOffering { this.dhcpService = dhcpService; } + @Override + public boolean isSharedSourceNatService() { + return sharedSourceNatService; + } + + public void setSharedSourceNatService(boolean sharedSourceNatService) { + this.sharedSourceNatService = sharedSourceNatService; + } + @Override public GuestIpType getGuestType() { return guestType; diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index 1e5eb28ece4..ae89dcad923 100755 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -253,6 +253,7 @@ CREATE TABLE `cloud`.`network_offerings` ( `userdata_service` int(1) unsigned NOT NULL DEFAULT 0 COMMENT 'true if network offering provides user data service', `vpn_service` int(1) unsigned NOT NULL DEFAULT 0 COMMENT 'true if network offering provides vpn service', `dhcp_service` int(1) unsigned NOT NULL DEFAULT 0 COMMENT 'true if network offering provides dhcp service', + `shared_source_nat_service` int(1) unsigned NOT NULL DEFAULT 0 COMMENT 'true if the network offering provides the shared source nat service', `guest_type` char(32) COMMENT 'guest ip type of network offering', PRIMARY KEY (`id`), INDEX `i_network_offerings__removed`(`removed`)