Updated Branches:
  refs/heads/4.2 7e6c1a0bf -> 981c8624e

Changes related to Review Board comments


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

Branch: refs/heads/4.2
Commit: 981c8624ea51175ea7e626c9b6959d5c3e13b680
Parents: 7e6c1a0
Author: Mike Tutkowski <[email protected]>
Authored: Sat Jul 13 23:34:43 2013 -0600
Committer: Mike Tutkowski <[email protected]>
Committed: Sat Jul 13 23:38:41 2013 -0600

----------------------------------------------------------------------
 .../driver/SolidfirePrimaryDataStoreDriver.java | 106 +++++++++++++------
 .../SolidFirePrimaryDataStoreLifeCycle.java     |  56 +++++++++-
 .../storage/datastore/util/SolidFireUtil.java   |   4 +
 3 files changed, 130 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/981c8624/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidfirePrimaryDataStoreDriver.java
----------------------------------------------------------------------
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 df77d15..8c00b8e 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
@@ -17,7 +17,6 @@
 package org.apache.cloudstack.storage.datastore.driver;
 
 import java.util.List;
-import java.util.Set;
 
 import javax.inject.Inject;
 
@@ -29,15 +28,13 @@ import 
org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailVO;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 import org.apache.cloudstack.storage.datastore.util.SolidFireUtil;
-import org.apache.log4j.Logger;
+import org.apache.commons.lang.StringUtils;
 
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.to.DataObjectType;
 import com.cloud.agent.api.to.DataStoreTO;
 import com.cloud.agent.api.to.DataTO;
 import com.cloud.dc.dao.DataCenterDao;
-import com.cloud.utils.exception.CloudRuntimeException;
-import com.cloud.exception.StorageUnavailableException;
 import com.cloud.storage.Storage.StoragePoolType;
 import com.cloud.storage.VolumeVO;
 import com.cloud.storage.dao.VolumeDao;
@@ -48,8 +45,6 @@ import com.cloud.user.AccountDetailVO;
 import com.cloud.user.dao.AccountDao;
 
 public class SolidfirePrimaryDataStoreDriver implements PrimaryDataStoreDriver 
{
-    private static final Logger s_logger = 
Logger.getLogger(SolidfirePrimaryDataStoreDriver.class);
-
     @Inject private PrimaryDataStoreDao _storagePoolDao;
     @Inject private StoragePoolDetailsDao _storagePoolDetailsDao;
     @Inject private VolumeDao _volumeDao;
@@ -220,6 +215,32 @@ public class SolidfirePrimaryDataStoreDriver implements 
PrimaryDataStoreDriver {
                 chapTargetUsername, chapTargetSecret);
     }
 
