/*
* Copyright (c) 2008-2013 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.volumecontroller.impl.plugins.discovery.smis.processor;
import com.emc.storageos.coordinator.client.service.CoordinatorClient;
import com.emc.storageos.db.client.DbClient;
import com.emc.storageos.db.client.model.DiscoveredDataObject.CompatibilityStatus;
import com.emc.storageos.db.client.model.DiscoveredDataObject.Type;
import com.emc.storageos.db.client.model.StorageSystem;
import com.emc.storageos.db.client.util.CustomQueryUtility;
import com.emc.storageos.plugins.AccessProfile;
import com.emc.storageos.plugins.BaseCollectionException;
import com.emc.storageos.plugins.common.Constants;
import com.emc.storageos.plugins.common.Processor;
import com.emc.storageos.plugins.common.domainmodel.Operation;
import com.emc.storageos.plugins.metering.smis.SMIPluginException;
import com.emc.storageos.util.VersionChecker;
import com.emc.storageos.volumecontroller.impl.NativeGUIDGenerator;
import com.emc.storageos.volumecontroller.impl.utils.DiscoveryUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.cim.CIMInstance;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
/**
* Check if supported firmware version,else throw exception, which would stop the discovery.
*
*/
public class FirmwareProcessor extends Processor {
private Logger _logger = LoggerFactory.getLogger(FirmwareProcessor.class);
private static final String VERSION = "VersionString";
private static final String INSTANCEID = "InstanceID";
private DbClient _dbClient;
private CoordinatorClient coordinator;
/**
* {@inheritDoc}
*/
@Override
public void processResult(Operation operation, Object resultObj,
Map<String, Object> keyMap) throws BaseCollectionException {
try {
String serialNumber = null;
@SuppressWarnings("unchecked")
final Iterator<CIMInstance> it = (Iterator<CIMInstance>) resultObj;
_dbClient = (DbClient) keyMap.get(Constants.dbClient);
coordinator = (CoordinatorClient) keyMap.get(Constants.COORDINATOR_CLIENT);
AccessProfile profile = (AccessProfile) keyMap.get(Constants.ACCESSPROFILE);
String delimiter = Constants.PATH_DELIMITER_REGEX;
if (Type.ibmxiv.name().equals(profile.getSystemType())) {
delimiter = Pattern.quote(Constants.COLON);
}
if (it.hasNext()) {
CIMInstance firmwareInstance = it.next(); // e.g., IBM XIV InstanceID, IBMTSDS:IBM.2810-7825363
serialNumber = firmwareInstance.getPropertyValue(INSTANCEID)
.toString().split(delimiter)[1];
String nativeGuid = NativeGUIDGenerator.generateNativeGuid(profile.getSystemType(), serialNumber);
List<StorageSystem> systems = CustomQueryUtility.getActiveStorageSystemByNativeGuid(_dbClient, nativeGuid);
if (!systems.isEmpty()) {
StorageSystem system = systems.get(0);
checkFirmwareVersion(firmwareInstance, system);
}
} else {
String errMsg = String.format("No information obtained from Provider %s for Firmware version", profile.getIpAddress());
throw new SMIPluginException(errMsg, SMIPluginException.ERRORCODE_OPERATIONFAILED);
}
} catch (SMIPluginException e) {
throw e;
} catch (Exception e) {
String errMsg = String.format("An error occurred while verifying Firmware version: %s", e.getMessage());
throw new SMIPluginException(SMIPluginException.ERRORCODE_OPERATIONFAILED, e, errMsg);
}
}
/**
* Firmware check.
*
* @param firmwareInstance
* @param system
* @throws SMIPluginException
*/
private void checkFirmwareVersion(CIMInstance firmwareInstance, StorageSystem system)
throws SMIPluginException {
String instanceVersion = getCIMPropertyValue(firmwareInstance, VERSION);
system.setFirmwareVersion(instanceVersion);
String minimumSupportedVersion = VersionChecker.getMinimumSupportedVersion(Type.valueOf(system.getSystemType()));
_logger.info("Verifying version details : Minimum Supported Version {} - Discovered Firmware Version {}",
minimumSupportedVersion, instanceVersion);
if (VersionChecker.verifyVersionDetails(minimumSupportedVersion, instanceVersion) < 0) {
String msg = String.format("Firmware version %s is not supported. Should be a minimum of %s",
instanceVersion, minimumSupportedVersion);
_logger.warn(msg);
system.setCompatibilityStatus(CompatibilityStatus.INCOMPATIBLE.toString());
DiscoveryUtils.setSystemResourcesIncompatible(_dbClient, coordinator, system.getId());
_dbClient.persistObject(system);
throw new SMIPluginException(msg, SMIPluginException.ERRORCODE_FIRMWARE_NOT_SUPPORTED);
} else {
system.setCompatibilityStatus(CompatibilityStatus.COMPATIBLE.toString());
_dbClient.persistObject(system);
}
}
}