From 3ef9f27c6685af4c6d7b77831cf1272e29069ffb 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 --- .../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 | 56 ++++++++++++------- .../cloud/network/MockNetworkManagerImpl.java | 2 +- .../com/cloud/vpc/MockNetworkManagerImpl.java | 2 +- 7 files changed, 64 insertions(+), 26 deletions(-) diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index f123a639e2c..61bcdc30596 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -116,6 +116,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; @@ -227,6 +228,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); @@ -3295,11 +3298,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 7ddb6d9212b..90de281f8ab 100755 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -325,10 +325,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 4381162781f..6ccfe9f226c 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -7128,8 +7128,8 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } @Override - public List getNtwkOffDistinctProviders(long networkId) { - List providerNames = _ntwkOfferingSrvcDao.getDistinctProviders(networkId); + public List getNtwkOffDistinctProviders(long ntwkOffId) { + List providerNames = _ntwkOfferingSrvcDao.getDistinctProviders(ntwkOffId); Map providers = new HashMap(); for (String providerName : providerNames) { if(!providers.containsKey(providerName)){ diff --git a/server/src/com/cloud/network/vpc/VpcManager.java b/server/src/com/cloud/network/vpc/VpcManager.java index 04e011c8445..469fab1f74a 100644 --- a/server/src/com/cloud/network/vpc/VpcManager.java +++ b/server/src/com/cloud/network/vpc/VpcManager.java @@ -22,8 +22,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; @@ -126,4 +128,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 8a568ce9512..4e8a7466ffe 100644 --- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java +++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java @@ -956,26 +956,11 @@ public class VpcManagerImpl implements VpcManager, Manager{ 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))) { + //2) validate network offering attributes + List svcs = _ntwkMgr.listNetworkOfferingServices(guestNtwkOff.getId()); + validateNtwkOffForVpc(guestNtwkOff, svcs); - throw new InvalidParameterValueException("Only networks of type " + GuestType.Isolated + " with service " - + Service.SourceNat.getName() + - " can be added as a part of VPC ", null); - } - - //3) No redundant router support - if (guestNtwkOff.getRedundantRouter()) { - throw new InvalidParameterValueException("No redunant router support when network belnogs to VPC", null); - } - - //4) Conserve mode should be off - if (guestNtwkOff.isConserveMode()) { - throw new InvalidParameterValueException("Only networks with conserve mode Off can belong to VPC", null); - } - - //5) Check services/providers against VPC providers + //3) Check services/providers against VPC providers List networkProviders = _ntwkOffServiceDao.listByNetworkOfferingId(guestNtwkOff.getId()); for (NetworkOfferingServiceMapVO nSvcVO : networkProviders) { @@ -989,7 +974,7 @@ public class VpcManagerImpl implements VpcManager, Manager{ } } - //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) { @@ -1008,6 +993,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", null); + } + } + + //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 ", null); + } + + //3) No redundant router support + if (guestNtwkOff.getRedundantRouter()) { + throw new InvalidParameterValueException("No redunant router support when network belnogs to VPC", null); + } + + //4) Conserve mode should be off + if (guestNtwkOff.isConserveMode()) { + throw new InvalidParameterValueException("Only networks with conserve mode Off can belong to VPC", null); + } + } + @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 80fa5da8734..5062d1656d9 100755 --- a/server/test/com/cloud/network/MockNetworkManagerImpl.java +++ b/server/test/com/cloud/network/MockNetworkManagerImpl.java @@ -901,7 +901,7 @@ public class MockNetworkManagerImpl implements NetworkManager, Manager, NetworkS * @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; } diff --git a/server/test/com/cloud/vpc/MockNetworkManagerImpl.java b/server/test/com/cloud/vpc/MockNetworkManagerImpl.java index d33f8b4333c..7dde2ccfa1c 100644 --- a/server/test/com/cloud/vpc/MockNetworkManagerImpl.java +++ b/server/test/com/cloud/vpc/MockNetworkManagerImpl.java @@ -1312,7 +1312,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; }