/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.storageos.volumecontroller.impl.utils; import com.emc.storageos.volumecontroller.impl.block.ExportMaskPolicy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Comparator; /** * Class encapsulates a way to compare ExportMasks using a wrapper class ExportMaskComparatorContainer * */ class ExportMaskComparator implements Comparator<ExportMaskComparatorContainer> { private static final Logger log = LoggerFactory.getLogger(ExportMaskComparator.class); public int compare(ExportMaskComparatorContainer e1, ExportMaskComparatorContainer e2) { // CTRL-8982 , existing initiators are initiators which are not part of userAdded // it could be null, I think we need to check the initiators instead of existingInitiators() // Rule 1: Prefer masks that contain all initiators over partial or incomplete masks Integer e1IniCount = e1.mask.getInitiators() != null ? e1.mask.getInitiators().size() : 0; Integer e2IniCount = e2.mask.getInitiators() != null ? e2.mask.getInitiators().size() : 0; // CTRL-9709 - If Cluster, then cluster MV should get more preference than Host MV if (e1.exportGroup.forCluster()) { // Descending order if (e1IniCount < e2IniCount) { return 1; } else if (e1IniCount > e2IniCount) { return -1; } } else { // if Host or initiator mode - ascending order if (e1IniCount > e2IniCount) { return 1; } else if (e1IniCount < e2IniCount) { return -1; } } // Rule 2: COP-16877 Prefer REGULAR masks to Phantom if (e1.policy.getExportType().equals(ExportMaskPolicy.EXPORT_TYPE.REGULAR.name()) && !e2.policy.getExportType().equals(ExportMaskPolicy.EXPORT_TYPE.REGULAR.name())) { return -1; } else if (!e1.policy.getExportType().equals(ExportMaskPolicy.EXPORT_TYPE.REGULAR.name()) && e2.policy.getExportType().equals(ExportMaskPolicy.EXPORT_TYPE.REGULAR.name())) { return 1; } // Rule 3: Prefer masks that have cascaded groups if (e1.policy.isSimpleMask() && !e2.policy.isSimpleMask()) { return 1; } else if (!e1.policy.isSimpleMask() && e2.policy.isSimpleMask()) { return -1; } // Rule 4: Prefer masks that are less utilized Integer e1Count = e1.mask.returnTotalVolumeCount(); Integer e2Count = e2.mask.returnTotalVolumeCount(); int result = e1Count.compareTo(e2Count); log.info(String.format("Comparing %s (#vols: %d) to %s (#vols: %d) result = %d", e1.mask.getMaskName(), e1Count, e2.mask.getMaskName(), e2Count, result)); return result; } }