diff --git a/engine/pom.xml b/engine/pom.xml
index 435017ab92c..10a85ff759c 100644
--- a/engine/pom.xml
+++ b/engine/pom.xml
@@ -46,6 +46,7 @@
api
orchestration
+ schema
storage
storage/volume
storage/image
@@ -53,7 +54,6 @@
storage/cache
storage/snapshot
components-api
- schema
network
service
diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
index 2a88b1ff60f..d7ab27334d8 100644
--- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
+++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
@@ -37,6 +37,8 @@ import javax.naming.ConfigurationException;
import com.google.common.base.MoreObjects;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
+import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
+import org.apache.cloudstack.storage.datastore.db.ImageStoreDao;
import org.apache.log4j.Logger;
import org.apache.cloudstack.acl.SecurityChecker;
@@ -84,7 +86,6 @@ import org.apache.cloudstack.region.PortableIpVO;
import org.apache.cloudstack.region.Region;
import org.apache.cloudstack.region.RegionVO;
import org.apache.cloudstack.region.dao.RegionDao;
-import org.apache.cloudstack.storage.datastore.db.ImageStoreDao;
import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao;
import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
@@ -346,6 +347,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
@Inject
ImageStoreDetailsDao _imageStoreDetailsDao;
+
// FIXME - why don't we have interface for DataCenterLinkLocalIpAddressDao?
@Inject
protected DataCenterLinkLocalIpAddressDao _linkLocalIpAllocDao;
@@ -1332,7 +1334,6 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
final String errorMsg = "The zone cannot be deleted because ";
-
// Check if there are any non-removed hosts in the zone.
if (!_hostDao.listByDataCenterId(zoneId).isEmpty()) {
throw new CloudRuntimeException(errorMsg + "there are servers in this zone.");
@@ -1368,6 +1369,11 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
throw new CloudRuntimeException(errorMsg + "there are physical networks in this zone.");
}
+ //check if there are any secondary stores attached to the zone
+ if(!_imageStoreDao.findByScope(new ZoneScope(zoneId)).isEmpty()) {
+ throw new CloudRuntimeException(errorMsg + "there are Secondary storages in this zone");
+ }
+
// Check if there are any non-removed VMware datacenters in the zone.
//if (_vmwareDatacenterZoneMapDao.findByZoneId(zoneId) != null) {
// throw new CloudRuntimeException(errorMsg + "there are VMware datacenters in this zone.");
diff --git a/server/test/com/cloud/configuration/ConfigurationManagerTest.java b/server/test/com/cloud/configuration/ConfigurationManagerTest.java
index 74f9ca25cc6..34f91c4e27c 100644
--- a/server/test/com/cloud/configuration/ConfigurationManagerTest.java
+++ b/server/test/com/cloud/configuration/ConfigurationManagerTest.java
@@ -36,6 +36,9 @@ import java.util.Random;
import java.util.UUID;
import com.cloud.user.User;
+import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
+import org.apache.cloudstack.storage.datastore.db.ImageStoreDao;
+import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
import org.apache.log4j.Logger;
import org.junit.After;
import org.junit.Assert;
@@ -143,6 +146,8 @@ public class ConfigurationManagerTest {
HostPodDao _podDao;
@Mock
PhysicalNetworkDao _physicalNetworkDao;
+ @Mock
+ ImageStoreDao _imageStoreDao;
VlanVO vlan = new VlanVO(Vlan.VlanType.VirtualNetwork, "vlantag", "vlangateway", "vlannetmask", 1L, "iprange", 1L, 1L, null, null, null);
@@ -174,6 +179,7 @@ public class ConfigurationManagerTest {
configurationMgr._clusterDao = _clusterDao;
configurationMgr._podDao = _podDao;
configurationMgr._physicalNetworkDao = _physicalNetworkDao;
+ configurationMgr._imageStoreDao = _imageStoreDao;
Account account = new AccountVO("testaccount", 1, "networkdomain", (short)0, UUID.randomUUID().toString());
@@ -679,6 +685,7 @@ public class ConfigurationManagerTest {
Mockito.when(_vmInstanceDao.listByZoneId(anyLong())).thenReturn(new ArrayList());
Mockito.when(_volumeDao.findByDc(anyLong())).thenReturn(new ArrayList());
Mockito.when(_physicalNetworkDao.listByZone(anyLong())).thenReturn(new ArrayList());
+ Mockito.when(_imageStoreDao.findByScope(any(ZoneScope.class))).thenReturn(new ArrayList());
configurationMgr.checkIfZoneIsDeletable(new Random().nextLong());
}
@@ -696,6 +703,7 @@ public class ConfigurationManagerTest {
Mockito.when(_vmInstanceDao.listByZoneId(anyLong())).thenReturn(new ArrayList());
Mockito.when(_volumeDao.findByDc(anyLong())).thenReturn(new ArrayList());
Mockito.when(_physicalNetworkDao.listByZone(anyLong())).thenReturn(new ArrayList());
+ Mockito.when(_imageStoreDao.findByScope(any(ZoneScope.class))).thenReturn(new ArrayList());
configurationMgr.checkIfZoneIsDeletable(new Random().nextLong());
}
@@ -713,6 +721,7 @@ public class ConfigurationManagerTest {
Mockito.when(_vmInstanceDao.listByZoneId(anyLong())).thenReturn(new ArrayList());
Mockito.when(_volumeDao.findByDc(anyLong())).thenReturn(new ArrayList());
Mockito.when(_physicalNetworkDao.listByZone(anyLong())).thenReturn(new ArrayList());
+ Mockito.when(_imageStoreDao.findByScope(any(ZoneScope.class))).thenReturn(new ArrayList());
configurationMgr.checkIfZoneIsDeletable(new Random().nextLong());
}
@@ -726,6 +735,7 @@ public class ConfigurationManagerTest {
Mockito.when(_vmInstanceDao.listByZoneId(anyLong())).thenReturn(new ArrayList());
Mockito.when(_volumeDao.findByDc(anyLong())).thenReturn(new ArrayList());
Mockito.when(_physicalNetworkDao.listByZone(anyLong())).thenReturn(new ArrayList());
+ Mockito.when(_imageStoreDao.findByScope(any(ZoneScope.class))).thenReturn(new ArrayList());
configurationMgr.checkIfZoneIsDeletable(new Random().nextLong());
}
@@ -739,6 +749,7 @@ public class ConfigurationManagerTest {
Mockito.when(_vmInstanceDao.listByZoneId(anyLong())).thenReturn(new ArrayList());
Mockito.when(_volumeDao.findByDc(anyLong())).thenReturn(new ArrayList());
Mockito.when(_physicalNetworkDao.listByZone(anyLong())).thenReturn(new ArrayList());
+ Mockito.when(_imageStoreDao.findByScope(any(ZoneScope.class))).thenReturn(new ArrayList());
configurationMgr.checkIfZoneIsDeletable(new Random().nextLong());
}
@@ -756,6 +767,7 @@ public class ConfigurationManagerTest {
Mockito.when(_vmInstanceDao.listByZoneId(anyLong())).thenReturn(arrayList);
Mockito.when(_volumeDao.findByDc(anyLong())).thenReturn(new ArrayList());
Mockito.when(_physicalNetworkDao.listByZone(anyLong())).thenReturn(new ArrayList());
+ Mockito.when(_imageStoreDao.findByScope(any(ZoneScope.class))).thenReturn(new ArrayList());
configurationMgr.checkIfZoneIsDeletable(new Random().nextLong());
}
@@ -773,6 +785,7 @@ public class ConfigurationManagerTest {
Mockito.when(_vmInstanceDao.listByZoneId(anyLong())).thenReturn(new ArrayList());
Mockito.when(_volumeDao.findByDc(anyLong())).thenReturn(arrayList);
Mockito.when(_physicalNetworkDao.listByZone(anyLong())).thenReturn(new ArrayList());
+ Mockito.when(_imageStoreDao.findByScope(any(ZoneScope.class))).thenReturn(new ArrayList());
configurationMgr.checkIfZoneIsDeletable(new Random().nextLong());
}
@@ -790,6 +803,7 @@ public class ConfigurationManagerTest {
Mockito.when(_vmInstanceDao.listByZoneId(anyLong())).thenReturn(new ArrayList());
Mockito.when(_volumeDao.findByDc(anyLong())).thenReturn(new ArrayList());
Mockito.when(_physicalNetworkDao.listByZone(anyLong())).thenReturn(arrayList);
+ Mockito.when(_imageStoreDao.findByScope(any(ZoneScope.class))).thenReturn(new ArrayList());
configurationMgr.checkIfZoneIsDeletable(new Random().nextLong());
}
diff --git a/server/test/resources/createNetworkOffering.xml b/server/test/resources/createNetworkOffering.xml
index e035b62393f..9d449428943 100644
--- a/server/test/resources/createNetworkOffering.xml
+++ b/server/test/resources/createNetworkOffering.xml
@@ -53,5 +53,5 @@
-
+