diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index 6802d3a1896..9b1fbb7c8f5 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -968,9 +968,11 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura } - @Override - @DB + @Override @DB public boolean deleteZone(DeleteZoneCmd cmd) { + + Transaction txn = Transaction.currentTxn(); + boolean success = false; Long userId = UserContext.current().getCallerUserId(); Long zoneId = cmd.getId(); @@ -986,35 +988,30 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura checkIfZoneIsDeletable(zoneId); - boolean success = _zoneDao.expunge(zoneId); + txn.start(); - try { - // Delete vNet - _zoneDao.deleteVnet(zoneId); - - //Delete networks - List networks = _networkDao.listByZone(zoneId); - if (networks != null && !networks.isEmpty()) { - for (NetworkVO network : networks) { - _networkDao.remove(network.getId()); - } - } - - //delete vlans for this zone - List vlans = _vlanDao.listByZone(zoneId); - for(VlanVO vlan : vlans) { - _vlanDao.remove(vlan.getId()); - } - } catch (Exception ex) { - s_logger.error("Failed to delete zone " + zoneId); - throw new CloudRuntimeException("Failed to delete zone " + zoneId); - } - - if (success){ - return true; - } else{ - return false; + // Delete vNet + _zoneDao.deleteVnet(zoneId); + + //delete vlans for this zone + List vlans = _vlanDao.listByZone(zoneId); + for(VlanVO vlan : vlans) { + _vlanDao.remove(vlan.getId()); } + + //Delete networks + List networks = _networkDao.listByZoneIncludingRemoved(zoneId); + if (networks != null && !networks.isEmpty()) { + for (NetworkVO network : networks) { + _networkDao.expunge(network.getId()); + } + } + + success = _zoneDao.expunge(zoneId); + + txn.commit(); + + return success; } diff --git a/server/src/com/cloud/network/dao/NetworkDao.java b/server/src/com/cloud/network/dao/NetworkDao.java index 3d23a3fac01..de55d4cc7ee 100644 --- a/server/src/com/cloud/network/dao/NetworkDao.java +++ b/server/src/com/cloud/network/dao/NetworkDao.java @@ -62,4 +62,6 @@ public interface NetworkDao extends GenericDao { void addDomainToNetwork(long networkId, long domainId); List listNetworksBy(boolean isShared); + + List listByZoneIncludingRemoved(long zoneId); } diff --git a/server/src/com/cloud/network/dao/NetworkDaoImpl.java b/server/src/com/cloud/network/dao/NetworkDaoImpl.java index b1165056999..96a15caa1c0 100644 --- a/server/src/com/cloud/network/dao/NetworkDaoImpl.java +++ b/server/src/com/cloud/network/dao/NetworkDaoImpl.java @@ -292,4 +292,11 @@ public class NetworkDaoImpl extends GenericDaoBase implements N sc.setParameters("isShared", isShared); return listBy(sc); } + + @Override + public List listByZoneIncludingRemoved(long zoneId) { + SearchCriteria sc = ZoneBroadcastUriSearch.create(); + sc.setParameters("dataCenterId", zoneId); + return listIncludingRemovedBy(sc); + } } diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index 5aee10999b5..adb851279be 100755 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -187,7 +187,7 @@ CREATE TABLE `cloud`.`networks` ( PRIMARY KEY (`id`), CONSTRAINT `fk_networks__network_offering_id` FOREIGN KEY (`network_offering_id`) REFERENCES `network_offerings`(`id`), CONSTRAINT `fk_networks__data_center_id` FOREIGN KEY (`data_center_id`) REFERENCES `data_center`(`id`), - CONSTRAINT `fk_networks__related` FOREIGN KEY(`related`) REFERENCES `networks`(`id`), + CONSTRAINT `fk_networks__related` FOREIGN KEY(`related`) REFERENCES `networks`(`id`) ON DELETE CASCADE, CONSTRAINT `fk_networks__account_id` FOREIGN KEY(`account_id`) REFERENCES `account`(`id`), CONSTRAINT `fk_networks__domain_id` FOREIGN KEY(`domain_id`) REFERENCES `domain`(`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;