/* * Copyright (c) 2008-2012 EMC Corporation * All Rights Reserved */ package com.emc.storageos.db.client.model; import java.util.EnumSet; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import com.emc.storageos.db.client.util.WWNUtility; import com.emc.storageos.db.client.util.iSCSIUtility; public class StorageProtocol { public static final String ATMOSIMPORT_DEVICETYPE = "ATMOS_IMPORTER"; public static final String ATMOS_DEVICETYPE = "ATMOS"; // storage block protocols public static enum Block { iSCSI, // block FC, // block FCoE, // FC block protocol with Ethernet transport ScaleIO, // ScaleIO Data Clients RBD; // Ceph Data Clients private static final Set<String> protocols = new HashSet<String>(); static { for (Block protocol : EnumSet.allOf(Block.class)) { protocols.add(protocol.name()); } } public static boolean isProtocolSupported(String protocol) { return protocols.contains(protocol); } } // storage file protocols public static enum File { NFS, // file, NFSv2 & NFSv3 NFSv4, // file, authenticated NFS CIFS, // file NFS_OR_CIFS, // NFS or CIFS } // storage file protocols public static enum Object { File, // Objects hosted on file-share based devices } public static enum Transport { FC, // fibre channel networks IP, // IP networks for iSCSI, NFS, CIFS, RBD Ethernet, // Ethernet networks for FCoE ScaleIO, // ScaleIO Data Clients } /** * Convert block protocol to its related transport type. * * @param protocol * @return */ public static Transport block2Transport(String protocol) { if (protocol == null) { return null; } if (Block.iSCSI.name().equals(protocol)) { return Transport.IP; } if (Block.FCoE.name().equals(protocol)) { return Transport.Ethernet; } if (Block.FC.name().equals(protocol)) { return Transport.FC; } if (Block.ScaleIO.name().equals(protocol)) { return Transport.ScaleIO; } if (Block.RBD.name().equals(protocol)) { return Transport.IP; } throw new RuntimeException("Invalid block protocol"); } /** * Check if block protocol selection is good. * * @param type VirtualPool type: block or file * @param protocols set of protocol names to be validated * @return */ public static boolean checkProtocols(VirtualPool.Type type, Set<String> protocols) { Iterator<String> it = protocols.iterator(); try { while (it.hasNext()) { if (type.name().equals(VirtualPool.Type.block.name())) { Block.valueOf(it.next()); } else if (type.name().equals(VirtualPool.Type.file.name())) { File.valueOf(it.next()); } else { return false; } } } catch (IllegalArgumentException e) { return false; } return true; } /** * Validate initiator node and port formats for the given protocol. * * @param protocol * @param initiatorNode * @param initiatorPort * @return */ public static boolean checkInitiator(String protocol, String initiatorNode, String initiatorPort) { if (Block.FC.name().equals(protocol)) { return WWNUtility.isValidWWN(initiatorNode) && WWNUtility.isValidWWN(initiatorPort); } if (Block.iSCSI.name().equals(protocol)) { return (iSCSIUtility.isValidIQNPortName(initiatorPort) || iSCSIUtility.isValidEUIPortName(initiatorPort)); } return true; } public static boolean isFCEndpoint(String endpoint) { return WWNUtility.isValidWWN(endpoint); } }