From 71ead9ef4e5a81908682456eabef58775fca6767 Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Mon, 13 Aug 2012 13:57:29 -0700 Subject: [PATCH] VPC: CS-15925 - when vpc provider is speficied for a new network offering, no other providers can be used Conflicts: server/src/com/cloud/network/NetworkManagerImpl.java server/src/com/cloud/network/vpc/VpcManagerImpl.java server/test/com/cloud/network/MockNetworkManagerImpl.java --- .../ConfigurationManagerImpl.java | 13 ++++ .../src/com/cloud/network/NetworkManager.java | 4 +- .../com/cloud/network/NetworkManagerImpl.java | 4 +- .../src/com/cloud/network/vpc/VpcManager.java | 9 +++ .../com/cloud/network/vpc/VpcManagerImpl.java | 60 ++++++++++++------- .../cloud/network/MockNetworkManagerImpl.java | 19 +++--- .../com/cloud/vpc/MockNetworkManagerImpl.java | 2 +- 7 files changed, 75 insertions(+), 36 deletions(-) diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index 3b07707ef82..f9da08d5947 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -120,6 +120,7 @@ import com.cloud.network.dao.NetworkDao; import com.cloud.network.dao.PhysicalNetworkDao; import com.cloud.network.dao.PhysicalNetworkTrafficTypeDao; import com.cloud.network.dao.PhysicalNetworkTrafficTypeVO; +import com.cloud.network.vpc.VpcManager; import com.cloud.offering.DiskOffering; import com.cloud.offering.NetworkOffering; import com.cloud.offering.NetworkOffering.Availability; @@ -230,6 +231,8 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura NicDao _nicDao; @Inject FirewallRulesDao _firewallDao; + @Inject + VpcManager _vpcMgr; // FIXME - why don't we have interface for DataCenterLinkLocalIpAddressDao? protected static final DataCenterLinkLocalIpAddressDaoImpl _LinkLocalIpAllocDao = ComponentLocator.inject(DataCenterLinkLocalIpAddressDaoImpl.class); @@ -3247,11 +3250,21 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura for (Network.Service service : serviceProviderMap.keySet()) { Set providers = serviceProviderMap.get(service); if (providers != null && !providers.isEmpty()) { + boolean vpcOff = false; for (Network.Provider provider : providers) { + if (provider == Provider.VPCVirtualRouter) { + vpcOff = true; + } NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO(offering.getId(), service, provider); _ntwkOffServiceMapDao.persist(offService); s_logger.trace("Added service for the network offering: " + offService + " with provider " + provider.getName()); } + + if (vpcOff) { + List supportedSvcs = new ArrayList(); + supportedSvcs.addAll(serviceProviderMap.keySet()); + _vpcMgr.validateNtwkOffForVpc(offering, supportedSvcs); + } } else { NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO(offering.getId(), service, null); _ntwkOffServiceMapDao.persist(offService); diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index 7f06d916567..1f803af6a50 100755 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -331,10 +331,10 @@ public interface NetworkManager extends NetworkService { /** - * @param networkId + * @param ntwkOffId * @return */ - List getNtwkOffDistinctProviders(long networkId); + List getNtwkOffDistinctProviders(long ntwkOffId); /** diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index d382e925433..d0897522388 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -7126,8 +7126,8 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } @Override - public List getNtwkOffDistinctProviders(long networkId) { - List providerNames = _ntwkOfferingSrvcDao.getDistinctProviders(networkId); + public List getNtwkOffDistinctProviders(long ntkwOffId) { + List providerNames = _ntwkOfferingSrvcDao.getDistinctProviders(ntkwOffId); List providers = new ArrayList(); for (String providerName : providerNames) { providers.add(Network.Provider.getProvider(providerName)); diff --git a/server/src/com/cloud/network/vpc/VpcManager.java b/server/src/com/cloud/network/vpc/VpcManager.java index c3bae6f038a..553891ceb41 100644 --- a/server/src/com/cloud/network/vpc/VpcManager.java +++ b/server/src/com/cloud/network/vpc/VpcManager.java @@ -26,8 +26,10 @@ import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.IpAddress; import com.cloud.network.Network; +import com.cloud.network.Network.Service; import com.cloud.network.PhysicalNetwork; import com.cloud.network.addr.PublicIp; +import com.cloud.offering.NetworkOffering; import com.cloud.user.Account; import com.cloud.vm.DomainRouterVO; @@ -127,4 +129,11 @@ public interface VpcManager extends VpcService{ */ PublicIp assignSourceNatIpAddressToVpc(Account owner, Vpc vpc) throws InsufficientAddressCapacityException, ConcurrentOperationException; + + /** + * @param guestNtwkOff + * @param supportedSvcs TODO + */ + void validateNtwkOffForVpc(NetworkOffering guestNtwkOff, List supportedSvcs); + } diff --git a/server/src/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/com/cloud/network/vpc/VpcManagerImpl.java index 0612e655218..3d6f930fc9e 100644 --- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java +++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java @@ -961,27 +961,12 @@ public class VpcManagerImpl implements VpcManager, Manager{ //1) Validate attributes that has to be passed in when create new guest network validateNewVpcGuestNetwork(cidr, gateway, networkOwner, vpc, networkDomain); } - - //2) Only Isolated networks with Source nat service enabled can be added to vpc - if (!(guestNtwkOff.getGuestType() == GuestType.Isolated - && _ntwkMgr.areServicesSupportedByNetworkOffering(guestNtwkOff.getId(), Service.SourceNat))) { - - throw new InvalidParameterValueException("Only networks of type " + GuestType.Isolated + " with service " - + Service.SourceNat + " can be added as a part of VPC"); - } - - //3) No redundant router support - if (guestNtwkOff.getRedundantRouter()) { - throw new InvalidParameterValueException("No redunant router support when network belnogs to VPC"); - } - - //4) Conserve mode should be off - if (guestNtwkOff.isConserveMode()) { - throw new InvalidParameterValueException("Only networks with conserve mode Off can belong to VPC"); - } - - //5) Check services/providers against VPC providers + //2) validate network offering attributes + List svcs = _ntwkMgr.listNetworkOfferingServices(guestNtwkOff.getId()); + validateNtwkOffForVpc(guestNtwkOff, svcs); + + //3) Check services/providers against VPC providers List networkProviders = _ntwkOffServiceDao.listByNetworkOfferingId(guestNtwkOff.getId()); for (NetworkOfferingServiceMapVO nSvcVO : networkProviders) { @@ -992,8 +977,8 @@ public class VpcManagerImpl implements VpcManager, Manager{ pr + " is not supported by VPC " + vpc); } } - - //6) Only one network in the VPC can support LB + + //4) Only one network in the VPC can support LB if (_ntwkMgr.areServicesSupportedByNetworkOffering(guestNtwkOff.getId(), Service.Lb)) { List networks = getVpcNetworks(vpc.getId()); for (Network network : networks) { @@ -1010,6 +995,37 @@ public class VpcManagerImpl implements VpcManager, Manager{ } } + @Override + public void validateNtwkOffForVpc(NetworkOffering guestNtwkOff, List supportedSvcs) { + //1) in current release, only vpc provider is supported by Vpc offering + List providers = _ntwkMgr.getNtwkOffDistinctProviders(guestNtwkOff.getId()); + for (Provider provider : providers) { + if (provider != Provider.VPCVirtualRouter) { + throw new InvalidParameterValueException("Only provider of type " + Provider.VPCVirtualRouter.getName() + + " is supported for network offering that can be used in VPC"); + } + } + + //2) Only Isolated networks with Source nat service enabled can be added to vpc + if (!(guestNtwkOff.getGuestType() == GuestType.Isolated + && supportedSvcs.contains(Service.SourceNat))) { + + throw new InvalidParameterValueException("Only network offerings of type " + GuestType.Isolated + " with service " + + Service.SourceNat.getName() + + " are valid for vpc "); + } + + //3) No redundant router support + if (guestNtwkOff.getRedundantRouter()) { + throw new InvalidParameterValueException("No redunant router support when network belnogs to VPC"); + } + + //4) Conserve mode should be off + if (guestNtwkOff.isConserveMode()) { + throw new InvalidParameterValueException("Only networks with conserve mode Off can belong to VPC"); + } + } + @DB protected void validateNewVpcGuestNetwork(String cidr, String gateway, Account networkOwner, Vpc vpc, String networkDomain) { diff --git a/server/test/com/cloud/network/MockNetworkManagerImpl.java b/server/test/com/cloud/network/MockNetworkManagerImpl.java index 78b840e091a..06104c503f6 100755 --- a/server/test/com/cloud/network/MockNetworkManagerImpl.java +++ b/server/test/com/cloud/network/MockNetworkManagerImpl.java @@ -764,14 +764,6 @@ public class MockNetworkManagerImpl implements NetworkManager, Manager, NetworkS return null; } - /* (non-Javadoc) - * @see com.cloud.network.NetworkManager#getNtwkOffDistinctProviders(long) - */ - @Override - public List getNtwkOffDistinctProviders(long networkId) { - // TODO Auto-generated method stub - return null; - } /* (non-Javadoc) * @see com.cloud.network.NetworkManager#allocateNic(com.cloud.vm.NicProfile, com.cloud.network.Network, java.lang.Boolean, int, com.cloud.vm.VirtualMachineProfile) @@ -888,7 +880,7 @@ public class MockNetworkManagerImpl implements NetworkManager, Manager, NetworkS * @see com.cloud.network.NetworkManager#getDefaultUniqueProviderForService(java.lang.String) */ @Override - public Provider getDefaultUniqueProviderForService(String serviceName) { + public List getNtwkOffDistinctProviders(long ntwkOffId) { // TODO Auto-generated method stub return null; } @@ -1136,4 +1128,13 @@ public class MockNetworkManagerImpl implements NetworkManager, Manager, NetworkS // TODO Auto-generated method stub return null; } + + /* (non-Javadoc) + * @see com.cloud.network.NetworkManager#getDefaultUniqueProviderForService(java.lang.String) + */ + @Override + public Provider getDefaultUniqueProviderForService(String serviceName) { + // TODO Auto-generated method stub + return null; + } } diff --git a/server/test/com/cloud/vpc/MockNetworkManagerImpl.java b/server/test/com/cloud/vpc/MockNetworkManagerImpl.java index f6ad27b67f8..2dc2c16bc04 100644 --- a/server/test/com/cloud/vpc/MockNetworkManagerImpl.java +++ b/server/test/com/cloud/vpc/MockNetworkManagerImpl.java @@ -1294,7 +1294,7 @@ public class MockNetworkManagerImpl implements NetworkManager, Manager{ * @see com.cloud.network.NetworkManager#getNtwkOffDistinctProviders(long) */ @Override - public List getNtwkOffDistinctProviders(long networkId) { + public List getNtwkOffDistinctProviders(long ntwkOffId) { // TODO Auto-generated method stub return null; }