diff --git a/api/src/com/cloud/network/Network.java b/api/src/com/cloud/network/Network.java index fceff7848f4..1b2929d0a5c 100644 --- a/api/src/com/cloud/network/Network.java +++ b/api/src/com/cloud/network/Network.java @@ -27,7 +27,6 @@ import java.util.List; import java.util.Set; import com.cloud.acl.ControlledEntity; -import com.cloud.acl.ControlledEntity.ACLType; import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.Mode; import com.cloud.network.Networks.TrafficType; diff --git a/server/src/com/cloud/network/ExternalFirewallDeviceManagerImpl.java b/server/src/com/cloud/network/ExternalFirewallDeviceManagerImpl.java index e3cbf23c0fe..a10ee077988 100644 --- a/server/src/com/cloud/network/ExternalFirewallDeviceManagerImpl.java +++ b/server/src/com/cloud/network/ExternalFirewallDeviceManagerImpl.java @@ -77,9 +77,9 @@ import com.cloud.network.dao.PhysicalNetworkServiceProviderDao; import com.cloud.network.dao.PhysicalNetworkServiceProviderVO; import com.cloud.network.dao.VpnUserDao; import com.cloud.network.rules.FirewallRule; +import com.cloud.network.rules.FirewallRule.Purpose; import com.cloud.network.rules.PortForwardingRule; import com.cloud.network.rules.StaticNatRule; -import com.cloud.network.rules.FirewallRule.Purpose; import com.cloud.network.rules.dao.PortForwardingRulesDao; import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.resource.ResourceManager; @@ -99,9 +99,9 @@ import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.net.NetUtils; import com.cloud.utils.net.UrlUtil; -import com.cloud.vm.NicVO; import com.cloud.vm.Nic.ReservationStrategy; import com.cloud.vm.Nic.State; +import com.cloud.vm.NicVO; import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.NicDao; diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index 8eee8dbbc2f..9945125a07b 100644 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -227,7 +227,7 @@ public interface NetworkManager extends NetworkService { boolean isProviderEnabled(PhysicalNetworkServiceProvider provider); - boolean isProviderAvailable(long physicalNetowrkId, String providerName); + boolean isProviderExistAndEnabled(long physicalNetowrkId, String providerName); boolean isServiceEnabledInNetwork(long physicalNetworkId, long networkId, Service service); diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 815bd03045a..501362f14f4 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -1409,12 +1409,21 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag assignSourceNatIpAddress(owner, network, context.getCaller().getId()); } } - + + //get providers to implement + List providersToImplement = getNetworkProviders(network.getId()); for (NetworkElement element : _networkElements) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Asking " + element.getName() + " to implemenet " + network); - } - element.implement(network, offering, dest, context); + if (providersToImplement.contains(element.getProvider())) { + if (!isProviderExistAndEnabled(getPhysicalNetworkId(network), "VirtualRouter")) { + throw new CloudRuntimeException("Service provider " + element.getProvider().getName() + " either doesn't exist or not enabled in physical network id=" + network.getPhysicalNetworkId()); + } + if (s_logger.isDebugEnabled()) { + s_logger.debug("Asking " + element.getName() + " to implemenet " + network); + } + if (!element.implement(network, offering, dest, context)) { + throw new CloudRuntimeException("Failed to implement provider " + element.getProvider().getName() + " for network " + network); + } + } } // reapply all the firewall/staticNat/lb rules @@ -2408,24 +2417,34 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } //2) Shutdown all the network elements + //get providers to implement + List providersToImplement = getNetworkProviders(network.getId()); boolean success = true; for (NetworkElement element : _networkElements) { - try { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Sending network shutdown to " + element.getName()); + if (providersToImplement.contains(element.getProvider())) { + try { + if (!isProviderExistAndEnabled(getPhysicalNetworkId(network), "VirtualRouter")) { + s_logger.warn("Unable to complete shutdown of the network elements due to element: " + element.getName() + " either doesn't exist or not enabled in the physical network " + getPhysicalNetworkId(network)); + success = false; + } + if (s_logger.isDebugEnabled()) { + s_logger.debug("Sending network shutdown to " + element.getName()); + } + if (!element.shutdown(network, context, cleanupElements)) { + s_logger.warn("Unable to complete shutdown of the network elements due to element: " + element.getName()); + success = false; + } + } catch (ResourceUnavailableException e) { + s_logger.warn("Unable to complete shutdown of the network elements due to element: " + element.getName(), e); + success = false; + } catch (ConcurrentOperationException e) { + s_logger.warn("Unable to complete shutdown of the network elements due to element: " + element.getName(), e); + success = false; + } catch (Exception e) { + s_logger.warn("Unable to complete shutdown of the network elements due to element: " + element.getName(), e); + success = false; } - - element.shutdown(network, context, cleanupElements); - } catch (ResourceUnavailableException e) { - s_logger.warn("Unable to complete shutdown of the network due to element: " + element.getName(), e); - success = false; - } catch (ConcurrentOperationException e) { - s_logger.warn("Unable to complete shutdown of the network due to element: " + element.getName(), e); - success = false; - } catch (Exception e) { - s_logger.warn("Unable to complete shutdown of the network due to element: " + element.getName(), e); - success = false; - } + } } return success; } @@ -4855,8 +4874,12 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } @Override - public boolean isProviderAvailable(long physicalNetowrkId, String providerName) { + public boolean isProviderExistAndEnabled(long physicalNetowrkId, String providerName) { PhysicalNetworkServiceProviderVO ntwkSvcProvider = _pNSPDao.findByServiceProvider(physicalNetowrkId, providerName); + if (ntwkSvcProvider == null) { + s_logger.warn("Unable to find provider " + providerName + " in physical network id=" + physicalNetowrkId); + return false; + } return isProviderEnabled(ntwkSvcProvider); } @@ -4871,7 +4894,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag //get provider for the service and check if all of them are supported String provider = _ntwkSrvcDao.getProviderForServiceInNetwork(networkId, service); - if (!isProviderAvailable(physicalNetworkId, provider)) { + if (!isProviderExistAndEnabled(physicalNetworkId, provider)) { s_logger.debug("Provider " + provider + " is not enabled in physical network id=" + physicalNetworkId); return false; } @@ -4991,4 +5014,14 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag public boolean getAllowSubdomainAccessGlobal() { return _allowSubdomainNetworkAccess; } + + public List getNetworkProviders(long networkId) { + List providerNames = _ntwkSrvcDao.getDistinctProviders(networkId); + List providers = new ArrayList(); + for (String providerName : providerNames) { + providers.add(Network.Provider.getProvider(providerName)); + } + + return providers; + } } diff --git a/server/src/com/cloud/network/dao/NetworkServiceMapDao.java b/server/src/com/cloud/network/dao/NetworkServiceMapDao.java index 0cfa0419af4..565a43a3d50 100644 --- a/server/src/com/cloud/network/dao/NetworkServiceMapDao.java +++ b/server/src/com/cloud/network/dao/NetworkServiceMapDao.java @@ -18,4 +18,5 @@ public interface NetworkServiceMapDao extends GenericDao getServicesInNetwork(long networkId); String getProviderForServiceInNetwork(long networkid, Service service); void deleteByNetworkId(long networkId); + List getDistinctProviders(long networkId); } diff --git a/server/src/com/cloud/network/dao/NetworkServiceMapDaoImpl.java b/server/src/com/cloud/network/dao/NetworkServiceMapDaoImpl.java index 7295b3f2e54..e1112d07e02 100644 --- a/server/src/com/cloud/network/dao/NetworkServiceMapDaoImpl.java +++ b/server/src/com/cloud/network/dao/NetworkServiceMapDaoImpl.java @@ -29,13 +29,16 @@ import com.cloud.network.Network.Service; import com.cloud.network.NetworkServiceMapVO; import com.cloud.utils.db.DB; import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.GenericSearchBuilder; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.SearchCriteria.Func; @Local(value=NetworkServiceMapDao.class) @DB(txn=false) public class NetworkServiceMapDaoImpl extends GenericDaoBase implements NetworkServiceMapDao { final SearchBuilder AllFieldsSearch; final SearchBuilder MultipleServicesSearch; + final GenericSearchBuilder DistinctProvidersSearch; protected NetworkServiceMapDaoImpl() { super(); @@ -50,6 +53,12 @@ public class NetworkServiceMapDaoImpl extends GenericDaoBase getDistinctProviders(long networkId) { + SearchCriteria sc = DistinctProvidersSearch.create(); + sc.setParameters("networkId", networkId); + List results = customSearch(sc, null); + return results; + } + } diff --git a/server/src/com/cloud/network/element/VirtualRouterElement.java b/server/src/com/cloud/network/element/VirtualRouterElement.java index 79044acd217..31d5f5e2c61 100644 --- a/server/src/com/cloud/network/element/VirtualRouterElement.java +++ b/server/src/com/cloud/network/element/VirtualRouterElement.java @@ -104,7 +104,7 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl @Inject VirtualRouterProviderDao _vrProviderDao; protected boolean canHandle(Network network, Service service) { - if (!_networkMgr.isProviderAvailable(_networkMgr.getPhysicalNetworkId(network), "VirtualRouter")) { + if (!_networkMgr.isProviderExistAndEnabled(_networkMgr.getPhysicalNetworkId(network), "VirtualRouter")) { return false; } @@ -120,9 +120,6 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl if (offering.isSystemOnly()) { return false; } - if (!_networkMgr.isProviderAvailable(_networkMgr.getPhysicalNetworkId(network), "VirtualRouter")) { - return false; - } Map params = new HashMap(1); params.put(VirtualMachineProfile.Param.ReProgramNetwork, true); @@ -139,7 +136,7 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl if (offering.isSystemOnly()) { return false; } - if (!_networkMgr.isProviderAvailable(_networkMgr.getPhysicalNetworkId(network), "VirtualRouter")) { + if (!_networkMgr.isProviderExistAndEnabled(_networkMgr.getPhysicalNetworkId(network), "VirtualRouter")) { return false; } diff --git a/server/test/com/cloud/network/MockNetworkManagerImpl.java b/server/test/com/cloud/network/MockNetworkManagerImpl.java index 3b79fc3e9ae..fd4a9919ebe 100755 --- a/server/test/com/cloud/network/MockNetworkManagerImpl.java +++ b/server/test/com/cloud/network/MockNetworkManagerImpl.java @@ -626,7 +626,7 @@ public class MockNetworkManagerImpl implements NetworkManager, Manager, NetworkS } @Override - public boolean isProviderAvailable(long physicalNetowrkId, String providerName) { + public boolean isProviderExistAndEnabled(long physicalNetowrkId, String providerName) { // TODO Auto-generated method stub return false; }