Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
55b8dc5
Cumulative enhancements fix for ScaleIO: MDM add/remove, Host prepare…
mprokopchuk Apr 8, 2025
b13712c
Add feature flag to enable/disable blocking unprepare ScaleIO storage…
mprokopchuk Apr 9, 2025
5674f56
Update plugins/storage/volume/scaleio/src/main/java/org/apache/clouds…
mprokopchuk Apr 9, 2025
b7b40d9
Update plugins/storage/volume/scaleio/src/main/java/org/apache/clouds…
mprokopchuk Apr 11, 2025
12eea4a
Update plugins/storage/volume/scaleio/src/main/java/org/apache/clouds…
mprokopchuk Apr 11, 2025
4636ae9
- Addressed code review comments: Added checking mdm removal response…
mprokopchuk Apr 11, 2025
b88048b
Updated scope to Zone for the new powerflex settings
sureshanaparti Apr 21, 2025
018cf17
Get powerflex storage config settings from zone, and some fixes
sureshanaparti Jun 16, 2025
434862b
Removed --file parameter used with --query_mdms, --query_vols, --quer…
sureshanaparti Jun 16, 2025
8cdefca
rebase fixes
sureshanaparti Jun 17, 2025
789aea6
typo fix
sureshanaparti Jun 17, 2025
ad41f3f
review fix
sureshanaparti Jun 17, 2025
44af31c
Added wait time after SDC service start/restart/stop, retries to fetc…
sureshanaparti Jun 25, 2025
ba8a6bd
Apply suggestions from code review
sureshanaparti Jun 25, 2025
67c47c2
Added agent property 'powerflex.sdc.service.wait' for the time (in se…
sureshanaparti Jul 3, 2025
778a873
Allow unprepare sdc when there are no volumes mapped on the host for …
sureshanaparti Jul 3, 2025
9befbd3
Fix wait time for remove PowerFlex MDMs, and some code improvements
sureshanaparti Jul 3, 2025
21d5813
Change default value of config 'powerflex.mdm.change.apply.wait' to 3…
sureshanaparti Jul 7, 2025
ef3c3f1
Fix sdc usage cmd (drv_cfg) result, and log command result
sureshanaparti Jul 7, 2025
6b2120d
code improvements, to add scaleio sdc settings
sureshanaparti Jul 8, 2025
7433231
code improvements
sureshanaparti Jul 14, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -833,7 +833,7 @@ public static class Property <T>{
private T defaultValue;
private Class<T> typeClass;

Property(String name, T value) {
public Property(String name, T value) {
init(name, value);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import com.cloud.resource.CommandWrapper;
import com.cloud.resource.ResourceWrapper;
import com.cloud.storage.template.TemplateProp;
import com.cloud.utils.exception.CloudRuntimeException;

@ResourceWrapper(handles = ModifyStoragePoolCommand.class)
public final class LibvirtModifyStoragePoolCommandWrapper extends CommandWrapper<ModifyStoragePoolCommand, Answer, LibvirtComputingResource> {
Expand All @@ -49,11 +50,16 @@
return answer;
}

final KVMStoragePool storagepool =
storagePoolMgr.createStoragePool(command.getPool().getUuid(), command.getPool().getHost(), command.getPool().getPort(), command.getPool().getPath(), command.getPool()
.getUserInfo(), command.getPool().getType(), command.getDetails());
if (storagepool == null) {
return new Answer(command, false, " Failed to create storage pool");
final KVMStoragePool storagepool;
try {
storagepool =
storagePoolMgr.createStoragePool(command.getPool().getUuid(), command.getPool().getHost(), command.getPool().getPort(), command.getPool().getPath(), command.getPool()
.getUserInfo(), command.getPool().getType(), command.getDetails());
if (storagepool == null) {
return new Answer(command, false, " Failed to create storage pool");
}
} catch (CloudRuntimeException e) {
return new Answer(command, false, String.format("Failed to create storage pool: %s", e.getLocalizedMessage()));

Check warning on line 62 in plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtModifyStoragePoolCommandWrapper.java

View check run for this annotation

Codecov / codecov/patch

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtModifyStoragePoolCommandWrapper.java#L61-L62

Added lines #L61 - L62 were not covered by tests
}

final Map<String, TemplateProp> tInfo = new HashMap<String, TemplateProp>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,13 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import com.cloud.agent.api.PrepareStorageClientCommand;
import org.apache.cloudstack.storage.datastore.client.ScaleIOGatewayClient;
import org.apache.cloudstack.storage.datastore.manager.ScaleIOSDCManager;
import org.apache.cloudstack.storage.datastore.util.ScaleIOUtil;
Expand All @@ -38,6 +40,7 @@
import org.apache.cloudstack.utils.qemu.QemuImgException;
import org.apache.cloudstack.utils.qemu.QemuImgFile;
import org.apache.cloudstack.utils.qemu.QemuObject;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.io.filefilter.WildcardFileFilter;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
Expand Down Expand Up @@ -149,7 +152,7 @@
@Override
public KVMStoragePool createStoragePool(String uuid, String host, int port, String path, String userInfo, Storage.StoragePoolType type, Map<String, String> details, boolean isPrimaryStorage) {
ScaleIOStoragePool storagePool = new ScaleIOStoragePool(uuid, host, port, path, type, details, this);
if (details != null && details.containsKey(ScaleIOSDCManager.ConnectOnDemand.key())) {
if (MapUtils.isNotEmpty(details) && details.containsKey(ScaleIOSDCManager.ConnectOnDemand.key())) {
String connectOnDemand = details.get(ScaleIOSDCManager.ConnectOnDemand.key());
if (connectOnDemand != null && !Boolean.parseBoolean(connectOnDemand)) {
Ternary<Boolean, Map<String, String>, String> prepareStorageClientStatus = prepareStorageClient(uuid, details);
Expand All @@ -158,10 +161,49 @@
}
}
}

validateMdmState(details);

Check warning on line 165 in plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java

View check run for this annotation

Codecov / codecov/patch

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

Added line #L165 was not covered by tests

MapStorageUuidToStoragePool.put(uuid, storagePool);
return storagePool;
}

/**
* Validate Storage Pool state to ensure it healthy and can operate requests.
* There is observed situation where ScaleIO configuration file has different values than ScaleIO CLI.
* Validation compares values from both drv_cfg.txt and drv_cfg CLI and throws exception if there is mismatch.
*
* @param details see {@link PrepareStorageClientCommand#getDetails()}
* and {@link @UnprepareStorageClientCommand#getDetails()}, expected to contain
* {@link ScaleIOSDCManager#ValidateMdmsOnConnect#key()}
* @throws CloudRuntimeException in case if Storage Pool is not operate-able
*/
private void validateMdmState(Map<String, String> details) {
String configKey = ScaleIOSDCManager.ValidateMdmsOnConnect.key();

Check warning on line 182 in plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java

View check run for this annotation

Codecov / codecov/patch

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java#L181-L182

Added lines #L181 - L182 were not covered by tests
if (MapUtils.isEmpty(details) || !details.containsKey(configKey)) {
logger.debug(String.format("Skipped PowerFlex MDMs validation as property %s not sent by Management Server", configKey));
return;

Check warning on line 185 in plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java

View check run for this annotation

Codecov / codecov/patch

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java#L184-L185

Added lines #L184 - L185 were not covered by tests
}

String configValue = details.get(configKey);

Check warning on line 188 in plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java

View check run for this annotation

Codecov / codecov/patch

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

Added line #L188 was not covered by tests

// be as much verbose as possible, otherwise it will be difficult to troubleshoot operational issue without logs
if (StringUtils.isEmpty(configValue)) {
logger.debug(String.format("Skipped PowerFlex MDMs validation as property %s sent by Management Server is empty", configKey));

Check warning on line 192 in plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java

View check run for this annotation

Codecov / codecov/patch

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

Added line #L192 was not covered by tests
} else if (Boolean.valueOf(configValue).equals(Boolean.FALSE)) {
logger.debug(String.format("Skipped PowerFlex MDMs validation as property %s received as %s", configKey, configValue));

Check warning on line 194 in plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java

View check run for this annotation

Codecov / codecov/patch

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

Added line #L194 was not covered by tests
} else {
Collection<String> mdmsFromConfigFile = ScaleIOUtil.getMdmsFromConfigFile();
Collection<String> mdmsFromCliCmd = ScaleIOUtil.getMdmsFromCliCmd();

Check warning on line 197 in plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java

View check run for this annotation

Codecov / codecov/patch

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java#L196-L197

Added lines #L196 - L197 were not covered by tests
if (!mdmsFromCliCmd.equals(mdmsFromConfigFile)) {
String msg = String.format("PowerFlex MDM addresses from CLI and Configuration File doesn't match. " +

Check warning on line 199 in plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java

View check run for this annotation

Codecov / codecov/patch

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

Added line #L199 was not covered by tests
"CLI values: %s, Configuration File values: %s", mdmsFromCliCmd, mdmsFromConfigFile);
logger.warn(msg);
throw new CloudRuntimeException(msg);

Check warning on line 202 in plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java

View check run for this annotation

Codecov / codecov/patch

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java#L201-L202

Added lines #L201 - L202 were not covered by tests
}
}
}

Check warning on line 205 in plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java

View check run for this annotation

Codecov / codecov/patch

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

Added line #L205 was not covered by tests

@Override
public boolean deleteStoragePool(String uuid) {
ScaleIOStoragePool storagePool = (ScaleIOStoragePool) MapStorageUuidToStoragePool.get(uuid);
Expand All @@ -173,7 +215,7 @@

@Override
public boolean deleteStoragePool(String uuid, Map<String, String> details) {
if (details != null && details.containsKey(ScaleIOSDCManager.ConnectOnDemand.key())) {
if (MapUtils.isNotEmpty(details) && details.containsKey(ScaleIOSDCManager.ConnectOnDemand.key())) {
String connectOnDemand = details.get(ScaleIOSDCManager.ConnectOnDemand.key());
if (connectOnDemand != null && !Boolean.parseBoolean(connectOnDemand)) {
Pair<Boolean, String> unprepareStorageClientStatus = unprepareStorageClient(uuid, details);
Expand Down Expand Up @@ -259,7 +301,7 @@
volumePath = ScaleIOUtil.getVolumePath(volumePath);

int waitTimeInSec = DEFAULT_DISK_WAIT_TIME_IN_SECS;
if (details != null && details.containsKey(StorageManager.STORAGE_POOL_DISK_WAIT.toString())) {
if (MapUtils.isNotEmpty(details) && details.containsKey(StorageManager.STORAGE_POOL_DISK_WAIT.toString())) {
String waitTime = details.get(StorageManager.STORAGE_POOL_DISK_WAIT.toString());
if (StringUtils.isNotEmpty(waitTime)) {
waitTimeInSec = Integer.valueOf(waitTime).intValue();
Expand Down Expand Up @@ -607,28 +649,37 @@
}

if (!ScaleIOUtil.isSDCServiceActive()) {
logger.debug("SDC service is not active on host, starting it");
if (!ScaleIOUtil.startSDCService()) {
return new Ternary<>(false, null, "Couldn't start SDC service on host");
}
}

if (details != null && details.containsKey(ScaleIOGatewayClient.STORAGE_POOL_MDMS)) {
if (MapUtils.isNotEmpty(details) && details.containsKey(ScaleIOGatewayClient.STORAGE_POOL_MDMS)) {
// Assuming SDC service is started, add mdms
String mdms = details.get(ScaleIOGatewayClient.STORAGE_POOL_MDMS);
String[] mdmAddresses = mdms.split(",");
if (mdmAddresses.length > 0) {
if (ScaleIOUtil.mdmAdded(mdmAddresses[0])) {
if (ScaleIOUtil.isMdmPresent(mdmAddresses[0])) {
return new Ternary<>(true, getSDCDetails(details), "MDM added, no need to prepare the SDC client");
}

ScaleIOUtil.addMdms(Arrays.asList(mdmAddresses));
if (!ScaleIOUtil.mdmAdded(mdmAddresses[0])) {
ScaleIOUtil.addMdms(mdmAddresses);

Check warning on line 667 in plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java

View check run for this annotation

Codecov / codecov/patch

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

Added line #L667 was not covered by tests
if (!ScaleIOUtil.isMdmPresent(mdmAddresses[0])) {
return new Ternary<>(false, null, "Failed to add MDMs");
} else {
logger.debug(String.format("MDMs %s added to storage pool %s", mdms, uuid));
applyMdmsChangeWaitTime(details);

Check warning on line 672 in plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java

View check run for this annotation

Codecov / codecov/patch

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java#L671-L672

Added lines #L671 - L672 were not covered by tests
}
}
}

return new Ternary<>( true, getSDCDetails(details), "Prepared client successfully");
Map<String, String> sdcDetails = getSDCDetails(details);
if (MapUtils.isEmpty(sdcDetails)) {
return new Ternary<>(false, null, "Couldn't get the SDC details on the host");

Check warning on line 679 in plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java

View check run for this annotation

Codecov / codecov/patch

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

Added line #L679 was not covered by tests
}

return new Ternary<>(true, sdcDetails, "Prepared client successfully");
}

public Pair<Boolean, String> unprepareStorageClient(String uuid, Map<String, String> details) {
Expand All @@ -642,40 +693,127 @@
return new Pair<>(true, "SDC service not enabled on host, no need to unprepare the SDC client");
}

if (details != null && details.containsKey(ScaleIOGatewayClient.STORAGE_POOL_MDMS)) {
if (MapUtils.isNotEmpty(details) && details.containsKey(ScaleIOGatewayClient.STORAGE_POOL_MDMS)) {
String mdms = details.get(ScaleIOGatewayClient.STORAGE_POOL_MDMS);
String[] mdmAddresses = mdms.split(",");
if (mdmAddresses.length > 0) {
if (!ScaleIOUtil.mdmAdded(mdmAddresses[0])) {
if (!ScaleIOUtil.isMdmPresent(mdmAddresses[0])) {
return new Pair<>(true, "MDM not added, no need to unprepare the SDC client");
} else {
String configKey = ScaleIOSDCManager.BlockSdcUnprepareIfRestartNeededAndVolumesAreAttached.key();
String configValue = details.get(configKey);

if (StringUtils.isEmpty(configValue)) {
logger.debug(String.format("Configuration key %s not provided", configKey));
} else {
logger.debug(String.format("Configuration key %s provided as %s", configKey, configValue));

Check warning on line 709 in plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java

View check run for this annotation

Codecov / codecov/patch

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

Added line #L709 was not covered by tests
}
Boolean blockUnprepare = Boolean.valueOf(configValue);
if (!ScaleIOUtil.isRemoveMdmCliSupported() // scini restart required when --remove_mdm is not supported
&& !ScaleIOUtil.getVolumeIds().isEmpty()
&& Boolean.TRUE.equals(blockUnprepare)) {
return new Pair<>(false, "Failed to remove MDMs, SDC client requires service to be restarted, but there are Volumes attached to the Host");

Check warning on line 715 in plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java

View check run for this annotation

Codecov / codecov/patch

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

Added line #L715 was not covered by tests
}
}

ScaleIOUtil.removeMdms(Arrays.asList(mdmAddresses));
if (ScaleIOUtil.mdmAdded(mdmAddresses[0])) {
// Immediate removal of MDMs after unmapping volume throws Error: "Volume is mappedKernel module rejects removing MDM"
// Wait before removing MDMs for any volumes to get unmapped.
applyMdmsChangeWaitTime(details);
ScaleIOUtil.removeMdms(mdmAddresses);
if (ScaleIOUtil.isMdmPresent(mdmAddresses[0])) {
return new Pair<>(false, "Failed to remove MDMs, unable to unprepare the SDC client");
} else {
logger.debug(String.format("MDMs %s removed from storage pool %s", mdms, uuid));
applyMdmsChangeWaitTime(details);

Check warning on line 727 in plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java

View check run for this annotation

Codecov / codecov/patch

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java#L726-L727

Added lines #L726 - L727 were not covered by tests
}
}
}

/*
* TODO:
* 1. Verify on-demand is true
* 2. If on-demand is true check whether other MDM addresses are still present
* 3. If there are no MDM addresses, then stop SDC service.
*/

return new Pair<>(true, "Unprepared SDC client successfully");
}

/**
* Check whether details map has wait time configured and do "apply wait time" pause before returning response
* (to have ScaleIO changes applied).
*
* @param details see {@link PrepareStorageClientCommand#getDetails()}
* and {@link @UnprepareStorageClientCommand#getDetails()}, expected to contain
* {@link ScaleIOSDCManager#MdmsChangeApplyWaitTime#key()}
*/
private void applyMdmsChangeWaitTime(Map<String, String> details) {
String configKey = ScaleIOSDCManager.MdmsChangeApplyWaitTime.key();
if (MapUtils.isEmpty(details) || !details.containsKey(configKey)) {
logger.debug(String.format("Apply wait time property %s not sent by Management Server, skip", configKey));
return;
}

String configValue = details.get(configKey);

Check warning on line 757 in plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java

View check run for this annotation

Codecov / codecov/patch

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

Added line #L757 was not covered by tests
if (StringUtils.isEmpty(configValue)) {
logger.debug(String.format("Apply wait time value not defined in property %s, skip", configKey));
return;

Check warning on line 760 in plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java

View check run for this annotation

Codecov / codecov/patch

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java#L759-L760

Added lines #L759 - L760 were not covered by tests
}
long timeoutMs;
try {
timeoutMs = Long.parseLong(configValue);
} catch (NumberFormatException e) {
logger.warn(String.format("Invalid apply wait time value defined in property %s, skip", configKey), e);
return;
}

Check warning on line 768 in plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java

View check run for this annotation

Codecov / codecov/patch

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java#L762-L768

Added lines #L762 - L768 were not covered by tests
if (timeoutMs < 1) {
logger.warn(String.format("Apply wait time value is too small (%s ms), skipping", timeoutMs));
return;

Check warning on line 771 in plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java

View check run for this annotation

Codecov / codecov/patch

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java#L770-L771

Added lines #L770 - L771 were not covered by tests
}
try {
logger.debug(String.format("Waiting for %d ms as defined in property %s", timeoutMs, configKey));
Thread.sleep(timeoutMs);
} catch (InterruptedException e) {
logger.warn(String.format("Waiting for %d ms interrupted", timeoutMs), e);
}

Check warning on line 778 in plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java

View check run for this annotation

Codecov / codecov/patch

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java#L773-L778

Added lines #L773 - L778 were not covered by tests
}

private Map<String, String> getSDCDetails(Map<String, String> details) {
Map<String, String> sdcDetails = new HashMap<String, String>();
if (details == null || !details.containsKey(ScaleIOGatewayClient.STORAGE_POOL_SYSTEM_ID)) {
if (MapUtils.isEmpty(details) || !details.containsKey(ScaleIOGatewayClient.STORAGE_POOL_SYSTEM_ID)) {
return sdcDetails;
}

String storageSystemId = details.get(ScaleIOGatewayClient.STORAGE_POOL_SYSTEM_ID);
String sdcId = ScaleIOUtil.getSdcId(storageSystemId);
if (sdcId != null) {
sdcDetails.put(ScaleIOGatewayClient.SDC_ID, sdcId);
} else {
if (StringUtils.isEmpty(storageSystemId)) {
return sdcDetails;

Check warning on line 789 in plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java

View check run for this annotation

Codecov / codecov/patch

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

Added line #L789 was not covered by tests
}

int numberOfTries = 5;
int timeBetweenTries = 1000; // Try more frequently (every sec) and return early when SDC Id or Guid found
int attempt = 1;
do {
logger.debug("Get SDC details, attempt #{}", attempt);
String sdcId = ScaleIOUtil.getSdcId(storageSystemId);
if (sdcId != null) {
sdcDetails.put(ScaleIOGatewayClient.SDC_ID, sdcId);
return sdcDetails;
}

String sdcGuId = ScaleIOUtil.getSdcGuid();
if (sdcGuId != null) {
sdcDetails.put(ScaleIOGatewayClient.SDC_GUID, sdcGuId);
return sdcDetails;
}
}

try {
Thread.sleep(timeBetweenTries);
} catch (Exception ignore) {
}
numberOfTries--;
attempt++;

Check warning on line 814 in plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java

View check run for this annotation

Codecov / codecov/patch

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java#L809-L814

Added lines #L809 - L814 were not covered by tests
} while (numberOfTries > 0);

return sdcDetails;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -194,8 +194,12 @@ public void testUnprepareStorageClient_RemoveMDMFailed() {
details.put(ScaleIOGatewayClient.STORAGE_POOL_MDMS, "1.1.1.1,2.2.2.2");
when(Script.runSimpleBashScriptForExitValue(Mockito.eq("systemctl status scini"))).thenReturn(3);
when(Script.runSimpleBashScriptForExitValue(Mockito.eq("systemctl is-enabled scini"))).thenReturn(0);
when(Script.executeCommand(Mockito.eq("sed -i '/1.1.1.1\\,/d' /etc/emc/scaleio/drv_cfg.txt"))).thenReturn(new Pair<>(null, null));
when(Script.runSimpleBashScriptForExitValue(Mockito.eq("systemctl restart scini"))).thenReturn(0);
when(Script.runSimpleBashScript(Mockito.eq("/opt/emc/scaleio/sdc/bin/drv_cfg --query_mdms|grep 1.1.1.1"))).thenReturn("MDM-ID 71fd458f0775010f SDC ID 4421a91a00000000 INSTALLATION ID 204930df2cbcaf8e IPs [0]-1.1.1.1 [1]-2.2.2.2");
when(Script.executeCommand(Mockito.eq("/opt/emc/scaleio/sdc/bin/drv_cfg"))).thenReturn(new Pair<>(null, null));
when(Script.executeCommand(Mockito.eq("/opt/emc/scaleio/sdc/bin/drv_cfg --query_vols"))).thenReturn(new Pair<>("", null));


Pair<Boolean, String> result = scaleIOStorageAdaptor.unprepareStorageClient(poolUuid, details);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@ public interface ScaleIOGatewayClient {
String GATEWAY_API_PASSWORD = "powerflex.gw.password";
String STORAGE_POOL_NAME = "powerflex.storagepool.name";
String STORAGE_POOL_SYSTEM_ID = "powerflex.storagepool.system.id";
/**
* Storage Pool Metadata Management (MDM) IP address(es).
*/
String STORAGE_POOL_MDMS = "powerflex.storagepool.mdms";
String SDC_ID = "powerflex.sdc.id";
String SDC_GUID = "powerflex.sdc.guid";
Expand Down
Loading
Loading