/*
* Copyright (c) 2017 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.volumecontroller.impl.validators.vnxe;
import java.util.Collection;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.db.client.DbClient;
import com.emc.storageos.db.client.model.BlockObject;
import com.emc.storageos.db.client.model.ExportMask;
import com.emc.storageos.db.client.model.StorageSystem;
import com.emc.storageos.exceptions.DeviceControllerException;
import com.emc.storageos.util.ExportUtils;
import com.emc.storageos.vnxe.VNXeApiClient;
import com.emc.storageos.vnxe.models.VNXeHost;
import com.emc.storageos.volumecontroller.impl.validators.ValidatorLogger;
import com.google.common.base.Joiner;
/**
* Validator class for removing initiators from export mask and deleting export mask
*/
public class VNXeExportMaskVolumesValidator extends AbstractVNXeValidator {
private static final Logger log = LoggerFactory.getLogger(VNXeExportMaskVolumesValidator.class);
private static final String unknownLUNRemediation = "Unmap the LUN/LUN Snap from the host on array";
private final Collection<? extends BlockObject> blockObjects;
VNXeExportMaskVolumesValidator(StorageSystem storage, ExportMask exportMask,
Collection<? extends BlockObject> blockObjects) {
super(storage, exportMask);
this.blockObjects = blockObjects;
}
@Override
public boolean validate() throws Exception {
log.info("Initiating volume validation of VNXe ExportMask: " + getId());
DbClient dbClient = getDbClient();
VNXeApiClient apiClient = getApiClient();
ExportMask exportMask = getExportMask();
try {
String vnxeHostId = getHostId();
if (vnxeHostId != null) {
VNXeHost vnxeHost = apiClient.getHostById(vnxeHostId);
if (vnxeHost != null) {
Set<String> lunIds = ExportUtils.getAllLUNsForHost(dbClient, exportMask);
Set<String> lunIdsOnArray = apiClient.getHostLUNIds(vnxeHostId);
lunIdsOnArray.removeAll(lunIds);
if (!lunIdsOnArray.isEmpty()) {
String unknownLUNs = Joiner.on(',').join(lunIdsOnArray);
log.info("Unknown LUN/LUN Snap {}", unknownLUNs);
getLogger().logDiff(exportMask.getId().toString(), "volumes", ValidatorLogger.NO_MATCHING_ENTRY, unknownLUNs);
}
}
}
} catch (Exception ex) {
log.error("Unexpected exception validating ExportMask volumes: " + ex.getMessage(), ex);
throw DeviceControllerException.exceptions.unexpectedCondition(
"Unexpected exception validating ExportMask volumes: " + ex.getMessage());
}
setRemediation(unknownLUNRemediation);
checkForErrors();
log.info("Completed volume validation of VNXe ExportMask: " + getId());
return true;
}
}