Skip to content

Commit c8603d2

Browse files
Add/Remove MDM IP addresses during Host connection/disconnection to/from storage pool when powerflex.connect.on.demand is false
1 parent 7e2e778 commit c8603d2

File tree

17 files changed

+361
-103
lines changed

17 files changed

+361
-103
lines changed

core/src/main/java/com/cloud/agent/api/ModifyStoragePoolAnswer.java

+4
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ public ModifyStoragePoolAnswer(ModifyStoragePoolCommand cmd, long capacityBytes,
4646
templateInfo = tInfo;
4747
}
4848

49+
public ModifyStoragePoolAnswer(ModifyStoragePoolCommand cmd, boolean success, String details) {
50+
super(cmd, success, details);
51+
}
52+
4953
public void setPoolInfo(StoragePoolInfo poolInfo) {
5054
this.poolInfo = poolInfo;
5155
}

engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreDriver.java

+4
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,8 @@ public interface DataStoreDriver {
4545
boolean canCopy(DataObject srcData, DataObject destData);
4646

4747
void resize(DataObject data, AsyncCompletionCallback<CreateCmdResult> callback);
48+
49+
default boolean canDisplayDetails() {
50+
return true;
51+
}
4852
}

engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDao.java

+4
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ public interface PrimaryDataStoreDao extends GenericDao<StoragePoolVO, Long> {
6060

6161
StoragePoolVO persist(StoragePoolVO pool, Map<String, String> details, List<String> tags, Boolean isTagARule);
6262

63+
StoragePoolVO persist(StoragePoolVO pool, Map<String, String> details, List<String> tags, Boolean isTagARule, boolean displayDetails);
64+
6365
/**
6466
* Find pool by name.
6567
*
@@ -103,6 +105,8 @@ public interface PrimaryDataStoreDao extends GenericDao<StoragePoolVO, Long> {
103105

104106
void updateDetails(long poolId, Map<String, String> details);
105107

108+
void removeDetails(long poolId);
109+
106110
Map<String, String> getDetails(long poolId);
107111

108112
List<String> searchForStoragePoolTags(long poolId);

engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java

+12-2
Original file line numberDiff line numberDiff line change
@@ -296,14 +296,19 @@ public StoragePoolVO listById(Integer id) {
296296
}
297297

298298
@Override
299-
@DB
300299
public StoragePoolVO persist(StoragePoolVO pool, Map<String, String> details, List<String> tags, Boolean isTagARule) {
300+
return persist(pool, details, tags, isTagARule, true);
301+
}
302+
303+
@Override
304+
@DB
305+
public StoragePoolVO persist(StoragePoolVO pool, Map<String, String> details, List<String> tags, Boolean isTagARule, boolean displayDetails) {
301306
TransactionLegacy txn = TransactionLegacy.currentTxn();
302307
txn.start();
303308
pool = super.persist(pool);
304309
if (details != null) {
305310
for (Map.Entry<String, String> detail : details.entrySet()) {
306-
StoragePoolDetailVO vo = new StoragePoolDetailVO(pool.getId(), detail.getKey(), detail.getValue(), true);
311+
StoragePoolDetailVO vo = new StoragePoolDetailVO(pool.getId(), detail.getKey(), detail.getValue(), displayDetails);
307312
_detailsDao.persist(vo);
308313
}
309314
}
@@ -570,6 +575,11 @@ public void updateDetails(long poolId, Map<String, String> details) {
570575
}
571576
}
572577

578+
@Override
579+
public void removeDetails(long poolId) {
580+
_detailsDao.removeDetails(poolId);
581+
}
582+
573583
@Override
574584
public Map<String, String> getDetails(long poolId) {
575585
return _detailsDao.listDetailsKeyPairs(poolId);

engine/storage/src/main/java/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java

+17-2
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,16 @@
2828

2929
import org.apache.cloudstack.annotation.AnnotationService;
3030
import org.apache.cloudstack.annotation.dao.AnnotationDao;
31-
import org.apache.logging.log4j.Logger;
3231
import org.apache.logging.log4j.LogManager;
32+
import org.apache.logging.log4j.Logger;
3333
import org.springframework.stereotype.Component;
3434

3535
import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope;
3636
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
37+
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreDriver;
3738
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
39+
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProvider;
40+
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProviderManager;
3841
import org.apache.cloudstack.engine.subsystem.api.storage.HostScope;
3942
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreParameters;
4043
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
@@ -75,6 +78,8 @@ public class PrimaryDataStoreHelper {
7578
protected StoragePoolHostDao storagePoolHostDao;
7679
@Inject
7780
private AnnotationDao annotationDao;
81+
@Inject
82+
DataStoreProviderManager dataStoreProviderMgr;
7883

7984
public DataStore createPrimaryDataStore(PrimaryDataStoreParameters params) {
8085
if(params == null)
@@ -141,7 +146,17 @@ public DataStore createPrimaryDataStore(PrimaryDataStoreParameters params) {
141146
storageTags.add(tag);
142147
}
143148
}
144-
dataStoreVO = dataStoreDao.persist(dataStoreVO, details, storageTags, params.isTagARule());
149+
150+
boolean displayDetails = true;
151+
DataStoreProvider storeProvider = dataStoreProviderMgr.getDataStoreProvider(params.getProviderName());
152+
if (storeProvider != null) {
153+
DataStoreDriver storeDriver = storeProvider.getDataStoreDriver();
154+
if (storeDriver != null) {
155+
displayDetails = storeDriver.canDisplayDetails();
156+
}
157+
}
158+
159+
dataStoreVO = dataStoreDao.persist(dataStoreVO, details, storageTags, params.isTagARule(), displayDetails);
145160
return dataStoreMgr.getDataStore(dataStoreVO.getId(), DataStoreRole.Primary);
146161
}
147162

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtModifyStoragePoolCommandWrapper.java

+11-1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,17 @@ public final class LibvirtModifyStoragePoolCommandWrapper extends CommandWrapper
3838
@Override
3939
public Answer execute(final ModifyStoragePoolCommand command, final LibvirtComputingResource libvirtComputingResource) {
4040
final KVMStoragePoolManager storagePoolMgr = libvirtComputingResource.getStoragePoolMgr();
41+
if (!command.getAdd()) {
42+
boolean status = storagePoolMgr.deleteStoragePool(command.getPool().getType(), command.getPool().getUuid(), command.getDetails());
43+
if (status) {
44+
final ModifyStoragePoolAnswer answer = new ModifyStoragePoolAnswer(command, true, null);
45+
return answer;
46+
}
47+
48+
final ModifyStoragePoolAnswer answer = new ModifyStoragePoolAnswer(command, false, "Failed to delete storage pool");
49+
return answer;
50+
}
51+
4152
final KVMStoragePool storagepool =
4253
storagePoolMgr.createStoragePool(command.getPool().getUuid(), command.getPool().getHost(), command.getPool().getPort(), command.getPool().getPath(), command.getPool()
4354
.getUserInfo(), command.getPool().getType(), command.getDetails());
@@ -47,7 +58,6 @@ public Answer execute(final ModifyStoragePoolCommand command, final LibvirtCompu
4758

4859
final Map<String, TemplateProp> tInfo = new HashMap<String, TemplateProp>();
4960
final ModifyStoragePoolAnswer answer = new ModifyStoragePoolAnswer(command, storagepool.getCapacity(), storagepool.getAvailable(), tInfo, storagepool.getDetails());
50-
5161
return answer;
5262
}
5363
}

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java

+19-5
Original file line numberDiff line numberDiff line change
@@ -410,12 +410,26 @@ public boolean disconnectPhysicalDisk(StoragePoolType type, String poolUuid, Str
410410

411411
public boolean deleteStoragePool(StoragePoolType type, String uuid) {
412412
StorageAdaptor adaptor = getStorageAdaptor(type);
413-
_haMonitor.removeStoragePool(uuid);
414-
adaptor.deleteStoragePool(uuid);
413+
if (type == StoragePoolType.NetworkFilesystem) {
414+
_haMonitor.removeStoragePool(uuid);
415+
}
416+
boolean deleteStatus = adaptor.deleteStoragePool(uuid);;
417+
synchronized (_storagePools) {
418+
_storagePools.remove(uuid);
419+
}
420+
return deleteStatus;
421+
}
422+
423+
public boolean deleteStoragePool(StoragePoolType type, String uuid, Map<String, String> details) {
424+
StorageAdaptor adaptor = getStorageAdaptor(type);
425+
if (type == StoragePoolType.NetworkFilesystem) {
426+
_haMonitor.removeStoragePool(uuid);
427+
}
428+
boolean deleteStatus = adaptor.deleteStoragePool(uuid, details);
415429
synchronized (_storagePools) {
416430
_storagePools.remove(uuid);
417431
}
418-
return true;
432+
return deleteStatus;
419433
}
420434

421435
public KVMPhysicalDisk createDiskFromTemplate(KVMPhysicalDisk template, String name, Storage.ProvisioningType provisioningType,
@@ -479,11 +493,11 @@ public KVMPhysicalDisk createPhysicalDiskFromDirectDownloadTemplate(String templ
479493

480494
public Ternary<Boolean, Map<String, String>, String> prepareStorageClient(StoragePoolType type, String uuid, Map<String, String> details) {
481495
StorageAdaptor adaptor = getStorageAdaptor(type);
482-
return adaptor.prepareStorageClient(type, uuid, details);
496+
return adaptor.prepareStorageClient(uuid, details);
483497
}
484498

485499
public Pair<Boolean, String> unprepareStorageClient(StoragePoolType type, String uuid, Map<String, String> details) {
486500
StorageAdaptor adaptor = getStorageAdaptor(type);
487-
return adaptor.unprepareStorageClient(type, uuid, details);
501+
return adaptor.unprepareStorageClient(uuid, details);
488502
}
489503
}

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java

+32-2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.util.UUID;
2929

3030
import org.apache.cloudstack.storage.datastore.client.ScaleIOGatewayClient;
31+
import org.apache.cloudstack.storage.datastore.manager.ScaleIOSDCManager;
3132
import org.apache.cloudstack.storage.datastore.util.ScaleIOUtil;
3233
import org.apache.cloudstack.utils.cryptsetup.CryptSetup;
3334
import org.apache.cloudstack.utils.cryptsetup.CryptSetupException;
@@ -148,12 +149,37 @@ public KVMPhysicalDisk getPhysicalDisk(String volumePath, KVMStoragePool pool) {
148149
@Override
149150
public KVMStoragePool createStoragePool(String uuid, String host, int port, String path, String userInfo, Storage.StoragePoolType type, Map<String, String> details) {
150151
ScaleIOStoragePool storagePool = new ScaleIOStoragePool(uuid, host, port, path, type, details, this);
152+
if (details != null && details.containsKey(ScaleIOSDCManager.ConnectOnDemand.key())) {
153+
String connectOnDemand = details.get(ScaleIOSDCManager.ConnectOnDemand.key());
154+
if (connectOnDemand != null && !Boolean.parseBoolean(connectOnDemand)) {
155+
Ternary<Boolean, Map<String, String>, String> prepareStorageClientStatus = prepareStorageClient(uuid, details);
156+
if (prepareStorageClientStatus.first()) {
157+
details.putAll(prepareStorageClientStatus.second());
158+
}
159+
}
160+
}
151161
MapStorageUuidToStoragePool.put(uuid, storagePool);
152162
return storagePool;
153163
}
154164

155165
@Override
156166
public boolean deleteStoragePool(String uuid) {
167+
ScaleIOStoragePool storagePool = (ScaleIOStoragePool) MapStorageUuidToStoragePool.get(uuid);
168+
if (storagePool != null) {
169+
unprepareStorageClient(uuid, storagePool.getDetails());
170+
}
171+
return MapStorageUuidToStoragePool.remove(uuid) != null;
172+
}
173+
174+
@Override
175+
public boolean deleteStoragePool(String uuid, Map<String, String> details) {
176+
if (details != null && details.containsKey(ScaleIOSDCManager.ConnectOnDemand.key())) {
177+
String connectOnDemand = details.get(ScaleIOSDCManager.ConnectOnDemand.key());
178+
if (connectOnDemand != null && !Boolean.parseBoolean(connectOnDemand)) {
179+
Pair<Boolean, String> unprepareStorageClientStatus = unprepareStorageClient(uuid, details);
180+
return MapStorageUuidToStoragePool.remove(uuid) != null && unprepareStorageClientStatus.first();
181+
}
182+
}
157183
return MapStorageUuidToStoragePool.remove(uuid) != null;
158184
}
159185

@@ -567,7 +593,7 @@ public void resizeQcow2ToVolume(String volumePath, QemuImageOptions options, Lis
567593
qemu.resize(options, objects, usableSizeBytes);
568594
}
569595

570-
public Ternary<Boolean, Map<String, String>, String> prepareStorageClient(Storage.StoragePoolType type, String uuid, Map<String, String> details) {
596+
public Ternary<Boolean, Map<String, String>, String> prepareStorageClient(String uuid, Map<String, String> details) {
571597
if (!ScaleIOUtil.isSDCServiceInstalled()) {
572598
logger.debug("SDC service not installed on host, preparing the SDC client not possible");
573599
return new Ternary<>(false, null, "SDC service not installed on host");
@@ -591,6 +617,10 @@ public Ternary<Boolean, Map<String, String>, String> prepareStorageClient(Storag
591617
String mdms = details.get(ScaleIOGatewayClient.STORAGE_POOL_MDMS);
592618
String[] mdmAddresses = mdms.split(",");
593619
if (mdmAddresses.length > 0) {
620+
if (ScaleIOUtil.mdmAdded(mdmAddresses[0])) {
621+
return new Ternary<>(true, getSDCDetails(details), "MDM added, no need to prepare the SDC client");
622+
}
623+
594624
ScaleIOUtil.addMdms(Arrays.asList(mdmAddresses));
595625
if (!ScaleIOUtil.mdmAdded(mdmAddresses[0])) {
596626
return new Ternary<>(false, null, "Failed to add MDMs");
@@ -601,7 +631,7 @@ public Ternary<Boolean, Map<String, String>, String> prepareStorageClient(Storag
601631
return new Ternary<>( true, getSDCDetails(details), "Prepared client successfully");
602632
}
603633

604-
public Pair<Boolean, String> unprepareStorageClient(Storage.StoragePoolType type, String uuid, Map<String, String> details) {
634+
public Pair<Boolean, String> unprepareStorageClient(String uuid, Map<String, String> details) {
605635
if (!ScaleIOUtil.isSDCServiceInstalled()) {
606636
logger.debug("SDC service not installed on host, no need to unprepare the SDC client");
607637
return new Pair<>(true, "SDC service not installed on host, no need to unprepare the SDC client");

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/StorageAdaptor.java

+6-4
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ public interface StorageAdaptor {
4444

4545
public boolean deleteStoragePool(String uuid);
4646

47+
public default boolean deleteStoragePool(String uuid, Map<String, String> details) {
48+
return true;
49+
}
50+
4751
public default KVMPhysicalDisk createPhysicalDisk(String name, KVMStoragePool pool,
4852
PhysicalDiskFormat format, Storage.ProvisioningType provisioningType, long size, Long usableSize, byte[] passphrase) {
4953
return createPhysicalDisk(name, pool, format, provisioningType, size, passphrase);
@@ -120,23 +124,21 @@ default boolean supportsPhysicalDiskCopy(StoragePoolType type) {
120124

121125
/**
122126
* Prepares the storage client.
123-
* @param type type of the storage pool
124127
* @param uuid uuid of the storage pool
125128
* @param details any details of the storage pool that are required for client preparation
126129
* @return status, client details, & message in case failed
127130
*/
128-
default Ternary<Boolean, Map<String, String>, String> prepareStorageClient(StoragePoolType type, String uuid, Map<String, String> details) {
131+
default Ternary<Boolean, Map<String, String>, String> prepareStorageClient(String uuid, Map<String, String> details) {
129132
return new Ternary<>(true, new HashMap<>(), "");
130133
}
131134

132135
/**
133136
* Unprepares the storage client.
134-
* @param type type of the storage pool
135137
* @param uuid uuid of the storage pool
136138
* @param details any details of the storage pool that are required for client unpreparation
137139
* @return status, & message in case failed
138140
*/
139-
default Pair<Boolean, String> unprepareStorageClient(StoragePoolType type, String uuid, Map<String, String> details) {
141+
default Pair<Boolean, String> unprepareStorageClient(String uuid, Map<String, String> details) {
140142
return new Pair<>(true, "");
141143
}
142144
}

0 commit comments

Comments
 (0)