diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 10ac8c6d2ff..983a46a54ef 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -1108,7 +1108,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag NetworkVO vo = new NetworkVO(id, network, offering.getId(), guru.getName(), owner.getDomainId(), owner.getId(), related, name, displayText, isDefault, (domainId != null), predefined.getNetworkDomain(), offering.getGuestType(), isShared, plan.getDataCenterId(), plan.getPhysicalNetworkId()); - networks.add(_networksDao.persist(vo, vo.getGuestType() == Network.GuestType.Isolated, getServicesAndProvidersForNetwork(offering))); + networks.add(_networksDao.persist(vo, vo.getGuestType() == Network.GuestType.Isolated, finalizeServicesAndProvidersForNetwork(offering, plan.getPhysicalNetworkId()))); if (domainId != null) { _networksDao.addDomainToNetwork(id, domainId); @@ -1737,9 +1737,6 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag isDomainSpecific = true; } } - - //FIXME - need to check if all providers are supported by the physical network - //FIXME - need to check that the traffic type is supported Account owner = null; if (cmd.getAccountName() != null && cmd.getDomainId() != null) { @@ -1865,7 +1862,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag NetworkOfferingVO networkOffering = _networkOfferingDao.findById(networkOfferingId); DataCenterVO zone = _dcDao.findById(zoneId); - + // allow isDefault to be set only for Shared network if (networkOffering.getGuestType() == Network.GuestType.Isolated) { if (isDefault != null && !isDefault) { @@ -2630,7 +2627,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag if (newNetworkOfferingId != null) { s_logger.debug("Updating network " + network + " with the new network offering id=" + newNetworkOfferingId + " as a part of network restart"); network.setNetworkOfferingId(newNetworkOfferingId); - _networksDao.update(networkId, network); + _networksDao.update(networkId, network, finalizeServicesAndProvidersForNetwork(_configMgr.getNetworkOffering(newNetworkOfferingId), network.getPhysicalNetworkId())); } //implement the network elements and rules again @@ -3324,10 +3321,12 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag //have to restart the network restartNetwork = true; } + + _networksDao.update(networkId, network); - _networksDao.update(networkId, network); boolean success = true; if (restartNetwork && (network.getState() == Network.State.Implemented || network.getState() == Network.State.Setup)) { + //network offering id will be updated in the restartNetowrk call aftet the network elements are shutdown properly s_logger.info("Restarting network " + network + " as a part of update network call"); try { @@ -3341,6 +3340,9 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } else { s_logger.warn("Failed to restart the network " + network + " as a part of updateNetwork call"); } + } else if (networkOfferingId != null) { + network.setNetworkOfferingId(networkOfferingId); + _networksDao.update(networkId, network, finalizeServicesAndProvidersForNetwork(_configMgr.getNetworkOffering(networkOfferingId), network.getPhysicalNetworkId())); } return network; @@ -4851,16 +4853,29 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } } - public Map getServicesAndProvidersForNetwork(NetworkOffering offering) { + public Map finalizeServicesAndProvidersForNetwork(NetworkOffering offering, Long physicalNetworkId) { Map svcProviders = new HashMap(); List servicesMap = _ntwkOfferingSrvcDao.listByNetworkOfferingId(offering.getId()); + boolean checkPhysicalNetwork = (physicalNetworkId != null) ? true : false; + for (NetworkOfferingServiceMapVO serviceMap : servicesMap) { if (svcProviders.containsKey(serviceMap.getService())) { //FIXME - right now we pick up the first provider from the list, need to add more logic based on provider load, etc continue; - } - svcProviders.put(serviceMap.getService(), serviceMap.getProvider()); + } + + String service = serviceMap.getService(); + String provider = serviceMap.getProvider(); + + //check that provider is supported + if (checkPhysicalNetwork) { + if (!_pNSPDao.isServiceProviderEnabled(physicalNetworkId, provider, service)) { + throw new UnsupportedServiceException("Provider " + provider + " doesn't support service " + service + " in physical network id=" + physicalNetworkId); + } + } + + svcProviders.put(service, provider); } return svcProviders; diff --git a/server/src/com/cloud/network/dao/NetworkDao.java b/server/src/com/cloud/network/dao/NetworkDao.java index fd9a8a10b47..f9b60e9e7f8 100644 --- a/server/src/com/cloud/network/dao/NetworkDao.java +++ b/server/src/com/cloud/network/dao/NetworkDao.java @@ -46,7 +46,7 @@ public interface NetworkDao extends GenericDao { @Override @Deprecated NetworkVO persist(NetworkVO vo); - + /** * Retrieves the next available mac address in this network configuration. * @@ -85,4 +85,8 @@ public interface NetworkDao extends GenericDao { List listBy(long accountId, long dataCenterId, Network.GuestType type, TrafficType trafficType); List listByPhysicalNetworkAndProvider(long physicalNetworkId, String providerName); + + void persistNetworkServiceProviders(long networkId, Map serviceProviderMap); + + boolean update(Long networkId, NetworkVO network, Map serviceProviderMap); } diff --git a/server/src/com/cloud/network/dao/NetworkDaoImpl.java b/server/src/com/cloud/network/dao/NetworkDaoImpl.java index 20a72a2b24d..ba42f4cf71d 100644 --- a/server/src/com/cloud/network/dao/NetworkDaoImpl.java +++ b/server/src/com/cloud/network/dao/NetworkDaoImpl.java @@ -198,14 +198,39 @@ public class NetworkDaoImpl extends GenericDaoBase implements N NetworkOpVO op = new NetworkOpVO(network.getId(), gc); _opDao.persist(op); //4) add services/providers for the network - for (String service : serviceProviderMap.keySet()) { - NetworkServiceMapVO serviceMap = new NetworkServiceMapVO(newNetwork.getId(), Service.getService(service), Provider.getProvider(serviceProviderMap.get(service))); - _ntwkSvcMap.persist(serviceMap); - } + persistNetworkServiceProviders(newNetwork.getId(), serviceProviderMap); txn.commit(); return newNetwork; } + + + @Override @DB + public boolean update(Long networkId, NetworkVO network, Map serviceProviderMap) { + Transaction txn = Transaction.currentTxn(); + txn.start(); + + super.update(networkId, network); + if (serviceProviderMap != null) { + _ntwkSvcMap.deleteByNetworkId(networkId); + persistNetworkServiceProviders(networkId, serviceProviderMap); + } + + txn.commit(); + return true; + } + + @Override + @DB + public void persistNetworkServiceProviders(long networkId, Map serviceProviderMap) { + Transaction txn = Transaction.currentTxn(); + txn.start(); + for (String service : serviceProviderMap.keySet()) { + NetworkServiceMapVO serviceMap = new NetworkServiceMapVO(networkId, Service.getService(service), Provider.getProvider(serviceProviderMap.get(service))); + _ntwkSvcMap.persist(serviceMap); + } + txn.commit(); + } protected void addAccountToNetwork(long networkId, long accountId, boolean isOwner) { NetworkAccountVO account = new NetworkAccountVO(networkId, accountId, isOwner); diff --git a/server/src/com/cloud/network/dao/NetworkServiceMapDao.java b/server/src/com/cloud/network/dao/NetworkServiceMapDao.java index a9da728958d..0cfa0419af4 100644 --- a/server/src/com/cloud/network/dao/NetworkServiceMapDao.java +++ b/server/src/com/cloud/network/dao/NetworkServiceMapDao.java @@ -17,4 +17,5 @@ public interface NetworkServiceMapDao extends GenericDao getServicesInNetwork(long networkId); String getProviderForServiceInNetwork(long networkid, Service service); + void deleteByNetworkId(long networkId); } diff --git a/server/src/com/cloud/network/dao/NetworkServiceMapDaoImpl.java b/server/src/com/cloud/network/dao/NetworkServiceMapDaoImpl.java index 20856a7f65c..7295b3f2e54 100644 --- a/server/src/com/cloud/network/dao/NetworkServiceMapDaoImpl.java +++ b/server/src/com/cloud/network/dao/NetworkServiceMapDaoImpl.java @@ -128,8 +128,8 @@ public class NetworkServiceMapDaoImpl extends GenericDaoBase sc = AllFieldsSearch.create(); sc.setParameters("networkId", networkId); remove(sc); diff --git a/server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDao.java b/server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDao.java index 8aab7bf5a52..7fb3a89451a 100644 --- a/server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDao.java +++ b/server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDao.java @@ -25,4 +25,5 @@ public interface PhysicalNetworkServiceProviderDao extends GenericDao listBy(long physicalNetworkId); PhysicalNetworkServiceProviderVO findByServiceProvider(long physicalNetworkId, String providerType); void deleteProviders(long physicalNetworkId); + boolean isServiceProviderEnabled(long physicalNetworkId, String providerType, String serviceType); } diff --git a/server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDaoImpl.java b/server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDaoImpl.java index f60ee6db232..76e314eaa4d 100644 --- a/server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDaoImpl.java +++ b/server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDaoImpl.java @@ -21,6 +21,8 @@ import java.util.List; import javax.ejb.Local; +import com.cloud.network.Network.Service; +import com.cloud.network.PhysicalNetworkServiceProvider; import com.cloud.utils.db.DB; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; @@ -31,6 +33,7 @@ import com.cloud.utils.db.SearchCriteria.Op; public class PhysicalNetworkServiceProviderDaoImpl extends GenericDaoBase implements PhysicalNetworkServiceProviderDao { final SearchBuilder physicalNetworkSearch; final SearchBuilder physicalNetworkServiceProviderSearch; + final SearchBuilder AllFieldsSearch; protected PhysicalNetworkServiceProviderDaoImpl() { super(); @@ -42,6 +45,23 @@ public class PhysicalNetworkServiceProviderDaoImpl extends GenericDaoBase sc = AllFieldsSearch.create(); + sc.setParameters("physicalNetworkId", physicalNetworkId); + sc.setParameters("serviceProvderType", providerType); + sc.setParameters("state", PhysicalNetworkServiceProvider.State.Enabled.toString()); + + if (serviceType.equalsIgnoreCase(Service.Dhcp.getName())) { + sc.setParameters("dhcpService", true); + } else if (serviceType.equalsIgnoreCase(Service.Dns.getName())) { + sc.setParameters("dnsService", true); + }else if (serviceType.equalsIgnoreCase(Service.Firewall.getName())) { + sc.setParameters("firewallService", true); + }else if (serviceType.equalsIgnoreCase(Service.Gateway.getName())) { + sc.setParameters("gatewayService", true); + }else if (serviceType.equalsIgnoreCase(Service.Lb.getName())) { + sc.setParameters("lbService", true); + }else if (serviceType.equalsIgnoreCase(Service.PortForwarding.getName())) { + sc.setParameters("pfService", true); + }else if (serviceType.equalsIgnoreCase(Service.SecurityGroup.getName())) { + sc.setParameters("securityGroupService", true); + }else if (serviceType.equalsIgnoreCase(Service.SourceNat.getName())) { + sc.setParameters("sourceNatService", true); + }else if (serviceType.equalsIgnoreCase(Service.StaticNat.getName())) { + sc.setParameters("staticNatService", true); + }else if (serviceType.equalsIgnoreCase(Service.UserData.getName())) { + sc.setParameters("userDataService", true); + }else if (serviceType.equalsIgnoreCase(Service.Vpn.getName())) { + sc.setParameters("vpnService", true); + } + + PhysicalNetworkServiceProviderVO map = findOneBy(sc); + + if (map != null) { + return true; + } else { + return false; + } + } + }