diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index 923d7846b6f..6468a7bebf7 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -3561,6 +3561,13 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura if (offering.isDefault() == true) { throw new InvalidParameterValueException("Default network offering can't be deleted"); } + + //don't allow to delete network offering if it's in use by existing networks (the offering can be disabled though) + int networkCount = _networkDao.getNetworkCountByNetworkOffId(offeringId); + if (networkCount > 0) { + throw new InvalidParameterValueException("Can't delete network offering " + offeringId + " as its used by " + networkCount + " networks. " + + "To make the network offering unavaiable, disable it"); + } if (_networkOfferingDao.remove(offeringId)) { return true; diff --git a/server/src/com/cloud/network/dao/NetworkDao.java b/server/src/com/cloud/network/dao/NetworkDao.java index 9990d350a83..561b48c8d54 100644 --- a/server/src/com/cloud/network/dao/NetworkDao.java +++ b/server/src/com/cloud/network/dao/NetworkDao.java @@ -93,5 +93,7 @@ public interface NetworkDao extends GenericDao { List listByZoneAndTrafficType(long zoneId, TrafficType trafficType); void setCheckForGc(long networkId); + + int getNetworkCountByNetworkOffId(long networkOfferingId); } diff --git a/server/src/com/cloud/network/dao/NetworkDaoImpl.java b/server/src/com/cloud/network/dao/NetworkDaoImpl.java index fac6128d7c8..080307bcb4b 100644 --- a/server/src/com/cloud/network/dao/NetworkDaoImpl.java +++ b/server/src/com/cloud/network/dao/NetworkDaoImpl.java @@ -60,13 +60,16 @@ public class NetworkDaoImpl extends GenericDaoBase implements N final SearchBuilder ZoneSecurityGroupSearch; final GenericSearchBuilder CountByOfferingId; final SearchBuilder PhysicalNetworkSearch; - final SearchBuilder securityGroupSearch; + final SearchBuilder SecurityGroupSearch; + private final GenericSearchBuilder NetworksCount; + NetworkAccountDaoImpl _accountsDao = ComponentLocator.inject(NetworkAccountDaoImpl.class); NetworkDomainDaoImpl _domainsDao = ComponentLocator.inject(NetworkDomainDaoImpl.class); NetworkOpDaoImpl _opDao = ComponentLocator.inject(NetworkOpDaoImpl.class); NetworkServiceMapDaoImpl _ntwkSvcMap = ComponentLocator.inject(NetworkServiceMapDaoImpl.class); + final TableGenerator _tgMacAddress; Random _rand = new Random(System.currentTimeMillis()); long _prefix = 0x2; @@ -132,11 +135,16 @@ public class NetworkDaoImpl extends GenericDaoBase implements N PhysicalNetworkSearch.and("physicalNetworkId", PhysicalNetworkSearch.entity().getPhysicalNetworkId(), Op.EQ); PhysicalNetworkSearch.done(); - securityGroupSearch = createSearchBuilder(); + SecurityGroupSearch = createSearchBuilder(); SearchBuilder join3 = _ntwkSvcMap.createSearchBuilder(); join3.and("service", join3.entity().getService(), Op.EQ); - securityGroupSearch.join("services", join3, securityGroupSearch.entity().getId(), join3.entity().getNetworkId(), JoinBuilder.JoinType.INNER); - securityGroupSearch.done(); + SecurityGroupSearch.join("services", join3, SecurityGroupSearch.entity().getId(), join3.entity().getNetworkId(), JoinBuilder.JoinType.INNER); + SecurityGroupSearch.done(); + + NetworksCount = createSearchBuilder(Integer.class); + NetworksCount.select(null, Func.COUNT, NetworksCount.entity().getId()); + NetworksCount.and("networkOfferingId", NetworksCount.entity().getNetworkOfferingId(), SearchCriteria.Op.EQ); + NetworksCount.done(); _tgMacAddress = _tgs.get("macAddress"); @@ -344,7 +352,7 @@ public class NetworkDaoImpl extends GenericDaoBase implements N @Override public List listSecurityGroupEnabledNetworks() { - SearchCriteria sc = securityGroupSearch.create(); + SearchCriteria sc = SecurityGroupSearch.create(); sc.setJoinParameters("services", "service", Service.SecurityGroup.getName()); return listBy(sc); } @@ -400,5 +408,13 @@ public class NetworkDaoImpl extends GenericDaoBase implements N return listBy(sc, null); } + + @Override + public int getNetworkCountByNetworkOffId(long networkOfferingId) { + SearchCriteria sc = NetworksCount.create(); + sc.setParameters("networkOfferingId", networkOfferingId); + List count = customSearch(sc, null); + return count.get(0); + } }