Skip to content

Commit 8303490

Browse files
author
Mike Tutkowski
committed
Modification to the way SolidFire account info is stored in the DB
1 parent b517156 commit 8303490

3 files changed

Lines changed: 62 additions & 15 deletions

File tree

plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidFirePrimaryDataStoreDriver.java

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -195,10 +195,7 @@ private long getDefaultBurstIops(long storagePoolId, long maxIops) {
195195
return (long)(maxIops * fClusterDefaultBurstIopsPercentOfMaxIops);
196196
}
197197

198-
private SolidFireUtil.SolidFireVolume createSolidFireVolume(SolidFireUtil.SolidFireConnection sfConnection, VolumeInfo volumeInfo) {
199-
AccountDetailVO accountDetail = _accountDetailsDao.findDetail(volumeInfo.getAccountId(), SolidFireUtil.ACCOUNT_ID);
200-
long sfAccountId = Long.parseLong(accountDetail.getValue());
201-
198+
private SolidFireUtil.SolidFireVolume createSolidFireVolume(SolidFireUtil.SolidFireConnection sfConnection, VolumeInfo volumeInfo, long sfAccountId) {
202199
long storagePoolId = volumeInfo.getDataStore().getId();
203200

204201
final Iops iops;
@@ -298,15 +295,26 @@ public void createAsync(DataStore dataStore, DataObject dataObject, AsyncComplet
298295
String sfAccountName = SolidFireUtil.getSolidFireAccountName(account.getUuid(), account.getAccountId());
299296

300297
long storagePoolId = dataStore.getId();
298+
301299
SolidFireUtil.SolidFireConnection sfConnection = SolidFireUtil.getSolidFireConnection(storagePoolId, _storagePoolDetailsDao);
302300

303-
if (SolidFireUtil.getSolidFireAccount(sfConnection, sfAccountName) == null) {
304-
SolidFireUtil.SolidFireAccount sfAccount = createSolidFireAccount(sfConnection, sfAccountName);
301+
AccountDetailVO accountDetail = SolidFireUtil.getAccountDetail(volumeInfo.getAccountId(), storagePoolId, _accountDetailsDao);
302+
303+
if (accountDetail == null || accountDetail.getValue() == null) {
304+
SolidFireUtil.SolidFireAccount sfAccount = SolidFireUtil.getSolidFireAccount(sfConnection, sfAccountName);
305305

306-
SolidFireUtil.updateCsDbWithSolidFireAccountInfo(account.getId(), sfAccount, _accountDetailsDao);
306+
if (sfAccount == null) {
307+
sfAccount = createSolidFireAccount(sfConnection, sfAccountName);
308+
}
309+
310+
SolidFireUtil.updateCsDbWithSolidFireAccountInfo(account.getId(), sfAccount, storagePoolId, _accountDetailsDao);
311+
312+
accountDetail = SolidFireUtil.getAccountDetail(volumeInfo.getAccountId(), storagePoolId, _accountDetailsDao);
307313
}
308314

309-
SolidFireUtil.SolidFireVolume sfVolume = createSolidFireVolume(sfConnection, volumeInfo);
315+
long sfAccountId = Long.parseLong(accountDetail.getValue());
316+
317+
SolidFireUtil.SolidFireVolume sfVolume = createSolidFireVolume(sfConnection, volumeInfo, sfAccountId);
310318

311319
iqn = sfVolume.getIqn();
312320

plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/lifecycle/SolidFireSharedPrimaryDataStoreLifeCycle.java

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,9 @@ public DataStore initialize(Map<String, Object> dsInfos) {
219219

220220
SolidFireUtil.SolidFireConnection sfConnection = new SolidFireUtil.SolidFireConnection(managementVip, managementPort, clusterAdminUsername, clusterAdminPassword);
221221

222-
SolidFireUtil.SolidFireVolume sfVolume = createSolidFireVolume(sfConnection, storagePoolName, capacityBytes, lMinIops, lMaxIops, lBurstIops);
222+
SolidFireCreateVolume sfCreateVolume = createSolidFireVolume(sfConnection, storagePoolName, capacityBytes, lMinIops, lMaxIops, lBurstIops);
223+
224+
SolidFireUtil.SolidFireVolume sfVolume = sfCreateVolume.getVolume();
223225

224226
String iqn = sfVolume.getIqn();
225227

@@ -255,6 +257,11 @@ public DataStore initialize(Map<String, Object> dsInfos) {
255257
List<HostVO> hosts = _hostDao.findByClusterId(clusterId);
256258

257259
SolidFireUtil.placeVolumeInVolumeAccessGroup(sfConnection, sfVolume.getId(), dataStore.getId(), hosts, _clusterDetailsDao);
260+
261+
SolidFireUtil.SolidFireAccount sfAccount = sfCreateVolume.getAccount();
262+
Account csAccount = CallContext.current().getCallingAccount();
263+
264+
SolidFireUtil.updateCsDbWithSolidFireAccountInfo(csAccount.getId(), sfAccount, dataStore.getId(), _accountDetailsDao);
258265
} catch (Exception ex) {
259266
_primaryDataStoreDao.expunge(dataStore.getId());
260267

@@ -286,7 +293,25 @@ private StoragePoolType getStorageType(HypervisorType hypervisorType) {
286293
throw new CloudRuntimeException("The 'hypervisor' parameter must be '" + HypervisorType.XenServer + "' or '" + HypervisorType.VMware + "'.");
287294
}
288295

289-
private SolidFireUtil.SolidFireVolume createSolidFireVolume(SolidFireUtil.SolidFireConnection sfConnection,
296+
private class SolidFireCreateVolume {
297+
private final SolidFireUtil.SolidFireVolume _sfVolume;
298+
private final SolidFireUtil.SolidFireAccount _sfAccount;
299+
300+
public SolidFireCreateVolume(SolidFireUtil.SolidFireVolume sfVolume, SolidFireUtil.SolidFireAccount sfAccount) {
301+
_sfVolume = sfVolume;
302+
_sfAccount = sfAccount;
303+
}
304+
305+
public SolidFireUtil.SolidFireVolume getVolume() {
306+
return _sfVolume;
307+
}
308+
309+
public SolidFireUtil.SolidFireAccount getAccount() {
310+
return _sfAccount;
311+
}
312+
}
313+
314+
private SolidFireCreateVolume createSolidFireVolume(SolidFireUtil.SolidFireConnection sfConnection,
290315
String volumeName, long volumeSize, long minIops, long maxIops, long burstIops) {
291316
try {
292317
Account csAccount = CallContext.current().getCallingAccount();
@@ -301,15 +326,13 @@ private SolidFireUtil.SolidFireVolume createSolidFireVolume(SolidFireUtil.SolidF
301326
long accountNumber = SolidFireUtil.createSolidFireAccount(sfConnection, sfAccountName);
302327

303328
sfAccount = SolidFireUtil.getSolidFireAccountById(sfConnection, accountNumber);
304-
305-
SolidFireUtil.updateCsDbWithSolidFireAccountInfo(csAccountId, sfAccount, _accountDetailsDao);
306329
}
307330

308331
long sfVolumeId = SolidFireUtil.createSolidFireVolume(sfConnection, SolidFireUtil.getSolidFireVolumeName(volumeName), sfAccount.getId(), volumeSize,
309332
true, null, minIops, maxIops, burstIops);
310333
SolidFireUtil.SolidFireVolume sfVolume = SolidFireUtil.getSolidFireVolume(sfConnection, sfVolumeId);
311334

312-
return sfVolume;
335+
return new SolidFireCreateVolume(sfVolume, sfAccount);
313336
} catch (Throwable e) {
314337
throw new CloudRuntimeException("Failed to create a SolidFire volume: " + e.toString());
315338
}

plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/util/SolidFireUtil.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,13 +187,14 @@ public static void updateCsDbWithSolidFireIopsInfo(long storagePoolId, PrimaryDa
187187
}
188188

189189
public static void updateCsDbWithSolidFireAccountInfo(long csAccountId, SolidFireUtil.SolidFireAccount sfAccount,
190-
AccountDetailsDao accountDetailsDao) {
190+
long storagePoolId, AccountDetailsDao accountDetailsDao) {
191191
AccountDetailVO accountDetail = new AccountDetailVO(csAccountId,
192-
SolidFireUtil.ACCOUNT_ID,
192+
SolidFireUtil.getAccountKey(storagePoolId),
193193
String.valueOf(sfAccount.getId()));
194194

195195
accountDetailsDao.persist(accountDetail);
196196

197+
/*
197198
accountDetail = new AccountDetailVO(csAccountId,
198199
SolidFireUtil.CHAP_INITIATOR_USERNAME,
199200
String.valueOf(sfAccount.getName()));
@@ -217,6 +218,7 @@ public static void updateCsDbWithSolidFireAccountInfo(long csAccountId, SolidFir
217218
sfAccount.getTargetSecret());
218219
219220
accountDetailsDao.persist(accountDetail);
221+
*/
220222
}
221223

222224
public static SolidFireAccount getSolidFireAccount(SolidFireConnection sfConnection, String sfAccountName) {
@@ -358,6 +360,20 @@ public static String getVagKey(long storagePoolId) {
358360
return "sfVolumeAccessGroup_" + storagePoolId;
359361
}
360362

363+
private static String getAccountKey(long storagePoolId) {
364+
return SolidFireUtil.ACCOUNT_ID + "_" + storagePoolId;
365+
}
366+
367+
public static AccountDetailVO getAccountDetail(long csAccountId, long storagePoolId, AccountDetailsDao accountDetailsDao) {
368+
AccountDetailVO accountDetail = accountDetailsDao.findDetail(csAccountId, SolidFireUtil.getAccountKey(storagePoolId));
369+
370+
if (accountDetail == null || accountDetail.getValue() == null) {
371+
accountDetail = accountDetailsDao.findDetail(csAccountId, SolidFireUtil.ACCOUNT_ID);
372+
}
373+
374+
return accountDetail;
375+
}
376+
361377
public static String[] getIqnsFromHosts(List<? extends Host> hosts) {
362378
if (hosts == null || hosts.size() == 0) {
363379
throw new CloudRuntimeException("There do not appear to be any hosts in this cluster.");

0 commit comments

Comments
 (0)