You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by mt...@apache.org on 2013/07/14 07:44:16 UTC
git commit: updated refs/heads/master to 5bcb6ec
Updated Branches:
refs/heads/master 8f4575e87 -> 5bcb6ec9c
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/5bcb6ec9
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/5bcb6ec9
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/5bcb6ec9
Branch: refs/heads/master
Commit: 5bcb6ec9ca5901248a212964a35eb9e8e4c8c1fd
Parents: 8f4575e
Author: Mike Tutkowski <mi...@solidfire.com>
Authored: Sat Jul 13 23:43:15 2013 -0600
Committer: Mike Tutkowski <mi...@solidfire.com>
Committed: Sat Jul 13 23:43:48 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/5bcb6ec9/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/5bcb6ec9/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/5bcb6ec9/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";