/* * 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.ArrayList; 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.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; import com.emc.storageos.db.client.util.CommonTransformerFunctions; import com.google.common.collect.Collections2; /* * MASK_PER_HOST : * Arrays whose existing masking containers cannot be modeled as export mask in ViPR DB * are candidates for this mask per host behavior. * Here, during provisioning ViPR creates a logical container Export mask for each Host to get exported * through ViPR.Its guaranteed that there will be always only 1 export mask available in ViPR Db at any * point of time. * * XtremIO,HDS are examples. */ public class MaskPerHostIngestOrchestrator extends BlockIngestExportOrchestrator { private static final Logger _logger = LoggerFactory.getLogger(MaskPerHostIngestOrchestrator.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); } /** * maskPerHost Mode guaranteed to have initiators in only 1 export mask * always. * */ @Override protected ExportMask getExportMaskAlreadyIngested(UnManagedExportMask mask, DbClient dbClient) { ExportMask eMask = null; boolean maskFound = false; List<URI> initiatorUris = new ArrayList<URI>(Collections2.transform( mask.getKnownInitiatorUris(), CommonTransformerFunctions.FCTN_STRING_TO_URI)); for (URI ini : initiatorUris) { List<URI> exportMaskUris = _dbClient.queryByConstraint(AlternateIdConstraint.Factory .getExportMaskInitiatorConstraint(ini.toString())); if (null == exportMaskUris) { return eMask; } for (URI eMaskUri : exportMaskUris) { ExportMask potentialMask = _dbClient.queryObject(ExportMask.class, eMaskUri); if (potentialMask.getStorageDevice() != null && potentialMask.getStorageDevice().equals(mask.getStorageSystemUri())) { _logger.info("Found Mask {} with matching initiator and matching Storage System", eMaskUri); eMask = potentialMask; maskFound = true; break; } else { _logger.info("Found Mask {} with matching initiator and unmatched Storage System. Skipping mask", eMaskUri); } } if (maskFound) { break; } } return eMask; } /* * (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<URI> initiatorUris = new ArrayList<URI>(Collections2.transform( mask.getKnownInitiatorUris(), CommonTransformerFunctions.FCTN_STRING_TO_URI)); List<ExportMask> exportMasks = requestContext.findAllNewExportMasks(); for (URI ini : initiatorUris) { for (ExportMask createdMask : exportMasks) { if (null != createdMask && createdMask.getInitiators() != null && createdMask.getInitiators().contains(ini.toString())) { if (null != createdMask.getStorageDevice() && createdMask.getStorageDevice().equals(mask.getStorageSystemUri())) { _logger.info("Found already-created ExportMask {} matching UnManagedExportMask initiator {} and storage system {}", createdMask.getMaskName(), ini, mask.getStorageSystemUri()); return createdMask; } } } } _logger.info("No existing created mask found for UnManagedExportMask {}", mask.getMaskName()); return null; } }