/* * Copyright (c) 2015. EMC Corporation * All Rights Reserved */ package com.emc.storageos.vplexcontroller; import java.net.URI; import java.util.Collection; import java.util.HashMap; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.emc.storageos.db.client.DbClient; import com.emc.storageos.db.client.model.ExportGroup; 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.util.ExportUtils; import com.emc.storageos.volumecontroller.impl.block.ExportMaskPlacementDescriptor; /** * This VplexBackendPlacementStrategy will examine the ExportMaskPlacementDescriptor and pick the ExportMask that has the least volumes */ public class VplexBackendLowestVolumeCountStrategy implements VPlexBackendPlacementStrategy { private static final Logger log = LoggerFactory.getLogger(VplexBackendLowestVolumeCountStrategy.class); private DbClient dbClient; private ExportMaskPlacementDescriptor placementDescriptor; public VplexBackendLowestVolumeCountStrategy(DbClient dbClient, ExportMaskPlacementDescriptor descriptor) { this.dbClient = dbClient; this.placementDescriptor = descriptor; } @Override public void execute() { Map<URI, ExportMask> maskSetCopy = new HashMap<>(placementDescriptor.getMasks()); // Determine the ExportMask with the lowest volume count int lowestVolumeCount = Integer.MAX_VALUE; ExportMask lowestCountMask = null; for (ExportMask mask : maskSetCopy.values()) { Integer volumeCount = 0; if (mask.getVolumes() != null) { volumeCount += mask.getVolumes().size(); } if (mask.getExistingVolumes() != null) { volumeCount += mask.getExistingVolumes().size(); } if (volumeCount < lowestVolumeCount) { lowestVolumeCount = volumeCount; lowestCountMask = mask; } } if (lowestCountMask != null) { for (URI uri : maskSetCopy.keySet()) { // Clean out any other ExportMask placements that were determined // to this singled out 'lowestCountMask' if (!uri.equals(lowestCountMask.getId())) { placementDescriptor.invalidateExportMask(uri); } } URI tenant = placementDescriptor.getTenant(); URI project = placementDescriptor.getProject(); StorageSystem vplex = placementDescriptor.getVplex(); StorageSystem array = placementDescriptor.getBackendArray(); URI virtualArray = placementDescriptor.getVirtualArray(); Collection<Initiator> initiators = placementDescriptor.getInitiators(); // Determine ExportGroup ExportGroup exportGroup = ExportUtils.getVPlexExportGroup(dbClient, vplex, array, virtualArray, lowestCountMask, initiators, tenant, project); placementDescriptor.mapExportMaskToExportGroup(lowestCountMask.getId(), exportGroup); log.info(String.format("Returning ExportMask %s (%s)", lowestCountMask.getMaskName(), lowestCountMask.getId())); } else { log.warn("Could not find ExportMask with the least volumes when trying to place volumes"); } } }