From 6048afb464f5aa25f48ec9690151de84f43744c3 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Mon, 5 Apr 2021 14:28:27 +0530 Subject: [PATCH] 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 --- .../hypervisor/xenserver/resource/CitrixHelper.java | 11 +++++++++++ .../resource/XenServerStorageProcessor.java | 12 +++++++++--- .../resource/Xenserver625StorageProcessor.java | 8 +++++--- .../XenServer610MigrateVolumeCommandWrapper.java | 7 +++---- ...enServer610MigrateWithStorageCommandWrapper.java | 7 +++++-- .../wrapper/xenbase/CitrixCreateCommandWrapper.java | 4 +++- .../CitrixDeleteStoragePoolCommandWrapper.java | 11 ++++++----- .../CitrixModifyStoragePoolCommandWrapper.java | 9 +++++++-- .../motion/XenServerStorageMotionStrategy.java | 13 ++++++++----- 9 files changed, 57 insertions(+), 25 deletions(-) diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixHelper.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixHelper.java index 1fbee1f0ead..a9ee1dd7608 100644 --- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixHelper.java +++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixHelper.java @@ -16,6 +16,7 @@ // under the License. package com.cloud.hypervisor.xenserver.resource; +import com.cloud.storage.Storage; import com.xensource.xenapi.Host; /** @@ -44,4 +45,14 @@ public class CitrixHelper { } return ""; } + + public static String getSRNameLabel(final String poolUuid, + final Storage.StoragePoolType poolType, + final String poolPath) { + if (Storage.StoragePoolType.PreSetup.equals(poolType) && + !poolPath.contains(poolUuid)) { + return poolPath.replaceFirst("/", ""); + } + return poolUuid; + } } diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java index e4c07d4ba79..3ee4420fd2f 100644 --- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java +++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java @@ -790,7 +790,9 @@ public class XenServerStorageProcessor implements StorageProcessor { try { final Connection conn = hypervisorResource.getConnection(); - final SR poolSr = hypervisorResource.getStorageRepository(conn, data.getDataStore().getUuid()); + final PrimaryDataStoreTO primaryStore = (PrimaryDataStoreTO)data.getDataStore(); + final SR poolSr = hypervisorResource.getStorageRepository(conn, + CitrixHelper.getSRNameLabel(primaryStore.getUuid(), primaryStore.getPoolType(), primaryStore.getPath())); VDI.Record vdir = new VDI.Record(); vdir.nameLabel = volume.getName(); vdir.SR = poolSr; @@ -863,7 +865,9 @@ public class XenServerStorageProcessor implements StorageProcessor { if (srcStore instanceof NfsTO) { final NfsTO nfsStore = (NfsTO) srcStore; try { - final SR primaryStoragePool = hypervisorResource.getStorageRepository(conn, destVolume.getDataStore().getUuid()); + final PrimaryDataStoreTO destStore = (PrimaryDataStoreTO)destVolume.getDataStore(); + final SR primaryStoragePool = hypervisorResource.getStorageRepository(conn, + CitrixHelper.getSRNameLabel(destStore.getUuid(), destStore.getPoolType(), destStore.getPath())); final String srUuid = primaryStoragePool.getUuid(conn); final URI uri = new URI(nfsStore.getUrl()); final String volumePath = uri.getHost() + ":" + uri.getPath() + nfsStore.getPathSeparator() + srcVolume.getPath(); @@ -1145,7 +1149,9 @@ public class XenServerStorageProcessor implements StorageProcessor { final DataTO cacheData = cmd.getCacheTO(); final DataTO destData = cmd.getDestTO(); final int wait = cmd.getWait(); - final String primaryStorageNameLabel = srcData.getDataStore().getUuid(); + final PrimaryDataStoreTO primaryStore = (PrimaryDataStoreTO)srcData.getDataStore(); + final String primaryStorageNameLabel = CitrixHelper.getSRNameLabel(primaryStore.getUuid(), + primaryStore.getPoolType(), primaryStore.getPath()); String secondaryStorageUrl = null; NfsTO cacheStore = null; String destPath = null; diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java index a2c8b708bf3..afb6d0ddef1 100644 --- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java +++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java @@ -325,7 +325,7 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor { destSr = hypervisorResource.prepareManagedSr(conn, details); } else { - final String srName = destStore.getUuid(); + final String srName = CitrixHelper.getSRNameLabel(destStore.getUuid(), destStore.getPoolType(), destStore.getPath()); final Set srs = SR.getByNameLabel(conn, srName); if (srs.size() != 1) { @@ -491,7 +491,8 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor { final DataTO destData = cmd.getDestTO(); final int wait = cmd.getWait(); final PrimaryDataStoreTO primaryStore = (PrimaryDataStoreTO)srcData.getDataStore(); - final String primaryStorageNameLabel = primaryStore.getUuid(); + final String primaryStorageNameLabel = CitrixHelper.getSRNameLabel(primaryStore.getUuid(), + primaryStore.getPoolType(), primaryStore.getPath()); String secondaryStorageUrl = null; NfsTO cacheStore = null; String destPath = null; @@ -992,7 +993,8 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor { final SR srcSr = createFileSr(conn, uri.getHost() + ":" + uri.getPath(), volumeDirectory); Task task = null; try { - final SR primaryStoragePool = hypervisorResource.getStorageRepository(conn, primaryStore.getUuid()); + final SR primaryStoragePool = hypervisorResource.getStorageRepository(conn, + CitrixHelper.getSRNameLabel(primaryStore.getUuid(), primaryStore.getPoolType(), primaryStore.getPath())); final VDI srcVdi = VDI.getByUuid(conn, volumeUuid); task = srcVdi.copyAsync(conn, primaryStoragePool, null, null); // poll every 1 seconds , diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xen610/XenServer610MigrateVolumeCommandWrapper.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xen610/XenServer610MigrateVolumeCommandWrapper.java index 896df6a7a47..e35bfb04572 100644 --- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xen610/XenServer610MigrateVolumeCommandWrapper.java +++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xen610/XenServer610MigrateVolumeCommandWrapper.java @@ -29,6 +29,7 @@ import com.cloud.agent.api.storage.MigrateVolumeAnswer; import com.cloud.agent.api.storage.MigrateVolumeCommand; import com.cloud.agent.api.to.DiskTO; import com.cloud.agent.api.to.StorageFilerTO; +import com.cloud.hypervisor.xenserver.resource.CitrixHelper; import com.cloud.hypervisor.xenserver.resource.XenServer610Resource; import com.cloud.resource.CommandWrapper; import com.cloud.resource.ResourceWrapper; @@ -62,10 +63,8 @@ public final class XenServer610MigrateVolumeCommandWrapper extends CommandWrappe chapInitiatorUsername, chapInitiatorSecret, false); } else { - StorageFilerTO destPoolTO = command.getPool(); - String destPoolUuid = destPoolTO.getUuid(); - - destPool = xenServer610Resource.getStorageRepository(connection, destPoolUuid); + final StorageFilerTO pool = command.getPool(); + destPool = xenServer610Resource.getStorageRepository(connection, CitrixHelper.getSRNameLabel(pool.getUuid(), pool.getType(), pool.getPath())); } Map other = new HashMap<>(); diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xen610/XenServer610MigrateWithStorageCommandWrapper.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xen610/XenServer610MigrateWithStorageCommandWrapper.java index f3f9f643466..dabcf0201b6 100644 --- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xen610/XenServer610MigrateWithStorageCommandWrapper.java +++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xen610/XenServer610MigrateWithStorageCommandWrapper.java @@ -24,7 +24,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import com.cloud.utils.Pair; import org.apache.cloudstack.storage.to.VolumeObjectTO; import org.apache.log4j.Logger; @@ -35,12 +34,14 @@ import com.cloud.agent.api.to.NicTO; import com.cloud.agent.api.to.StorageFilerTO; import com.cloud.agent.api.to.VirtualMachineTO; import com.cloud.agent.api.to.VolumeTO; +import com.cloud.hypervisor.xenserver.resource.CitrixHelper; import com.cloud.hypervisor.xenserver.resource.XenServer610Resource; import com.cloud.hypervisor.xenserver.resource.XsHost; import com.cloud.hypervisor.xenserver.resource.XsLocalNetwork; import com.cloud.network.Networks.TrafficType; import com.cloud.resource.CommandWrapper; import com.cloud.resource.ResourceWrapper; +import com.cloud.utils.Pair; import com.cloud.utils.exception.CloudRuntimeException; import com.xensource.xenapi.Connection; import com.xensource.xenapi.Host; @@ -88,7 +89,9 @@ public final class XenServer610MigrateWithStorageCommandWrapper extends CommandW for (final Pair entry : volumeToFiler) { final StorageFilerTO storageFiler = entry.second(); final VolumeTO volume = entry.first(); - vdiMap.put(xenServer610Resource.getVDIbyUuid(connection, volume.getPath()), xenServer610Resource.getStorageRepository(connection, storageFiler.getUuid())); + vdiMap.put(xenServer610Resource.getVDIbyUuid(connection, volume.getPath()), + xenServer610Resource.getStorageRepository(connection, + CitrixHelper.getSRNameLabel(storageFiler.getUuid(), storageFiler.getType(), storageFiler.getPath()))); } // Get the vm to migrate. diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixCreateCommandWrapper.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixCreateCommandWrapper.java index 38150ce4656..50bbe45a4a6 100644 --- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixCreateCommandWrapper.java +++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixCreateCommandWrapper.java @@ -28,6 +28,7 @@ import com.cloud.agent.api.storage.CreateAnswer; import com.cloud.agent.api.storage.CreateCommand; import com.cloud.agent.api.to.StorageFilerTO; import com.cloud.agent.api.to.VolumeTO; +import com.cloud.hypervisor.xenserver.resource.CitrixHelper; import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase; import com.cloud.resource.CommandWrapper; import com.cloud.resource.ResourceWrapper; @@ -50,7 +51,8 @@ public final class CitrixCreateCommandWrapper extends CommandWrapper details = command.getDetails(); - - String srNameLabel = details.get(DeleteStoragePoolCommand.DATASTORE_NAME); - - sr = citrixResourceBase.getStorageRepository(conn, srNameLabel); + srNameLabel = details.get(DeleteStoragePoolCommand.DATASTORE_NAME); } else { - sr = citrixResourceBase.getStorageRepository(conn, poolTO.getUuid()); + srNameLabel = CitrixHelper.getSRNameLabel(poolTO.getUuid(), poolTO.getType(), poolTO.getPath()); } + sr = citrixResourceBase.getStorageRepository(conn, srNameLabel); citrixResourceBase.removeSR(conn, sr); diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixModifyStoragePoolCommandWrapper.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixModifyStoragePoolCommandWrapper.java index 4c7136e28f5..888aa81d374 100644 --- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixModifyStoragePoolCommandWrapper.java +++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixModifyStoragePoolCommandWrapper.java @@ -28,6 +28,7 @@ import com.cloud.agent.api.Answer; import com.cloud.agent.api.ModifyStoragePoolAnswer; import com.cloud.agent.api.ModifyStoragePoolCommand; import com.cloud.agent.api.to.StorageFilerTO; +import com.cloud.hypervisor.xenserver.resource.CitrixHelper; import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase; import com.cloud.resource.CommandWrapper; import com.cloud.resource.ResourceWrapper; @@ -49,7 +50,10 @@ public final class CitrixModifyStoragePoolCommandWrapper extends CommandWrapper< final boolean add = command.getAdd(); if (add) { try { - final String srName = command.getStoragePath() != null ? command.getStoragePath() : pool.getUuid(); + String srName = command.getStoragePath(); + if (srName == null) { + srName = CitrixHelper.getSRNameLabel(pool.getUuid(), pool.getType(), pool.getPath()); + } final SR sr = citrixResourceBase.getStorageRepository(conn, srName); citrixResourceBase.setupHeartbeatSr(conn, sr, false); final long capacity = sr.getPhysicalSize(conn); @@ -75,7 +79,8 @@ public final class CitrixModifyStoragePoolCommandWrapper extends CommandWrapper< } } else { try { - final SR sr = citrixResourceBase.getStorageRepository(conn, pool.getUuid()); + final SR sr = citrixResourceBase.getStorageRepository(conn, + CitrixHelper.getSRNameLabel(pool.getUuid(), pool.getType(), pool.getPath())); final String srUuid = sr.getUuid(conn); final String result = citrixResourceBase.callHostPluginPremium(conn, "setup_heartbeat_file", "host", citrixResourceBase.getHost().getUuid(), "sr", srUuid, "add", "false"); diff --git a/plugins/hypervisors/xenserver/src/main/java/org/apache/cloudstack/storage/motion/XenServerStorageMotionStrategy.java b/plugins/hypervisors/xenserver/src/main/java/org/apache/cloudstack/storage/motion/XenServerStorageMotionStrategy.java index ee56f699bda..9d93f97f5c3 100644 --- a/plugins/hypervisors/xenserver/src/main/java/org/apache/cloudstack/storage/motion/XenServerStorageMotionStrategy.java +++ b/plugins/hypervisors/xenserver/src/main/java/org/apache/cloudstack/storage/motion/XenServerStorageMotionStrategy.java @@ -58,17 +58,18 @@ import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.OperationTimedoutException; import com.cloud.host.Host; import com.cloud.hypervisor.Hypervisor.HypervisorType; -import com.cloud.storage.dao.SnapshotDao; -import com.cloud.storage.StoragePool; +import com.cloud.hypervisor.xenserver.resource.CitrixHelper; import com.cloud.storage.Snapshot; import com.cloud.storage.SnapshotVO; -import com.cloud.storage.VolumeVO; +import com.cloud.storage.StoragePool; import com.cloud.storage.VolumeDetailVO; +import com.cloud.storage.VolumeVO; +import com.cloud.storage.dao.SnapshotDao; import com.cloud.storage.dao.VolumeDao; import com.cloud.storage.dao.VolumeDetailsDao; -import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.Pair; import com.cloud.utils.StringUtils; +import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.dao.VMInstanceDao; @@ -326,7 +327,9 @@ public class XenServerStorageMotionStrategy implements DataMotionStrategy { volumeToStorageUuid.add(new Pair<>(volumeTo, iqn)); } else { - volumeToStorageUuid.add(new Pair<>(volumeTo, ((StoragePool)entry.getValue()).getUuid())); + StoragePool pool = (StoragePool)entry.getValue(); + String srNameLabel = CitrixHelper.getSRNameLabel(pool.getUuid(), pool.getPoolType(), pool.getPath()); + volumeToStorageUuid.add(new Pair<>(volumeTo, srNameLabel)); } }