Skip to content

Commit 6048afb

Browse files
authored
xenserver: retrieve correct name-label for presetup store (#4816)
Fixes #4729 As reported in the issue ACP 4.7 used a normal UUID in db for a presetup primary store on Xenserver. Later the value has been changed to store's path with '/' removed. Current changes try to retrieve SR's name-lable from store's path if UUID doesn't match path field for a pre-setup store. Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
1 parent ca4669c commit 6048afb

File tree

9 files changed

+57
-25
lines changed

9 files changed

+57
-25
lines changed

plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixHelper.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
// under the License.
1717
package com.cloud.hypervisor.xenserver.resource;
1818

19+
import com.cloud.storage.Storage;
1920
import com.xensource.xenapi.Host;
2021

2122
/**
@@ -44,4 +45,14 @@ public static String getPVbootloaderArgs(String guestOS) {
4445
}
4546
return "";
4647
}
48+
49+
public static String getSRNameLabel(final String poolUuid,
50+
final Storage.StoragePoolType poolType,
51+
final String poolPath) {
52+
if (Storage.StoragePoolType.PreSetup.equals(poolType) &&
53+
!poolPath.contains(poolUuid)) {
54+
return poolPath.replaceFirst("/", "");
55+
}
56+
return poolUuid;
57+
}
4758
}

plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -790,7 +790,9 @@ public Answer createVolume(final CreateObjectCommand cmd) {
790790

791791
try {
792792
final Connection conn = hypervisorResource.getConnection();
793-
final SR poolSr = hypervisorResource.getStorageRepository(conn, data.getDataStore().getUuid());
793+
final PrimaryDataStoreTO primaryStore = (PrimaryDataStoreTO)data.getDataStore();
794+
final SR poolSr = hypervisorResource.getStorageRepository(conn,
795+
CitrixHelper.getSRNameLabel(primaryStore.getUuid(), primaryStore.getPoolType(), primaryStore.getPath()));
794796
VDI.Record vdir = new VDI.Record();
795797
vdir.nameLabel = volume.getName();
796798
vdir.SR = poolSr;
@@ -863,7 +865,9 @@ public Answer copyVolumeFromImageCacheToPrimary(final CopyCommand cmd) {
863865
if (srcStore instanceof NfsTO) {
864866
final NfsTO nfsStore = (NfsTO) srcStore;
865867
try {
866-
final SR primaryStoragePool = hypervisorResource.getStorageRepository(conn, destVolume.getDataStore().getUuid());
868+
final PrimaryDataStoreTO destStore = (PrimaryDataStoreTO)destVolume.getDataStore();
869+
final SR primaryStoragePool = hypervisorResource.getStorageRepository(conn,
870+
CitrixHelper.getSRNameLabel(destStore.getUuid(), destStore.getPoolType(), destStore.getPath()));
867871
final String srUuid = primaryStoragePool.getUuid(conn);
868872
final URI uri = new URI(nfsStore.getUrl());
869873
final String volumePath = uri.getHost() + ":" + uri.getPath() + nfsStore.getPathSeparator() + srcVolume.getPath();
@@ -1145,7 +1149,9 @@ public Answer backupSnapshot(final CopyCommand cmd) {
11451149
final DataTO cacheData = cmd.getCacheTO();
11461150
final DataTO destData = cmd.getDestTO();
11471151
final int wait = cmd.getWait();
1148-
final String primaryStorageNameLabel = srcData.getDataStore().getUuid();
1152+
final PrimaryDataStoreTO primaryStore = (PrimaryDataStoreTO)srcData.getDataStore();
1153+
final String primaryStorageNameLabel = CitrixHelper.getSRNameLabel(primaryStore.getUuid(),
1154+
primaryStore.getPoolType(), primaryStore.getPath());
11491155
String secondaryStorageUrl = null;
11501156
NfsTO cacheStore = null;
11511157
String destPath = null;

plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ public Answer copyTemplateToPrimaryStorage(final CopyCommand cmd) {
325325

326326
destSr = hypervisorResource.prepareManagedSr(conn, details);
327327
} else {
328-
final String srName = destStore.getUuid();
328+
final String srName = CitrixHelper.getSRNameLabel(destStore.getUuid(), destStore.getPoolType(), destStore.getPath());
329329
final Set<SR> srs = SR.getByNameLabel(conn, srName);
330330

331331
if (srs.size() != 1) {
@@ -491,7 +491,8 @@ public Answer backupSnapshot(final CopyCommand cmd) {
491491
final DataTO destData = cmd.getDestTO();
492492
final int wait = cmd.getWait();
493493
final PrimaryDataStoreTO primaryStore = (PrimaryDataStoreTO)srcData.getDataStore();
494-
final String primaryStorageNameLabel = primaryStore.getUuid();
494+
final String primaryStorageNameLabel = CitrixHelper.getSRNameLabel(primaryStore.getUuid(),
495+
primaryStore.getPoolType(), primaryStore.getPath());
495496
String secondaryStorageUrl = null;
496497
NfsTO cacheStore = null;
497498
String destPath = null;
@@ -992,7 +993,8 @@ public Answer copyVolumeFromImageCacheToPrimary(final CopyCommand cmd) {
992993
final SR srcSr = createFileSr(conn, uri.getHost() + ":" + uri.getPath(), volumeDirectory);
993994
Task task = null;
994995
try {
995-
final SR primaryStoragePool = hypervisorResource.getStorageRepository(conn, primaryStore.getUuid());
996+
final SR primaryStoragePool = hypervisorResource.getStorageRepository(conn,
997+
CitrixHelper.getSRNameLabel(primaryStore.getUuid(), primaryStore.getPoolType(), primaryStore.getPath()));
996998
final VDI srcVdi = VDI.getByUuid(conn, volumeUuid);
997999
task = srcVdi.copyAsync(conn, primaryStoragePool, null, null);
9981000
// poll every 1 seconds ,

plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xen610/XenServer610MigrateVolumeCommandWrapper.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import com.cloud.agent.api.storage.MigrateVolumeCommand;
3030
import com.cloud.agent.api.to.DiskTO;
3131
import com.cloud.agent.api.to.StorageFilerTO;
32+
import com.cloud.hypervisor.xenserver.resource.CitrixHelper;
3233
import com.cloud.hypervisor.xenserver.resource.XenServer610Resource;
3334
import com.cloud.resource.CommandWrapper;
3435
import com.cloud.resource.ResourceWrapper;
@@ -62,10 +63,8 @@ public Answer execute(final MigrateVolumeCommand command, final XenServer610Reso
6263
chapInitiatorUsername, chapInitiatorSecret, false);
6364
}
6465
else {
65-
StorageFilerTO destPoolTO = command.getPool();
66-
String destPoolUuid = destPoolTO.getUuid();
67-
68-
destPool = xenServer610Resource.getStorageRepository(connection, destPoolUuid);
66+
final StorageFilerTO pool = command.getPool();
67+
destPool = xenServer610Resource.getStorageRepository(connection, CitrixHelper.getSRNameLabel(pool.getUuid(), pool.getType(), pool.getPath()));
6968
}
7069

7170
Map<String, String> other = new HashMap<>();

plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xen610/XenServer610MigrateWithStorageCommandWrapper.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import java.util.Map;
2525
import java.util.Set;
2626

27-
import com.cloud.utils.Pair;
2827
import org.apache.cloudstack.storage.to.VolumeObjectTO;
2928
import org.apache.log4j.Logger;
3029

@@ -35,12 +34,14 @@
3534
import com.cloud.agent.api.to.StorageFilerTO;
3635
import com.cloud.agent.api.to.VirtualMachineTO;
3736
import com.cloud.agent.api.to.VolumeTO;
37+
import com.cloud.hypervisor.xenserver.resource.CitrixHelper;
3838
import com.cloud.hypervisor.xenserver.resource.XenServer610Resource;
3939
import com.cloud.hypervisor.xenserver.resource.XsHost;
4040
import com.cloud.hypervisor.xenserver.resource.XsLocalNetwork;
4141
import com.cloud.network.Networks.TrafficType;
4242
import com.cloud.resource.CommandWrapper;
4343
import com.cloud.resource.ResourceWrapper;
44+
import com.cloud.utils.Pair;
4445
import com.cloud.utils.exception.CloudRuntimeException;
4546
import com.xensource.xenapi.Connection;
4647
import com.xensource.xenapi.Host;
@@ -88,7 +89,9 @@ public Answer execute(final MigrateWithStorageCommand command, final XenServer61
8889
for (final Pair<VolumeTO, StorageFilerTO> entry : volumeToFiler) {
8990
final StorageFilerTO storageFiler = entry.second();
9091
final VolumeTO volume = entry.first();
91-
vdiMap.put(xenServer610Resource.getVDIbyUuid(connection, volume.getPath()), xenServer610Resource.getStorageRepository(connection, storageFiler.getUuid()));
92+
vdiMap.put(xenServer610Resource.getVDIbyUuid(connection, volume.getPath()),
93+
xenServer610Resource.getStorageRepository(connection,
94+
CitrixHelper.getSRNameLabel(storageFiler.getUuid(), storageFiler.getType(), storageFiler.getPath())));
9295
}
9396

9497
// Get the vm to migrate.

plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixCreateCommandWrapper.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import com.cloud.agent.api.storage.CreateCommand;
2929
import com.cloud.agent.api.to.StorageFilerTO;
3030
import com.cloud.agent.api.to.VolumeTO;
31+
import com.cloud.hypervisor.xenserver.resource.CitrixHelper;
3132
import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
3233
import com.cloud.resource.CommandWrapper;
3334
import com.cloud.resource.ResourceWrapper;
@@ -50,7 +51,8 @@ public Answer execute(final CreateCommand command, final CitrixResourceBase citr
5051

5152
VDI vdi = null;
5253
try {
53-
final SR poolSr = citrixResourceBase.getStorageRepository(conn, pool.getUuid());
54+
final SR poolSr = citrixResourceBase.getStorageRepository(conn,
55+
CitrixHelper.getSRNameLabel(pool.getUuid(), pool.getType(), pool.getPath()));
5456
if (command.getTemplateUrl() != null) {
5557
VDI tmpltvdi = null;
5658

plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixDeleteStoragePoolCommandWrapper.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.cloud.agent.api.Answer;
2727
import com.cloud.agent.api.DeleteStoragePoolCommand;
2828
import com.cloud.agent.api.to.StorageFilerTO;
29+
import com.cloud.hypervisor.xenserver.resource.CitrixHelper;
2930
import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
3031
import com.cloud.resource.CommandWrapper;
3132
import com.cloud.resource.ResourceWrapper;
@@ -46,16 +47,16 @@ public Answer execute(final DeleteStoragePoolCommand command, final CitrixResour
4647

4748
// getRemoveDatastore being true indicates we are using managed storage and need to pull the SR name out of a Map
4849
// instead of pulling it out using getUuid of the StorageFilerTO instance.
50+
51+
String srNameLabel;
4952
if (command.getRemoveDatastore()) {
5053
Map<String, String> details = command.getDetails();
51-
52-
String srNameLabel = details.get(DeleteStoragePoolCommand.DATASTORE_NAME);
53-
54-
sr = citrixResourceBase.getStorageRepository(conn, srNameLabel);
54+
srNameLabel = details.get(DeleteStoragePoolCommand.DATASTORE_NAME);
5555
}
5656
else {
57-
sr = citrixResourceBase.getStorageRepository(conn, poolTO.getUuid());
57+
srNameLabel = CitrixHelper.getSRNameLabel(poolTO.getUuid(), poolTO.getType(), poolTO.getPath());
5858
}
59+
sr = citrixResourceBase.getStorageRepository(conn, srNameLabel);
5960

6061
citrixResourceBase.removeSR(conn, sr);
6162

plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixModifyStoragePoolCommandWrapper.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import com.cloud.agent.api.ModifyStoragePoolAnswer;
2929
import com.cloud.agent.api.ModifyStoragePoolCommand;
3030
import com.cloud.agent.api.to.StorageFilerTO;
31+
import com.cloud.hypervisor.xenserver.resource.CitrixHelper;
3132
import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
3233
import com.cloud.resource.CommandWrapper;
3334
import com.cloud.resource.ResourceWrapper;
@@ -49,7 +50,10 @@ public Answer execute(final ModifyStoragePoolCommand command, final CitrixResour
4950
final boolean add = command.getAdd();
5051
if (add) {
5152
try {
52-
final String srName = command.getStoragePath() != null ? command.getStoragePath() : pool.getUuid();
53+
String srName = command.getStoragePath();
54+
if (srName == null) {
55+
srName = CitrixHelper.getSRNameLabel(pool.getUuid(), pool.getType(), pool.getPath());
56+
}
5357
final SR sr = citrixResourceBase.getStorageRepository(conn, srName);
5458
citrixResourceBase.setupHeartbeatSr(conn, sr, false);
5559
final long capacity = sr.getPhysicalSize(conn);
@@ -75,7 +79,8 @@ public Answer execute(final ModifyStoragePoolCommand command, final CitrixResour
7579
}
7680
} else {
7781
try {
78-
final SR sr = citrixResourceBase.getStorageRepository(conn, pool.getUuid());
82+
final SR sr = citrixResourceBase.getStorageRepository(conn,
83+
CitrixHelper.getSRNameLabel(pool.getUuid(), pool.getType(), pool.getPath()));
7984
final String srUuid = sr.getUuid(conn);
8085
final String result = citrixResourceBase.callHostPluginPremium(conn, "setup_heartbeat_file", "host", citrixResourceBase.getHost().getUuid(), "sr", srUuid, "add",
8186
"false");

plugins/hypervisors/xenserver/src/main/java/org/apache/cloudstack/storage/motion/XenServerStorageMotionStrategy.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,17 +58,18 @@
5858
import com.cloud.exception.OperationTimedoutException;
5959
import com.cloud.host.Host;
6060
import com.cloud.hypervisor.Hypervisor.HypervisorType;
61-
import com.cloud.storage.dao.SnapshotDao;
62-
import com.cloud.storage.StoragePool;
61+
import com.cloud.hypervisor.xenserver.resource.CitrixHelper;
6362
import com.cloud.storage.Snapshot;
6463
import com.cloud.storage.SnapshotVO;
65-
import com.cloud.storage.VolumeVO;
64+
import com.cloud.storage.StoragePool;
6665
import com.cloud.storage.VolumeDetailVO;
66+
import com.cloud.storage.VolumeVO;
67+
import com.cloud.storage.dao.SnapshotDao;
6768
import com.cloud.storage.dao.VolumeDao;
6869
import com.cloud.storage.dao.VolumeDetailsDao;
69-
import com.cloud.utils.exception.CloudRuntimeException;
7070
import com.cloud.utils.Pair;
7171
import com.cloud.utils.StringUtils;
72+
import com.cloud.utils.exception.CloudRuntimeException;
7273
import com.cloud.vm.VMInstanceVO;
7374
import com.cloud.vm.dao.VMInstanceDao;
7475

@@ -326,7 +327,9 @@ private Answer migrateVmWithVolumesAcrossCluster(VMInstanceVO vm, VirtualMachine
326327
volumeToStorageUuid.add(new Pair<>(volumeTo, iqn));
327328
}
328329
else {
329-
volumeToStorageUuid.add(new Pair<>(volumeTo, ((StoragePool)entry.getValue()).getUuid()));
330+
StoragePool pool = (StoragePool)entry.getValue();
331+
String srNameLabel = CitrixHelper.getSRNameLabel(pool.getUuid(), pool.getPoolType(), pool.getPath());
332+
volumeToStorageUuid.add(new Pair<>(volumeTo, srNameLabel));
330333
}
331334
}
332335

0 commit comments

Comments
 (0)