/*
* Copyright (c) 2008-2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.api.service.impl.resource.blockingestorchestration;
import java.net.URI;
import java.util.List;
import org.apache.commons.lang.mutable.MutableInt;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.api.service.impl.resource.blockingestorchestration.context.IngestionRequestContext;
import com.emc.storageos.api.service.impl.resource.utils.VolumeIngestionUtil;
import com.emc.storageos.db.client.DbClient;
import com.emc.storageos.db.client.constraint.AlternateIdConstraint;
import com.emc.storageos.db.client.model.BlockObject;
import com.emc.storageos.db.client.model.ExportMask;
import com.emc.storageos.db.client.model.UnManagedDiscoveredObjects.UnManagedExportMask;
import com.emc.storageos.db.client.model.UnManagedDiscoveredObjects.UnManagedVolume;
/*
* MULTIPLE_MASK_PER_HOST :
* Arrays whose existing masking containers can be modeled to export mask in ViPR DB
* are candidates for this multiple mask per host behavior.
* Here, during provisioning ViPR creates an export mask object for every masking container
* found in the Array. There is no restriction of one export mask per host , as the export masks created in
* ViPR DB are actually a replica of what's there in Array.
*
* VMAX,VNX Block are examples
*/
public class MultipleMaskPerHostIngestOrchestrator extends BlockIngestExportOrchestrator {
private static final Logger _logger = LoggerFactory.getLogger(MultipleMaskPerHostIngestOrchestrator.class);
@Override
public <T extends BlockObject> void ingestExportMasks(IngestionRequestContext requestContext,
UnManagedVolume unManagedVolume, T blockObject, List<UnManagedExportMask> unManagedMasks,
MutableInt masksIngestedCount) throws IngestionException {
super.ingestExportMasks(requestContext, unManagedVolume, blockObject, unManagedMasks, masksIngestedCount);
}
@Override
protected ExportMask getExportMaskAlreadyIngested(UnManagedExportMask mask, DbClient dbClient) {
@SuppressWarnings("deprecation")
List<URI> maskUris = dbClient.queryByConstraint(AlternateIdConstraint.Factory.getExportMaskByNameConstraint(mask
.getMaskName()));
if (null != maskUris && !maskUris.isEmpty()) {
for (URI maskUri : maskUris) {
ExportMask exportMask = dbClient.queryObject(ExportMask.class, maskUri);
// skip if the mask is null, the storage device doesn't match, or is on the incorrect vplex cluster path
if (null == exportMask
|| null == exportMask.getStorageDevice()
|| !exportMask.getStorageDevice().equals(mask.getStorageSystemUri())
|| VolumeIngestionUtil.hasIncorrectMaskPathForVplex(mask, exportMask, dbClient)) {
continue;
}
// COP-18184 : Check if the initiators are also matching
if (exportMask.getInitiators() != null
&& exportMask.getInitiators().containsAll(mask.getKnownInitiatorUris())) {
return exportMask;
}
}
}
return null;
}
/* (non-Javadoc)
* @see com.emc.storageos.api.service.impl.resource.blockingestorchestration.BlockIngestExportOrchestrator#getExportMaskAlreadyCreated(com.emc.storageos.db.client.model.UnManagedDiscoveredObjects.UnManagedExportMask, com.emc.storageos.api.service.impl.resource.blockingestorchestration.context.IngestionRequestContext)
*/
@Override
protected ExportMask getExportMaskAlreadyCreated(UnManagedExportMask mask, IngestionRequestContext requestContext, DbClient dbClient) {
List<ExportMask> exportMasks = requestContext.findAllNewExportMasks();
for (ExportMask createdMask : exportMasks) {
// COP-18184 : Check if the initiators are also matching
if (null != createdMask && createdMask.getInitiators() != null
&& createdMask.getInitiators().containsAll(mask.getKnownInitiatorUris())) {
if (VolumeIngestionUtil.hasIncorrectMaskPathForVplex(mask, createdMask, dbClient)) {
continue;
}
_logger.info("Found already-created ExportMask {} matching all initiators of UnManagedExportMask {}",
createdMask.getMaskName(), mask.getMaskName());
return createdMask;
}
}
_logger.info("No existing created mask found for UnManagedExportMask {}", mask.getMaskName());
return null;
}
}