/*
* Copyright (c) 2016 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.volumecontroller.impl.validators.smis.vmax;
import com.emc.storageos.cimadapter.connections.cim.CimConnection;
import com.emc.storageos.db.client.model.StorageSystem;
import com.emc.storageos.db.client.model.Volume;
import com.emc.storageos.volumecontroller.impl.validators.smis.AbstractSMISValidator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.cim.CIMInstance;
import javax.cim.CIMObjectPath;
import javax.cim.CIMProperty;
import javax.wbem.client.WBEMClient;
import java.util.Collection;
import static com.emc.storageos.volumecontroller.impl.smis.SmisConstants.CP_WWN_NAME;
import static com.google.common.base.Strings.isNullOrEmpty;
/**
* Checks for differences in volume identity between ViPR DB and SMI-S.
*/
public class ValidateVolumeIdentity extends AbstractSMISValidator {
private static final Logger log = LoggerFactory.getLogger(ValidateVolumeIdentity.class);
private static final String[] PROP_KEYS = new String[] { CP_WWN_NAME };
private StorageSystem system;
private Collection<Volume> volumes;
public ValidateVolumeIdentity(StorageSystem system, Collection<Volume> volumes) {
this.system = system;
this.volumes = volumes;
}
@Override
public boolean validate() throws Exception {
getLogger().setLog(log);
for (Volume volume : volumes) {
CIMObjectPath volumePath = getCimPath().getBlockObjectPath(system, volume);
CimConnection connection = getHelper().getConnection(system);
WBEMClient cimClient = connection.getCimClient();
CIMInstance instance = cimClient.getInstance(volumePath, false, false, PROP_KEYS);
checkForDifferences(instance, volume);
}
return getLogger().hasErrors();
}
private void checkForDifferences(CIMInstance instance, Volume volume) {
for (String propKey : PROP_KEYS) {
CIMProperty<?> property = instance.getProperty(propKey);
if (property == null) {
log.warn("Skipping property check for %s on %s as it was null", propKey, volume.getId());
continue;
}
switch (propKey) {
case CP_WWN_NAME:
validateWWN(property, volume);
break;
}
}
}
private void validateWWN(CIMProperty<?> property, Volume volume) {
String hwWWN = (String) property.getValue();
String dbWWN = volume.getWWN();
if (!isNullOrEmpty(dbWWN) && !dbWWN.equalsIgnoreCase(hwWWN)) {
String id = String.format("(%s/%s)", volume.getNativeGuid(), volume.getId());
getLogger().logDiff(id, "wwn", dbWWN, hwWWN);
}
}
}