diff --git a/engine/api/src/org/apache/cloudstack/engine/orchestration/service/VolumeOrchestrationService.java b/engine/api/src/org/apache/cloudstack/engine/orchestration/service/VolumeOrchestrationService.java index df0b5e8e70f..281de9281de 100644 --- a/engine/api/src/org/apache/cloudstack/engine/orchestration/service/VolumeOrchestrationService.java +++ b/engine/api/src/org/apache/cloudstack/engine/orchestration/service/VolumeOrchestrationService.java @@ -21,6 +21,7 @@ package org.apache.cloudstack.engine.orchestration.service; import java.util.Map; import java.util.Set; +import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; @@ -95,9 +96,9 @@ public interface VolumeOrchestrationService { void cleanupVolumes(long vmId) throws ConcurrentOperationException; - void disconnectVolumeFromHost(VolumeInfo volumeInfo, Host host, DataStore dataStore); + void revokeAccess(DataObject dataObject, Host host, DataStore dataStore); - void disconnectVolumesFromHost(long vmId, long hostId); + void revokeAccess(long vmId, long hostId); void migrateVolumes(VirtualMachine vm, VirtualMachineTO vmTo, Host srcHost, Host destHost, Map volumeToPool); diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreDriver.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreDriver.java index 43d7d5a07f5..ebaa260111e 100644 --- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreDriver.java +++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreDriver.java @@ -28,9 +28,9 @@ import com.cloud.storage.Volume; public interface PrimaryDataStoreDriver extends DataStoreDriver { public ChapInfo getChapInfo(VolumeInfo volumeInfo); - public boolean connectVolumeToHost(VolumeInfo volumeInfo, Host host, DataStore dataStore); + public boolean grantAccess(DataObject dataObject, Host host, DataStore dataStore); - public void disconnectVolumeFromHost(VolumeInfo volumeInfo, Host host, DataStore dataStore); + public void revokeAccess(DataObject dataObject, Host host, DataStore dataStore); // intended for managed storage (cloud.storage_pool.managed = true) // if not managed, return volume.getSize() diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeService.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeService.java index cadce56c588..171e9df0dc0 100644 --- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeService.java +++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeService.java @@ -44,9 +44,9 @@ public interface VolumeService { ChapInfo getChapInfo(VolumeInfo volumeInfo, DataStore dataStore); - boolean connectVolumeToHost(VolumeInfo volumeInfo, Host host, DataStore dataStore); + boolean grantAccess(DataObject dataObject, Host host, DataStore dataStore); - void disconnectVolumeFromHost(VolumeInfo volumeInfo, Host host, DataStore dataStore); + void revokeAccess(DataObject dataObject, Host host, DataStore dataStore); /** * Creates the volume based on the given criteria diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java index de2fd28e3a1..b73d1296cdc 100755 --- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -517,7 +517,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac } if (hostId != null) { - volumeMgr.disconnectVolumesFromHost(vm.getId(), hostId); + volumeMgr.revokeAccess(vm.getId(), hostId); } // Clean up volumes based on the vm's instance id diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java index 262b94d881d..4b40d5abbb4 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java @@ -34,6 +34,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService; import org.apache.cloudstack.engine.subsystem.api.storage.ChapInfo; +import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreDriver; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; @@ -871,16 +872,16 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati } @Override - public void disconnectVolumeFromHost(VolumeInfo volumeInfo, Host host, DataStore dataStore) { + public void revokeAccess(DataObject dataObject, Host host, DataStore dataStore) { DataStoreDriver dataStoreDriver = dataStore != null ? dataStore.getDriver() : null; if (dataStoreDriver instanceof PrimaryDataStoreDriver) { - ((PrimaryDataStoreDriver)dataStoreDriver).disconnectVolumeFromHost(volumeInfo, host, dataStore); + ((PrimaryDataStoreDriver)dataStoreDriver).revokeAccess(dataObject, host, dataStore); } } @Override - public void disconnectVolumesFromHost(long vmId, long hostId) { + public void revokeAccess(long vmId, long hostId) { HostVO host = _hostDao.findById(hostId); List volumesForVm = _volsDao.findByInstance(vmId); @@ -888,10 +889,12 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati if (volumesForVm != null) { for (VolumeVO volumeForVm : volumesForVm) { VolumeInfo volumeInfo = volFactory.getVolume(volumeForVm.getId()); + // pool id can be null for the VM's volumes in Allocated state if (volumeForVm.getPoolId() != null) { DataStore dataStore = dataStoreMgr.getDataStore(volumeForVm.getPoolId(), DataStoreRole.Primary); - volService.disconnectVolumeFromHost(volumeInfo, host, dataStore); + + volService.revokeAccess(volumeInfo, host, dataStore); } } } @@ -1246,7 +1249,7 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati long hostId = vm.getVirtualMachine().getHostId(); Host host = _hostDao.findById(hostId); - volService.connectVolumeToHost(volFactory.getVolume(newVol.getId()), host, destPool); + volService.grantAccess(volFactory.getVolume(newVol.getId()), host, destPool); } newVol = _volsDao.findById(newVol.getId()); diff --git a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/FakePrimaryDataStoreDriver.java b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/FakePrimaryDataStoreDriver.java index 7d9cd72c6b2..18637b0466c 100644 --- a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/FakePrimaryDataStoreDriver.java +++ b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/FakePrimaryDataStoreDriver.java @@ -49,10 +49,10 @@ public class FakePrimaryDataStoreDriver implements PrimaryDataStoreDriver { } @Override - public boolean connectVolumeToHost(VolumeInfo volumeInfo, Host host, DataStore dataStore) { return false; } + public boolean grantAccess(DataObject dataObject, Host host, DataStore dataStore) { return false; } @Override - public void disconnectVolumeFromHost(VolumeInfo volumeInfo, Host host, DataStore dataStore) {} + public void revokeAccess(DataObject dataObject, Host host, DataStore dataStore) {} @Override public long getUsedBytes(StoragePool storagePool) { diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/StorageSystemSnapshotStrategy.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/StorageSystemSnapshotStrategy.java index 09c5d5fcf39..c8954590871 100644 --- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/StorageSystemSnapshotStrategy.java +++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/StorageSystemSnapshotStrategy.java @@ -221,19 +221,19 @@ public class StorageSystemSnapshotStrategy extends SnapshotStrategyBase { try { // if sourceDetails != null, we need to connect the host(s) to the volume if (sourceDetails != null) { - _volService.connectVolumeToHost(volumeInfo, hostVO, dataStore); + _volService.grantAccess(volumeInfo, hostVO, dataStore); } VolumeVO volume = _volumeDao.findById(volumeInfo.getId()); - // the Folder field is used by connectVolumeToHost(VolumeInfo, Host, DataStore) when that method + // the Folder field is used by grantAccess(VolumeInfo, Host, DataStore) when that method // connects the host(s) to the volume // this Folder change is NOT to be written to the DB; it is only temporarily used here so that // the connect method can be passed in the expected data and do its work (on the volume that backs // the snapshot) volume.setFolder(destDetails.get(DiskTO.VOLUME_ID)); - _volService.connectVolumeToHost(volumeInfo, hostVO, dataStore); + _volService.grantAccess(volumeInfo, hostVO, dataStore); snapshotAndCopyAnswer = (SnapshotAndCopyAnswer)_agentMgr.send(hostVO.getId(), snapshotAndCopyCommand); } @@ -244,18 +244,18 @@ public class StorageSystemSnapshotStrategy extends SnapshotStrategyBase { try { VolumeVO volume = _volumeDao.findById(volumeInfo.getId()); - // the Folder field is used by disconnectVolumeFromHost(VolumeInfo, Host, DataStore) when that method + // the Folder field is used by revokeAccess(VolumeInfo, Host, DataStore) when that method // disconnects the host(s) from the volume // this Folder change is NOT to be written to the DB; it is only temporarily used here so that // the disconnect method can be passed in the expected data and do its work (on the volume that backs // the snapshot) volume.setFolder(destDetails.get(DiskTO.VOLUME_ID)); - _volService.disconnectVolumeFromHost(volumeInfo, hostVO, dataStore); + _volService.revokeAccess(volumeInfo, hostVO, dataStore); // if sourceDetails != null, we need to disconnect the host(s) from the volume if (sourceDetails != null) { - _volService.disconnectVolumeFromHost(volumeInfo, hostVO, dataStore); + _volService.revokeAccess(volumeInfo, hostVO, dataStore); } } catch (Exception ex) { diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java index d97ad600cc8..9174d89eff0 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java @@ -167,22 +167,22 @@ public class VolumeServiceImpl implements VolumeService { } @Override - public boolean connectVolumeToHost(VolumeInfo volumeInfo, Host host, DataStore dataStore) { + public boolean grantAccess(DataObject dataObject, Host host, DataStore dataStore) { DataStoreDriver dataStoreDriver = dataStore != null ? dataStore.getDriver() : null; if (dataStoreDriver instanceof PrimaryDataStoreDriver) { - return ((PrimaryDataStoreDriver)dataStoreDriver).connectVolumeToHost(volumeInfo, host, dataStore); + return ((PrimaryDataStoreDriver)dataStoreDriver).grantAccess(dataObject, host, dataStore); } return false; } @Override - public void disconnectVolumeFromHost(VolumeInfo volumeInfo, Host host, DataStore dataStore) { + public void revokeAccess(DataObject dataObject, Host host, DataStore dataStore) { DataStoreDriver dataStoreDriver = dataStore != null ? dataStore.getDriver() : null; if (dataStoreDriver instanceof PrimaryDataStoreDriver) { - ((PrimaryDataStoreDriver)dataStoreDriver).disconnectVolumeFromHost(volumeInfo, host, dataStore); + ((PrimaryDataStoreDriver)dataStoreDriver).revokeAccess(dataObject, host, dataStore); } } @@ -677,7 +677,7 @@ public class VolumeServiceImpl implements VolumeService { // refresh the volume from the DB volumeInfo = volFactory.getVolume(volumeInfo.getId(), destPrimaryDataStore); - connectVolumeToHost(volumeInfo, destHost, destPrimaryDataStore); + grantAccess(volumeInfo, destHost, destPrimaryDataStore); ManagedCreateBaseImageContext context = new ManagedCreateBaseImageContext(null, volumeInfo, destPrimaryDataStore, srcTemplateInfo, future); @@ -712,7 +712,7 @@ public class VolumeServiceImpl implements VolumeService { volumeInfo.processEvent(Event.DestroyRequested); - disconnectVolumeFromHost(volumeInfo, destHost, destPrimaryDataStore); + revokeAccess(volumeInfo, destHost, destPrimaryDataStore); try { AsyncCallFuture expungeVolumeFuture = expungeVolumeAsync(volumeInfo); diff --git a/plugins/storage/volume/cloudbyte/src/org/apache/cloudstack/storage/datastore/driver/ElastistorPrimaryDataStoreDriver.java b/plugins/storage/volume/cloudbyte/src/org/apache/cloudstack/storage/datastore/driver/ElastistorPrimaryDataStoreDriver.java index 20c9289143c..23db12d441b 100755 --- a/plugins/storage/volume/cloudbyte/src/org/apache/cloudstack/storage/datastore/driver/ElastistorPrimaryDataStoreDriver.java +++ b/plugins/storage/volume/cloudbyte/src/org/apache/cloudstack/storage/datastore/driver/ElastistorPrimaryDataStoreDriver.java @@ -401,13 +401,13 @@ public class ElastistorPrimaryDataStoreDriver extends CloudStackPrimaryDataStore } @Override - public boolean connectVolumeToHost(VolumeInfo volumeInfo, Host host, DataStore dataStore) { + public boolean grantAccess(DataObject dataObject, Host host, DataStore dataStore) { // TODO Auto-generated method stub return false; } @Override - public void disconnectVolumeFromHost(VolumeInfo volumeInfo, Host host, DataStore dataStore) { + public void revokeAccess(DataObject dataObject, Host host, DataStore dataStore) { // TODO Auto-generated method stub } diff --git a/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackPrimaryDataStoreDriverImpl.java b/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackPrimaryDataStoreDriverImpl.java index bcc06b021b6..9421102004f 100644 --- a/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackPrimaryDataStoreDriverImpl.java +++ b/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackPrimaryDataStoreDriverImpl.java @@ -149,12 +149,12 @@ public class CloudStackPrimaryDataStoreDriverImpl implements PrimaryDataStoreDri } @Override - public boolean connectVolumeToHost(VolumeInfo volumeInfo, Host host, DataStore dataStore) { + public boolean grantAccess(DataObject dataObject, Host host, DataStore dataStore) { return false; } @Override - public void disconnectVolumeFromHost(VolumeInfo volumeInfo, Host host, DataStore dataStore) { + public void revokeAccess(DataObject dataObject, Host host, DataStore dataStore) { } @Override diff --git a/plugins/storage/volume/nexenta/src/org/apache/cloudstack/storage/datastore/driver/NexentaPrimaryDataStoreDriver.java b/plugins/storage/volume/nexenta/src/org/apache/cloudstack/storage/datastore/driver/NexentaPrimaryDataStoreDriver.java index aff50e5a42b..bae54f17ed9 100644 --- a/plugins/storage/volume/nexenta/src/org/apache/cloudstack/storage/datastore/driver/NexentaPrimaryDataStoreDriver.java +++ b/plugins/storage/volume/nexenta/src/org/apache/cloudstack/storage/datastore/driver/NexentaPrimaryDataStoreDriver.java @@ -58,12 +58,12 @@ public class NexentaPrimaryDataStoreDriver implements PrimaryDataStoreDriver { private static final Logger logger = Logger.getLogger(NexentaPrimaryDataStoreDriver.class); @Override - public boolean connectVolumeToHost(VolumeInfo volumeInfo, Host host, DataStore dataStore) { + public boolean grantAccess(DataObject dataObject, Host host, DataStore dataStore) { return false; //To change body of implemented methods use File | Settings | File Templates. } @Override - public void disconnectVolumeFromHost(VolumeInfo volumeInfo, Host host, DataStore dataStore) { + public void revokeAccess(DataObject dataObject, Host host, DataStore dataStore) { //To change body of implemented methods use File | Settings | File Templates. } diff --git a/plugins/storage/volume/sample/src/org/apache/cloudstack/storage/datastore/driver/SamplePrimaryDataStoreDriverImpl.java b/plugins/storage/volume/sample/src/org/apache/cloudstack/storage/datastore/driver/SamplePrimaryDataStoreDriverImpl.java index 4ade4671c1d..6ff62e9a61c 100644 --- a/plugins/storage/volume/sample/src/org/apache/cloudstack/storage/datastore/driver/SamplePrimaryDataStoreDriverImpl.java +++ b/plugins/storage/volume/sample/src/org/apache/cloudstack/storage/datastore/driver/SamplePrimaryDataStoreDriverImpl.java @@ -82,10 +82,10 @@ public class SamplePrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver } @Override - public boolean connectVolumeToHost(VolumeInfo volumeInfo, Host host, DataStore dataStore) { return false; } + public boolean grantAccess(DataObject dataObject, Host host, DataStore dataStore) { return false; } @Override - public void disconnectVolumeFromHost(VolumeInfo volumeInfo, Host host, DataStore dataStore) {} + public void revokeAccess(DataObject dataObject, Host host, DataStore dataStore) {} @Override public long getUsedBytes(StoragePool storagePool) { diff --git a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidFirePrimaryDataStoreDriver.java b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidFirePrimaryDataStoreDriver.java index 94c9595e659..00fd7617509 100644 --- a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidFirePrimaryDataStoreDriver.java +++ b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidFirePrimaryDataStoreDriver.java @@ -126,8 +126,10 @@ public class SolidFirePrimaryDataStoreDriver implements PrimaryDataStoreDriver { // if the ID of volumeInfo in not in the VAG, add it (ModifyVolumeAccessGroup) // if the VAG doesn't exist, create it with the IQNs of the hosts and the ID of volumeInfo (CreateVolumeAccessGroup) @Override - public synchronized boolean connectVolumeToHost(VolumeInfo volumeInfo, Host host, DataStore dataStore) + public synchronized boolean grantAccess(DataObject dataObject, Host host, DataStore dataStore) { + VolumeInfo volumeInfo = (VolumeInfo)dataObject; + if (volumeInfo == null || host == null || dataStore == null) { return false; } @@ -169,8 +171,10 @@ public class SolidFirePrimaryDataStoreDriver implements PrimaryDataStoreDriver { // if the VAG exists // remove the ID of volumeInfo from the VAG (ModifyVolumeAccessGroup) @Override - public synchronized void disconnectVolumeFromHost(VolumeInfo volumeInfo, Host host, DataStore dataStore) + public synchronized void revokeAccess(DataObject dataObject, Host host, DataStore dataStore) { + VolumeInfo volumeInfo = (VolumeInfo)dataObject; + if (volumeInfo == null || host == null || dataStore == null) { return; } diff --git a/server/src/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/com/cloud/storage/VolumeApiServiceImpl.java index e089b77a37c..b70d753ac44 100644 --- a/server/src/com/cloud/storage/VolumeApiServiceImpl.java +++ b/server/src/com/cloud/storage/VolumeApiServiceImpl.java @@ -1654,7 +1654,7 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic // volume.getPoolId() should be null if the VM we are detaching the disk from has never been started before DataStore dataStore = volume.getPoolId() != null ? dataStoreMgr.getDataStore(volume.getPoolId(), DataStoreRole.Primary) : null; - volService.disconnectVolumeFromHost(volFactory.getVolume(volume.getId()), host, dataStore); + volService.revokeAccess(volFactory.getVolume(volume.getId()), host, dataStore); return _volsDao.findById(volumeId); } else { @@ -2163,10 +2163,10 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic // if we don't have a host, the VM we are attaching the disk to has never been started before if (host != null) { try { - volService.connectVolumeToHost(volFactory.getVolume(volumeToAttach.getId()), host, dataStore); + volService.grantAccess(volFactory.getVolume(volumeToAttach.getId()), host, dataStore); } catch (Exception e) { - volService.disconnectVolumeFromHost(volFactory.getVolume(volumeToAttach.getId()), host, dataStore); + volService.revokeAccess(volFactory.getVolume(volumeToAttach.getId()), host, dataStore); throw new CloudRuntimeException(e.getMessage()); } @@ -2211,7 +2211,7 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic answer = (AttachAnswer)_agentMgr.send(hostId, cmd); } catch (Exception e) { if(host!=null) { - volService.disconnectVolumeFromHost(volFactory.getVolume(volumeToAttach.getId()), host, dataStore); + volService.revokeAccess(volFactory.getVolume(volumeToAttach.getId()), host, dataStore); } throw new CloudRuntimeException(errorMsg + " due to: " + e.getMessage()); } @@ -2250,7 +2250,7 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic } } if(host!= null) { - volService.disconnectVolumeFromHost(volFactory.getVolume(volumeToAttach.getId()), host, dataStore); + volService.revokeAccess(volFactory.getVolume(volumeToAttach.getId()), host, dataStore); } throw new CloudRuntimeException(errorMsg); } diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 2636096d03d..fe7c32b9de6 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -4905,7 +4905,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir // root.getPoolId() should be null if the VM we are detaching the disk from has never been started before DataStore dataStore = root.getPoolId() != null ? _dataStoreMgr.getDataStore(root.getPoolId(), DataStoreRole.Primary) : null; - volumeMgr.disconnectVolumeFromHost(volFactory.getVolume(root.getId()), host, dataStore); + volumeMgr.revokeAccess(volFactory.getVolume(root.getId()), host, dataStore); } } }