/* * 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.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.URIUtil; import com.emc.storageos.db.client.model.DiscoveredDataObject.RegistrationStatus; import com.emc.storageos.db.client.model.StorageHADomain; import com.emc.storageos.db.client.model.StoragePort; import com.emc.storageos.db.client.model.StorageSystem; import com.emc.storageos.db.common.VdcUtil; import com.emc.storageos.util.DummyDbClient; import com.emc.storageos.util.NetworkLite; import com.emc.storageos.volumecontroller.placement.StoragePortsAllocator.PortAllocationContext; /** * Test program for StoragePortsAllocator * * @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 StoragePortsAllocatorTest { private static boolean vmaxonly = true; private static boolean vnxonly = false; private static boolean vplexonly = false; private static boolean duplicateCpuExpected = false; private static boolean pass = true; private static final Log _log = LogFactory .getLog(StoragePortsAllocatorTest.class); public static void main(String[] args) throws Exception { for (String arg : args) { if (arg.equals("vmaxonly")) { vmaxonly = true; } if (arg.equals("vnxonly")) { vnxonly = true; } if (arg.equals("vplexonly")) { vplexonly = true; } } VdcUtil.setDbClient(new DummyDbClient()); PropertyConfigurator.configure("log4j.properties"); _log.info("Beginning logging"); testFC(); testIP(); System.out.println("Empty transport zone, should throw PlacementException"); PortAllocationContext ctx = createEmptyTzone(); StoragePortsAllocator allocator = new StoragePortsAllocator(); try { alloc(allocator, 1, ctx, true); } catch (PlacementException ex) { System.out.println("caught PlacementException: " + ex.toString()); } System.out.println("done"); _log.info(pass ? "PASSED" : "FAILED"); } private static void testIP() throws Exception { PortAllocationContext ctx = createVNX2director4portIP(); StoragePortsAllocator allocator = new StoragePortsAllocator(); if (!vmaxonly && !vplexonly) { alloc(allocator, 1, ctx, false); alloc(allocator, 2, ctx, false); alloc(allocator, 4, ctx, false); alloc(allocator, 8, ctx, false); alloc(allocator, 16, ctx, false); alloc(allocator, 32, ctx, false); } ctx = createVMAX3engine4portIP(); allocator = new StoragePortsAllocator(); if (!vnxonly && !vplexonly) { alloc(allocator, 1, ctx, false); alloc(allocator, 2, ctx, false); alloc(allocator, 4, ctx, false); alloc(allocator, 8, ctx, false); duplicateCpuExpected = true; alloc(allocator, 16, ctx, false); duplicateCpuExpected = true; alloc(allocator, 32, ctx, false); runIterations(50, allocator, 4, ctx, false); System.out .println("Symmetrical two transport zones each with four directors two ports each"); test2tzones(1, createTzone1IP(), createTzone2IP(), false); test2tzones(2, createTzone1IP(), createTzone2IP(), false); test2tzones(4, createTzone1IP(), createTzone2IP(), false); System.out .println("Asymmetrical transport zones, one with two directors, one with one"); test2tzones(1, createTzone3IP(), createTzone4IP(), false); test2tzones(2, createTzone3IP(), createTzone4IP(), false); test2tzones(4, createTzone3IP(), createTzone4IP(), false); } } protected static void testFC() throws Exception { PortAllocationContext ctx = createVNX2director4portFC(); StoragePortsAllocator allocator = new StoragePortsAllocator(); if (!vmaxonly && !vplexonly) { alloc(allocator, 1, ctx, true); alloc(allocator, 2, ctx, true); alloc(allocator, 4, ctx, true); alloc(allocator, 8, ctx, true); alloc(allocator, 16, ctx, true); alloc(allocator, 32, ctx, true); } if (!vnxonly && !vplexonly) { ctx = createVMAX3engine4portFC(); allocator = new StoragePortsAllocator(); alloc(allocator, 1, ctx, true); alloc(allocator, 2, ctx, true); alloc(allocator, 4, ctx, true); alloc(allocator, 8, ctx, true); duplicateCpuExpected = true; alloc(allocator, 16, ctx, true); duplicateCpuExpected = true; alloc(allocator, 32, ctx, true); alloc(allocator, 4, ctx, true); Map<String, Integer>switchMap = new HashMap<String, Integer>(); switchMap.put("mds-a", 4); System.out.println("testing swich affinity"); alloc(allocator, 4, ctx, true, switchMap); ctx = createVMAXWithCpuDuplication(); allocator = new StoragePortsAllocator(); alloc(allocator, 1, ctx, true); alloc(allocator, 2, ctx, true); alloc(allocator, 3, ctx, true); _log.debug("Cpu duplication forced"); duplicateCpuExpected = true; alloc(allocator, 4, ctx, true); } if (!vnxonly && !vmaxonly) { ctx = createVplex1engine4portFC(); allocator = new StoragePortsAllocator(); _log.info("Start Vplex 1 engine port allocation"); alloc(allocator, 1, ctx, true); alloc(allocator, 2, ctx, true); alloc(allocator, 4, ctx, true); alloc(allocator, 8, ctx, true); alloc(allocator, 16, ctx, true); alloc(allocator, 32, ctx, true); _log.info("Done with Vplex 1 engine port allocation"); _log.info("Start Vplex 2 engine port allocation"); ctx = createVplex2engine4portFC(); allocator = new StoragePortsAllocator(); alloc(allocator, 1, ctx, true); alloc(allocator, 2, ctx, true); alloc(allocator, 4, ctx, true); alloc(allocator, 8, ctx, true); alloc(allocator, 16, ctx, true); alloc(allocator, 32, ctx, true); _log.info("Done with Vplex 2 engine port allocation"); _log.info("Start Vplex 4 engine port allocation"); ctx = createVplex4engine4portFC(); allocator = new StoragePortsAllocator(); alloc(allocator, 1, ctx, true); alloc(allocator, 2, ctx, true); alloc(allocator, 4, ctx, true); alloc(allocator, 8, ctx, true); alloc(allocator, 16, ctx, true); alloc(allocator, 32, ctx, true); _log.info("Done with Vplex 4 engine port allocation"); runIterations(50, allocator, 4, ctx, true); System.out .println("Symmetrical two transport zones each with four directors two ports each"); test2tzones(1, createTzone1FC(), createTzone2FC(), true); test2tzones(2, createTzone1FC(), createTzone2FC(), true); test2tzones(4, createTzone1FC(), createTzone2FC(), true); System.out .println("Asymmetrical transport zones, one with two directors, one with one"); test2tzones(1, createTzone3FC(), createTzone4FC(), true); test2tzones(2, createTzone3FC(), createTzone4FC(), true); test2tzones(4, createTzone3FC(), createTzone4FC(), true); } } private static void runIterations(int niter, StoragePortsAllocator allocator, int tznpaths, PortAllocationContext ctx, boolean checkConnectivity) throws Exception { HashMap<String, Integer> portUsageCounts = new HashMap<String, Integer>(); for (int i = 0; i < niter; i++) { List<URI> portUris = alloc(allocator, tznpaths, ctx, checkConnectivity); for (URI uri : portUris) { StoragePort port = ctx._idToStoragePort.get(uri); String name = port.getPortName(); if (portUsageCounts.get(name) == null) { portUsageCounts.put(name, new Integer(0)); } Integer newValue = portUsageCounts.get(name) + 1; portUsageCounts.put(name, newValue); } } System.out.println("Port usage statistics:"); for (String key : portUsageCounts.keySet()) { System.out.println(String.format(" Port %s used %d times", key, portUsageCounts.get(key))); } } private static List<URI> alloc(StoragePortsAllocator allocator, int tznpaths, PortAllocationContext ctx, boolean checkConnectivity) throws Exception { System.out.println("TZ Numpaths = " + new Integer(tznpaths)); ctx.reinitialize(); try { List<URI> portUris = getPortURIs(allocator.allocatePortsForNetwork(tznpaths, ctx, checkConnectivity, null, false, null)); checkForDuplicates(portUris, ctx); checkForAlternation(portUris, ctx); printPorts(portUris, ctx); return portUris; } catch (PlacementException ex) { System.out.println("PlacementException: " + ex.getMessage()); return new ArrayList<URI>(); } } private static List<URI> alloc(StoragePortsAllocator allocator, int tznpaths, PortAllocationContext ctx, boolean checkConnectivity, Map<String, Integer> switchMap) throws Exception { System.out.println("TZ Numpaths = " + new Integer(tznpaths)); ctx.reinitialize(); try { List<URI> portUris = getPortURIs(allocator.allocatePortsForNetwork(tznpaths, ctx, checkConnectivity, null, false, switchMap)); checkForDuplicates(portUris, ctx); checkForAlternation(portUris, ctx); printPorts(portUris, ctx); return portUris; } catch (PlacementException ex) { System.out.println("PlacementException: " + ex.getMessage()); return new ArrayList<URI>(); } } protected static void test2tzones(int numPaths, PortAllocationContext tzone1, PortAllocationContext tzone2, boolean checkConnectivity) throws Exception { StoragePortsAllocator allocator = new StoragePortsAllocator(); List<URI> tzone1Uris = getPortURIs( allocator.allocatePortsForNetwork(numPaths / 2, tzone1, checkConnectivity, null, false, null)); System.out.println(String.format("Transport zone: %s paths: %d", tzone1._initiatorNetwork.getLabel(), new Integer(numPaths))); printPorts(tzone1Uris, tzone1); checkForDuplicates(tzone1Uris, tzone1); tzone2._alreadyAllocatedDirectors .addAll(tzone1._alreadyAllocatedDirectors); tzone2._alreadyAllocatedSwitches .addAll(tzone1._alreadyAllocatedSwitches); List<URI> tzone2Uris = getPortURIs( allocator.allocatePortsForNetwork(numPaths / 2, tzone2, checkConnectivity, null, false, null)); System.out.println(String.format("Transport zone: %s paths: %d", tzone2._initiatorNetwork.getLabel(), new Integer(numPaths))); printPorts(tzone2Uris, tzone2); checkForDuplicates(tzone2Uris, tzone2); } protected static void checkForDuplicates(List<URI> portUris, PortAllocationContext ctx) throws Exception { HashSet<String> addressSet = new HashSet<String>(); for (URI uri : portUris) { StoragePort port = ctx._idToStoragePort.get(uri); String address = port.getPortNetworkId(); if (addressSet.contains(address)) { pass = false; throw new Exception("Duplicate use of port address: " + address); } addressSet.add(address); } } protected static void checkForAlternation(List<URI> portUris, PortAllocationContext ctx) { Set<String> engines = new HashSet(ctx._engineToStoragePortSet.keySet()); Set<String> directors = new HashSet( ctx._directorToStoragePortSet.keySet()); Set<String> cpus = new HashSet(ctx._cpuToStoragePortSet.keySet()); for (URI uri : portUris) { StoragePort port = ctx._idToStoragePort.get(uri); String engine = ctx._storagePortToEngine.get(port); if (engine != null) { if (!engines.contains(engine)) { System.out.println("Duplicate engine: " + port.getPortName()); pass = false; } engines.remove(engine); } String director = ctx._storagePortToDirector.get(port); if (!directors.contains(director)) { System.out.println("Duplicate director: " + port.getPortName()); pass = false; } directors.remove(director); String cpu = ctx._storagePortToCpu.get(port); if (cpu != null && !cpus.contains(cpu)) { if (duplicateCpuExpected) { System.out.println("Duplicate cpu (expected): " + cpu); } else { System.out.println("Duplicate cpu: " + cpu); pass = false; } } cpus.remove(cpu); if (engines.isEmpty()) { engines = new HashSet(ctx._engineToStoragePortSet.keySet()); } if (directors.isEmpty()) { directors = new HashSet(ctx._directorToStoragePortSet.keySet()); } } duplicateCpuExpected = false; } protected static void printPorts(List<URI> portUris, PortAllocationContext ctx) { for (URI uri : portUris) { StoragePort port = ctx._idToStoragePort.get(uri); if (port == null) { System.out.println("No port found: " + uri); continue; } System.out.println(String.format("Port %s address %s switch %s", port.getPortName(), port.getPortNetworkId(), ctx._storagePortToSwitchName.get(port))); } } protected static PortAllocationContext createVplex1engine4portFC() { NetworkLite tz = new NetworkLite("TzoneVplexFC1"); PortAllocationContext context = new PortAllocationContext(tz, "test"); StoragePort port; // Cluster 1 Engine 1 - Ports port = createVplexFCPort("A0-FC00", "50:00:14:42:60:01:01:00", "director-1-1-A"); addPort(context, port, "mds-a"); port = createVplexFCPort("A0-FC01", "50:00:14:42:60:01:01:01", "director-1-1-A"); addPort(context, port, "mds-b"); port = createVplexFCPort("A0-FC03", "50:00:14:42:60:01:01:03", "director-1-1-A"); addPort(context, port, "mds-a"); port = createVplexFCPort("A0-FC04", "50:00:14:42:60:01:01:04", "director-1-1-A"); addPort(context, port, "mds-b"); port = createVplexFCPort("B0-FC00", "50:00:14:42:70:01:01:00", "director-1-1-B"); addPort(context, port, "mds-a"); port = createVplexFCPort("B0-FC01", "50:00:14:42:70:01:01:01", "director-1-1-B"); addPort(context, port, "mds-b"); port = createVplexFCPort("B0-FC03", "50:00:14:42:70:01:01:03", "director-1-1-B"); addPort(context, port, "mds-a"); port = createVplexFCPort("B0-FC04", "50:00:14:42:70:01:01:04", "director-1-1-B"); addPort(context, port, "mds-b"); return context; } protected static PortAllocationContext createVplex2engine4portFC() { NetworkLite tz = new NetworkLite("TzoneVplexFC2"); PortAllocationContext context = new PortAllocationContext(tz, "test"); StoragePort port; // Cluster 1 Engine 1 - Ports port = createVplexFCPort("A0-FC00", "50:00:14:42:60:01:01:00", "director-1-1-A"); addPort(context, port, "mds-a"); port = createVplexFCPort("A0-FC01", "50:00:14:42:60:01:01:01", "director-1-1-A"); addPort(context, port, "mds-b"); port = createVplexFCPort("A0-FC03", "50:00:14:42:60:01:01:03", "director-1-1-A"); addPort(context, port, "mds-a"); port = createVplexFCPort("A0-FC04", "50:00:14:42:60:01:01:04", "director-1-1-A"); addPort(context, port, "mds-b"); port = createVplexFCPort("B0-FC00", "50:00:14:42:70:01:01:00", "director-1-1-B"); addPort(context, port, "mds-a"); port = createVplexFCPort("B0-FC01", "50:00:14:42:70:01:01:01", "director-1-1-B"); addPort(context, port, "mds-b"); port = createVplexFCPort("B0-FC03", "50:00:14:42:70:01:01:03", "director-1-1-B"); addPort(context, port, "mds-a"); port = createVplexFCPort("B0-FC04", "50:00:14:42:70:01:01:04", "director-1-1-B"); addPort(context, port, "mds-b"); // Cluster 2 Engine 1 - Ports port = createVplexFCPort("A0-FC00", "50:00:14:42:60:02:01:00", "director-2-1-A"); addPort(context, port, "mds-a"); port = createVplexFCPort("A0-FC01", "50:00:14:42:60:02:01:01", "director-2-1-A"); addPort(context, port, "mds-b"); port = createVplexFCPort("A0-FC03", "50:00:14:42:60:02:01:03", "director-2-1-A"); addPort(context, port, "mds-a"); port = createVplexFCPort("A0-FC04", "50:00:14:42:60:02:01:04", "director-2-1-A"); addPort(context, port, "mds-b"); port = createVplexFCPort("B0-FC00", "50:00:14:42:70:02:01:00", "director-2-1-B"); addPort(context, port, "mds-a"); port = createVplexFCPort("B0-FC01", "50:00:14:42:70:02:01:01", "director-2-1-B"); addPort(context, port, "mds-b"); port = createVplexFCPort("B0-FC03", "50:00:14:42:70:02:01:03", "director-2-1-B"); addPort(context, port, "mds-a"); port = createVplexFCPort("B0-FC04", "50:00:14:42:70:02:01:04", "director-2-1-B"); addPort(context, port, "mds-b"); return context; } protected static PortAllocationContext createVplex4engine4portFC() { NetworkLite tz = new NetworkLite("TzoneVplexFC3"); PortAllocationContext context = new PortAllocationContext(tz, "test"); StoragePort port; // Cluster 1 Engine 1 - Ports port = createVplexFCPort("A0-FC00", "50:00:14:42:60:01:01:00", "director-1-1-A"); addPort(context, port, "mds-a"); port = createVplexFCPort("A0-FC01", "50:00:14:42:60:01:01:01", "director-1-1-A"); addPort(context, port, "mds-b"); port = createVplexFCPort("A0-FC03", "50:00:14:42:60:01:01:03", "director-1-1-A"); addPort(context, port, "mds-a"); port = createVplexFCPort("A0-FC04", "50:00:14:42:60:01:01:04", "director-1-1-A"); addPort(context, port, "mds-b"); port = createVplexFCPort("B0-FC00", "50:00:14:42:70:01:01:00", "director-1-1-B"); addPort(context, port, "mds-a"); port = createVplexFCPort("B0-FC01", "50:00:14:42:70:01:01:01", "director-1-1-B"); addPort(context, port, "mds-b"); port = createVplexFCPort("B0-FC03", "50:00:14:42:70:01:01:03", "director-1-1-B"); addPort(context, port, "mds-a"); port = createVplexFCPort("B0-FC04", "50:00:14:42:70:01:01:04", "director-1-1-B"); addPort(context, port, "mds-b"); // Cluster 1 Engine 2 - Ports port = createVplexFCPort("A0-FC00", "50:00:14:42:60:01:02:00", "director-1-2-A"); addPort(context, port, "mds-a"); port = createVplexFCPort("A0-FC01", "50:00:14:42:60:01:02:01", "director-1-2-A"); addPort(context, port, "mds-b"); port = createVplexFCPort("A0-FC03", "50:00:14:42:60:01:02:03", "director-1-2-A"); addPort(context, port, "mds-a"); port = createVplexFCPort("A0-FC04", "50:00:14:42:60:01:02:04", "director-1-2-A"); addPort(context, port, "mds-b"); port = createVplexFCPort("B0-FC00", "50:00:14:42:70:01:02:00", "director-1-2-B"); addPort(context, port, "mds-a"); port = createVplexFCPort("B0-FC01", "50:00:14:42:70:01:02:01", "director-1-2-B"); addPort(context, port, "mds-b"); port = createVplexFCPort("B0-FC03", "50:00:14:42:70:01:02:03", "director-1-2-B"); addPort(context, port, "mds-a"); port = createVplexFCPort("B0-FC04", "50:00:14:42:70:01:02:04", "director-1-2-B"); addPort(context, port, "mds-b"); // Cluster 2 Engine 1 - Ports port = createVplexFCPort("A0-FC00", "50:00:14:42:60:02:01:00", "director-2-1-A"); addPort(context, port, "mds-a"); port = createVplexFCPort("A0-FC01", "50:00:14:42:60:02:01:01", "director-2-1-A"); addPort(context, port, "mds-b"); port = createVplexFCPort("A0-FC03", "50:00:14:42:60:02:01:03", "director-2-1-A"); addPort(context, port, "mds-a"); port = createVplexFCPort("A0-FC04", "50:00:14:42:60:02:01:04", "director-2-1-A"); addPort(context, port, "mds-b"); port = createVplexFCPort("B0-FC00", "50:00:14:42:70:02:01:00", "director-2-1-B"); addPort(context, port, "mds-a"); port = createVplexFCPort("B0-FC01", "50:00:14:42:70:02:01:01", "director-2-1-B"); addPort(context, port, "mds-b"); port = createVplexFCPort("B0-FC03", "50:00:14:42:70:02:01:03", "director-2-1-B"); addPort(context, port, "mds-a"); port = createVplexFCPort("B0-FC04", "50:00:14:42:70:02:01:04", "director-2-1-B"); addPort(context, port, "mds-b"); // Cluster 2 Engine 2 - Ports port = createVplexFCPort("A0-FC00", "50:00:14:42:60:02:02:00", "director-2-2-A"); addPort(context, port, "mds-a"); port = createVplexFCPort("A0-FC01", "50:00:14:42:60:02:02:01", "director-2-2-A"); addPort(context, port, "mds-b"); port = createVplexFCPort("A0-FC03", "50:00:14:42:60:02:02:03", "director-2-2-A"); addPort(context, port, "mds-a"); port = createVplexFCPort("A0-FC04", "50:00:14:42:60:02:02:04", "director-2-2-A"); addPort(context, port, "mds-b"); port = createVplexFCPort("B0-FC00", "50:00:14:42:70:02:02:00", "director-2-2-B"); addPort(context, port, "mds-a"); port = createVplexFCPort("B0-FC01", "50:00:14:42:70:02:02:01", "director-2-2-B"); addPort(context, port, "mds-b"); port = createVplexFCPort("B0-FC03", "50:00:14:42:70:02:02:03", "director-2-2-B"); addPort(context, port, "mds-a"); port = createVplexFCPort("B0-FC04", "50:00:14:42:70:02:02:04", "director-2-2-B"); addPort(context, port, "mds-b"); return context; } protected static PortAllocationContext createVNX2director4portIP() { NetworkLite tz = new NetworkLite("TzoneIP1"); PortAllocationContext context = new PortAllocationContext(tz, "test"); StoragePort port; port = createIPPort("SP_A:0", "iqn.1992-04.com.emc:cx.apm00121500018.a0"); addPort(context, port, null); port = createIPPort("SP_A:1", "iqn.1992-04.com.emc:cx.apm00121500018.a1"); addPort(context, port, null); port = createIPPort("SP_A:2", "iqn.1992-04.com.emc:cx.apm00121500018.a2"); addPort(context, port, null); port = createIPPort("SP_A:3", "iqn.1992-04.com.emc:cx.apm00121500018.a3"); addPort(context, port, null); port = createIPPort("SP_B:0", "iqn.1992-04.com.emc:cx.apm00121500018.b0"); addPort(context, port, null); port = createIPPort("SP_B:1", "iqn.1992-04.com.emc:cx.apm00121500018.b1"); addPort(context, port, null); port = createIPPort("SP_B:2", "iqn.1992-04.com.emc:cx.apm00121500018.b2"); addPort(context, port, null); port = createIPPort("SP_B:3", "iqn.1992-04.com.emc:cx.apm00121500018.b3"); addPort(context, port, null); port = createIPPort("SP_C:0", "iqn.1992-04.com.emc:cx.apm00121500018.c0"); addPort(context, port, null); port = createIPPort("SP_C:1", "iqn.1992-04.com.emc:cx.apm00121500018.c1"); addPort(context, port, null); port = createIPPort("SP_C:2", "iqn.1992-04.com.emc:cx.apm00121500018.c2"); addPort(context, port, null); port = createIPPort("SP_C:3", "iqn.1992-04.com.emc:cx.apm00121500018.c3"); addPort(context, port, null); port = createIPPort("SP_D:0", "iqn.1992-04.com.emc:cx.apm00121500018.d0"); addPort(context, port, null); port = createIPPort("SP_D:1", "iqn.1992-04.com.emc:cx.apm00121500018.d1"); addPort(context, port, null); port = createIPPort("SP_D:2", "iqn.1992-04.com.emc:cx.apm00121500018.d2"); addPort(context, port, null); port = createIPPort("SP_D:3", "iqn.1992-04.com.emc:cx.apm00121500018.d3"); addPort(context, port, null); return context; } protected static PortAllocationContext createVNX2director4portFC() { NetworkLite tz = new NetworkLite("Tzon3d4p1"); PortAllocationContext context = new PortAllocationContext(tz, "test"); StoragePort port; port = createFCPort("SP_A:0", "50:00:00:00:00:00:00:00"); addPort(context, port, null); port = createFCPort("SP_A:1", "50:00:00:00:00:00:00:01"); addPort(context, port, "mds-a"); port = createFCPort("SP_A:2", "50:00:00:00:00:01:00:02"); addPort(context, port, "mds-b"); port = createFCPort("SP_A:3", "50:00:00:00:00:01: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-a"); port = createFCPort("SP_B:2", "50:00:00:00:00:01:01:02"); addPort(context, port, "mds-b"); port = createFCPort("SP_B:3", "50:00:00:00:00:01:01:03"); addPort(context, port, "mds-b"); port = createFCPort("SP_C:0", "50:00:00:00:00:00:02:00"); addPort(context, port, "mds-a"); port = createFCPort("SP_C:1", "50:00:00:00:00:00:02:01"); addPort(context, port, "mds-a"); port = createFCPort("SP_C:2", "50:00:00:00:00:01:02:02"); addPort(context, port, "mds-b"); port = createFCPort("SP_C:3", "50:00:00:00:00:01:02:03"); addPort(context, port, "mds-b"); port = createFCPort("SP_D:0", "50:00:00:00:00:00:03:00"); addPort(context, port, "mds-a"); port = createFCPort("SP_D:1", "50:00:00:00:00:00:03:01"); addPort(context, port, "mds-a"); port = createFCPort("SP_D:2", "50:00:00:00:00:01:03:02"); addPort(context, port, "mds-b"); port = createFCPort("SP_D:3", "50:00:00:00:00:01:03:03"); addPort(context, port, null); return context; } protected static PortAllocationContext createVMAX3engine4portIP() { NetworkLite tz = new NetworkLite("TzoneIP2"); PortAllocationContext context = new PortAllocationContext(tz, "test"); StoragePort port; port = createIPPort("FA-7E:0", "iqn.1992-04.com.emc:cx.apm00121500018.a0"); addPort(context, port, null); port = createIPPort("FA-7E:1", "iqn.1992-04.com.emc:cx.apm00121500018.a1"); addPort(context, port, null); port = createIPPort("FA-7F:2", "iqn.1992-04.com.emc:cx.apm00121500018.a2"); addPort(context, port, null); port = createIPPort("FA-7F:3", "iqn.1992-04.com.emc:cx.apm00121500018.a3"); addPort(context, port, null); port = createIPPort("FA-8E:0", "iqn.1992-04.com.emc:cx.apm00121500018.b0"); addPort(context, port, null); port = createIPPort("FA-8E:1", "iqn.1992-04.com.emc:cx.apm00121500018.b1"); addPort(context, port, null); port = createIPPort("FA-8F:2", "iqn.1992-04.com.emc:cx.apm00121500018.b2"); addPort(context, port, null); port = createIPPort("FA-8F:3", "iqn.1992-04.com.emc:cx.apm00121500018.b3"); addPort(context, port, null); port = createIPPort("FA-9E:0", "iqn.1992-04.com.emc:cx.apm00121500018.c0"); addPort(context, port, null); port = createIPPort("FA-9E:1", "iqn.1992-04.com.emc:cx.apm00121500018.c1"); addPort(context, port, null); port = createIPPort("FA-9F:2", "iqn.1992-04.com.emc:cx.apm00121500018.c2"); addPort(context, port, null); port = createIPPort("FA-9F:3", "iqn.1992-04.com.emc:cx.apm00121500018.c3"); addPort(context, port, null); port = createIPPort("FA-10E:0", "iqn.1992-04.com.emc:cx.apm00121500018.d0"); addPort(context, port, null); port = createIPPort("FA-10E:1", "iqn.1992-04.com.emc:cx.apm00121500018.d1"); addPort(context, port, null); port = createIPPort("FA-10F:2", "iqn.1992-04.com.emc:cx.apm00121500018.d2"); addPort(context, port, null); port = createIPPort("FA-10F:3", "iqn.1992-04.com.emc:cx.apm00121500018.d3"); addPort(context, port, null); port = createIPPort("FA-11E:0", "iqn.1992-04.com.emc:cx.apm00121500018.e0"); addPort(context, port, null); port = createIPPort("FA-11E:1", "iqn.1992-04.com.emc:cx.apm00121500018.e1"); addPort(context, port, null); port = createIPPort("FA-11F:2", "iqn.1992-04.com.emc:cx.apm00121500018.e2"); addPort(context, port, null); port = createIPPort("FA-11F:3", "iqn.1992-04.com.emc:cx.apm00121500018.e3"); addPort(context, port, null); port = createIPPort("FA-12E:0", "iqn.1992-04.com.emc:cx.apm00121500018.f0"); addPort(context, port, null); port = createIPPort("FA-12E:1", "iqn.1992-04.com.emc:cx.apm00121500018.f1"); addPort(context, port, null); port = createIPPort("FA-12F:2", "iqn.1992-04.com.emc:cx.apm00121500018.f2"); addPort(context, port, null); port = createIPPort("FA-12F:3", "iqn.1992-04.com.emc:cx.apm00121500018.f3"); addPort(context, port, null); return context; } protected static PortAllocationContext createVMAX3engine4portFC() { NetworkLite tz = new NetworkLite("Tzon3e4p1"); PortAllocationContext context = new PortAllocationContext(tz, "test"); StoragePort port; port = createFCPort("FA-7E:0", "50:00:00:00:00:00:00:00"); addPort(context, port, null); port = createFCPort("FA-7E:1", "50:00:00:00:00:00:00:01"); addPort(context, port, "mds-a"); port = createFCPort("FA-7F:2", "50:00:00:00:00:01:00:02"); addPort(context, port, "mds-b"); port = createFCPort("FA-7F:3", "50:00:00:00:00:01:00:03"); 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-a"); port = createFCPort("FA-8F:2", "50:00:00:00:00:01:01:02"); addPort(context, port, "mds-b"); port = createFCPort("FA-8F:3", "50:00:00:00:00:01:01:03"); 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-a"); port = createFCPort("FA-9F:2", "50:00:00:00:00:01:02:02"); addPort(context, port, "mds-b"); port = createFCPort("FA-9F:3", "50:00:00:00:00:01:02:03"); 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-a"); port = createFCPort("FA-10F:2", "50:00:00:00:00:01:03:02"); addPort(context, port, "mds-b"); port = createFCPort("FA-10F:3", "50:00:00:00:00:01:03:03"); addPort(context, port, null); 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-a"); 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-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-a"); port = createFCPort("FA-12F:2", "50:00:00:00:00:01:05:02"); addPort(context, port, "mds-b"); port = createFCPort("FA-12F:3", "50:00:00:00:00:01:05:03"); addPort(context, port, "mds-b"); return context; } protected static PortAllocationContext createVMAXWithCpuDuplication() { NetworkLite tz = new NetworkLite("Tzon3e4p1"); 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-7F:2", "50:00:00:00:00:01:00:02"); 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-a"); return context; } protected static PortAllocationContext createTzone1IP() { NetworkLite tz = new NetworkLite("TzoneIP1"); PortAllocationContext context = new PortAllocationContext(tz, "test"); StoragePort port; port = createIPPort("SP_A:0", "iqn.1992-04.com.emc:cx.apm00121500018.a0"); addPort(context, port, null); port = createIPPort("SP_A:1", "iqn.1992-04.com.emc:cx.apm00121500018.a1"); addPort(context, port, null); port = createIPPort("SP_B:0", "iqn.1992-04.com.emc:cx.apm00121500018.b0"); addPort(context, port, null); port = createIPPort("SP_B:1", "iqn.1992-04.com.emc:cx.apm00121500018.b1"); addPort(context, port, null); port = createIPPort("SP_C:0", "iqn.1992-04.com.emc:cx.apm00121500018.c0"); addPort(context, port, null); port = createIPPort("SP_C:1", "iqn.1992-04.com.emc:cx.apm00121500018.c1"); addPort(context, port, null); port = createIPPort("SP_D:0", "iqn.1992-04.com.emc:cx.apm00121500018.d0"); addPort(context, port, null); port = createIPPort("SP_D:1", "iqn.1992-04.com.emc:cx.apm00121500018.d1"); addPort(context, port, null); return context; } protected static PortAllocationContext createTzone2IP() { NetworkLite tz = new NetworkLite("TzoneIP2"); PortAllocationContext context = new PortAllocationContext(tz, "test"); StoragePort port; port = createIPPort("SP_A:2", "iqn.1992-04.com.emc:cx.apm00121500018.a2"); addPort(context, port, null); port = createIPPort("SP_A:3", "iqn.1992-04.com.emc:cx.apm00121500018.a3"); addPort(context, port, null); port = createIPPort("SP_B:2", "iqn.1992-04.com.emc:cx.apm00121500018.b2"); addPort(context, port, null); port = createIPPort("SP_B:3", "iqn.1992-04.com.emc:cx.apm00121500018.b3"); addPort(context, port, null); port = createIPPort("SP_C:2", "iqn.1992-04.com.emc:cx.apm00121500018.c2"); addPort(context, port, null); port = createIPPort("SP_C:3", "iqn.1992-04.com.emc:cx.apm00121500018.c3"); addPort(context, port, null); port = createIPPort("SP_D:2", "iqn.1992-04.com.emc:cx.apm00121500018.d2"); addPort(context, port, null); port = createIPPort("SP_D:3", "iqn.1992-04.com.emc:cx.apm00121500018.d3"); addPort(context, port, null); return context; } protected static PortAllocationContext createTzone3IP() { NetworkLite tz = new NetworkLite("TzoneIP3"); PortAllocationContext context = new PortAllocationContext(tz, "test"); StoragePort port; port = createIPPort("SP_A:0", "iqn.1992-04.com.emc:cx.apm00121500018.a0"); addPort(context, port, null); port = createIPPort("SP_A:1", "iqn.1992-04.com.emc:cx.apm00121500018.a1"); addPort(context, port, null); port = createIPPort("SP_B:0", "iqn.1992-04.com.emc:cx.apm00121500018.b0"); addPort(context, port, null); port = createIPPort("SP_B:1", "iqn.1992-04.com.emc:cx.apm00121500018.b1"); addPort(context, port, null); return context; } protected static PortAllocationContext createTzone4IP() { NetworkLite tz = new NetworkLite("TzoneIP4"); PortAllocationContext context = new PortAllocationContext(tz, "test"); StoragePort port; port = createIPPort("SP_B:2", "iqn.1992-04.com.emc:cx.apm00121500018.b2"); addPort(context, port, null); port = createIPPort("SP_B:3", "iqn.1992-04.com.emc:cx.apm00121500018.b3"); addPort(context, port, null); return context; } protected static PortAllocationContext createTzone1FC() { NetworkLite tz = new NetworkLite("Tzone1"); 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-a"); 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-a"); 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-a"); 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-a"); return context; } protected static PortAllocationContext createTzone2FC() { NetworkLite tz = new NetworkLite("Tzone2"); PortAllocationContext context = new PortAllocationContext(tz, "test"); StoragePort port; port = createFCPort("FA-7E:2", "50:00:00:00:00:01:00:02"); addPort(context, port, "mds-b"); port = createFCPort("FA-7E:3", "50:00:00:00:00:01:00:03"); addPort(context, port, "mds-b"); port = createFCPort("FA-8E:2", "50:00:00:00:00:01:01:02"); addPort(context, port, "mds-b"); port = createFCPort("FA-8E:3", "50:00:00:00:00:01:01:03"); addPort(context, port, "mds-b"); port = createFCPort("FA-9E:2", "50:00:00:00:00:01:02:02"); addPort(context, port, "mds-b"); port = createFCPort("FA-9E:3", "50:00:00:00:00:01:02:03"); addPort(context, port, "mds-b"); port = createFCPort("FA-10E:2", "50:00:00:00:00:01:03:02"); addPort(context, port, "mds-b"); port = createFCPort("FA-10E:3", "50:00:00:00:00:01:03:03"); addPort(context, port, "mds-b"); return context; } protected static PortAllocationContext createTzone3FC() { NetworkLite tz = new NetworkLite("Tzone3"); PortAllocationContext context = new PortAllocationContext(tz, "test"); StoragePort port; port = createFCPort("FA-1E:0", "50:00:00:00:00:00:00:00"); addPort(context, port, "mds-a"); port = createFCPort("FA-1E:1", "50:00:00:00:00:00:00:01"); addPort(context, port, "mds-a"); port = createFCPort("FA-2E:0", "50:00:00:00:00:00:01:00"); addPort(context, port, "mds-a"); port = createFCPort("FA-2E:1", "50:00:00:00:00:00:01:01"); addPort(context, port, "mds-a"); return context; } protected static PortAllocationContext createTzone4FC() { NetworkLite tz = new NetworkLite("Tzone4"); PortAllocationContext context = new PortAllocationContext(tz, "test"); StoragePort port; port = createFCPort("FA-3E:2", "50:00:00:00:00:01:01:02"); addPort(context, port, "mds-b"); port = createFCPort("FA-3E:3", "50:00:00:00:00:01:01:03"); addPort(context, port, "mds-b"); return context; } protected static PortAllocationContext createEmptyTzone() { NetworkLite tz = new NetworkLite("EmptyNetwork"); PortAllocationContext context = new PortAllocationContext(tz, "test"); return context; } protected static StoragePort createIPPort(String name, String iqn) { StoragePort port = new StoragePort(); port.setPortName(name); port.setPortGroup(name.replaceAll(":.*", "")); port.setPortNetworkId(iqn); port.setInactive(false); port.setRegistrationStatus("REGISTERED"); port.setTransportType("IP"); URI uri = URIUtil.createId(StoragePort.class); port.setId(uri); port.setNativeGuid(uri.toString()); return port; } protected static StoragePort createFCPort(String name, String wwpn) { StoragePort port = new StoragePort(); port.setCompatibilityStatus("COMPATIBLE"); port.setPortName(name); port.setPortGroup(name.replaceAll(":.*", "")); port.setPortNetworkId(wwpn); port.setInactive(false); port.setRegistrationStatus("REGISTERED"); port.setTransportType("FC"); URI uri = URIUtil.createId(StoragePort.class); port.setId(uri); port.setNativeGuid(uri.toString()); return port; } protected static StoragePort createVplexFCPort(String name, String wwpn, String portGroup) { StoragePort port = new StoragePort(); port.setPortName(name); port.setPortGroup(portGroup); port.setPortNetworkId(wwpn); port.setInactive(false); port.setRegistrationStatus("REGISTERED"); port.setTransportType("FC"); URI uri = URIUtil.createId(StoragePort.class); port.setId(uri); port.setNativeGuid(uri.toString()); return port; } /** * Add ports to a Port Allocation Context. * * @param context -- PortAllocationContext used by StoragePortsAllocator * @param port -- StoragePort object * @param switchName -- Switch name */ public static void addPort(PortAllocationContext context, StoragePort port, String switchName) { port.setRegistrationStatus(RegistrationStatus.REGISTERED.name()); port.setNetwork(context._initiatorNetwork.getId()); String portName = port.getPortName(); String portGroup = port.getPortGroup(); StorageHADomain haDomain = new StorageHADomain(); StorageSystem.Type type = StorageSystem.Type.vnxblock; if (port.getPortName().startsWith("FA-")) { haDomain.setNativeGuid("SYMMETRIX+" + portName); } else if (portGroup != null && portGroup.startsWith("director-")) { haDomain.setNativeGuid("VPLEX+" + port.getPortGroup()); } else if (portGroup.startsWith("X")) { haDomain.setNativeGuid("XTREMIO+" + port.getPortGroup()); } else { haDomain.setNativeGuid("VNX+" + portName); } if (portName.startsWith("SP_A")) { haDomain.setSlotNumber("1"); } else if (portName.startsWith("SP_B")) { haDomain.setSlotNumber("2"); } else if (portName.startsWith("SP_C")) { haDomain.setSlotNumber("3"); } else if (portName.startsWith("SP_D")) { haDomain.setSlotNumber("4"); } else if (portName.startsWith("FA-")) { type = StorageSystem.Type.vmax; int index; for (index = 3; index < portName.length(); index++) { // Stop on first non-digit after FA- if (Character.isDigit(portName.charAt(index)) == false) { break; } } haDomain.setSlotNumber(portName.substring(3, index)); } else if (portName.startsWith("X")) { haDomain.setAdapterName(portGroup); type = StorageSystem.Type.xtremio; } else { haDomain.setSlotNumber("0"); } if (portGroup != null) { if (portGroup.equals("director-1-1-A")) { haDomain.setSlotNumber("0"); type = StorageSystem.Type.vplex; } else if (portGroup.equals("director-1-1-B")) { haDomain.setSlotNumber("1"); type = StorageSystem.Type.vplex; } else if (portGroup.equals("director-1-2-A")) { haDomain.setSlotNumber("2"); type = StorageSystem.Type.vplex; } else if (portGroup.equals("director-1-2-B")) { haDomain.setSlotNumber("3"); type = StorageSystem.Type.vplex; } else if (portGroup.equals("director-2-1-A")) { haDomain.setSlotNumber("8"); type = StorageSystem.Type.vplex; } else if (portGroup.equals("director-2-1-B")) { haDomain.setSlotNumber("9"); type = StorageSystem.Type.vplex; } else if (portGroup.equals("director-2-2-A")) { haDomain.setSlotNumber("10"); type = StorageSystem.Type.vplex; } else if (portGroup.equals("director-2-2-B")) { haDomain.setSlotNumber("11"); type = StorageSystem.Type.vplex; } haDomain.setName(portGroup); } String digits = port.getPortName().replaceAll("[^0-9]", ""); Long usage = new Long(digits); context.addPort(port, haDomain, type, switchName, usage); } /** * Returns a list of Storage Port URIs for a list of StoragePorts. * * @param ports List<StoragePort> * @return List<URI> of StoragePorts */ static protected List<URI> getPortURIs(List<StoragePort> ports) { ArrayList<URI> uris = new ArrayList<URI>(); for (StoragePort port : ports) { uris.add(port.getId()); } return uris; } }