Repository: cloudstack
Updated Branches:
  refs/heads/4.5 aca0f7959 -> 453c5b3ec


When deleting primary storage that's based on the SolidFireShared plug-in 
(which uses a shared-IOPS approach), remove the volume from the volume access 
group it's in


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/453c5b3e
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/453c5b3e
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/453c5b3e

Branch: refs/heads/4.5
Commit: 453c5b3ec0365603a38468eb7de5d3dec0029ace
Parents: aca0f79
Author: Mike Tutkowski <mike.tutkow...@solidfire.com>
Authored: Mon Dec 15 14:11:31 2014 -0700
Committer: Mike Tutkowski <mike.tutkow...@solidfire.com>
Committed: Mon Dec 15 16:23:33 2014 -0700

----------------------------------------------------------------------
 ...olidFireSharedPrimaryDataStoreLifeCycle.java | 33 ++++++++++++++++++++
 1 file changed, 33 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/453c5b3e/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/lifecycle/SolidFireSharedPrimaryDataStoreLifeCycle.java
----------------------------------------------------------------------
diff --git 
a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/lifecycle/SolidFireSharedPrimaryDataStoreLifeCycle.java
 
b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/lifecycle/SolidFireSharedPrimaryDataStoreLifeCycle.java
index b70333d..4fa49ef 100644
--- 
a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/lifecycle/SolidFireSharedPrimaryDataStoreLifeCycle.java
+++ 
b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/lifecycle/SolidFireSharedPrimaryDataStoreLifeCycle.java
@@ -52,6 +52,7 @@ import com.cloud.agent.api.CreateStoragePoolCommand;
 import com.cloud.agent.api.DeleteStoragePoolCommand;
 import com.cloud.agent.api.StoragePoolInfo;
 import com.cloud.dc.ClusterDetailsDao;
+import com.cloud.dc.ClusterDetailsVO;
 import com.cloud.dc.ClusterVO;
 import com.cloud.dc.dao.ClusterDao;
 import com.cloud.dc.dao.DataCenterDao;
@@ -491,6 +492,8 @@ public class SolidFireSharedPrimaryDataStoreLifeCycle 
implements PrimaryDataStor
             _tmpltMgr.evictTemplateFromStoragePool(templatePoolVO);
         }
 
+        Long clusterId = null;
+
         for (StoragePoolHostVO host : hostPoolRecords) {
             DeleteStoragePoolCommand deleteCmd = new 
DeleteStoragePoolCommand(storagePool);
 
@@ -523,6 +526,12 @@ public class SolidFireSharedPrimaryDataStoreLifeCycle 
implements PrimaryDataStor
             if (answer != null && answer.getResult()) {
                 s_logger.info("Successfully deleted storage pool using Host ID 
" + host.getHostId());
 
+                HostVO hostVO = this._hostDao.findById(host.getHostId());
+
+                if (hostVO != null) {
+                    clusterId = hostVO.getClusterId();
+                }
+
                 break;
             }
             else {
@@ -530,11 +539,35 @@ public class SolidFireSharedPrimaryDataStoreLifeCycle 
implements PrimaryDataStor
             }
         }
 
+        if (clusterId != null) {
+            removeVolumeFromVag(storagePool.getId(), clusterId);
+        }
+
         deleteSolidFireVolume(storagePool.getId());
 
         return _primaryDataStoreHelper.deletePrimaryDataStore(dataStore);
     }
 
+    private void removeVolumeFromVag(long storagePoolId, long clusterId) {
+        long sfVolumeId = getVolumeId(storagePoolId);
+        ClusterDetailsVO clusterDetail = 
_clusterDetailsDao.findDetail(clusterId, 
SolidFireUtil.getVagKey(storagePoolId));
+
+        String vagId = clusterDetail != null ? clusterDetail.getValue() : null;
+
+        if (vagId != null) {
+            List<HostVO> hosts = _hostDao.findByClusterId(clusterId);
+
+            SolidFireUtil.SolidFireConnection sfConnection = 
SolidFireUtil.getSolidFireConnection(storagePoolId, _storagePoolDetailsDao);
+
+            SolidFireUtil.SolidFireVag sfVag = 
SolidFireUtil.getSolidFireVag(sfConnection, Long.parseLong(vagId));
+
+            String[] hostIqns = 
SolidFireUtil.getNewHostIqns(sfVag.getInitiators(), 
SolidFireUtil.getIqnsFromHosts(hosts));
+            long[] volumeIds = 
SolidFireUtil.getNewVolumeIds(sfVag.getVolumeIds(), sfVolumeId, false);
+
+            SolidFireUtil.modifySolidFireVag(sfConnection, sfVag.getId(), 
hostIqns, volumeIds);
+        }
+    }
+
     private void deleteSolidFireVolume(long storagePoolId) {
         SolidFireUtil.SolidFireConnection sfConnection = 
SolidFireUtil.getSolidFireConnection(storagePoolId, _storagePoolDetailsDao);
 

Reply via email to