Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -75,9 +75,9 @@ public interface PrimaryDataStoreDao extends GenericDao<StoragePoolVO, Long> {
* details to match. All must match for the pool to be returned.
* @return List of StoragePoolVO
*/
List<StoragePoolVO> findPoolsByDetails(long dcId, long podId, Long clusterId, Map<String, String> details, ScopeType scope);
List<StoragePoolVO> findPoolsByDetails(long dcId, Long podId, Long clusterId, Map<String, String> details, ScopeType scope);

List<StoragePoolVO> findPoolsByTags(long dcId, long podId, Long clusterId, String[] tags);
List<StoragePoolVO> findPoolsByTags(long dcId, Long podId, Long clusterId, String[] tags);

List<StoragePoolVO> findDisabledPoolsByScope(long dcId, Long podId, Long clusterId, ScopeType scope);

Expand Down Expand Up @@ -112,7 +112,7 @@ public interface PrimaryDataStoreDao extends GenericDao<StoragePoolVO, Long> {

List<StoragePoolVO> listPoolsByCluster(long clusterId);

List<StoragePoolVO> findLocalStoragePoolsByTags(long dcId, long podId, Long clusterId, String[] tags);
List<StoragePoolVO> findLocalStoragePoolsByTags(long dcId, Long podId, Long clusterId, String[] tags);

List<StoragePoolVO> findZoneWideStoragePoolsByTags(long dcId, String[] tags);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase<StoragePoolVO, Long>
protected final SearchBuilder<StoragePoolVO> AllFieldSearch;
protected final SearchBuilder<StoragePoolVO> DcPodSearch;
protected final SearchBuilder<StoragePoolVO> DcPodAnyClusterSearch;
protected final SearchBuilder<StoragePoolVO> DcAnyPodAnyClusterSearch;
protected final SearchBuilder<StoragePoolVO> DeleteLvmSearch;
protected final SearchBuilder<StoragePoolVO> DcLocalStorageSearch;
protected final GenericSearchBuilder<StoragePoolVO, Long> StatusCountSearch;
Expand All @@ -65,14 +66,14 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase<StoragePoolVO, Long>
protected StoragePoolTagsDao _tagsDao;

protected final String DetailsSqlPrefix =
"SELECT storage_pool.* from storage_pool LEFT JOIN storage_pool_details ON storage_pool.id = storage_pool_details.pool_id WHERE storage_pool.removed is null and storage_pool.status = 'Up' and storage_pool.data_center_id = ? and (storage_pool.pod_id = ? or storage_pool.pod_id is null) and storage_pool.scope = ? and (";
"SELECT storage_pool.* from storage_pool LEFT JOIN storage_pool_details ON storage_pool.id = storage_pool_details.pool_id WHERE storage_pool.removed is null and storage_pool.status = 'Up' and storage_pool.data_center_id = ? and storage_pool.scope = ? and (";
protected final String DetailsSqlSuffix = ") GROUP BY storage_pool_details.pool_id HAVING COUNT(storage_pool_details.name) >= ?";
protected final String ZoneWideTagsSqlPrefix =
"SELECT storage_pool.* from storage_pool LEFT JOIN storage_pool_tags ON storage_pool.id = storage_pool_tags.pool_id WHERE storage_pool.removed is null and storage_pool.status = 'Up' and storage_pool.data_center_id = ? and storage_pool.scope = ? and (";
protected final String ZoneWideTagsSqlSuffix = ") GROUP BY storage_pool_tags.pool_id HAVING COUNT(storage_pool_tags.tag) >= ?";

// Storage tags are now separate from storage_pool_details, leaving only details on that table
protected final String TagsSqlPrefix = "SELECT storage_pool.* from storage_pool LEFT JOIN storage_pool_tags ON storage_pool.id = storage_pool_tags.pool_id WHERE storage_pool.removed is null and storage_pool.status = 'Up' and storage_pool.data_center_id = ? and (storage_pool.pod_id = ? or storage_pool.pod_id is null) and storage_pool.scope = ? and (";
protected final String TagsSqlPrefix = "SELECT storage_pool.* from storage_pool LEFT JOIN storage_pool_tags ON storage_pool.id = storage_pool_tags.pool_id WHERE storage_pool.removed is null and storage_pool.status = 'Up' and storage_pool.data_center_id = ? and storage_pool.scope = ? and (";
protected final String TagsSqlSuffix = ") GROUP BY storage_pool_tags.pool_id HAVING COUNT(storage_pool_tags.tag) >= ?";

protected final String FindPoolTags = "SELECT storage_pool_tags.tag FROM storage_pool_tags WHERE pool_id = ?";
Expand Down Expand Up @@ -119,6 +120,12 @@ public PrimaryDataStoreDaoImpl() {
DcPodAnyClusterSearch.cp();
DcPodAnyClusterSearch.done();

DcAnyPodAnyClusterSearch = createSearchBuilder();
DcAnyPodAnyClusterSearch.and("datacenterId", DcAnyPodAnyClusterSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ);
DcAnyPodAnyClusterSearch.and("status", DcAnyPodAnyClusterSearch.entity().getStatus(), SearchCriteria.Op.EQ);
DcAnyPodAnyClusterSearch.and("scope", DcAnyPodAnyClusterSearch.entity().getScope(), SearchCriteria.Op.EQ);
DcAnyPodAnyClusterSearch.done();

DeleteLvmSearch = createSearchBuilder();
DeleteLvmSearch.and("ids", DeleteLvmSearch.entity().getId(), SearchCriteria.Op.IN);
DeleteLvmSearch.and().op("LVM", DeleteLvmSearch.entity().getPoolType(), SearchCriteria.Op.EQ);
Expand Down Expand Up @@ -244,13 +251,19 @@ public List<StoragePoolVO> listBy(long datacenterId, Long podId, Long clusterId,

sc.setParameters("cluster", clusterId);
return listBy(sc);
} else {
} else if (podId != null) {
SearchCriteria<StoragePoolVO> sc = DcPodAnyClusterSearch.create();
sc.setParameters("datacenterId", datacenterId);
sc.setParameters("podId", podId);
sc.setParameters("status", Status.Up);
sc.setParameters("scope", scope);
return listBy(sc);
} else {
SearchCriteria<StoragePoolVO> sc = DcAnyPodAnyClusterSearch.create();
sc.setParameters("datacenterId", datacenterId);
sc.setParameters("status", Status.Up);
sc.setParameters("scope", scope);
return listBy(sc);
}
}

Expand Down Expand Up @@ -300,10 +313,10 @@ public StoragePoolVO persist(StoragePoolVO pool, Map<String, String> details, Li
* @param valuesLength values length
* @return list of storage pools matching conditions
*/
protected List<StoragePoolVO> findPoolsByDetailsOrTagsInternal(long dcId, long podId, Long clusterId, ScopeType scope, String sqlValues, ValueType valuesType, int valuesLength) {
protected List<StoragePoolVO> findPoolsByDetailsOrTagsInternal(long dcId, Long podId, Long clusterId, ScopeType scope, String sqlValues, ValueType valuesType, int valuesLength) {
String sqlPrefix = valuesType.equals(ValueType.DETAILS) ? DetailsSqlPrefix : TagsSqlPrefix;
String sqlSuffix = valuesType.equals(ValueType.DETAILS) ? DetailsSqlSuffix : TagsSqlSuffix;
String sql = getSqlPreparedStatement(sqlPrefix, sqlSuffix, sqlValues, clusterId);
String sql = getSqlPreparedStatement(sqlPrefix, sqlSuffix, sqlValues, clusterId, podId);
return searchStoragePoolsPreparedStatement(sql, dcId, podId, clusterId, scope, valuesLength);
}

Expand All @@ -325,10 +338,10 @@ protected List<StoragePoolVO> searchStoragePoolsPreparedStatement(String sql, lo
if (pstmt != null) {
int i = 1;
pstmt.setLong(i++, dcId);
pstmt.setString(i++, scope.toString());
if (podId != null) {
pstmt.setLong(i++, podId);
}
pstmt.setString(i++, scope.toString());
if (clusterId != null) {
pstmt.setLong(i++, clusterId);
}
Expand All @@ -355,8 +368,11 @@ protected List<StoragePoolVO> searchStoragePoolsPreparedStatement(String sql, lo
* @param clusterId cluster id
* @return sql prepared statement
*/
protected String getSqlPreparedStatement(String sqlPrefix, String sqlSuffix, String sqlValues, Long clusterId) {
protected String getSqlPreparedStatement(String sqlPrefix, String sqlSuffix, String sqlValues, Long clusterId, Long podId) {
StringBuilder sql = new StringBuilder(sqlPrefix);
if (podId != null) {
sql.append("storage_pool.pod_id = ? OR storage_pool.pod_id is null) AND (");
}
if (clusterId != null) {
sql.append("storage_pool.cluster_id = ? OR storage_pool.cluster_id IS NULL) AND (");
}
Expand Down Expand Up @@ -405,13 +421,13 @@ protected String getSqlValuesFromStorageTags(String[] tags) throws NullPointerEx

@DB
@Override
public List<StoragePoolVO> findPoolsByDetails(long dcId, long podId, Long clusterId, Map<String, String> details, ScopeType scope) {
public List<StoragePoolVO> findPoolsByDetails(long dcId, Long podId, Long clusterId, Map<String, String> details, ScopeType scope) {
String sqlValues = getSqlValuesFromDetails(details);
return findPoolsByDetailsOrTagsInternal(dcId, podId, clusterId, scope, sqlValues, ValueType.DETAILS, details.size());
}

@Override
public List<StoragePoolVO> findPoolsByTags(long dcId, long podId, Long clusterId, String[] tags) {
public List<StoragePoolVO> findPoolsByTags(long dcId, Long podId, Long clusterId, String[] tags) {
List<StoragePoolVO> storagePools = null;
if (tags == null || tags.length == 0) {
storagePools = listBy(dcId, podId, clusterId, ScopeType.CLUSTER);
Expand Down Expand Up @@ -444,7 +460,7 @@ public List<StoragePoolVO> findDisabledPoolsByScope(long dcId, Long podId, Long
}

@Override
public List<StoragePoolVO> findLocalStoragePoolsByTags(long dcId, long podId, Long clusterId, String[] tags) {
public List<StoragePoolVO> findLocalStoragePoolsByTags(long dcId, Long podId, Long clusterId, String[] tags) {
List<StoragePoolVO> storagePools = null;
if (tags == null || tags.length == 0) {
storagePools = listBy(dcId, podId, clusterId, ScopeType.HOST);
Expand Down Expand Up @@ -498,7 +514,7 @@ public List<StoragePoolVO> findZoneWideStoragePoolsByTags(long dcId, String[] ta
return sc.list();
} else {
String sqlValues = getSqlValuesFromStorageTags(tags);
String sql = getSqlPreparedStatement(ZoneWideTagsSqlPrefix, ZoneWideTagsSqlSuffix, sqlValues, null);
String sql = getSqlPreparedStatement(ZoneWideTagsSqlPrefix, ZoneWideTagsSqlSuffix, sqlValues, null, null);
return searchStoragePoolsPreparedStatement(sql, dcId, null, null, ScopeType.ZONE, tags.length);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,14 +118,14 @@ public void testGetSqlValuesFromDetailsEmptyDetailss() {

@Test
public void testGetSqlPreparedStatementNullClusterId() {
String sqlPreparedStatement = primaryDataStoreDao.getSqlPreparedStatement(SQL_PREFIX, SQL_SUFFIX, SQL_VALUES, null);
String sqlPreparedStatement = primaryDataStoreDao.getSqlPreparedStatement(SQL_PREFIX, SQL_SUFFIX, SQL_VALUES, null, null);
assertEquals(SQL_PREFIX + SQL_VALUES + SQL_SUFFIX, sqlPreparedStatement);
}

@Test
public void testGetSqlPreparedStatementNotNullClusterId() {
String clusterSql = "storage_pool.cluster_id = ? OR storage_pool.cluster_id IS NULL) AND (";
String sqlPreparedStatement = primaryDataStoreDao.getSqlPreparedStatement(SQL_PREFIX, SQL_SUFFIX, SQL_VALUES, 1l);
String sqlPreparedStatement = primaryDataStoreDao.getSqlPreparedStatement(SQL_PREFIX, SQL_SUFFIX, SQL_VALUES, 1l, null);
assertEquals(SQL_PREFIX + clusterSql + SQL_VALUES + SQL_SUFFIX, sqlPreparedStatement);
}

Expand All @@ -134,7 +134,7 @@ public void testFindPoolsByDetailsOrTagsInternalStorageTagsType() {
List<StoragePoolVO> storagePools = primaryDataStoreDao.findPoolsByDetailsOrTagsInternal(DATACENTER_ID, POD_ID, CLUSTER_ID, SCOPE, SQL_VALUES, ValueType.TAGS, STORAGE_TAGS_ARRAY.length);
assertEquals(Arrays.asList(storagePoolVO), storagePools);
verify(primaryDataStoreDao).getSqlPreparedStatement(
primaryDataStoreDao.TagsSqlPrefix, primaryDataStoreDao.TagsSqlSuffix, SQL_VALUES, CLUSTER_ID);
primaryDataStoreDao.TagsSqlPrefix, primaryDataStoreDao.TagsSqlSuffix, SQL_VALUES, CLUSTER_ID, null);
String expectedSql = primaryDataStoreDao.TagsSqlPrefix + SQL_VALUES + primaryDataStoreDao.TagsSqlSuffix;
verify(primaryDataStoreDao).searchStoragePoolsPreparedStatement(expectedSql, DATACENTER_ID, POD_ID, CLUSTER_ID, SCOPE, STORAGE_TAGS_ARRAY.length);
}
Expand All @@ -144,7 +144,7 @@ public void testFindPoolsByDetailsOrTagsInternalDetailsType() {
List<StoragePoolVO> storagePools = primaryDataStoreDao.findPoolsByDetailsOrTagsInternal(DATACENTER_ID, POD_ID, CLUSTER_ID, SCOPE, SQL_VALUES, ValueType.DETAILS, STORAGE_POOL_DETAILS.size());
assertEquals(Arrays.asList(storagePoolVO), storagePools);
verify(primaryDataStoreDao).getSqlPreparedStatement(
primaryDataStoreDao.DetailsSqlPrefix, primaryDataStoreDao.DetailsSqlSuffix, SQL_VALUES, CLUSTER_ID);
primaryDataStoreDao.DetailsSqlPrefix, primaryDataStoreDao.DetailsSqlSuffix, SQL_VALUES, CLUSTER_ID, null);
String expectedSql = primaryDataStoreDao.DetailsSqlPrefix + SQL_VALUES + primaryDataStoreDao.DetailsSqlSuffix;
verify(primaryDataStoreDao).searchStoragePoolsPreparedStatement(expectedSql, DATACENTER_ID, POD_ID, CLUSTER_ID, SCOPE, STORAGE_POOL_DETAILS.size());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -203,8 +203,7 @@ public String getUuid() {

@Override
public String getName() {
// TODO Auto-generated method stub
return null;
return pdsv.getName();
}

@Override
Expand Down
31 changes: 25 additions & 6 deletions server/src/com/cloud/server/ManagementServerImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import javax.inject.Inject;
import javax.naming.ConfigurationException;

import com.cloud.storage.ScopeType;
import org.apache.cloudstack.acl.ControlledEntity;
import org.apache.cloudstack.affinity.AffinityGroupProcessor;
import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
Expand Down Expand Up @@ -1383,8 +1384,10 @@ public Pair<List<? extends StoragePool>, List<? extends StoragePool>> listStorag
List<StoragePoolVO> storagePools = null;
if (srcVolumePool.getClusterId() == null) {
storagePools = _poolDao.findZoneWideStoragePoolsByTags(volume.getDataCenterId(), null);
} else {
} else if (vm != null) {
storagePools = _poolDao.findPoolsByTags(volume.getDataCenterId(), srcVolumePool.getPodId(), srcVolumePool.getClusterId(), null);
} else {
storagePools = _poolDao.findPoolsByTags(volume.getDataCenterId(), null, null, null);
}

storagePools.remove(srcVolumePool);
Expand All @@ -1399,12 +1402,30 @@ public Pair<List<? extends StoragePool>, List<? extends StoragePool>> listStorag
final ExcludeList avoid = new ExcludeList();
avoid.addPool(srcVolumePool.getId());

// Volume stays in the same cluster after migration.
final DataCenterDeployment plan = new DataCenterDeployment(volume.getDataCenterId(), srcVolumePool.getPodId(), srcVolumePool.getClusterId(), null, null, null);
if(vm != null) {
// Volume stays in the same cluster after migration.
addSuitablePools(suitablePools, avoid, vm, volume, vm.getHypervisorType(), srcVolumePool.getDataCenterId(), srcVolumePool.getPodId(), srcVolumePool.getClusterId());
} else {
final HypervisorType volHypervisorType = _volumeDao.getHypervisorType(volumeId);
if(srcVolumePool.getScope() == ScopeType.CLUSTER) {
for (HostPodVO podVo : _hostPodDao.listByDataCenterId(volume.getDataCenterId())) {
addSuitablePools(suitablePools, avoid, vm, volume, volHypervisorType, volume.getDataCenterId(), podVo.getId(), null);
}
} else if (srcVolumePool.getScope() == ScopeType.ZONE) {
addSuitablePools(suitablePools, avoid, vm, volume, volHypervisorType, volume.getDataCenterId(), null, null);
}
}

return new Pair<List<? extends StoragePool>, List<? extends StoragePool>>(allPools, suitablePools);
}

private void addSuitablePools(List<StoragePool> suitablePools, ExcludeList avoid, VMInstanceVO vm, VolumeVO volume, HypervisorType volHypervisorType,
long dcId, Long podId, Long clusterId) {
final DataCenterDeployment plan = new DataCenterDeployment(dcId, podId, clusterId, null, null, null);
final VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm);

final DiskOfferingVO diskOffering = _diskOfferingDao.findById(volume.getDiskOfferingId());
final DiskProfile diskProfile = new DiskProfile(volume, diskOffering, profile.getHypervisorType());
final DiskProfile diskProfile = new DiskProfile(volume, diskOffering, volHypervisorType);

// Call the storage pool allocator to find the list of storage pools.
for (final StoragePoolAllocator allocator : _storagePoolAllocators) {
Expand All @@ -1414,8 +1435,6 @@ public Pair<List<? extends StoragePool>, List<? extends StoragePool>> listStorag
break;
}
}

return new Pair<List<? extends StoragePool>, List<? extends StoragePool>>(allPools, suitablePools);
}

private Pair<List<HostVO>, Integer> searchForServers(final Long startIndex, final Long pageSize, final Object name, final Object type, final Object state, final Object zone, final Object pod, final Object cluster,
Expand Down
Loading