+    private long getDefaultMinIops(long storagePoolId) {
+        StoragePoolDetailVO storagePoolDetail = 
_storagePoolDetailsDao.findDetail(storagePoolId, 
SolidFireUtil.CLUSTER_DEFAULT_MIN_IOPS);
+
+        String clusterDefaultMinIops = storagePoolDetail.getValue();
+
+        return Long.parseLong(clusterDefaultMinIops);
+    }
+
+    private long getDefaultMaxIops(long storagePoolId) {
+        StoragePoolDetailVO storagePoolDetail = 
_storagePoolDetailsDao.findDetail(storagePoolId, 
SolidFireUtil.CLUSTER_DEFAULT_MAX_IOPS);
+
+        String clusterDefaultMaxIops = storagePoolDetail.getValue();
+
+        return Long.parseLong(clusterDefaultMaxIops);
+    }
+
+    private long getDefaultBurstIops(long storagePoolId, long maxIops) {
+        StoragePoolDetailVO storagePoolDetail = 
_storagePoolDetailsDao.findDetail(storagePoolId, 
SolidFireUtil.CLUSTER_DEFAULT_BURST_IOPS_PERCENT_OF_MAX_IOPS);
+
+        String clusterDefaultBurstIopsPercentOfMaxIops = 
storagePoolDetail.getValue();
+
+        float fClusterDefaultBurstIopsPercentOfMaxIops = 
Float.parseFloat(clusterDefaultBurstIopsPercentOfMaxIops);
+
+        return (long)(maxIops * fClusterDefaultBurstIopsPercentOfMaxIops);
+    }
+
     private SolidFireUtil.SolidFireVolume createSolidFireVolume(VolumeInfo 
volumeInfo, SolidFireConnection sfConnection)
     {
         String mVip = sfConnection.getManagementVip();
@@ -230,6 +251,8 @@ public class SolidfirePrimaryDataStoreDriver implements 
PrimaryDataStoreDriver {
         AccountDetailVO accountDetail = 
_accountDetailsDao.findDetail(volumeInfo.getAccountId(), 
SolidFireUtil.ACCOUNT_ID);
         long sfAccountId = Long.parseLong(accountDetail.getValue());
 
+        long storagePoolId = volumeInfo.getDataStore().getId();
+
         final Iops iops;
 
         Long minIops = volumeInfo.getMinIops();
@@ -237,39 +260,63 @@ public class SolidfirePrimaryDataStoreDriver implements 
PrimaryDataStoreDriver {
 
         if (minIops == null || minIops <= 0 ||
             maxIops == null || maxIops <= 0) {
-            iops = new Iops(100, 15000);
+            long defaultMaxIops = getDefaultMaxIops(storagePoolId);
+
+            iops = new Iops(getDefaultMinIops(storagePoolId), defaultMaxIops, 
getDefaultBurstIops(storagePoolId, defaultMaxIops));
         }
         else {
-            iops = new Iops(volumeInfo.getMinIops(), volumeInfo.getMaxIops());
+            iops = new Iops(volumeInfo.getMinIops(), volumeInfo.getMaxIops(), 
getDefaultBurstIops(storagePoolId, volumeInfo.getMaxIops()));
         }
 
         long sfVolumeId = SolidFireUtil.createSolidFireVolume(mVip, mPort, 
clusterAdminUsername, clusterAdminPassword,
-                volumeInfo.getName(), sfAccountId, volumeInfo.getSize(), true,
+                getSolidFireVolumeName(volumeInfo.getName()), sfAccountId, 
volumeInfo.getSize(), true,
                 iops.getMinIops(), iops.getMaxIops(), iops.getBurstIops());
 
         return SolidFireUtil.getSolidFireVolume(mVip, mPort, 
clusterAdminUsername, clusterAdminPassword, sfVolumeId);
     }
 
+    private String getSolidFireVolumeName(String strCloudStackVolumeName) {
+        final String specialChar = "-";
+
+        StringBuilder strSolidFireVolumeName = new StringBuilder();
+
+        for (int i = 0; i < strCloudStackVolumeName.length(); i++) {
+            String strChar = strCloudStackVolumeName.substring(i, i + 1);
+
+            if (StringUtils.isAlphanumeric(strChar)) {
+                strSolidFireVolumeName.append(strChar);
+            }
+            else {
+                strSolidFireVolumeName.append(specialChar);
+            }
+        }
+
+        return strSolidFireVolumeName.toString();
+    }
+
     private static class Iops
     {
-       private final long _minIops;
-       private final long _maxIops;
-       private final long _burstIops;
+        private final long _minIops;
+        private final long _maxIops;
+        private final long _burstIops;
 
-       public Iops(long minIops, long maxIops) throws IllegalArgumentException
-       {
-           if (minIops <= 0 || maxIops <= 0) {
-               throw new IllegalArgumentException("The 'Min IOPS' and 'Max 
IOPS' values must be greater than 0.");
-           }
+        public Iops(long minIops, long maxIops, long burstIops) throws 
IllegalArgumentException
+        {
+            if (minIops <= 0 || maxIops <= 0) {
+                throw new IllegalArgumentException("The 'Min IOPS' and 'Max 
IOPS' values must be greater than 0.");
+            }
 
             if (minIops > maxIops) {
                 throw new IllegalArgumentException("The 'Min IOPS' value 
cannot exceed the 'Max IOPS' value.");
             }
 
+            if (maxIops > burstIops) {
+                throw new IllegalArgumentException("The 'Max IOPS' value 
cannot exceed the 'Burst IOPS' value.");
+            }
+
             _minIops = minIops;
             _maxIops = maxIops;
-
-            _burstIops = getBurstIops(_maxIops);
+            _burstIops = burstIops;
        }
 
        public long getMinIops()
@@ -286,11 +333,6 @@ public class SolidfirePrimaryDataStoreDriver implements 
PrimaryDataStoreDriver {
        {
                return _burstIops;
        }
-
-        private static long getBurstIops(long maxIops)
-        {
-               return (long)(maxIops * 1.5);
-        }
     }
 
     private void deleteSolidFireVolume(VolumeInfo volumeInfo, 
SolidFireConnection sfConnection)
@@ -448,14 +490,14 @@ public class SolidfirePrimaryDataStoreDriver implements 
PrimaryDataStoreDriver {
 
             _volumeDao.deleteVolumesByInstance(volumeInfo.getId());
 
-            if (!sfAccountHasVolume(sfAccountId, sfConnection)) {
-                // delete the account from the SolidFire SAN
-                deleteSolidFireAccount(sfAccountId, sfConnection);
-
-                // delete the info in the account_details table
-                // that's related to the SolidFire account
-                _accountDetailsDao.deleteDetails(account.getAccountId());
-            }
+//            if (!sfAccountHasVolume(sfAccountId, sfConnection)) {
+//                // delete the account from the SolidFire SAN
+//                deleteSolidFireAccount(sfAccountId, sfConnection);
+//
+//                // delete the info in the account_details table
+//                // that's related to the SolidFire account
+//                _accountDetailsDao.deleteDetails(account.getAccountId());
+//            }
 
             StoragePoolVO storagePool = 
_storagePoolDao.findById(storagePoolId);
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/981c8624/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/lifecycle/SolidFirePrimaryDataStoreLifeCycle.java
----------------------------------------------------------------------
diff --git 
a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/lifecycle/SolidFirePrimaryDataStoreLifeCycle.java
 
b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/lifecycle/SolidFirePrimaryDataStoreLifeCycle.java
index 2e25cd5..ab3ef61 100644
--- 
a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/lifecycle/SolidFirePrimaryDataStoreLifeCycle.java
+++ 
b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/lifecycle/SolidFirePrimaryDataStoreLifeCycle.java
@@ -108,7 +108,55 @@ public class SolidFirePrimaryDataStoreLifeCycle implements 
PrimaryDataStoreLifeC
         
         details.put(SolidFireUtil.CLUSTER_ADMIN_USERNAME, 
clusterAdminUsername);
         details.put(SolidFireUtil.CLUSTER_ADMIN_PASSWORD, 
clusterAdminPassword);
-        
+
+        long lClusterDefaultMinIops = 100;
+        long lClusterDefaultMaxIops = 15000;
+        float fClusterDefaultBurstIopsPercentOfMaxIops = 1.5f;
+
+        try {
+            String clusterDefaultMinIops = 
getValue(SolidFireUtil.CLUSTER_DEFAULT_MIN_IOPS, url);
+
+            if (clusterDefaultMinIops != null && 
clusterDefaultMinIops.trim().length() > 0) {
+                lClusterDefaultMinIops = Long.parseLong(clusterDefaultMinIops);
+            }
+        }
+        catch (Exception ex) {
+        }
+
+        try {
+            String clusterDefaultMaxIops = 
getValue(SolidFireUtil.CLUSTER_DEFAULT_MAX_IOPS, url);
+
+            if (clusterDefaultMaxIops != null && 
clusterDefaultMaxIops.trim().length() > 0) {
+                lClusterDefaultMaxIops = Long.parseLong(clusterDefaultMaxIops);
+            }
+        }
+        catch (Exception ex) {
+        }
+
+        try {
+            String clusterDefaultBurstIopsPercentOfMaxIops = 
getValue(SolidFireUtil.CLUSTER_DEFAULT_BURST_IOPS_PERCENT_OF_MAX_IOPS, url);
+
+            if (clusterDefaultBurstIopsPercentOfMaxIops != null && 
clusterDefaultBurstIopsPercentOfMaxIops.trim().length() > 0) {
+                fClusterDefaultBurstIopsPercentOfMaxIops = 
Float.parseFloat(clusterDefaultBurstIopsPercentOfMaxIops);
+            }
+        }
+        catch (Exception ex) {
+        }
+
+        if (lClusterDefaultMinIops > lClusterDefaultMaxIops) {
+            throw new CloudRuntimeException("The parameter '" + 
SolidFireUtil.CLUSTER_DEFAULT_MIN_IOPS + "' must be less than " +
+                    "or equal to the parameter '" + 
SolidFireUtil.CLUSTER_DEFAULT_MAX_IOPS + "'.");
+        }
+
+        if (Float.compare(fClusterDefaultBurstIopsPercentOfMaxIops, 1.0f) < 0) 
{
+            throw new CloudRuntimeException("The parameter '" + 
SolidFireUtil.CLUSTER_DEFAULT_BURST_IOPS_PERCENT_OF_MAX_IOPS +
+                    "' must be greater than or equal to 1.");
+        }
+
+        details.put(SolidFireUtil.CLUSTER_DEFAULT_MIN_IOPS, 
String.valueOf(lClusterDefaultMinIops));
+        details.put(SolidFireUtil.CLUSTER_DEFAULT_MAX_IOPS, 
String.valueOf(lClusterDefaultMaxIops));
+        
details.put(SolidFireUtil.CLUSTER_DEFAULT_BURST_IOPS_PERCENT_OF_MAX_IOPS, 
String.valueOf(fClusterDefaultBurstIopsPercentOfMaxIops));
+
         // this adds a row in the cloud.storage_pool table for this SolidFire 
cluster
        return dataStoreHelper.createPrimaryDataStore(parameters);
     }
@@ -123,10 +171,10 @@ public class SolidFirePrimaryDataStoreLifeCycle 
implements PrimaryDataStoreLifeC
        StringTokenizer st = new StringTokenizer(originalUrl, delimiter);
        
        while (st.hasMoreElements()) {
-                       String token = st.nextElement().toString();
+                       String token = 
st.nextElement().toString().toUpperCase();
                        
-                       if 
(!token.startsWith(SolidFireUtil.CLUSTER_ADMIN_USERNAME) &&
-                               
!token.startsWith(SolidFireUtil.CLUSTER_ADMIN_PASSWORD)) {
+                       if 
(token.startsWith(SolidFireUtil.MANAGEMENT_VIP.toUpperCase()) ||
+                               
token.startsWith(SolidFireUtil.STORAGE_VIP.toUpperCase())) {
                                sb.append(token).append(delimiter);
                        }
        }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/981c8624/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/util/SolidFireUtil.java
----------------------------------------------------------------------
diff --git 
a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/util/SolidFireUtil.java
 
b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/util/SolidFireUtil.java
index 3570dc0..e7ac042 100644
--- 
a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/util/SolidFireUtil.java
+++ 
b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/util/SolidFireUtil.java
@@ -63,6 +63,10 @@ public class SolidFireUtil
     public static final String CLUSTER_ADMIN_USERNAME = "clusterAdminUsername";
     public static final String CLUSTER_ADMIN_PASSWORD = "clusterAdminPassword";
 
+    public static final String CLUSTER_DEFAULT_MIN_IOPS = 
"clusterDefaultMinIops";
+    public static final String CLUSTER_DEFAULT_MAX_IOPS = 
"clusterDefaultMaxIops";
+    public static final String CLUSTER_DEFAULT_BURST_IOPS_PERCENT_OF_MAX_IOPS 
= "clusterDefaultBurstIopsPercentOfMaxIops";
+
     public static final String ACCOUNT_ID = "accountId";
 
     public static final String CHAP_INITIATOR_USERNAME = 
"chapInitiatorUsername";

Reply via email to