From 1fb75c57e715346724e596ae3e72677478b50790 Mon Sep 17 00:00:00 2001 From: anthony Date: Wed, 1 Jun 2011 15:37:54 -0700 Subject: [PATCH] bug 10100 : if there are more than one hypervisor type in one zone, create_template_from_snapshot may be sent to host with diferent hypervisor type status 10100 : resolved fixed Conflicts: server/src/com/cloud/storage/StorageManager.java server/src/com/cloud/vm/UserVmManagerImpl.java --- .../src/com/cloud/storage/StorageManager.java | 1 + .../com/cloud/storage/StorageManagerImpl.java | 17 +++++++++++++++++ server/src/com/cloud/vm/UserVmManagerImpl.java | 6 +++--- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/server/src/com/cloud/storage/StorageManager.java b/server/src/com/cloud/storage/StorageManager.java index 86db2325d85..287df03a9c7 100755 --- a/server/src/com/cloud/storage/StorageManager.java +++ b/server/src/com/cloud/storage/StorageManager.java @@ -186,4 +186,5 @@ public interface StorageManager extends Manager { boolean createStoragePool(long hostId, StoragePoolVO pool); boolean delPoolFromHost(long hostId); + List ListByDataCenterHypervisor(long datacenterId, HypervisorType type); } diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index 129e75edc80..4af00d569f9 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -350,6 +350,23 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag return true; } } + + @Override + public List ListByDataCenterHypervisor(long datacenterId, HypervisorType type) { + List pools = _storagePoolDao.listByDataCenterId(datacenterId); + List retPools = new ArrayList(); + for (StoragePoolVO pool : pools ) { + if( pool.getStatus() != StoragePoolStatus.Up) { + continue; + } + ClusterVO cluster = _clusterDao.findById(pool.getClusterId()); + if( type == cluster.getHypervisorType()) { + retPools.add(pool); + } + } + Collections.shuffle(retPools); + return retPools; + } @Override public boolean isLocalStorageActiveOnHost(Host host) { diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 8a15d2909cb..be6860370ff 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -1406,11 +1406,11 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager volumeId = snapshot.getVolumeId(); String origTemplateInstallPath = null; - List storagePools = _storagePoolDao.listByDataCenterId(zoneId); - if( storagePools == null || storagePools.size() == 0) { + List pools = _storageMgr.ListByDataCenterHypervisor(zoneId, snapshot.getHypervisorType()); + if (pools == null || pools.size() == 0 ) { throw new CloudRuntimeException("Unable to find storage pools in zone " + zoneId); } - pool = storagePools.get(0); + pool = pools.get(0); if (snapshot.getVersion() != null && snapshot.getVersion().equalsIgnoreCase("2.1")) { VolumeVO volume = _volsDao.findByIdIncludingRemoved(volumeId); if ( volume == null ) {