Skip to content

Commit 419bf31

Browse files
author
Pearl Dsilva
committed
allow storage browser to list lv in clvm, fix clvm shrink, overprovisioning factor isnt used for clvm pools - so set it to 1 and prevented display of provisioning type for clvm
1 parent 5958b94 commit 419bf31

6 files changed

Lines changed: 95 additions & 12 deletions

File tree

engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
import com.cloud.storage.Snapshot.Type;
7777
import com.cloud.storage.SnapshotVO;
7878
import com.cloud.storage.StorageManager;
79+
import com.cloud.storage.Storage.ImageFormat;
7980
import com.cloud.storage.Storage.StoragePoolType;
8081
import com.cloud.storage.StoragePool;
8182
import com.cloud.storage.VolumeVO;
@@ -609,6 +610,9 @@ protected Answer migrateVolumeToPool(DataObject srcData, DataObject destData) {
609610
volumeVo.setPoolId(destPool.getId());
610611
volumeVo.setPoolType(destPool.getPoolType());
611612
volumeVo.setLastPoolId(oldPoolId);
613+
if (destPool.getPoolType() == StoragePoolType.CLVM) {
614+
volumeVo.setFormat(ImageFormat.RAW);
615+
}
612616
// For SMB, pool credentials are also stored in the uri query string. We trim the query string
613617
// part here to make sure the credentials do not get stored in the db unencrypted.
614618
String folder = destPool.getPath();

engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/StorageSystemDataMotionStrategy.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2496,12 +2496,13 @@ private void handlePostMigration(boolean success, Map<VolumeInfo, VolumeInfo> sr
24962496

24972497
if (success) {
24982498
VolumeVO volumeVO = _volumeDao.findById(destVolumeInfo.getId());
2499-
volumeVO.setFormat(ImageFormat.QCOW2);
2499+
StoragePoolVO srcPoolVO = _storagePoolDao.findById(srcVolumeInfo.getPoolId());
2500+
StoragePoolVO destPoolVO = _storagePoolDao.findById(destVolumeInfo.getPoolId());
2501+
volumeVO.setFormat(destPoolVO != null && destPoolVO.getPoolType() == StoragePoolType.CLVM
2502+
? ImageFormat.RAW : ImageFormat.QCOW2);
25002503
volumeVO.setLastId(srcVolumeInfo.getId());
25012504

25022505
if (Objects.equals(srcVolumeInfo.getDiskOfferingId(), destVolumeInfo.getDiskOfferingId())) {
2503-
StoragePoolVO srcPoolVO = _storagePoolDao.findById(srcVolumeInfo.getPoolId());
2504-
StoragePoolVO destPoolVO = _storagePoolDao.findById(destVolumeInfo.getPoolId());
25052506
if (srcPoolVO != null && destPoolVO != null &&
25062507
((srcPoolVO.isShared() && destPoolVO.isLocal()) || (srcPoolVO.isLocal() && destPoolVO.isShared()))) {
25072508
Long offeringId = getSuitableDiskOfferingForVolumeOnPool(volumeVO, destPoolVO);
@@ -2512,9 +2513,6 @@ private void handlePostMigration(boolean success, Map<VolumeInfo, VolumeInfo> sr
25122513
}
25132514

25142515
_volumeDao.update(volumeVO.getId(), volumeVO);
2515-
2516-
StoragePoolVO srcPoolVO = _storagePoolDao.findById(srcVolumeInfo.getPoolId());
2517-
StoragePoolVO destPoolVO = _storagePoolDao.findById(destVolumeInfo.getPoolId());
25182516
if (destPoolVO != null && ClvmPoolManager.isClvmPoolType(destPoolVO.getPoolType())
25192517
&& (srcPoolVO == null || srcPoolVO.getId() != destPoolVO.getId())) {
25202518
sendClvmLockCommand(destHost.getId(), destPoolVO, destVolumeInfo,

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
import org.apache.cloudstack.command.ReconcileCommandUtils;
8080
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
8181
import org.apache.cloudstack.gpu.GpuDevice;
82+
import org.apache.cloudstack.storage.command.browser.ListDataStoreObjectsAnswer;
8283
import org.apache.cloudstack.storage.command.browser.ListDataStoreObjectsCommand;
8384
import org.apache.cloudstack.storage.configdrive.ConfigDrive;
8485
import org.apache.cloudstack.storage.to.PrimaryDataStoreTO;
@@ -228,6 +229,7 @@
228229
import com.cloud.storage.Storage;
229230
import com.cloud.storage.Storage.StoragePoolType;
230231
import com.cloud.storage.StorageLayer;
232+
import com.cloud.storage.clvm.ClvmPoolManager;
231233
import com.cloud.storage.Volume;
232234
import com.cloud.storage.resource.StorageSubsystemCommandHandler;
233235
import com.cloud.storage.resource.StorageSubsystemCommandHandlerBase;
@@ -5735,10 +5737,73 @@ public boolean configureDefaultNetworkRulesForSystemVm(final Connect conn, final
57355737

57365738
public Answer listFilesAtPath(ListDataStoreObjectsCommand command) {
57375739
DataStoreTO store = command.getStore();
5738-
KVMStoragePool storagePool = storagePoolManager.getStoragePool(StoragePoolType.NetworkFilesystem, store.getUuid());
5740+
StoragePoolType poolType = StoragePoolType.NetworkFilesystem;
5741+
if (store instanceof PrimaryDataStoreTO) {
5742+
poolType = ((PrimaryDataStoreTO) store).getPoolType();
5743+
}
5744+
KVMStoragePool storagePool = storagePoolManager.getStoragePool(poolType, store.getUuid());
5745+
if (ClvmPoolManager.isClvmPoolType(poolType)) {
5746+
return listLvmVolumes(storagePool.getLocalPath(), command.getStartIndex(), command.getPageSize());
5747+
}
57395748
return listFilesAtPath(storagePool.getLocalPath(), command.getPath(), command.getStartIndex(), command.getPageSize());
57405749
}
57415750

5751+
private Answer listLvmVolumes(String localPath, int startIndex, int pageSize) {
5752+
String vgName = localPath;
5753+
if (vgName.startsWith("/")) {
5754+
String[] parts = vgName.split("/");
5755+
for (int i = parts.length - 1; i >= 0; i--) {
5756+
if (!parts[i].isEmpty()) {
5757+
vgName = parts[i];
5758+
break;
5759+
}
5760+
}
5761+
}
5762+
5763+
Script lvs = new Script("lvs", 10000, logger);
5764+
lvs.add("--noheadings");
5765+
lvs.add("--nosuffix");
5766+
lvs.add("-o", "lv_name,lv_size");
5767+
lvs.add("--units", "b");
5768+
lvs.add(vgName);
5769+
AllLinesParser parser = new AllLinesParser();
5770+
String result = lvs.execute(parser);
5771+
5772+
List<String> names = new ArrayList<>();
5773+
List<String> paths = new ArrayList<>();
5774+
List<String> absPaths = new ArrayList<>();
5775+
List<Boolean> isDirs = new ArrayList<>();
5776+
List<Long> sizes = new ArrayList<>();
5777+
List<Long> lastModified = new ArrayList<>();
5778+
5779+
if (result != null) {
5780+
logger.warn("lvs listing failed for VG {}: {}", vgName, result);
5781+
return new ListDataStoreObjectsAnswer(false, 0, names, paths, absPaths, isDirs, sizes, lastModified);
5782+
}
5783+
5784+
List<String[]> entries = new ArrayList<>();
5785+
for (String line : parser.getLines().split("\n")) {
5786+
String trimmed = line.trim();
5787+
if (trimmed.isEmpty()) continue;
5788+
String[] cols = trimmed.split("\\s+");
5789+
if (cols.length >= 2) entries.add(cols);
5790+
}
5791+
5792+
int count = entries.size();
5793+
for (int i = startIndex; i < startIndex + pageSize && i < count; i++) {
5794+
String lvName = entries.get(i)[0];
5795+
long size = 0;
5796+
try { size = Long.parseLong(entries.get(i)[1]); } catch (NumberFormatException ignored) {}
5797+
names.add(lvName);
5798+
paths.add("/" + lvName);
5799+
absPaths.add("/dev/" + vgName + "/" + lvName);
5800+
isDirs.add(false);
5801+
sizes.add(size);
5802+
lastModified.add(0L);
5803+
}
5804+
return new ListDataStoreObjectsAnswer(true, count, names, paths, absPaths, isDirs, sizes, lastModified);
5805+
}
5806+
57425807
public boolean addNetworkRules(final String vmName, final String vmId, final String guestIP, final String guestIP6, final String sig, final String seq, final String mac, final String rules, final String vif, final String brname,
57435808
final String secIps) {
57445809
if (!canBridgeFirewall) {

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,8 @@ public Answer copyTemplateToPrimaryStorage(final CopyCommand cmd) {
410410
StoragePoolType.RBD,
411411
StoragePoolType.PowerFlex,
412412
StoragePoolType.Linstor,
413-
StoragePoolType.FiberChannel).contains(primaryPool.getType())) {
413+
StoragePoolType.FiberChannel,
414+
StoragePoolType.CLVM).contains(primaryPool.getType())) {
414415
newTemplate.setFormat(ImageFormat.RAW);
415416
} else {
416417
newTemplate.setFormat(ImageFormat.QCOW2);
@@ -3413,7 +3414,8 @@ private Storage.ImageFormat getFormat(StoragePoolType poolType) {
34133414
StoragePoolType.RBD,
34143415
StoragePoolType.PowerFlex,
34153416
StoragePoolType.Linstor,
3416-
StoragePoolType.FiberChannel).contains(poolType)) {
3417+
StoragePoolType.FiberChannel,
3418+
StoragePoolType.CLVM).contains(poolType)) {
34173419
return ImageFormat.RAW;
34183420
} else {
34193421
return ImageFormat.QCOW2;

server/src/main/java/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
import javax.inject.Inject;
2525

26+
import com.cloud.storage.clvm.ClvmPoolManager;
2627
import org.apache.cloudstack.annotation.AnnotationService;
2728
import org.apache.cloudstack.annotation.dao.AnnotationDao;
2829
import org.apache.cloudstack.api.response.StoragePoolResponse;
@@ -183,7 +184,11 @@ public StoragePoolResponse newStoragePoolResponse(StoragePoolJoinVO pool, boolea
183184
poolResponse.setTags(pool.getTag());
184185
poolResponse.setStorageAccessGroups(pool.getStorageAccessGroup());
185186
poolResponse.setIsTagARule(pool.getIsTagARule());
186-
poolResponse.setOverProvisionFactor(Double.toString(CapacityManager.StorageOverprovisioningFactor.valueIn(pool.getId())));
187+
if (ClvmPoolManager.isClvmPoolType(pool.getPoolType())) {
188+
poolResponse.setOverProvisionFactor(String.valueOf(1));
189+
} else {
190+
poolResponse.setOverProvisionFactor(Double.toString(CapacityManager.StorageOverprovisioningFactor.valueIn(pool.getId())));
191+
}
187192
poolResponse.setManaged(storagePool.isManaged());
188193
Map<String, String> details = ApiDBUtils.getResourceDetails(pool.getId(), ResourceTag.ResourceObjectType.Storage);
189194
poolResponse.setDetails(details);
@@ -274,7 +279,11 @@ public StoragePoolResponse newStoragePoolForMigrationResponse(StoragePoolJoinVO
274279
}
275280
}
276281

277-
poolResponse.setOverProvisionFactor(Double.toString(CapacityManager.StorageOverprovisioningFactor.valueIn(pool.getId())));
282+
if (ClvmPoolManager.isClvmPoolType(pool.getPoolType())) {
283+
poolResponse.setOverProvisionFactor(String.valueOf(1));
284+
} else {
285+
poolResponse.setOverProvisionFactor(Double.toString(CapacityManager.StorageOverprovisioningFactor.valueIn(pool.getId())));
286+
}
278287

279288
// TODO: StatsCollector does not persist data
280289
StorageStats stats = ApiDBUtils.getStoragePoolStatistics(pool.getId());

server/src/main/java/com/cloud/api/query/dao/VolumeJoinDaoImpl.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import javax.inject.Inject;
2424

25+
import com.cloud.storage.clvm.ClvmPoolManager;
2526
import org.apache.cloudstack.annotation.AnnotationService;
2627
import org.apache.cloudstack.annotation.dao.AnnotationDao;
2728
import org.apache.cloudstack.api.ResponseObject.ResponseView;
@@ -134,7 +135,11 @@ public VolumeResponse newVolumeResponse(ResponseView view, VolumeJoinVO volume)
134135
}
135136

136137
if (volume.getProvisioningType() != null) {
137-
volResponse.setProvisioningType(volume.getProvisioningType().toString());
138+
Long poolId = volume.getPoolId();
139+
StoragePoolVO poolVO = primaryDataStoreDao.findById(poolId);
140+
if (poolVO == null || !ClvmPoolManager.isClvmPoolType(poolVO.getPoolType())) {
141+
volResponse.setProvisioningType(volume.getProvisioningType().toString());
142+
}
138143
}
139144

140145
// Show the virtual size of the volume

0 commit comments

Comments
 (0)