/*
* Copyright (c) 2016 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.volumecontroller.impl.validators.vplex;
import static com.emc.storageos.db.client.util.CommonTransformerFunctions.fctnDataObjectToForDisplay;
import static com.google.common.collect.Collections2.transform;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Collection;
import java.util.List;
import com.emc.storageos.db.client.model.BlockObject;
import com.emc.storageos.db.client.util.CommonTransformerFunctions;
import com.emc.storageos.volumecontroller.impl.validators.DefaultValidator;
import com.emc.storageos.volumecontroller.impl.validators.contexts.ExportMaskValidationContext;
import com.google.common.collect.Collections2;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.db.client.DbClient;
import com.emc.storageos.db.client.model.BlockSnapshot;
import com.emc.storageos.db.client.model.ExportMask;
import com.emc.storageos.db.client.model.Initiator;
import com.emc.storageos.db.client.model.StorageSystem;
import com.emc.storageos.db.client.model.Volume;
import com.emc.storageos.exceptions.DeviceControllerException;
import com.emc.storageos.volumecontroller.impl.validators.StorageSystemValidatorFactory;
import com.emc.storageos.volumecontroller.impl.validators.ValCk;
import com.emc.storageos.volumecontroller.impl.validators.Validator;
import com.emc.storageos.volumecontroller.impl.validators.ValidatorConfig;
import com.emc.storageos.volumecontroller.impl.validators.ValidatorLogger;
import com.emc.storageos.vplex.api.VPlexApiFactory;
import com.emc.storageos.vplexcontroller.VPlexControllerUtils;
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
/**
* Factory for creating Vplex-specific validator instances.
*/
public class VplexSystemValidatorFactory implements StorageSystemValidatorFactory {
private static final Logger log = LoggerFactory.getLogger(VplexSystemValidatorFactory.class);
private DbClient dbClient;
private ValidatorConfig config;
private final List<Volume> remediatedVolumes = Lists.newArrayList();
private ValidatorLogger logger;
/**
* Sets the database client.
*
* @param dbClient the database client
*/
public void setDbClient(DbClient dbClient) {
this.dbClient = dbClient;
}
/**
* Set the ValidatorConfig
* @param config the validator config object
*/
public void setConfig(ValidatorConfig config) {
this.config = config;
}
/**
* Verify storage system connectivity
*
* @param storageSystem the VPLEX storage system to check
*/
private void checkVplexConnectivity(StorageSystem storageSystem) {
try {
VPlexControllerUtils.getVPlexAPIClient(VPlexApiFactory.getInstance(), storageSystem, dbClient);
} catch (URISyntaxException ex) {
log.error("Couldn't connect to VPLEX: " + storageSystem.getLabel(), ex);
} catch (Exception ex) {
log.error("Couldn't connect to VPLEX: " + storageSystem.getLabel(), ex);
throw ex;
}
}
@Override
public Validator exportMaskDelete(ExportMaskValidationContext ctx) {
checkVplexConnectivity(ctx.getStorage());
logger = new ValidatorLogger(log, ctx.getExportMask().forDisplay(), ctx.getStorage().forDisplay());
VplexExportMaskValidator validator = new VplexExportMaskValidator(dbClient, config, logger, ctx.getStorage(),
ctx.getExportMask());
Collection<URI> volURIs = Collections2.transform(ctx.getBlockObjects(), CommonTransformerFunctions.fctnDataObjectToID());
validator.setVolumesToValidate(volURIs);
validator.setInitiatorsToValidate(ctx.getInitiators());
DefaultValidator defaultValidator = new DefaultValidator(validator, config, logger, "Export Mask");
defaultValidator.setExceptionContext(ctx);
return defaultValidator;
}
@Override
public Validator removeVolumes(ExportMaskValidationContext ctx) {
checkVplexConnectivity(ctx.getStorage());
ExportMask exportMask = dbClient.queryObject(ExportMask.class, ctx.getExportMask().getId());
logger = new ValidatorLogger(log, exportMask.forDisplay(), ctx.getStorage().forDisplay());
VplexExportMaskValidator validator = new VplexExportMaskValidator(dbClient, config, logger, ctx.getStorage(), exportMask);
validator.setInitiatorsToValidate(ctx.getInitiators());
DefaultValidator defaultValidator = new DefaultValidator(validator, config, logger, "Export Mask");
defaultValidator.setExceptionContext(ctx);
return defaultValidator;
}
@Override
public Validator removeInitiators(ExportMaskValidationContext ctx) {
checkVplexConnectivity(ctx.getStorage());
logger = new ValidatorLogger(log, ctx.getExportMask().forDisplay(), ctx.getStorage().forDisplay());
VplexExportMaskValidator validator = new VplexExportMaskValidator(dbClient, config, logger, ctx.getStorage(),
ctx.getExportMask());
Collection<? extends BlockObject> blockObjects = ctx.getBlockObjects();
Collection<URI> uris = Collections2.transform(blockObjects, CommonTransformerFunctions.fctnDataObjectToID());
// FIXME setVolumesToValidate should accept Collection<Volume> (or <? extends BlockObject>)
validator.setVolumesToValidate(uris);
DefaultValidator defaultValidator = new DefaultValidator(validator, config, logger, "Export Mask");
defaultValidator.setExceptionContext(ctx);
return defaultValidator;
}
@Override
public Validator deleteVolumes(StorageSystem storage, Collection<Volume> volumes) {
return null;
}
@Override
public List<Volume> volumes(StorageSystem storageSystem, List<Volume> volumes, boolean delete, boolean remediate,
ValCk[] checks) {
checkVplexConnectivity(storageSystem);
try {
// Generate a friendly volume list for volume validation
Collection<String> volNames = transform(volumes, fctnDataObjectToForDisplay());
logger = new ValidatorLogger(log, Joiner.on(",").join(volNames), storageSystem.forDisplay());
VplexVolumeValidator vplexVolumeValidator = new VplexVolumeValidator(dbClient, config, logger);
vplexVolumeValidator.validateVolumes(storageSystem, volumes, delete, remediate, checks);
if (logger.hasErrors() && config.isValidationEnabled()) {
throw DeviceControllerException.exceptions.validationVolumeError(logger.getValidatedObjectName(),
logger.getStorageSystemName(), logger.getMsgs().toString());
}
} catch (Exception ex) {
log.error("Unexpected exception validating VPLEX: " + storageSystem.getId(), ex);
throw ex;
}
return remediatedVolumes;
}
@Override
public Validator expandVolumes(StorageSystem storageSystem, Volume volume) {
return null;
}
@Override
public Validator createSnapshot(StorageSystem storage, BlockSnapshot snapshot, Volume volume) {
return null;
}
@Override
public Validator addVolumes(StorageSystem storage, URI exportMaskURI, Collection<Initiator> initiators) {
// TODO Auto-generated method stub
return null;
}
@Override
public Validator addInitiators(StorageSystem storage, ExportMask exportMask, Collection<URI> volumeURIList) {
// TODO Auto-generated method stub
return null;
}
}