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 d530969941b..b3fce78af86 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 @@ -798,7 +798,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; @@ -871,7 +873,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(); @@ -1153,7 +1157,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 9b54e0bc1f7..97a4efa06d7 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 @@ -328,7 +328,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) { @@ -494,7 +494,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; @@ -1001,7 +1002,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)); } }