This is an automated email from the ASF dual-hosted git repository.

rohit pushed a commit to branch 4.18
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.18 by this push:
     new f731fe882c5 Storage plugin support to check if volume on datastore 
requires access for migration (#8655)
f731fe882c5 is described below

commit f731fe882c5b8459a14da9a13269a8360df2743e
Author: Suresh Kumar Anaparti <suresh.anapa...@shapeblue.com>
AuthorDate: Mon Feb 26 20:16:31 2024 +0530

    Storage plugin support to check if volume on datastore requires access for 
migration (#8655)
    
    * Check if volume on datastore requires access for migration, and 
grant/revoke volume access if requires
    
    * Updated default implementation for requiresAccessForMigration method in 
PrimaryDataStoreDriver
---
 .../subsystem/api/storage/PrimaryDataStoreDriver.java       |  4 ++++
 .../engine/subsystem/api/storage/VolumeService.java         |  2 ++
 .../cloudstack/engine/orchestration/VolumeOrchestrator.java |  8 ++++----
 .../apache/cloudstack/storage/volume/VolumeServiceImpl.java | 13 +++++++++++++
 .../datastore/driver/ScaleIOPrimaryDataStoreDriver.java     |  5 +++++
 5 files changed, 28 insertions(+), 4 deletions(-)

diff --git 
a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreDriver.java
 
b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreDriver.java
index 540d4f6673a..4ab88c19316 100644
--- 
a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreDriver.java
+++ 
b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreDriver.java
@@ -42,6 +42,10 @@ public interface PrimaryDataStoreDriver extends 
DataStoreDriver {
 
     void revokeAccess(DataObject dataObject, Host host, DataStore dataStore);
 
+    default boolean requiresAccessForMigration(DataObject dataObject) {
+        return false;
+    }
+
     /**
      * intended for managed storage (cloud.storage_pool.managed = true)
      * if not managed, return volume.getSize()
diff --git 
a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/VolumeService.java
 
b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/VolumeService.java
index 2c12b70e9eb..a6ebf95a99c 100644
--- 
a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/VolumeService.java
+++ 
b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/VolumeService.java
@@ -54,6 +54,8 @@ public interface VolumeService {
 
     void revokeAccess(DataObject dataObject, Host host, DataStore dataStore);
 
+    boolean requiresAccessForMigration(DataObject dataObject, DataStore 
dataStore);
+
     /**
      * Creates the volume based on the given criteria
      *
diff --git 
a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
 
b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
index c3908795f7c..ec10c344157 100644
--- 
a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
+++ 
b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
@@ -1228,8 +1228,8 @@ public class VolumeOrchestrator extends ManagerBase 
implements VolumeOrchestrati
                 DataStore dataStore = 
dataStoreMgr.getDataStore(volumeForVm.getPoolId(), DataStoreRole.Primary);
                 PrimaryDataStore primaryDataStore = 
(PrimaryDataStore)dataStore;
 
-                // This might impact other managed storages, grant access for 
PowerFlex storage pool only
-                if (primaryDataStore.isManaged() && 
primaryDataStore.getPoolType() == Storage.StoragePoolType.PowerFlex) {
+                // This might impact other managed storages, enable requires 
access for migration in relevant datastore driver (currently enabled for 
PowerFlex storage pool only)
+                if (primaryDataStore.isManaged() && 
volService.requiresAccessForMigration(volumeInfo, dataStore)) {
                     volService.revokeAccess(volumeInfo, host, dataStore);
                 }
             }
@@ -1507,8 +1507,8 @@ public class VolumeOrchestrator extends ManagerBase 
implements VolumeOrchestrati
             disk.setDetails(getDetails(volumeInfo, dataStore));
 
             PrimaryDataStore primaryDataStore = (PrimaryDataStore)dataStore;
-            // This might impact other managed storages, grant access for 
PowerFlex storage pool only
-            if (primaryDataStore.isManaged() && primaryDataStore.getPoolType() 
== Storage.StoragePoolType.PowerFlex) {
+            // This might impact other managed storages, enable requires 
access for migration in relevant datastore driver (currently enabled for 
PowerFlex storage pool only)
+            if (primaryDataStore.isManaged() && 
volService.requiresAccessForMigration(volumeInfo, dataStore)) {
                 volService.grantAccess(volFactory.getVolume(vol.getId()), 
dest.getHost(), dataStore);
             }
 
diff --git 
a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
 
b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
index 47577cc52b2..03460d0d1e5 100644
--- 
a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
+++ 
b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
@@ -266,6 +266,19 @@ public class VolumeServiceImpl implements VolumeService {
         }
     }
 
+    @Override
+    public boolean requiresAccessForMigration(DataObject dataObject, DataStore 
dataStore) {
+        DataStoreDriver dataStoreDriver = dataStore != null ? 
dataStore.getDriver() : null;
+        if (dataStoreDriver == null) {
+            return false;
+        }
+
+        if (dataStoreDriver instanceof PrimaryDataStoreDriver) {
+            return 
((PrimaryDataStoreDriver)dataStoreDriver).requiresAccessForMigration(dataObject);
+        }
+        return false;
+    }
+
     @Override
     public AsyncCallFuture<VolumeApiResult> createVolumeAsync(VolumeInfo 
volume, DataStore dataStore) {
         AsyncCallFuture<VolumeApiResult> future = new 
AsyncCallFuture<VolumeApiResult>();
diff --git 
a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java
 
b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java
index cad88dcdd15..431fddb566f 100644
--- 
a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java
+++ 
b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java
@@ -302,6 +302,11 @@ public class ScaleIOPrimaryDataStoreDriver implements 
PrimaryDataStoreDriver {
         return null;
     }
 
+    @Override
+    public boolean requiresAccessForMigration(DataObject dataObject) {
+        return true;
+    }
+
     @Override
     public long getUsedBytes(StoragePool storagePool) {
         long usedSpaceBytes = 0;

Reply via email to