Skip to content

Commit 9036846

Browse files
committed
Fix list StorPool primary storage
Fixes listing of StorPool primary storage when using listStoragePools API
1 parent 1e512ab commit 9036846

8 files changed

Lines changed: 78 additions & 9 deletions

File tree

engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade42210to42300.java

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,23 @@
2121
import java.sql.PreparedStatement;
2222
import java.sql.ResultSet;
2323
import java.sql.SQLException;
24+
import java.util.List;
25+
import java.util.UUID;
2426

27+
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
28+
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDaoImpl;
29+
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
30+
31+
import com.cloud.storage.Storage.StoragePoolType;
2532
import com.cloud.utils.crypt.DBEncryptionUtil;
33+
import com.cloud.utils.db.SearchBuilder;
34+
import com.cloud.utils.db.SearchCriteria;
2635
import com.cloud.utils.exception.CloudRuntimeException;
2736

2837
public class Upgrade42210to42300 extends DbUpgradeAbstractImpl implements DbUpgrade, DbUpgradeSystemVmTemplate {
2938

39+
private PrimaryDataStoreDao storageDao;
40+
3041
@Override
3142
public String[] getUpgradableVersionRange() {
3243
return new String[]{"4.22.1.0", "4.23.0.0"};
@@ -51,6 +62,56 @@ public InputStream[] getPrepareScripts() {
5162
@Override
5263
public void performDataMigration(Connection conn) {
5364
unhideJsInterpretationEnabled(conn);
65+
normalizeStorPoolPrimaryStorageUuids();
66+
}
67+
68+
protected PrimaryDataStoreDao getStorageDao() {
69+
if (storageDao == null) {
70+
storageDao = new PrimaryDataStoreDaoImpl();
71+
}
72+
return storageDao;
73+
}
74+
75+
/**
76+
* StorPool primary storage used {@code templateName + ";" + uuid} as {@code storage_pool.uuid}.
77+
* Normalize to a plain UUID form so API and validation treat {@code id} like other pools.
78+
* Template name remains in {@code storage_pool_details} ({@code SP_TEMPLATE}).
79+
*/
80+
protected void normalizeStorPoolPrimaryStorageUuids() {
81+
SearchBuilder<StoragePoolVO> sb = getStorageDao().createSearchBuilder();
82+
sb.and("poolType", sb.entity().getPoolType(), SearchCriteria.Op.EQ);
83+
sb.and("uuid", sb.entity().getUuid(), SearchCriteria.Op.LIKE);
84+
sb.done();
85+
SearchCriteria<StoragePoolVO> sc = sb.create();
86+
sc.setParameters("poolType", StoragePoolType.StorPool);
87+
sc.setParameters("uuid", "%;%");
88+
List<StoragePoolVO> pools = getStorageDao().search(sc, null);
89+
int updated = 0;
90+
for (StoragePoolVO pool : pools) {
91+
final String templatePrefixedPoolUuid = pool.getUuid();
92+
if (templatePrefixedPoolUuid == null) {
93+
continue;
94+
}
95+
final String[] parts = templatePrefixedPoolUuid.split(";");
96+
if (parts.length < 2) {
97+
continue;
98+
}
99+
final String realUuid = parts[1].trim();
100+
try {
101+
UUID.fromString(realUuid);
102+
} catch (IllegalArgumentException e) {
103+
logger.warn(
104+
"Skipping StorPool storage pool id [{}]: value after ';' is not a valid UUID: [{}]",
105+
pool.getId(), realUuid);
106+
continue;
107+
}
108+
pool.setUuid(realUuid);
109+
getStorageDao().update(pool.getId(), pool);
110+
updated++;
111+
}
112+
if (updated > 0) {
113+
logger.info("Normalized {} StorPool primary storage pool UUID(s) to plain UUID form.", updated);
114+
}
54115
}
55116

56117
protected void unhideJsInterpretationEnabled(Connection conn) {

plugins/storage/volume/storpool/src/main/java/com/cloud/agent/api/storage/StorPoolModifyStoragePoolCommand.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,13 @@
2222
import com.cloud.agent.api.ModifyStoragePoolCommand;
2323
import com.cloud.storage.StoragePool;
2424

25+
import java.util.Map;
26+
2527
public class StorPoolModifyStoragePoolCommand extends ModifyStoragePoolCommand {
2628
private String volumeName;
2729

28-
public StorPoolModifyStoragePoolCommand(boolean add, StoragePool pool, String volumeName) {
29-
super(add, pool);
30+
public StorPoolModifyStoragePoolCommand(boolean add, StoragePool pool, String volumeName, Map<String, String> details) {
31+
super(add, pool, details);
3032
this.volumeName = volumeName;
3133
}
3234

plugins/storage/volume/storpool/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/StorPoolModifyStorageCommandWrapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public Answer execute(final StorPoolModifyStoragePoolCommand command, final Libv
6363
final KVMStoragePoolManager storagePoolMgr = libvirtComputingResource.getStoragePoolMgr();
6464
final KVMStoragePool storagepool =
6565
storagePoolMgr.createStoragePool(command.getPool().getUuid(), command.getPool().getHost(), command.getPool().getPort(), command.getPool().getPath(), command.getPool()
66-
.getUserInfo(), command.getPool().getType());
66+
.getUserInfo(), command.getPool().getType(), command.getDetails());
6767
if (storagepool == null) {
6868
logger.debug(String.format("Did not find a storage pool [%s]", command.getPool().getId()));
6969
return new Answer(command, false, String.format("Failed to create storage pool [%s]", command.getPool().getId()));

plugins/storage/volume/storpool/src/main/java/com/cloud/hypervisor/kvm/storage/StorPoolStorageAdaptor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public static void SP_LOG(String fmt, Object... args) {
7575
public KVMStoragePool createStoragePool(String uuid, String host, int port, String path, String userInfo, StoragePoolType storagePoolType, Map<String, String> details, boolean isPrimaryStorage) {
7676
SP_LOG("StorPoolStorageAdaptor.createStoragePool: uuid=%s, host=%s:%d, path=%s, userInfo=%s, type=%s", uuid, host, port, path, userInfo, storagePoolType);
7777

78-
StorPoolStoragePool storagePool = new StorPoolStoragePool(uuid, host, port, storagePoolType, this);
78+
StorPoolStoragePool storagePool = new StorPoolStoragePool(uuid, host, port, storagePoolType, this, details);
7979
storageUuidToStoragePool.put(uuid, storagePool);
8080
return storagePool;
8181
}
@@ -409,7 +409,7 @@ public KVMPhysicalDisk createTemplateFromDirectDownloadFile(String templateFileP
409409

410410
srcFile = new QemuImgFile(srcTemplateFilePath, srcFileFormat);
411411

412-
String spTemplate = destPool.getUuid().split(";")[0];
412+
String spTemplate = destPool.getAuthUserName();
413413

414414
QemuImg qemu = new QemuImg(timeout);
415415
OutputInterpreter.AllLinesParser parser = createStorPoolVolume(destPool, srcFile, qemu, spTemplate);

plugins/storage/volume/storpool/src/main/java/com/cloud/hypervisor/kvm/storage/StorPoolStoragePool.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.Map;
2121
import java.util.Map.Entry;
2222

23+
import org.apache.cloudstack.storage.datastore.util.StorPoolUtil;
2324
import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat;
2425
import org.apache.logging.log4j.LogManager;
2526
import org.apache.logging.log4j.Logger;
@@ -53,12 +54,13 @@ public class StorPoolStoragePool implements KVMStoragePool {
5354
private String _localPath;
5455
private String storageNodeId = getStorPoolConfigParam("SP_OURID");
5556

56-
public StorPoolStoragePool(String uuid, String host, int port, StoragePoolType storagePoolType, StorageAdaptor storageAdaptor) {
57+
public StorPoolStoragePool(String uuid, String host, int port, StoragePoolType storagePoolType, StorageAdaptor storageAdaptor, Map<String, String> details) {
5758
_uuid = uuid;
5859
_sourceHost = host;
5960
_sourcePort = port;
6061
_storagePoolType = storagePoolType;
6162
_storageAdaptor = storageAdaptor;
63+
_authUsername = details.get(StorPoolUtil.SP_TEMPLATE);
6264
}
6365

6466
@Override

plugins/storage/volume/storpool/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/StorPoolPrimaryDataStoreLifeCycle.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ public DataStore initialize(Map<String, Object> dsInfos) {
161161

162162
PrimaryDataStoreParameters parameters = new PrimaryDataStoreParameters();
163163
parameters.setName(name);
164-
parameters.setUuid(conn.getTemplateName() + ";" + UUID.randomUUID().toString());
164+
parameters.setUuid(UUID.randomUUID().toString());
165165
parameters.setZoneId(zoneId);
166166
parameters.setProviderName(providerName);
167167
parameters.setType(StoragePoolType.StorPool);

plugins/storage/volume/storpool/src/main/java/org/apache/cloudstack/storage/datastore/provider/StorPoolHostListener.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@
2222
import java.lang.reflect.Modifier;
2323
import java.util.ArrayList;
2424
import java.util.Arrays;
25+
import java.util.HashMap;
2526
import java.util.List;
27+
import java.util.Map;
2628

2729
import javax.inject.Inject;
2830

@@ -119,7 +121,9 @@ public boolean hostConnect(long hostId, long poolId) throws StorageConflictExcep
119121
return false;
120122
}
121123

122-
StorPoolModifyStoragePoolCommand cmd = new StorPoolModifyStoragePoolCommand(true, pool, volumeOnPool.getValue());
124+
Map<String, String> details = new HashMap<>();
125+
details.put(StorPoolUtil.SP_TEMPLATE, conn.getTemplateName());
126+
StorPoolModifyStoragePoolCommand cmd = new StorPoolModifyStoragePoolCommand(true, pool, volumeOnPool.getValue(), details);
123127
final Answer answer = agentMgr.easySend(hostId, cmd);
124128

125129
StoragePoolHostVO poolHost = storagePoolHostDao.findByPoolHost(pool.getId(), hostId);

plugins/storage/volume/storpool/src/main/java/org/apache/cloudstack/storage/datastore/util/StorPoolUtil.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ private static SpConnectionDesc updateStorageAndStorageDetails(String url, long
336336
poolDetails.persist(new StoragePoolDetailVO(poolId, SP_AUTH_TOKEN, conn.getAuthToken(), false));
337337
poolDetails.persist(new StoragePoolDetailVO(poolId, SP_TEMPLATE, conn.getTemplateName(), false));
338338
StoragePoolVO pool = storagePool.findById(poolId);
339-
pool.setUuid(conn.getTemplateName() + ";" + UUID.randomUUID().toString());
339+
pool.setUuid(UUID.randomUUID().toString());
340340
storagePool.update(poolId, pool);
341341
StorPoolUtil.spLog(
342342
"Storage pool with id=%s and template's name=%s was updated and its connection details are hidden from UI.",

0 commit comments

Comments
 (0)