/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.storageos.volumecontroller.placement; import java.net.URI; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.log4j.PropertyConfigurator; import com.emc.storageos.db.client.model.DiscoveredDataObject; import com.emc.storageos.db.client.model.DiscoveredDataObject.DiscoveryStatus; import com.emc.storageos.db.client.util.NullColumnValueGetter; import com.emc.storageos.db.client.model.ExportPathParams; import com.emc.storageos.db.client.model.Host; import com.emc.storageos.db.client.model.Initiator; import com.emc.storageos.db.client.model.StoragePort; import com.emc.storageos.util.NetworkLite; import com.emc.storageos.volumecontroller.placement.StoragePortsAllocator.PortAllocationContext; /* * Test for Storage Port Assigner and Allocator. * @author watsot3 * * Required classpath: placement (directory containing the test source) * eclipse.out (directory containing complied classes) * slf4j-api-1.6.4.jar slf4j-ext-1.6.4.jar slf4j-log4j12-1.6.4.jar * log4j-1.2.16.jar * jersey-core-1.12.jar * commons-lang-2.4.jar (Apache commons) * Required run directory: Directory containing test * source Required argument: -Dlog4j.configuration=log4j.properties * */ public class StoragePortsAssignerTest extends StoragePortsAllocatorTest { private static final Log _log = LogFactory .getLog(StoragePortsAssignerTest.class); public static void main(String[] args) throws Exception { //PropertyConfigurator.configure("log4j.properties"); StoragePortsAssigner assigner = StoragePortsAssignerFactory.getAssigner("VMAX"); _log.info("Beginning logging"); List<Initiator> initA = getHostInitiators(4); Map<URI, List<Initiator>> net2InitiatorsMapA = makeNet2InitiatorsMap(initA, 1,2); List<Initiator> initB = getHostInitiators(4); Map<URI, List<Initiator>> net2InitiatorsMapB = makeNet2InitiatorsMap(initB, 1,2); for (int k=1; k <= 2; k++) { //initiators per port for (int j = 1; j <= 2; j++) { // paths per initiator for (int i = 1; i <= 8; i++) { // max paths System.out.println("*** Two hosts each 4 initiators across 2 networks: " + "max_paths = " + i + " paths_per_initiator = " + j + " initiators per port " + k); System.out.println("*** No switch affinity"); testVMAX2NetAllocAssign(net2InitiatorsMapA, net2InitiatorsMapB, null, null, i, 0, j, k); System.out.println("*** Switch affinity");; testVMAX2NetAllocAssignWithSwitchAffinity(net2InitiatorsMapA, net2InitiatorsMapB, i, 0, j, k); } } } System.out.println("Testing Hosts on non-overlapping networks!"); initA = getHostInitiators(4); net2InitiatorsMapA = makeNet2InitiatorsMap(initA, 1,2); initB = getHostInitiators(4); net2InitiatorsMapB = makeNet2InitiatorsMap(initB, 3,4); List<Initiator> initC = getHostInitiators(4); Map<URI, List<Initiator>> net2InitiatorsMapC = makeNet2InitiatorsMap(initC, 4, 4); for (int k=1; k <= 2; k++) { //initiators per port for (int j = 1; j <= 2; j++) { // paths per initiator for (int i = 1; i <= 8; i++) { // max paths System.out.println("*** Three hosts (net1,net2), (net3,net4), (net4), each 4 initiators: " + "max_paths = " + i + " paths_per_initiator = " + j + " initiators per port " + k); testVMAX4NetAllocAssign(net2InitiatorsMapA, net2InitiatorsMapB, net2InitiatorsMapC, null, i, 0, j, k); } } } initA = getHostInitiators(4); net2InitiatorsMapA = makeNet2InitiatorsMap(initA, 1,2); initB = getHostInitiators(4); net2InitiatorsMapB = makeNet2InitiatorsMap(initB, 3,4); initC = getHostInitiators(4); net2InitiatorsMapC = makeNet2InitiatorsMap(initC, 4, 4); List<Initiator> initD = getHostInitiators(4); Map<URI, List<Initiator>> net2InitiatorsMapD = makeNet2InitiatorsMap(initD, 1, 4); for (int k=1; k <= 2; k++) { //initiators per port for (int j = 1; j <= 2; j++) { // paths per initiator for (int i = 1; i <= 8; i++) { // max paths System.out.println("*** Four hosts (net1,net2), (net3,net4), (net4), (net1,net2, net3, net4) each 4 initiators: " + "max_paths = " + i + " paths_per_initiator = " + j + " initiators per port " + k); testVMAX4NetAllocAssign(net2InitiatorsMapA, net2InitiatorsMapB, net2InitiatorsMapC, net2InitiatorsMapD, i, 0, j, k); } } } System.out.println("End Testing Hosts on non-overlapping networks!\n\n"); System.out.println("Testing VNX two hosts"); initA = getHostInitiators(4); net2InitiatorsMapA = makeNet2InitiatorsMap(initA, 1,2); initB = getHostInitiators(4); net2InitiatorsMapB = makeNet2InitiatorsMap(initB, 1,2); for (int j = 1; j <= 2; j++) { for (int i = 2; i <= 6; i++) { System.out.println("*** Two VNX hosts, each 4 initiators across 2 networks: max_paths = " + i + " paths_per_initiator = " + j); testVNX2NetAllocAssign(net2InitiatorsMapA, net2InitiatorsMapB, null, null, i, 1, j, 1, false); System.out.println("*** Switch Affinity ** Two VNX hosts, each 4 initiators across 2 networks: max_paths = " + i + " paths_per_initiator = " + j); testVNX2NetAllocAssign(net2InitiatorsMapA, net2InitiatorsMapB, null, null, i, 1, j, 1, true); } } System.out.println("End of Testing VNX two hosts"); // Test incremental initiator / port addition initA = getHostInitiators(2); Map<URI, List<Initiator>> net2InitiatorsMap = makeNet2InitiatorsMap(initA, 1, 2); initB = getHostInitiators(2); net2InitiatorsMapB = makeNet2InitiatorsMap(initB,1,2); for (int j = 1; j <= 2; j++) { for (int i = 4; i <= 4; i++) { System.out.println("*** 2 initiators across 2 networks, incremental 2 more initiators in new host: max_paths = " + i + " paths_per_initiator = " + j); testVMAX2NetAllocIncrementalAssign(net2InitiatorsMap, net2InitiatorsMapB, i, j); testVMAX2NetAllocIncrementalAssignWithSwitchAffinity(net2InitiatorsMap, net2InitiatorsMapB, i, j, i, j); } } URI hostAid = initA.get(0).getHost(); String hostAname = initA.get(0).getHostName(); initC = addHostInitiators(2, hostAid, hostAname); net2InitiatorsMapB = makeNet2InitiatorsMap(initC, 1,2); for (int j = 1; j <= 2; j++) { for (int i = 2; i <= 8; i++) { System.out.println("*** 2 initiators across 2 networks, incremental 2 more initiators in same host: max_paths = " + i + " paths_per_initiator = " + j); testVMAX2NetAllocIncrementalAssign(net2InitiatorsMap, net2InitiatorsMapB, i, j); testVMAX2NetAllocIncrementalAssignWithSwitchAffinity(net2InitiatorsMap, net2InitiatorsMapB, i, j, i, j); } } initA = getHostInitiators(4); net2InitiatorsMap = makeNet2InitiatorsMap(initA, 1, 2); initB = getHostInitiators(4); net2InitiatorsMapB = makeNet2InitiatorsMap(initB, 1, 2); for (int j = 1; j <= 2; j++) { for (int i = 1; i <= 8; i++) { System.out.println("*** 4 initiators across 2 networks, incremental 4 more initiators in new host: max_paths = " + i + " paths_per_initiator = " + j); testVMAX2NetAllocIncrementalAssign(net2InitiatorsMap, net2InitiatorsMapB, i, j); } } initA = getHostInitiators(4); net2InitiatorsMap = makeNet2InitiatorsMap(initA, 1, 2); hostAid = initA.get(0).getHost(); hostAname = initA.get(0).getHostName(); initC = addHostInitiators(4, hostAid, hostAname); net2InitiatorsMapB = makeNet2InitiatorsMap(initC, 1, 2); for (int j = 1; j <= 2; j++) { for (int i = 1; i <= 12; i++) { System.out.println("*** 4 initiators across 2 networks, incremental 4 more initiators in same host: max_paths = " + i + " paths_per_initiator = " + j); testVMAX2NetAllocIncrementalAssign(net2InitiatorsMap, net2InitiatorsMapB, i, j); } } initA = getHostInitiators(4); net2InitiatorsMap = makeNet2InitiatorsMap(initA, 1, 2); initB = getHostInitiators(4); net2InitiatorsMapB = makeNet2InitiatorsMap(initB, 1, 2); // The following loop assumes symmetric networks across the two hosts for (Map.Entry<URI, List<Initiator>> entry : net2InitiatorsMap.entrySet()) { net2InitiatorsMap.get(entry.getKey()).addAll(net2InitiatorsMapB.get(entry.getKey())); } for (int j = 1; j <= 2; j++) { for (int i = 1; i <= 8; i++) { System.out.println("*** 4 initiators across 2 networks, incremental same hosts with more paths; initial max_paths = " + i + " paths_per_initiator = " + j); testVMAX2NetAllocIncrementalAssign(net2InitiatorsMap, net2InitiatorsMap, i, j, i+4, j+1); } } for (int j = 1; j <= 2; j++) { for (int i = 2; i <= 12; i++) { System.out.println("*** 4 initiators across 2 networks, incremental 4 more initiators in same host: max_paths = " + i + " paths_per_initiator = " + j); testVNX2NetAllocIncrementalAssign(net2InitiatorsMap, net2InitiatorsMapB, i, j); } } System.out.println("done!"); } public static void testVMAX2NetAllocAssign( Map<URI, List<Initiator>> net2InitiatorsMapA, Map<URI, List<Initiator>> net2InitiatorsMapB, Map<URI, List<Initiator>> net2InitiatorsMapC, Map<URI, List<Initiator>> net2InitiatorsMapD, int maxPaths, int minPaths, int pathsPerInitiator, int initiatorsPerPort) throws Exception { Map<URI, Map<URI, List<Initiator>>> hostToNetToInitiatorsMap = new HashMap<URI, Map<URI, List<Initiator>>>(); URI hostA = getHostURI(net2InitiatorsMapA); hostToNetToInitiatorsMap.put(hostA, net2InitiatorsMapA); if (net2InitiatorsMapB != null) { URI hostB = getHostURI(net2InitiatorsMapB); hostToNetToInitiatorsMap.put(hostB, net2InitiatorsMapB); } if (net2InitiatorsMapC != null) { URI hostC = getHostURI(net2InitiatorsMapC); hostToNetToInitiatorsMap.put(hostC, net2InitiatorsMapC); } if (net2InitiatorsMapD != null) { URI hostD = getHostURI(net2InitiatorsMapD); hostToNetToInitiatorsMap.put(hostD, net2InitiatorsMapD); } PortAllocationContext net1ctx = createVmaxNet1(); PortAllocationContext net2ctx = createVmaxNet2(); PortAllocationContext[] contexts = new PortAllocationContext[] { net1ctx, net2ctx }; testAllocationAssignment(contexts, hostToNetToInitiatorsMap, maxPaths, minPaths, pathsPerInitiator, initiatorsPerPort, "vmax", null); } public static void testVMAX2NetAllocAssignWithSwitchAffinity( Map<URI, List<Initiator>> net2InitiatorsMapA, Map<URI, List<Initiator>> net2InitiatorsMapB, int maxPaths, int minPaths, int pathsPerInitiator, int initiatorsPerPort) throws Exception { Map<URI, Map<URI, List<Initiator>>> hostToNetToInitiatorsMap = new HashMap<URI, Map<URI, List<Initiator>>>(); URI hostA = getHostURI(net2InitiatorsMapA); hostToNetToInitiatorsMap.put(hostA, net2InitiatorsMapA); if (net2InitiatorsMapB != null) { URI hostB = getHostURI(net2InitiatorsMapB); hostToNetToInitiatorsMap.put(hostB, net2InitiatorsMapB); } PortAllocationContext net1ctx = createVmaxNet11(); PortAllocationContext net2ctx = createVmaxNet22(); PortAllocationContext[] contexts = new PortAllocationContext[] { net1ctx, net2ctx }; testAllocationAssignmentWithSwitchAffinity(contexts, hostToNetToInitiatorsMap, maxPaths, minPaths, pathsPerInitiator, initiatorsPerPort, "vmax", null); } public static void testVMAX4NetAllocAssign( Map<URI, List<Initiator>> net2InitiatorsMapA, Map<URI, List<Initiator>> net2InitiatorsMapB, Map<URI, List<Initiator>> net2InitiatorsMapC, Map<URI, List<Initiator>> net2InitiatorsMapD, int maxPaths, int minPaths, int pathsPerInitiator, int initiatorsPerPort) throws Exception { Map<URI, Map<URI, List<Initiator>>> hostToNetToInitiatorsMap = new HashMap<URI, Map<URI, List<Initiator>>>(); URI hostA = getHostURI(net2InitiatorsMapA); hostToNetToInitiatorsMap.put(hostA, net2InitiatorsMapA); if (net2InitiatorsMapB != null) { URI hostB = getHostURI(net2InitiatorsMapB); hostToNetToInitiatorsMap.put(hostB, net2InitiatorsMapB); } if (net2InitiatorsMapC != null) { URI hostC = getHostURI(net2InitiatorsMapC); hostToNetToInitiatorsMap.put(hostC, net2InitiatorsMapC); } if (net2InitiatorsMapD != null) { URI hostD = getHostURI(net2InitiatorsMapD); hostToNetToInitiatorsMap.put(hostD, net2InitiatorsMapD); } PortAllocationContext net1ctx = createVmaxNet1(); PortAllocationContext net2ctx = createVmaxNet2(); PortAllocationContext net3ctx = createVmaxNet3(); PortAllocationContext net4ctx = createVmaxNet4(); PortAllocationContext[] contexts = new PortAllocationContext[] { net1ctx, net2ctx, net3ctx, net4ctx }; testAllocationAssignment(contexts, hostToNetToInitiatorsMap, maxPaths, minPaths, pathsPerInitiator, initiatorsPerPort, "vmax", null); } public static void testVMAX2NetAllocIncrementalAssign( Map<URI, List<Initiator>> net2InitiatorsMapA, Map<URI, List<Initiator>> net2InitiatorsMapB, int maxPaths, int pathsPerInitiator) throws Exception { testVMAX2NetAllocIncrementalAssign(net2InitiatorsMapA, net2InitiatorsMapB, maxPaths, pathsPerInitiator, maxPaths, pathsPerInitiator); } public static void testVMAX2NetAllocIncrementalAssign( Map<URI, List<Initiator>> net2InitiatorsMapA, Map<URI, List<Initiator>> net2InitiatorsMapB, int initialMaxPaths, int initialPathsPerInitiator, int finalMaxPaths, int finalPathsPerInitiator) throws Exception { Map<URI, Map<URI, List<Initiator>>> hostToNetToInitiatorsMap = new HashMap<URI, Map<URI, List<Initiator>>>(); URI hostA = getHostURI(net2InitiatorsMapA); hostToNetToInitiatorsMap = getHostInitiatorsMap(net2InitiatorsMapA); PortAllocationContext net1ctx = createVmaxNet1(); PortAllocationContext net2ctx = createVmaxNet2(); PortAllocationContext[] contexts = new PortAllocationContext[] { net1ctx, net2ctx }; // Allocate initial assignments System.out.println("***** Initial assignments: *****"); Map<Initiator, List<StoragePort>> assignments = testAllocationAssignment(contexts, hostToNetToInitiatorsMap, initialMaxPaths, 0, initialPathsPerInitiator, 1, "vmax", null); URI hostB = getHostURI(net2InitiatorsMapB); if (hostA.equals(hostB)) { Map<URI, List<Initiator>> mergedNet2Initiators = new HashMap<URI, List<Initiator>>(); for (URI netA : net2InitiatorsMapA.keySet()) { mergedNet2Initiators.put(netA, new ArrayList<Initiator>(net2InitiatorsMapA.get(netA))); } for (URI netb : net2InitiatorsMapB.keySet()) { if (mergedNet2Initiators.containsKey(netb)) { mergedNet2Initiators.get(netb).addAll(net2InitiatorsMapB.get(netb)); } else { mergedNet2Initiators.put(netb, new ArrayList<Initiator>(net2InitiatorsMapB.get(netb))); } } hostToNetToInitiatorsMap = getHostInitiatorsMap(mergedNet2Initiators); } else { hostToNetToInitiatorsMap.put(hostB, net2InitiatorsMapB); } System.out.println("***** Incremental assignments: *****" + " maxPaths " + finalMaxPaths + " ppi " + finalPathsPerInitiator); assignments = testAllocationAssignment(contexts, hostToNetToInitiatorsMap, finalMaxPaths, 0, finalPathsPerInitiator, 1, "vmax", assignments); } public static void testVMAX2NetAllocIncrementalAssignWithSwitchAffinity( Map<URI, List<Initiator>> net2InitiatorsMapA, Map<URI, List<Initiator>> net2InitiatorsMapB, int initialMaxPaths, int initialPathsPerInitiator, int finalMaxPaths, int finalPathsPerInitiator) throws Exception { Map<URI, Map<URI, List<Initiator>>> hostToNetToInitiatorsMap = new HashMap<URI, Map<URI, List<Initiator>>>(); URI hostA = getHostURI(net2InitiatorsMapA); hostToNetToInitiatorsMap = getHostInitiatorsMap(net2InitiatorsMapA); PortAllocationContext net1ctx = createVmaxNet11(); PortAllocationContext net2ctx = createVmaxNet22(); PortAllocationContext[] contexts = new PortAllocationContext[] { net1ctx, net2ctx }; // Allocate initial assignments System.out.println("***** Initial assignments: *****"); Map<Initiator, List<StoragePort>> assignments = testAllocationAssignment(contexts, hostToNetToInitiatorsMap, initialMaxPaths, 0, initialPathsPerInitiator, 1, "vmax", null); URI hostB = getHostURI(net2InitiatorsMapB); if (hostA.equals(hostB)) { Map<URI, List<Initiator>> mergedNet2Initiators = new HashMap<URI, List<Initiator>>(); for (URI netA : net2InitiatorsMapA.keySet()) { mergedNet2Initiators.put(netA, new ArrayList<Initiator>(net2InitiatorsMapA.get(netA))); } for (URI netb : net2InitiatorsMapB.keySet()) { if (mergedNet2Initiators.containsKey(netb)) { mergedNet2Initiators.get(netb).addAll(net2InitiatorsMapB.get(netb)); } else { mergedNet2Initiators.put(netb, new ArrayList<Initiator>(net2InitiatorsMapB.get(netb))); } } hostToNetToInitiatorsMap = getHostInitiatorsMap(mergedNet2Initiators); } else { hostToNetToInitiatorsMap.put(hostB, net2InitiatorsMapB); } System.out.println("***** Incremental assignments for switch affinity: *****" + " maxPaths " + finalMaxPaths + " ppi " + finalPathsPerInitiator); assignments = testAllocationAssignmentWithSwitchAffinity(contexts, hostToNetToInitiatorsMap, finalMaxPaths, 0, finalPathsPerInitiator, 1, "vmax", assignments); } public static void testVNX2NetAllocIncrementalAssign( Map<URI, List<Initiator>> net2InitiatorsMapA, Map<URI, List<Initiator>> net2InitiatorsMapB, int maxPaths, int pathsPerInitiator) throws Exception { Map<URI, Map<URI, List<Initiator>>> hostToNetToInitiatorsMap = new HashMap<URI, Map<URI, List<Initiator>>>(); URI hostA = getHostURI(net2InitiatorsMapA); hostToNetToInitiatorsMap.put(hostA, net2InitiatorsMapA); PortAllocationContext net1ctx = createVNXNet1(); PortAllocationContext net2ctx = createVNXNet2(); PortAllocationContext[] contexts = new PortAllocationContext[] { net1ctx, net2ctx }; // Allocate initial assignments System.out.println("Initial assignments:"); Map<Initiator, List<StoragePort>> assignments = testAllocationAssignment(contexts, hostToNetToInitiatorsMap, maxPaths, 0, pathsPerInitiator, 1, "vnxblock", null); URI hostB = getHostURI(net2InitiatorsMapB); if (hostA.equals(hostB)) { Map<URI, List<Initiator>> mergedNet2Initiators = new HashMap<URI, List<Initiator>>(); for (URI netA : net2InitiatorsMapA.keySet()) { mergedNet2Initiators.put(netA, new ArrayList<Initiator>(net2InitiatorsMapA.get(netA))); } for (URI netb : net2InitiatorsMapB.keySet()) { if (mergedNet2Initiators.containsKey(netb)) { mergedNet2Initiators.get(netb).addAll(net2InitiatorsMapB.get(netb)); } else { mergedNet2Initiators.put(netb, new ArrayList<Initiator>(net2InitiatorsMapB.get(netb))); } } hostToNetToInitiatorsMap.clear(); hostToNetToInitiatorsMap.put(hostA, mergedNet2Initiators); } else { hostToNetToInitiatorsMap.put(hostB, net2InitiatorsMapB); } // Allocate incremental assignments System.out.println("Incremental assignments:"); assignments = testAllocationAssignment(contexts, hostToNetToInitiatorsMap, maxPaths, 0, pathsPerInitiator, 1, "vnxblock", assignments); } /** * Test allocation in a VNX two network environment. * * @param net2InitiatorsMapA -- initiators for host A * @param net2InitiatorsMapB -- initiators for host B (optional) * @param net2InitiatorsMapC -- initiators for host C (optional) * @param net2InitiatorsMapD -- initiators for host D (optional) * @param maxPaths * @param minPaths * @param pathsPerInitiator * @param initiatorsPerPort * */ public static void testVNX2NetAllocAssign( Map<URI, List<Initiator>> net2InitiatorsMapA, Map<URI, List<Initiator>> net2InitiatorsMapB, Map<URI, List<Initiator>> net2InitiatorsMapC, Map<URI, List<Initiator>> net2InitiatorsMapD, int maxPaths, int minPaths, int pathsPerInitiator, int initiatorsPerPort, boolean isSwitchAffinity) throws Exception { Map<URI, Map<URI, List<Initiator>>> hostToNetToInitiatorsMap = new HashMap<URI, Map<URI, List<Initiator>>>(); URI hostA = getHostURI(net2InitiatorsMapA); hostToNetToInitiatorsMap.put(hostA, net2InitiatorsMapA); if (net2InitiatorsMapB != null) { URI hostB = getHostURI(net2InitiatorsMapB); hostToNetToInitiatorsMap.put(hostB, net2InitiatorsMapB); } if (net2InitiatorsMapC != null) { URI hostC = getHostURI(net2InitiatorsMapC); hostToNetToInitiatorsMap.put(hostC, net2InitiatorsMapC); } if (net2InitiatorsMapD != null) { URI hostD = getHostURI(net2InitiatorsMapD); hostToNetToInitiatorsMap.put(hostD, net2InitiatorsMapD); } PortAllocationContext net1ctx = createVNXNet1(); PortAllocationContext net2ctx = createVNXNet2(); PortAllocationContext[] contexts = new PortAllocationContext[] { net1ctx, net2ctx }; if (!isSwitchAffinity) { testAllocationAssignment(contexts, hostToNetToInitiatorsMap, maxPaths, minPaths, pathsPerInitiator, initiatorsPerPort, "vnxblock", null); } else { testAllocationAssignmentWithSwitchAffinity(contexts, hostToNetToInitiatorsMap, maxPaths, minPaths, pathsPerInitiator, initiatorsPerPort, "vnxblock", null); } } /** * Test port allocation and assignment. * * @param contexts -- Array of PortAllocationContext structures, one for each Network. * @param hostToNetToInitiators -- Map of host to map of network URI to Initiators * @param maxPaths -- max_paths variable * @param minPaths -- mininmum number of paths to provision * @param pathsPerInitiator -- desired number of paths per initiator * @param initiatorsPerPort -- maximum number of initiators in a host using same port * @param arrayType -- String array type * @param existingAssignments - previously assigned Initiator to StoragePort list mappings */ public static Map<Initiator, List<StoragePort>> testAllocationAssignment(PortAllocationContext[] contexts, Map<URI, Map<URI, List<Initiator>>> hostToNetToInitiators, int maxPaths, int minPaths, int pathsPerInitiator, int initiatorsPerPort, String arrayType, Map<Initiator, List<StoragePort>> existingAssignments) throws Exception { Map<URI, List<Initiator>> net2InitiatorsMap = makeNet2InitiatorsMap(hostToNetToInitiators); Map<Initiator, List<StoragePort>> assignments = new HashMap<Initiator, List<StoragePort>>(); if (pathsPerInitiator > maxPaths) { return assignments; } ExportPathParams pathParams = new ExportPathParams(maxPaths, minPaths, pathsPerInitiator); pathParams.setMaxInitiatorsPerPort(initiatorsPerPort); try { for (int i = 0; i < contexts.length; i++) { contexts[i].reinitialize(); } Map<URI, PortAllocationContext> net2ContextMap = new HashMap<URI, PortAllocationContext>(); for (int i = 0; i < contexts.length; i++) { PortAllocationContext context = contexts[i]; net2ContextMap.put(context._initiatorNetwork.getId(), context); } // Map the existing (already allocated) StoragePorts to their Networks. Map<URI, Set<StoragePort>> existingPortsMap = generateNetworkToStoragePortsMap(existingAssignments); // Make a Map of Network to existing Initiators Map<URI, Set<Initiator>> existingInitiatorsMap = generateNetworkToInitiatorsMap(existingAssignments); // Compute the number of Ports needed for each Network StoragePortsAssigner assigner = StoragePortsAssignerFactory.getAssigner(arrayType); List<URI> networkOrder = new ArrayList<URI>(); Map<URI, Integer> net2PortsNeeded = assigner.getPortsNeededPerNetwork( net2InitiatorsMap, pathParams, existingPortsMap, existingInitiatorsMap, false, networkOrder); // For each Network, allocate the ports required, and then assign the ports. StoragePortsAllocator allocator = new StoragePortsAllocator(); Map<URI, List<StoragePort>> netToPortsAllocated = new HashMap<URI, List<StoragePort>>(); PortAllocationContext previousContext = null; for (URI netURI : networkOrder) { Integer portsNeeded = net2PortsNeeded.get(netURI); if (portsNeeded == 0) { System.out.println("No ports to be assigned for net: " + netURI); continue; } // Get the context for this network. PortAllocationContext context = net2ContextMap.get(netURI); // Copy context from the previous allocation. if (previousContext != null) { context.copyPreviousNetworkContext(previousContext); } previousContext = context; List<StoragePort> portsAllocated = allocator.allocatePortsForNetwork(portsNeeded, context, false, existingPortsMap.get(netURI), true, null); netToPortsAllocated.put(netURI,portsAllocated); } // Now for each host, do the port assignment. for (Map.Entry<URI, Map<URI, List<Initiator>>> entry: hostToNetToInitiators.entrySet()) { System.out.println("Assign ports for host " + entry.getKey()); assigner.assignPortsToHost(assignments, entry.getValue(), netToPortsAllocated, pathParams, existingAssignments, entry.getKey(), null, null, null); } List<String> assignmentStrings = new ArrayList<String>(); for (Initiator initiator : assignments.keySet()) { StringBuilder buf = new StringBuilder(); buf.append(initiator.getHostName() + "-" + initiator.getInitiatorPort() + " -> "); List<StoragePort> ports = assignments.get(initiator); if (ports == null) { buf.append("<ignored>"); } else { for (StoragePort port : assignments.get(initiator)) { buf.append(port.getPortName() + " "); } } buf.append(" "); assignmentStrings.add(buf.toString()); } Collections.sort(assignmentStrings); for (String line : assignmentStrings) { System.out.println(line); } verifyAssignments(assignments, arrayType, maxPaths, pathsPerInitiator, initiatorsPerPort, net2InitiatorsMap, existingAssignments); } catch (PlacementException ex) { System.out.println("PlacementException: " + ex.getMessage()); } catch (Exception ex) { System.out.println("ERROR: " + ex.getMessage()); throw ex; } return assignments; } public static Map<Initiator, List<StoragePort>> testAllocationAssignmentWithSwitchAffinity(PortAllocationContext[] contexts, Map<URI, Map<URI, List<Initiator>>> hostToNetToInitiators, int maxPaths, int minPaths, int pathsPerInitiator, int initiatorsPerPort, String arrayType, Map<Initiator, List<StoragePort>> existingAssignments) throws Exception { Map<URI, List<Initiator>> net2InitiatorsMap = makeNet2InitiatorsMap(hostToNetToInitiators); Map<Initiator, List<StoragePort>> assignments = new HashMap<Initiator, List<StoragePort>>(); if (pathsPerInitiator > maxPaths) { return assignments; } ExportPathParams pathParams = new ExportPathParams(maxPaths, minPaths, pathsPerInitiator); pathParams.setMaxInitiatorsPerPort(initiatorsPerPort); try { for (int i = 0; i < contexts.length; i++) { contexts[i].reinitialize(); } Map<URI, PortAllocationContext> net2ContextMap = new HashMap<URI, PortAllocationContext>(); for (int i = 0; i < contexts.length; i++) { PortAllocationContext context = contexts[i]; net2ContextMap.put(context._initiatorNetwork.getId(), context); } // Map the existing (already allocated) StoragePorts to their Networks. Map<URI, Set<StoragePort>> existingPortsMap = generateNetworkToStoragePortsMap(existingAssignments); // Make a Map of Network to existing Initiators Map<URI, Set<Initiator>> existingInitiatorsMap = generateNetworkToInitiatorsMap(existingAssignments); // Compute the number of Ports needed for each Network StoragePortsAssigner assigner = StoragePortsAssignerFactory.getAssigner(arrayType); List<URI> networkOrder = new ArrayList<URI>(); Map<URI, Integer> net2PortsNeeded = assigner.getPortsNeededPerNetwork( net2InitiatorsMap, pathParams, existingPortsMap, existingInitiatorsMap, true, networkOrder); // For each Network, allocate the ports required, and then assign the ports. StoragePortsAllocator allocator = new StoragePortsAllocator(); Map<URI, List<StoragePort>> netToPortsAllocated = new HashMap<URI, List<StoragePort>>(); PortAllocationContext previousContext = null; for (URI netURI : networkOrder) { Integer portsNeeded = net2PortsNeeded.get(netURI); if (portsNeeded == 0) { System.out.println("No ports to be assigned for net: " + netURI); continue; } // Get the context for this network. PortAllocationContext context = net2ContextMap.get(netURI); // Copy context from the previous allocation. if (previousContext != null) { context.copyPreviousNetworkContext(previousContext); } previousContext = context; Map<String, Integer>switchMap = new HashMap<String, Integer>(); List<Initiator> inits = net2InitiatorsMap.get(netURI); int number = inits.size()*pathsPerInitiator/2; System.out.println("Number ports in the switch: " +number ); switchMap.put("mds-a", number); switchMap.put("mds-b", number); List<StoragePort> portsAllocated = allocator.allocatePortsForNetwork(portsNeeded, context, false, existingPortsMap.get(netURI), true, switchMap); netToPortsAllocated.put(netURI,portsAllocated); } // Now for each host, do the port assignment. Map<URI, Map<String, List<StoragePort>>> switchStoragePortsByNet = getSwitchPortsByNetMap(netToPortsAllocated, net2ContextMap); for (Map.Entry<URI, Map<URI, List<Initiator>>> entry: hostToNetToInitiators.entrySet()) { Map<URI, Map<String, List<Initiator>>> switchInitiatorsByNet = getSwitchInitiatorByNetMap(entry.getValue()); System.out.println("Assign ports for host " + entry.getKey()); assigner.assignPortsToHost(assignments, entry.getValue(), netToPortsAllocated, pathParams, existingAssignments, entry.getKey(), null, switchInitiatorsByNet, switchStoragePortsByNet); } List<String> assignmentStrings = new ArrayList<String>(); for (Initiator initiator : assignments.keySet()) { StringBuilder buf = new StringBuilder(); buf.append(String.format("%s - %s/%s -> ", initiator.getHostName(), initiator.getInitiatorPort(), getInitiatorSwitch(initiator))); List<StoragePort> ports = assignments.get(initiator); if (ports == null) { buf.append("<ignored>"); } else { for (StoragePort port : assignments.get(initiator)) { buf.append(port.getPortName() + "/" + getPortSwitch(port, switchStoragePortsByNet) + " "); } } buf.append(" "); assignmentStrings.add(buf.toString()); } Collections.sort(assignmentStrings); for (String line : assignmentStrings) { System.out.println(line); } verifyAssignments(assignments, arrayType, maxPaths, pathsPerInitiator, initiatorsPerPort, net2InitiatorsMap, existingAssignments); } catch (PlacementException ex) { System.out.println("PlacementException: " + ex.getMessage()); } catch (Exception ex) { System.out.println("ERROR: " + ex.getMessage()); throw ex; } return assignments; } /** * Returns the switch name for a storag eport * @param port * @param switchPortsByNet * @return */ static String getPortSwitch(StoragePort port, Map<URI, Map<String, List<StoragePort>>> switchPortsByNet) { if (switchPortsByNet == null || switchPortsByNet.isEmpty()) { return "switch?"; } for (Map<String, List<StoragePort>> entry : switchPortsByNet.values()) { for (String switchName : entry.keySet()) { for (StoragePort portx : entry.get(switchName)) { if (port.getPortNetworkId().equals(portx.getPortNetworkId())) { return switchName; } } } } return "switch?"; } private static Map<String, String> initiatorWwnToSwitch = new HashMap<String, String>(); /** * Returns a map of network to a map of switch name to a list of initiators. * @param initiatorByNet-- map of network to initiators * @return Network to switch name to list of Initiators (with different switches) */ public static Map<URI, Map<String, List<Initiator>>> getSwitchInitiatorByNetMap(Map<URI, List<Initiator>> initiatorByNet) { Map<URI, Map<String, List<Initiator>>> result = new HashMap<URI, Map<String, List<Initiator>>>(); int index = 0; for (Map.Entry<URI, List<Initiator>> entry : initiatorByNet.entrySet()) { URI net = entry.getKey(); List <Initiator> initiators = entry.getValue(); Map<String, List<Initiator>> switchInitiatorMap = result.get(net); if (switchInitiatorMap == null) { switchInitiatorMap = new HashMap<String, List<Initiator>>(); result.put(net, switchInitiatorMap); } String[] switchNames = { "mds-c", "mds-a", "mds-b", "mds-a"}; for (Initiator initiator : initiators) { String switchName = switchNames[index%switchNames.length]; initiatorWwnToSwitch.put(initiator.getInitiatorPort(), switchName); List<Initiator> inits = switchInitiatorMap.get(switchName); if (inits == null) { inits = new ArrayList<>(); switchInitiatorMap.put(switchName, inits); } inits.add(initiator); index++; } } return result; } /** * Returns the switch name for a given initiator * @param initiator * @return */ static String getInitiatorSwitch(Initiator initiator) { if (initiatorWwnToSwitch.containsKey(initiator.getInitiatorPort())) { return initiatorWwnToSwitch.get(initiator.getInitiatorPort()); } return "switch?"; } public static Map<URI, Map<String, List<StoragePort>>> getSwitchPortsByNetMap(Map<URI, List<StoragePort>>netToPortsAllocated, Map<URI, PortAllocationContext> net2ContextMap) { Map<URI, Map<String, List<StoragePort>>> result = new HashMap<URI, Map<String, List<StoragePort>>>(); for (Map.Entry<URI, List<StoragePort>> entry : netToPortsAllocated.entrySet()) { URI net = entry.getKey(); PortAllocationContext ctx = net2ContextMap.get(net); List <StoragePort> ports = entry.getValue(); Map<String, List<StoragePort>> switchPortMap = result.get(net); if (switchPortMap == null) { switchPortMap = new HashMap<String, List<StoragePort>>(); result.put(net, switchPortMap); } for (StoragePort port : ports) { String switchName = ctx._storagePortToSwitchName.get(port); if (switchName == null || switchName.isEmpty()) { switchName = "switch?"; } List<StoragePort> portsInMap = switchPortMap.get(switchName); if (portsInMap == null) { portsInMap = new ArrayList<>(); switchPortMap.put(switchName, portsInMap); } portsInMap.add(port); } } return result; } /** * Verify the assignments are consistent with tne number of initiators, * the number of ports allocated, and the max_paths parameter. * * @param assignments * @param arrayType * @param maxPaths * @param pathsPerInitiator * @param maxInitiatorsPerPort * @param net2InitiatorsMap * @throws Exception */ static public void verifyAssignments(Map<Initiator, List<StoragePort>> assignments, String arrayType, int maxPaths, int pathsPerInitiator, int maxInitiatorsPerPort, Map<URI, List<Initiator>> net2InitiatorsMap, Map<Initiator, List<StoragePort>> existingAssignments) throws Exception { // sum up the StoragePorts Set<URI> allPorts = new HashSet<URI>(); for (List<StoragePort> ports : assignments.values()) { for (StoragePort port : ports) { allPorts.add(port.getId()); } } if (existingAssignments != null) { for (List<StoragePort> ports : existingAssignments.values()) { for (StoragePort port : ports) { allPorts.add(port.getId()); } } } // Make a map of Host to Initiators Set<Initiator> allInitiators = new HashSet<Initiator>(); allInitiators.addAll(assignments.keySet()); if (existingAssignments != null) { allInitiators.addAll(existingAssignments.keySet()); } Map<URI, Set<Initiator>> hostInitiatorsMap = generateHostInitiatorsMap(allInitiators); // Check each host: for (URI host : hostInitiatorsMap.keySet()) { Set<Initiator> initiators = hostInitiatorsMap.get(host); Integer ninitiators = initiators.size(); // Compute how many assignments should have been made Map<StoragePort, Integer> portUseCounts = new HashMap<StoragePort, Integer>(); for (Initiator initiator : initiators) { // Find the assignments for this initiator List<StoragePort> portAssignments = assignments.get(initiator); if (portAssignments == null && existingAssignments != null) { existingAssignments.get(initiator); } if (portAssignments == null) { continue; // if unassigned } for (StoragePort port : portAssignments) { DefaultStoragePortsAssigner.addPortUse(portUseCounts, port); } Integer nports = portAssignments.size(); if (nports > pathsPerInitiator) { throw new Exception(String.format( "Initiator %s has too many ports: %s", initiator.getInitiatorPort(), nports)); } } // Verify the total number of ports for the host is not > maxPaths if (portUseCounts.size() > maxPaths) { throw new Exception(String.format( "Host %s uses more storage ports (%s) than maxPaths %d", host, portUseCounts.size(), maxPaths)); } for (Map.Entry<StoragePort, Integer> portEntry : portUseCounts.entrySet()) { if (portEntry.getValue() > maxInitiatorsPerPort) { throw new Exception((String.format("Port %s was used by %d initiators but maxInitiatorsPerPort was %d", portEntry.getKey().getLabel(), portEntry.getValue(), maxInitiatorsPerPort))) ; } } if (portUseCounts.size() < maxPaths) { // Then we should be limited by the number of Initiators * pathsPerInitiator. if (portUseCounts.size() > (ninitiators * pathsPerInitiator)) { throw new Exception(String.format( "Host %s used more ports than expected (ninitiators %s * pathsPerInitiator %s)", host, ninitiators, pathsPerInitiator)); } } } } /** * Returns number of hosts in the net2InitiatorsMap * * @param net2InitiatorsMap * @return */ static int numberOfHosts(Map<URI, List<Initiator>> net2InitiatorsMap) { Set<URI> hostSet = new HashSet<URI>(); for (List<Initiator> initiators : net2InitiatorsMap.values()) { for (Initiator init : initiators) { hostSet.add(init.getHost()); } } return hostSet.size(); } static private int hostIndex = 1; static private int initIndex = 1; /** * Returns initiators in a single host. * * @param numberInitiators -- number of initiators * @return List<Initiator> */ static private List<Initiator> getHostInitiators(int numberInitiators) { Host host = new Host(); host.setHostName("host" + hostIndex++); host.setId(URI.create(host.getHostName())); List<Initiator> initiators = new ArrayList<Initiator>(); for (int i = 0; i < numberInitiators; i++) { Initiator initiator = new Initiator(); initiator.setHost(host.getId()); initiator.setHostName(host.getHostName()); String byte1 = String.format("%02x", initIndex / 256); String byte0 = String.format("%02x", initIndex % 256); initiator.setInitiatorPort("10:00:00:00:00:00:" + byte1 + ":" + byte0); initiator.setId(URI.create("init" + initIndex++)); initiators.add(initiator); } return initiators; } /** * Generates additional host initiators for an existing host. * * @param numberInitiators -- number of new initiators to generate * @param host -- existing Host * @return -- List of all initiators */ static private List<Initiator> addHostInitiators(int numberInitiators, URI hostId, String hostName) { List<Initiator> initiators = new ArrayList<Initiator>(); for (int i = 0; i < numberInitiators; i++) { Initiator initiator = new Initiator(); initiator.setHost(hostId); initiator.setHostName(hostName); String byte1 = String.format("%02x", initIndex / 256); String byte0 = String.format("%02x", initIndex % 256); initiator.setInitiatorPort("10:00:00:00:00:00:" + byte1 + ":" + byte0); initiator.setId(URI.create("init" + initIndex++)); initiators.add(initiator); } return initiators; } /** * Partials out the initiators against networks specified. * * @param initiators List<Initiator> * @param lowNet integer (lowest network to be used like net1) * @param highNet integer (highest network to be used like net2) * @param split the initiators across lowNet to highNet inclusive * @return Map<URI, List<Initiator>> map from network URI to list of Initiators */ static Map<URI, List<Initiator>> makeNet2InitiatorsMap(List<Initiator> initiators, int lowNet, int highNet) { HashMap<URI, List<Initiator>> map = new HashMap<URI, List<Initiator>>(); // Make an entry for each network. for (int i = lowNet; i <= highNet; i++) { URI net = (URI.create("net" + i)); map.put(net, new ArrayList<Initiator>()); } // Divide the initiators among the networks. int numNetworks = highNet - lowNet + 1; for (int i = 0; i < initiators.size(); i++) { Initiator initiator = initiators.get(i); int index = i % numNetworks; URI net = URI.create("net" + (index + lowNet)); map.get(net).add(initiator); } return map; } /** * Creates a map of Network URI to a Set<StoragePort> of ports in that Network. * * @param existingAssignments -- Map of Initiator to a list of Storage Port assignments * @return Map of Network URI to set of Storage Ports in that Network */ private static Map<URI, Set<StoragePort>> generateNetworkToStoragePortsMap( Map<Initiator, List<StoragePort>> existingAssignments) { Map<URI, Set<StoragePort>> network2StoragePortsMap = new HashMap<URI, Set<StoragePort>>(); if (existingAssignments == null) { return network2StoragePortsMap; } for (List<StoragePort> ports : existingAssignments.values()) { for (StoragePort port : ports) { if (port.getRegistrationStatus().toString() .equals(DiscoveredDataObject.RegistrationStatus.REGISTERED.name()) && DiscoveredDataObject.CompatibilityStatus.COMPATIBLE.name() .equals(port.getCompatibilityStatus()) && DiscoveryStatus.VISIBLE.name().equals(port.getDiscoveryStatus())) { if (network2StoragePortsMap.get(port.getNetwork()) == null) { network2StoragePortsMap.put(port.getNetwork(), new HashSet<StoragePort>()); } network2StoragePortsMap.get(port.getNetwork()).add(port); } } } return network2StoragePortsMap; } /** * Creates a map of Network URI to a Set<Initiator> of initiators in that Network. * * @param existingAssignments -- Map of Initiator to a list of Storage Port assignments * @return Map of Network URI to a set of Initiators in that Network */ private static Map<URI, Set<Initiator>> generateNetworkToInitiatorsMap( Map<Initiator, List<StoragePort>> existingAssignments) { Map<URI, Set<Initiator>> network2InitiatorsMap = new HashMap<URI, Set<Initiator>>(); if (existingAssignments == null) { return network2InitiatorsMap; } for (Initiator initiator : existingAssignments.keySet()) { List<StoragePort> ports = existingAssignments.get(initiator); if (ports == null || ports.isEmpty()) { continue; } URI network = ports.get(0).getNetwork(); if (network2InitiatorsMap.get(network) == null) { network2InitiatorsMap.put(network, new HashSet<Initiator>()); } network2InitiatorsMap.get(network).add(initiator); } return network2InitiatorsMap; } protected static PortAllocationContext createVmaxNet1() { NetworkLite tz = new NetworkLite(URI.create("net1"), "net1"); PortAllocationContext context = new PortAllocationContext(tz, "test"); StoragePort port; port = createFCPort("FA-7E:0", "50:00:00:00:00:00:00:00"); addPort(context, port, "mds-a"); port = createFCPort("FA-7E:1", "50:00:00:00:00:00:00:01"); addPort(context, port, "mds-b"); port = createFCPort("FA-8E:0", "50:00:00:00:00:00:01:00"); addPort(context, port, "mds-a"); port = createFCPort("FA-8E:1", "50:00:00:00:00:00:01:01"); addPort(context, port, "mds-b"); port = createFCPort("FA-9E:0", "50:00:00:00:00:00:02:00"); addPort(context, port, "mds-a"); port = createFCPort("FA-9E:1", "50:00:00:00:00:00:02:01"); addPort(context, port, "mds-b"); port = createFCPort("FA-10E:0", "50:00:00:00:00:00:03:00"); addPort(context, port, "mds-a"); port = createFCPort("FA-10E:1", "50:00:00:00:00:00:03:01"); addPort(context, port, "mds-b"); port = createFCPort("FA-11E:0", "50:00:00:00:00:00:04:00"); addPort(context, port, "mds-a"); port = createFCPort("FA-11E:1", "50:00:00:00:00:00:04:01"); addPort(context, port, "mds-b"); port = createFCPort("FA-12E:0", "50:00:00:00:00:00:05:00"); addPort(context, port, "mds-a"); port = createFCPort("FA-12E:1", "50:00:00:00:00:00:05:01"); addPort(context, port, "mds-b"); return context; } // NBS VSAN 10 protected static PortAllocationContext createVmaxNet3() { NetworkLite tz = new NetworkLite(URI.create("net3"), "net3"); PortAllocationContext context = new PortAllocationContext(tz, "test"); StoragePort port; port = createFCPort("FA-1E:0", "50:00:09:75:10:04:95:00"); addPort(context, port, "mds-a"); port = createFCPort("FA-1F:0", "50:00:09:75:10:04:95:40"); addPort(context, port, "mds-a"); port = createFCPort("FA-1G:0", "50:00:09:75:10:04:95:80"); addPort(context, port, "mds-a"); port = createFCPort("FA-2E:0", "50:00:09:75:10:04:95:04"); addPort(context, port, "mds-a"); port = createFCPort("FA-2F:0", "50:00:09:75:10:04:95:44"); addPort(context, port, "mds-a"); port = createFCPort("FA-2G:0", "50:00:09:75:10:04:95:84"); addPort(context, port, "mds-a"); return context; } // NBS VSAN 11 protected static PortAllocationContext createVmaxNet4() { NetworkLite tz = new NetworkLite(URI.create("net4"), "net4"); PortAllocationContext context = new PortAllocationContext(tz, "test"); StoragePort port; port = createFCPort("FA-1E:1", "50:00:09:75:10:04:95:01"); addPort(context, port, "mds-a"); port = createFCPort("FA-1F:1", "50:00:09:75:10:04:95:41"); addPort(context, port, "mds-a"); port = createFCPort("FA-1G:1", "50:00:09:75:10:04:95:81"); addPort(context, port, "mds-a"); port = createFCPort("FA-2E:1", "50:00:09:75:10:04:95:05"); addPort(context, port, "mds-a"); port = createFCPort("FA-2F:1", "50:00:09:75:10:04:95:45"); addPort(context, port, "mds-a"); port = createFCPort("FA-2G:1", "50:00:09:75:10:04:95:85"); addPort(context, port, "mds-a"); return context; } protected static PortAllocationContext createVmaxNet2() { NetworkLite tz = new NetworkLite(URI.create("net2"), "net2"); PortAllocationContext context = new PortAllocationContext(tz, "test"); StoragePort port; port = createFCPort("FA-7F:2", "50:00:00:00:00:01:00:02"); addPort(context, port, "mds-a"); port = createFCPort("FA-7F:3", "50:00:00:00:00:01:00:03"); addPort(context, port, "mds-b"); port = createFCPort("FA-8F:2", "50:00:00:00:00:01:01:02"); addPort(context, port, "mds-a"); port = createFCPort("FA-8F:3", "50:00:00:00:00:01:01:03"); addPort(context, port, "mds-b"); port = createFCPort("FA-9F:2", "50:00:00:00:00:01:02:02"); addPort(context, port, "mds-a"); port = createFCPort("FA-9F:3", "50:00:00:00:00:01:02:03"); addPort(context, port, "mds-b"); port = createFCPort("FA-10F:2", "50:00:00:00:00:01:03:02"); addPort(context, port, "mds-a"); port = createFCPort("FA-10F:3", "50:00:00:00:00:01:03:03"); addPort(context, port, "mds-b"); port = createFCPort("FA-11F:2", "50:00:00:00:00:01:04:02"); addPort(context, port, "mds-a"); port = createFCPort("FA-11F:3", "50:00:00:00:00:01:04:03"); addPort(context, port, "mds-b"); port = createFCPort("FA-12F:2", "50:00:00:00:00:01:05:02"); addPort(context, port, "mds-a"); port = createFCPort("FA-12F:3", "50:00:00:00:00:01:05:03"); addPort(context, port, "mds-b"); return context; } protected static PortAllocationContext createVNXNet1() { NetworkLite tz = new NetworkLite(URI.create("net1"), "net1"); PortAllocationContext context = new PortAllocationContext(tz, "test"); StoragePort port; port = createFCPort("SP_A:0", "50:00:00:00:00:00:00:00"); addPort(context, port, "mds-a"); port = createFCPort("SP_A:1", "50:00:00:00:00:00:00:01"); addPort(context, port, "mds-b"); port = createFCPort("SP_A:2", "50:00:00:00:00:00:00:02"); addPort(context, port, "mds-a"); port = createFCPort("SP_A:3", "50:00:00:00:00:00:00:03"); addPort(context, port, "mds-b"); port = createFCPort("SP_B:0", "50:00:00:00:00:00:01:00"); addPort(context, port, "mds-a"); port = createFCPort("SP_B:1", "50:00:00:00:00:00:01:01"); addPort(context, port, "mds-b"); port = createFCPort("SP_B:2", "50:00:00:00:00:00:01:02"); addPort(context, port, "mds-a"); port = createFCPort("SP_B:3", "50:00:00:00:00:00:01:03"); addPort(context, port, "mds-b"); return context; } protected static PortAllocationContext createVNXNet2() { NetworkLite tz = new NetworkLite(URI.create("net2"), "net2"); PortAllocationContext context = new PortAllocationContext(tz, "test"); StoragePort port; port = createFCPort("SP_A:4", "50:00:00:00:00:00:00:04"); addPort(context, port, "mds-a"); port = createFCPort("SP_A:5", "50:00:00:00:00:00:00:05"); addPort(context, port, "mds-b"); port = createFCPort("SP_A:6", "50:00:00:00:00:00:00:06"); addPort(context, port, "mds-a"); port = createFCPort("SP_A:7", "50:00:00:00:00:00:00:07"); addPort(context, port, "mds-b"); port = createFCPort("SP_B:4", "50:00:00:00:00:00:01:04"); addPort(context, port, "mds-a"); port = createFCPort("SP_B:5", "50:00:00:00:00:00:01:05"); addPort(context, port, "mds-b"); port = createFCPort("SP_B:6", "50:00:00:00:00:00:01:06"); addPort(context, port, "mds-a"); port = createFCPort("SP_B:7", "50:00:00:00:00:00:01:07"); addPort(context, port, "mds-b"); return context; } protected static PortAllocationContext createVNXNet3() { NetworkLite tz = new NetworkLite(URI.create("net1"), "net1"); PortAllocationContext context = new PortAllocationContext(tz, "test"); StoragePort port; port = createFCPort("SP_A:0", "50:00:00:00:00:00:00:00"); addPort(context, port, "mds-a"); port = createFCPort("SP_B:0", "50:00:00:00:00:00:01:00"); addPort(context, port, "mds-a"); return context; } protected static PortAllocationContext createVNXNet4() { NetworkLite tz = new NetworkLite(URI.create("net2"), "net2"); PortAllocationContext context = new PortAllocationContext(tz, "test"); StoragePort port; port = createFCPort("SP_A:4", "50:00:00:00:00:00:00:04"); addPort(context, port, "mds-a"); port = createFCPort("SP_B:4", "50:00:00:00:00:00:01:04"); addPort(context, port, "mds-a"); return context; } /** * Generates a map from Host URI to a set of Initiator URIs. * * @initiators -- a Collection of Initiator objects * @return */ private static Map<URI, Set<Initiator>> generateHostInitiatorsMap(Collection<Initiator> initiators) { Map<URI, Set<Initiator>> hostInitiatorsMap = new HashMap<URI, Set<Initiator>>(); for (Initiator initiator : initiators) { URI host = initiator.getHost(); if (hostInitiatorsMap.get(host) == null) { hostInitiatorsMap.put(host, new HashSet<Initiator>()); } hostInitiatorsMap.get(host).add(initiator); } return hostInitiatorsMap; } private static Map<URI, List<Initiator>> makeNet2InitiatorsMap( Map<URI, Map<URI, List<Initiator>>> hostToNetToInitiators) { Map<URI, List<Initiator>> netToInitiatorsMap = new HashMap<URI, List<Initiator>>(); for (Map<URI, List<Initiator>> hostEntries : hostToNetToInitiators.values()) { for (URI net : hostEntries.keySet()) { if (!netToInitiatorsMap.containsKey(net)) { netToInitiatorsMap.put(net, new ArrayList<Initiator>()); } netToInitiatorsMap.get(net).addAll(hostEntries.get(net)); } } return netToInitiatorsMap; } private static URI getHostURI(Map<URI, List<Initiator>> net2InitiatorsMap) { for (List<Initiator> initiators : net2InitiatorsMap.values()) { for (Initiator initiator : initiators) { if (initiator.getHost() != null) { return initiator.getHost(); } } } return URI.create("unknown-host"); } /** * Given a list of networks-to-initiators, further break down the map by host so * that the end result is a map of hosts-to-networks-to-initiators. * * @param net2InitiatorsMap networks-to-initiators map * @return a map of hosts-to-network-to-initiators */ private static Map<URI, Map<URI, List<Initiator>>> getHostInitiatorsMap(Map<URI, List<Initiator>> net2InitiatorsMap) { Map<URI, Map<URI, List<Initiator>>> hostInitiatorsMap = new HashMap<URI, Map<URI, List<Initiator>>>(); for (Map.Entry<URI, List<Initiator>> entry : net2InitiatorsMap.entrySet()) { List<Initiator> initiators = entry.getValue(); for (Initiator initiator : initiators) { URI host = initiator.getHost(); if (NullColumnValueGetter.isNullURI(host)) { host = StoragePortsAssigner.unknown_host_uri; } Map<URI, List<Initiator>> hostMap = hostInitiatorsMap.get(host); if (hostMap == null) { hostMap = new HashMap<URI, List<Initiator>>(); hostInitiatorsMap.put(host, hostMap); } if (hostMap.get(entry.getKey()) == null) { hostMap.put(entry.getKey(), new ArrayList<Initiator>()); } hostMap.get(entry.getKey()).add(initiator); } } return hostInitiatorsMap; } protected static PortAllocationContext createVmaxNet11() { NetworkLite tz = new NetworkLite(URI.create("net1"), "net1"); PortAllocationContext context = new PortAllocationContext(tz, "test"); StoragePort port; port = createFCPort("FA-7E:0", "50:00:00:00:00:00:00:00"); addPort(context, port, "mds-a"); port = createFCPort("FA-7E:1", "50:00:00:00:00:00:00:01"); addPort(context, port, "mds-b"); port = createFCPort("FA-8E:0", "50:00:00:00:00:00:01:00"); addPort(context, port, "mds-a"); port = createFCPort("FA-8E:1", "50:00:00:00:00:00:01:01"); addPort(context, port, "mds-b"); port = createFCPort("FA-9E:0", "50:00:00:00:00:00:02:00"); addPort(context, port, "mds-a"); port = createFCPort("FA-9E:1", "50:00:00:00:00:00:02:01"); addPort(context, port, "mds-b"); port = createFCPort("FA-10E:0", "50:00:00:00:00:00:03:00"); addPort(context, port, "mds-a"); port = createFCPort("FA-10E:1", "50:00:00:00:00:00:03:01"); addPort(context, port, "mds-b"); port = createFCPort("FA-11E:0", "50:00:00:00:00:00:04:00"); addPort(context, port, "mds-b"); port = createFCPort("FA-11E:1", "50:00:00:00:00:00:04:01"); addPort(context, port, "mds-a"); port = createFCPort("FA-12E:0", "50:00:00:00:00:00:05:00"); addPort(context, port, "mds-b"); port = createFCPort("FA-12E:1", "50:00:00:00:00:00:05:01"); addPort(context, port, "mds-a"); return context; } protected static PortAllocationContext createVmaxNet22() { NetworkLite tz = new NetworkLite(URI.create("net2"), "net2"); PortAllocationContext context = new PortAllocationContext(tz, "test"); StoragePort port; port = createFCPort("FA-7F:2", "50:00:00:00:00:01:00:02"); addPort(context, port, "mds-a"); port = createFCPort("FA-7F:3", "50:00:00:00:00:01:00:03"); addPort(context, port, "mds-b"); port = createFCPort("FA-8F:2", "50:00:00:00:00:01:01:02"); addPort(context, port, "mds-a"); port = createFCPort("FA-8F:3", "50:00:00:00:00:01:01:03"); addPort(context, port, "mds-b"); port = createFCPort("FA-9F:2", "50:00:00:00:00:01:02:02"); addPort(context, port, "mds-a"); port = createFCPort("FA-9F:3", "50:00:00:00:00:01:02:03"); addPort(context, port, "mds-b"); port = createFCPort("FA-10F:2", "50:00:00:00:00:01:03:02"); addPort(context, port, "mds-a"); port = createFCPort("FA-10F:3", "50:00:00:00:00:01:03:03"); addPort(context, port, "mds-b"); port = createFCPort("FA-11F:2", "50:00:00:00:00:01:04:02"); addPort(context, port, "mds-b"); port = createFCPort("FA-11F:3", "50:00:00:00:00:01:04:03"); addPort(context, port, "mds-b"); port = createFCPort("FA-12F:2", "50:00:00:00:00:01:05:02"); addPort(context, port, "mds-a"); port = createFCPort("FA-12F:3", "50:00:00:00:00:01:05:03"); addPort(context, port, "mds-b"); return context; } }