@Override public StringSetMap configureZoning( Map<URI, List<List<StoragePort>>> portGroup, Map<String, Map<URI, Set<Initiator>>> initiatorGroup, Map<URI, NetworkLite> networkMap, StoragePortsAssigner assigner) { StringSetMap zoningMap = new StringSetMap(); // Set up a map to track port usage so that we can use all ports more or less equally. Map<StoragePort, Integer> portAUsage = new HashMap<StoragePort, Integer>(); Map<StoragePort, Integer> portBUsage = new HashMap<StoragePort, Integer>(); // Iterate through each of the directors, matching each of its initiators // with one port. for (String director : initiatorGroup.keySet()) { for (URI networkURI : initiatorGroup.get(director).keySet()) { NetworkLite net = networkMap.get(networkURI); for (Initiator initiator : initiatorGroup.get(director).get(networkURI)) { // If there are no ports on the initiators network, too bad... if (portGroup.get(networkURI) == null) { _log.info(String.format("%s -> no ports in network", initiator.getInitiatorPort())); continue; } StringSet ports = new StringSet(); // Get an A Port String aPortName = " ", bPortName = " "; StoragePort portA = VPlexBackEndOrchestratorUtil.assignPortToInitiator( assigner, portGroup.get(networkURI).iterator().next(), net, initiator, portAUsage, "SP_A"); if (portA != null) { aPortName = portA.getPortName(); ports.add(portA.getId().toString()); } // Get a B Port StoragePort portB = VPlexBackEndOrchestratorUtil.assignPortToInitiator( assigner, portGroup.get(networkURI).iterator().next(), net, initiator, portBUsage, "SP_B"); if (portB != null) { bPortName = portB.getPortName(); ports.add(portB.getId().toString()); } _log.info( String.format( "%s %s %s -> %s %s", director, net.getLabel(), initiator.getInitiatorPort(), aPortName, bPortName)); zoningMap.put(initiator.getId().toString(), ports); } } } return zoningMap; }